@copilotz/chat-adapter 0.7.5 → 0.7.8
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.js +30 -19
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -177,7 +177,8 @@ var toAttachmentPayload = (attachments) => {
|
|
|
177
177
|
kind: att.kind,
|
|
178
178
|
dataUrl: att.dataUrl,
|
|
179
179
|
mimeType: att.mimeType,
|
|
180
|
-
fileName: att.fileName
|
|
180
|
+
fileName: att.fileName,
|
|
181
|
+
size: att.size
|
|
181
182
|
};
|
|
182
183
|
if (att.kind === "audio" || att.kind === "video") {
|
|
183
184
|
return {
|
|
@@ -688,6 +689,9 @@ async function deleteThread(threadId, getRequestHeaders) {
|
|
|
688
689
|
return true;
|
|
689
690
|
}
|
|
690
691
|
|
|
692
|
+
// src/useCopilotzChat.ts
|
|
693
|
+
import { getAttachmentKindFromMimeType as getAttachmentKindFromMimeType3, getMimeTypeFromDataUrl as getMimeTypeFromDataUrl3 } from "@copilotz/chat-ui";
|
|
694
|
+
|
|
691
695
|
// src/useUrlState.ts
|
|
692
696
|
import { useState, useEffect, useCallback, useRef } from "react";
|
|
693
697
|
var DEFAULT_PARAMS = {
|
|
@@ -1079,7 +1083,11 @@ var resolveLiveEventSender = (event, options = {}) => {
|
|
|
1079
1083
|
return resolveUserSender(options.user);
|
|
1080
1084
|
};
|
|
1081
1085
|
|
|
1086
|
+
// src/messageContract.ts
|
|
1087
|
+
import { getAttachmentKindFromMimeType as getAttachmentKindFromMimeType2, getMimeTypeFromDataUrl as getMimeTypeFromDataUrl2 } from "@copilotz/chat-ui";
|
|
1088
|
+
|
|
1082
1089
|
// src/assetsService.ts
|
|
1090
|
+
import { getAttachmentKindFromMimeType, getMimeTypeFromDataUrl } from "@copilotz/chat-ui";
|
|
1083
1091
|
var ContractViolation2 = class extends Error {
|
|
1084
1092
|
name = "ContractViolation";
|
|
1085
1093
|
};
|
|
@@ -1144,11 +1152,11 @@ async function resolveAssetsInMessages(messages) {
|
|
|
1144
1152
|
const assetRef = typeof att.assetRef === "string" ? att.assetRef : void 0;
|
|
1145
1153
|
if (!assetRef) return att;
|
|
1146
1154
|
const { dataUrl, mime } = await resolveAssetRef(assetRef);
|
|
1147
|
-
const
|
|
1148
|
-
const
|
|
1155
|
+
const mimeType = typeof att.mimeType === "string" ? att.mimeType : mime || getMimeTypeFromDataUrl(dataUrl) || "application/octet-stream";
|
|
1156
|
+
const inferredKind = getAttachmentKindFromMimeType(mimeType);
|
|
1149
1157
|
return {
|
|
1150
1158
|
...att,
|
|
1151
|
-
kind,
|
|
1159
|
+
kind: inferredKind,
|
|
1152
1160
|
dataUrl,
|
|
1153
1161
|
mimeType
|
|
1154
1162
|
};
|
|
@@ -1360,22 +1368,28 @@ var extractAttachments = (metadata) => {
|
|
|
1360
1368
|
return metadata.attachments.map((value, index) => {
|
|
1361
1369
|
const path = `message.metadata.attachments[${index}]`;
|
|
1362
1370
|
const att = expectRecord(value, path);
|
|
1371
|
+
const dataUrl = expectString(att.dataUrl, `${path}.dataUrl`);
|
|
1372
|
+
const mimeType = typeof att.mimeType === "string" && att.mimeType.trim().length > 0 ? att.mimeType : getMimeTypeFromDataUrl2(dataUrl) || "application/octet-stream";
|
|
1373
|
+
const inferredKind = getAttachmentKindFromMimeType2(mimeType);
|
|
1374
|
+
const normalizedKind = inferredKind;
|
|
1363
1375
|
const base = {
|
|
1364
|
-
kind:
|
|
1365
|
-
dataUrl
|
|
1366
|
-
mimeType
|
|
1376
|
+
kind: normalizedKind,
|
|
1377
|
+
dataUrl,
|
|
1378
|
+
mimeType,
|
|
1379
|
+
...typeof att.fileName === "string" ? { fileName: att.fileName } : {},
|
|
1380
|
+
...att.size !== void 0 ? { size: expectNumber(att.size, `${path}.size`) } : {}
|
|
1367
1381
|
};
|
|
1368
|
-
if (
|
|
1369
|
-
if (
|
|
1382
|
+
if (normalizedKind === "image") return base;
|
|
1383
|
+
if (normalizedKind === "audio") return {
|
|
1370
1384
|
...base,
|
|
1371
1385
|
...att.durationMs !== void 0 ? { durationMs: expectNumber(att.durationMs, `${path}.durationMs`) } : {}
|
|
1372
1386
|
};
|
|
1373
|
-
if (
|
|
1387
|
+
if (normalizedKind === "video") return {
|
|
1374
1388
|
...base,
|
|
1375
1389
|
...att.durationMs !== void 0 ? { durationMs: expectNumber(att.durationMs, `${path}.durationMs`) } : {},
|
|
1376
1390
|
...att.poster !== void 0 ? { poster: expectString(att.poster, `${path}.poster`) } : {}
|
|
1377
1391
|
};
|
|
1378
|
-
|
|
1392
|
+
return base;
|
|
1379
1393
|
});
|
|
1380
1394
|
};
|
|
1381
1395
|
var assertRestMessageContract = (msg) => {
|
|
@@ -1899,18 +1913,15 @@ function useCopilotz({
|
|
|
1899
1913
|
}, []);
|
|
1900
1914
|
const handleStreamAssetEvent = useCallback2((payload, assistantMessageId) => {
|
|
1901
1915
|
if (!payload?.dataUrl) return;
|
|
1902
|
-
const mimeType = payload.mime || "
|
|
1916
|
+
const mimeType = payload.mime || payload.mimeType || getMimeTypeFromDataUrl3(payload.dataUrl) || "application/octet-stream";
|
|
1903
1917
|
const dataUrl = payload.dataUrl;
|
|
1904
|
-
|
|
1905
|
-
if (mimeType.startsWith("audio/")) {
|
|
1906
|
-
kind = "audio";
|
|
1907
|
-
} else if (mimeType.startsWith("video/")) {
|
|
1908
|
-
kind = "video";
|
|
1909
|
-
}
|
|
1918
|
+
const kind = getAttachmentKindFromMimeType3(mimeType);
|
|
1910
1919
|
const mediaAttachment = {
|
|
1911
1920
|
kind,
|
|
1912
1921
|
dataUrl,
|
|
1913
|
-
mimeType
|
|
1922
|
+
mimeType,
|
|
1923
|
+
...typeof payload.fileName === "string" ? { fileName: payload.fileName } : {},
|
|
1924
|
+
...typeof payload.size === "number" ? { size: payload.size } : {}
|
|
1914
1925
|
};
|
|
1915
1926
|
setMessages((prev) => prev.map((msg) => msg.id === assistantMessageId ? {
|
|
1916
1927
|
...msg,
|
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/useUrlState.ts","../src/activity.ts","../src/contract.ts","../src/senders.ts","../src/assetsService.ts","../src/toolActivity.ts","../src/messageContract.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 userName,\n userAvatar,\n assistantName: userConfig?.branding?.title,\n agentOptions,\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 type { AgentOption, ChatMessage as ChatViewMessage, ChatSender, ChatThread, MediaAttachment, ChatUserContext } from '@copilotz/chat-ui';\nimport { useUrlState } from './useUrlState';\nimport type { EventInterceptor, RunErrorInterceptor, SpecialChatState } from './specialState';\nimport type { RequestHeadersProvider, RestMessage, RestMessagePageInfo } from './copilotzService';\nimport {\n appendAssistantToolCall,\n closeAssistantMessage,\n finalizeAssistantMessage,\n hasVisibleAssistantOutput,\n type InternalChatMessage,\n updateAssistantMessageToken,\n toPublicChatMessage,\n} from './activity';\nimport {\n resolveAgentSender,\n resolveAssistantFallbackSender,\n resolveLiveEventSender,\n resolveUserSender,\n type SenderResolutionOptions,\n} from './senders';\nimport {\n convertServerMessage,\n isInternalMessageMetadata,\n prepareHydratedMessages,\n} from './messageContract';\nimport {\n applyToolResultUpdateToMessages,\n canAttachToStreamingAssistant,\n extractLiveToolCall,\n extractLiveToolResultUpdate,\n mergePersistedToolResults,\n messageAgentKey,\n matchesToolResultUpdate,\n prependUniqueMessages,\n type ToolResultUpdate,\n} from './toolActivity';\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\ntype ServerThread = Awaited<ReturnType<typeof fetchThreads>>[number];\ntype ServerMessage = RestMessage;\n\nconst THREAD_MESSAGES_PAGE_SIZE = 50;\n\nconst createEmptyMessagePageInfo = (): RestMessagePageInfo => ({\n hasMoreBefore: false,\n oldestMessageId: null,\n newestMessageId: null,\n});\n\nexport interface UseCopilotzOptions {\n userId: string | null;\n userName?: string;\n userAvatar?: string;\n assistantName?: string;\n agentOptions?: AgentOption[];\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 userName,\n userAvatar,\n assistantName,\n agentOptions = [],\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 senderOptionsRef = useRef<SenderResolutionOptions>({\n agents: agentOptions,\n user: userId ? { id: userId, name: userName, avatarUrl: userAvatar } : null,\n assistantName,\n });\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 senderOptionsRef.current = {\n agents: agentOptions,\n user: userId ? { id: userId, name: userName, avatarUrl: userAvatar } : null,\n assistantName,\n };\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 sender = resolveLiveEventSender(event, senderOptionsRef.current);\n const incomingAgentKey = sender.agentId ?? sender.id;\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] = {\n ...m,\n content: payload.content,\n isStreaming: false,\n isComplete: true,\n sender,\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 {\n id: generateId(),\n role: 'assistant',\n content: payload.content,\n timestamp: nowTs(),\n isStreaming: false,\n isComplete: true,\n metadata: liveMetadata,\n sender,\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 return prepareHydratedMessages(rawMessages, {\n senderOptions: senderOptionsRef.current,\n createId: generateId,\n now: nowTs,\n onToolOutput: processToolOutput,\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 ? {\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 assistantMessageId?: string;\n assistantSender?: ChatSender;\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 = params.assistantMessageId ?? generateId();\n let currentAssistantSender: ChatSender | undefined = params.assistantSender;\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 nextSender = opts?.agent\n ? resolveAgentSender(opts.agent, senderOptionsRef.current)\n : currentAssistantSender;\n if (nextSender) {\n currentAssistantSender = nextSender;\n }\n const nextAgentKey = currentAssistantSender?.agentId ?? currentAssistantSender?.id ?? null;\n\n const applyUpdate = (msg: InternalChatMessage): InternalChatMessage => {\n return {\n ...updateAssistantMessageToken(msg, {\n partial,\n isReasoning,\n }),\n ...(currentAssistantSender ? { sender: currentAssistantSender } : {}),\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.activity === next.activity && 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.activity === next.activity && 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 ...(currentAssistantSender ? { sender: currentAssistantSender } : {}),\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.activity === nextMessage.activity\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\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 const eventSender = resolveLiveEventSender(event, senderOptionsRef.current);\n currentAssistantSender = eventSender;\n const eventAgentKey = currentAssistantSender.agentId ?? currentAssistantSender.id;\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 canHostActivity = (message: ChatViewMessage | undefined) => {\n if (!message) return false;\n return message.role === 'assistant' &&\n message.isStreaming &&\n message.content.trim().length === 0 &&\n !message.attachments?.length;\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 canHostActivity(message)\n ));\n if (currentIdx >= 0) {\n const next = [...prev];\n next[currentIdx] = appendToolCall({\n ...next[currentIdx],\n isStreaming: true,\n isComplete: false,\n ...(currentAssistantSender ? { sender: currentAssistantSender } : {}),\n });\n return next;\n }\n\n const last = prev[prev.length - 1];\n if (canHostActivity(last) && canAttachToStreamingAssistant(\n last,\n eventAgentKey,\n )) {\n currentAssistantId = last.id;\n const next = [...prev];\n next[prev.length - 1] = appendToolCall({\n ...last,\n isStreaming: true,\n isComplete: false,\n ...(currentAssistantSender ? { sender: currentAssistantSender } : {}),\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 ...(currentAssistantSender ? { sender: currentAssistantSender } : {}),\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, {\n senderOptions: senderOptionsRef.current,\n createId: generateId,\n now: nowTs,\n });\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 sender: resolveUserSender({\n id: userId,\n name: (userContextSeedRef.current?.profile as any)?.full_name ?? userId,\n }),\n };\n\n const assistantSender = targetAgentNameRef.current\n ? resolveAgentSender(\n { id: targetAgentNameRef.current, name: targetAgentNameRef.current },\n senderOptionsRef.current,\n )\n : preferredAgentRef.current\n ? resolveAgentSender(\n { id: preferredAgentRef.current, name: preferredAgentRef.current },\n senderOptionsRef.current,\n )\n : resolveAssistantFallbackSender(senderOptionsRef.current);\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 sender: assistantSender,\n };\n\n // Add user message and assistant placeholder for typewriter loading effect\n setMessages((prev) => [...prev, userMessage as InternalChatMessage, 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 assistantMessageId: assistantPlaceholder.id,\n assistantSender,\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] = {\n ...message,\n content: 'Desculpe, ocorreu um erro ao gerar a resposta. Por favor, tente novamente.',\n isStreaming: false,\n isComplete: true,\n sender: message.sender ?? resolveAssistantFallbackSender(senderOptionsRef.current),\n };\n return updated;\n }\n\n return [\n ...finalized,\n {\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 sender: resolveAssistantFallbackSender(senderOptionsRef.current),\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 {\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 sender: resolveAssistantFallbackSender(senderOptionsRef.current),\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\nexport type 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 lastCompletedText = \"\";\n let lastTokenWasReasoning = false;\n let hadNonReasoningContent = false;\n const collectedMessages: any[] = [];\n let collectedMedia: Record<string, string> | null = null;\n\n const resetTokenAggregation = () => {\n aggregatedText = \"\";\n aggregatedReasoning = \"\";\n lastTokenWasReasoning = false;\n hadNonReasoningContent = false;\n };\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 if (isComplete) {\n if (!isReasoning && tokenText) {\n lastCompletedText = tokenText;\n }\n resetTokenAggregation();\n }\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 const resultAnswer =\n typeof payload?.payload?.answer === \"string\"\n ? payload.payload.answer\n : typeof payload?.answer === \"string\"\n ? payload.answer\n : undefined;\n if (resultAnswer) {\n lastCompletedText = resultAnswer;\n }\n resetTokenAggregation();\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: lastCompletedText || 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","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 {\n AssistantActivityItem,\n AssistantActivityStatus,\n ChatMessage,\n ToolCall,\n} from '@copilotz/chat-ui';\n\nexport interface InternalChatMessage extends ChatMessage {}\n\nconst thinkingId = 'thinking';\nconst answeringId = 'answering';\n\nconst getItems = (message: InternalChatMessage): AssistantActivityItem[] =>\n Array.isArray(message.activity?.items) ? message.activity.items : [];\n\nconst setItems = <T extends InternalChatMessage>(\n message: T,\n items: AssistantActivityItem[],\n): T => ({\n ...message,\n activity: items.length > 0 ? { items } : undefined,\n});\n\nconst toolStatusToActivityStatus = (status: ToolCall['status']): AssistantActivityStatus => {\n if (status === 'failed') return 'failed';\n if (status === 'completed') return 'complete';\n return 'active';\n};\n\nconst upsertItem = <T extends InternalChatMessage>(\n message: T,\n item: AssistantActivityItem,\n): T => {\n const items = getItems(message);\n const index = items.findIndex((current) => current.id === item.id);\n if (index === -1) return setItems(message, [...items, item]);\n\n const next = [...items];\n next[index] = {\n ...next[index],\n ...item,\n details: {\n ...(next[index].details ?? {}),\n ...(item.details ?? {}),\n },\n };\n return setItems(message, next);\n};\n\nconst completeItems = <T extends InternalChatMessage>(\n message: T,\n shouldComplete: (item: AssistantActivityItem) => boolean,\n): T => setItems(message, getItems(message).map((item) => (\n item.status === 'active' && shouldComplete(item)\n ? { ...item, status: 'complete', completedAt: Date.now() }\n : item\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 return getItems(message).length > 0;\n};\n\nexport const toPublicChatMessage = (message: InternalChatMessage): ChatMessage => {\n if (message.role === 'assistant') return message;\n const { activity, ...rest } = message;\n return rest;\n};\n\nexport const updateAssistantMessageToken = (\n message: InternalChatMessage,\n params: {\n partial: string;\n isReasoning?: boolean;\n },\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n\n if (params.isReasoning) {\n return upsertItem({\n ...message,\n isStreaming: true,\n isComplete: false,\n }, {\n id: thinkingId,\n kind: 'thinking',\n status: 'active',\n startedAt: getItems(message).find((item) => item.id === thinkingId)?.startedAt ?? Date.now(),\n details: { reasoning: params.partial },\n });\n }\n\n return upsertItem(completeItems({\n ...message,\n content: params.partial,\n isStreaming: true,\n isComplete: false,\n }, (item) => item.kind === 'thinking' || item.kind === 'tool'), {\n id: answeringId,\n kind: 'answering',\n status: 'active',\n startedAt: getItems(message).find((item) => item.id === answeringId)?.startedAt ?? Date.now(),\n });\n};\n\nexport const appendAssistantToolCall = (\n message: InternalChatMessage,\n toolCall: ToolCall,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n const status = toolStatusToActivityStatus(toolCall.status);\n\n return upsertItem({\n ...message,\n isStreaming: true,\n isComplete: false,\n }, {\n id: toolCall.id,\n kind: 'tool',\n status,\n toolName: toolCall.name,\n startedAt: toolCall.startTime ?? Date.now(),\n ...(status !== 'active' ? { completedAt: toolCall.endTime ?? Date.now() } : {}),\n details: {\n toolCall,\n ...(toolCall.result !== undefined ? { result: toolCall.result } : {}),\n },\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 items = getItems(message);\n const index = items.findIndex((item) => (\n item.kind === 'tool' &&\n ((update.id && item.id === update.id) || (!update.id && item.toolName === update.name))\n ));\n if (index === -1) return message;\n\n const item = items[index];\n const toolCall = item.details?.toolCall;\n const nextToolCall = toolCall ? { ...toolCall, ...update } : {\n id: update.id ?? item.id,\n name: update.name,\n arguments: {},\n status: update.status,\n ...(update.result !== undefined ? { result: update.result } : {}),\n ...(update.endTime !== undefined ? { endTime: update.endTime } : {}),\n };\n const status = toolStatusToActivityStatus(update.status);\n const next = [...items];\n next[index] = {\n ...item,\n status,\n toolName: update.name,\n ...(status !== 'active' ? { completedAt: update.endTime ?? Date.now() } : {}),\n details: {\n ...(item.details ?? {}),\n toolCall: nextToolCall,\n ...(update.result !== undefined ? { result: update.result } : {}),\n },\n };\n return setItems(message, next);\n};\n\nexport const finalizeAssistantMessage = (\n message: InternalChatMessage,\n finalAnswer?: string,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n const completed = completeItems({\n ...message,\n ...(typeof finalAnswer === 'string' && finalAnswer.length > 0 ? { content: finalAnswer } : {}),\n isStreaming: false,\n isComplete: true,\n }, (item) => item.kind === 'thinking' || item.kind === 'answering');\n return setItems(completed, getItems(completed).filter((item) => item.kind !== 'answering'));\n};\n\nexport const closeAssistantMessage = (\n message: InternalChatMessage,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n return completeItems({\n ...message,\n isStreaming: false,\n isComplete: true,\n }, () => true);\n};\n","export class ContractViolation extends Error {\n constructor(message: string) { super(message); this.name = 'ContractViolation'; }\n}\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const expectRecord = (value: unknown, path: string): Record<string, unknown> => {\n if (!isRecord(value)) throw new ContractViolation(`${path} must be an object`);\n return value;\n};\n\nexport const expectString = (value: unknown, path: string): string => {\n if (typeof value !== 'string' || value.trim().length === 0) throw new ContractViolation(`${path} must be a non-empty string`);\n return value;\n};\n\nexport const expectOptionalString = (value: unknown, path: string): string | undefined => {\n if (value === undefined || value === null) return undefined;\n return expectString(value, path);\n};\n\nexport const expectStringValue = (value: unknown, path: string): string => {\n if (typeof value !== 'string') throw new ContractViolation(`${path} must be a string`);\n return value;\n};\n","import type { AgentOption, ChatSender } from '@copilotz/chat-ui';\nimport {\n ContractViolation,\n expectOptionalString,\n expectRecord,\n expectString,\n isRecord,\n} from './contract.ts';\n\ntype SenderType = ChatSender['type'];\ntype AgentIdentity = { id?: string | null; name?: string | null };\ntype UserIdentity = { id: string; name?: string | null; avatarUrl?: string | null };\n\ntype ServerMessageLike = {\n senderId: string | null;\n senderType: string;\n senderUserId?: string | null;\n metadata?: Record<string, unknown> | null;\n};\n\nexport type SenderResolutionOptions = {\n agents?: AgentOption[];\n user?: UserIdentity | null;\n assistantName?: string | null;\n};\n\nconst clean = (value: string | null | undefined): string | undefined =>\n typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n\nconst expectSenderType = (value: unknown, path: string): SenderType => {\n if (value === 'user' || value === 'agent' || value === 'tool' || value === 'system') return value;\n throw new ContractViolation(`${path} must be user, agent, tool, or system`);\n};\n\nconst defined = <T extends Record<string, unknown>>(value: T): T =>\n Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n\nconst findAgent = (\n agents: AgentOption[] | undefined,\n ...candidates: Array<string | undefined>\n): AgentOption | undefined => {\n const values = candidates.filter(Boolean).map((value) => value!.toLowerCase());\n if (!agents || values.length === 0) return undefined;\n return agents.find((agent) =>\n values.includes(agent.id.toLowerCase()) ||\n values.includes(agent.name.toLowerCase())\n );\n};\n\nconst fromAgent = (\n agent: AgentOption,\n overrides: Partial<ChatSender> = {},\n): ChatSender => defined({\n type: overrides.type ?? 'agent',\n id: agent.id,\n name: agent.name,\n agentId: agent.id,\n avatarUrl: agent.avatarUrl,\n color: agent.color,\n ...overrides,\n});\n\nexport const resolveUserSender = (user: UserIdentity): ChatSender => defined({\n type: 'user',\n id: user.id,\n externalId: user.id,\n name: clean(user.name) ?? user.id,\n avatarUrl: clean(user.avatarUrl),\n});\n\nexport const resolveAssistantFallbackSender = (\n options: SenderResolutionOptions = {},\n): ChatSender => ({\n type: 'agent',\n id: 'assistant',\n name: clean(options.assistantName) ?? 'Assistant',\n agentId: 'assistant',\n});\n\nexport const resolveAgentSender = (\n identity: AgentIdentity,\n options: SenderResolutionOptions = {},\n overrides: Partial<ChatSender> = {},\n): ChatSender => {\n const id = expectString(identity.id, 'agent.id');\n const name = expectString(identity.name, 'agent.name');\n const agent = findAgent(options.agents, id, name);\n if (agent) {\n return fromAgent(agent, defined({\n ...overrides,\n externalId: id && id !== agent.id ? id : undefined,\n }));\n }\n\n return defined({\n type: overrides.type ?? 'agent',\n id,\n name,\n agentId: id,\n ...overrides,\n });\n};\n\nexport const resolveHydratedMessageSender = (\n message: ServerMessageLike,\n options: SenderResolutionOptions = {},\n): ChatSender => {\n const metadata = message.metadata ? expectRecord(message.metadata, 'message.metadata') : {};\n const type = expectSenderType(message.senderType, 'message.senderType');\n const storedId = expectOptionalString(message.senderId, 'message.senderId');\n const participantId = expectOptionalString(metadata.senderParticipantId, 'message.metadata.senderParticipantId') ??\n expectOptionalString(message.senderUserId, 'message.senderUserId');\n const externalId = expectString(metadata.senderExternalId, 'message.metadata.senderExternalId');\n const displayName = expectString(metadata.senderDisplayName, 'message.metadata.senderDisplayName');\n\n if (type === 'agent' || type === 'tool') {\n const agent = findAgent(options.agents, externalId, displayName, storedId);\n if (agent) {\n return fromAgent(agent, defined({\n type,\n participantId: participantId ?? storedId,\n externalId: externalId && externalId !== agent.id ? externalId : undefined,\n }));\n }\n\n return defined({\n type,\n id: externalId,\n name: displayName,\n agentId: externalId,\n participantId: participantId ?? storedId,\n externalId,\n });\n }\n\n if (type === 'user') {\n return defined({\n type: 'user',\n id: externalId,\n externalId,\n name: displayName,\n avatarUrl: clean(options.user?.avatarUrl),\n participantId: participantId ?? storedId,\n });\n }\n\n return defined({\n type: 'system',\n id: externalId,\n name: displayName,\n participantId: participantId ?? storedId,\n externalId,\n });\n};\n\nexport const resolveLiveEventSender = (\n event: unknown,\n options: SenderResolutionOptions = {},\n): ChatSender => {\n const raw = expectRecord(event, 'stream event');\n const payload = raw.payload === undefined ? raw : expectRecord(raw.payload, 'stream event.payload');\n const agent = payload.agent ?? raw.agent;\n if (isRecord(agent)) {\n return resolveAgentSender({\n id: expectString(agent.id, 'stream event.payload.agent.id'),\n name: expectString(agent.name, 'stream event.payload.agent.name'),\n }, options);\n }\n\n const sender = payload.sender ?? raw.sender;\n if (!isRecord(sender)) {\n throw new ContractViolation('stream event sender contract requires payload.agent or payload.sender');\n }\n\n const type = expectSenderType(sender.type ?? payload.senderType, 'stream event.payload.sender.type');\n if (type !== 'user') {\n return resolveAgentSender({\n id: expectString(sender.id ?? sender.externalId, 'stream event.payload.sender.id'),\n name: expectString(sender.name, 'stream event.payload.sender.name'),\n }, options, { type });\n }\n\n if (!options.user) {\n throw new ContractViolation('user stream sender requires current user context');\n }\n return resolveUserSender(options.user);\n};\n","// Minimal API client for Copilotz assets\n\nclass ContractViolation extends Error { name = 'ContractViolation'; }\nconst expectRecord = (value: unknown, path: string): Record<string, unknown> => {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) return value as Record<string, unknown>;\n throw new ContractViolation(`${path} must be an object`);\n};\nconst expectString = (value: unknown, path: string): string => {\n if (typeof value === 'string' && value.trim().length > 0) return value;\n throw new ContractViolation(`${path} must be a non-empty string`);\n};\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 const envelope = expectRecord(body, 'asset response');\n const data = expectRecord(envelope.data, 'asset response.data') as FetchAssetResult;\n if (typeof data.error === 'string' && data.error.length > 0) {\n throw new Error(data.error);\n }\n if (typeof data.dataUrl !== 'string' || data.dataUrl.length === 0) {\n throw new ContractViolation(`asset response.data.dataUrl is required for ${refOrId}`);\n }\n return {\n dataUrl: data.dataUrl,\n mime: typeof data.mime === 'string' ? data.mime : undefined,\n assetId: expectString(data.assetId, 'asset response.data.assetId'),\n };\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 === null || msg.metadata === undefined\n ? undefined\n : expectRecord(msg.metadata, 'message.metadata');\n const attachments = meta?.attachments === undefined\n ? undefined\n : Array.isArray(meta.attachments)\n ? meta.attachments.map((att, index) =>\n expectRecord(att, `message.metadata.attachments[${index}]`)\n )\n : (() => {\n throw new ContractViolation('message.metadata.attachments must be an array');\n })();\n\n if (!attachments || attachments.length === 0) {\n return msg;\n }\n\n const newAttachments = await Promise.all(attachments.map(async (att, index) => {\n const assetRef = typeof att.assetRef === 'string' ? att.assetRef : undefined;\n if (!assetRef) return att;\n\n const { dataUrl, mime } = await resolveAssetRef(assetRef);\n const kind = expectString(att.kind, `message.metadata.attachments[${index}].kind`);\n const mimeType = typeof att.mimeType === 'string'\n ? att.mimeType\n : expectString(mime, `asset ${assetRef}.mime`);\n return {\n ...att,\n kind,\n dataUrl,\n mimeType,\n } as Record<string, unknown>;\n }));\n\n const newMeta = { ...meta, attachments: newAttachments } as Record<string, unknown>;\n return { ...msg, metadata: newMeta };\n }));\n}\n","import type { AssistantActivityItem, ChatMessage as ChatViewMessage } from '@copilotz/chat-ui';\nimport { applyAssistantToolResult, type InternalChatMessage } from './activity.ts';\nimport {\n ContractViolation,\n expectRecord,\n expectString,\n expectStringValue,\n isRecord,\n} from './contract.ts';\nimport type { RestMessage } from './copilotzService.ts';\n\nexport type ToolCallStatus = 'pending' | 'running' | 'completed' | 'failed';\n\nexport type ParsedToolCall = {\n id?: string;\n name: string;\n arguments: Record<string, unknown>;\n status: ToolCallStatus;\n result?: unknown;\n};\n\nexport type ToolResultUpdate = {\n id?: string;\n name?: string;\n status: ToolCallStatus;\n result?: unknown;\n endTime: number;\n};\n\nconst fail = (message: string): never => {\n throw new ContractViolation(message);\n};\n\nexport const expectToolStatus = (status: unknown, path: string): ToolCallStatus => {\n if (status === 'pending') return 'pending';\n if (status === 'running' || status === 'processing') return 'running';\n if (status === 'failed') return 'failed';\n if (status === 'completed') return 'completed';\n return fail(`${path} must be pending, running, processing, completed, or failed`);\n};\n\nconst expectToolArguments = (\n value: unknown,\n path: string,\n): Record<string, unknown> => {\n if (isRecord(value)) return value;\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value);\n return expectRecord(parsed, path);\n } catch {\n return fail(`${path} must be an object or JSON object string`);\n }\n }\n return fail(`${path} must be an object or JSON object string`);\n};\n\nconst expectToolName = (tool: Record<string, unknown>, path: string): string => {\n const name = typeof tool.name === 'string' && tool.name.trim().length > 0\n ? tool.name\n : tool.id;\n return expectString(name, path);\n};\n\nexport const 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 findMatchingToolItem = (\n toolItems: AssistantActivityItem[],\n update: ToolResultUpdate,\n): AssistantActivityItem | undefined => toolItems.find((item) => (\n matchesToolResultUpdate(\n { id: item.id, name: item.toolName },\n update,\n ) &&\n (item.status === 'active' || item.details?.result === undefined)\n));\n\nexport const 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 const toolItems = message.activity?.items.filter((item) => item.kind === 'tool') ?? [];\n if (message.role !== 'assistant' || toolItems.length === 0) {\n continue;\n }\n\n const toolItem = findMatchingToolItem(toolItems, update);\n if (!toolItem) continue;\n\n nextMessages[i] = {\n ...applyAssistantToolResult(message, {\n ...(update.id ? { id: update.id } : {}),\n name: update.name ?? toolItem.toolName ?? toolItem.id,\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\nexport const extractLiveToolCall = (\n payload: Record<string, unknown> | undefined,\n): ParsedToolCall => {\n const payloadRecord = expectRecord(payload, 'TOOL_CALL payload');\n const toolCall = expectRecord(payloadRecord.toolCall, 'TOOL_CALL payload.toolCall');\n const tool = expectRecord(toolCall.tool, 'TOOL_CALL payload.toolCall.tool');\n\n return {\n id: expectString(toolCall.id, 'TOOL_CALL payload.toolCall.id'),\n name: expectToolName(tool, 'TOOL_CALL payload.toolCall.tool.id'),\n arguments: expectToolArguments(toolCall.args, 'TOOL_CALL payload.toolCall.args'),\n status: toolCall.status === undefined ? 'running' : expectToolStatus(toolCall.status, 'TOOL_CALL payload.toolCall.status'),\n ...(toolCall.output !== undefined ? { result: toolCall.output } : {}),\n };\n};\n\nexport const extractLiveToolResultUpdate = (\n payload: Record<string, unknown> | undefined,\n now: () => number = () => Date.now(),\n): ToolResultUpdate => {\n const payloadRecord = expectRecord(payload, 'TOOL_RESULT payload');\n const tool = expectRecord(payloadRecord.tool, 'TOOL_RESULT payload.tool');\n const result = payloadRecord.projectedOutput !== undefined\n ? payloadRecord.projectedOutput\n : payloadRecord.output;\n if (result === undefined) fail('TOOL_RESULT payload requires output or projectedOutput');\n\n return {\n id: expectString(payloadRecord.toolCallId, 'TOOL_RESULT payload.toolCallId'),\n name: expectToolName(tool, 'TOOL_RESULT payload.tool.id'),\n status: expectToolStatus(payloadRecord.status, 'TOOL_RESULT payload.status'),\n result,\n endTime: now(),\n };\n};\n\nexport const extractToolCallsFromServerMessage = (msg: RestMessage): ParsedToolCall[] => {\n const metadata = msg.metadata === null || msg.metadata === undefined\n ? undefined\n : expectRecord(msg.metadata, 'message.metadata');\n const topLevelToolCalls = readToolCallArray(msg.toolCalls, 'message.toolCalls');\n const metadataToolCalls = readToolCallArray(metadata?.toolCalls, 'message.metadata.toolCalls');\n\n const usedMetadataIndexes = new Set<number>();\n const parsed: ParsedToolCall[] = [];\n\n const findMatchingMetadataIndex = (toolCall: Record<string, unknown>): number => {\n const id = expectString(toolCall.id, 'message.toolCalls[].id');\n return metadataToolCalls.findIndex((candidate, idx) =>\n !usedMetadataIndexes.has(idx) && candidate.id === id\n );\n };\n\n const parseToolCall = (\n primary: Record<string, unknown>,\n secondary?: Record<string, unknown>,\n ): ParsedToolCall => {\n const id = expectString(primary.id ?? secondary?.id, 'toolCall.id');\n const tool = expectRecord(primary.tool ?? secondary?.tool, 'toolCall.tool');\n const name = expectToolName(tool, 'toolCall.tool.id');\n const argsRaw = primary.args ?? secondary?.args;\n const result = primary.output !== undefined\n ? primary.output\n : secondary?.output !== undefined\n ? secondary.output\n : primary.projectedOutput !== undefined\n ? primary.projectedOutput\n : secondary?.projectedOutput;\n const rawStatus = primary.status ?? secondary?.status;\n\n return {\n id,\n name,\n arguments: expectToolArguments(argsRaw, 'toolCall.args'),\n ...(result !== undefined ? { result } : {}),\n status: rawStatus === undefined ? 'running' : expectToolStatus(rawStatus, 'toolCall.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 readToolCallArray = (\n value: unknown,\n path: string,\n): Record<string, unknown>[] => {\n if (value === null || value === undefined) return [];\n if (!Array.isArray(value)) fail(`${path} must be an array`);\n return value.map((toolCall, index) => expectRecord(toolCall, `${path}[${index}]`));\n};\n\nexport const extractToolResultUpdateFromMessage = (\n msg: RestMessage,\n now: () => number = () => Date.now(),\n): ToolResultUpdate | null => {\n if (msg.senderType !== 'tool') return null;\n\n const toolCalls = extractToolCallsFromServerMessage(msg);\n if (toolCalls.length === 0) fail('tool message requires metadata.toolCalls');\n\n const firstToolCall = toolCalls[0];\n if (firstToolCall.result === undefined) fail('tool result message requires tool call output');\n expectStringValue(msg.createdAt, 'tool result message.createdAt');\n\n return {\n id: firstToolCall.id,\n name: firstToolCall.name,\n result: firstToolCall.result,\n status: firstToolCall.status,\n endTime: new Date(msg.createdAt).getTime(),\n };\n};\n\nexport const 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\nexport const 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\nexport const messageAgentKey = (message: ChatViewMessage): string | null => {\n if (message.role !== 'assistant') return null;\n if (message.sender?.type === 'agent' || message.sender?.type === 'tool') {\n return message.sender.agentId ?? message.sender.id;\n }\n return null;\n};\n\nexport const 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","import type { AssistantActivityItem, MediaAttachment, ToolCall } from '@copilotz/chat-ui';\nimport type { InternalChatMessage } from './activity.ts';\nimport { resolveAssetsInMessages } from './assetsService.ts';\nimport {\n ContractViolation,\n expectRecord,\n expectString,\n expectStringValue,\n} from './contract.ts';\nimport type { RestMessage } from './copilotzService.ts';\nimport { resolveHydratedMessageSender, type SenderResolutionOptions } from './senders.ts';\nimport {\n extractToolCallsFromServerMessage,\n extractToolResultUpdateFromMessage,\n type ToolResultUpdate,\n} from './toolActivity.ts';\n\nexport type HydratedMessageBatch = {\n viewMessages: InternalChatMessage[];\n toolResultUpdates: ToolResultUpdate[];\n};\n\ntype MessageContractOptions = {\n senderOptions?: SenderResolutionOptions;\n createId?: () => string;\n now?: () => number;\n onToolOutput?: (output: Record<string, unknown>) => void;\n};\n\nexport const isInternalMessageMetadata = (\n metadata?: Record<string, unknown> | null,\n): boolean => metadata?.visibility === 'internal';\n\nconst defaultCreateId = () =>\n (globalThis.crypto?.randomUUID?.() ?? `id-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`) as string;\n\nconst defaultNow = () => Date.now();\nconst roleBySender = {\n user: 'user',\n agent: 'assistant',\n tool: 'assistant',\n system: 'system',\n} as const;\n\nconst expectNumber = (value: unknown, path: string): number => {\n if (typeof value !== 'number' || Number.isNaN(value)) throw new ContractViolation(`${path} must be a number`);\n return value;\n};\n\nconst extractAttachments = (\n metadata: Record<string, unknown> | undefined,\n): MediaAttachment[] => {\n if (metadata?.attachments === undefined) return [];\n if (!Array.isArray(metadata.attachments)) {\n throw new ContractViolation('message.metadata.attachments must be an array');\n }\n\n return metadata.attachments.map((value, index) => {\n const path = `message.metadata.attachments[${index}]`;\n const att = expectRecord(value, path);\n const base = {\n kind: expectString(att.kind, `${path}.kind`),\n dataUrl: expectString(att.dataUrl, `${path}.dataUrl`),\n mimeType: expectString(att.mimeType, `${path}.mimeType`),\n };\n if (base.kind === 'image') return base as MediaAttachment;\n if (base.kind === 'audio') return {\n ...base,\n ...(att.durationMs !== undefined ? { durationMs: expectNumber(att.durationMs, `${path}.durationMs`) } : {}),\n } as MediaAttachment;\n if (base.kind === 'video') return {\n ...base,\n ...(att.durationMs !== undefined ? { durationMs: expectNumber(att.durationMs, `${path}.durationMs`) } : {}),\n ...(att.poster !== undefined ? { poster: expectString(att.poster, `${path}.poster`) } : {}),\n } as MediaAttachment;\n throw new ContractViolation(`${path}.kind must be image, audio, or video`);\n });\n};\n\nconst assertRestMessageContract = (msg: RestMessage): void => {\n expectString(msg.id, 'message.id');\n expectString(msg.threadId, 'message.threadId');\n if (!(msg.senderType in roleBySender)) throw new ContractViolation('message.senderType must be user, agent, tool, or system');\n expectStringValue(msg.content, 'message.content');\n if (msg.metadata !== undefined && msg.metadata !== null) expectRecord(msg.metadata, 'message.metadata');\n if (msg.createdAt !== undefined) expectString(msg.createdAt, 'message.createdAt');\n};\n\nexport const shouldRenderHydratedMessage = (msg: RestMessage): boolean => {\n assertRestMessageContract(msg);\n const meta = msg.metadata ?? {};\n if (isInternalMessageMetadata(meta)) {\n return false;\n }\n const text = expectStringValue(msg.content, 'message.content').trim();\n const hasText = text.length > 0;\n const hasToolCalls = extractToolCallsFromServerMessage(msg).length > 0;\n const hasAttachments = extractAttachments(meta).length > 0;\n if (msg.senderType === 'tool') {\n return hasAttachments;\n }\n return hasText || hasToolCalls || hasAttachments;\n};\n\nexport const convertServerMessage = (\n msg: RestMessage,\n options: MessageContractOptions = {},\n): InternalChatMessage => {\n assertRestMessageContract(msg);\n const timestamp = msg.createdAt ? new Date(msg.createdAt).getTime() : (options.now ?? defaultNow)();\n const metadata = msg.metadata ?? undefined;\n const attachments = extractAttachments(metadata);\n const messageContent = expectStringValue(msg.content, 'message.content');\n const role = roleBySender[msg.senderType as keyof typeof roleBySender];\n\n const parsedToolCalls = extractToolCallsFromServerMessage(msg);\n const shouldRenderToolCalls = msg.senderType !== 'tool';\n const mappedToolCalls = parsedToolCalls.map((toolCall) => ({\n id: toolCall.id ?? (options.createId ?? defaultCreateId)(),\n name: toolCall.name,\n arguments: toolCall.arguments,\n status: toolCall.status,\n ...(toolCall.result !== undefined ? { result: toolCall.result } : {}),\n } satisfies ToolCall));\n\n const hasToolCalls = shouldRenderToolCalls && mappedToolCalls.length > 0;\n const isToolSender = msg.senderType === 'tool';\n const content =\n isToolSender\n ? ''\n : messageContent;\n\n const reasoning = typeof msg.reasoning === 'string' && msg.reasoning.length > 0\n ? msg.reasoning\n : undefined;\n const activityItems: AssistantActivityItem[] = [\n ...(reasoning ? [{\n id: `${msg.id}:thinking`,\n kind: 'thinking' as const,\n status: 'complete' as const,\n completedAt: timestamp,\n details: { reasoning },\n }] : []),\n ...(hasToolCalls ? mappedToolCalls.map((toolCall) => ({\n id: toolCall.id,\n kind: 'tool' as const,\n status: toolCall.status === 'failed'\n ? 'failed' as const\n : toolCall.status === 'completed'\n ? 'complete' as const\n : 'active' as const,\n toolName: toolCall.name,\n startedAt: toolCall.startTime,\n completedAt: toolCall.endTime,\n details: {\n toolCall,\n ...(toolCall.result !== undefined ? { result: toolCall.result } : {}),\n },\n })) : []),\n ];\n\n const sender = resolveHydratedMessageSender(msg, options.senderOptions);\n\n return {\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 activity: activityItems.length > 0 ? { items: activityItems } : undefined,\n sender,\n };\n};\n\nexport const prepareHydratedMessages = async (\n rawMessages: RestMessage[],\n options: MessageContractOptions = {},\n): Promise<HydratedMessageBatch> => {\n rawMessages.forEach(assertRestMessageContract);\n const resolvedMessages = await resolveAssetsInMessages(rawMessages);\n\n resolvedMessages.forEach((msg) => {\n if (msg.senderType === 'tool') {\n const metadata = msg.metadata ?? undefined;\n if (!metadata) {\n throw new ContractViolation('tool message requires metadata');\n }\n options.onToolOutput?.(metadata.output === undefined ? metadata : { output: metadata.output });\n }\n });\n\n const now = options.now ?? defaultNow;\n const toolResultUpdates = resolvedMessages\n .map((msg) => extractToolResultUpdateFromMessage(msg as RestMessage, now))\n .filter((update): update is ToolResultUpdate => update !== null);\n\n const viewMessages = resolvedMessages\n .filter(shouldRenderHydratedMessage)\n .map((msg) => convertServerMessage(msg, options));\n\n return {\n viewMessages,\n toolResultUpdates,\n };\n};\n"],"mappings":"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","names":["useEffect","forwardRef","createElement","useState","useCallback","useRef","useEffect","offset","payload","item","ContractViolation","expectRecord","expectString","rawBaseValue","rawBase","normalizedBase","API_BASE","apiUrl","useState","useRef","useEffect","useCallback","message","deleteThread","useEffect"]}
|
|
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/useUrlState.ts","../src/activity.ts","../src/contract.ts","../src/senders.ts","../src/messageContract.ts","../src/assetsService.ts","../src/toolActivity.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 userName,\n userAvatar,\n assistantName: userConfig?.branding?.title,\n agentOptions,\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 { getAttachmentKindFromMimeType, getMimeTypeFromDataUrl } from '@copilotz/chat-ui';\nimport type { AgentOption, ChatMessage as ChatViewMessage, ChatSender, ChatThread, MediaAttachment, ChatUserContext } from '@copilotz/chat-ui';\nimport { useUrlState } from './useUrlState';\nimport type { EventInterceptor, RunErrorInterceptor, SpecialChatState } from './specialState';\nimport type { RequestHeadersProvider, RestMessage, RestMessagePageInfo } from './copilotzService';\nimport {\n appendAssistantToolCall,\n closeAssistantMessage,\n finalizeAssistantMessage,\n hasVisibleAssistantOutput,\n type InternalChatMessage,\n updateAssistantMessageToken,\n toPublicChatMessage,\n} from './activity';\nimport {\n resolveAgentSender,\n resolveAssistantFallbackSender,\n resolveLiveEventSender,\n resolveUserSender,\n type SenderResolutionOptions,\n} from './senders';\nimport {\n convertServerMessage,\n isInternalMessageMetadata,\n prepareHydratedMessages,\n} from './messageContract';\nimport {\n applyToolResultUpdateToMessages,\n canAttachToStreamingAssistant,\n extractLiveToolCall,\n extractLiveToolResultUpdate,\n mergePersistedToolResults,\n messageAgentKey,\n matchesToolResultUpdate,\n prependUniqueMessages,\n type ToolResultUpdate,\n} from './toolActivity';\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\ntype ServerThread = Awaited<ReturnType<typeof fetchThreads>>[number];\ntype ServerMessage = RestMessage;\n\nconst THREAD_MESSAGES_PAGE_SIZE = 50;\n\nconst createEmptyMessagePageInfo = (): RestMessagePageInfo => ({\n hasMoreBefore: false,\n oldestMessageId: null,\n newestMessageId: null,\n});\n\nexport interface UseCopilotzOptions {\n userId: string | null;\n userName?: string;\n userAvatar?: string;\n assistantName?: string;\n agentOptions?: AgentOption[];\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 userName,\n userAvatar,\n assistantName,\n agentOptions = [],\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 senderOptionsRef = useRef<SenderResolutionOptions>({\n agents: agentOptions,\n user: userId ? { id: userId, name: userName, avatarUrl: userAvatar } : null,\n assistantName,\n });\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 senderOptionsRef.current = {\n agents: agentOptions,\n user: userId ? { id: userId, name: userName, avatarUrl: userAvatar } : null,\n assistantName,\n };\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 sender = resolveLiveEventSender(event, senderOptionsRef.current);\n const incomingAgentKey = sender.agentId ?? sender.id;\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] = {\n ...m,\n content: payload.content,\n isStreaming: false,\n isComplete: true,\n sender,\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 {\n id: generateId(),\n role: 'assistant',\n content: payload.content,\n timestamp: nowTs(),\n isStreaming: false,\n isComplete: true,\n metadata: liveMetadata,\n sender,\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 return prepareHydratedMessages(rawMessages, {\n senderOptions: senderOptionsRef.current,\n createId: generateId,\n now: nowTs,\n onToolOutput: processToolOutput,\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 || payload.mimeType || getMimeTypeFromDataUrl(payload.dataUrl) || 'application/octet-stream';\n const dataUrl = payload.dataUrl;\n const kind = getAttachmentKindFromMimeType(mimeType);\n\n const mediaAttachment: MediaAttachment = {\n kind,\n dataUrl,\n mimeType,\n ...(typeof payload.fileName === 'string' ? { fileName: payload.fileName } : {}),\n ...(typeof payload.size === 'number' ? { size: payload.size } : {}),\n };\n\n setMessages((prev) => prev.map((msg) => (msg.id === assistantMessageId\n ? {\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 assistantMessageId?: string;\n assistantSender?: ChatSender;\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 = params.assistantMessageId ?? generateId();\n let currentAssistantSender: ChatSender | undefined = params.assistantSender;\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 nextSender = opts?.agent\n ? resolveAgentSender(opts.agent, senderOptionsRef.current)\n : currentAssistantSender;\n if (nextSender) {\n currentAssistantSender = nextSender;\n }\n const nextAgentKey = currentAssistantSender?.agentId ?? currentAssistantSender?.id ?? null;\n\n const applyUpdate = (msg: InternalChatMessage): InternalChatMessage => {\n return {\n ...updateAssistantMessageToken(msg, {\n partial,\n isReasoning,\n }),\n ...(currentAssistantSender ? { sender: currentAssistantSender } : {}),\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.activity === next.activity && 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.activity === next.activity && 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 ...(currentAssistantSender ? { sender: currentAssistantSender } : {}),\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.activity === nextMessage.activity\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\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 const eventSender = resolveLiveEventSender(event, senderOptionsRef.current);\n currentAssistantSender = eventSender;\n const eventAgentKey = currentAssistantSender.agentId ?? currentAssistantSender.id;\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 canHostActivity = (message: ChatViewMessage | undefined) => {\n if (!message) return false;\n return message.role === 'assistant' &&\n message.isStreaming &&\n message.content.trim().length === 0 &&\n !message.attachments?.length;\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 canHostActivity(message)\n ));\n if (currentIdx >= 0) {\n const next = [...prev];\n next[currentIdx] = appendToolCall({\n ...next[currentIdx],\n isStreaming: true,\n isComplete: false,\n ...(currentAssistantSender ? { sender: currentAssistantSender } : {}),\n });\n return next;\n }\n\n const last = prev[prev.length - 1];\n if (canHostActivity(last) && canAttachToStreamingAssistant(\n last,\n eventAgentKey,\n )) {\n currentAssistantId = last.id;\n const next = [...prev];\n next[prev.length - 1] = appendToolCall({\n ...last,\n isStreaming: true,\n isComplete: false,\n ...(currentAssistantSender ? { sender: currentAssistantSender } : {}),\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 ...(currentAssistantSender ? { sender: currentAssistantSender } : {}),\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, {\n senderOptions: senderOptionsRef.current,\n createId: generateId,\n now: nowTs,\n });\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 sender: resolveUserSender({\n id: userId,\n name: (userContextSeedRef.current?.profile as any)?.full_name ?? userId,\n }),\n };\n\n const assistantSender = targetAgentNameRef.current\n ? resolveAgentSender(\n { id: targetAgentNameRef.current, name: targetAgentNameRef.current },\n senderOptionsRef.current,\n )\n : preferredAgentRef.current\n ? resolveAgentSender(\n { id: preferredAgentRef.current, name: preferredAgentRef.current },\n senderOptionsRef.current,\n )\n : resolveAssistantFallbackSender(senderOptionsRef.current);\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 sender: assistantSender,\n };\n\n // Add user message and assistant placeholder for typewriter loading effect\n setMessages((prev) => [...prev, userMessage as InternalChatMessage, 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 assistantMessageId: assistantPlaceholder.id,\n assistantSender,\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] = {\n ...message,\n content: 'Desculpe, ocorreu um erro ao gerar a resposta. Por favor, tente novamente.',\n isStreaming: false,\n isComplete: true,\n sender: message.sender ?? resolveAssistantFallbackSender(senderOptionsRef.current),\n };\n return updated;\n }\n\n return [\n ...finalized,\n {\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 sender: resolveAssistantFallbackSender(senderOptionsRef.current),\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 {\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 sender: resolveAssistantFallbackSender(senderOptionsRef.current),\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\nexport type 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 size: att.size,\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 lastCompletedText = \"\";\n let lastTokenWasReasoning = false;\n let hadNonReasoningContent = false;\n const collectedMessages: any[] = [];\n let collectedMedia: Record<string, string> | null = null;\n\n const resetTokenAggregation = () => {\n aggregatedText = \"\";\n aggregatedReasoning = \"\";\n lastTokenWasReasoning = false;\n hadNonReasoningContent = false;\n };\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 if (isComplete) {\n if (!isReasoning && tokenText) {\n lastCompletedText = tokenText;\n }\n resetTokenAggregation();\n }\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 const resultAnswer =\n typeof payload?.payload?.answer === \"string\"\n ? payload.payload.answer\n : typeof payload?.answer === \"string\"\n ? payload.answer\n : undefined;\n if (resultAnswer) {\n lastCompletedText = resultAnswer;\n }\n resetTokenAggregation();\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: lastCompletedText || 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","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 {\n AssistantActivityItem,\n AssistantActivityStatus,\n ChatMessage,\n ToolCall,\n} from '@copilotz/chat-ui';\n\nexport interface InternalChatMessage extends ChatMessage {}\n\nconst thinkingId = 'thinking';\nconst answeringId = 'answering';\n\nconst getItems = (message: InternalChatMessage): AssistantActivityItem[] =>\n Array.isArray(message.activity?.items) ? message.activity.items : [];\n\nconst setItems = <T extends InternalChatMessage>(\n message: T,\n items: AssistantActivityItem[],\n): T => ({\n ...message,\n activity: items.length > 0 ? { items } : undefined,\n});\n\nconst toolStatusToActivityStatus = (status: ToolCall['status']): AssistantActivityStatus => {\n if (status === 'failed') return 'failed';\n if (status === 'completed') return 'complete';\n return 'active';\n};\n\nconst upsertItem = <T extends InternalChatMessage>(\n message: T,\n item: AssistantActivityItem,\n): T => {\n const items = getItems(message);\n const index = items.findIndex((current) => current.id === item.id);\n if (index === -1) return setItems(message, [...items, item]);\n\n const next = [...items];\n next[index] = {\n ...next[index],\n ...item,\n details: {\n ...(next[index].details ?? {}),\n ...(item.details ?? {}),\n },\n };\n return setItems(message, next);\n};\n\nconst completeItems = <T extends InternalChatMessage>(\n message: T,\n shouldComplete: (item: AssistantActivityItem) => boolean,\n): T => setItems(message, getItems(message).map((item) => (\n item.status === 'active' && shouldComplete(item)\n ? { ...item, status: 'complete', completedAt: Date.now() }\n : item\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 return getItems(message).length > 0;\n};\n\nexport const toPublicChatMessage = (message: InternalChatMessage): ChatMessage => {\n if (message.role === 'assistant') return message;\n const { activity, ...rest } = message;\n return rest;\n};\n\nexport const updateAssistantMessageToken = (\n message: InternalChatMessage,\n params: {\n partial: string;\n isReasoning?: boolean;\n },\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n\n if (params.isReasoning) {\n return upsertItem({\n ...message,\n isStreaming: true,\n isComplete: false,\n }, {\n id: thinkingId,\n kind: 'thinking',\n status: 'active',\n startedAt: getItems(message).find((item) => item.id === thinkingId)?.startedAt ?? Date.now(),\n details: { reasoning: params.partial },\n });\n }\n\n return upsertItem(completeItems({\n ...message,\n content: params.partial,\n isStreaming: true,\n isComplete: false,\n }, (item) => item.kind === 'thinking' || item.kind === 'tool'), {\n id: answeringId,\n kind: 'answering',\n status: 'active',\n startedAt: getItems(message).find((item) => item.id === answeringId)?.startedAt ?? Date.now(),\n });\n};\n\nexport const appendAssistantToolCall = (\n message: InternalChatMessage,\n toolCall: ToolCall,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n const status = toolStatusToActivityStatus(toolCall.status);\n\n return upsertItem({\n ...message,\n isStreaming: true,\n isComplete: false,\n }, {\n id: toolCall.id,\n kind: 'tool',\n status,\n toolName: toolCall.name,\n startedAt: toolCall.startTime ?? Date.now(),\n ...(status !== 'active' ? { completedAt: toolCall.endTime ?? Date.now() } : {}),\n details: {\n toolCall,\n ...(toolCall.result !== undefined ? { result: toolCall.result } : {}),\n },\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 items = getItems(message);\n const index = items.findIndex((item) => (\n item.kind === 'tool' &&\n ((update.id && item.id === update.id) || (!update.id && item.toolName === update.name))\n ));\n if (index === -1) return message;\n\n const item = items[index];\n const toolCall = item.details?.toolCall;\n const nextToolCall = toolCall ? { ...toolCall, ...update } : {\n id: update.id ?? item.id,\n name: update.name,\n arguments: {},\n status: update.status,\n ...(update.result !== undefined ? { result: update.result } : {}),\n ...(update.endTime !== undefined ? { endTime: update.endTime } : {}),\n };\n const status = toolStatusToActivityStatus(update.status);\n const next = [...items];\n next[index] = {\n ...item,\n status,\n toolName: update.name,\n ...(status !== 'active' ? { completedAt: update.endTime ?? Date.now() } : {}),\n details: {\n ...(item.details ?? {}),\n toolCall: nextToolCall,\n ...(update.result !== undefined ? { result: update.result } : {}),\n },\n };\n return setItems(message, next);\n};\n\nexport const finalizeAssistantMessage = (\n message: InternalChatMessage,\n finalAnswer?: string,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n const completed = completeItems({\n ...message,\n ...(typeof finalAnswer === 'string' && finalAnswer.length > 0 ? { content: finalAnswer } : {}),\n isStreaming: false,\n isComplete: true,\n }, (item) => item.kind === 'thinking' || item.kind === 'answering');\n return setItems(completed, getItems(completed).filter((item) => item.kind !== 'answering'));\n};\n\nexport const closeAssistantMessage = (\n message: InternalChatMessage,\n): InternalChatMessage => {\n if (message.role !== 'assistant') return message;\n return completeItems({\n ...message,\n isStreaming: false,\n isComplete: true,\n }, () => true);\n};\n","export class ContractViolation extends Error {\n constructor(message: string) { super(message); this.name = 'ContractViolation'; }\n}\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const expectRecord = (value: unknown, path: string): Record<string, unknown> => {\n if (!isRecord(value)) throw new ContractViolation(`${path} must be an object`);\n return value;\n};\n\nexport const expectString = (value: unknown, path: string): string => {\n if (typeof value !== 'string' || value.trim().length === 0) throw new ContractViolation(`${path} must be a non-empty string`);\n return value;\n};\n\nexport const expectOptionalString = (value: unknown, path: string): string | undefined => {\n if (value === undefined || value === null) return undefined;\n return expectString(value, path);\n};\n\nexport const expectStringValue = (value: unknown, path: string): string => {\n if (typeof value !== 'string') throw new ContractViolation(`${path} must be a string`);\n return value;\n};\n","import type { AgentOption, ChatSender } from '@copilotz/chat-ui';\nimport {\n ContractViolation,\n expectOptionalString,\n expectRecord,\n expectString,\n isRecord,\n} from './contract.ts';\n\ntype SenderType = ChatSender['type'];\ntype AgentIdentity = { id?: string | null; name?: string | null };\ntype UserIdentity = { id: string; name?: string | null; avatarUrl?: string | null };\n\ntype ServerMessageLike = {\n senderId: string | null;\n senderType: string;\n senderUserId?: string | null;\n metadata?: Record<string, unknown> | null;\n};\n\nexport type SenderResolutionOptions = {\n agents?: AgentOption[];\n user?: UserIdentity | null;\n assistantName?: string | null;\n};\n\nconst clean = (value: string | null | undefined): string | undefined =>\n typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n\nconst expectSenderType = (value: unknown, path: string): SenderType => {\n if (value === 'user' || value === 'agent' || value === 'tool' || value === 'system') return value;\n throw new ContractViolation(`${path} must be user, agent, tool, or system`);\n};\n\nconst defined = <T extends Record<string, unknown>>(value: T): T =>\n Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n\nconst findAgent = (\n agents: AgentOption[] | undefined,\n ...candidates: Array<string | undefined>\n): AgentOption | undefined => {\n const values = candidates.filter(Boolean).map((value) => value!.toLowerCase());\n if (!agents || values.length === 0) return undefined;\n return agents.find((agent) =>\n values.includes(agent.id.toLowerCase()) ||\n values.includes(agent.name.toLowerCase())\n );\n};\n\nconst fromAgent = (\n agent: AgentOption,\n overrides: Partial<ChatSender> = {},\n): ChatSender => defined({\n type: overrides.type ?? 'agent',\n id: agent.id,\n name: agent.name,\n agentId: agent.id,\n avatarUrl: agent.avatarUrl,\n color: agent.color,\n ...overrides,\n});\n\nexport const resolveUserSender = (user: UserIdentity): ChatSender => defined({\n type: 'user',\n id: user.id,\n externalId: user.id,\n name: clean(user.name) ?? user.id,\n avatarUrl: clean(user.avatarUrl),\n});\n\nexport const resolveAssistantFallbackSender = (\n options: SenderResolutionOptions = {},\n): ChatSender => ({\n type: 'agent',\n id: 'assistant',\n name: clean(options.assistantName) ?? 'Assistant',\n agentId: 'assistant',\n});\n\nexport const resolveAgentSender = (\n identity: AgentIdentity,\n options: SenderResolutionOptions = {},\n overrides: Partial<ChatSender> = {},\n): ChatSender => {\n const id = expectString(identity.id, 'agent.id');\n const name = expectString(identity.name, 'agent.name');\n const agent = findAgent(options.agents, id, name);\n if (agent) {\n return fromAgent(agent, defined({\n ...overrides,\n externalId: id && id !== agent.id ? id : undefined,\n }));\n }\n\n return defined({\n type: overrides.type ?? 'agent',\n id,\n name,\n agentId: id,\n ...overrides,\n });\n};\n\nexport const resolveHydratedMessageSender = (\n message: ServerMessageLike,\n options: SenderResolutionOptions = {},\n): ChatSender => {\n const metadata = message.metadata ? expectRecord(message.metadata, 'message.metadata') : {};\n const type = expectSenderType(message.senderType, 'message.senderType');\n const storedId = expectOptionalString(message.senderId, 'message.senderId');\n const participantId = expectOptionalString(metadata.senderParticipantId, 'message.metadata.senderParticipantId') ??\n expectOptionalString(message.senderUserId, 'message.senderUserId');\n const externalId = expectString(metadata.senderExternalId, 'message.metadata.senderExternalId');\n const displayName = expectString(metadata.senderDisplayName, 'message.metadata.senderDisplayName');\n\n if (type === 'agent' || type === 'tool') {\n const agent = findAgent(options.agents, externalId, displayName, storedId);\n if (agent) {\n return fromAgent(agent, defined({\n type,\n participantId: participantId ?? storedId,\n externalId: externalId && externalId !== agent.id ? externalId : undefined,\n }));\n }\n\n return defined({\n type,\n id: externalId,\n name: displayName,\n agentId: externalId,\n participantId: participantId ?? storedId,\n externalId,\n });\n }\n\n if (type === 'user') {\n return defined({\n type: 'user',\n id: externalId,\n externalId,\n name: displayName,\n avatarUrl: clean(options.user?.avatarUrl),\n participantId: participantId ?? storedId,\n });\n }\n\n return defined({\n type: 'system',\n id: externalId,\n name: displayName,\n participantId: participantId ?? storedId,\n externalId,\n });\n};\n\nexport const resolveLiveEventSender = (\n event: unknown,\n options: SenderResolutionOptions = {},\n): ChatSender => {\n const raw = expectRecord(event, 'stream event');\n const payload = raw.payload === undefined ? raw : expectRecord(raw.payload, 'stream event.payload');\n const agent = payload.agent ?? raw.agent;\n if (isRecord(agent)) {\n return resolveAgentSender({\n id: expectString(agent.id, 'stream event.payload.agent.id'),\n name: expectString(agent.name, 'stream event.payload.agent.name'),\n }, options);\n }\n\n const sender = payload.sender ?? raw.sender;\n if (!isRecord(sender)) {\n throw new ContractViolation('stream event sender contract requires payload.agent or payload.sender');\n }\n\n const type = expectSenderType(sender.type ?? payload.senderType, 'stream event.payload.sender.type');\n if (type !== 'user') {\n return resolveAgentSender({\n id: expectString(sender.id ?? sender.externalId, 'stream event.payload.sender.id'),\n name: expectString(sender.name, 'stream event.payload.sender.name'),\n }, options, { type });\n }\n\n if (!options.user) {\n throw new ContractViolation('user stream sender requires current user context');\n }\n return resolveUserSender(options.user);\n};\n","import { getAttachmentKindFromMimeType, getMimeTypeFromDataUrl } from '@copilotz/chat-ui';\nimport type { AssistantActivityItem, MediaAttachment, ToolCall } from '@copilotz/chat-ui';\nimport type { InternalChatMessage } from './activity.ts';\nimport { resolveAssetsInMessages } from './assetsService.ts';\nimport {\n ContractViolation,\n expectRecord,\n expectString,\n expectStringValue,\n} from './contract.ts';\nimport type { RestMessage } from './copilotzService.ts';\nimport { resolveHydratedMessageSender, type SenderResolutionOptions } from './senders.ts';\nimport {\n extractToolCallsFromServerMessage,\n extractToolResultUpdateFromMessage,\n type ToolResultUpdate,\n} from './toolActivity.ts';\n\nexport type HydratedMessageBatch = {\n viewMessages: InternalChatMessage[];\n toolResultUpdates: ToolResultUpdate[];\n};\n\ntype MessageContractOptions = {\n senderOptions?: SenderResolutionOptions;\n createId?: () => string;\n now?: () => number;\n onToolOutput?: (output: Record<string, unknown>) => void;\n};\n\nexport const isInternalMessageMetadata = (\n metadata?: Record<string, unknown> | null,\n): boolean => metadata?.visibility === 'internal';\n\nconst defaultCreateId = () =>\n (globalThis.crypto?.randomUUID?.() ?? `id-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`) as string;\n\nconst defaultNow = () => Date.now();\nconst roleBySender = {\n user: 'user',\n agent: 'assistant',\n tool: 'assistant',\n system: 'system',\n} as const;\n\nconst expectNumber = (value: unknown, path: string): number => {\n if (typeof value !== 'number' || Number.isNaN(value)) throw new ContractViolation(`${path} must be a number`);\n return value;\n};\n\nconst extractAttachments = (\n metadata: Record<string, unknown> | undefined,\n): MediaAttachment[] => {\n if (metadata?.attachments === undefined) return [];\n if (!Array.isArray(metadata.attachments)) {\n throw new ContractViolation('message.metadata.attachments must be an array');\n }\n\n return metadata.attachments.map((value, index) => {\n const path = `message.metadata.attachments[${index}]`;\n const att = expectRecord(value, path);\n const dataUrl = expectString(att.dataUrl, `${path}.dataUrl`);\n const mimeType = typeof att.mimeType === 'string' && att.mimeType.trim().length > 0\n ? att.mimeType\n : getMimeTypeFromDataUrl(dataUrl) || 'application/octet-stream';\n const inferredKind = getAttachmentKindFromMimeType(mimeType);\n const normalizedKind = inferredKind;\n const base = {\n kind: normalizedKind,\n dataUrl,\n mimeType,\n ...(typeof att.fileName === 'string' ? { fileName: att.fileName } : {}),\n ...(att.size !== undefined ? { size: expectNumber(att.size, `${path}.size`) } : {}),\n };\n if (normalizedKind === 'image') return base as MediaAttachment;\n if (normalizedKind === 'audio') return {\n ...base,\n ...(att.durationMs !== undefined ? { durationMs: expectNumber(att.durationMs, `${path}.durationMs`) } : {}),\n } as MediaAttachment;\n if (normalizedKind === 'video') return {\n ...base,\n ...(att.durationMs !== undefined ? { durationMs: expectNumber(att.durationMs, `${path}.durationMs`) } : {}),\n ...(att.poster !== undefined ? { poster: expectString(att.poster, `${path}.poster`) } : {}),\n } as MediaAttachment;\n return base as MediaAttachment;\n });\n};\n\nconst assertRestMessageContract = (msg: RestMessage): void => {\n expectString(msg.id, 'message.id');\n expectString(msg.threadId, 'message.threadId');\n if (!(msg.senderType in roleBySender)) throw new ContractViolation('message.senderType must be user, agent, tool, or system');\n expectStringValue(msg.content, 'message.content');\n if (msg.metadata !== undefined && msg.metadata !== null) expectRecord(msg.metadata, 'message.metadata');\n if (msg.createdAt !== undefined) expectString(msg.createdAt, 'message.createdAt');\n};\n\nexport const shouldRenderHydratedMessage = (msg: RestMessage): boolean => {\n assertRestMessageContract(msg);\n const meta = msg.metadata ?? {};\n if (isInternalMessageMetadata(meta)) {\n return false;\n }\n const text = expectStringValue(msg.content, 'message.content').trim();\n const hasText = text.length > 0;\n const hasToolCalls = extractToolCallsFromServerMessage(msg).length > 0;\n const hasAttachments = extractAttachments(meta).length > 0;\n if (msg.senderType === 'tool') {\n return hasAttachments;\n }\n return hasText || hasToolCalls || hasAttachments;\n};\n\nexport const convertServerMessage = (\n msg: RestMessage,\n options: MessageContractOptions = {},\n): InternalChatMessage => {\n assertRestMessageContract(msg);\n const timestamp = msg.createdAt ? new Date(msg.createdAt).getTime() : (options.now ?? defaultNow)();\n const metadata = msg.metadata ?? undefined;\n const attachments = extractAttachments(metadata);\n const messageContent = expectStringValue(msg.content, 'message.content');\n const role = roleBySender[msg.senderType as keyof typeof roleBySender];\n\n const parsedToolCalls = extractToolCallsFromServerMessage(msg);\n const shouldRenderToolCalls = msg.senderType !== 'tool';\n const mappedToolCalls = parsedToolCalls.map((toolCall) => ({\n id: toolCall.id ?? (options.createId ?? defaultCreateId)(),\n name: toolCall.name,\n arguments: toolCall.arguments,\n status: toolCall.status,\n ...(toolCall.result !== undefined ? { result: toolCall.result } : {}),\n } satisfies ToolCall));\n\n const hasToolCalls = shouldRenderToolCalls && mappedToolCalls.length > 0;\n const isToolSender = msg.senderType === 'tool';\n const content =\n isToolSender\n ? ''\n : messageContent;\n\n const reasoning = typeof msg.reasoning === 'string' && msg.reasoning.length > 0\n ? msg.reasoning\n : undefined;\n const activityItems: AssistantActivityItem[] = [\n ...(reasoning ? [{\n id: `${msg.id}:thinking`,\n kind: 'thinking' as const,\n status: 'complete' as const,\n completedAt: timestamp,\n details: { reasoning },\n }] : []),\n ...(hasToolCalls ? mappedToolCalls.map((toolCall) => ({\n id: toolCall.id,\n kind: 'tool' as const,\n status: toolCall.status === 'failed'\n ? 'failed' as const\n : toolCall.status === 'completed'\n ? 'complete' as const\n : 'active' as const,\n toolName: toolCall.name,\n startedAt: toolCall.startTime,\n completedAt: toolCall.endTime,\n details: {\n toolCall,\n ...(toolCall.result !== undefined ? { result: toolCall.result } : {}),\n },\n })) : []),\n ];\n\n const sender = resolveHydratedMessageSender(msg, options.senderOptions);\n\n return {\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 activity: activityItems.length > 0 ? { items: activityItems } : undefined,\n sender,\n };\n};\n\nexport const prepareHydratedMessages = async (\n rawMessages: RestMessage[],\n options: MessageContractOptions = {},\n): Promise<HydratedMessageBatch> => {\n rawMessages.forEach(assertRestMessageContract);\n const resolvedMessages = await resolveAssetsInMessages(rawMessages);\n\n resolvedMessages.forEach((msg) => {\n if (msg.senderType === 'tool') {\n const metadata = msg.metadata ?? undefined;\n if (!metadata) {\n throw new ContractViolation('tool message requires metadata');\n }\n options.onToolOutput?.(metadata.output === undefined ? metadata : { output: metadata.output });\n }\n });\n\n const now = options.now ?? defaultNow;\n const toolResultUpdates = resolvedMessages\n .map((msg) => extractToolResultUpdateFromMessage(msg as RestMessage, now))\n .filter((update): update is ToolResultUpdate => update !== null);\n\n const viewMessages = resolvedMessages\n .filter(shouldRenderHydratedMessage)\n .map((msg) => convertServerMessage(msg, options));\n\n return {\n viewMessages,\n toolResultUpdates,\n };\n};\n","import { getAttachmentKindFromMimeType, getMimeTypeFromDataUrl } from '@copilotz/chat-ui';\n\n// Minimal API client for Copilotz assets\n\nclass ContractViolation extends Error { name = 'ContractViolation'; }\nconst expectRecord = (value: unknown, path: string): Record<string, unknown> => {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) return value as Record<string, unknown>;\n throw new ContractViolation(`${path} must be an object`);\n};\nconst expectString = (value: unknown, path: string): string => {\n if (typeof value === 'string' && value.trim().length > 0) return value;\n throw new ContractViolation(`${path} must be a non-empty string`);\n};\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 const envelope = expectRecord(body, 'asset response');\n const data = expectRecord(envelope.data, 'asset response.data') as FetchAssetResult;\n if (typeof data.error === 'string' && data.error.length > 0) {\n throw new Error(data.error);\n }\n if (typeof data.dataUrl !== 'string' || data.dataUrl.length === 0) {\n throw new ContractViolation(`asset response.data.dataUrl is required for ${refOrId}`);\n }\n return {\n dataUrl: data.dataUrl,\n mime: typeof data.mime === 'string' ? data.mime : undefined,\n assetId: expectString(data.assetId, 'asset response.data.assetId'),\n };\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 === null || msg.metadata === undefined\n ? undefined\n : expectRecord(msg.metadata, 'message.metadata');\n const attachments = meta?.attachments === undefined\n ? undefined\n : Array.isArray(meta.attachments)\n ? meta.attachments.map((att, index) =>\n expectRecord(att, `message.metadata.attachments[${index}]`)\n )\n : (() => {\n throw new ContractViolation('message.metadata.attachments must be an array');\n })();\n\n if (!attachments || attachments.length === 0) {\n return msg;\n }\n\n const newAttachments = await Promise.all(attachments.map(async (att, index) => {\n const assetRef = typeof att.assetRef === 'string' ? att.assetRef : undefined;\n if (!assetRef) return att;\n\n const { dataUrl, mime } = await resolveAssetRef(assetRef);\n const mimeType = typeof att.mimeType === 'string'\n ? att.mimeType\n : mime || getMimeTypeFromDataUrl(dataUrl) || 'application/octet-stream';\n const inferredKind = getAttachmentKindFromMimeType(mimeType);\n return {\n ...att,\n kind: inferredKind,\n dataUrl,\n mimeType,\n } as Record<string, unknown>;\n }));\n\n const newMeta = { ...meta, attachments: newAttachments } as Record<string, unknown>;\n return { ...msg, metadata: newMeta };\n }));\n}\n","import type { AssistantActivityItem, ChatMessage as ChatViewMessage } from '@copilotz/chat-ui';\nimport { applyAssistantToolResult, type InternalChatMessage } from './activity.ts';\nimport {\n ContractViolation,\n expectRecord,\n expectString,\n expectStringValue,\n isRecord,\n} from './contract.ts';\nimport type { RestMessage } from './copilotzService.ts';\n\nexport type ToolCallStatus = 'pending' | 'running' | 'completed' | 'failed';\n\nexport type ParsedToolCall = {\n id?: string;\n name: string;\n arguments: Record<string, unknown>;\n status: ToolCallStatus;\n result?: unknown;\n};\n\nexport type ToolResultUpdate = {\n id?: string;\n name?: string;\n status: ToolCallStatus;\n result?: unknown;\n endTime: number;\n};\n\nconst fail = (message: string): never => {\n throw new ContractViolation(message);\n};\n\nexport const expectToolStatus = (status: unknown, path: string): ToolCallStatus => {\n if (status === 'pending') return 'pending';\n if (status === 'running' || status === 'processing') return 'running';\n if (status === 'failed') return 'failed';\n if (status === 'completed') return 'completed';\n return fail(`${path} must be pending, running, processing, completed, or failed`);\n};\n\nconst expectToolArguments = (\n value: unknown,\n path: string,\n): Record<string, unknown> => {\n if (isRecord(value)) return value;\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value);\n return expectRecord(parsed, path);\n } catch {\n return fail(`${path} must be an object or JSON object string`);\n }\n }\n return fail(`${path} must be an object or JSON object string`);\n};\n\nconst expectToolName = (tool: Record<string, unknown>, path: string): string => {\n const name = typeof tool.name === 'string' && tool.name.trim().length > 0\n ? tool.name\n : tool.id;\n return expectString(name, path);\n};\n\nexport const 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 findMatchingToolItem = (\n toolItems: AssistantActivityItem[],\n update: ToolResultUpdate,\n): AssistantActivityItem | undefined => toolItems.find((item) => (\n matchesToolResultUpdate(\n { id: item.id, name: item.toolName },\n update,\n ) &&\n (item.status === 'active' || item.details?.result === undefined)\n));\n\nexport const 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 const toolItems = message.activity?.items.filter((item) => item.kind === 'tool') ?? [];\n if (message.role !== 'assistant' || toolItems.length === 0) {\n continue;\n }\n\n const toolItem = findMatchingToolItem(toolItems, update);\n if (!toolItem) continue;\n\n nextMessages[i] = {\n ...applyAssistantToolResult(message, {\n ...(update.id ? { id: update.id } : {}),\n name: update.name ?? toolItem.toolName ?? toolItem.id,\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\nexport const extractLiveToolCall = (\n payload: Record<string, unknown> | undefined,\n): ParsedToolCall => {\n const payloadRecord = expectRecord(payload, 'TOOL_CALL payload');\n const toolCall = expectRecord(payloadRecord.toolCall, 'TOOL_CALL payload.toolCall');\n const tool = expectRecord(toolCall.tool, 'TOOL_CALL payload.toolCall.tool');\n\n return {\n id: expectString(toolCall.id, 'TOOL_CALL payload.toolCall.id'),\n name: expectToolName(tool, 'TOOL_CALL payload.toolCall.tool.id'),\n arguments: expectToolArguments(toolCall.args, 'TOOL_CALL payload.toolCall.args'),\n status: toolCall.status === undefined ? 'running' : expectToolStatus(toolCall.status, 'TOOL_CALL payload.toolCall.status'),\n ...(toolCall.output !== undefined ? { result: toolCall.output } : {}),\n };\n};\n\nexport const extractLiveToolResultUpdate = (\n payload: Record<string, unknown> | undefined,\n now: () => number = () => Date.now(),\n): ToolResultUpdate => {\n const payloadRecord = expectRecord(payload, 'TOOL_RESULT payload');\n const tool = expectRecord(payloadRecord.tool, 'TOOL_RESULT payload.tool');\n const result = payloadRecord.projectedOutput !== undefined\n ? payloadRecord.projectedOutput\n : payloadRecord.output;\n if (result === undefined) fail('TOOL_RESULT payload requires output or projectedOutput');\n\n return {\n id: expectString(payloadRecord.toolCallId, 'TOOL_RESULT payload.toolCallId'),\n name: expectToolName(tool, 'TOOL_RESULT payload.tool.id'),\n status: expectToolStatus(payloadRecord.status, 'TOOL_RESULT payload.status'),\n result,\n endTime: now(),\n };\n};\n\nexport const extractToolCallsFromServerMessage = (msg: RestMessage): ParsedToolCall[] => {\n const metadata = msg.metadata === null || msg.metadata === undefined\n ? undefined\n : expectRecord(msg.metadata, 'message.metadata');\n const topLevelToolCalls = readToolCallArray(msg.toolCalls, 'message.toolCalls');\n const metadataToolCalls = readToolCallArray(metadata?.toolCalls, 'message.metadata.toolCalls');\n\n const usedMetadataIndexes = new Set<number>();\n const parsed: ParsedToolCall[] = [];\n\n const findMatchingMetadataIndex = (toolCall: Record<string, unknown>): number => {\n const id = expectString(toolCall.id, 'message.toolCalls[].id');\n return metadataToolCalls.findIndex((candidate, idx) =>\n !usedMetadataIndexes.has(idx) && candidate.id === id\n );\n };\n\n const parseToolCall = (\n primary: Record<string, unknown>,\n secondary?: Record<string, unknown>,\n ): ParsedToolCall => {\n const id = expectString(primary.id ?? secondary?.id, 'toolCall.id');\n const tool = expectRecord(primary.tool ?? secondary?.tool, 'toolCall.tool');\n const name = expectToolName(tool, 'toolCall.tool.id');\n const argsRaw = primary.args ?? secondary?.args;\n const result = primary.output !== undefined\n ? primary.output\n : secondary?.output !== undefined\n ? secondary.output\n : primary.projectedOutput !== undefined\n ? primary.projectedOutput\n : secondary?.projectedOutput;\n const rawStatus = primary.status ?? secondary?.status;\n\n return {\n id,\n name,\n arguments: expectToolArguments(argsRaw, 'toolCall.args'),\n ...(result !== undefined ? { result } : {}),\n status: rawStatus === undefined ? 'running' : expectToolStatus(rawStatus, 'toolCall.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 readToolCallArray = (\n value: unknown,\n path: string,\n): Record<string, unknown>[] => {\n if (value === null || value === undefined) return [];\n if (!Array.isArray(value)) fail(`${path} must be an array`);\n return value.map((toolCall, index) => expectRecord(toolCall, `${path}[${index}]`));\n};\n\nexport const extractToolResultUpdateFromMessage = (\n msg: RestMessage,\n now: () => number = () => Date.now(),\n): ToolResultUpdate | null => {\n if (msg.senderType !== 'tool') return null;\n\n const toolCalls = extractToolCallsFromServerMessage(msg);\n if (toolCalls.length === 0) fail('tool message requires metadata.toolCalls');\n\n const firstToolCall = toolCalls[0];\n if (firstToolCall.result === undefined) fail('tool result message requires tool call output');\n expectStringValue(msg.createdAt, 'tool result message.createdAt');\n\n return {\n id: firstToolCall.id,\n name: firstToolCall.name,\n result: firstToolCall.result,\n status: firstToolCall.status,\n endTime: new Date(msg.createdAt).getTime(),\n };\n};\n\nexport const 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\nexport const 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\nexport const messageAgentKey = (message: ChatViewMessage): string | null => {\n if (message.role !== 'assistant') return null;\n if (message.sender?.type === 'agent' || message.sender?.type === 'tool') {\n return message.sender.agentId ?? message.sender.id;\n }\n return null;\n};\n\nexport const 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"],"mappings":"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","names":["useEffect","forwardRef","createElement","useState","useCallback","useRef","useEffect","offset","payload","getAttachmentKindFromMimeType","getMimeTypeFromDataUrl","item","getAttachmentKindFromMimeType","getMimeTypeFromDataUrl","ContractViolation","expectRecord","expectString","rawBaseValue","rawBase","normalizedBase","API_BASE","apiUrl","getMimeTypeFromDataUrl","getAttachmentKindFromMimeType","useState","useRef","useEffect","useCallback","getMimeTypeFromDataUrl","getAttachmentKindFromMimeType","message","deleteThread","useEffect"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@copilotz/chat-adapter",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.8",
|
|
4
4
|
"description": "Copilotz chat adapter and API hook",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -22,12 +22,12 @@
|
|
|
22
22
|
"prepack": "npm run build"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
|
-
"@copilotz/chat-ui": "^0.7.
|
|
25
|
+
"@copilotz/chat-ui": "^0.7.6",
|
|
26
26
|
"react": ">=18",
|
|
27
27
|
"react-dom": ">=18"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@copilotz/chat-ui": "^0.7.
|
|
30
|
+
"@copilotz/chat-ui": "^0.7.6",
|
|
31
31
|
"@types/react": "^19.1.10",
|
|
32
32
|
"@types/react-dom": "^19.1.7",
|
|
33
33
|
"tsup": "^8.3.5",
|