@copilotz/chat-adapter 0.6.7 → 0.7.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 +6 -0
- package/dist/index.js +17 -11
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
package/dist/index.d.ts
CHANGED
|
@@ -135,6 +135,12 @@ interface CopilotzChatProps {
|
|
|
135
135
|
isMobile: boolean;
|
|
136
136
|
}) => React.ReactNode);
|
|
137
137
|
onToolOutput?: (output: Record<string, unknown>) => void;
|
|
138
|
+
/**
|
|
139
|
+
* Fired whenever the adapter’s selected thread id changes (initial load,
|
|
140
|
+
* thread list refresh, create/select/delete, etc.). Use to keep side panels
|
|
141
|
+
* in sync; user-driven `onSelectThread` alone does not cover bootstrap paths.
|
|
142
|
+
*/
|
|
143
|
+
onCurrentThreadIdChange?: (threadId: string | null) => void;
|
|
138
144
|
/** Called when user clicks logout in the user menu */
|
|
139
145
|
onLogout?: () => void;
|
|
140
146
|
/** Called when user clicks "View Profile" in the user menu */
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/CopilotzChat.tsx
|
|
2
|
-
import { useMemo } from "react";
|
|
2
|
+
import { useEffect as useEffect3, useMemo } from "react";
|
|
3
3
|
import { ChatUI, ChatUserContextProvider } from "@copilotz/chat-ui";
|
|
4
4
|
|
|
5
5
|
// ../node_modules/lucide-react/dist/esm/createLucideIcon.js
|
|
@@ -337,7 +337,8 @@ async function runCopilotzStream(options) {
|
|
|
337
337
|
}
|
|
338
338
|
const threadName = mergedThreadMetadata.name ?? null;
|
|
339
339
|
const { name: _threadName, ...restThreadMetadata } = mergedThreadMetadata;
|
|
340
|
-
const
|
|
340
|
+
const baseParticipants = Array.isArray(participants) && participants.length > 0 ? participants : [selectedAgent || "assistant"];
|
|
341
|
+
const resolvedParticipants = user.externalId && !baseParticipants.includes(user.externalId) ? [...baseParticipants, user.externalId] : baseParticipants;
|
|
341
342
|
const resolvedTarget = targetAgent?.trim() || null;
|
|
342
343
|
const toolCallSenderId = selectedAgent || resolvedParticipants[0] || "assistant";
|
|
343
344
|
const threadPayload = threadId || threadExternalId || threadName || Object.keys(restThreadMetadata).length > 0 ? {
|
|
@@ -2221,6 +2222,7 @@ var CopilotzChat = ({
|
|
|
2221
2222
|
callbacks: userCallbacks,
|
|
2222
2223
|
customComponent,
|
|
2223
2224
|
onToolOutput,
|
|
2225
|
+
onCurrentThreadIdChange,
|
|
2224
2226
|
onLogout,
|
|
2225
2227
|
onViewProfile,
|
|
2226
2228
|
onAddMemory,
|
|
@@ -2243,14 +2245,15 @@ var CopilotzChat = ({
|
|
|
2243
2245
|
renderSpecialState
|
|
2244
2246
|
}) => {
|
|
2245
2247
|
const selectedAgent = agentOptions.find((agent) => agent.id === selectedAgentId) || null;
|
|
2246
|
-
const
|
|
2248
|
+
const participantAgentIds = useMemo(() => {
|
|
2247
2249
|
if (!participantIds || participantIds.length === 0) return null;
|
|
2248
|
-
return participantIds.
|
|
2249
|
-
}, [participantIds
|
|
2250
|
-
const
|
|
2250
|
+
return participantIds.filter((id) => typeof id === "string" && id.length > 0);
|
|
2251
|
+
}, [participantIds]);
|
|
2252
|
+
const selectedAgentRunId = selectedAgent?.id ?? selectedAgentId ?? null;
|
|
2253
|
+
const targetAgentRunId = useMemo(() => {
|
|
2251
2254
|
if (!targetAgentId) return null;
|
|
2252
|
-
return
|
|
2253
|
-
}, [targetAgentId
|
|
2255
|
+
return targetAgentId;
|
|
2256
|
+
}, [targetAgentId]);
|
|
2254
2257
|
const {
|
|
2255
2258
|
messages,
|
|
2256
2259
|
isMessagesLoading,
|
|
@@ -2276,13 +2279,16 @@ var CopilotzChat = ({
|
|
|
2276
2279
|
bootstrap,
|
|
2277
2280
|
defaultThreadName: userConfig?.labels?.defaultThreadName,
|
|
2278
2281
|
onToolOutput,
|
|
2279
|
-
preferredAgentName:
|
|
2280
|
-
participants:
|
|
2281
|
-
targetAgentName,
|
|
2282
|
+
preferredAgentName: selectedAgentRunId,
|
|
2283
|
+
participants: participantAgentIds,
|
|
2284
|
+
targetAgentName: targetAgentRunId,
|
|
2282
2285
|
getRequestHeaders,
|
|
2283
2286
|
eventInterceptor,
|
|
2284
2287
|
runErrorInterceptor
|
|
2285
2288
|
});
|
|
2289
|
+
useEffect3(() => {
|
|
2290
|
+
onCurrentThreadIdChange?.(currentThreadId);
|
|
2291
|
+
}, [currentThreadId, onCurrentThreadIdChange]);
|
|
2286
2292
|
const chatCallbacks = useMemo(() => {
|
|
2287
2293
|
const {
|
|
2288
2294
|
onSendMessage: _1,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CopilotzChat.tsx","../../node_modules/shared/src/utils.ts","../../node_modules/lucide-react/src/defaultAttributes.ts","../../node_modules/lucide-react/src/Icon.ts","../../node_modules/lucide-react/src/createLucideIcon.ts","../../node_modules/lucide-react/src/icons/user.ts","../src/useCopilotzChat.ts","../src/copilotzService.ts","../src/assetsService.ts","../src/useUrlState.ts","../src/activity.ts"],"sourcesContent":["import React, { useCallback, useMemo, useState } from \"react\";\nimport { ChatUI, ChatUserContextProvider } from \"@copilotz/chat-ui\";\nimport type {\n AgentOption,\n ChatCallbacks,\n ChatConfig,\n ChatUserContext,\n ChatUserMenuSection,\n MemoryItem,\n} from \"@copilotz/chat-ui\";\nimport { User } from \"lucide-react\";\nimport { useCopilotz } from \"./useCopilotzChat\";\nimport type {\n EventInterceptor,\n RenderSpecialState,\n RunErrorInterceptor,\n} from \"./specialState\";\nimport type { RequestHeadersProvider } from \"./copilotzService\";\n\nexport interface CopilotzChatProps {\n userId: string;\n userName?: string;\n userAvatar?: string;\n userEmail?: string;\n initialContext?: ChatUserContext;\n bootstrap?: {\n initialMessage?: string;\n initialToolCalls?: Array<{ name: string; args: Record<string, unknown> }>;\n };\n config?: ChatConfig;\n callbacks?: Partial<ChatCallbacks>;\n /**\n * Custom component to render in the right sidebar panel (e.g. Profile info).\n * Can be:\n * - A React node (static)\n * - A function receiving context: `(context) => ReactNode`\n * - A render function receiving panel props: `(props: { onClose, isMobile }) => ReactNode`\n * Toggle visibility via the header button.\n */\n customComponent?:\n | React.ReactNode\n | ((context: ChatUserContext) => React.ReactNode)\n | ((props: { onClose: () => void; isMobile: boolean }) => React.ReactNode);\n onToolOutput?: (output: Record<string, unknown>) => void;\n /** Called when user clicks logout in the user menu */\n onLogout?: () => void;\n /** Called when user clicks \"View Profile\" in the user menu */\n onViewProfile?: () => void;\n /** Called when user adds a memory */\n onAddMemory?: (content: string, category?: MemoryItem[\"category\"]) => void;\n /** Called when user updates a memory */\n onUpdateMemory?: (memoryId: string, content: string) => void;\n /** Called when user deletes a memory */\n onDeleteMemory?: (memoryId: string) => void;\n /** Structured custom menu sections rendered natively by the sidebar user menu */\n userMenuSections?: ChatUserMenuSection[];\n /** Additional native items to render inside the sidebar user menu */\n userMenuAdditionalItems?: React.ReactNode;\n /** Empty-state suggestions */\n suggestions?: string[];\n /** Agent selector data (built-in ChatUI) */\n agentOptions?: AgentOption[];\n selectedAgentId?: string | null;\n onSelectAgent?: (agentId: string) => void;\n /** Multi-agent: IDs of agents participating in the conversation */\n participantIds?: string[];\n onParticipantsChange?: (ids: string[]) => void;\n /** Multi-agent: ID of the agent this message is directed at */\n targetAgentId?: string | null;\n onTargetAgentChange?: (agentId: string | null) => void;\n getRequestHeaders?: RequestHeadersProvider;\n className?: string;\n eventInterceptor?: EventInterceptor;\n runErrorInterceptor?: RunErrorInterceptor;\n renderSpecialState?: RenderSpecialState;\n}\n\nexport const CopilotzChat: React.FC<CopilotzChatProps> = ({\n userId,\n userName,\n userAvatar,\n userEmail,\n initialContext,\n bootstrap,\n config: userConfig,\n callbacks: userCallbacks,\n customComponent,\n onToolOutput,\n onLogout,\n onViewProfile,\n onAddMemory,\n onUpdateMemory,\n onDeleteMemory,\n userMenuSections,\n userMenuAdditionalItems,\n suggestions,\n agentOptions = [],\n selectedAgentId = null,\n onSelectAgent,\n participantIds,\n onParticipantsChange,\n targetAgentId = null,\n onTargetAgentChange,\n getRequestHeaders,\n className,\n eventInterceptor,\n runErrorInterceptor,\n renderSpecialState,\n}) => {\n const selectedAgent =\n agentOptions.find((agent) => agent.id === selectedAgentId) || null;\n\n // Resolve participant names from IDs for the adapter layer\n const participantNames = useMemo(() => {\n if (!participantIds || participantIds.length === 0) return null;\n return participantIds\n .map((id) => agentOptions.find((a) => a.id === id)?.name)\n .filter((name): name is string => Boolean(name));\n }, [participantIds, agentOptions]);\n\n // Resolve target agent name from ID\n const targetAgentName = useMemo(() => {\n if (!targetAgentId) return null;\n return agentOptions.find((a) => a.id === targetAgentId)?.name ?? null;\n }, [targetAgentId, agentOptions]);\n\n const {\n messages,\n isMessagesLoading,\n isLoadingOlderMessages,\n messagePageInfo,\n threads,\n currentThreadId,\n isStreaming,\n specialState,\n clearSpecialState,\n userContextSeed,\n sendMessage,\n createThread,\n selectThread,\n renameThread,\n archiveThread,\n deleteThread,\n stopGeneration,\n loadOlderMessages,\n } = useCopilotz({\n userId,\n initialContext,\n bootstrap,\n defaultThreadName: userConfig?.labels?.defaultThreadName,\n onToolOutput,\n preferredAgentName: selectedAgent?.name ?? null,\n participants: participantNames,\n targetAgentName,\n getRequestHeaders,\n eventInterceptor,\n runErrorInterceptor,\n });\n\n const chatCallbacks: ChatCallbacks = useMemo(() => {\n const {\n onSendMessage: _1,\n onStopGeneration: _2,\n onCreateThread: _3,\n onSelectThread: _4,\n onRenameThread: _5,\n onArchiveThread: _6,\n onDeleteThread: _7,\n onCopyMessage: _8,\n ...restUserCallbacks\n } = userCallbacks || {};\n\n return {\n ...restUserCallbacks,\n onSendMessage: (content: string, attachments?: any[]) => {\n void sendMessage(content, attachments);\n userCallbacks?.onSendMessage?.(content, attachments);\n },\n onStopGeneration: () => {\n stopGeneration();\n userCallbacks?.onStopGeneration?.();\n },\n onCreateThread: (title?: string) => {\n createThread(title);\n userCallbacks?.onCreateThread?.(title);\n },\n onSelectThread: (threadId: string) => {\n void selectThread(threadId);\n userCallbacks?.onSelectThread?.(threadId);\n },\n onRenameThread: (threadId: string, newTitle: string) => {\n void renameThread(threadId, newTitle);\n userCallbacks?.onRenameThread?.(threadId, newTitle);\n },\n onArchiveThread: (threadId: string) => {\n void archiveThread(threadId);\n userCallbacks?.onArchiveThread?.(threadId);\n },\n onDeleteThread: (threadId: string) => {\n void deleteThread(threadId);\n userCallbacks?.onDeleteThread?.(threadId);\n },\n onCopyMessage: async (messageId: string, content: string) => {\n try {\n await navigator.clipboard.writeText(content);\n userCallbacks?.onCopyMessage?.(messageId, content);\n } catch (error) {\n console.error(\"Failed to copy message\", error);\n }\n },\n onLogout,\n onViewProfile,\n };\n }, [\n sendMessage,\n stopGeneration,\n createThread,\n selectThread,\n renameThread,\n archiveThread,\n deleteThread,\n userCallbacks,\n onLogout,\n onViewProfile,\n ]);\n\n const mergedConfig: ChatConfig = useMemo(() => {\n const base = userConfig || {};\n if (!customComponent) {\n return base;\n }\n return {\n ...base,\n customComponent: {\n ...base.customComponent,\n component: customComponent,\n icon: base.customComponent?.icon || <User className=\"h-6 w-6\" />,\n },\n };\n }, [userConfig, customComponent]);\n\n const effectiveUserName = userName || userId;\n const effectiveUserAvatar = userAvatar;\n\n const userProp = useMemo(() => ({\n id: userId,\n name: effectiveUserName,\n email: userEmail,\n avatar: effectiveUserAvatar,\n }), [userId, effectiveUserName, userEmail, effectiveUserAvatar]);\n\n const assistantProp = useMemo(() => ({\n name: userConfig?.branding?.title,\n avatar: userConfig?.branding?.avatar,\n description: userConfig?.branding?.subtitle,\n }), [\n userConfig?.branding?.title,\n userConfig?.branding?.avatar,\n userConfig?.branding?.subtitle,\n ]);\n\n const specialStateContent = specialState\n ? renderSpecialState?.(specialState, { clear: clearSpecialState })\n : null;\n\n return (\n <ChatUserContextProvider initial={userContextSeed}>\n {specialStateContent ?? (\n <ChatUI\n messages={messages}\n isMessagesLoading={isMessagesLoading}\n isLoadingOlderMessages={isLoadingOlderMessages}\n hasMoreMessagesBefore={messagePageInfo.hasMoreBefore}\n onLoadOlderMessages={loadOlderMessages}\n threads={threads}\n currentThreadId={currentThreadId}\n config={mergedConfig}\n callbacks={chatCallbacks}\n isGenerating={isStreaming}\n suggestions={suggestions}\n agentOptions={agentOptions}\n selectedAgentId={selectedAgentId}\n onSelectAgent={onSelectAgent}\n participantIds={participantIds}\n onParticipantsChange={onParticipantsChange}\n targetAgentId={targetAgentId}\n onTargetAgentChange={onTargetAgentChange}\n user={userProp}\n assistant={assistantProp}\n onAddMemory={onAddMemory}\n onUpdateMemory={onUpdateMemory}\n onDeleteMemory={onDeleteMemory}\n userMenuSections={userMenuSections}\n userMenuAdditionalItems={userMenuAdditionalItems}\n className={className}\n />\n )}\n </ChatUserContextProvider>\n );\n};\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2', key: '975kel' }],\n ['circle', { cx: '12', cy: '7', r: '4', key: '17ys0d' }],\n];\n\n/**\n * @component @name User\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/user\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst User = createLucideIcon('user', __iconNode);\n\nexport default User;\n","// deno-lint-ignore-file no-explicit-any\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport {\n runCopilotzStream,\n fetchThreads,\n fetchThreadMessagesPage,\n updateThread as updateThreadApi,\n deleteThread as deleteThreadApi,\n} from './copilotzService';\nimport { resolveAssetsInMessages } from './assetsService';\nimport type { ChatMessage as ChatViewMessage, ChatThread, MediaAttachment, ChatUserContext } from '@copilotz/chat-ui';\nimport { useUrlState } from './useUrlState';\nimport type { EventInterceptor, RunErrorInterceptor, SpecialChatState } from './specialState';\nimport type { RequestHeadersProvider, RestMessagePageInfo } from './copilotzService';\nimport {\n appendAssistantToolCall,\n applyAssistantToolResult,\n closeAssistantMessage,\n finalizeAssistantMessage,\n hasVisibleAssistantOutput,\n type InternalChatMessage,\n updateAssistantMessageToken,\n syncAssistantActivity,\n toPublicChatMessage,\n} from './activity';\n\nconst nowTs = () => Date.now();\nconst generateId = () =>\n (globalThis.crypto?.randomUUID?.() ?? `id-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`) as string;\nconst isAbortError = (error: unknown) => (\n error instanceof DOMException && error.name === 'AbortError'\n) || (typeof error === 'object' && error !== null && 'name' in error && (error as { name?: string }).name === 'AbortError');\nconst getEventPayload = (event: any) => event?.payload ?? event;\nconst getEventSenderType = (payload: any): string | undefined => payload?.senderType || payload?.sender?.type;\n\nconst isInternalMessageMetadata = (\n metadata?: Record<string, unknown> | null,\n): boolean => metadata?.visibility === 'internal';\n\nconst normalizeAgentIdentity = (\n agent?: { id?: string | null; name?: string | null } | null,\n): { senderAgentId?: string; senderName?: string } => {\n const senderAgentId = typeof agent?.id === 'string' && agent.id.length > 0\n ? agent.id\n : undefined;\n const senderName = typeof agent?.name === 'string' && agent.name.length > 0\n ? agent.name\n : senderAgentId;\n\n return {\n ...(senderAgentId ? { senderAgentId } : {}),\n ...(senderName ? { senderName } : {}),\n };\n};\n\nconst messageAgentKey = (message: ChatViewMessage): string | null => {\n if (message.role !== 'assistant') return null;\n return message.senderAgentId ?? message.senderName ?? null;\n};\n\ntype ServerThread = Awaited<ReturnType<typeof fetchThreads>>[number];\ntype ServerMessage = Awaited<ReturnType<typeof fetchThreadMessagesPage>>['data'][number];\ntype AgentIdentity = { senderAgentId?: string; senderName?: string };\n\nconst resolveLiveAgentIdentity = (event: any): AgentIdentity => {\n const payload = getEventPayload(event);\n const agent = (\n payload?.agent && typeof payload.agent === 'object'\n ? payload.agent\n : event?.agent && typeof event.agent === 'object'\n ? event.agent\n : null\n ) as { id?: string | null; name?: string | null } | null;\n\n if (agent) {\n return normalizeAgentIdentity(agent);\n }\n\n const sender = (\n payload?.sender && typeof payload.sender === 'object'\n ? payload.sender\n : event?.sender && typeof event.sender === 'object'\n ? event.sender\n : null\n ) as { id?: string | null; name?: string | null } | null;\n\n return normalizeAgentIdentity({\n id:\n typeof payload?.senderId === 'string' ? payload.senderId\n : typeof sender?.id === 'string' ? sender.id\n : null,\n name:\n typeof payload?.senderName === 'string' ? payload.senderName\n : typeof sender?.name === 'string' ? sender.name\n : null,\n });\n};\n\nconst canAttachToStreamingAssistant = (\n message: ChatViewMessage | undefined,\n incomingAgentKey: string | null,\n): boolean => {\n if (!message || message.role !== 'assistant' || !message.isStreaming) {\n return false;\n }\n\n const currentAgentKey = messageAgentKey(message);\n return !incomingAgentKey || !currentAgentKey || currentAgentKey === incomingAgentKey;\n};\n\ntype ToolCallStatus = 'pending' | 'running' | 'completed' | 'failed';\ntype ParsedToolCall = {\n id?: string;\n name: string;\n arguments: Record<string, unknown>;\n status: ToolCallStatus;\n result?: unknown;\n};\n\ntype ToolResultUpdate = {\n id?: string;\n name?: string;\n status: ToolCallStatus;\n result?: unknown;\n endTime: number;\n};\n\nconst THREAD_MESSAGES_PAGE_SIZE = 50;\n\nconst createEmptyMessagePageInfo = (): RestMessagePageInfo => ({\n hasMoreBefore: false,\n oldestMessageId: null,\n newestMessageId: null,\n});\n\nconst normalizeToolStatus = (status: unknown): ToolCallStatus => {\n if (status === 'pending') return 'pending';\n if (status === 'running' || status === 'processing') return 'running';\n if (status === 'failed') return 'failed';\n return 'completed';\n};\n\nconst parseToolArguments = (value: unknown): Record<string, unknown> => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // Ignore invalid JSON and fall through to empty args.\n }\n }\n return {};\n};\n\nconst matchesToolResultUpdate = (\n target: { id?: string; name?: string },\n update: Pick<ToolResultUpdate, 'id' | 'name'>,\n): boolean => {\n if (update.id && target.id) {\n return update.id === target.id;\n }\n\n return Boolean(update.name && target.name && update.name === target.name);\n};\n\nconst findMatchingToolCallIndex = (\n toolCalls: NonNullable<InternalChatMessage['_activityToolCalls']>,\n update: ToolResultUpdate,\n): number => toolCalls.findIndex((toolCall) => (\n matchesToolResultUpdate(\n { id: toolCall.id, name: toolCall.name },\n update,\n ) &&\n (toolCall.status === 'pending' || toolCall.status === 'running' || typeof toolCall.result === 'undefined')\n));\n\nconst applyToolResultUpdateToMessages = (\n messages: InternalChatMessage[],\n update: ToolResultUpdate,\n assistantPatch?: Partial<InternalChatMessage>,\n): { messages: InternalChatMessage[]; matched: boolean } => {\n const nextMessages = [...messages];\n\n for (let i = nextMessages.length - 1; i >= 0; i--) {\n const message = nextMessages[i];\n if (message.role !== 'assistant' || !Array.isArray(message._activityToolCalls) || message._activityToolCalls.length === 0) {\n continue;\n }\n\n const toolCallIndex = findMatchingToolCallIndex(message._activityToolCalls, update);\n if (toolCallIndex === -1) continue;\n\n nextMessages[i] = syncAssistantActivity({\n ...applyAssistantToolResult(message, {\n ...(update.id ? { id: update.id } : {}),\n name: update.name ?? message._activityToolCalls[toolCallIndex].name,\n status: update.status,\n ...(update.result !== undefined ? { result: update.result } : {}),\n endTime: update.endTime,\n }),\n ...(assistantPatch ?? {}),\n });\n\n return { messages: nextMessages, matched: true };\n }\n\n return { messages, matched: false };\n};\n\nconst extractLiveToolCall = (payload: Record<string, unknown> | undefined): ParsedToolCall | null => {\n const toolCall = payload?.toolCall as Record<string, unknown> | undefined;\n if (!toolCall) return null;\n\n const tool = toolCall.tool as Record<string, unknown> | undefined;\n const name = typeof tool?.name === 'string'\n ? tool.name\n : typeof tool?.id === 'string'\n ? tool.id\n : 'tool';\n const result = toolCall.output !== undefined ? toolCall.output : undefined;\n\n return {\n ...(typeof toolCall.id === 'string' ? { id: toolCall.id } : {}),\n name,\n arguments: parseToolArguments(toolCall.args),\n status: normalizeToolStatus(toolCall.status ?? payload?.status ?? 'running'),\n ...(result !== undefined ? { result } : {}),\n };\n};\n\nconst extractLiveToolResultUpdate = (\n payload: Record<string, unknown> | undefined,\n): ToolResultUpdate => {\n const tool = payload?.tool as Record<string, unknown> | undefined;\n const result =\n payload?.projectedOutput !== undefined\n ? payload.projectedOutput\n : payload?.output !== undefined\n ? payload.output\n : payload?.content;\n\n return {\n ...(typeof payload?.toolCallId === 'string' ? { id: payload.toolCallId } : {}),\n ...(typeof tool?.name === 'string'\n ? { name: tool.name }\n : typeof tool?.id === 'string'\n ? { name: tool.id }\n : {}),\n status: normalizeToolStatus(payload?.status),\n ...(result !== undefined ? { result } : {}),\n endTime: nowTs(),\n };\n};\n\nconst extractToolCallsFromServerMessage = (msg: ServerMessage): ParsedToolCall[] => {\n const metadata = (msg.metadata ?? undefined) as Record<string, unknown> | undefined;\n const topLevelToolCalls = Array.isArray((msg as unknown as { toolCalls?: Array<Record<string, unknown>> }).toolCalls)\n ? ((msg as unknown as { toolCalls?: Array<Record<string, unknown>> }).toolCalls || [])\n : [];\n const metadataToolCalls = Array.isArray(metadata?.toolCalls)\n ? (metadata.toolCalls as Array<Record<string, unknown>>)\n : [];\n\n const usedMetadataIndexes = new Set<number>();\n const parsed: ParsedToolCall[] = [];\n\n const extractToolName = (obj: Record<string, unknown>): string | undefined => {\n if (typeof obj.name === 'string') return obj.name;\n const t = obj.tool as Record<string, unknown> | undefined;\n if (typeof t?.name === 'string') return t.name;\n if (typeof t?.id === 'string') return t.id;\n return undefined;\n };\n\n const findMatchingMetadataIndex = (toolCall: Record<string, unknown>): number => {\n const id = typeof toolCall.id === 'string' ? toolCall.id : undefined;\n const name = extractToolName(toolCall);\n\n const byId = id\n ? metadataToolCalls.findIndex((candidate, idx) => !usedMetadataIndexes.has(idx) && candidate?.id === id)\n : -1;\n if (byId >= 0) return byId;\n\n return name\n ? metadataToolCalls.findIndex((candidate, idx) => !usedMetadataIndexes.has(idx) && extractToolName(candidate) === name)\n : -1;\n };\n\n const parseToolCall = (\n primary: Record<string, unknown>,\n secondary?: Record<string, unknown>,\n ): ParsedToolCall => {\n const id = typeof primary.id === 'string'\n ? primary.id\n : (typeof secondary?.id === 'string' ? secondary.id : undefined);\n const toolObj = primary.tool as Record<string, unknown> | undefined;\n const secondaryToolObj = secondary?.tool as Record<string, unknown> | undefined;\n const name = typeof primary.name === 'string'\n ? primary.name\n : typeof toolObj?.name === 'string'\n ? toolObj.name\n : typeof toolObj?.id === 'string'\n ? toolObj.id\n : typeof secondary?.name === 'string'\n ? secondary.name\n : typeof secondaryToolObj?.name === 'string'\n ? secondaryToolObj.name\n : typeof secondaryToolObj?.id === 'string'\n ? secondaryToolObj.id\n : 'tool';\n const argsRaw =\n primary.args ?? primary.arguments ?? secondary?.args ?? secondary?.arguments;\n const result =\n primary.output !== undefined\n ? primary.output\n : primary.result !== undefined\n ? primary.result\n : secondary?.output !== undefined\n ? secondary.output\n : secondary?.result;\n const status = normalizeToolStatus(primary.status ?? secondary?.status);\n\n return {\n ...(id ? { id } : {}),\n name,\n arguments: parseToolArguments(argsRaw),\n ...(result !== undefined ? { result } : {}),\n status,\n };\n };\n\n topLevelToolCalls.forEach((toolCall) => {\n const metadataIndex = findMatchingMetadataIndex(toolCall);\n const metadataCall = metadataIndex >= 0 ? metadataToolCalls[metadataIndex] : undefined;\n if (metadataIndex >= 0) usedMetadataIndexes.add(metadataIndex);\n parsed.push(parseToolCall(toolCall, metadataCall));\n });\n\n metadataToolCalls.forEach((toolCall, index) => {\n if (usedMetadataIndexes.has(index)) return;\n parsed.push(parseToolCall(toolCall));\n });\n\n return parsed;\n};\n\nconst extractToolResultUpdateFromMessage = (msg: ServerMessage): ToolResultUpdate | null => {\n if (msg.senderType !== 'tool') return null;\n\n const toolCalls = extractToolCallsFromServerMessage(msg);\n if (!Array.isArray(toolCalls) || toolCalls.length === 0) return null;\n\n const firstToolCall = toolCalls[0];\n const metadata = (msg.metadata ?? undefined) as Record<string, unknown> | undefined;\n const fallbackResult = metadata?.output;\n const result = firstToolCall.result !== undefined ? firstToolCall.result : fallbackResult;\n\n return {\n ...(firstToolCall.id ? { id: firstToolCall.id } : {}),\n ...(firstToolCall.name ? { name: firstToolCall.name } : {}),\n ...(result !== undefined ? { result } : {}),\n status: firstToolCall.status,\n endTime: msg.createdAt ? new Date(msg.createdAt).getTime() : nowTs(),\n };\n};\n\nconst mergePersistedToolResults = (\n messages: InternalChatMessage[],\n updates: ToolResultUpdate[],\n): InternalChatMessage[] => {\n if (updates.length === 0) return messages;\n\n let nextMessages = messages;\n for (const update of updates) {\n nextMessages = applyToolResultUpdateToMessages(nextMessages, update).messages;\n }\n\n return nextMessages;\n};\n\nconst prependUniqueMessages = (\n olderMessages: InternalChatMessage[],\n currentMessages: InternalChatMessage[],\n): InternalChatMessage[] => {\n if (olderMessages.length === 0) return currentMessages;\n if (currentMessages.length === 0) return olderMessages;\n\n const seen = new Set<string>();\n const combined: InternalChatMessage[] = [];\n\n for (const message of [...olderMessages, ...currentMessages]) {\n if (seen.has(message.id)) continue;\n seen.add(message.id);\n combined.push(message);\n }\n\n return combined;\n};\n\nconst convertServerMessage = (msg: ServerMessage): InternalChatMessage => {\n const timestamp = msg.createdAt ? new Date(msg.createdAt).getTime() : nowTs();\n const metadata = (msg.metadata ?? undefined) as Record<string, unknown> | undefined;\n const attachmentsMeta = Array.isArray(metadata?.attachments)\n ? (metadata!.attachments as Array<Record<string, unknown>>)\n : [];\n\n const attachments: MediaAttachment[] = attachmentsMeta.flatMap((att) => {\n const kind = typeof att.kind === 'string' ? att.kind : undefined;\n const dataUrl = typeof att.dataUrl === 'string' ? att.dataUrl : undefined;\n const mimeType = typeof att.mimeType === 'string' ? att.mimeType : undefined;\n if (!dataUrl) return [];\n\n if (kind === 'image') {\n return [{ kind: 'image', dataUrl, mimeType: mimeType ?? 'image/jpeg' }] as MediaAttachment[];\n }\n if (kind === 'audio') {\n return [{\n kind: 'audio',\n dataUrl,\n mimeType: mimeType ?? 'audio/webm',\n durationMs: typeof att.durationMs === 'number' ? att.durationMs : undefined,\n }] as MediaAttachment[];\n }\n if (kind === 'video') {\n return [{\n kind: 'video',\n dataUrl,\n mimeType: mimeType ?? 'video/mp4',\n durationMs: typeof att.durationMs === 'number' ? att.durationMs : undefined,\n poster: typeof att.poster === 'string' ? att.poster : undefined,\n }] as MediaAttachment[];\n }\n return [] as MediaAttachment[];\n });\n\n const role = msg.senderType === 'agent'\n ? 'assistant'\n : msg.senderType === 'user'\n ? 'user'\n : 'assistant';\n\n const parsedToolCalls = extractToolCallsFromServerMessage(msg);\n const shouldRenderToolCalls = msg.senderType !== 'tool';\n const mappedToolCalls = parsedToolCalls.map((toolCall) => ({\n id: toolCall.id ?? generateId(),\n name: toolCall.name,\n arguments: toolCall.arguments,\n status: toolCall.status,\n ...(toolCall.result !== undefined ? { result: toolCall.result } : {}),\n }));\n\n const hasToolCalls = shouldRenderToolCalls && mappedToolCalls.length > 0;\n const isToolSender = msg.senderType === 'tool';\n const content =\n isToolSender\n ? '' // Do not render textual content for tool messages; attachments only\n : ((msg.content ?? '') || (hasToolCalls ? '' : ''));\n\n const reasoning = typeof (msg as any).reasoning === 'string' && (msg as any).reasoning.length > 0\n ? (msg as any).reasoning as string\n : undefined;\n\n // Extract sender identity for multi-agent display\n const senderAgentId = msg.senderType === 'agent' ? (msg.senderId ?? undefined) : undefined;\n const senderName = msg.senderType === 'agent'\n ? (typeof (msg as any).senderName === 'string' ? (msg as any).senderName : (msg.senderId ?? undefined))\n : undefined;\n\n return syncAssistantActivity({\n id: msg.id,\n role,\n content,\n timestamp,\n attachments: attachments.length > 0 ? attachments : undefined,\n isStreaming: false,\n isComplete: true,\n metadata,\n _activityToolCalls: hasToolCalls ? mappedToolCalls : undefined,\n ...(reasoning ? { _activityReasoning: reasoning } : {}),\n ...(senderAgentId ? { senderAgentId } : {}),\n ...(senderName ? { senderName } : {}),\n });\n};\n\nexport interface UseCopilotzOptions {\n userId: string | null;\n initialContext?: ChatUserContext;\n bootstrap?: {\n initialMessage?: string;\n initialToolCalls?: Array<{ name: string; args: Record<string, unknown> }>;\n };\n defaultThreadName?: string;\n onToolOutput?: (output: Record<string, unknown>) => void;\n preferredAgentName?: string | null;\n /** Agent participants in the thread (multi-agent). When set, overrides preferredAgentName for thread.participants. */\n participants?: string[] | null;\n /** Explicit target agent for each message. When set, maps to MessagePayload.target. */\n targetAgentName?: string | null;\n getRequestHeaders?: RequestHeadersProvider;\n eventInterceptor?: EventInterceptor;\n runErrorInterceptor?: RunErrorInterceptor;\n}\n\nexport function useCopilotz({\n userId,\n initialContext,\n bootstrap,\n defaultThreadName,\n onToolOutput,\n preferredAgentName,\n participants,\n targetAgentName,\n getRequestHeaders,\n eventInterceptor,\n runErrorInterceptor,\n}: UseCopilotzOptions) {\n // URL state — thread ID is synced to/from URL by default\n const {\n state: urlState,\n setThreadId: setUrlThreadId,\n isEnabled: isUrlSyncEnabled,\n } = useUrlState();\n\n const [threads, setThreads] = useState<ChatThread[]>([]);\n const [threadMetadataMap, setThreadMetadataMap] = useState<Record<string, Record<string, unknown> | undefined>>({});\n const [threadExternalIdMap, setThreadExternalIdMap] = useState<Record<string, string | null>>({});\n\n const [currentThreadId, setCurrentThreadId] = useState<string | null>(null);\n const [currentThreadExternalId, setCurrentThreadExternalId] = useState<string | null>(null);\n\n const [messages, setMessages] = useState<InternalChatMessage[]>([]);\n const [isMessagesLoading, setIsMessagesLoading] = useState(false);\n const [isLoadingOlderMessages, setIsLoadingOlderMessages] = useState(false);\n const [messagePageInfo, setMessagePageInfo] = useState<RestMessagePageInfo>(createEmptyMessagePageInfo);\n const [isStreaming, setIsStreaming] = useState(false);\n const [specialState, setSpecialState] = useState<SpecialChatState | null>(null);\n\n const [userContextSeed, setUserContextSeed] = useState<Partial<ChatUserContext>>(initialContext || {});\n const preferredAgentRef = useRef<string | null>(preferredAgentName ?? null);\n const participantsRef = useRef<string[] | null>(participants ?? null);\n const targetAgentNameRef = useRef<string | null>(targetAgentName ?? null);\n\n // Refs to hold latest state for callbacks to avoid dependency cycles\n // Using direct assignment pattern instead of useEffect for better performance\n const threadsRef = useRef(threads);\n const threadMetadataMapRef = useRef(threadMetadataMap);\n const threadExternalIdMapRef = useRef(threadExternalIdMap);\n const currentThreadIdRef = useRef(currentThreadId);\n const currentThreadExternalIdRef = useRef(currentThreadExternalId);\n const userContextSeedRef = useRef(userContextSeed);\n const messagePageInfoRef = useRef(messagePageInfo);\n const isLoadingOlderMessagesRef = useRef(isLoadingOlderMessages);\n const persistedToolUpdatesRef = useRef<ToolResultUpdate[]>([]);\n // Buffer live TOOL_RESULT updates that arrive before their matching TOOL_CALL\n // has been rendered. We reconcile them as soon as the TOOL_CALL lands.\n const liveToolUpdatesRef = useRef<ToolResultUpdate[]>([]);\n\n // Sync refs on every render (more efficient than multiple useEffects)\n threadsRef.current = threads;\n threadMetadataMapRef.current = threadMetadataMap;\n threadExternalIdMapRef.current = threadExternalIdMap;\n currentThreadIdRef.current = currentThreadId;\n currentThreadExternalIdRef.current = currentThreadExternalId;\n userContextSeedRef.current = userContextSeed;\n messagePageInfoRef.current = messagePageInfo;\n isLoadingOlderMessagesRef.current = isLoadingOlderMessages;\n preferredAgentRef.current = preferredAgentName ?? null;\n participantsRef.current = participants ?? null;\n targetAgentNameRef.current = targetAgentName ?? null;\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const messagesRequestRef = useRef<number>(0);\n // Guard to prevent double initialization in StrictMode\n const initializationRef = useRef<{ userId: string | null; started: boolean }>({ userId: null, started: false });\n\n useEffect(() => {\n if (initialContext) {\n setUserContextSeed((prev) => ({ ...prev, ...initialContext }));\n }\n }, [initialContext]);\n\n const processToolOutput = useCallback((output: Record<string, unknown>) => {\n if (!output) return;\n\n const contextPatch: Partial<ChatUserContext> = {};\n\n // Generic merge of userContext from output if present\n if (output.userContext && typeof output.userContext === 'object') {\n Object.assign(contextPatch, output.userContext as Partial<ChatUserContext>);\n }\n\n if (Object.keys(contextPatch).length > 0) {\n setUserContextSeed((prev) => ({ ...prev, ...contextPatch }));\n }\n\n onToolOutput?.(output);\n }, [onToolOutput]);\n\n const clearSpecialState = useCallback(() => {\n setSpecialState(null);\n }, []);\n\n const applyEventInterceptor = useCallback((event: unknown) => {\n if (!eventInterceptor) return undefined;\n try {\n const result = eventInterceptor(event);\n if (result?.specialState) {\n setSpecialState(result.specialState);\n }\n return result;\n } catch (error) {\n console.error('Error in Copilotz event interceptor', error);\n return undefined;\n }\n }, [eventInterceptor]);\n\n const getSpecialStateFromError = useCallback((error: unknown) => {\n if (!runErrorInterceptor) return null;\n try {\n return runErrorInterceptor(error) ?? null;\n } catch (interceptorError) {\n console.error('Error in Copilotz run error interceptor', interceptorError);\n return null;\n }\n }, [runErrorInterceptor]);\n\n const handleStreamMessageEvent = useCallback((event: any) => {\n const payload = getEventPayload(event);\n if (!payload) return;\n const liveMetadata = (\n event?.metadata && typeof event.metadata === 'object'\n ? event.metadata\n : payload?.metadata\n ) as Record<string, unknown> | undefined;\n if (isInternalMessageMetadata(liveMetadata)) {\n return;\n }\n const senderType = getEventSenderType(payload);\n if (senderType !== 'agent' || typeof payload.content !== 'string') return;\n\n // Fallback path for custom/non-contract events that still look like an\n // assistant artifact message.\n const agentIdentity = resolveLiveAgentIdentity(event);\n const incomingAgentKey = agentIdentity.senderAgentId ?? agentIdentity.senderName ?? null;\n\n setMessages((prev) => {\n const next = [...prev];\n for (let i = next.length - 1; i >= 0; i--) {\n const m = next[i];\n if (canAttachToStreamingAssistant(m, incomingAgentKey)) {\n next[i] = syncAssistantActivity({\n ...m,\n content: payload.content,\n isStreaming: false,\n isComplete: true,\n ...agentIdentity,\n });\n return next;\n }\n }\n\n const trimmedContent = payload.content.trim();\n if (!trimmedContent) {\n return prev;\n }\n\n return [\n ...next,\n syncAssistantActivity({\n id: generateId(),\n role: 'assistant',\n content: payload.content,\n timestamp: nowTs(),\n isStreaming: false,\n isComplete: true,\n metadata: liveMetadata,\n ...agentIdentity,\n } as InternalChatMessage),\n ];\n });\n }, []);\n\n const updateThreadsState = useCallback((rawThreads: ServerThread[], preferredExternalId?: string | null) => {\n const metadataMap: Record<string, Record<string, unknown> | undefined> = {};\n const externalMap: Record<string, string | null> = {};\n\n const normalized = rawThreads.map((thread) => {\n metadataMap[thread.id] = thread.metadata ?? undefined;\n externalMap[thread.id] = thread.externalId ?? null;\n const updatedAt = thread.updatedAt ? new Date(thread.updatedAt).getTime() : nowTs();\n const createdAt = thread.createdAt ? new Date(thread.createdAt).getTime() : updatedAt;\n return {\n id: thread.id,\n title: thread.name || 'Chat',\n createdAt,\n updatedAt,\n messageCount: typeof thread.metadata?.messageCount === 'number'\n ? thread.metadata!.messageCount as number\n : 0,\n isArchived: thread.status === 'archived',\n metadata: thread.metadata ?? undefined,\n } as ChatThread;\n });\n\n setThreadMetadataMap(metadataMap);\n setThreadExternalIdMap(externalMap);\n setThreads(normalized);\n\n // Use refs to avoid dependency cycle\n const curExtId = currentThreadExternalIdRef.current;\n const curId = currentThreadIdRef.current;\n\n let nextThreadId: string | null = null;\n\n if (preferredExternalId) {\n const preferred = rawThreads.find((thread) => (thread.externalId ?? thread.id) === preferredExternalId);\n if (preferred) nextThreadId = preferred.id;\n }\n\n if (!nextThreadId && curExtId) {\n const match = rawThreads.find((thread) => (thread.externalId ?? thread.id) === curExtId);\n if (match) nextThreadId = match.id;\n }\n\n if (!nextThreadId && curId && rawThreads.some((thread) => thread.id === curId)) {\n nextThreadId = curId;\n }\n\n if (!nextThreadId && normalized.length > 0) {\n nextThreadId = normalized[0].id;\n }\n\n setCurrentThreadId(nextThreadId ?? null);\n setCurrentThreadExternalId(nextThreadId ? externalMap[nextThreadId] ?? null : null);\n\n return nextThreadId;\n }, []); // No dependencies needed now as we use refs for reading current state\n\n const fetchAndSetThreadsState = useCallback(async (uid: string, preferredExternalId?: string | null) => {\n try {\n const rawThreads = await fetchThreads(uid, getRequestHeaders);\n return updateThreadsState(rawThreads, preferredExternalId);\n } catch (error) {\n if (isAbortError(error)) return;\n console.error('Error loading threads', error);\n return null;\n }\n }, [updateThreadsState, getRequestHeaders]);\n\n const prepareThreadMessages = useCallback(async (rawMessages: ServerMessage[]) => {\n const resolvedMessages = await resolveAssetsInMessages(rawMessages as unknown as any[]);\n\n resolvedMessages.forEach((msg: any) => {\n if (msg.senderType === 'tool') {\n const metadata = msg.metadata as Record<string, unknown> | undefined;\n const output = (metadata?.output ?? metadata) as Record<string, unknown> | undefined;\n if (output) processToolOutput(output);\n }\n });\n\n const toolResultUpdates = resolvedMessages\n .map((msg) => extractToolResultUpdateFromMessage(msg as unknown as ServerMessage))\n .filter((update): update is ToolResultUpdate => update !== null);\n\n const viewMessages = resolvedMessages\n .filter((msg) => {\n const meta = (msg.metadata ?? {}) as Record<string, unknown>;\n if (isInternalMessageMetadata(meta)) {\n return false;\n }\n const text = (typeof msg.content === 'string' ? msg.content : '').trim();\n const hasText = text.length > 0;\n const hasToolCalls = extractToolCallsFromServerMessage(msg as unknown as ServerMessage).length > 0;\n const hasAttachments = Array.isArray(meta.attachments) && (meta.attachments as unknown[]).length > 0;\n if (msg.senderType === 'tool') {\n return hasAttachments;\n }\n return hasText || hasToolCalls || hasAttachments;\n })\n .map(convertServerMessage);\n\n return {\n viewMessages,\n toolResultUpdates,\n };\n }, [processToolOutput]);\n\n const loadThreadMessages = useCallback(async (threadId: string) => {\n const requestId = messagesRequestRef.current + 1;\n messagesRequestRef.current = requestId;\n setIsMessagesLoading(true);\n setIsLoadingOlderMessages(false);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n liveToolUpdatesRef.current = [];\n try {\n const page = await fetchThreadMessagesPage(\n threadId,\n { limit: THREAD_MESSAGES_PAGE_SIZE },\n getRequestHeaders,\n );\n const { viewMessages, toolResultUpdates } = await prepareThreadMessages(page.data);\n if (messagesRequestRef.current !== requestId) return;\n\n persistedToolUpdatesRef.current = toolResultUpdates;\n const hydratedMessages = mergePersistedToolResults(viewMessages, persistedToolUpdatesRef.current);\n setMessages(hydratedMessages);\n setMessagePageInfo(page.pageInfo);\n } catch (error) {\n if (isAbortError(error)) return;\n console.error(`Error loading messages for thread ${threadId}`, error);\n persistedToolUpdatesRef.current = [];\n setMessagePageInfo(createEmptyMessagePageInfo());\n } finally {\n if (messagesRequestRef.current === requestId) {\n setIsMessagesLoading(false);\n }\n }\n }, [getRequestHeaders, prepareThreadMessages]);\n\n const loadOlderMessages = useCallback(async () => {\n const threadId = currentThreadIdRef.current;\n const pageInfo = messagePageInfoRef.current;\n const before = pageInfo.oldestMessageId;\n\n if (!threadId || !before || !pageInfo.hasMoreBefore || isLoadingOlderMessagesRef.current) {\n return;\n }\n\n const requestId = messagesRequestRef.current;\n setIsLoadingOlderMessages(true);\n\n try {\n const page = await fetchThreadMessagesPage(\n threadId,\n { limit: THREAD_MESSAGES_PAGE_SIZE, before },\n getRequestHeaders,\n );\n const { viewMessages, toolResultUpdates } = await prepareThreadMessages(page.data);\n if (messagesRequestRef.current !== requestId) return;\n\n persistedToolUpdatesRef.current = [\n ...toolResultUpdates,\n ...persistedToolUpdatesRef.current,\n ];\n\n setMessages((prev) => mergePersistedToolResults(\n prependUniqueMessages(viewMessages, prev),\n persistedToolUpdatesRef.current,\n ));\n setMessagePageInfo(page.pageInfo);\n } catch (error) {\n if (isAbortError(error)) return;\n console.error(`Error loading older messages for thread ${threadId}`, error);\n } finally {\n if (messagesRequestRef.current === requestId) {\n setIsLoadingOlderMessages(false);\n }\n }\n }, [getRequestHeaders, prepareThreadMessages]);\n\n const handleSelectThread = useCallback(async (threadId: string) => {\n setCurrentThreadId(threadId);\n setMessages([]);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n // Use ref for external map to avoid re-creation\n const extMap = threadExternalIdMapRef.current;\n setCurrentThreadExternalId(extMap[threadId] ?? null);\n await loadThreadMessages(threadId);\n }, [loadThreadMessages]);\n\n const handleCreateThread = useCallback((title?: string) => {\n messagesRequestRef.current += 1;\n setIsMessagesLoading(false);\n setIsLoadingOlderMessages(false);\n const id = generateId();\n const now = nowTs();\n const newThread: ChatThread = {\n id,\n title: title?.trim() || 'New Chat',\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n metadata: { pendingTitle: title?.trim() || undefined },\n };\n\n setThreads((prev) => [newThread, ...prev]);\n setThreadMetadataMap((prev) => ({ ...prev, [id]: { pendingTitle: title?.trim() || undefined } }));\n setThreadExternalIdMap((prev) => ({ ...prev, [id]: id }));\n setCurrentThreadId(id);\n setCurrentThreadExternalId(id);\n setMessages([]);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n }, []);\n\n const handleRenameThread = useCallback(async (threadId: string, newTitle: string) => {\n const trimmedTitle = newTitle.trim();\n if (!trimmedTitle) return;\n\n // Update local state immediately\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, title: trimmedTitle, updatedAt: nowTs() } : t))\n );\n\n // Check if this is a placeholder thread (not yet persisted)\n const extMap = threadExternalIdMapRef.current;\n const isPlaceholder = extMap[threadId] === threadId;\n\n if (isPlaceholder) {\n // Store title in metadata for when thread is created\n setThreadMetadataMap((prev) => ({\n ...prev,\n [threadId]: { ...prev[threadId], pendingTitle: trimmedTitle },\n }));\n } else {\n // Persist to backend\n try {\n await updateThreadApi(threadId, { name: trimmedTitle }, getRequestHeaders);\n } catch (error) {\n console.error('Failed to rename thread:', error);\n // Revert on error - refetch threads\n if (userId) {\n await fetchAndSetThreadsState(userId, currentThreadExternalIdRef.current);\n }\n }\n }\n }, [userId, fetchAndSetThreadsState, getRequestHeaders]);\n\n const handleArchiveThread = useCallback(async (threadId: string) => {\n // Find current archive status\n const thread = threadsRef.current.find((t) => t.id === threadId);\n if (!thread) return;\n\n const newArchivedStatus = !thread.isArchived;\n\n // Update local state immediately\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, isArchived: newArchivedStatus, updatedAt: nowTs() } : t))\n );\n\n // Check if this is a placeholder thread\n const extMap = threadExternalIdMapRef.current;\n const isPlaceholder = extMap[threadId] === threadId;\n\n if (!isPlaceholder) {\n try {\n await updateThreadApi(threadId, { status: newArchivedStatus ? 'archived' : 'active' }, getRequestHeaders);\n } catch (error) {\n console.error('Failed to archive thread:', error);\n // Revert on error\n if (userId) {\n await fetchAndSetThreadsState(userId, currentThreadExternalIdRef.current);\n }\n }\n }\n }, [userId, fetchAndSetThreadsState, getRequestHeaders]);\n\n const handleDeleteThread = useCallback(async (threadId: string) => {\n // Check if this is a placeholder thread\n const extMap = threadExternalIdMapRef.current;\n const isPlaceholder = extMap[threadId] === threadId;\n\n // Remove from local state immediately\n setThreads((prev) => prev.filter((t) => t.id !== threadId));\n setThreadMetadataMap((prev) => {\n const next = { ...prev };\n delete next[threadId];\n return next;\n });\n setThreadExternalIdMap((prev) => {\n const next = { ...prev };\n delete next[threadId];\n return next;\n });\n\n // If deleting current thread, switch to another\n if (currentThreadIdRef.current === threadId) {\n const remaining = threadsRef.current.filter((t) => t.id !== threadId);\n if (remaining.length > 0) {\n setCurrentThreadId(remaining[0].id);\n setCurrentThreadExternalId(extMap[remaining[0].id] ?? null);\n await loadThreadMessages(remaining[0].id);\n } else {\n setCurrentThreadId(null);\n setCurrentThreadExternalId(null);\n setMessages([]);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n }\n }\n\n if (!isPlaceholder) {\n try {\n await deleteThreadApi(threadId, getRequestHeaders);\n } catch (error) {\n console.error('Failed to delete thread:', error);\n // Refetch to restore state on error\n if (userId) {\n await fetchAndSetThreadsState(userId, currentThreadExternalIdRef.current);\n }\n }\n }\n }, [userId, fetchAndSetThreadsState, loadThreadMessages, getRequestHeaders]);\n\n const handleStop = useCallback(() => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n setMessages((prev) => {\n // Check if any message needs updating before creating new array\n const hasStreaming = prev.some((msg) => msg.isStreaming);\n if (!hasStreaming) return prev;\n return prev.map((msg) => (msg.isStreaming ? closeAssistantMessage(msg) : msg));\n });\n }, []);\n\n const handleStreamAssetEvent = useCallback((payload: any, assistantMessageId: string) => {\n // Handle ASSET_CREATED event from copilotz\n if (!payload?.dataUrl) return;\n\n const mimeType = payload.mime || 'image/png';\n const dataUrl = payload.dataUrl;\n\n // Determine attachment kind based on mime type\n let kind: 'image' | 'audio' | 'video' = 'image';\n if (mimeType.startsWith('audio/')) {\n kind = 'audio';\n } else if (mimeType.startsWith('video/')) {\n kind = 'video';\n }\n\n const mediaAttachment: MediaAttachment = {\n kind,\n dataUrl,\n mimeType,\n };\n\n setMessages((prev) => prev.map((msg) => (msg.id === assistantMessageId\n ? syncAssistantActivity({\n ...msg,\n attachments: [...(msg.attachments || []), mediaAttachment],\n })\n : msg)));\n }, []);\n\n const sendCopilotzMessage = useCallback(async (\n params: {\n threadId?: string | null;\n threadExternalId?: string | null;\n content: string;\n attachments?: MediaAttachment[];\n metadata?: Record<string, unknown>;\n threadMetadata?: Record<string, unknown>;\n toolCalls?: Array<{ name: string; args: Record<string, unknown> }>;\n userId: string;\n userName?: string;\n userMetadata?: Record<string, unknown>;\n agentName?: string | null;\n onBeforeStart?: (assistantMessageId: string) => void;\n },\n ) => {\n // Track the current live assistant message so one sender streak stays in one bubble.\n let currentAssistantId = generateId();\n let currentAssistantIdentity: AgentIdentity = {};\n params.onBeforeStart?.(currentAssistantId);\n\n let hasStreamProgress = false;\n\n // Combined function to ensure bubble exists AND update content in a single setMessages call\n const updateStreamingMessage = (\n partial: string,\n opts?: {\n isReasoning?: boolean;\n agent?: { id?: string | null; name?: string | null } | null;\n },\n ) => {\n if (partial && partial.length > 0) {\n hasStreamProgress = true;\n }\n\n const isReasoning = opts?.isReasoning ?? false;\n const nextIdentity = normalizeAgentIdentity(opts?.agent ?? null);\n if (nextIdentity.senderAgentId || nextIdentity.senderName) {\n currentAssistantIdentity = {\n ...currentAssistantIdentity,\n ...nextIdentity,\n };\n }\n const agentIdentity = currentAssistantIdentity;\n const nextAgentKey = agentIdentity.senderAgentId ?? agentIdentity.senderName ?? null;\n\n const applyUpdate = (msg: InternalChatMessage): InternalChatMessage => {\n return updateAssistantMessageToken(msg, {\n partial,\n isReasoning,\n agentIdentity,\n });\n };\n \n setMessages((prev) => {\n const idx = prev.findIndex((m) => m.id === currentAssistantId);\n if (idx >= 0 && canAttachToStreamingAssistant(prev[idx], nextAgentKey)) {\n const msg = prev[idx];\n const next = applyUpdate(msg);\n if (msg.content === next.content && msg._activityReasoning === next._activityReasoning && msg._activityReasoningStreaming === next._activityReasoningStreaming && msg.isStreaming === next.isStreaming && msg.isComplete === next.isComplete) {\n return prev;\n }\n const updated = [...prev];\n updated[idx] = next;\n return updated;\n }\n \n const last = prev[prev.length - 1];\n if (canAttachToStreamingAssistant(last, nextAgentKey)) {\n currentAssistantId = last.id;\n const next = applyUpdate(last);\n if (last.content === next.content && last._activityReasoning === next._activityReasoning && last._activityReasoningStreaming === next._activityReasoningStreaming && last.isStreaming === next.isStreaming && last.isComplete === next.isComplete) {\n return prev;\n }\n const updated = [...prev];\n updated[prev.length - 1] = next;\n return updated;\n }\n \n const lastStreamingBelongsToDifferentAgent =\n Boolean(nextAgentKey) &&\n last?.role === 'assistant' &&\n last.isStreaming &&\n Boolean(messageAgentKey(last)) &&\n messageAgentKey(last) !== nextAgentKey;\n\n if (\n !prev.length ||\n (prev[prev.length - 1].role !== 'assistant' || !prev[prev.length - 1].isStreaming) ||\n lastStreamingBelongsToDifferentAgent\n ) {\n const newId = generateId();\n currentAssistantId = newId;\n const base: InternalChatMessage = {\n id: newId,\n role: 'assistant' as const,\n content: '',\n timestamp: nowTs(),\n isStreaming: true,\n isComplete: false,\n ...currentAssistantIdentity,\n };\n return [...prev, applyUpdate(base)];\n }\n \n return prev;\n });\n };\n\n const finalizeCurrentAssistantBubble = () => {\n setMessages((prev) => {\n const idx = prev.findIndex((m) => m.id === currentAssistantId);\n if (idx < 0) return prev;\n const msg = prev[idx];\n // Skip update if already finalized\n if (!msg.isStreaming && msg.isComplete) return prev;\n const updated = [...prev];\n updated[idx] = closeAssistantMessage(msg);\n return updated;\n });\n };\n\n // Using Refs for accessing current state inside callback\n const curThreadId = currentThreadIdRef.current;\n\n const applyLiveToolResultUpdate = (update: ToolResultUpdate) => {\n let matched = false;\n setMessages((prev) => {\n const next = applyToolResultUpdateToMessages(prev, update, {\n isStreaming: true,\n isComplete: false,\n });\n matched = next.matched;\n return next.matched ? next.messages : prev;\n });\n\n if (!matched) {\n liveToolUpdatesRef.current.push(update);\n }\n };\n\n const finalizeActiveAssistantTurn = (finalAnswer?: string) => {\n setMessages((prev) => {\n const currentIdx = prev.findIndex((message) => (\n message.id === currentAssistantId &&\n message.role === 'assistant'\n ));\n const fallbackIdx = currentIdx >= 0\n ? currentIdx\n : (() => {\n for (let i = prev.length - 1; i >= 0; i--) {\n if (prev[i].role === 'assistant' && prev[i].isStreaming) {\n return i;\n }\n }\n return -1;\n })();\n\n if (fallbackIdx < 0) return prev;\n\n const message = prev[fallbackIdx];\n const nextMessage = finalizeAssistantMessage(message, finalAnswer);\n\n if (\n message.content === nextMessage.content &&\n message.isStreaming === nextMessage.isStreaming &&\n message.isComplete === nextMessage.isComplete &&\n message._activityReasoningStreaming === nextMessage._activityReasoningStreaming\n ) {\n return prev;\n }\n\n const updated = [...prev];\n updated[fallbackIdx] = nextMessage;\n currentAssistantId = nextMessage.id;\n return updated;\n });\n };\n\n // Build a ServerMessage-like object from selected streaming artifact events.\n const toServerMessageFromEvent = async (event: any): Promise<ServerMessage | null> => {\n if (!event) return null;\n const type = (event?.type as string) || '';\n const payload = event?.payload ?? event;\n\n // TOOL_CALL bubble\n if (type === 'TOOL_CALL') {\n const parsedToolCall = extractLiveToolCall(payload);\n if (!parsedToolCall) return null;\n\n return {\n id: generateId(),\n threadId: curThreadId ?? '',\n senderType: 'tool',\n content: '',\n toolCalls: [{\n id: parsedToolCall.id ?? generateId(),\n name: parsedToolCall.name,\n args: parsedToolCall.arguments,\n ...(parsedToolCall.result !== undefined ? { output: parsedToolCall.result } : {}),\n status: parsedToolCall.status,\n }] as Array<Record<string, unknown>>,\n } as unknown as ServerMessage;\n }\n\n return null;\n };\n\n const abortController = new AbortController();\n abortControllerRef.current?.abort();\n abortControllerRef.current = abortController;\n setIsStreaming(true);\n // Reset the live tool-result buffer at the start of every stream so\n // stale updates from a previous run can't leak into this one.\n liveToolUpdatesRef.current = [];\n\n try {\n const normalizedUserMetadata = params.userMetadata\n ? JSON.parse(JSON.stringify(params.userMetadata)) as Record<string, unknown>\n : undefined;\n\n const contextSeed = userContextSeedRef.current;\n const contextMetadata = contextSeed\n ? JSON.parse(JSON.stringify(contextSeed)) as Record<string, unknown>\n : undefined;\n const requestContent = params.content && params.content.length > 0 ? params.content : '';\n\n const metadataKey = params.threadId ?? params.threadExternalId ?? undefined;\n // Read from ref to avoid dependency on threadMetadataMap\n const currentThreadMetadataMap = threadMetadataMapRef.current;\n const messageMetadata = metadataKey ? currentThreadMetadataMap[metadataKey]?.userContext as Record<string, unknown> | undefined : undefined;\n const threadMetadata = metadataKey ? currentThreadMetadataMap[metadataKey] : undefined;\n\n const mergedMetadata = {\n ...(messageMetadata ?? {}),\n ...(params.metadata ?? {}),\n } as Record<string, unknown>;\n\n const finalMetadata = Object.keys(mergedMetadata).length > 0 ? mergedMetadata : undefined;\n\n await runCopilotzStream({\n threadId: params.threadId ?? undefined,\n threadExternalId: params.threadExternalId ?? undefined,\n content: requestContent,\n user: {\n externalId: params.userId,\n name: params.userName ?? params.userId,\n metadata: {\n ...(contextMetadata ? contextMetadata : {}),\n ...(normalizedUserMetadata ?? {}),\n },\n },\n attachments: params.attachments,\n metadata: finalMetadata,\n threadMetadata: params.threadMetadata ?? threadMetadata,\n toolCalls: params.toolCalls,\n selectedAgent: params.agentName ?? preferredAgentRef.current ?? null,\n participants: participantsRef.current,\n targetAgent: targetAgentNameRef.current,\n getRequestHeaders,\n onToken: (token, _isComplete, raw, opts) => updateStreamingMessage(token, {\n ...opts,\n agent: raw?.payload?.agent ?? raw?.agent ?? null,\n }),\n onMessageEvent: async (event: any) => {\n const intercepted = applyEventInterceptor(event);\n if (intercepted?.handled) {\n return;\n }\n\n const type = (event?.type as string) || '';\n const payload = getEventPayload(event);\n\n if (type === 'TOOL_RESULT') {\n processToolOutput((payload ?? {}) as Record<string, unknown>);\n applyLiveToolResultUpdate(extractLiveToolResultUpdate(\n (payload ?? {}) as Record<string, unknown>,\n ));\n return;\n }\n\n if (type === 'LLM_RESULT') {\n const finalAnswer = typeof payload?.answer === 'string' ? payload.answer : undefined;\n finalizeActiveAssistantTurn(finalAnswer);\n return;\n }\n\n if (type === 'MESSAGE' || type === 'NEW_MESSAGE') {\n return;\n }\n\n // TOOL_CALL events: render inside current assistant bubble.\n // NOTE: This branch stays synchronous so any immediately following\n // TOOL_RESULT can reconcile against the rendered tool call.\n if (type === 'TOOL_CALL') {\n const parsedToolCall = extractLiveToolCall(\n (payload ?? {}) as Record<string, unknown>,\n );\n if (!parsedToolCall) return;\n const eventAgentIdentity = resolveLiveAgentIdentity(event);\n if (eventAgentIdentity.senderAgentId || eventAgentIdentity.senderName) {\n currentAssistantIdentity = {\n ...currentAssistantIdentity,\n ...eventAgentIdentity,\n };\n }\n const callId = parsedToolCall.id ?? generateId();\n const toolName = parsedToolCall.name;\n\n // Drain any tool-result updates that arrived before this TOOL_CALL.\n const bufferedUpdates = liveToolUpdatesRef.current;\n const matchingUpdateIndex = bufferedUpdates.findIndex((upd) => (\n matchesToolResultUpdate({ id: callId, name: toolName }, upd)\n ));\n const bufferedUpdate = matchingUpdateIndex >= 0 ? bufferedUpdates[matchingUpdateIndex] : undefined;\n if (matchingUpdateIndex >= 0) {\n bufferedUpdates.splice(matchingUpdateIndex, 1);\n }\n\n const initialStatus: 'pending' | 'running' | 'completed' | 'failed' =\n bufferedUpdate ? bufferedUpdate.status : parsedToolCall.status;\n const initialResult = bufferedUpdate && bufferedUpdate.result !== undefined\n ? bufferedUpdate.result\n : parsedToolCall.result;\n const endTime = bufferedUpdate?.endTime;\n\n setMessages((prev) =>\n (() => {\n const appendToolCall = (msg: ChatViewMessage) => ({\n ...appendAssistantToolCall(msg, {\n id: callId,\n name: toolName,\n arguments: parsedToolCall.arguments,\n ...(initialResult !== undefined ? { result: initialResult } : {}),\n status: initialStatus,\n startTime: Date.now(),\n ...(endTime !== undefined ? { endTime } : {}),\n }),\n });\n\n const currentIdx = prev.findIndex((message) => (\n message.id === currentAssistantId &&\n message.role === 'assistant' &&\n message.isStreaming\n ));\n if (currentIdx >= 0) {\n const next = [...prev];\n next[currentIdx] = appendToolCall({\n ...next[currentIdx],\n isStreaming: true,\n isComplete: false,\n ...currentAssistantIdentity,\n });\n return next;\n }\n\n const last = prev[prev.length - 1];\n if (canAttachToStreamingAssistant(\n last,\n currentAssistantIdentity.senderAgentId ?? currentAssistantIdentity.senderName ?? null,\n )) {\n currentAssistantId = last.id;\n const next = [...prev];\n next[prev.length - 1] = appendToolCall({\n ...last,\n isStreaming: true,\n isComplete: false,\n ...currentAssistantIdentity,\n });\n return next;\n }\n\n // No assistant message yet – create one to host the tool call\n const newId = generateId();\n currentAssistantId = newId;\n return [\n ...prev,\n appendToolCall({\n id: newId,\n role: 'assistant',\n content: '',\n timestamp: nowTs(),\n isStreaming: true,\n isComplete: false,\n ...currentAssistantIdentity,\n }),\n ];\n })(),\n );\n hasStreamProgress = true;\n return;\n }\n\n // Other event types (ASSET_CREATED, etc.) should render as their own bubbles\n const sm = await toServerMessageFromEvent(event);\n if (sm) {\n const viewMsg = convertServerMessage(sm as unknown as ServerMessage);\n finalizeCurrentAssistantBubble();\n setMessages((prev) => [...prev, viewMsg]);\n return;\n }\n\n // Fallback for unknown events\n handleStreamMessageEvent(event);\n },\n onAssetEvent: async (payload: any) => {\n const intercepted = applyEventInterceptor({ type: 'ASSET_CREATED', payload });\n if (intercepted?.handled) {\n return;\n }\n\n // Treat as ASSET_CREATED event in unified handler\n await (async () => {\n if (!hasStreamProgress) return;\n handleStreamAssetEvent(payload, currentAssistantId);\n })();\n },\n signal: abortController.signal,\n });\n } finally {\n setIsStreaming(false);\n setMessages((prev) => {\n const hasStreaming = prev.some((msg) => msg.isStreaming);\n if (!hasStreaming) return prev;\n return prev.map((msg) => (msg.isStreaming\n ? closeAssistantMessage(msg)\n : msg));\n });\n abortControllerRef.current = null;\n }\n\n return currentAssistantId;\n }, [applyEventInterceptor, handleStreamMessageEvent, handleStreamAssetEvent, getRequestHeaders]);\n\n const handleSendMessage = useCallback(async (content: string, attachments: MediaAttachment[] = []) => {\n if (!content.trim() && attachments.length === 0) return;\n if (!userId) return;\n\n const timestamp = nowTs();\n const curThreadId = currentThreadIdRef.current;\n const curThreadExtId = currentThreadExternalIdRef.current;\n\n const existingThreadId = curThreadId ?? undefined;\n // Use Ref to check without adding dependency\n const extMap = threadExternalIdMapRef.current;\n const isPlaceholderThread = existingThreadId\n ? extMap[existingThreadId] === existingThreadId\n : false;\n\n const threadIdForSend = isPlaceholderThread ? undefined : existingThreadId;\n\n let effectiveThreadExternalId = curThreadExtId ?? (isPlaceholderThread ? existingThreadId : undefined);\n\n if (!threadIdForSend) {\n if (!effectiveThreadExternalId) {\n effectiveThreadExternalId = generateId();\n }\n setCurrentThreadExternalId(effectiveThreadExternalId);\n } else if (curThreadExtId !== (effectiveThreadExternalId ?? null)) {\n setCurrentThreadExternalId(effectiveThreadExternalId ?? null);\n }\n\n const conversationKey = threadIdForSend ?? effectiveThreadExternalId!;\n\n // Get pending title for new threads if any\n const currentMetadata = threadMetadataMapRef.current[conversationKey];\n const pendingTitle = currentMetadata?.pendingTitle as string | undefined;\n\n const userMessage: ChatViewMessage = {\n id: generateId(),\n role: 'user',\n content,\n timestamp,\n attachments: attachments.length > 0 ? attachments : undefined,\n isComplete: true,\n };\n\n // Create an assistant message placeholder with streaming state for typewriter effect\n const assistantPlaceholder: ChatViewMessage = {\n id: generateId(),\n role: 'assistant',\n content: '',\n timestamp: timestamp + 1,\n isStreaming: true,\n isComplete: false,\n ...(targetAgentNameRef.current ? { senderName: targetAgentNameRef.current } : {}),\n };\n\n // Add user message and assistant placeholder for typewriter loading effect\n setMessages((prev) => [...prev, userMessage as InternalChatMessage, syncAssistantActivity(assistantPlaceholder as InternalChatMessage)]);\n setSpecialState(null);\n\n // Use ref for threads check\n if (!threadsRef.current.some(t => t.id === conversationKey)) {\n const newThread: ChatThread = {\n id: conversationKey,\n title: content.slice(0, 40) || 'Nova conversa',\n createdAt: timestamp,\n updatedAt: timestamp,\n messageCount: 0,\n };\n setThreads(prev => [newThread, ...prev]);\n setThreadMetadataMap(prev => ({ ...prev, [conversationKey]: {} }));\n setThreadExternalIdMap(prev => ({ ...prev, [conversationKey]: effectiveThreadExternalId ?? null }));\n }\n\n try {\n await sendCopilotzMessage({\n threadId: threadIdForSend,\n threadExternalId: effectiveThreadExternalId,\n content,\n attachments,\n userId,\n // userName can be anything, but let's try to find it in context or just fallback\n userName: (userContextSeedRef.current?.profile as any)?.full_name ?? userId,\n agentName: preferredAgentRef.current,\n // Include pending title for new threads\n threadMetadata: pendingTitle ? { name: pendingTitle } : undefined,\n });\n\n // Wait to ensure the assistant message is persisted before refreshing\n await new Promise((r) => setTimeout(r, 1000));\n // Refresh threads list to update metadata (message count, timestamps, etc.)\n // Don't reload messages since we already have them from streaming\n await fetchAndSetThreadsState(userId, effectiveThreadExternalId ?? existingThreadId ?? null);\n } catch (error) {\n if (isAbortError(error)) return;\n console.error('Error sending Copilotz message', error);\n const nextSpecialState = getSpecialStateFromError(error);\n if (nextSpecialState) {\n setSpecialState(nextSpecialState);\n setMessages((prev) => prev.filter((msg) => !msg.isStreaming));\n return;\n }\n setMessages((prev) => {\n const finalized = prev.map((msg) => (\n msg.isStreaming\n ? closeAssistantMessage(msg)\n : msg\n ));\n\n if (finalized.some(hasVisibleAssistantOutput)) {\n return finalized;\n }\n\n for (let i = finalized.length - 1; i >= 0; i--) {\n const message = finalized[i];\n if (message.role !== 'assistant') continue;\n\n const updated = [...finalized];\n updated[i] = syncAssistantActivity({\n ...message,\n content: 'Desculpe, ocorreu um erro ao gerar a resposta. Por favor, tente novamente.',\n isStreaming: false,\n isComplete: true,\n });\n return updated;\n }\n\n return [\n ...finalized,\n syncAssistantActivity({\n id: generateId(),\n role: 'assistant',\n content: 'Desculpe, ocorreu um erro ao gerar a resposta. Por favor, tente novamente.',\n timestamp: nowTs(),\n isStreaming: false,\n isComplete: true,\n }),\n ];\n });\n }\n }, [userId, fetchAndSetThreadsState, loadThreadMessages, sendCopilotzMessage, getSpecialStateFromError]);\n\n const bootstrapConversation = useCallback(async (uid: string) => {\n if (!bootstrap?.initialToolCalls && !bootstrap?.initialMessage) return;\n\n const bootstrapThreadExternalId = generateId();\n setCurrentThreadId(bootstrapThreadExternalId);\n setCurrentThreadExternalId(bootstrapThreadExternalId);\n setThreadExternalIdMap((prev) => ({ ...prev, [bootstrapThreadExternalId]: bootstrapThreadExternalId }));\n setThreadMetadataMap((prev) => ({ ...prev, [bootstrapThreadExternalId]: {} }));\n // Clear messages; let streaming create bubbles as needed\n setMessages([]);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n setSpecialState(null);\n\n try {\n await sendCopilotzMessage({\n threadExternalId: bootstrapThreadExternalId,\n content: bootstrap.initialMessage || '',\n toolCalls: bootstrap.initialToolCalls,\n userId: uid,\n agentName: preferredAgentRef.current,\n threadMetadata: {\n name: defaultThreadName || 'Main Thread',\n },\n });\n\n // Give the backend time to persist tool outputs/messages before refresh\n await new Promise((r) => setTimeout(r, 1000));\n\n // Refresh threads list to update metadata\n // Don't reload messages since we already have them from streaming\n await fetchAndSetThreadsState(uid, bootstrapThreadExternalId);\n } catch (error) {\n if (isAbortError(error)) return;\n console.error('Error bootstrapping conversation', error);\n const nextSpecialState = getSpecialStateFromError(error);\n if (nextSpecialState) {\n setSpecialState(nextSpecialState);\n setMessages([]);\n return;\n }\n setMessages([\n syncAssistantActivity({\n id: generateId(),\n role: 'assistant',\n content: 'Não foi possível iniciar a conversa. Tente novamente mais tarde.',\n timestamp: nowTs(),\n isStreaming: false,\n isComplete: true,\n }),\n ]);\n }\n }, [fetchAndSetThreadsState, loadThreadMessages, sendCopilotzMessage, bootstrap, defaultThreadName, getSpecialStateFromError]);\n\n const reset = useCallback(() => {\n messagesRequestRef.current += 1;\n setThreads([]);\n setThreadMetadataMap({});\n setThreadExternalIdMap({});\n setCurrentThreadId(null);\n setCurrentThreadExternalId(null);\n setMessages([]);\n setUserContextSeed({});\n setIsMessagesLoading(false);\n setIsLoadingOlderMessages(false);\n setIsStreaming(false);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n setSpecialState(null);\n abortControllerRef.current?.abort();\n }, []);\n\n // Initialize when userId changes\n useEffect(() => {\n if (userId) {\n // Guard against double initialization in StrictMode\n if (initializationRef.current.userId === userId && initializationRef.current.started) {\n return;\n }\n initializationRef.current = { userId, started: true };\n\n const init = async () => {\n // Use URL thread ID as preferred if available\n const urlPreferredThread = isUrlSyncEnabled ? urlState.threadId : undefined;\n const preferredThreadId = await fetchAndSetThreadsState(userId, urlPreferredThread);\n if (preferredThreadId) {\n await loadThreadMessages(preferredThreadId);\n } else if (bootstrap) {\n await bootstrapConversation(userId);\n }\n };\n init();\n } else {\n initializationRef.current = { userId: null, started: false };\n reset();\n }\n // urlState.threadId intentionally excluded: only needed on first init (captured\n // by the lazy initializer in useUrlState). Including it would re-trigger the\n // effect when the thread-sync effect writes back to the URL.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [userId, fetchAndSetThreadsState, loadThreadMessages, bootstrapConversation, reset, bootstrap, isUrlSyncEnabled]);\n\n // Sync currentThreadExternalId to URL when it changes\n useEffect(() => {\n if (!isUrlSyncEnabled) return;\n // Only sync after initial load is complete\n if (!initializationRef.current.started) return;\n \n setUrlThreadId(currentThreadExternalId);\n }, [currentThreadExternalId, isUrlSyncEnabled, setUrlThreadId]);\n\n // Sync metadata map effects\n useEffect(() => {\n if (!currentThreadId) return;\n const metadata = threadMetadataMap[currentThreadId];\n if (!metadata) return;\n\n if (metadata.userContext && typeof metadata.userContext === 'object') {\n setUserContextSeed((prev) => ({ ...prev, ...(metadata.userContext as Partial<ChatUserContext>) }));\n }\n }, [currentThreadId, threadMetadataMap]);\n\n return {\n messages: messages.map(toPublicChatMessage),\n isMessagesLoading,\n isLoadingOlderMessages,\n messagePageInfo,\n threads,\n currentThreadId,\n isStreaming,\n specialState,\n clearSpecialState,\n userContextSeed,\n sendMessage: handleSendMessage,\n createThread: handleCreateThread,\n selectThread: handleSelectThread,\n renameThread: handleRenameThread,\n archiveThread: handleArchiveThread,\n deleteThread: handleDeleteThread,\n stopGeneration: handleStop,\n fetchAndSetThreadsState,\n loadThreadMessages,\n loadOlderMessages,\n reset,\n };\n}\n","import type { AgentOption, MediaAttachment } from \"@copilotz/chat-ui\";\n\nconst rawBaseValue = import.meta.env?.VITE_API_URL;\nconst rawBase = typeof rawBaseValue === \"string\" && rawBaseValue.length > 0\n ? rawBaseValue\n : \"/api\";\nconst normalizedBase = rawBase.replace(/\\/$/, \"\");\nconst API_BASE =\n normalizedBase.startsWith(\"http\") || normalizedBase.startsWith(\"/\")\n ? normalizedBase\n : `/${normalizedBase}`;\n\nexport const apiUrl = (path: string) => `${API_BASE}${path}`;\nexport const apiUrlObject = (path: string) => new URL(apiUrl(path), window.location.origin);\n\nconst runtimeProcess: typeof process | undefined =\n typeof process !== \"undefined\" ? process : undefined;\n\nconst API_KEY = (() => {\n const env =\n (import.meta as { env?: Record<string, string | undefined> }).env ?? {};\n const candidates = [\n env.VITE_API_KEY,\n env.VITE_COPILOTZ_API_KEY,\n runtimeProcess?.env?.COPILOTZ_API_KEY,\n runtimeProcess?.env?.API_KEY,\n ];\n return candidates.find((value) =>\n typeof value === \"string\" && value.length > 0\n );\n})();\n\nexport type RequestHeadersProvider = () =>\n | Record<string, string>\n | Promise<Record<string, string>>;\n\nexport const withAuthHeaders = async (\n headers: Record<string, string> = {},\n getRequestHeaders?: RequestHeadersProvider,\n): Promise<Record<string, string>> => {\n const providedHeaders = getRequestHeaders\n ? await getRequestHeaders()\n : undefined;\n if (providedHeaders && Object.keys(providedHeaders).length > 0) {\n return { ...headers, ...providedHeaders };\n }\n if (API_KEY) {\n return { ...headers, Authorization: `Bearer ${API_KEY}` };\n }\n return headers;\n};\n\ntype RestThread = {\n id: string;\n name?: string | null;\n externalId?: string | null;\n description?: string | null;\n participants?: string[] | null;\n status?: string | null;\n metadata?: Record<string, unknown> | null;\n createdAt?: string;\n updatedAt?: string;\n};\n\ntype AgentApiItem = {\n id: string;\n name: string;\n description?: string | null;\n};\n\ntype RestMessage = {\n id: string;\n threadId: string;\n senderId?: string | null;\n senderType: string;\n senderUserId?: string | null;\n content?: string | null;\n reasoning?: string | null;\n metadata?: Record<string, unknown> | null;\n toolCalls?: Array<Record<string, unknown>> | null;\n createdAt?: string;\n updatedAt?: string;\n};\n\nexport type RestMessagePageInfo = {\n hasMoreBefore: boolean;\n oldestMessageId: string | null;\n newestMessageId: string | null;\n};\n\nexport type RestMessagePage = {\n data: RestMessage[];\n pageInfo: RestMessagePageInfo;\n};\n\nconst buildFallbackPageInfo = (\n data: RestMessage[],\n): RestMessagePageInfo => ({\n hasMoreBefore: false,\n oldestMessageId: data[0]?.id ?? null,\n newestMessageId: data[data.length - 1]?.id ?? null,\n});\n\ntype MessageSenderType = \"agent\" | \"user\" | \"tool\" | \"system\";\n\ntype MessageContent =\n | string\n | Array<\n | { type: \"text\"; text: string }\n | {\n type: \"image\";\n url?: string;\n dataBase64?: string;\n mimeType?: string;\n alt?: string;\n }\n | {\n type: \"audio\";\n url?: string;\n dataBase64?: string;\n mimeType?: string;\n transcript?: string;\n }\n | {\n type: \"file\";\n url?: string;\n dataBase64?: string;\n mimeType?: string;\n name?: string;\n }\n | { type: \"json\"; value: unknown }\n >;\n\ntype MessageToolCall = {\n id?: string | null;\n name: string;\n args: Record<string, unknown>;\n};\n\ntype MessageThread = {\n id?: string | null;\n name?: string | null;\n description?: string | null;\n externalId?: string | null;\n participants?: string[] | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype MessageSender = {\n id?: string | null;\n externalId?: string | null;\n type: MessageSenderType;\n name?: string | null;\n identifierType?: \"id\" | \"name\" | \"email\" | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype MessagePayload = {\n content: MessageContent;\n sender: MessageSender;\n thread?: MessageThread | null;\n toolCalls?: MessageToolCall[] | null;\n target?: string | null;\n targetQueue?: string[] | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype StreamCallbacks = {\n onToken?: (\n token: string,\n isComplete: boolean,\n raw?: any,\n options?: { isReasoning?: boolean },\n ) => void;\n onMessageEvent?: (payload: any) => void;\n onAssetEvent?: (payload: any) => void;\n signal?: AbortSignal;\n};\n\ntype RunOptions = {\n threadId?: string;\n threadExternalId?: string;\n content: string;\n user: {\n externalId: string;\n name?: string;\n email?: string;\n metadata?: Record<string, unknown>;\n };\n attachments?: MediaAttachment[];\n metadata?: Record<string, unknown>;\n threadMetadata?: Record<string, unknown>;\n toolCalls?: Array<\n { name: string; args: Record<string, unknown>; id?: string }\n >;\n selectedAgent?: string | null;\n /** Agent participants in the thread (multi-agent). Overrides selectedAgent for thread.participants when provided. */\n participants?: string[] | null;\n /** Explicit target agent for this message (who should respond). Maps to MessagePayload.target. */\n targetAgent?: string | null;\n getRequestHeaders?: RequestHeadersProvider;\n} & StreamCallbacks;\n\nexport type CopilotzStreamResult = {\n text: string;\n messages: any[];\n media: Record<string, string> | null;\n};\n\nexport class CopilotzRequestError extends Error {\n status: number;\n code?: string;\n details?: unknown;\n\n constructor(\n message: string,\n options: { status: number; code?: string; details?: unknown },\n ) {\n super(message);\n this.name = \"CopilotzRequestError\";\n this.status = options.status;\n this.code = options.code;\n this.details = options.details;\n }\n}\n\nconst SSE_LINE_BREAK = \"\\n\\n\";\n\nconst appendChunk = (buffer: string, chunk: string): string => {\n if (!buffer) return chunk;\n if (!chunk) return buffer;\n if (chunk.startsWith(buffer)) return chunk;\n if (buffer.startsWith(chunk)) return buffer;\n const maxOverlap = Math.min(buffer.length, chunk.length);\n for (let i = maxOverlap; i > 0; i--) {\n if (buffer.endsWith(chunk.slice(0, i))) {\n return buffer + chunk.slice(i);\n }\n }\n return buffer + chunk;\n};\n\nconst parseErrorText = (rawText: string): unknown => {\n if (!rawText) return null;\n try {\n return JSON.parse(rawText);\n } catch {\n return null;\n }\n};\n\nconst toAttachmentPayload = (attachments?: MediaAttachment[]) => {\n if (!attachments || attachments.length === 0) return undefined;\n return attachments.map((att) => {\n const base = {\n kind: att.kind,\n dataUrl: att.dataUrl,\n mimeType: att.mimeType,\n fileName: att.fileName,\n };\n if (att.kind === \"audio\" || att.kind === \"video\") {\n return {\n ...base,\n durationMs: att.durationMs,\n ...(att.kind === \"video\" && \"poster\" in att\n ? { poster: att.poster }\n : {}),\n };\n }\n return base;\n });\n};\n\n// --- Audio helpers: convert browser-recorded WebM/Opus to WAV (16-bit PCM) ---\nconst base64FromUint8 = (bytes: Uint8Array): string => {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let i = 0; i < bytes.length; i += chunkSize) {\n const chunk = bytes.subarray(i, i + chunkSize);\n binary += String.fromCharCode.apply(null, Array.from(chunk));\n }\n // btoa is available in browsers\n return btoa(binary);\n};\n\nconst parseDataUrl = (\n dataUrl: string,\n): { mime: string; base64: string } | null => {\n const match = dataUrl.match(/^data:(.+?);base64,(.+)$/s);\n if (!match) return null;\n return { mime: match[1], base64: match[2] };\n};\n\nconst dataUrlToArrayBuffer = (dataUrl: string): ArrayBuffer => {\n const parsed = parseDataUrl(dataUrl);\n if (!parsed) return new ArrayBuffer(0);\n const binaryString = atob(parsed.base64);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n};\n\nconst encodeWav16BitPCM = (audioBuffer: AudioBuffer): Uint8Array => {\n const numChannels = audioBuffer.numberOfChannels;\n const sampleRate = audioBuffer.sampleRate;\n const numFrames = audioBuffer.length;\n const bytesPerSample = 2; // 16-bit\n const dataSize = numFrames * numChannels * bytesPerSample;\n const buffer = new ArrayBuffer(44 + dataSize);\n const view = new DataView(buffer);\n\n // RIFF header\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n let offset = 0;\n writeString(offset, \"RIFF\");\n offset += 4;\n view.setUint32(offset, 36 + dataSize, true);\n offset += 4;\n writeString(offset, \"WAVE\");\n offset += 4;\n\n // fmt subchunk\n writeString(offset, \"fmt \");\n offset += 4;\n view.setUint32(offset, 16, true);\n offset += 4; // Subchunk1Size (16 for PCM)\n view.setUint16(offset, 1, true);\n offset += 2; // AudioFormat (1 = PCM)\n view.setUint16(offset, numChannels, true);\n offset += 2; // NumChannels\n view.setUint32(offset, sampleRate, true);\n offset += 4; // SampleRate\n view.setUint32(offset, sampleRate * numChannels * bytesPerSample, true);\n offset += 4; // ByteRate\n view.setUint16(offset, numChannels * bytesPerSample, true);\n offset += 2; // BlockAlign\n view.setUint16(offset, 16, true);\n offset += 2; // BitsPerSample\n\n // data subchunk\n writeString(offset, \"data\");\n offset += 4;\n view.setUint32(offset, dataSize, true);\n offset += 4;\n\n // Interleave channels and write PCM samples\n const channelData: Float32Array[] = [];\n for (let ch = 0; ch < numChannels; ch++) {\n channelData.push(audioBuffer.getChannelData(ch));\n }\n\n let idx = 0;\n for (let i = 0; i < numFrames; i++) {\n for (let ch = 0; ch < numChannels; ch++) {\n let sample = channelData[ch][i];\n // Clamp\n sample = Math.max(-1, Math.min(1, sample));\n // Convert to 16-bit PCM\n const s = sample < 0 ? sample * 0x8000 : sample * 0x7FFF;\n view.setInt16(offset + idx, s, true);\n idx += 2;\n }\n }\n\n return new Uint8Array(buffer);\n};\n\nconst convertAudioDataUrlToWavBase64 = async (\n dataUrl: string,\n): Promise<string | null> => {\n try {\n const ab = dataUrlToArrayBuffer(dataUrl);\n const ctx =\n new (window.AudioContext || (window as any).webkitAudioContext)();\n const audioBuffer = await ctx.decodeAudioData(ab.slice(0)); // ensure detached buffer\n // Optionally downsample here if desired; we'll keep source sampleRate.\n const wavBytes = encodeWav16BitPCM(audioBuffer);\n return base64FromUint8(wavBytes);\n } catch (_err) {\n return null;\n }\n};\n\nexport async function runCopilotzStream(\n options: RunOptions,\n): Promise<CopilotzStreamResult> {\n const {\n threadId,\n threadExternalId,\n content,\n user,\n attachments,\n metadata,\n threadMetadata,\n toolCalls,\n selectedAgent,\n participants,\n targetAgent,\n getRequestHeaders,\n onToken,\n onMessageEvent,\n onAssetEvent,\n signal,\n } = options;\n\n const controller = new AbortController();\n if (signal) {\n signal.addEventListener(\"abort\", () => controller.abort(signal.reason), {\n once: true,\n });\n }\n\n // Audio attachments are sent as content parts and also mirrored in metadata\n // so the persisted message can render the same media after reload.\n const audioAttachments = attachments?.filter((att) => att.kind === \"audio\") ??\n [];\n const attachmentPayload = toAttachmentPayload(attachments);\n\n const normalizedToolCalls = toolCalls?.map<MessageToolCall>((call) => ({\n id: call.id ?? crypto.randomUUID(),\n name: call.name,\n args: call.args ?? {},\n })) ?? [];\n\n const metadataToolCalls = normalizedToolCalls.length > 0\n ? normalizedToolCalls.map((tc) => ({\n id: tc.id ?? undefined,\n name: tc.name,\n args: JSON.stringify(tc.args ?? {}),\n }))\n : undefined;\n\n const baseMetadata = {\n ...(metadata ?? {}),\n ...(attachmentPayload ? { attachments: attachmentPayload } : {}),\n ...(metadataToolCalls ? { toolCalls: metadataToolCalls } : {}),\n userExternalId: user.externalId,\n } as Record<string, unknown>;\n\n const messageMetadata = Object.keys(baseMetadata).length > 0\n ? baseMetadata\n : undefined;\n\n const senderMetadata = {\n ...(user.metadata ?? {}),\n ...(user.email ? { email: user.email } : {}),\n } as Record<string, unknown>;\n\n const mergedThreadMetadata = {\n ...(threadMetadata ?? {}),\n } as Record<string, unknown>;\n\n if (mergedThreadMetadata.userExternalId === undefined) {\n mergedThreadMetadata.userExternalId = user.externalId;\n }\n\n // Extract name from threadMetadata if present\n const threadName = (mergedThreadMetadata.name as string) ?? null;\n // Remove name from metadata since it's a top-level field\n const { name: _threadName, ...restThreadMetadata } = mergedThreadMetadata;\n\n // Resolve thread participants: explicit participants list > selectedAgent fallback > \"assistant\"\n const resolvedParticipants: string[] =\n Array.isArray(participants) && participants.length > 0\n ? participants\n : [selectedAgent || \"assistant\"];\n\n const resolvedTarget = targetAgent?.trim() || null;\n const toolCallSenderId = selectedAgent ||\n resolvedParticipants[0] || \"assistant\";\n\n const threadPayload: MessageThread | undefined =\n (threadId || threadExternalId || threadName ||\n Object.keys(restThreadMetadata).length > 0)\n ? {\n id: threadId ?? null,\n externalId: threadExternalId ?? null,\n name: threadName,\n participants: resolvedParticipants,\n metadata: Object.keys(restThreadMetadata).length > 0\n ? restThreadMetadata\n : null,\n }\n : undefined;\n\n // Prepare audio parts (convert to WAV when needed)\n const preparedAudioParts: Array<\n {\n type: \"audio\";\n dataBase64?: string;\n url?: string;\n mimeType?: string;\n transcript?: string;\n }\n > = [];\n for (const audioAtt of audioAttachments) {\n if (!audioAtt.dataUrl) continue;\n const parsed = parseDataUrl(audioAtt.dataUrl);\n if (\n parsed &&\n (parsed.mime.includes(\"wav\") || parsed.mime.includes(\"mp3\") ||\n parsed.mime.includes(\"mpeg\"))\n ) {\n preparedAudioParts.push({\n type: \"audio\",\n dataBase64: parsed.base64,\n mimeType: parsed.mime.includes(\"wav\") ? \"audio/wav\" : \"audio/mp3\",\n });\n continue;\n }\n // Convert other formats (e.g., audio/webm) to WAV\n const wavBase64 = await convertAudioDataUrlToWavBase64(audioAtt.dataUrl);\n if (wavBase64) {\n preparedAudioParts.push({\n type: \"audio\",\n dataBase64: wavBase64,\n mimeType: \"audio/wav\",\n });\n } else {\n // Fallback: send as URL (may fail at provider side, but do not block)\n preparedAudioParts.push({\n type: \"audio\",\n url: audioAtt.dataUrl,\n mimeType: audioAtt.mimeType || \"audio/webm\",\n });\n }\n }\n\n // Build content array: include text and prepared audio parts\n const contentParts: MessageContent = (() => {\n const parts: Array<\n | { type: \"text\"; text: string }\n | {\n type: \"audio\";\n url?: string;\n dataBase64?: string;\n mimeType?: string;\n transcript?: string;\n }\n > = [];\n const text = (typeof content === \"string\" && content.trim().length > 0)\n ? content\n : \"\";\n parts.push({ type: \"text\", text });\n for (const p of preparedAudioParts) parts.push(p);\n if (parts.length === 1 && parts[0].type === \"text\") return parts[0].text;\n return parts;\n })();\n\n const payload: MessagePayload = {\n content: contentParts,\n sender: {\n type: normalizedToolCalls.length > 0 ? \"agent\" : \"user\",\n externalId: normalizedToolCalls.length > 0 ? toolCallSenderId : user.externalId,\n id: normalizedToolCalls.length > 0 ? toolCallSenderId : undefined,\n name: normalizedToolCalls.length > 0 ? toolCallSenderId : (user.name ?? null),\n metadata: Object.keys(senderMetadata).length > 0 ? senderMetadata : null,\n },\n metadata: messageMetadata ?? null,\n thread: threadPayload ?? null,\n toolCalls: normalizedToolCalls.length > 0 ? normalizedToolCalls : null,\n target: resolvedTarget,\n targetQueue: null,\n };\n\n const response = await fetch(apiUrl(\"/v1/providers/web\"), {\n method: \"POST\",\n headers: await withAuthHeaders({\n \"Content-Type\": \"application/json\",\n }, getRequestHeaders),\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n if (!response.ok || !response.body) {\n const errorText = await response.text().catch(() => response.statusText);\n const parsed = parseErrorText(errorText);\n const details = parsed && typeof parsed === \"object\" ? parsed : undefined;\n const detailsRecord = details as Record<string, unknown> | undefined;\n const message =\n (typeof detailsRecord?.message === \"string\" && detailsRecord.message) ||\n (typeof detailsRecord?.error === \"string\" && detailsRecord.error) ||\n errorText ||\n response.statusText ||\n \"Failed to run Copilotz agent\";\n const code = typeof detailsRecord?.code === \"string\"\n ? detailsRecord.code\n : (typeof detailsRecord?.error === \"string\" &&\n detailsRecord.error !== message\n ? detailsRecord.error\n : undefined);\n\n throw new CopilotzRequestError(message, {\n status: response.status,\n code,\n details,\n });\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n let aggregatedText = \"\";\n let aggregatedReasoning = \"\";\n let lastTokenWasReasoning = false;\n let hadNonReasoningContent = false;\n const collectedMessages: any[] = [];\n let collectedMedia: Record<string, string> | null = null;\n\n const processEvent = (eventChunk: string) => {\n if (!eventChunk.trim()) return;\n const lines = eventChunk.split(\"\\n\");\n let eventType = \"message\";\n let dataRaw = \"\";\n for (const line of lines) {\n if (line.startsWith(\"event:\")) {\n eventType = line.slice(6).trim();\n } else if (line.startsWith(\"data:\")) {\n dataRaw += line.slice(5).trim();\n }\n }\n\n if (!dataRaw) return;\n\n let payload: any;\n try {\n payload = JSON.parse(dataRaw);\n } catch (error) {\n console.warn(\n \"copilotzService: failed to parse SSE payload\",\n error,\n dataRaw,\n );\n return;\n }\n\n switch (eventType) {\n case \"TOKEN\": {\n const inner = payload?.payload ?? payload;\n const chunk = typeof inner?.token === \"string\" ? inner.token : \"\";\n const isReasoning = Boolean(inner?.isReasoning);\n if (isReasoning && !lastTokenWasReasoning && hadNonReasoningContent) {\n aggregatedReasoning = \"\";\n aggregatedText = \"\";\n hadNonReasoningContent = false;\n }\n lastTokenWasReasoning = isReasoning;\n if (!isReasoning) hadNonReasoningContent = true;\n if (chunk) {\n if (isReasoning) {\n aggregatedReasoning = appendChunk(aggregatedReasoning, chunk);\n } else {\n aggregatedText = appendChunk(aggregatedText, chunk);\n }\n }\n const isComplete = Boolean(inner?.isComplete);\n if (chunk || isComplete) {\n const tokenText = isReasoning ? aggregatedReasoning : aggregatedText;\n onToken?.(tokenText, isComplete, payload, { isReasoning });\n }\n break;\n }\n case \"NEW_MESSAGE\": {\n hadNonReasoningContent = true;\n lastTokenWasReasoning = false;\n collectedMessages.push(payload);\n onMessageEvent?.(payload);\n break;\n }\n case \"TOOL_CALL\": {\n hadNonReasoningContent = true;\n lastTokenWasReasoning = false;\n onMessageEvent?.(payload);\n break;\n }\n case \"TOOL_RESULT\":\n case \"LLM_RESULT\": {\n hadNonReasoningContent = true;\n lastTokenWasReasoning = false;\n onMessageEvent?.(payload);\n break;\n }\n case \"ASSET_CREATED\": {\n const assetPayload =\n (payload && typeof payload === \"object\" && \"payload\" in payload)\n ? (payload as { payload?: any }).payload\n : payload;\n // Convert ASSET_CREATED to media format for backward compatibility\n if (assetPayload?.dataUrl) {\n collectedMedia = {\n [assetPayload.assetId || \"0\"]: assetPayload.dataUrl,\n };\n }\n // Call the asset event handler\n onAssetEvent?.(assetPayload);\n break;\n }\n case \"ERROR\":\n throw new Error(payload?.error || \"Copilotz stream error\");\n default: {\n // Forward non-contract/custom events without turning them into\n // lifecycle primitives implicitly.\n const hasEnvelope =\n payload && typeof payload === \"object\" && \"type\" in payload;\n if (hasEnvelope) {\n onMessageEvent?.(payload);\n } else {\n onMessageEvent?.({ type: eventType, payload });\n }\n break;\n }\n }\n };\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n if (buffer.includes(\"\\r\")) {\n buffer = buffer.replace(/\\r/g, \"\");\n }\n\n let eventBoundary = buffer.indexOf(SSE_LINE_BREAK);\n while (eventBoundary >= 0) {\n const chunk = buffer.slice(0, eventBoundary);\n buffer = buffer.slice(eventBoundary + SSE_LINE_BREAK.length);\n processEvent(chunk);\n eventBoundary = buffer.indexOf(SSE_LINE_BREAK);\n }\n }\n\n if (buffer.length > 0) {\n processEvent(buffer);\n }\n\n return {\n text: aggregatedText,\n messages: collectedMessages,\n media: collectedMedia,\n };\n}\n\nexport async function fetchThreads(\n userId: string,\n getRequestHeaders?: RequestHeadersProvider,\n) {\n const params = new URLSearchParams();\n params.set(\"participantId\", userId);\n params.set(\"status\", \"all\");\n params.set(\"order\", \"desc\");\n\n const res = await fetch(apiUrl(`/v1/threads?${params.toString()}`), {\n headers: await withAuthHeaders(\n { Accept: \"application/json\" },\n getRequestHeaders,\n ),\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => res.statusText);\n throw new Error(errorText || `Failed to load threads (${res.status})`);\n }\n\n const { data } = await res.json();\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data as RestThread[];\n}\n\nexport async function fetchAgents(\n getRequestHeaders?: RequestHeadersProvider,\n): Promise<AgentOption[]> {\n const response = await fetch(apiUrl(\"/v1/agents\"), {\n method: \"GET\",\n headers: await withAuthHeaders(\n { Accept: \"application/json\" },\n getRequestHeaders,\n ),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n throw new Error(\n errorText || `Failed to fetch agents (${response.status})`,\n );\n }\n\n const payload = await response.json() as { data?: AgentApiItem[] };\n const data = Array.isArray(payload?.data) ? payload.data : [];\n\n return data.map((agent) => ({\n id: agent.id,\n name: agent.name,\n description: agent.description ?? undefined,\n }));\n}\n\nexport async function fetchThreadMessages(\n threadId: string,\n getRequestHeaders?: RequestHeadersProvider,\n) {\n const page = await fetchThreadMessagesPage(threadId, undefined, getRequestHeaders);\n return page.data;\n}\n\nexport async function fetchThreadMessagesPage(\n threadId: string,\n options?: {\n limit?: number;\n before?: string | null;\n },\n getRequestHeaders?: RequestHeadersProvider,\n): Promise<RestMessagePage> {\n const params = new URLSearchParams();\n params.set(\"limit\", String(options?.limit ?? 50));\n if (options?.before) {\n params.set(\"before\", options.before);\n }\n\n const res = await fetch(\n apiUrl(`/v1/threads/${threadId}/messages?${params.toString()}`),\n {\n headers: await withAuthHeaders(\n { Accept: \"application/json\" },\n getRequestHeaders,\n ),\n },\n );\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => res.statusText);\n throw new Error(\n errorText || `Failed to load thread messages (${res.status})`,\n );\n }\n\n const payload = await res.json();\n if (Array.isArray(payload)) {\n return {\n data: payload as RestMessage[],\n pageInfo: buildFallbackPageInfo(payload as RestMessage[]),\n };\n }\n if (Array.isArray(payload?.data)) {\n const data = payload.data as RestMessage[];\n const rawPageInfo = payload?.pageInfo;\n return {\n data,\n pageInfo: {\n hasMoreBefore: rawPageInfo?.hasMoreBefore === true,\n oldestMessageId: typeof rawPageInfo?.oldestMessageId === \"string\"\n ? rawPageInfo.oldestMessageId\n : data[0]?.id ?? null,\n newestMessageId: typeof rawPageInfo?.newestMessageId === \"string\"\n ? rawPageInfo.newestMessageId\n : data[data.length - 1]?.id ?? null,\n },\n };\n }\n return {\n data: [],\n pageInfo: {\n hasMoreBefore: false,\n oldestMessageId: null,\n newestMessageId: null,\n },\n };\n}\n\nexport async function updateThread(\n threadId: string,\n updates: Partial<RestThread>,\n getRequestHeaders?: RequestHeadersProvider,\n) {\n const res = await fetch(apiUrl(`/v1/threads/${threadId}`), {\n method: \"PATCH\",\n headers: await withAuthHeaders({\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n }, getRequestHeaders),\n body: JSON.stringify(updates),\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => res.statusText);\n throw new Error(errorText || `Failed to update thread (${res.status})`);\n }\n\n const data = await res.json();\n return data?.data ?? data?.body ?? data;\n}\n\nexport async function deleteThread(\n threadId: string,\n getRequestHeaders?: RequestHeadersProvider,\n) {\n const res = await fetch(apiUrl(`/v1/threads/${threadId}`), {\n method: \"DELETE\",\n headers: await withAuthHeaders(\n { Accept: \"application/json\" },\n getRequestHeaders,\n ),\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => res.statusText);\n throw new Error(errorText || `Failed to delete thread (${res.status})`);\n }\n\n return true;\n}\n\nexport const copilotzService = {\n apiUrl,\n apiUrlObject,\n withAuthHeaders,\n fetchAgents,\n runCopilotzStream,\n fetchThreads,\n fetchThreadMessages,\n updateThread,\n deleteThread,\n};\n","// Minimal API client for Copilotz assets\n\ntype FetchAssetResult = {\n assetId: string;\n ref: string;\n dataUrl?: string;\n base64?: string;\n mime?: string;\n error?: string;\n};\n\nconst rawBaseValue = (import.meta as { env?: Record<string, string | undefined> }).env?.VITE_API_URL;\nconst rawBase = typeof rawBaseValue === 'string' && rawBaseValue.length > 0 ? rawBaseValue : '/api';\nconst normalizedBase = rawBase.replace(/\\/$/, '');\nconst API_BASE = normalizedBase.startsWith('http') || normalizedBase.startsWith('/')\n ? normalizedBase\n : `/${normalizedBase}`;\n\nconst apiUrl = (path: string) => `${API_BASE}${path}`;\n\nconst extractAssetId = (refOrId: string) =>\n refOrId.startsWith('asset://') ? refOrId.slice('asset://'.length) : refOrId;\n\nexport async function getAssetDataUrl(refOrId: string): Promise<{ dataUrl: string; mime?: string; assetId: string }> {\n const id = extractAssetId(refOrId);\n const res = await fetch(apiUrl(`/v1/assets/${encodeURIComponent(id)}?format=dataUrl`), {\n method: 'GET',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) {\n const text = await res.text().catch(() => res.statusText);\n throw new Error(text || `Failed to fetch asset ${refOrId}`);\n }\n const body = (await res.json()) as { data?: FetchAssetResult } | FetchAssetResult;\n // Unified response envelope: `{ data }`. Tolerate legacy top-level shape.\n const data = (body as { data?: FetchAssetResult })?.data ?? (body as FetchAssetResult);\n if (!data?.dataUrl) {\n throw new Error(data?.error || `Asset ${refOrId} has no dataUrl`);\n }\n return { dataUrl: data.dataUrl, mime: data.mime, assetId: data.assetId };\n}\n\n// Resolve assets in messages by replacing metadata.attachments[].assetRef with dataUrl\ntype WithMetadata = {\n metadata?: Record<string, unknown> | null;\n};\n\nexport async function resolveAssetsInMessages<T extends WithMetadata>(messages: T[]): Promise<T[]> {\n // Deduplicate in-flight fetches so the same assetRef is resolved only once.\n const inFlightByRef = new Map<string, Promise<{ dataUrl: string; mime?: string; assetId: string }>>();\n\n const resolveAssetRef = (assetRef: string) => {\n if (!inFlightByRef.has(assetRef)) {\n inFlightByRef.set(assetRef, getAssetDataUrl(assetRef));\n }\n return inFlightByRef.get(assetRef)!;\n };\n\n return Promise.all(messages.map(async (msg) => {\n const meta = (msg.metadata ?? undefined) as Record<string, unknown> | undefined;\n const attachments = Array.isArray(meta?.attachments)\n ? (meta!.attachments as Array<Record<string, unknown>>)\n : undefined;\n\n if (!attachments || attachments.length === 0) {\n return msg;\n }\n\n const newAttachments = await Promise.all(attachments.map(async (att) => {\n const assetRef = typeof att?.assetRef === 'string' ? (att.assetRef as string) : undefined;\n if (!assetRef) return att;\n\n try {\n const { dataUrl, mime } = await resolveAssetRef(assetRef);\n const kind = typeof att.kind === 'string' ? (att.kind as string) : 'image';\n return {\n kind,\n dataUrl,\n mimeType: typeof att.mimeType === 'string' ? att.mimeType : (mime ?? undefined),\n } as Record<string, unknown>;\n } catch {\n // If fetching fails, keep original so UI can ignore gracefully\n return att;\n }\n }));\n\n const newMeta = { ...(meta ?? {}), attachments: newAttachments } as Record<string, unknown>;\n return { ...msg, metadata: newMeta };\n }));\n}\n\n","import { useState, useEffect, useCallback, useRef } from 'react';\n\n/**\n * Configuration for URL parameter names\n */\nexport interface UrlParamsConfig {\n /** URL param name for thread ID (default: 'thread') */\n thread?: string;\n /** URL param name for agent ID (default: 'agent') */\n agent?: string;\n /** URL param name for initial prompt (default: 'prompt') */\n prompt?: string;\n}\n\n/**\n * URL sync behavior configuration\n */\nexport interface UrlSyncConfig {\n /** Enable/disable URL sync (default: true) */\n enabled?: boolean;\n /** \n * How to update the URL when state changes:\n * - 'push': Creates browser history entries (back button works)\n * - 'replace': Updates URL without history entries (default)\n * - 'read-only': Only reads from URL, never writes\n */\n mode?: 'push' | 'replace' | 'read-only';\n /** Custom parameter names */\n params?: UrlParamsConfig;\n /**\n * Behavior for the prompt parameter:\n * - 'prefill': Pre-fills the input field (default)\n * - 'auto-send': Automatically sends the message on load\n */\n promptBehavior?: 'prefill' | 'auto-send';\n /**\n * Whether to clear the prompt param from URL after reading\n * Prevents re-sending on refresh (default: true)\n */\n clearPromptAfterRead?: boolean;\n}\n\n/**\n * State values parsed from URL\n */\nexport interface UrlState {\n threadId: string | null;\n agentId: string | null;\n prompt: string | null;\n}\n\n/**\n * Return type of useUrlState hook\n */\nexport interface UseUrlStateReturn {\n /** Current state parsed from URL */\n state: UrlState;\n /** Update thread ID in URL */\n setThreadId: (threadId: string | null) => void;\n /** Update agent ID in URL */\n setAgentId: (agentId: string | null) => void;\n /** Clear prompt from URL (call after consuming it) */\n clearPrompt: () => void;\n /** Whether URL sync is enabled */\n isEnabled: boolean;\n}\n\nconst DEFAULT_PARAMS: Required<UrlParamsConfig> = {\n thread: 'thread',\n agent: 'agent',\n prompt: 'prompt',\n};\n\n/**\n * Check if we're in a browser environment\n */\nconst isBrowser = typeof globalThis !== 'undefined' && typeof globalThis.location !== 'undefined';\n\n/**\n * Get current URL search params (SSR-safe)\n */\nconst getSearchParams = (): URLSearchParams => {\n if (!isBrowser) return new URLSearchParams();\n return new URLSearchParams(globalThis.location.search);\n};\n\n/**\n * Update URL with new search params\n */\nconst updateUrl = (params: URLSearchParams, mode: 'push' | 'replace') => {\n if (!isBrowser) return;\n \n const url = new URL(globalThis.location.href);\n url.search = params.toString();\n \n if (mode === 'push') {\n globalThis.history.pushState({}, '', url.toString());\n } else {\n globalThis.history.replaceState({}, '', url.toString());\n }\n};\n\n/**\n * Hook to manage chat state persistence via URL parameters.\n */\nexport function useUrlState(config: UrlSyncConfig = {}): UseUrlStateReturn {\n const {\n enabled = true,\n mode = 'replace',\n params: userParams = {},\n clearPromptAfterRead = true,\n } = config;\n\n const params = { ...DEFAULT_PARAMS, ...userParams };\n const isReadOnly = mode === 'read-only';\n const updateMode = mode === 'read-only' ? 'replace' : mode;\n\n const initialReadDone = useRef(false);\n const promptCleared = useRef(false);\n\n const parseUrlState = useCallback((): UrlState => {\n if (!enabled || !isBrowser) {\n return { threadId: null, agentId: null, prompt: null };\n }\n\n const searchParams = getSearchParams();\n \n return {\n threadId: searchParams.get(params.thread) || null,\n agentId: searchParams.get(params.agent) || null,\n prompt: promptCleared.current ? null : (searchParams.get(params.prompt) || null),\n };\n }, [enabled, params.thread, params.agent, params.prompt]);\n\n const [state, setState] = useState<UrlState>(parseUrlState);\n\n // Read URL state on mount and handle popstate (back/forward navigation)\n useEffect(() => {\n if (!enabled || !isBrowser) return;\n\n if (!initialReadDone.current) {\n const initialState = parseUrlState();\n setState(initialState);\n initialReadDone.current = true;\n\n if (clearPromptAfterRead && initialState.prompt && !isReadOnly) {\n const searchParams = getSearchParams();\n searchParams.delete(params.prompt);\n updateUrl(searchParams, 'replace');\n promptCleared.current = true;\n }\n }\n\n const handlePopState = () => {\n setState(parseUrlState());\n };\n\n globalThis.addEventListener('popstate', handlePopState);\n return () => globalThis.removeEventListener('popstate', handlePopState);\n }, [enabled, parseUrlState, clearPromptAfterRead, params.prompt, isReadOnly]);\n\n const setThreadId = useCallback((threadId: string | null) => {\n if (!enabled || isReadOnly || !isBrowser) return;\n\n const searchParams = getSearchParams();\n if (threadId) {\n searchParams.set(params.thread, threadId);\n } else {\n searchParams.delete(params.thread);\n }\n updateUrl(searchParams, updateMode);\n setState((prev) => ({ ...prev, threadId }));\n }, [enabled, isReadOnly, params.thread, updateMode]);\n\n const setAgentId = useCallback((agentId: string | null) => {\n if (!enabled || isReadOnly || !isBrowser) return;\n\n const searchParams = getSearchParams();\n if (agentId) {\n searchParams.set(params.agent, agentId);\n } else {\n searchParams.delete(params.agent);\n }\n updateUrl(searchParams, updateMode);\n setState((prev) => ({ ...prev, agentId }));\n }, [enabled, isReadOnly, params.agent, updateMode]);\n\n const clearPrompt = useCallback(() => {\n if (!enabled || isReadOnly || !isBrowser) return;\n\n const searchParams = getSearchParams();\n searchParams.delete(params.prompt);\n updateUrl(searchParams, 'replace');\n promptCleared.current = true;\n setState((prev) => ({ ...prev, prompt: null }));\n }, [enabled, isReadOnly, params.prompt]);\n\n return {\n state,\n setThreadId,\n setAgentId,\n clearPrompt,\n isEnabled: enabled,\n };\n}\n","import type { ChatMessage, ToolCall } from '@copilotz/chat-ui';\n\nexport interface InternalChatMessage extends ChatMessage {\n _activityReasoning?: string;\n _activityReasoningStreaming?: boolean;\n _activityToolCalls?: ToolCall[];\n}\n\ntype MessageActivity = NonNullable<ChatMessage['activity']>;\n\nconst isToolCallActive = (toolCall: ToolCall): boolean => (\n toolCall.status === 'pending' || toolCall.status === 'running'\n);\n\nexport const hasVisibleAssistantOutput = (message: InternalChatMessage): boolean => {\n if (message.role !== 'assistant') return false;\n if (typeof message.content === 'string' && message.content.trim().length > 0) return true;\n if (Array.isArray(message.attachments) && message.attachments.length > 0) return true;\n if (Array.isArray(message._activityToolCalls) && message._activityToolCalls.length > 0) return true;\n return false;\n};\n\nexport const buildAssistantActivity = (\n message: Pick<InternalChatMessage, 'content' | 'isStreaming' | '_activityReasoning' | '_activityReasoningStreaming' | '_activityToolCalls'>,\n): MessageActivity | undefined => {\n const toolCalls = Array.isArray(message._activityToolCalls) ? message._activityToolCalls : [];\n const hasReasoning = typeof message._activityReasoning === 'string' && message._activityReasoning.length > 0;\n const hasToolCalls = toolCalls.length > 0;\n const runningTools = toolCalls.filter(isToolCallActive);\n const hasRunningTools = runningTools.length > 0;\n const isStreaming = message.isStreaming === true;\n const isReasoningStreaming = message._activityReasoningStreaming === true;\n const hasContent = typeof message.content === 'string' && message.content.trim().length > 0;\n\n if (!hasReasoning && !hasToolCalls && !isStreaming && !isReasoningStreaming) {\n return undefined;\n }\n\n const isActive = isStreaming || isReasoningStreaming || hasRunningTools;\n const summary = hasRunningTools\n ? {\n kind: 'using_tools' as const,\n ...(runningTools.length === 1 ? { toolName: runningTools[0].name } : {}),\n ...(runningTools.length > 1 ? { toolCount: runningTools.length } : {}),\n }\n : isStreaming && hasToolCalls && !hasContent\n ? {\n kind: 'using_tools' as const,\n ...(toolCalls.length === 1 ? { toolName: toolCalls[0].name } : {}),\n ...(toolCalls.length > 1 ? { toolCount: toolCalls.length } : {}),\n }\n : isReasoningStreaming || (!hasContent && hasReasoning)\n ? { kind: 'thinking' as const }\n : isStreaming && hasContent\n ? { kind: 'preparing_answer' as const }\n : isStreaming\n ? { kind: 'working' as const }\n : hasToolCalls\n ? {\n kind: 'using_tools' as const,\n ...(toolCalls.length === 1 ? { toolName: toolCalls[0].name } : {}),\n ...(toolCalls.length > 1 ? { toolCount: toolCalls.length } : {}),\n }\n : { kind: 'thinking' as const };\n\n return {\n isActive,\n ...(isActive ? {} : { isComplete: true }),\n summary,\n ...(hasReasoning ? { reasoning: message._activityReasoning } : {}),\n ...(hasToolCalls ? { toolCalls } : {}),\n };\n};\n\nexport const syncAssistantActivity = <T extends InternalChatMessage>(message: T): T => {\n if (message.role !== 'assistant') {\n const { _activityReasoning, _activityReasoningStreaming, _activityToolCalls, ...rest } = message;\n return rest as T;\n }\n\n return {\n ...message,\n activity: buildAssistantActivity(message),\n };\n};\n\nexport const toPublicChatMessage = (message: InternalChatMessage): ChatMessage => {\n const { _activityReasoning, _activityReasoningStreaming, _activityToolCalls, ...rest } = syncAssistantActivity(message);\n return rest;\n};\n\nexport const updateAssistantMessageToken = (\n message: InternalChatMessage,\n params: {\n partial: string;\n isReasoning?: boolean;\n agentIdentity?: { senderAgentId?: string; senderName?: string };\n },\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n const next = params.isReasoning\n ? {\n ...message,\n ...params.agentIdentity,\n _activityReasoning: params.partial,\n _activityReasoningStreaming: true,\n isStreaming: true,\n isComplete: false,\n }\n : {\n ...message,\n ...params.agentIdentity,\n content: params.partial,\n _activityReasoningStreaming: false,\n isStreaming: true,\n isComplete: false,\n };\n\n return syncAssistantActivity(next);\n};\n\nexport const appendAssistantToolCall = (\n message: InternalChatMessage,\n toolCall: ToolCall,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n return syncAssistantActivity({\n ...message,\n _activityToolCalls: [\n ...(Array.isArray(message._activityToolCalls) ? message._activityToolCalls : []),\n toolCall,\n ],\n isStreaming: true,\n isComplete: false,\n });\n};\n\nexport const applyAssistantToolResult = (\n message: InternalChatMessage,\n update: Partial<ToolCall> & Pick<ToolCall, 'name' | 'status'> & { id?: string },\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n const toolCalls = Array.isArray(message._activityToolCalls) ? message._activityToolCalls : [];\n const nextToolCalls = toolCalls.map((toolCall) => {\n const matchesById = update.id && toolCall.id === update.id;\n const matchesByName = !update.id && toolCall.name === update.name;\n if (!matchesById && !matchesByName) return toolCall;\n\n return {\n ...toolCall,\n ...update,\n };\n });\n\n return syncAssistantActivity({\n ...message,\n _activityToolCalls: nextToolCalls,\n });\n};\n\nexport const finalizeAssistantMessage = (\n message: InternalChatMessage,\n finalAnswer?: string,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n return syncAssistantActivity({\n ...message,\n ...(typeof finalAnswer === 'string' && finalAnswer.length > 0 ? { content: finalAnswer } : {}),\n isStreaming: false,\n isComplete: true,\n _activityReasoningStreaming: false,\n });\n};\n\nexport const closeAssistantMessage = (\n message: InternalChatMessage,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n return syncAssistantActivity({\n ...message,\n isStreaming: false,\n isComplete: true,\n _activityReasoningStreaming: false,\n });\n};\n"],"mappings":"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","names":["forwardRef","createElement","useState","useCallback","useRef","useEffect","offset","payload","rawBaseValue","rawBase","normalizedBase","API_BASE","apiUrl","useState","useRef","useEffect","useCallback","message","deleteThread"]}
|
|
1
|
+
{"version":3,"sources":["../src/CopilotzChat.tsx","../../node_modules/shared/src/utils.ts","../../node_modules/lucide-react/src/defaultAttributes.ts","../../node_modules/lucide-react/src/Icon.ts","../../node_modules/lucide-react/src/createLucideIcon.ts","../../node_modules/lucide-react/src/icons/user.ts","../src/useCopilotzChat.ts","../src/copilotzService.ts","../src/assetsService.ts","../src/useUrlState.ts","../src/activity.ts"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { ChatUI, ChatUserContextProvider } from \"@copilotz/chat-ui\";\nimport type {\n AgentOption,\n ChatCallbacks,\n ChatConfig,\n ChatUserContext,\n ChatUserMenuSection,\n MemoryItem,\n} from \"@copilotz/chat-ui\";\nimport { User } from \"lucide-react\";\nimport { useCopilotz } from \"./useCopilotzChat\";\nimport type {\n EventInterceptor,\n RenderSpecialState,\n RunErrorInterceptor,\n} from \"./specialState\";\nimport type { RequestHeadersProvider } from \"./copilotzService\";\n\nexport interface CopilotzChatProps {\n userId: string;\n userName?: string;\n userAvatar?: string;\n userEmail?: string;\n initialContext?: ChatUserContext;\n bootstrap?: {\n initialMessage?: string;\n initialToolCalls?: Array<{ name: string; args: Record<string, unknown> }>;\n };\n config?: ChatConfig;\n callbacks?: Partial<ChatCallbacks>;\n /**\n * Custom component to render in the right sidebar panel (e.g. Profile info).\n * Can be:\n * - A React node (static)\n * - A function receiving context: `(context) => ReactNode`\n * - A render function receiving panel props: `(props: { onClose, isMobile }) => ReactNode`\n * Toggle visibility via the header button.\n */\n customComponent?:\n | React.ReactNode\n | ((context: ChatUserContext) => React.ReactNode)\n | ((props: { onClose: () => void; isMobile: boolean }) => React.ReactNode);\n onToolOutput?: (output: Record<string, unknown>) => void;\n /**\n * Fired whenever the adapter’s selected thread id changes (initial load,\n * thread list refresh, create/select/delete, etc.). Use to keep side panels\n * in sync; user-driven `onSelectThread` alone does not cover bootstrap paths.\n */\n onCurrentThreadIdChange?: (threadId: string | null) => void;\n /** Called when user clicks logout in the user menu */\n onLogout?: () => void;\n /** Called when user clicks \"View Profile\" in the user menu */\n onViewProfile?: () => void;\n /** Called when user adds a memory */\n onAddMemory?: (content: string, category?: MemoryItem[\"category\"]) => void;\n /** Called when user updates a memory */\n onUpdateMemory?: (memoryId: string, content: string) => void;\n /** Called when user deletes a memory */\n onDeleteMemory?: (memoryId: string) => void;\n /** Structured custom menu sections rendered natively by the sidebar user menu */\n userMenuSections?: ChatUserMenuSection[];\n /** Additional native items to render inside the sidebar user menu */\n userMenuAdditionalItems?: React.ReactNode;\n /** Empty-state suggestions */\n suggestions?: string[];\n /** Agent selector data (built-in ChatUI) */\n agentOptions?: AgentOption[];\n selectedAgentId?: string | null;\n onSelectAgent?: (agentId: string) => void;\n /** Multi-agent: IDs of agents participating in the conversation */\n participantIds?: string[];\n onParticipantsChange?: (ids: string[]) => void;\n /** Multi-agent: ID of the agent this message is directed at */\n targetAgentId?: string | null;\n onTargetAgentChange?: (agentId: string | null) => void;\n getRequestHeaders?: RequestHeadersProvider;\n className?: string;\n eventInterceptor?: EventInterceptor;\n runErrorInterceptor?: RunErrorInterceptor;\n renderSpecialState?: RenderSpecialState;\n}\n\nexport const CopilotzChat: React.FC<CopilotzChatProps> = ({\n userId,\n userName,\n userAvatar,\n userEmail,\n initialContext,\n bootstrap,\n config: userConfig,\n callbacks: userCallbacks,\n customComponent,\n onToolOutput,\n onCurrentThreadIdChange,\n onLogout,\n onViewProfile,\n onAddMemory,\n onUpdateMemory,\n onDeleteMemory,\n userMenuSections,\n userMenuAdditionalItems,\n suggestions,\n agentOptions = [],\n selectedAgentId = null,\n onSelectAgent,\n participantIds,\n onParticipantsChange,\n targetAgentId = null,\n onTargetAgentChange,\n getRequestHeaders,\n className,\n eventInterceptor,\n runErrorInterceptor,\n renderSpecialState,\n}) => {\n const selectedAgent =\n agentOptions.find((agent) => agent.id === selectedAgentId) || null;\n\n // Keep backend routing identities stable. Display names are for UI only;\n // thread participants and targets must use agent IDs so server-side history\n // lookup can match the target agent.\n const participantAgentIds = useMemo(() => {\n if (!participantIds || participantIds.length === 0) return null;\n return participantIds.filter((id) => typeof id === \"string\" && id.length > 0);\n }, [participantIds]);\n\n const selectedAgentRunId = selectedAgent?.id ?? selectedAgentId ?? null;\n\n const targetAgentRunId = useMemo(() => {\n if (!targetAgentId) return null;\n return targetAgentId;\n }, [targetAgentId]);\n\n const {\n messages,\n isMessagesLoading,\n isLoadingOlderMessages,\n messagePageInfo,\n threads,\n currentThreadId,\n isStreaming,\n specialState,\n clearSpecialState,\n userContextSeed,\n sendMessage,\n createThread,\n selectThread,\n renameThread,\n archiveThread,\n deleteThread,\n stopGeneration,\n loadOlderMessages,\n } = useCopilotz({\n userId,\n initialContext,\n bootstrap,\n defaultThreadName: userConfig?.labels?.defaultThreadName,\n onToolOutput,\n preferredAgentName: selectedAgentRunId,\n participants: participantAgentIds,\n targetAgentName: targetAgentRunId,\n getRequestHeaders,\n eventInterceptor,\n runErrorInterceptor,\n });\n\n useEffect(() => {\n onCurrentThreadIdChange?.(currentThreadId);\n }, [currentThreadId, onCurrentThreadIdChange]);\n\n const chatCallbacks: ChatCallbacks = useMemo(() => {\n const {\n onSendMessage: _1,\n onStopGeneration: _2,\n onCreateThread: _3,\n onSelectThread: _4,\n onRenameThread: _5,\n onArchiveThread: _6,\n onDeleteThread: _7,\n onCopyMessage: _8,\n ...restUserCallbacks\n } = userCallbacks || {};\n\n return {\n ...restUserCallbacks,\n onSendMessage: (content: string, attachments?: any[]) => {\n void sendMessage(content, attachments);\n userCallbacks?.onSendMessage?.(content, attachments);\n },\n onStopGeneration: () => {\n stopGeneration();\n userCallbacks?.onStopGeneration?.();\n },\n onCreateThread: (title?: string) => {\n createThread(title);\n userCallbacks?.onCreateThread?.(title);\n },\n onSelectThread: (threadId: string) => {\n void selectThread(threadId);\n userCallbacks?.onSelectThread?.(threadId);\n },\n onRenameThread: (threadId: string, newTitle: string) => {\n void renameThread(threadId, newTitle);\n userCallbacks?.onRenameThread?.(threadId, newTitle);\n },\n onArchiveThread: (threadId: string) => {\n void archiveThread(threadId);\n userCallbacks?.onArchiveThread?.(threadId);\n },\n onDeleteThread: (threadId: string) => {\n void deleteThread(threadId);\n userCallbacks?.onDeleteThread?.(threadId);\n },\n onCopyMessage: async (messageId: string, content: string) => {\n try {\n await navigator.clipboard.writeText(content);\n userCallbacks?.onCopyMessage?.(messageId, content);\n } catch (error) {\n console.error(\"Failed to copy message\", error);\n }\n },\n onLogout,\n onViewProfile,\n };\n }, [\n sendMessage,\n stopGeneration,\n createThread,\n selectThread,\n renameThread,\n archiveThread,\n deleteThread,\n userCallbacks,\n onLogout,\n onViewProfile,\n ]);\n\n const mergedConfig: ChatConfig = useMemo(() => {\n const base = userConfig || {};\n if (!customComponent) {\n return base;\n }\n return {\n ...base,\n customComponent: {\n ...base.customComponent,\n component: customComponent,\n icon: base.customComponent?.icon || <User className=\"h-6 w-6\" />,\n },\n };\n }, [userConfig, customComponent]);\n\n const effectiveUserName = userName || userId;\n const effectiveUserAvatar = userAvatar;\n\n const userProp = useMemo(() => ({\n id: userId,\n name: effectiveUserName,\n email: userEmail,\n avatar: effectiveUserAvatar,\n }), [userId, effectiveUserName, userEmail, effectiveUserAvatar]);\n\n const assistantProp = useMemo(() => ({\n name: userConfig?.branding?.title,\n avatar: userConfig?.branding?.avatar,\n description: userConfig?.branding?.subtitle,\n }), [\n userConfig?.branding?.title,\n userConfig?.branding?.avatar,\n userConfig?.branding?.subtitle,\n ]);\n\n const specialStateContent = specialState\n ? renderSpecialState?.(specialState, { clear: clearSpecialState })\n : null;\n\n return (\n <ChatUserContextProvider initial={userContextSeed}>\n {specialStateContent ?? (\n <ChatUI\n messages={messages}\n isMessagesLoading={isMessagesLoading}\n isLoadingOlderMessages={isLoadingOlderMessages}\n hasMoreMessagesBefore={messagePageInfo.hasMoreBefore}\n onLoadOlderMessages={loadOlderMessages}\n threads={threads}\n currentThreadId={currentThreadId}\n config={mergedConfig}\n callbacks={chatCallbacks}\n isGenerating={isStreaming}\n suggestions={suggestions}\n agentOptions={agentOptions}\n selectedAgentId={selectedAgentId}\n onSelectAgent={onSelectAgent}\n participantIds={participantIds}\n onParticipantsChange={onParticipantsChange}\n targetAgentId={targetAgentId}\n onTargetAgentChange={onTargetAgentChange}\n user={userProp}\n assistant={assistantProp}\n onAddMemory={onAddMemory}\n onUpdateMemory={onUpdateMemory}\n onDeleteMemory={onDeleteMemory}\n userMenuSections={userMenuSections}\n userMenuAdditionalItems={userMenuAdditionalItems}\n className={className}\n />\n )}\n </ChatUserContextProvider>\n );\n};\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2', key: '975kel' }],\n ['circle', { cx: '12', cy: '7', r: '4', key: '17ys0d' }],\n];\n\n/**\n * @component @name User\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/user\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst User = createLucideIcon('user', __iconNode);\n\nexport default User;\n","// deno-lint-ignore-file no-explicit-any\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport {\n runCopilotzStream,\n fetchThreads,\n fetchThreadMessagesPage,\n updateThread as updateThreadApi,\n deleteThread as deleteThreadApi,\n} from './copilotzService';\nimport { resolveAssetsInMessages } from './assetsService';\nimport type { ChatMessage as ChatViewMessage, ChatThread, MediaAttachment, ChatUserContext } from '@copilotz/chat-ui';\nimport { useUrlState } from './useUrlState';\nimport type { EventInterceptor, RunErrorInterceptor, SpecialChatState } from './specialState';\nimport type { RequestHeadersProvider, RestMessagePageInfo } from './copilotzService';\nimport {\n appendAssistantToolCall,\n applyAssistantToolResult,\n closeAssistantMessage,\n finalizeAssistantMessage,\n hasVisibleAssistantOutput,\n type InternalChatMessage,\n updateAssistantMessageToken,\n syncAssistantActivity,\n toPublicChatMessage,\n} from './activity';\n\nconst nowTs = () => Date.now();\nconst generateId = () =>\n (globalThis.crypto?.randomUUID?.() ?? `id-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`) as string;\nconst isAbortError = (error: unknown) => (\n error instanceof DOMException && error.name === 'AbortError'\n) || (typeof error === 'object' && error !== null && 'name' in error && (error as { name?: string }).name === 'AbortError');\nconst getEventPayload = (event: any) => event?.payload ?? event;\nconst getEventSenderType = (payload: any): string | undefined => payload?.senderType || payload?.sender?.type;\n\nconst isInternalMessageMetadata = (\n metadata?: Record<string, unknown> | null,\n): boolean => metadata?.visibility === 'internal';\n\nconst normalizeAgentIdentity = (\n agent?: { id?: string | null; name?: string | null } | null,\n): { senderAgentId?: string; senderName?: string } => {\n const senderAgentId = typeof agent?.id === 'string' && agent.id.length > 0\n ? agent.id\n : undefined;\n const senderName = typeof agent?.name === 'string' && agent.name.length > 0\n ? agent.name\n : senderAgentId;\n\n return {\n ...(senderAgentId ? { senderAgentId } : {}),\n ...(senderName ? { senderName } : {}),\n };\n};\n\nconst messageAgentKey = (message: ChatViewMessage): string | null => {\n if (message.role !== 'assistant') return null;\n return message.senderAgentId ?? message.senderName ?? null;\n};\n\ntype ServerThread = Awaited<ReturnType<typeof fetchThreads>>[number];\ntype ServerMessage = Awaited<ReturnType<typeof fetchThreadMessagesPage>>['data'][number];\ntype AgentIdentity = { senderAgentId?: string; senderName?: string };\n\nconst resolveLiveAgentIdentity = (event: any): AgentIdentity => {\n const payload = getEventPayload(event);\n const agent = (\n payload?.agent && typeof payload.agent === 'object'\n ? payload.agent\n : event?.agent && typeof event.agent === 'object'\n ? event.agent\n : null\n ) as { id?: string | null; name?: string | null } | null;\n\n if (agent) {\n return normalizeAgentIdentity(agent);\n }\n\n const sender = (\n payload?.sender && typeof payload.sender === 'object'\n ? payload.sender\n : event?.sender && typeof event.sender === 'object'\n ? event.sender\n : null\n ) as { id?: string | null; name?: string | null } | null;\n\n return normalizeAgentIdentity({\n id:\n typeof payload?.senderId === 'string' ? payload.senderId\n : typeof sender?.id === 'string' ? sender.id\n : null,\n name:\n typeof payload?.senderName === 'string' ? payload.senderName\n : typeof sender?.name === 'string' ? sender.name\n : null,\n });\n};\n\nconst canAttachToStreamingAssistant = (\n message: ChatViewMessage | undefined,\n incomingAgentKey: string | null,\n): boolean => {\n if (!message || message.role !== 'assistant' || !message.isStreaming) {\n return false;\n }\n\n const currentAgentKey = messageAgentKey(message);\n return !incomingAgentKey || !currentAgentKey || currentAgentKey === incomingAgentKey;\n};\n\ntype ToolCallStatus = 'pending' | 'running' | 'completed' | 'failed';\ntype ParsedToolCall = {\n id?: string;\n name: string;\n arguments: Record<string, unknown>;\n status: ToolCallStatus;\n result?: unknown;\n};\n\ntype ToolResultUpdate = {\n id?: string;\n name?: string;\n status: ToolCallStatus;\n result?: unknown;\n endTime: number;\n};\n\nconst THREAD_MESSAGES_PAGE_SIZE = 50;\n\nconst createEmptyMessagePageInfo = (): RestMessagePageInfo => ({\n hasMoreBefore: false,\n oldestMessageId: null,\n newestMessageId: null,\n});\n\nconst normalizeToolStatus = (status: unknown): ToolCallStatus => {\n if (status === 'pending') return 'pending';\n if (status === 'running' || status === 'processing') return 'running';\n if (status === 'failed') return 'failed';\n return 'completed';\n};\n\nconst parseToolArguments = (value: unknown): Record<string, unknown> => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // Ignore invalid JSON and fall through to empty args.\n }\n }\n return {};\n};\n\nconst matchesToolResultUpdate = (\n target: { id?: string; name?: string },\n update: Pick<ToolResultUpdate, 'id' | 'name'>,\n): boolean => {\n if (update.id && target.id) {\n return update.id === target.id;\n }\n\n return Boolean(update.name && target.name && update.name === target.name);\n};\n\nconst findMatchingToolCallIndex = (\n toolCalls: NonNullable<InternalChatMessage['_activityToolCalls']>,\n update: ToolResultUpdate,\n): number => toolCalls.findIndex((toolCall) => (\n matchesToolResultUpdate(\n { id: toolCall.id, name: toolCall.name },\n update,\n ) &&\n (toolCall.status === 'pending' || toolCall.status === 'running' || typeof toolCall.result === 'undefined')\n));\n\nconst applyToolResultUpdateToMessages = (\n messages: InternalChatMessage[],\n update: ToolResultUpdate,\n assistantPatch?: Partial<InternalChatMessage>,\n): { messages: InternalChatMessage[]; matched: boolean } => {\n const nextMessages = [...messages];\n\n for (let i = nextMessages.length - 1; i >= 0; i--) {\n const message = nextMessages[i];\n if (message.role !== 'assistant' || !Array.isArray(message._activityToolCalls) || message._activityToolCalls.length === 0) {\n continue;\n }\n\n const toolCallIndex = findMatchingToolCallIndex(message._activityToolCalls, update);\n if (toolCallIndex === -1) continue;\n\n nextMessages[i] = syncAssistantActivity({\n ...applyAssistantToolResult(message, {\n ...(update.id ? { id: update.id } : {}),\n name: update.name ?? message._activityToolCalls[toolCallIndex].name,\n status: update.status,\n ...(update.result !== undefined ? { result: update.result } : {}),\n endTime: update.endTime,\n }),\n ...(assistantPatch ?? {}),\n });\n\n return { messages: nextMessages, matched: true };\n }\n\n return { messages, matched: false };\n};\n\nconst extractLiveToolCall = (payload: Record<string, unknown> | undefined): ParsedToolCall | null => {\n const toolCall = payload?.toolCall as Record<string, unknown> | undefined;\n if (!toolCall) return null;\n\n const tool = toolCall.tool as Record<string, unknown> | undefined;\n const name = typeof tool?.name === 'string'\n ? tool.name\n : typeof tool?.id === 'string'\n ? tool.id\n : 'tool';\n const result = toolCall.output !== undefined ? toolCall.output : undefined;\n\n return {\n ...(typeof toolCall.id === 'string' ? { id: toolCall.id } : {}),\n name,\n arguments: parseToolArguments(toolCall.args),\n status: normalizeToolStatus(toolCall.status ?? payload?.status ?? 'running'),\n ...(result !== undefined ? { result } : {}),\n };\n};\n\nconst extractLiveToolResultUpdate = (\n payload: Record<string, unknown> | undefined,\n): ToolResultUpdate => {\n const tool = payload?.tool as Record<string, unknown> | undefined;\n const result =\n payload?.projectedOutput !== undefined\n ? payload.projectedOutput\n : payload?.output !== undefined\n ? payload.output\n : payload?.content;\n\n return {\n ...(typeof payload?.toolCallId === 'string' ? { id: payload.toolCallId } : {}),\n ...(typeof tool?.name === 'string'\n ? { name: tool.name }\n : typeof tool?.id === 'string'\n ? { name: tool.id }\n : {}),\n status: normalizeToolStatus(payload?.status),\n ...(result !== undefined ? { result } : {}),\n endTime: nowTs(),\n };\n};\n\nconst extractToolCallsFromServerMessage = (msg: ServerMessage): ParsedToolCall[] => {\n const metadata = (msg.metadata ?? undefined) as Record<string, unknown> | undefined;\n const topLevelToolCalls = Array.isArray((msg as unknown as { toolCalls?: Array<Record<string, unknown>> }).toolCalls)\n ? ((msg as unknown as { toolCalls?: Array<Record<string, unknown>> }).toolCalls || [])\n : [];\n const metadataToolCalls = Array.isArray(metadata?.toolCalls)\n ? (metadata.toolCalls as Array<Record<string, unknown>>)\n : [];\n\n const usedMetadataIndexes = new Set<number>();\n const parsed: ParsedToolCall[] = [];\n\n const extractToolName = (obj: Record<string, unknown>): string | undefined => {\n if (typeof obj.name === 'string') return obj.name;\n const t = obj.tool as Record<string, unknown> | undefined;\n if (typeof t?.name === 'string') return t.name;\n if (typeof t?.id === 'string') return t.id;\n return undefined;\n };\n\n const findMatchingMetadataIndex = (toolCall: Record<string, unknown>): number => {\n const id = typeof toolCall.id === 'string' ? toolCall.id : undefined;\n const name = extractToolName(toolCall);\n\n const byId = id\n ? metadataToolCalls.findIndex((candidate, idx) => !usedMetadataIndexes.has(idx) && candidate?.id === id)\n : -1;\n if (byId >= 0) return byId;\n\n return name\n ? metadataToolCalls.findIndex((candidate, idx) => !usedMetadataIndexes.has(idx) && extractToolName(candidate) === name)\n : -1;\n };\n\n const parseToolCall = (\n primary: Record<string, unknown>,\n secondary?: Record<string, unknown>,\n ): ParsedToolCall => {\n const id = typeof primary.id === 'string'\n ? primary.id\n : (typeof secondary?.id === 'string' ? secondary.id : undefined);\n const toolObj = primary.tool as Record<string, unknown> | undefined;\n const secondaryToolObj = secondary?.tool as Record<string, unknown> | undefined;\n const name = typeof primary.name === 'string'\n ? primary.name\n : typeof toolObj?.name === 'string'\n ? toolObj.name\n : typeof toolObj?.id === 'string'\n ? toolObj.id\n : typeof secondary?.name === 'string'\n ? secondary.name\n : typeof secondaryToolObj?.name === 'string'\n ? secondaryToolObj.name\n : typeof secondaryToolObj?.id === 'string'\n ? secondaryToolObj.id\n : 'tool';\n const argsRaw =\n primary.args ?? primary.arguments ?? secondary?.args ?? secondary?.arguments;\n const result =\n primary.output !== undefined\n ? primary.output\n : primary.result !== undefined\n ? primary.result\n : secondary?.output !== undefined\n ? secondary.output\n : secondary?.result;\n const status = normalizeToolStatus(primary.status ?? secondary?.status);\n\n return {\n ...(id ? { id } : {}),\n name,\n arguments: parseToolArguments(argsRaw),\n ...(result !== undefined ? { result } : {}),\n status,\n };\n };\n\n topLevelToolCalls.forEach((toolCall) => {\n const metadataIndex = findMatchingMetadataIndex(toolCall);\n const metadataCall = metadataIndex >= 0 ? metadataToolCalls[metadataIndex] : undefined;\n if (metadataIndex >= 0) usedMetadataIndexes.add(metadataIndex);\n parsed.push(parseToolCall(toolCall, metadataCall));\n });\n\n metadataToolCalls.forEach((toolCall, index) => {\n if (usedMetadataIndexes.has(index)) return;\n parsed.push(parseToolCall(toolCall));\n });\n\n return parsed;\n};\n\nconst extractToolResultUpdateFromMessage = (msg: ServerMessage): ToolResultUpdate | null => {\n if (msg.senderType !== 'tool') return null;\n\n const toolCalls = extractToolCallsFromServerMessage(msg);\n if (!Array.isArray(toolCalls) || toolCalls.length === 0) return null;\n\n const firstToolCall = toolCalls[0];\n const metadata = (msg.metadata ?? undefined) as Record<string, unknown> | undefined;\n const fallbackResult = metadata?.output;\n const result = firstToolCall.result !== undefined ? firstToolCall.result : fallbackResult;\n\n return {\n ...(firstToolCall.id ? { id: firstToolCall.id } : {}),\n ...(firstToolCall.name ? { name: firstToolCall.name } : {}),\n ...(result !== undefined ? { result } : {}),\n status: firstToolCall.status,\n endTime: msg.createdAt ? new Date(msg.createdAt).getTime() : nowTs(),\n };\n};\n\nconst mergePersistedToolResults = (\n messages: InternalChatMessage[],\n updates: ToolResultUpdate[],\n): InternalChatMessage[] => {\n if (updates.length === 0) return messages;\n\n let nextMessages = messages;\n for (const update of updates) {\n nextMessages = applyToolResultUpdateToMessages(nextMessages, update).messages;\n }\n\n return nextMessages;\n};\n\nconst prependUniqueMessages = (\n olderMessages: InternalChatMessage[],\n currentMessages: InternalChatMessage[],\n): InternalChatMessage[] => {\n if (olderMessages.length === 0) return currentMessages;\n if (currentMessages.length === 0) return olderMessages;\n\n const seen = new Set<string>();\n const combined: InternalChatMessage[] = [];\n\n for (const message of [...olderMessages, ...currentMessages]) {\n if (seen.has(message.id)) continue;\n seen.add(message.id);\n combined.push(message);\n }\n\n return combined;\n};\n\nconst convertServerMessage = (msg: ServerMessage): InternalChatMessage => {\n const timestamp = msg.createdAt ? new Date(msg.createdAt).getTime() : nowTs();\n const metadata = (msg.metadata ?? undefined) as Record<string, unknown> | undefined;\n const attachmentsMeta = Array.isArray(metadata?.attachments)\n ? (metadata!.attachments as Array<Record<string, unknown>>)\n : [];\n\n const attachments: MediaAttachment[] = attachmentsMeta.flatMap((att) => {\n const kind = typeof att.kind === 'string' ? att.kind : undefined;\n const dataUrl = typeof att.dataUrl === 'string' ? att.dataUrl : undefined;\n const mimeType = typeof att.mimeType === 'string' ? att.mimeType : undefined;\n if (!dataUrl) return [];\n\n if (kind === 'image') {\n return [{ kind: 'image', dataUrl, mimeType: mimeType ?? 'image/jpeg' }] as MediaAttachment[];\n }\n if (kind === 'audio') {\n return [{\n kind: 'audio',\n dataUrl,\n mimeType: mimeType ?? 'audio/webm',\n durationMs: typeof att.durationMs === 'number' ? att.durationMs : undefined,\n }] as MediaAttachment[];\n }\n if (kind === 'video') {\n return [{\n kind: 'video',\n dataUrl,\n mimeType: mimeType ?? 'video/mp4',\n durationMs: typeof att.durationMs === 'number' ? att.durationMs : undefined,\n poster: typeof att.poster === 'string' ? att.poster : undefined,\n }] as MediaAttachment[];\n }\n return [] as MediaAttachment[];\n });\n\n const role = msg.senderType === 'agent'\n ? 'assistant'\n : msg.senderType === 'user'\n ? 'user'\n : 'assistant';\n\n const parsedToolCalls = extractToolCallsFromServerMessage(msg);\n const shouldRenderToolCalls = msg.senderType !== 'tool';\n const mappedToolCalls = parsedToolCalls.map((toolCall) => ({\n id: toolCall.id ?? generateId(),\n name: toolCall.name,\n arguments: toolCall.arguments,\n status: toolCall.status,\n ...(toolCall.result !== undefined ? { result: toolCall.result } : {}),\n }));\n\n const hasToolCalls = shouldRenderToolCalls && mappedToolCalls.length > 0;\n const isToolSender = msg.senderType === 'tool';\n const content =\n isToolSender\n ? '' // Do not render textual content for tool messages; attachments only\n : ((msg.content ?? '') || (hasToolCalls ? '' : ''));\n\n const reasoning = typeof (msg as any).reasoning === 'string' && (msg as any).reasoning.length > 0\n ? (msg as any).reasoning as string\n : undefined;\n\n // Extract sender identity for multi-agent display\n const senderAgentId = msg.senderType === 'agent' ? (msg.senderId ?? undefined) : undefined;\n const senderName = msg.senderType === 'agent'\n ? (typeof (msg as any).senderName === 'string' ? (msg as any).senderName : (msg.senderId ?? undefined))\n : undefined;\n\n return syncAssistantActivity({\n id: msg.id,\n role,\n content,\n timestamp,\n attachments: attachments.length > 0 ? attachments : undefined,\n isStreaming: false,\n isComplete: true,\n metadata,\n _activityToolCalls: hasToolCalls ? mappedToolCalls : undefined,\n ...(reasoning ? { _activityReasoning: reasoning } : {}),\n ...(senderAgentId ? { senderAgentId } : {}),\n ...(senderName ? { senderName } : {}),\n });\n};\n\nexport interface UseCopilotzOptions {\n userId: string | null;\n initialContext?: ChatUserContext;\n bootstrap?: {\n initialMessage?: string;\n initialToolCalls?: Array<{ name: string; args: Record<string, unknown> }>;\n };\n defaultThreadName?: string;\n onToolOutput?: (output: Record<string, unknown>) => void;\n preferredAgentName?: string | null;\n /** Agent participants in the thread (multi-agent). When set, overrides preferredAgentName for thread.participants. */\n participants?: string[] | null;\n /** Explicit target agent for each message. When set, maps to MessagePayload.target. */\n targetAgentName?: string | null;\n getRequestHeaders?: RequestHeadersProvider;\n eventInterceptor?: EventInterceptor;\n runErrorInterceptor?: RunErrorInterceptor;\n}\n\nexport function useCopilotz({\n userId,\n initialContext,\n bootstrap,\n defaultThreadName,\n onToolOutput,\n preferredAgentName,\n participants,\n targetAgentName,\n getRequestHeaders,\n eventInterceptor,\n runErrorInterceptor,\n}: UseCopilotzOptions) {\n // URL state — thread ID is synced to/from URL by default\n const {\n state: urlState,\n setThreadId: setUrlThreadId,\n isEnabled: isUrlSyncEnabled,\n } = useUrlState();\n\n const [threads, setThreads] = useState<ChatThread[]>([]);\n const [threadMetadataMap, setThreadMetadataMap] = useState<Record<string, Record<string, unknown> | undefined>>({});\n const [threadExternalIdMap, setThreadExternalIdMap] = useState<Record<string, string | null>>({});\n\n const [currentThreadId, setCurrentThreadId] = useState<string | null>(null);\n const [currentThreadExternalId, setCurrentThreadExternalId] = useState<string | null>(null);\n\n const [messages, setMessages] = useState<InternalChatMessage[]>([]);\n const [isMessagesLoading, setIsMessagesLoading] = useState(false);\n const [isLoadingOlderMessages, setIsLoadingOlderMessages] = useState(false);\n const [messagePageInfo, setMessagePageInfo] = useState<RestMessagePageInfo>(createEmptyMessagePageInfo);\n const [isStreaming, setIsStreaming] = useState(false);\n const [specialState, setSpecialState] = useState<SpecialChatState | null>(null);\n\n const [userContextSeed, setUserContextSeed] = useState<Partial<ChatUserContext>>(initialContext || {});\n const preferredAgentRef = useRef<string | null>(preferredAgentName ?? null);\n const participantsRef = useRef<string[] | null>(participants ?? null);\n const targetAgentNameRef = useRef<string | null>(targetAgentName ?? null);\n\n // Refs to hold latest state for callbacks to avoid dependency cycles\n // Using direct assignment pattern instead of useEffect for better performance\n const threadsRef = useRef(threads);\n const threadMetadataMapRef = useRef(threadMetadataMap);\n const threadExternalIdMapRef = useRef(threadExternalIdMap);\n const currentThreadIdRef = useRef(currentThreadId);\n const currentThreadExternalIdRef = useRef(currentThreadExternalId);\n const userContextSeedRef = useRef(userContextSeed);\n const messagePageInfoRef = useRef(messagePageInfo);\n const isLoadingOlderMessagesRef = useRef(isLoadingOlderMessages);\n const persistedToolUpdatesRef = useRef<ToolResultUpdate[]>([]);\n // Buffer live TOOL_RESULT updates that arrive before their matching TOOL_CALL\n // has been rendered. We reconcile them as soon as the TOOL_CALL lands.\n const liveToolUpdatesRef = useRef<ToolResultUpdate[]>([]);\n\n // Sync refs on every render (more efficient than multiple useEffects)\n threadsRef.current = threads;\n threadMetadataMapRef.current = threadMetadataMap;\n threadExternalIdMapRef.current = threadExternalIdMap;\n currentThreadIdRef.current = currentThreadId;\n currentThreadExternalIdRef.current = currentThreadExternalId;\n userContextSeedRef.current = userContextSeed;\n messagePageInfoRef.current = messagePageInfo;\n isLoadingOlderMessagesRef.current = isLoadingOlderMessages;\n preferredAgentRef.current = preferredAgentName ?? null;\n participantsRef.current = participants ?? null;\n targetAgentNameRef.current = targetAgentName ?? null;\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const messagesRequestRef = useRef<number>(0);\n // Guard to prevent double initialization in StrictMode\n const initializationRef = useRef<{ userId: string | null; started: boolean }>({ userId: null, started: false });\n\n useEffect(() => {\n if (initialContext) {\n setUserContextSeed((prev) => ({ ...prev, ...initialContext }));\n }\n }, [initialContext]);\n\n const processToolOutput = useCallback((output: Record<string, unknown>) => {\n if (!output) return;\n\n const contextPatch: Partial<ChatUserContext> = {};\n\n // Generic merge of userContext from output if present\n if (output.userContext && typeof output.userContext === 'object') {\n Object.assign(contextPatch, output.userContext as Partial<ChatUserContext>);\n }\n\n if (Object.keys(contextPatch).length > 0) {\n setUserContextSeed((prev) => ({ ...prev, ...contextPatch }));\n }\n\n onToolOutput?.(output);\n }, [onToolOutput]);\n\n const clearSpecialState = useCallback(() => {\n setSpecialState(null);\n }, []);\n\n const applyEventInterceptor = useCallback((event: unknown) => {\n if (!eventInterceptor) return undefined;\n try {\n const result = eventInterceptor(event);\n if (result?.specialState) {\n setSpecialState(result.specialState);\n }\n return result;\n } catch (error) {\n console.error('Error in Copilotz event interceptor', error);\n return undefined;\n }\n }, [eventInterceptor]);\n\n const getSpecialStateFromError = useCallback((error: unknown) => {\n if (!runErrorInterceptor) return null;\n try {\n return runErrorInterceptor(error) ?? null;\n } catch (interceptorError) {\n console.error('Error in Copilotz run error interceptor', interceptorError);\n return null;\n }\n }, [runErrorInterceptor]);\n\n const handleStreamMessageEvent = useCallback((event: any) => {\n const payload = getEventPayload(event);\n if (!payload) return;\n const liveMetadata = (\n event?.metadata && typeof event.metadata === 'object'\n ? event.metadata\n : payload?.metadata\n ) as Record<string, unknown> | undefined;\n if (isInternalMessageMetadata(liveMetadata)) {\n return;\n }\n const senderType = getEventSenderType(payload);\n if (senderType !== 'agent' || typeof payload.content !== 'string') return;\n\n // Fallback path for custom/non-contract events that still look like an\n // assistant artifact message.\n const agentIdentity = resolveLiveAgentIdentity(event);\n const incomingAgentKey = agentIdentity.senderAgentId ?? agentIdentity.senderName ?? null;\n\n setMessages((prev) => {\n const next = [...prev];\n for (let i = next.length - 1; i >= 0; i--) {\n const m = next[i];\n if (canAttachToStreamingAssistant(m, incomingAgentKey)) {\n next[i] = syncAssistantActivity({\n ...m,\n content: payload.content,\n isStreaming: false,\n isComplete: true,\n ...agentIdentity,\n });\n return next;\n }\n }\n\n const trimmedContent = payload.content.trim();\n if (!trimmedContent) {\n return prev;\n }\n\n return [\n ...next,\n syncAssistantActivity({\n id: generateId(),\n role: 'assistant',\n content: payload.content,\n timestamp: nowTs(),\n isStreaming: false,\n isComplete: true,\n metadata: liveMetadata,\n ...agentIdentity,\n } as InternalChatMessage),\n ];\n });\n }, []);\n\n const updateThreadsState = useCallback((rawThreads: ServerThread[], preferredExternalId?: string | null) => {\n const metadataMap: Record<string, Record<string, unknown> | undefined> = {};\n const externalMap: Record<string, string | null> = {};\n\n const normalized = rawThreads.map((thread) => {\n metadataMap[thread.id] = thread.metadata ?? undefined;\n externalMap[thread.id] = thread.externalId ?? null;\n const updatedAt = thread.updatedAt ? new Date(thread.updatedAt).getTime() : nowTs();\n const createdAt = thread.createdAt ? new Date(thread.createdAt).getTime() : updatedAt;\n return {\n id: thread.id,\n title: thread.name || 'Chat',\n createdAt,\n updatedAt,\n messageCount: typeof thread.metadata?.messageCount === 'number'\n ? thread.metadata!.messageCount as number\n : 0,\n isArchived: thread.status === 'archived',\n metadata: thread.metadata ?? undefined,\n } as ChatThread;\n });\n\n setThreadMetadataMap(metadataMap);\n setThreadExternalIdMap(externalMap);\n setThreads(normalized);\n\n // Use refs to avoid dependency cycle\n const curExtId = currentThreadExternalIdRef.current;\n const curId = currentThreadIdRef.current;\n\n let nextThreadId: string | null = null;\n\n if (preferredExternalId) {\n const preferred = rawThreads.find((thread) => (thread.externalId ?? thread.id) === preferredExternalId);\n if (preferred) nextThreadId = preferred.id;\n }\n\n if (!nextThreadId && curExtId) {\n const match = rawThreads.find((thread) => (thread.externalId ?? thread.id) === curExtId);\n if (match) nextThreadId = match.id;\n }\n\n if (!nextThreadId && curId && rawThreads.some((thread) => thread.id === curId)) {\n nextThreadId = curId;\n }\n\n if (!nextThreadId && normalized.length > 0) {\n nextThreadId = normalized[0].id;\n }\n\n setCurrentThreadId(nextThreadId ?? null);\n setCurrentThreadExternalId(nextThreadId ? externalMap[nextThreadId] ?? null : null);\n\n return nextThreadId;\n }, []); // No dependencies needed now as we use refs for reading current state\n\n const fetchAndSetThreadsState = useCallback(async (uid: string, preferredExternalId?: string | null) => {\n try {\n const rawThreads = await fetchThreads(uid, getRequestHeaders);\n return updateThreadsState(rawThreads, preferredExternalId);\n } catch (error) {\n if (isAbortError(error)) return;\n console.error('Error loading threads', error);\n return null;\n }\n }, [updateThreadsState, getRequestHeaders]);\n\n const prepareThreadMessages = useCallback(async (rawMessages: ServerMessage[]) => {\n const resolvedMessages = await resolveAssetsInMessages(rawMessages as unknown as any[]);\n\n resolvedMessages.forEach((msg: any) => {\n if (msg.senderType === 'tool') {\n const metadata = msg.metadata as Record<string, unknown> | undefined;\n const output = (metadata?.output ?? metadata) as Record<string, unknown> | undefined;\n if (output) processToolOutput(output);\n }\n });\n\n const toolResultUpdates = resolvedMessages\n .map((msg) => extractToolResultUpdateFromMessage(msg as unknown as ServerMessage))\n .filter((update): update is ToolResultUpdate => update !== null);\n\n const viewMessages = resolvedMessages\n .filter((msg) => {\n const meta = (msg.metadata ?? {}) as Record<string, unknown>;\n if (isInternalMessageMetadata(meta)) {\n return false;\n }\n const text = (typeof msg.content === 'string' ? msg.content : '').trim();\n const hasText = text.length > 0;\n const hasToolCalls = extractToolCallsFromServerMessage(msg as unknown as ServerMessage).length > 0;\n const hasAttachments = Array.isArray(meta.attachments) && (meta.attachments as unknown[]).length > 0;\n if (msg.senderType === 'tool') {\n return hasAttachments;\n }\n return hasText || hasToolCalls || hasAttachments;\n })\n .map(convertServerMessage);\n\n return {\n viewMessages,\n toolResultUpdates,\n };\n }, [processToolOutput]);\n\n const loadThreadMessages = useCallback(async (threadId: string) => {\n const requestId = messagesRequestRef.current + 1;\n messagesRequestRef.current = requestId;\n setIsMessagesLoading(true);\n setIsLoadingOlderMessages(false);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n liveToolUpdatesRef.current = [];\n try {\n const page = await fetchThreadMessagesPage(\n threadId,\n { limit: THREAD_MESSAGES_PAGE_SIZE },\n getRequestHeaders,\n );\n const { viewMessages, toolResultUpdates } = await prepareThreadMessages(page.data);\n if (messagesRequestRef.current !== requestId) return;\n\n persistedToolUpdatesRef.current = toolResultUpdates;\n const hydratedMessages = mergePersistedToolResults(viewMessages, persistedToolUpdatesRef.current);\n setMessages(hydratedMessages);\n setMessagePageInfo(page.pageInfo);\n } catch (error) {\n if (isAbortError(error)) return;\n console.error(`Error loading messages for thread ${threadId}`, error);\n persistedToolUpdatesRef.current = [];\n setMessagePageInfo(createEmptyMessagePageInfo());\n } finally {\n if (messagesRequestRef.current === requestId) {\n setIsMessagesLoading(false);\n }\n }\n }, [getRequestHeaders, prepareThreadMessages]);\n\n const loadOlderMessages = useCallback(async () => {\n const threadId = currentThreadIdRef.current;\n const pageInfo = messagePageInfoRef.current;\n const before = pageInfo.oldestMessageId;\n\n if (!threadId || !before || !pageInfo.hasMoreBefore || isLoadingOlderMessagesRef.current) {\n return;\n }\n\n const requestId = messagesRequestRef.current;\n setIsLoadingOlderMessages(true);\n\n try {\n const page = await fetchThreadMessagesPage(\n threadId,\n { limit: THREAD_MESSAGES_PAGE_SIZE, before },\n getRequestHeaders,\n );\n const { viewMessages, toolResultUpdates } = await prepareThreadMessages(page.data);\n if (messagesRequestRef.current !== requestId) return;\n\n persistedToolUpdatesRef.current = [\n ...toolResultUpdates,\n ...persistedToolUpdatesRef.current,\n ];\n\n setMessages((prev) => mergePersistedToolResults(\n prependUniqueMessages(viewMessages, prev),\n persistedToolUpdatesRef.current,\n ));\n setMessagePageInfo(page.pageInfo);\n } catch (error) {\n if (isAbortError(error)) return;\n console.error(`Error loading older messages for thread ${threadId}`, error);\n } finally {\n if (messagesRequestRef.current === requestId) {\n setIsLoadingOlderMessages(false);\n }\n }\n }, [getRequestHeaders, prepareThreadMessages]);\n\n const handleSelectThread = useCallback(async (threadId: string) => {\n setCurrentThreadId(threadId);\n setMessages([]);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n // Use ref for external map to avoid re-creation\n const extMap = threadExternalIdMapRef.current;\n setCurrentThreadExternalId(extMap[threadId] ?? null);\n await loadThreadMessages(threadId);\n }, [loadThreadMessages]);\n\n const handleCreateThread = useCallback((title?: string) => {\n messagesRequestRef.current += 1;\n setIsMessagesLoading(false);\n setIsLoadingOlderMessages(false);\n const id = generateId();\n const now = nowTs();\n const newThread: ChatThread = {\n id,\n title: title?.trim() || 'New Chat',\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n metadata: { pendingTitle: title?.trim() || undefined },\n };\n\n setThreads((prev) => [newThread, ...prev]);\n setThreadMetadataMap((prev) => ({ ...prev, [id]: { pendingTitle: title?.trim() || undefined } }));\n setThreadExternalIdMap((prev) => ({ ...prev, [id]: id }));\n setCurrentThreadId(id);\n setCurrentThreadExternalId(id);\n setMessages([]);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n }, []);\n\n const handleRenameThread = useCallback(async (threadId: string, newTitle: string) => {\n const trimmedTitle = newTitle.trim();\n if (!trimmedTitle) return;\n\n // Update local state immediately\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, title: trimmedTitle, updatedAt: nowTs() } : t))\n );\n\n // Check if this is a placeholder thread (not yet persisted)\n const extMap = threadExternalIdMapRef.current;\n const isPlaceholder = extMap[threadId] === threadId;\n\n if (isPlaceholder) {\n // Store title in metadata for when thread is created\n setThreadMetadataMap((prev) => ({\n ...prev,\n [threadId]: { ...prev[threadId], pendingTitle: trimmedTitle },\n }));\n } else {\n // Persist to backend\n try {\n await updateThreadApi(threadId, { name: trimmedTitle }, getRequestHeaders);\n } catch (error) {\n console.error('Failed to rename thread:', error);\n // Revert on error - refetch threads\n if (userId) {\n await fetchAndSetThreadsState(userId, currentThreadExternalIdRef.current);\n }\n }\n }\n }, [userId, fetchAndSetThreadsState, getRequestHeaders]);\n\n const handleArchiveThread = useCallback(async (threadId: string) => {\n // Find current archive status\n const thread = threadsRef.current.find((t) => t.id === threadId);\n if (!thread) return;\n\n const newArchivedStatus = !thread.isArchived;\n\n // Update local state immediately\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, isArchived: newArchivedStatus, updatedAt: nowTs() } : t))\n );\n\n // Check if this is a placeholder thread\n const extMap = threadExternalIdMapRef.current;\n const isPlaceholder = extMap[threadId] === threadId;\n\n if (!isPlaceholder) {\n try {\n await updateThreadApi(threadId, { status: newArchivedStatus ? 'archived' : 'active' }, getRequestHeaders);\n } catch (error) {\n console.error('Failed to archive thread:', error);\n // Revert on error\n if (userId) {\n await fetchAndSetThreadsState(userId, currentThreadExternalIdRef.current);\n }\n }\n }\n }, [userId, fetchAndSetThreadsState, getRequestHeaders]);\n\n const handleDeleteThread = useCallback(async (threadId: string) => {\n // Check if this is a placeholder thread\n const extMap = threadExternalIdMapRef.current;\n const isPlaceholder = extMap[threadId] === threadId;\n\n // Remove from local state immediately\n setThreads((prev) => prev.filter((t) => t.id !== threadId));\n setThreadMetadataMap((prev) => {\n const next = { ...prev };\n delete next[threadId];\n return next;\n });\n setThreadExternalIdMap((prev) => {\n const next = { ...prev };\n delete next[threadId];\n return next;\n });\n\n // If deleting current thread, switch to another\n if (currentThreadIdRef.current === threadId) {\n const remaining = threadsRef.current.filter((t) => t.id !== threadId);\n if (remaining.length > 0) {\n setCurrentThreadId(remaining[0].id);\n setCurrentThreadExternalId(extMap[remaining[0].id] ?? null);\n await loadThreadMessages(remaining[0].id);\n } else {\n setCurrentThreadId(null);\n setCurrentThreadExternalId(null);\n setMessages([]);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n }\n }\n\n if (!isPlaceholder) {\n try {\n await deleteThreadApi(threadId, getRequestHeaders);\n } catch (error) {\n console.error('Failed to delete thread:', error);\n // Refetch to restore state on error\n if (userId) {\n await fetchAndSetThreadsState(userId, currentThreadExternalIdRef.current);\n }\n }\n }\n }, [userId, fetchAndSetThreadsState, loadThreadMessages, getRequestHeaders]);\n\n const handleStop = useCallback(() => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n setMessages((prev) => {\n // Check if any message needs updating before creating new array\n const hasStreaming = prev.some((msg) => msg.isStreaming);\n if (!hasStreaming) return prev;\n return prev.map((msg) => (msg.isStreaming ? closeAssistantMessage(msg) : msg));\n });\n }, []);\n\n const handleStreamAssetEvent = useCallback((payload: any, assistantMessageId: string) => {\n // Handle ASSET_CREATED event from copilotz\n if (!payload?.dataUrl) return;\n\n const mimeType = payload.mime || 'image/png';\n const dataUrl = payload.dataUrl;\n\n // Determine attachment kind based on mime type\n let kind: 'image' | 'audio' | 'video' = 'image';\n if (mimeType.startsWith('audio/')) {\n kind = 'audio';\n } else if (mimeType.startsWith('video/')) {\n kind = 'video';\n }\n\n const mediaAttachment: MediaAttachment = {\n kind,\n dataUrl,\n mimeType,\n };\n\n setMessages((prev) => prev.map((msg) => (msg.id === assistantMessageId\n ? syncAssistantActivity({\n ...msg,\n attachments: [...(msg.attachments || []), mediaAttachment],\n })\n : msg)));\n }, []);\n\n const sendCopilotzMessage = useCallback(async (\n params: {\n threadId?: string | null;\n threadExternalId?: string | null;\n content: string;\n attachments?: MediaAttachment[];\n metadata?: Record<string, unknown>;\n threadMetadata?: Record<string, unknown>;\n toolCalls?: Array<{ name: string; args: Record<string, unknown> }>;\n userId: string;\n userName?: string;\n userMetadata?: Record<string, unknown>;\n agentName?: string | null;\n onBeforeStart?: (assistantMessageId: string) => void;\n },\n ) => {\n // Track the current live assistant message so one sender streak stays in one bubble.\n let currentAssistantId = generateId();\n let currentAssistantIdentity: AgentIdentity = {};\n params.onBeforeStart?.(currentAssistantId);\n\n let hasStreamProgress = false;\n\n // Combined function to ensure bubble exists AND update content in a single setMessages call\n const updateStreamingMessage = (\n partial: string,\n opts?: {\n isReasoning?: boolean;\n agent?: { id?: string | null; name?: string | null } | null;\n },\n ) => {\n if (partial && partial.length > 0) {\n hasStreamProgress = true;\n }\n\n const isReasoning = opts?.isReasoning ?? false;\n const nextIdentity = normalizeAgentIdentity(opts?.agent ?? null);\n if (nextIdentity.senderAgentId || nextIdentity.senderName) {\n currentAssistantIdentity = {\n ...currentAssistantIdentity,\n ...nextIdentity,\n };\n }\n const agentIdentity = currentAssistantIdentity;\n const nextAgentKey = agentIdentity.senderAgentId ?? agentIdentity.senderName ?? null;\n\n const applyUpdate = (msg: InternalChatMessage): InternalChatMessage => {\n return updateAssistantMessageToken(msg, {\n partial,\n isReasoning,\n agentIdentity,\n });\n };\n \n setMessages((prev) => {\n const idx = prev.findIndex((m) => m.id === currentAssistantId);\n if (idx >= 0 && canAttachToStreamingAssistant(prev[idx], nextAgentKey)) {\n const msg = prev[idx];\n const next = applyUpdate(msg);\n if (msg.content === next.content && msg._activityReasoning === next._activityReasoning && msg._activityReasoningStreaming === next._activityReasoningStreaming && msg.isStreaming === next.isStreaming && msg.isComplete === next.isComplete) {\n return prev;\n }\n const updated = [...prev];\n updated[idx] = next;\n return updated;\n }\n \n const last = prev[prev.length - 1];\n if (canAttachToStreamingAssistant(last, nextAgentKey)) {\n currentAssistantId = last.id;\n const next = applyUpdate(last);\n if (last.content === next.content && last._activityReasoning === next._activityReasoning && last._activityReasoningStreaming === next._activityReasoningStreaming && last.isStreaming === next.isStreaming && last.isComplete === next.isComplete) {\n return prev;\n }\n const updated = [...prev];\n updated[prev.length - 1] = next;\n return updated;\n }\n \n const lastStreamingBelongsToDifferentAgent =\n Boolean(nextAgentKey) &&\n last?.role === 'assistant' &&\n last.isStreaming &&\n Boolean(messageAgentKey(last)) &&\n messageAgentKey(last) !== nextAgentKey;\n\n if (\n !prev.length ||\n (prev[prev.length - 1].role !== 'assistant' || !prev[prev.length - 1].isStreaming) ||\n lastStreamingBelongsToDifferentAgent\n ) {\n const newId = generateId();\n currentAssistantId = newId;\n const base: InternalChatMessage = {\n id: newId,\n role: 'assistant' as const,\n content: '',\n timestamp: nowTs(),\n isStreaming: true,\n isComplete: false,\n ...currentAssistantIdentity,\n };\n return [...prev, applyUpdate(base)];\n }\n \n return prev;\n });\n };\n\n const finalizeCurrentAssistantBubble = () => {\n setMessages((prev) => {\n const idx = prev.findIndex((m) => m.id === currentAssistantId);\n if (idx < 0) return prev;\n const msg = prev[idx];\n // Skip update if already finalized\n if (!msg.isStreaming && msg.isComplete) return prev;\n const updated = [...prev];\n updated[idx] = closeAssistantMessage(msg);\n return updated;\n });\n };\n\n // Using Refs for accessing current state inside callback\n const curThreadId = currentThreadIdRef.current;\n\n const applyLiveToolResultUpdate = (update: ToolResultUpdate) => {\n let matched = false;\n setMessages((prev) => {\n const next = applyToolResultUpdateToMessages(prev, update, {\n isStreaming: true,\n isComplete: false,\n });\n matched = next.matched;\n return next.matched ? next.messages : prev;\n });\n\n if (!matched) {\n liveToolUpdatesRef.current.push(update);\n }\n };\n\n const finalizeActiveAssistantTurn = (finalAnswer?: string) => {\n setMessages((prev) => {\n const currentIdx = prev.findIndex((message) => (\n message.id === currentAssistantId &&\n message.role === 'assistant'\n ));\n const fallbackIdx = currentIdx >= 0\n ? currentIdx\n : (() => {\n for (let i = prev.length - 1; i >= 0; i--) {\n if (prev[i].role === 'assistant' && prev[i].isStreaming) {\n return i;\n }\n }\n return -1;\n })();\n\n if (fallbackIdx < 0) return prev;\n\n const message = prev[fallbackIdx];\n const nextMessage = finalizeAssistantMessage(message, finalAnswer);\n\n if (\n message.content === nextMessage.content &&\n message.isStreaming === nextMessage.isStreaming &&\n message.isComplete === nextMessage.isComplete &&\n message._activityReasoningStreaming === nextMessage._activityReasoningStreaming\n ) {\n return prev;\n }\n\n const updated = [...prev];\n updated[fallbackIdx] = nextMessage;\n currentAssistantId = nextMessage.id;\n return updated;\n });\n };\n\n // Build a ServerMessage-like object from selected streaming artifact events.\n const toServerMessageFromEvent = async (event: any): Promise<ServerMessage | null> => {\n if (!event) return null;\n const type = (event?.type as string) || '';\n const payload = event?.payload ?? event;\n\n // TOOL_CALL bubble\n if (type === 'TOOL_CALL') {\n const parsedToolCall = extractLiveToolCall(payload);\n if (!parsedToolCall) return null;\n\n return {\n id: generateId(),\n threadId: curThreadId ?? '',\n senderType: 'tool',\n content: '',\n toolCalls: [{\n id: parsedToolCall.id ?? generateId(),\n name: parsedToolCall.name,\n args: parsedToolCall.arguments,\n ...(parsedToolCall.result !== undefined ? { output: parsedToolCall.result } : {}),\n status: parsedToolCall.status,\n }] as Array<Record<string, unknown>>,\n } as unknown as ServerMessage;\n }\n\n return null;\n };\n\n const abortController = new AbortController();\n abortControllerRef.current?.abort();\n abortControllerRef.current = abortController;\n setIsStreaming(true);\n // Reset the live tool-result buffer at the start of every stream so\n // stale updates from a previous run can't leak into this one.\n liveToolUpdatesRef.current = [];\n\n try {\n const normalizedUserMetadata = params.userMetadata\n ? JSON.parse(JSON.stringify(params.userMetadata)) as Record<string, unknown>\n : undefined;\n\n const contextSeed = userContextSeedRef.current;\n const contextMetadata = contextSeed\n ? JSON.parse(JSON.stringify(contextSeed)) as Record<string, unknown>\n : undefined;\n const requestContent = params.content && params.content.length > 0 ? params.content : '';\n\n const metadataKey = params.threadId ?? params.threadExternalId ?? undefined;\n // Read from ref to avoid dependency on threadMetadataMap\n const currentThreadMetadataMap = threadMetadataMapRef.current;\n const messageMetadata = metadataKey ? currentThreadMetadataMap[metadataKey]?.userContext as Record<string, unknown> | undefined : undefined;\n const threadMetadata = metadataKey ? currentThreadMetadataMap[metadataKey] : undefined;\n\n const mergedMetadata = {\n ...(messageMetadata ?? {}),\n ...(params.metadata ?? {}),\n } as Record<string, unknown>;\n\n const finalMetadata = Object.keys(mergedMetadata).length > 0 ? mergedMetadata : undefined;\n\n await runCopilotzStream({\n threadId: params.threadId ?? undefined,\n threadExternalId: params.threadExternalId ?? undefined,\n content: requestContent,\n user: {\n externalId: params.userId,\n name: params.userName ?? params.userId,\n metadata: {\n ...(contextMetadata ? contextMetadata : {}),\n ...(normalizedUserMetadata ?? {}),\n },\n },\n attachments: params.attachments,\n metadata: finalMetadata,\n threadMetadata: params.threadMetadata ?? threadMetadata,\n toolCalls: params.toolCalls,\n selectedAgent: params.agentName ?? preferredAgentRef.current ?? null,\n participants: participantsRef.current,\n targetAgent: targetAgentNameRef.current,\n getRequestHeaders,\n onToken: (token, _isComplete, raw, opts) => updateStreamingMessage(token, {\n ...opts,\n agent: raw?.payload?.agent ?? raw?.agent ?? null,\n }),\n onMessageEvent: async (event: any) => {\n const intercepted = applyEventInterceptor(event);\n if (intercepted?.handled) {\n return;\n }\n\n const type = (event?.type as string) || '';\n const payload = getEventPayload(event);\n\n if (type === 'TOOL_RESULT') {\n processToolOutput((payload ?? {}) as Record<string, unknown>);\n applyLiveToolResultUpdate(extractLiveToolResultUpdate(\n (payload ?? {}) as Record<string, unknown>,\n ));\n return;\n }\n\n if (type === 'LLM_RESULT') {\n const finalAnswer = typeof payload?.answer === 'string' ? payload.answer : undefined;\n finalizeActiveAssistantTurn(finalAnswer);\n return;\n }\n\n if (type === 'MESSAGE' || type === 'NEW_MESSAGE') {\n return;\n }\n\n // TOOL_CALL events: render inside current assistant bubble.\n // NOTE: This branch stays synchronous so any immediately following\n // TOOL_RESULT can reconcile against the rendered tool call.\n if (type === 'TOOL_CALL') {\n const parsedToolCall = extractLiveToolCall(\n (payload ?? {}) as Record<string, unknown>,\n );\n if (!parsedToolCall) return;\n const eventAgentIdentity = resolveLiveAgentIdentity(event);\n if (eventAgentIdentity.senderAgentId || eventAgentIdentity.senderName) {\n currentAssistantIdentity = {\n ...currentAssistantIdentity,\n ...eventAgentIdentity,\n };\n }\n const callId = parsedToolCall.id ?? generateId();\n const toolName = parsedToolCall.name;\n\n // Drain any tool-result updates that arrived before this TOOL_CALL.\n const bufferedUpdates = liveToolUpdatesRef.current;\n const matchingUpdateIndex = bufferedUpdates.findIndex((upd) => (\n matchesToolResultUpdate({ id: callId, name: toolName }, upd)\n ));\n const bufferedUpdate = matchingUpdateIndex >= 0 ? bufferedUpdates[matchingUpdateIndex] : undefined;\n if (matchingUpdateIndex >= 0) {\n bufferedUpdates.splice(matchingUpdateIndex, 1);\n }\n\n const initialStatus: 'pending' | 'running' | 'completed' | 'failed' =\n bufferedUpdate ? bufferedUpdate.status : parsedToolCall.status;\n const initialResult = bufferedUpdate && bufferedUpdate.result !== undefined\n ? bufferedUpdate.result\n : parsedToolCall.result;\n const endTime = bufferedUpdate?.endTime;\n\n setMessages((prev) =>\n (() => {\n const appendToolCall = (msg: ChatViewMessage) => ({\n ...appendAssistantToolCall(msg, {\n id: callId,\n name: toolName,\n arguments: parsedToolCall.arguments,\n ...(initialResult !== undefined ? { result: initialResult } : {}),\n status: initialStatus,\n startTime: Date.now(),\n ...(endTime !== undefined ? { endTime } : {}),\n }),\n });\n\n const currentIdx = prev.findIndex((message) => (\n message.id === currentAssistantId &&\n message.role === 'assistant' &&\n message.isStreaming\n ));\n if (currentIdx >= 0) {\n const next = [...prev];\n next[currentIdx] = appendToolCall({\n ...next[currentIdx],\n isStreaming: true,\n isComplete: false,\n ...currentAssistantIdentity,\n });\n return next;\n }\n\n const last = prev[prev.length - 1];\n if (canAttachToStreamingAssistant(\n last,\n currentAssistantIdentity.senderAgentId ?? currentAssistantIdentity.senderName ?? null,\n )) {\n currentAssistantId = last.id;\n const next = [...prev];\n next[prev.length - 1] = appendToolCall({\n ...last,\n isStreaming: true,\n isComplete: false,\n ...currentAssistantIdentity,\n });\n return next;\n }\n\n // No assistant message yet – create one to host the tool call\n const newId = generateId();\n currentAssistantId = newId;\n return [\n ...prev,\n appendToolCall({\n id: newId,\n role: 'assistant',\n content: '',\n timestamp: nowTs(),\n isStreaming: true,\n isComplete: false,\n ...currentAssistantIdentity,\n }),\n ];\n })(),\n );\n hasStreamProgress = true;\n return;\n }\n\n // Other event types (ASSET_CREATED, etc.) should render as their own bubbles\n const sm = await toServerMessageFromEvent(event);\n if (sm) {\n const viewMsg = convertServerMessage(sm as unknown as ServerMessage);\n finalizeCurrentAssistantBubble();\n setMessages((prev) => [...prev, viewMsg]);\n return;\n }\n\n // Fallback for unknown events\n handleStreamMessageEvent(event);\n },\n onAssetEvent: async (payload: any) => {\n const intercepted = applyEventInterceptor({ type: 'ASSET_CREATED', payload });\n if (intercepted?.handled) {\n return;\n }\n\n // Treat as ASSET_CREATED event in unified handler\n await (async () => {\n if (!hasStreamProgress) return;\n handleStreamAssetEvent(payload, currentAssistantId);\n })();\n },\n signal: abortController.signal,\n });\n } finally {\n setIsStreaming(false);\n setMessages((prev) => {\n const hasStreaming = prev.some((msg) => msg.isStreaming);\n if (!hasStreaming) return prev;\n return prev.map((msg) => (msg.isStreaming\n ? closeAssistantMessage(msg)\n : msg));\n });\n abortControllerRef.current = null;\n }\n\n return currentAssistantId;\n }, [applyEventInterceptor, handleStreamMessageEvent, handleStreamAssetEvent, getRequestHeaders]);\n\n const handleSendMessage = useCallback(async (content: string, attachments: MediaAttachment[] = []) => {\n if (!content.trim() && attachments.length === 0) return;\n if (!userId) return;\n\n const timestamp = nowTs();\n const curThreadId = currentThreadIdRef.current;\n const curThreadExtId = currentThreadExternalIdRef.current;\n\n const existingThreadId = curThreadId ?? undefined;\n // Use Ref to check without adding dependency\n const extMap = threadExternalIdMapRef.current;\n const isPlaceholderThread = existingThreadId\n ? extMap[existingThreadId] === existingThreadId\n : false;\n\n const threadIdForSend = isPlaceholderThread ? undefined : existingThreadId;\n\n let effectiveThreadExternalId = curThreadExtId ?? (isPlaceholderThread ? existingThreadId : undefined);\n\n if (!threadIdForSend) {\n if (!effectiveThreadExternalId) {\n effectiveThreadExternalId = generateId();\n }\n setCurrentThreadExternalId(effectiveThreadExternalId);\n } else if (curThreadExtId !== (effectiveThreadExternalId ?? null)) {\n setCurrentThreadExternalId(effectiveThreadExternalId ?? null);\n }\n\n const conversationKey = threadIdForSend ?? effectiveThreadExternalId!;\n\n // Get pending title for new threads if any\n const currentMetadata = threadMetadataMapRef.current[conversationKey];\n const pendingTitle = currentMetadata?.pendingTitle as string | undefined;\n\n const userMessage: ChatViewMessage = {\n id: generateId(),\n role: 'user',\n content,\n timestamp,\n attachments: attachments.length > 0 ? attachments : undefined,\n isComplete: true,\n };\n\n // Create an assistant message placeholder with streaming state for typewriter effect\n const assistantPlaceholder: ChatViewMessage = {\n id: generateId(),\n role: 'assistant',\n content: '',\n timestamp: timestamp + 1,\n isStreaming: true,\n isComplete: false,\n ...(targetAgentNameRef.current ? { senderName: targetAgentNameRef.current } : {}),\n };\n\n // Add user message and assistant placeholder for typewriter loading effect\n setMessages((prev) => [...prev, userMessage as InternalChatMessage, syncAssistantActivity(assistantPlaceholder as InternalChatMessage)]);\n setSpecialState(null);\n\n // Use ref for threads check\n if (!threadsRef.current.some(t => t.id === conversationKey)) {\n const newThread: ChatThread = {\n id: conversationKey,\n title: content.slice(0, 40) || 'Nova conversa',\n createdAt: timestamp,\n updatedAt: timestamp,\n messageCount: 0,\n };\n setThreads(prev => [newThread, ...prev]);\n setThreadMetadataMap(prev => ({ ...prev, [conversationKey]: {} }));\n setThreadExternalIdMap(prev => ({ ...prev, [conversationKey]: effectiveThreadExternalId ?? null }));\n }\n\n try {\n await sendCopilotzMessage({\n threadId: threadIdForSend,\n threadExternalId: effectiveThreadExternalId,\n content,\n attachments,\n userId,\n // userName can be anything, but let's try to find it in context or just fallback\n userName: (userContextSeedRef.current?.profile as any)?.full_name ?? userId,\n agentName: preferredAgentRef.current,\n // Include pending title for new threads\n threadMetadata: pendingTitle ? { name: pendingTitle } : undefined,\n });\n\n // Wait to ensure the assistant message is persisted before refreshing\n await new Promise((r) => setTimeout(r, 1000));\n // Refresh threads list to update metadata (message count, timestamps, etc.)\n // Don't reload messages since we already have them from streaming\n await fetchAndSetThreadsState(userId, effectiveThreadExternalId ?? existingThreadId ?? null);\n } catch (error) {\n if (isAbortError(error)) return;\n console.error('Error sending Copilotz message', error);\n const nextSpecialState = getSpecialStateFromError(error);\n if (nextSpecialState) {\n setSpecialState(nextSpecialState);\n setMessages((prev) => prev.filter((msg) => !msg.isStreaming));\n return;\n }\n setMessages((prev) => {\n const finalized = prev.map((msg) => (\n msg.isStreaming\n ? closeAssistantMessage(msg)\n : msg\n ));\n\n if (finalized.some(hasVisibleAssistantOutput)) {\n return finalized;\n }\n\n for (let i = finalized.length - 1; i >= 0; i--) {\n const message = finalized[i];\n if (message.role !== 'assistant') continue;\n\n const updated = [...finalized];\n updated[i] = syncAssistantActivity({\n ...message,\n content: 'Desculpe, ocorreu um erro ao gerar a resposta. Por favor, tente novamente.',\n isStreaming: false,\n isComplete: true,\n });\n return updated;\n }\n\n return [\n ...finalized,\n syncAssistantActivity({\n id: generateId(),\n role: 'assistant',\n content: 'Desculpe, ocorreu um erro ao gerar a resposta. Por favor, tente novamente.',\n timestamp: nowTs(),\n isStreaming: false,\n isComplete: true,\n }),\n ];\n });\n }\n }, [userId, fetchAndSetThreadsState, loadThreadMessages, sendCopilotzMessage, getSpecialStateFromError]);\n\n const bootstrapConversation = useCallback(async (uid: string) => {\n if (!bootstrap?.initialToolCalls && !bootstrap?.initialMessage) return;\n\n const bootstrapThreadExternalId = generateId();\n setCurrentThreadId(bootstrapThreadExternalId);\n setCurrentThreadExternalId(bootstrapThreadExternalId);\n setThreadExternalIdMap((prev) => ({ ...prev, [bootstrapThreadExternalId]: bootstrapThreadExternalId }));\n setThreadMetadataMap((prev) => ({ ...prev, [bootstrapThreadExternalId]: {} }));\n // Clear messages; let streaming create bubbles as needed\n setMessages([]);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n setSpecialState(null);\n\n try {\n await sendCopilotzMessage({\n threadExternalId: bootstrapThreadExternalId,\n content: bootstrap.initialMessage || '',\n toolCalls: bootstrap.initialToolCalls,\n userId: uid,\n agentName: preferredAgentRef.current,\n threadMetadata: {\n name: defaultThreadName || 'Main Thread',\n },\n });\n\n // Give the backend time to persist tool outputs/messages before refresh\n await new Promise((r) => setTimeout(r, 1000));\n\n // Refresh threads list to update metadata\n // Don't reload messages since we already have them from streaming\n await fetchAndSetThreadsState(uid, bootstrapThreadExternalId);\n } catch (error) {\n if (isAbortError(error)) return;\n console.error('Error bootstrapping conversation', error);\n const nextSpecialState = getSpecialStateFromError(error);\n if (nextSpecialState) {\n setSpecialState(nextSpecialState);\n setMessages([]);\n return;\n }\n setMessages([\n syncAssistantActivity({\n id: generateId(),\n role: 'assistant',\n content: 'Não foi possível iniciar a conversa. Tente novamente mais tarde.',\n timestamp: nowTs(),\n isStreaming: false,\n isComplete: true,\n }),\n ]);\n }\n }, [fetchAndSetThreadsState, loadThreadMessages, sendCopilotzMessage, bootstrap, defaultThreadName, getSpecialStateFromError]);\n\n const reset = useCallback(() => {\n messagesRequestRef.current += 1;\n setThreads([]);\n setThreadMetadataMap({});\n setThreadExternalIdMap({});\n setCurrentThreadId(null);\n setCurrentThreadExternalId(null);\n setMessages([]);\n setUserContextSeed({});\n setIsMessagesLoading(false);\n setIsLoadingOlderMessages(false);\n setIsStreaming(false);\n setMessagePageInfo(createEmptyMessagePageInfo());\n persistedToolUpdatesRef.current = [];\n setSpecialState(null);\n abortControllerRef.current?.abort();\n }, []);\n\n // Initialize when userId changes\n useEffect(() => {\n if (userId) {\n // Guard against double initialization in StrictMode\n if (initializationRef.current.userId === userId && initializationRef.current.started) {\n return;\n }\n initializationRef.current = { userId, started: true };\n\n const init = async () => {\n // Use URL thread ID as preferred if available\n const urlPreferredThread = isUrlSyncEnabled ? urlState.threadId : undefined;\n const preferredThreadId = await fetchAndSetThreadsState(userId, urlPreferredThread);\n if (preferredThreadId) {\n await loadThreadMessages(preferredThreadId);\n } else if (bootstrap) {\n await bootstrapConversation(userId);\n }\n };\n init();\n } else {\n initializationRef.current = { userId: null, started: false };\n reset();\n }\n // urlState.threadId intentionally excluded: only needed on first init (captured\n // by the lazy initializer in useUrlState). Including it would re-trigger the\n // effect when the thread-sync effect writes back to the URL.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [userId, fetchAndSetThreadsState, loadThreadMessages, bootstrapConversation, reset, bootstrap, isUrlSyncEnabled]);\n\n // Sync currentThreadExternalId to URL when it changes\n useEffect(() => {\n if (!isUrlSyncEnabled) return;\n // Only sync after initial load is complete\n if (!initializationRef.current.started) return;\n \n setUrlThreadId(currentThreadExternalId);\n }, [currentThreadExternalId, isUrlSyncEnabled, setUrlThreadId]);\n\n // Sync metadata map effects\n useEffect(() => {\n if (!currentThreadId) return;\n const metadata = threadMetadataMap[currentThreadId];\n if (!metadata) return;\n\n if (metadata.userContext && typeof metadata.userContext === 'object') {\n setUserContextSeed((prev) => ({ ...prev, ...(metadata.userContext as Partial<ChatUserContext>) }));\n }\n }, [currentThreadId, threadMetadataMap]);\n\n return {\n messages: messages.map(toPublicChatMessage),\n isMessagesLoading,\n isLoadingOlderMessages,\n messagePageInfo,\n threads,\n currentThreadId,\n isStreaming,\n specialState,\n clearSpecialState,\n userContextSeed,\n sendMessage: handleSendMessage,\n createThread: handleCreateThread,\n selectThread: handleSelectThread,\n renameThread: handleRenameThread,\n archiveThread: handleArchiveThread,\n deleteThread: handleDeleteThread,\n stopGeneration: handleStop,\n fetchAndSetThreadsState,\n loadThreadMessages,\n loadOlderMessages,\n reset,\n };\n}\n","import type { AgentOption, MediaAttachment } from \"@copilotz/chat-ui\";\n\nconst rawBaseValue = import.meta.env?.VITE_API_URL;\nconst rawBase = typeof rawBaseValue === \"string\" && rawBaseValue.length > 0\n ? rawBaseValue\n : \"/api\";\nconst normalizedBase = rawBase.replace(/\\/$/, \"\");\nconst API_BASE =\n normalizedBase.startsWith(\"http\") || normalizedBase.startsWith(\"/\")\n ? normalizedBase\n : `/${normalizedBase}`;\n\nexport const apiUrl = (path: string) => `${API_BASE}${path}`;\nexport const apiUrlObject = (path: string) => new URL(apiUrl(path), window.location.origin);\n\nconst runtimeProcess: typeof process | undefined =\n typeof process !== \"undefined\" ? process : undefined;\n\nconst API_KEY = (() => {\n const env =\n (import.meta as { env?: Record<string, string | undefined> }).env ?? {};\n const candidates = [\n env.VITE_API_KEY,\n env.VITE_COPILOTZ_API_KEY,\n runtimeProcess?.env?.COPILOTZ_API_KEY,\n runtimeProcess?.env?.API_KEY,\n ];\n return candidates.find((value) =>\n typeof value === \"string\" && value.length > 0\n );\n})();\n\nexport type RequestHeadersProvider = () =>\n | Record<string, string>\n | Promise<Record<string, string>>;\n\nexport const withAuthHeaders = async (\n headers: Record<string, string> = {},\n getRequestHeaders?: RequestHeadersProvider,\n): Promise<Record<string, string>> => {\n const providedHeaders = getRequestHeaders\n ? await getRequestHeaders()\n : undefined;\n if (providedHeaders && Object.keys(providedHeaders).length > 0) {\n return { ...headers, ...providedHeaders };\n }\n if (API_KEY) {\n return { ...headers, Authorization: `Bearer ${API_KEY}` };\n }\n return headers;\n};\n\ntype RestThread = {\n id: string;\n name?: string | null;\n externalId?: string | null;\n description?: string | null;\n participants?: string[] | null;\n status?: string | null;\n metadata?: Record<string, unknown> | null;\n createdAt?: string;\n updatedAt?: string;\n};\n\ntype AgentApiItem = {\n id: string;\n name: string;\n description?: string | null;\n};\n\ntype RestMessage = {\n id: string;\n threadId: string;\n senderId?: string | null;\n senderType: string;\n senderUserId?: string | null;\n content?: string | null;\n reasoning?: string | null;\n metadata?: Record<string, unknown> | null;\n toolCalls?: Array<Record<string, unknown>> | null;\n createdAt?: string;\n updatedAt?: string;\n};\n\nexport type RestMessagePageInfo = {\n hasMoreBefore: boolean;\n oldestMessageId: string | null;\n newestMessageId: string | null;\n};\n\nexport type RestMessagePage = {\n data: RestMessage[];\n pageInfo: RestMessagePageInfo;\n};\n\nconst buildFallbackPageInfo = (\n data: RestMessage[],\n): RestMessagePageInfo => ({\n hasMoreBefore: false,\n oldestMessageId: data[0]?.id ?? null,\n newestMessageId: data[data.length - 1]?.id ?? null,\n});\n\ntype MessageSenderType = \"agent\" | \"user\" | \"tool\" | \"system\";\n\ntype MessageContent =\n | string\n | Array<\n | { type: \"text\"; text: string }\n | {\n type: \"image\";\n url?: string;\n dataBase64?: string;\n mimeType?: string;\n alt?: string;\n }\n | {\n type: \"audio\";\n url?: string;\n dataBase64?: string;\n mimeType?: string;\n transcript?: string;\n }\n | {\n type: \"file\";\n url?: string;\n dataBase64?: string;\n mimeType?: string;\n name?: string;\n }\n | { type: \"json\"; value: unknown }\n >;\n\ntype MessageToolCall = {\n id?: string | null;\n name: string;\n args: Record<string, unknown>;\n};\n\ntype MessageThread = {\n id?: string | null;\n name?: string | null;\n description?: string | null;\n externalId?: string | null;\n participants?: string[] | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype MessageSender = {\n id?: string | null;\n externalId?: string | null;\n type: MessageSenderType;\n name?: string | null;\n identifierType?: \"id\" | \"name\" | \"email\" | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype MessagePayload = {\n content: MessageContent;\n sender: MessageSender;\n thread?: MessageThread | null;\n toolCalls?: MessageToolCall[] | null;\n target?: string | null;\n targetQueue?: string[] | null;\n metadata?: Record<string, unknown> | null;\n};\n\ntype StreamCallbacks = {\n onToken?: (\n token: string,\n isComplete: boolean,\n raw?: any,\n options?: { isReasoning?: boolean },\n ) => void;\n onMessageEvent?: (payload: any) => void;\n onAssetEvent?: (payload: any) => void;\n signal?: AbortSignal;\n};\n\ntype RunOptions = {\n threadId?: string;\n threadExternalId?: string;\n content: string;\n user: {\n externalId: string;\n name?: string;\n email?: string;\n metadata?: Record<string, unknown>;\n };\n attachments?: MediaAttachment[];\n metadata?: Record<string, unknown>;\n threadMetadata?: Record<string, unknown>;\n toolCalls?: Array<\n { name: string; args: Record<string, unknown>; id?: string }\n >;\n selectedAgent?: string | null;\n /** Agent participants in the thread (multi-agent). Overrides selectedAgent for thread.participants when provided. */\n participants?: string[] | null;\n /** Explicit target agent for this message (who should respond). Maps to MessagePayload.target. */\n targetAgent?: string | null;\n getRequestHeaders?: RequestHeadersProvider;\n} & StreamCallbacks;\n\nexport type CopilotzStreamResult = {\n text: string;\n messages: any[];\n media: Record<string, string> | null;\n};\n\nexport class CopilotzRequestError extends Error {\n status: number;\n code?: string;\n details?: unknown;\n\n constructor(\n message: string,\n options: { status: number; code?: string; details?: unknown },\n ) {\n super(message);\n this.name = \"CopilotzRequestError\";\n this.status = options.status;\n this.code = options.code;\n this.details = options.details;\n }\n}\n\nconst SSE_LINE_BREAK = \"\\n\\n\";\n\nconst appendChunk = (buffer: string, chunk: string): string => {\n if (!buffer) return chunk;\n if (!chunk) return buffer;\n if (chunk.startsWith(buffer)) return chunk;\n if (buffer.startsWith(chunk)) return buffer;\n const maxOverlap = Math.min(buffer.length, chunk.length);\n for (let i = maxOverlap; i > 0; i--) {\n if (buffer.endsWith(chunk.slice(0, i))) {\n return buffer + chunk.slice(i);\n }\n }\n return buffer + chunk;\n};\n\nconst parseErrorText = (rawText: string): unknown => {\n if (!rawText) return null;\n try {\n return JSON.parse(rawText);\n } catch {\n return null;\n }\n};\n\nconst toAttachmentPayload = (attachments?: MediaAttachment[]) => {\n if (!attachments || attachments.length === 0) return undefined;\n return attachments.map((att) => {\n const base = {\n kind: att.kind,\n dataUrl: att.dataUrl,\n mimeType: att.mimeType,\n fileName: att.fileName,\n };\n if (att.kind === \"audio\" || att.kind === \"video\") {\n return {\n ...base,\n durationMs: att.durationMs,\n ...(att.kind === \"video\" && \"poster\" in att\n ? { poster: att.poster }\n : {}),\n };\n }\n return base;\n });\n};\n\n// --- Audio helpers: convert browser-recorded WebM/Opus to WAV (16-bit PCM) ---\nconst base64FromUint8 = (bytes: Uint8Array): string => {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let i = 0; i < bytes.length; i += chunkSize) {\n const chunk = bytes.subarray(i, i + chunkSize);\n binary += String.fromCharCode.apply(null, Array.from(chunk));\n }\n // btoa is available in browsers\n return btoa(binary);\n};\n\nconst parseDataUrl = (\n dataUrl: string,\n): { mime: string; base64: string } | null => {\n const match = dataUrl.match(/^data:(.+?);base64,(.+)$/s);\n if (!match) return null;\n return { mime: match[1], base64: match[2] };\n};\n\nconst dataUrlToArrayBuffer = (dataUrl: string): ArrayBuffer => {\n const parsed = parseDataUrl(dataUrl);\n if (!parsed) return new ArrayBuffer(0);\n const binaryString = atob(parsed.base64);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n};\n\nconst encodeWav16BitPCM = (audioBuffer: AudioBuffer): Uint8Array => {\n const numChannels = audioBuffer.numberOfChannels;\n const sampleRate = audioBuffer.sampleRate;\n const numFrames = audioBuffer.length;\n const bytesPerSample = 2; // 16-bit\n const dataSize = numFrames * numChannels * bytesPerSample;\n const buffer = new ArrayBuffer(44 + dataSize);\n const view = new DataView(buffer);\n\n // RIFF header\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n let offset = 0;\n writeString(offset, \"RIFF\");\n offset += 4;\n view.setUint32(offset, 36 + dataSize, true);\n offset += 4;\n writeString(offset, \"WAVE\");\n offset += 4;\n\n // fmt subchunk\n writeString(offset, \"fmt \");\n offset += 4;\n view.setUint32(offset, 16, true);\n offset += 4; // Subchunk1Size (16 for PCM)\n view.setUint16(offset, 1, true);\n offset += 2; // AudioFormat (1 = PCM)\n view.setUint16(offset, numChannels, true);\n offset += 2; // NumChannels\n view.setUint32(offset, sampleRate, true);\n offset += 4; // SampleRate\n view.setUint32(offset, sampleRate * numChannels * bytesPerSample, true);\n offset += 4; // ByteRate\n view.setUint16(offset, numChannels * bytesPerSample, true);\n offset += 2; // BlockAlign\n view.setUint16(offset, 16, true);\n offset += 2; // BitsPerSample\n\n // data subchunk\n writeString(offset, \"data\");\n offset += 4;\n view.setUint32(offset, dataSize, true);\n offset += 4;\n\n // Interleave channels and write PCM samples\n const channelData: Float32Array[] = [];\n for (let ch = 0; ch < numChannels; ch++) {\n channelData.push(audioBuffer.getChannelData(ch));\n }\n\n let idx = 0;\n for (let i = 0; i < numFrames; i++) {\n for (let ch = 0; ch < numChannels; ch++) {\n let sample = channelData[ch][i];\n // Clamp\n sample = Math.max(-1, Math.min(1, sample));\n // Convert to 16-bit PCM\n const s = sample < 0 ? sample * 0x8000 : sample * 0x7FFF;\n view.setInt16(offset + idx, s, true);\n idx += 2;\n }\n }\n\n return new Uint8Array(buffer);\n};\n\nconst convertAudioDataUrlToWavBase64 = async (\n dataUrl: string,\n): Promise<string | null> => {\n try {\n const ab = dataUrlToArrayBuffer(dataUrl);\n const ctx =\n new (window.AudioContext || (window as any).webkitAudioContext)();\n const audioBuffer = await ctx.decodeAudioData(ab.slice(0)); // ensure detached buffer\n // Optionally downsample here if desired; we'll keep source sampleRate.\n const wavBytes = encodeWav16BitPCM(audioBuffer);\n return base64FromUint8(wavBytes);\n } catch (_err) {\n return null;\n }\n};\n\nexport async function runCopilotzStream(\n options: RunOptions,\n): Promise<CopilotzStreamResult> {\n const {\n threadId,\n threadExternalId,\n content,\n user,\n attachments,\n metadata,\n threadMetadata,\n toolCalls,\n selectedAgent,\n participants,\n targetAgent,\n getRequestHeaders,\n onToken,\n onMessageEvent,\n onAssetEvent,\n signal,\n } = options;\n\n const controller = new AbortController();\n if (signal) {\n signal.addEventListener(\"abort\", () => controller.abort(signal.reason), {\n once: true,\n });\n }\n\n // Audio attachments are sent as content parts and also mirrored in metadata\n // so the persisted message can render the same media after reload.\n const audioAttachments = attachments?.filter((att) => att.kind === \"audio\") ??\n [];\n const attachmentPayload = toAttachmentPayload(attachments);\n\n const normalizedToolCalls = toolCalls?.map<MessageToolCall>((call) => ({\n id: call.id ?? crypto.randomUUID(),\n name: call.name,\n args: call.args ?? {},\n })) ?? [];\n\n const metadataToolCalls = normalizedToolCalls.length > 0\n ? normalizedToolCalls.map((tc) => ({\n id: tc.id ?? undefined,\n name: tc.name,\n args: JSON.stringify(tc.args ?? {}),\n }))\n : undefined;\n\n const baseMetadata = {\n ...(metadata ?? {}),\n ...(attachmentPayload ? { attachments: attachmentPayload } : {}),\n ...(metadataToolCalls ? { toolCalls: metadataToolCalls } : {}),\n userExternalId: user.externalId,\n } as Record<string, unknown>;\n\n const messageMetadata = Object.keys(baseMetadata).length > 0\n ? baseMetadata\n : undefined;\n\n const senderMetadata = {\n ...(user.metadata ?? {}),\n ...(user.email ? { email: user.email } : {}),\n } as Record<string, unknown>;\n\n const mergedThreadMetadata = {\n ...(threadMetadata ?? {}),\n } as Record<string, unknown>;\n\n if (mergedThreadMetadata.userExternalId === undefined) {\n mergedThreadMetadata.userExternalId = user.externalId;\n }\n\n // Extract name from threadMetadata if present\n const threadName = (mergedThreadMetadata.name as string) ?? null;\n // Remove name from metadata since it's a top-level field\n const { name: _threadName, ...restThreadMetadata } = mergedThreadMetadata;\n\n // Always include the user as a thread participant so the thread is\n // discoverable via participantId queries after page refresh.\n const baseParticipants: string[] =\n Array.isArray(participants) && participants.length > 0\n ? participants\n : [selectedAgent || \"assistant\"];\n const resolvedParticipants: string[] = user.externalId &&\n !baseParticipants.includes(user.externalId)\n ? [...baseParticipants, user.externalId]\n : baseParticipants;\n\n const resolvedTarget = targetAgent?.trim() || null;\n const toolCallSenderId = selectedAgent ||\n resolvedParticipants[0] || \"assistant\";\n\n const threadPayload: MessageThread | undefined =\n (threadId || threadExternalId || threadName ||\n Object.keys(restThreadMetadata).length > 0)\n ? {\n id: threadId ?? null,\n externalId: threadExternalId ?? null,\n name: threadName,\n participants: resolvedParticipants,\n metadata: Object.keys(restThreadMetadata).length > 0\n ? restThreadMetadata\n : null,\n }\n : undefined;\n\n // Prepare audio parts (convert to WAV when needed)\n const preparedAudioParts: Array<\n {\n type: \"audio\";\n dataBase64?: string;\n url?: string;\n mimeType?: string;\n transcript?: string;\n }\n > = [];\n for (const audioAtt of audioAttachments) {\n if (!audioAtt.dataUrl) continue;\n const parsed = parseDataUrl(audioAtt.dataUrl);\n if (\n parsed &&\n (parsed.mime.includes(\"wav\") || parsed.mime.includes(\"mp3\") ||\n parsed.mime.includes(\"mpeg\"))\n ) {\n preparedAudioParts.push({\n type: \"audio\",\n dataBase64: parsed.base64,\n mimeType: parsed.mime.includes(\"wav\") ? \"audio/wav\" : \"audio/mp3\",\n });\n continue;\n }\n // Convert other formats (e.g., audio/webm) to WAV\n const wavBase64 = await convertAudioDataUrlToWavBase64(audioAtt.dataUrl);\n if (wavBase64) {\n preparedAudioParts.push({\n type: \"audio\",\n dataBase64: wavBase64,\n mimeType: \"audio/wav\",\n });\n } else {\n // Fallback: send as URL (may fail at provider side, but do not block)\n preparedAudioParts.push({\n type: \"audio\",\n url: audioAtt.dataUrl,\n mimeType: audioAtt.mimeType || \"audio/webm\",\n });\n }\n }\n\n // Build content array: include text and prepared audio parts\n const contentParts: MessageContent = (() => {\n const parts: Array<\n | { type: \"text\"; text: string }\n | {\n type: \"audio\";\n url?: string;\n dataBase64?: string;\n mimeType?: string;\n transcript?: string;\n }\n > = [];\n const text = (typeof content === \"string\" && content.trim().length > 0)\n ? content\n : \"\";\n parts.push({ type: \"text\", text });\n for (const p of preparedAudioParts) parts.push(p);\n if (parts.length === 1 && parts[0].type === \"text\") return parts[0].text;\n return parts;\n })();\n\n const payload: MessagePayload = {\n content: contentParts,\n sender: {\n type: normalizedToolCalls.length > 0 ? \"agent\" : \"user\",\n externalId: normalizedToolCalls.length > 0 ? toolCallSenderId : user.externalId,\n id: normalizedToolCalls.length > 0 ? toolCallSenderId : undefined,\n name: normalizedToolCalls.length > 0 ? toolCallSenderId : (user.name ?? null),\n metadata: Object.keys(senderMetadata).length > 0 ? senderMetadata : null,\n },\n metadata: messageMetadata ?? null,\n thread: threadPayload ?? null,\n toolCalls: normalizedToolCalls.length > 0 ? normalizedToolCalls : null,\n target: resolvedTarget,\n targetQueue: null,\n };\n\n const response = await fetch(apiUrl(\"/v1/providers/web\"), {\n method: \"POST\",\n headers: await withAuthHeaders({\n \"Content-Type\": \"application/json\",\n }, getRequestHeaders),\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n if (!response.ok || !response.body) {\n const errorText = await response.text().catch(() => response.statusText);\n const parsed = parseErrorText(errorText);\n const details = parsed && typeof parsed === \"object\" ? parsed : undefined;\n const detailsRecord = details as Record<string, unknown> | undefined;\n const message =\n (typeof detailsRecord?.message === \"string\" && detailsRecord.message) ||\n (typeof detailsRecord?.error === \"string\" && detailsRecord.error) ||\n errorText ||\n response.statusText ||\n \"Failed to run Copilotz agent\";\n const code = typeof detailsRecord?.code === \"string\"\n ? detailsRecord.code\n : (typeof detailsRecord?.error === \"string\" &&\n detailsRecord.error !== message\n ? detailsRecord.error\n : undefined);\n\n throw new CopilotzRequestError(message, {\n status: response.status,\n code,\n details,\n });\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n let aggregatedText = \"\";\n let aggregatedReasoning = \"\";\n let lastTokenWasReasoning = false;\n let hadNonReasoningContent = false;\n const collectedMessages: any[] = [];\n let collectedMedia: Record<string, string> | null = null;\n\n const processEvent = (eventChunk: string) => {\n if (!eventChunk.trim()) return;\n const lines = eventChunk.split(\"\\n\");\n let eventType = \"message\";\n let dataRaw = \"\";\n for (const line of lines) {\n if (line.startsWith(\"event:\")) {\n eventType = line.slice(6).trim();\n } else if (line.startsWith(\"data:\")) {\n dataRaw += line.slice(5).trim();\n }\n }\n\n if (!dataRaw) return;\n\n let payload: any;\n try {\n payload = JSON.parse(dataRaw);\n } catch (error) {\n console.warn(\n \"copilotzService: failed to parse SSE payload\",\n error,\n dataRaw,\n );\n return;\n }\n\n switch (eventType) {\n case \"TOKEN\": {\n const inner = payload?.payload ?? payload;\n const chunk = typeof inner?.token === \"string\" ? inner.token : \"\";\n const isReasoning = Boolean(inner?.isReasoning);\n if (isReasoning && !lastTokenWasReasoning && hadNonReasoningContent) {\n aggregatedReasoning = \"\";\n aggregatedText = \"\";\n hadNonReasoningContent = false;\n }\n lastTokenWasReasoning = isReasoning;\n if (!isReasoning) hadNonReasoningContent = true;\n if (chunk) {\n if (isReasoning) {\n aggregatedReasoning = appendChunk(aggregatedReasoning, chunk);\n } else {\n aggregatedText = appendChunk(aggregatedText, chunk);\n }\n }\n const isComplete = Boolean(inner?.isComplete);\n if (chunk || isComplete) {\n const tokenText = isReasoning ? aggregatedReasoning : aggregatedText;\n onToken?.(tokenText, isComplete, payload, { isReasoning });\n }\n break;\n }\n case \"NEW_MESSAGE\": {\n hadNonReasoningContent = true;\n lastTokenWasReasoning = false;\n collectedMessages.push(payload);\n onMessageEvent?.(payload);\n break;\n }\n case \"TOOL_CALL\": {\n hadNonReasoningContent = true;\n lastTokenWasReasoning = false;\n onMessageEvent?.(payload);\n break;\n }\n case \"TOOL_RESULT\":\n case \"LLM_RESULT\": {\n hadNonReasoningContent = true;\n lastTokenWasReasoning = false;\n onMessageEvent?.(payload);\n break;\n }\n case \"ASSET_CREATED\": {\n const assetPayload =\n (payload && typeof payload === \"object\" && \"payload\" in payload)\n ? (payload as { payload?: any }).payload\n : payload;\n // Convert ASSET_CREATED to media format for backward compatibility\n if (assetPayload?.dataUrl) {\n collectedMedia = {\n [assetPayload.assetId || \"0\"]: assetPayload.dataUrl,\n };\n }\n // Call the asset event handler\n onAssetEvent?.(assetPayload);\n break;\n }\n case \"ERROR\":\n throw new Error(payload?.error || \"Copilotz stream error\");\n default: {\n // Forward non-contract/custom events without turning them into\n // lifecycle primitives implicitly.\n const hasEnvelope =\n payload && typeof payload === \"object\" && \"type\" in payload;\n if (hasEnvelope) {\n onMessageEvent?.(payload);\n } else {\n onMessageEvent?.({ type: eventType, payload });\n }\n break;\n }\n }\n };\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n if (buffer.includes(\"\\r\")) {\n buffer = buffer.replace(/\\r/g, \"\");\n }\n\n let eventBoundary = buffer.indexOf(SSE_LINE_BREAK);\n while (eventBoundary >= 0) {\n const chunk = buffer.slice(0, eventBoundary);\n buffer = buffer.slice(eventBoundary + SSE_LINE_BREAK.length);\n processEvent(chunk);\n eventBoundary = buffer.indexOf(SSE_LINE_BREAK);\n }\n }\n\n if (buffer.length > 0) {\n processEvent(buffer);\n }\n\n return {\n text: aggregatedText,\n messages: collectedMessages,\n media: collectedMedia,\n };\n}\n\nexport async function fetchThreads(\n userId: string,\n getRequestHeaders?: RequestHeadersProvider,\n) {\n const params = new URLSearchParams();\n params.set(\"participantId\", userId);\n params.set(\"status\", \"all\");\n params.set(\"order\", \"desc\");\n\n const res = await fetch(apiUrl(`/v1/threads?${params.toString()}`), {\n headers: await withAuthHeaders(\n { Accept: \"application/json\" },\n getRequestHeaders,\n ),\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => res.statusText);\n throw new Error(errorText || `Failed to load threads (${res.status})`);\n }\n\n const { data } = await res.json();\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data as RestThread[];\n}\n\nexport async function fetchAgents(\n getRequestHeaders?: RequestHeadersProvider,\n): Promise<AgentOption[]> {\n const response = await fetch(apiUrl(\"/v1/agents\"), {\n method: \"GET\",\n headers: await withAuthHeaders(\n { Accept: \"application/json\" },\n getRequestHeaders,\n ),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n throw new Error(\n errorText || `Failed to fetch agents (${response.status})`,\n );\n }\n\n const payload = await response.json() as { data?: AgentApiItem[] };\n const data = Array.isArray(payload?.data) ? payload.data : [];\n\n return data.map((agent) => ({\n id: agent.id,\n name: agent.name,\n description: agent.description ?? undefined,\n }));\n}\n\nexport async function fetchThreadMessages(\n threadId: string,\n getRequestHeaders?: RequestHeadersProvider,\n) {\n const page = await fetchThreadMessagesPage(threadId, undefined, getRequestHeaders);\n return page.data;\n}\n\nexport async function fetchThreadMessagesPage(\n threadId: string,\n options?: {\n limit?: number;\n before?: string | null;\n },\n getRequestHeaders?: RequestHeadersProvider,\n): Promise<RestMessagePage> {\n const params = new URLSearchParams();\n params.set(\"limit\", String(options?.limit ?? 50));\n if (options?.before) {\n params.set(\"before\", options.before);\n }\n\n const res = await fetch(\n apiUrl(`/v1/threads/${threadId}/messages?${params.toString()}`),\n {\n headers: await withAuthHeaders(\n { Accept: \"application/json\" },\n getRequestHeaders,\n ),\n },\n );\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => res.statusText);\n throw new Error(\n errorText || `Failed to load thread messages (${res.status})`,\n );\n }\n\n const payload = await res.json();\n if (Array.isArray(payload)) {\n return {\n data: payload as RestMessage[],\n pageInfo: buildFallbackPageInfo(payload as RestMessage[]),\n };\n }\n if (Array.isArray(payload?.data)) {\n const data = payload.data as RestMessage[];\n const rawPageInfo = payload?.pageInfo;\n return {\n data,\n pageInfo: {\n hasMoreBefore: rawPageInfo?.hasMoreBefore === true,\n oldestMessageId: typeof rawPageInfo?.oldestMessageId === \"string\"\n ? rawPageInfo.oldestMessageId\n : data[0]?.id ?? null,\n newestMessageId: typeof rawPageInfo?.newestMessageId === \"string\"\n ? rawPageInfo.newestMessageId\n : data[data.length - 1]?.id ?? null,\n },\n };\n }\n return {\n data: [],\n pageInfo: {\n hasMoreBefore: false,\n oldestMessageId: null,\n newestMessageId: null,\n },\n };\n}\n\nexport async function updateThread(\n threadId: string,\n updates: Partial<RestThread>,\n getRequestHeaders?: RequestHeadersProvider,\n) {\n const res = await fetch(apiUrl(`/v1/threads/${threadId}`), {\n method: \"PATCH\",\n headers: await withAuthHeaders({\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n }, getRequestHeaders),\n body: JSON.stringify(updates),\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => res.statusText);\n throw new Error(errorText || `Failed to update thread (${res.status})`);\n }\n\n const data = await res.json();\n return data?.data ?? data?.body ?? data;\n}\n\nexport async function deleteThread(\n threadId: string,\n getRequestHeaders?: RequestHeadersProvider,\n) {\n const res = await fetch(apiUrl(`/v1/threads/${threadId}`), {\n method: \"DELETE\",\n headers: await withAuthHeaders(\n { Accept: \"application/json\" },\n getRequestHeaders,\n ),\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => res.statusText);\n throw new Error(errorText || `Failed to delete thread (${res.status})`);\n }\n\n return true;\n}\n\nexport const copilotzService = {\n apiUrl,\n apiUrlObject,\n withAuthHeaders,\n fetchAgents,\n runCopilotzStream,\n fetchThreads,\n fetchThreadMessages,\n updateThread,\n deleteThread,\n};\n","// Minimal API client for Copilotz assets\n\ntype FetchAssetResult = {\n assetId: string;\n ref: string;\n dataUrl?: string;\n base64?: string;\n mime?: string;\n error?: string;\n};\n\nconst rawBaseValue = (import.meta as { env?: Record<string, string | undefined> }).env?.VITE_API_URL;\nconst rawBase = typeof rawBaseValue === 'string' && rawBaseValue.length > 0 ? rawBaseValue : '/api';\nconst normalizedBase = rawBase.replace(/\\/$/, '');\nconst API_BASE = normalizedBase.startsWith('http') || normalizedBase.startsWith('/')\n ? normalizedBase\n : `/${normalizedBase}`;\n\nconst apiUrl = (path: string) => `${API_BASE}${path}`;\n\nconst extractAssetId = (refOrId: string) =>\n refOrId.startsWith('asset://') ? refOrId.slice('asset://'.length) : refOrId;\n\nexport async function getAssetDataUrl(refOrId: string): Promise<{ dataUrl: string; mime?: string; assetId: string }> {\n const id = extractAssetId(refOrId);\n const res = await fetch(apiUrl(`/v1/assets/${encodeURIComponent(id)}?format=dataUrl`), {\n method: 'GET',\n headers: { Accept: 'application/json' },\n });\n if (!res.ok) {\n const text = await res.text().catch(() => res.statusText);\n throw new Error(text || `Failed to fetch asset ${refOrId}`);\n }\n const body = (await res.json()) as { data?: FetchAssetResult } | FetchAssetResult;\n // Unified response envelope: `{ data }`. Tolerate legacy top-level shape.\n const data = (body as { data?: FetchAssetResult })?.data ?? (body as FetchAssetResult);\n if (!data?.dataUrl) {\n throw new Error(data?.error || `Asset ${refOrId} has no dataUrl`);\n }\n return { dataUrl: data.dataUrl, mime: data.mime, assetId: data.assetId };\n}\n\n// Resolve assets in messages by replacing metadata.attachments[].assetRef with dataUrl\ntype WithMetadata = {\n metadata?: Record<string, unknown> | null;\n};\n\nexport async function resolveAssetsInMessages<T extends WithMetadata>(messages: T[]): Promise<T[]> {\n // Deduplicate in-flight fetches so the same assetRef is resolved only once.\n const inFlightByRef = new Map<string, Promise<{ dataUrl: string; mime?: string; assetId: string }>>();\n\n const resolveAssetRef = (assetRef: string) => {\n if (!inFlightByRef.has(assetRef)) {\n inFlightByRef.set(assetRef, getAssetDataUrl(assetRef));\n }\n return inFlightByRef.get(assetRef)!;\n };\n\n return Promise.all(messages.map(async (msg) => {\n const meta = (msg.metadata ?? undefined) as Record<string, unknown> | undefined;\n const attachments = Array.isArray(meta?.attachments)\n ? (meta!.attachments as Array<Record<string, unknown>>)\n : undefined;\n\n if (!attachments || attachments.length === 0) {\n return msg;\n }\n\n const newAttachments = await Promise.all(attachments.map(async (att) => {\n const assetRef = typeof att?.assetRef === 'string' ? (att.assetRef as string) : undefined;\n if (!assetRef) return att;\n\n try {\n const { dataUrl, mime } = await resolveAssetRef(assetRef);\n const kind = typeof att.kind === 'string' ? (att.kind as string) : 'image';\n return {\n kind,\n dataUrl,\n mimeType: typeof att.mimeType === 'string' ? att.mimeType : (mime ?? undefined),\n } as Record<string, unknown>;\n } catch {\n // If fetching fails, keep original so UI can ignore gracefully\n return att;\n }\n }));\n\n const newMeta = { ...(meta ?? {}), attachments: newAttachments } as Record<string, unknown>;\n return { ...msg, metadata: newMeta };\n }));\n}\n\n","import { useState, useEffect, useCallback, useRef } from 'react';\n\n/**\n * Configuration for URL parameter names\n */\nexport interface UrlParamsConfig {\n /** URL param name for thread ID (default: 'thread') */\n thread?: string;\n /** URL param name for agent ID (default: 'agent') */\n agent?: string;\n /** URL param name for initial prompt (default: 'prompt') */\n prompt?: string;\n}\n\n/**\n * URL sync behavior configuration\n */\nexport interface UrlSyncConfig {\n /** Enable/disable URL sync (default: true) */\n enabled?: boolean;\n /** \n * How to update the URL when state changes:\n * - 'push': Creates browser history entries (back button works)\n * - 'replace': Updates URL without history entries (default)\n * - 'read-only': Only reads from URL, never writes\n */\n mode?: 'push' | 'replace' | 'read-only';\n /** Custom parameter names */\n params?: UrlParamsConfig;\n /**\n * Behavior for the prompt parameter:\n * - 'prefill': Pre-fills the input field (default)\n * - 'auto-send': Automatically sends the message on load\n */\n promptBehavior?: 'prefill' | 'auto-send';\n /**\n * Whether to clear the prompt param from URL after reading\n * Prevents re-sending on refresh (default: true)\n */\n clearPromptAfterRead?: boolean;\n}\n\n/**\n * State values parsed from URL\n */\nexport interface UrlState {\n threadId: string | null;\n agentId: string | null;\n prompt: string | null;\n}\n\n/**\n * Return type of useUrlState hook\n */\nexport interface UseUrlStateReturn {\n /** Current state parsed from URL */\n state: UrlState;\n /** Update thread ID in URL */\n setThreadId: (threadId: string | null) => void;\n /** Update agent ID in URL */\n setAgentId: (agentId: string | null) => void;\n /** Clear prompt from URL (call after consuming it) */\n clearPrompt: () => void;\n /** Whether URL sync is enabled */\n isEnabled: boolean;\n}\n\nconst DEFAULT_PARAMS: Required<UrlParamsConfig> = {\n thread: 'thread',\n agent: 'agent',\n prompt: 'prompt',\n};\n\n/**\n * Check if we're in a browser environment\n */\nconst isBrowser = typeof globalThis !== 'undefined' && typeof globalThis.location !== 'undefined';\n\n/**\n * Get current URL search params (SSR-safe)\n */\nconst getSearchParams = (): URLSearchParams => {\n if (!isBrowser) return new URLSearchParams();\n return new URLSearchParams(globalThis.location.search);\n};\n\n/**\n * Update URL with new search params\n */\nconst updateUrl = (params: URLSearchParams, mode: 'push' | 'replace') => {\n if (!isBrowser) return;\n \n const url = new URL(globalThis.location.href);\n url.search = params.toString();\n \n if (mode === 'push') {\n globalThis.history.pushState({}, '', url.toString());\n } else {\n globalThis.history.replaceState({}, '', url.toString());\n }\n};\n\n/**\n * Hook to manage chat state persistence via URL parameters.\n */\nexport function useUrlState(config: UrlSyncConfig = {}): UseUrlStateReturn {\n const {\n enabled = true,\n mode = 'replace',\n params: userParams = {},\n clearPromptAfterRead = true,\n } = config;\n\n const params = { ...DEFAULT_PARAMS, ...userParams };\n const isReadOnly = mode === 'read-only';\n const updateMode = mode === 'read-only' ? 'replace' : mode;\n\n const initialReadDone = useRef(false);\n const promptCleared = useRef(false);\n\n const parseUrlState = useCallback((): UrlState => {\n if (!enabled || !isBrowser) {\n return { threadId: null, agentId: null, prompt: null };\n }\n\n const searchParams = getSearchParams();\n \n return {\n threadId: searchParams.get(params.thread) || null,\n agentId: searchParams.get(params.agent) || null,\n prompt: promptCleared.current ? null : (searchParams.get(params.prompt) || null),\n };\n }, [enabled, params.thread, params.agent, params.prompt]);\n\n const [state, setState] = useState<UrlState>(parseUrlState);\n\n // Read URL state on mount and handle popstate (back/forward navigation)\n useEffect(() => {\n if (!enabled || !isBrowser) return;\n\n if (!initialReadDone.current) {\n const initialState = parseUrlState();\n setState(initialState);\n initialReadDone.current = true;\n\n if (clearPromptAfterRead && initialState.prompt && !isReadOnly) {\n const searchParams = getSearchParams();\n searchParams.delete(params.prompt);\n updateUrl(searchParams, 'replace');\n promptCleared.current = true;\n }\n }\n\n const handlePopState = () => {\n setState(parseUrlState());\n };\n\n globalThis.addEventListener('popstate', handlePopState);\n return () => globalThis.removeEventListener('popstate', handlePopState);\n }, [enabled, parseUrlState, clearPromptAfterRead, params.prompt, isReadOnly]);\n\n const setThreadId = useCallback((threadId: string | null) => {\n if (!enabled || isReadOnly || !isBrowser) return;\n\n const searchParams = getSearchParams();\n if (threadId) {\n searchParams.set(params.thread, threadId);\n } else {\n searchParams.delete(params.thread);\n }\n updateUrl(searchParams, updateMode);\n setState((prev) => ({ ...prev, threadId }));\n }, [enabled, isReadOnly, params.thread, updateMode]);\n\n const setAgentId = useCallback((agentId: string | null) => {\n if (!enabled || isReadOnly || !isBrowser) return;\n\n const searchParams = getSearchParams();\n if (agentId) {\n searchParams.set(params.agent, agentId);\n } else {\n searchParams.delete(params.agent);\n }\n updateUrl(searchParams, updateMode);\n setState((prev) => ({ ...prev, agentId }));\n }, [enabled, isReadOnly, params.agent, updateMode]);\n\n const clearPrompt = useCallback(() => {\n if (!enabled || isReadOnly || !isBrowser) return;\n\n const searchParams = getSearchParams();\n searchParams.delete(params.prompt);\n updateUrl(searchParams, 'replace');\n promptCleared.current = true;\n setState((prev) => ({ ...prev, prompt: null }));\n }, [enabled, isReadOnly, params.prompt]);\n\n return {\n state,\n setThreadId,\n setAgentId,\n clearPrompt,\n isEnabled: enabled,\n };\n}\n","import type { ChatMessage, ToolCall } from '@copilotz/chat-ui';\n\nexport interface InternalChatMessage extends ChatMessage {\n _activityReasoning?: string;\n _activityReasoningStreaming?: boolean;\n _activityToolCalls?: ToolCall[];\n}\n\ntype MessageActivity = NonNullable<ChatMessage['activity']>;\n\nconst isToolCallActive = (toolCall: ToolCall): boolean => (\n toolCall.status === 'pending' || toolCall.status === 'running'\n);\n\nexport const hasVisibleAssistantOutput = (message: InternalChatMessage): boolean => {\n if (message.role !== 'assistant') return false;\n if (typeof message.content === 'string' && message.content.trim().length > 0) return true;\n if (Array.isArray(message.attachments) && message.attachments.length > 0) return true;\n if (Array.isArray(message._activityToolCalls) && message._activityToolCalls.length > 0) return true;\n return false;\n};\n\nexport const buildAssistantActivity = (\n message: Pick<InternalChatMessage, 'content' | 'isStreaming' | '_activityReasoning' | '_activityReasoningStreaming' | '_activityToolCalls'>,\n): MessageActivity | undefined => {\n const toolCalls = Array.isArray(message._activityToolCalls) ? message._activityToolCalls : [];\n const hasReasoning = typeof message._activityReasoning === 'string' && message._activityReasoning.length > 0;\n const hasToolCalls = toolCalls.length > 0;\n const runningTools = toolCalls.filter(isToolCallActive);\n const hasRunningTools = runningTools.length > 0;\n const isStreaming = message.isStreaming === true;\n const isReasoningStreaming = message._activityReasoningStreaming === true;\n const hasContent = typeof message.content === 'string' && message.content.trim().length > 0;\n\n if (!hasReasoning && !hasToolCalls && !isStreaming && !isReasoningStreaming) {\n return undefined;\n }\n\n const isActive = isStreaming || isReasoningStreaming || hasRunningTools;\n const summary = hasRunningTools\n ? {\n kind: 'using_tools' as const,\n ...(runningTools.length === 1 ? { toolName: runningTools[0].name } : {}),\n ...(runningTools.length > 1 ? { toolCount: runningTools.length } : {}),\n }\n : isStreaming && hasToolCalls && !hasContent\n ? {\n kind: 'using_tools' as const,\n ...(toolCalls.length === 1 ? { toolName: toolCalls[0].name } : {}),\n ...(toolCalls.length > 1 ? { toolCount: toolCalls.length } : {}),\n }\n : isReasoningStreaming || (!hasContent && hasReasoning)\n ? { kind: 'thinking' as const }\n : isStreaming && hasContent\n ? { kind: 'preparing_answer' as const }\n : isStreaming\n ? { kind: 'working' as const }\n : hasToolCalls\n ? {\n kind: 'using_tools' as const,\n ...(toolCalls.length === 1 ? { toolName: toolCalls[0].name } : {}),\n ...(toolCalls.length > 1 ? { toolCount: toolCalls.length } : {}),\n }\n : { kind: 'thinking' as const };\n\n return {\n isActive,\n ...(isActive ? {} : { isComplete: true }),\n summary,\n ...(hasReasoning ? { reasoning: message._activityReasoning } : {}),\n ...(hasToolCalls ? { toolCalls } : {}),\n };\n};\n\nexport const syncAssistantActivity = <T extends InternalChatMessage>(message: T): T => {\n if (message.role !== 'assistant') {\n const { _activityReasoning, _activityReasoningStreaming, _activityToolCalls, ...rest } = message;\n return rest as T;\n }\n\n return {\n ...message,\n activity: buildAssistantActivity(message),\n };\n};\n\nexport const toPublicChatMessage = (message: InternalChatMessage): ChatMessage => {\n const { _activityReasoning, _activityReasoningStreaming, _activityToolCalls, ...rest } = syncAssistantActivity(message);\n return rest;\n};\n\nexport const updateAssistantMessageToken = (\n message: InternalChatMessage,\n params: {\n partial: string;\n isReasoning?: boolean;\n agentIdentity?: { senderAgentId?: string; senderName?: string };\n },\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n const next = params.isReasoning\n ? {\n ...message,\n ...params.agentIdentity,\n _activityReasoning: params.partial,\n _activityReasoningStreaming: true,\n isStreaming: true,\n isComplete: false,\n }\n : {\n ...message,\n ...params.agentIdentity,\n content: params.partial,\n _activityReasoningStreaming: false,\n isStreaming: true,\n isComplete: false,\n };\n\n return syncAssistantActivity(next);\n};\n\nexport const appendAssistantToolCall = (\n message: InternalChatMessage,\n toolCall: ToolCall,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n return syncAssistantActivity({\n ...message,\n _activityToolCalls: [\n ...(Array.isArray(message._activityToolCalls) ? message._activityToolCalls : []),\n toolCall,\n ],\n isStreaming: true,\n isComplete: false,\n });\n};\n\nexport const applyAssistantToolResult = (\n message: InternalChatMessage,\n update: Partial<ToolCall> & Pick<ToolCall, 'name' | 'status'> & { id?: string },\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n const toolCalls = Array.isArray(message._activityToolCalls) ? message._activityToolCalls : [];\n const nextToolCalls = toolCalls.map((toolCall) => {\n const matchesById = update.id && toolCall.id === update.id;\n const matchesByName = !update.id && toolCall.name === update.name;\n if (!matchesById && !matchesByName) return toolCall;\n\n return {\n ...toolCall,\n ...update,\n };\n });\n\n return syncAssistantActivity({\n ...message,\n _activityToolCalls: nextToolCalls,\n });\n};\n\nexport const finalizeAssistantMessage = (\n message: InternalChatMessage,\n finalAnswer?: string,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n return syncAssistantActivity({\n ...message,\n ...(typeof finalAnswer === 'string' && finalAnswer.length > 0 ? { content: finalAnswer } : {}),\n isStreaming: false,\n isComplete: true,\n _activityReasoningStreaming: false,\n });\n};\n\nexport const closeAssistantMessage = (\n message: InternalChatMessage,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n return syncAssistantActivity({\n ...message,\n isStreaming: false,\n isComplete: true,\n _activityReasoningStreaming: false,\n });\n};\n"],"mappings":"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","names":["useEffect","forwardRef","createElement","useState","useCallback","useRef","useEffect","offset","payload","rawBaseValue","rawBase","normalizedBase","API_BASE","apiUrl","useState","useRef","useEffect","useCallback","message","deleteThread","useEffect"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@copilotz/chat-adapter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Copilotz chat adapter and API hook",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -22,10 +22,12 @@
|
|
|
22
22
|
"prepack": "npm run build"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
|
+
"@copilotz/chat-ui": "^0.6.7",
|
|
25
26
|
"react": ">=18",
|
|
26
27
|
"react-dom": ">=18"
|
|
27
28
|
},
|
|
28
29
|
"devDependencies": {
|
|
30
|
+
"@copilotz/chat-ui": "^0.6.7",
|
|
29
31
|
"@types/react": "^19.1.10",
|
|
30
32
|
"@types/react-dom": "^19.1.7",
|
|
31
33
|
"tsup": "^8.3.5",
|
|
@@ -39,8 +41,5 @@
|
|
|
39
41
|
"homepage": "https://github.com/copilotzhq/packages#readme",
|
|
40
42
|
"publishConfig": {
|
|
41
43
|
"access": "public"
|
|
42
|
-
},
|
|
43
|
-
"dependencies": {
|
|
44
|
-
"@copilotz/chat-ui": "^0.5.0"
|
|
45
44
|
}
|
|
46
45
|
}
|