@webless/agent 0.6.0 → 0.6.2

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/react/hooks/useAgentChat.ts","../src/runtime/client.ts","../src/runtime/capability.ts","../src/runtime/config.ts","../src/runtime/session-store.ts","../src/runtime/errors.ts","../src/react/lib/tool-card.ts","../src/react/persisted-conversation.ts","../src/react/placement.ts","../src/react/types/conversation.ts","../src/react/components/AgentRail/AgentRail.tsx","../src/react/hooks/useAgentColorScheme.ts","../src/react/components/AgentActivityBubble/AgentActivityBubble.tsx","../src/react/components/Composer/Composer.tsx","../src/react/components/FollowUpChips/FollowUpChips.tsx","../src/react/components/MessageBubble/MessageBubble.tsx","../src/react/components/BookingCard/BookingCard.tsx","../src/react/components/AssistEdgeTab/AssistEdgeTab.tsx","../src/react/components/AgentWidget/AgentWidget.tsx","../src/react/page-shift.ts","../src/react/hooks/useIsMobile.ts","../src/react/panel-controller.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createAgentClient } from \"../../runtime/client\";\nimport { formatAgentError } from \"../../runtime/errors\";\nimport type { AgentIndexVersion, AgentWorkItem } from \"../../runtime/types\";\nimport {\n buildAgentStorageKeyPrefix,\n getOrCreateVisitorSessionId,\n} from \"../../runtime/session-store\";\nimport {\n bookingOfferFromActionOutput,\n ensureBookingOfferText,\n extractToolCards,\n hideToolCardFences,\n visitorBookingPrefix,\n type BookingOffer,\n type VisitorBooking,\n} from \"../lib/tool-card\";\nimport {\n clearPendingWidgetBooking,\n clearPersistedAgentConversation,\n loadPendingWidgetBooking,\n loadPersistedAgentConversation,\n savePendingWidgetBooking,\n savePersistedAgentConversation,\n visitorTurnText,\n type PersistedAgentConversation,\n} from \"../persisted-conversation\";\nimport type {\n AgentRailPhase,\n AgentRailState,\n ConversationMessage,\n FollowUpSuggestion,\n ToolStep,\n} from \"../types/conversation\";\n\nconst DEFAULT_GREETING =\n \"Hi! I can search this site or bring in a specialist when it helps. What would you like to know?\";\n\nfunction createInitialState(greeting = DEFAULT_GREETING): AgentRailState {\n return {\n phase: \"idle\",\n messages: [\n {\n id: \"greeting\",\n role: \"agent\",\n text: greeting,\n createdAt: 0,\n },\n ],\n toolSteps: [],\n journey: null,\n followUps: [],\n streamingText: \"\",\n pendingOffer: null,\n error: null,\n };\n}\n\nfunction stateFromConversation(\n conversation: PersistedAgentConversation | null,\n initialState: AgentRailState\n): AgentRailState {\n if (!conversation || conversation.messages.length === 0) return initialState;\n return {\n ...initialState,\n messages: conversation.messages,\n phase: conversation.pending\n ? conversation.streamingText\n ? \"streaming\"\n : \"thinking\"\n : \"complete\",\n streamingText: conversation.streamingText,\n toolSteps: conversation.toolSteps,\n };\n}\n\nfunction upsertToolStep(\n steps: readonly ToolStep[],\n item: AgentWorkItem\n): ToolStep[] {\n const next = {\n id: item.id,\n kind: item.kind,\n label: item.label,\n state: item.state,\n ...(item.detail ? { detail: item.detail } : {}),\n } satisfies ToolStep;\n const index = steps.findIndex((step) => step.id === item.id);\n if (index < 0) return [...steps, next];\n return steps.map((step, stepIndex) => (stepIndex === index ? next : step));\n}\n\nfunction completeActivePlanning(steps: readonly ToolStep[]): ToolStep[] {\n return steps.map((step) =>\n step.kind === \"planning\" && step.state === \"active\"\n ? {\n ...step,\n detail: \"Prepared a response\",\n state: \"completed\" as const,\n }\n : step\n );\n}\n\nexport type UseAgentChatOptions = {\n customerId?: string;\n getUnpublishedPreviewGrant?: () => Promise<string>;\n indexId: string;\n previewBuildId?: string;\n version?: AgentIndexVersion;\n runtimeOrigin?: string;\n visitorSessionId?: string;\n storageKeyPrefix?: string;\n greeting?: string;\n};\n\nexport function useAgentChat({\n customerId,\n getUnpublishedPreviewGrant,\n indexId,\n previewBuildId,\n version,\n runtimeOrigin,\n visitorSessionId,\n storageKeyPrefix,\n greeting,\n}: UseAgentChatOptions) {\n const initialState = useMemo(\n () => createInitialState(greeting?.trim() || DEFAULT_GREETING),\n [greeting]\n );\n const previewGrantProviderRef = useRef(getUnpublishedPreviewGrant);\n previewGrantProviderRef.current = getUnpublishedPreviewGrant;\n const resolveUnpublishedPreviewGrant = () => {\n const provider = previewGrantProviderRef.current;\n if (!provider) {\n return Promise.reject(\n new Error(\n \"An unpublished preview grant is required to use the Agent Runtime preview.\"\n )\n );\n }\n return provider();\n };\n const resolvedStorageKeyPrefix = useMemo(\n () =>\n storageKeyPrefix?.trim() ||\n buildAgentStorageKeyPrefix({\n customerId,\n indexId,\n version,\n runtimeOrigin,\n }),\n [customerId, indexId, runtimeOrigin, storageKeyPrefix, version]\n );\n const visitorId = useMemo(\n () =>\n visitorSessionId?.trim() ||\n getOrCreateVisitorSessionId({\n storageKeyPrefix: resolvedStorageKeyPrefix,\n }),\n [resolvedStorageKeyPrefix, visitorSessionId]\n );\n const [state, setState] = useState<AgentRailState>(() =>\n stateFromConversation(\n loadPersistedAgentConversation(resolvedStorageKeyPrefix, visitorId),\n initialState\n )\n );\n const pendingBookingRef = useRef(\n loadPendingWidgetBooking(resolvedStorageKeyPrefix, visitorId),\n );\n const runRef = useRef<AbortController | null>(null);\n const clientRef = useRef(\n createAgentClient({\n customerId,\n getUnpublishedPreviewGrant: resolveUnpublishedPreviewGrant,\n indexId,\n previewBuildId,\n version,\n runtimeOrigin,\n visitorSessionId: visitorId,\n storageKeyPrefix: resolvedStorageKeyPrefix,\n })\n );\n const identityKey = `${customerId ?? \"\"}|${indexId}|${\n version ?? \"published\"\n }|${runtimeOrigin ?? \"\"}|${\n previewBuildId ?? \"\"\n }|${resolvedStorageKeyPrefix}|${visitorId}|${greeting ?? \"\"}`;\n const identityRef = useRef(identityKey);\n\n useEffect(() => {\n if (identityRef.current === identityKey) {\n return;\n }\n\n identityRef.current = identityKey;\n runRef.current?.abort();\n runRef.current = null;\n clientRef.current = createAgentClient({\n customerId,\n getUnpublishedPreviewGrant: resolveUnpublishedPreviewGrant,\n indexId,\n previewBuildId,\n version,\n runtimeOrigin,\n visitorSessionId: visitorId,\n storageKeyPrefix: resolvedStorageKeyPrefix,\n });\n pendingBookingRef.current = loadPendingWidgetBooking(\n resolvedStorageKeyPrefix,\n visitorId,\n );\n setState(\n stateFromConversation(\n loadPersistedAgentConversation(resolvedStorageKeyPrefix, visitorId),\n initialState\n )\n );\n }, [\n customerId,\n identityKey,\n indexId,\n initialState,\n previewBuildId,\n runtimeOrigin,\n resolvedStorageKeyPrefix,\n version,\n visitorId,\n ]);\n\n useEffect(() => {\n if (!hasVisitorMessages(state.messages)) return;\n savePersistedAgentConversation(resolvedStorageKeyPrefix, visitorId, {\n messages: state.messages,\n pending: isAgentBusy(state.phase),\n streamingText: state.streamingText,\n toolSteps: state.toolSteps,\n });\n }, [\n resolvedStorageKeyPrefix,\n state.messages,\n state.phase,\n state.streamingText,\n state.toolSteps,\n visitorId,\n ]);\n\n const reset = useCallback(() => {\n runRef.current?.abort();\n runRef.current = null;\n clientRef.current.reset();\n pendingBookingRef.current = null;\n clearPersistedAgentConversation(resolvedStorageKeyPrefix, visitorId);\n setState(initialState);\n }, [initialState, resolvedStorageKeyPrefix, visitorId]);\n\n const runTurn = useCallback(\n async (input: {\n controller: AbortController;\n initialText?: string;\n resume: boolean;\n visitorText: string;\n }) => {\n const { controller, initialText = \"\", resume, visitorText } = input;\n const { signal } = controller;\n const isActiveRun = () =>\n runRef.current === controller && !signal.aborted;\n\n try {\n let streamStarted = Boolean(initialText);\n let streamed = initialText;\n const capturedOffers: BookingOffer[] = [];\n const handlers = {\n onWork: (item: AgentWorkItem) => {\n if (!isActiveRun()) return;\n setState((prev) => ({\n ...prev,\n phase: item.state === \"active\" ? \"running-tools\" : prev.phase,\n toolSteps: upsertToolStep(prev.toolSteps, item),\n }));\n },\n onActionResult: (output: unknown) => {\n const offer = bookingOfferFromActionOutput(output);\n if (!offer) return;\n capturedOffers.push(offer);\n setState((prev) => ({ ...prev, pendingOffer: offer }));\n },\n onDelta: (delta: string) => {\n if (!isActiveRun()) return;\n if (!streamStarted) {\n streamStarted = true;\n setState((prev) => ({\n ...prev,\n phase: \"streaming\",\n toolSteps: completeActivePlanning(prev.toolSteps),\n streamingText: \"\",\n }));\n }\n streamed += delta;\n setState((prev) => ({\n ...prev,\n phase: \"streaming\",\n streamingText: hideToolCardFences(streamed),\n pendingOffer: prev.pendingOffer ?? capturedOffers.at(-1) ?? null,\n }));\n },\n onComplete: () => {\n if (!isActiveRun()) return;\n streamStarted = true;\n },\n };\n\n let finalText = resume\n ? await clientRef.current.resumeTurn({\n handlers,\n initialText,\n message: visitorText,\n signal,\n })\n : await clientRef.current.sendTurn(visitorText, { handlers, signal });\n\n if (resume && finalText === null) {\n finalText = await clientRef.current.sendTurn(visitorText, {\n handlers,\n signal,\n });\n }\n\n if (!isActiveRun() || finalText === null) return;\n\n const displayText = ensureBookingOfferText(\n finalText,\n capturedOffers.at(-1) ?? null,\n );\n const agentMessage: ConversationMessage = {\n id: `agent-${Date.now()}`,\n role: \"agent\",\n text: displayText,\n createdAt: Date.now(),\n };\n const parsedCards = extractToolCards(displayText);\n for (const card of parsedCards) {\n if (card.type === \"booking_confirmed\") {\n pendingBookingRef.current = card;\n savePendingWidgetBooking(resolvedStorageKeyPrefix, visitorId, card);\n }\n if (\n card.type === \"booking_canceled\" &&\n pendingBookingRef.current?.eventUri === card.eventUri\n ) {\n pendingBookingRef.current = null;\n clearPendingWidgetBooking(resolvedStorageKeyPrefix, visitorId);\n }\n }\n\n setState((prev) => ({\n ...prev,\n phase: \"complete\",\n messages: [...prev.messages, agentMessage],\n toolSteps: completeActivePlanning(prev.toolSteps),\n streamingText: \"\",\n pendingOffer: null,\n followUps: [],\n journey: null,\n }));\n runRef.current = null;\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\")\n return;\n if (!isActiveRun()) return;\n const message = formatAgentError(error);\n if (!message) return;\n setState((prev) => ({\n ...prev,\n phase: \"error\",\n toolSteps:\n prev.toolSteps.length === 1 &&\n prev.toolSteps[0]?.kind === \"planning\"\n ? []\n : prev.toolSteps.map((step) =>\n step.state === \"active\"\n ? {\n ...step,\n detail: \"Couldn’t complete this step\",\n state: \"error\" as const,\n }\n : step\n ),\n streamingText: \"\",\n pendingOffer: null,\n error: message,\n }));\n runRef.current = null;\n }\n },\n [resolvedStorageKeyPrefix, visitorId],\n );\n\n const rememberBooking = useCallback(\n (booking: VisitorBooking) => {\n const current = pendingBookingRef.current;\n if (\n current?.eventUri === booking.eventUri &&\n current.inviteeEmail === booking.inviteeEmail &&\n current.inviteeUri === booking.inviteeUri\n ) {\n return;\n }\n pendingBookingRef.current = booking;\n savePendingWidgetBooking(resolvedStorageKeyPrefix, visitorId, booking);\n },\n [resolvedStorageKeyPrefix, visitorId],\n );\n\n const forgetBooking = useCallback(\n (eventUri?: string) => {\n const current = pendingBookingRef.current;\n if (!current) return;\n if (eventUri && current.eventUri !== eventUri) return;\n pendingBookingRef.current = null;\n clearPendingWidgetBooking(resolvedStorageKeyPrefix, visitorId);\n },\n [resolvedStorageKeyPrefix, visitorId],\n );\n\n const submit = useCallback(\n async (\n visitorText: string,\n options?: { runtimeText?: string },\n ) => {\n if (runRef.current) {\n runRef.current.abort();\n clientRef.current.cancelActive();\n }\n const controller = new AbortController();\n runRef.current = controller;\n\n const booking = pendingBookingRef.current;\n const outgoing = options?.runtimeText ?? visitorText;\n const runtimeText = booking\n ? `${visitorBookingPrefix(booking)}\\n\\n${outgoing}`\n : outgoing;\n const visitorMessage: ConversationMessage = {\n id: `visitor-${Date.now()}`,\n role: \"visitor\",\n text: visitorText,\n createdAt: Date.now(),\n ...(runtimeText !== visitorText ? { runtimeText } : {}),\n };\n\n setState((prev) => ({\n ...prev,\n phase: \"thinking\",\n messages: [...prev.messages, visitorMessage],\n toolSteps: [\n {\n id: \"planning\",\n kind: \"planning\",\n label: \"Understanding your question\",\n state: \"active\",\n },\n ],\n journey: null,\n followUps: [],\n streamingText: \"\",\n pendingOffer: null,\n error: null,\n }));\n await runTurn({ controller, resume: false, visitorText: runtimeText });\n },\n [runTurn]\n );\n\n const retry = useCallback(async () => {\n const visitorMessage = [...state.messages]\n .reverse()\n .find((message) => message.role === \"visitor\");\n if (!visitorMessage) return;\n\n if (runRef.current) {\n runRef.current.abort();\n clientRef.current.cancelActive();\n }\n const controller = new AbortController();\n runRef.current = controller;\n\n setState((prev) => ({\n ...prev,\n phase: \"thinking\",\n toolSteps: [\n {\n id: \"planning\",\n kind: \"planning\",\n label: \"Understanding your question\",\n state: \"active\",\n },\n ],\n journey: null,\n followUps: [],\n streamingText: \"\",\n pendingOffer: null,\n error: null,\n }));\n await runTurn({\n controller,\n resume: false,\n visitorText: visitorTurnText(visitorMessage),\n });\n }, [runTurn, state.messages]);\n\n useEffect(() => {\n const conversation = loadPersistedAgentConversation(\n resolvedStorageKeyPrefix,\n visitorId\n );\n if (!conversation?.pending) return;\n const visitorMessage = [...conversation.messages]\n .reverse()\n .find((message) => message.role === \"visitor\");\n if (!visitorMessage) return;\n\n const controller = new AbortController();\n runRef.current = controller;\n void runTurn({\n controller,\n initialText: conversation.streamingText,\n resume: true,\n visitorText: visitorTurnText(visitorMessage),\n });\n\n return () => {\n if (runRef.current === controller) {\n runRef.current = null;\n }\n controller.abort();\n };\n }, [identityKey, resolvedStorageKeyPrefix, runTurn, visitorId]);\n\n useEffect(() => {\n return () => {\n runRef.current?.abort();\n runRef.current = null;\n };\n }, []);\n\n return {\n state,\n reset,\n retry,\n submit,\n rememberBooking,\n forgetBooking,\n visitorSessionId: visitorId,\n sessionId: clientRef.current.getActiveSessionId(),\n };\n}\n\nexport function hasVisitorMessages(messages: ConversationMessage[]) {\n return messages.some((message) => message.role === \"visitor\");\n}\n\nexport function createIdleSuggestions(): FollowUpSuggestion[] {\n return [\n { id: \"idle-1\", label: \"Hello — what can you do?\" },\n { id: \"idle-2\", label: \"Help me evaluate this product\" },\n { id: \"idle-3\", label: \"What should I ask you?\" },\n ];\n}\n\nexport function isAgentBusy(phase: AgentRailPhase) {\n return (\n phase === \"thinking\" || phase === \"running-tools\" || phase === \"streaming\"\n );\n}\n","import {\n Client,\n ClientError,\n type ClientSession,\n type MessageResponse,\n type MessageStreamEvent,\n} from \"eve/client\";\nimport {\n createAgentRuntimeCapability,\n type AgentRuntimeCapability,\n withCapabilityRefresh,\n} from \"./capability\";\nimport { resolveAgentRuntimeConfig } from \"./config\";\nimport {\n buildAgentStorageKeyPrefix,\n clearPersistedAgentSession,\n getOrCreateVisitorSessionId,\n loadPersistedAgentSession,\n savePersistedAgentSession,\n savePersistedAgentTurnMessage,\n type SessionStoreOptions,\n} from \"./session-store\";\nimport type {\n AgentClient,\n AgentClientOptions,\n AgentIndexVersion,\n AgentResumeTurnOptions,\n AgentSendTurnOptions,\n AgentStreamHandlers,\n AgentWorkItem,\n} from \"./types\";\n\nfunction isTurnBoundary(event: MessageStreamEvent) {\n return (\n event.type === \"session.waiting\" ||\n event.type === \"session.completed\" ||\n event.type === \"session.failed\"\n );\n}\n\nfunction applyMessageEvent(\n event: MessageStreamEvent,\n rendered: string,\n handlers: AgentStreamHandlers,\n workItems: Map<string, AgentWorkItem>\n) {\n applyWorkEvent(event, handlers, workItems);\n\n if (event.type === \"session.failed\") {\n throw new Error(event.data.message || event.data.code);\n }\n\n if (event.type === \"message.completed\") {\n handlers.onComplete?.();\n }\n\n if (event.type === \"action.result\") {\n const result = event.data.result;\n if (result && typeof result === \"object\" && \"output\" in result) {\n handlers.onActionResult?.(result.output);\n }\n }\n\n if (event.type !== \"message.appended\") return rendered;\n\n const { messageDelta, messageSoFar } = event.data;\n let delta = messageDelta;\n let next = rendered;\n if (messageSoFar.startsWith(rendered)) {\n delta = messageSoFar.slice(rendered.length);\n next = messageSoFar;\n } else if (messageDelta) {\n next += messageDelta;\n }\n if (delta) handlers.onDelta(delta);\n return next;\n}\n\nexport function isResumeTurnMessage(received: string, candidate: string) {\n if (received === candidate) return true;\n return Boolean(candidate) && received.endsWith(`\\n\\n${candidate}`);\n}\n\nfunction latestTurnEvents(events: readonly MessageStreamEvent[]) {\n let startIndex = -1;\n for (let index = events.length - 1; index >= 0; index -= 1) {\n if (events[index]?.type === \"message.received\") {\n startIndex = index;\n break;\n }\n }\n return startIndex >= 0 ? events.slice(startIndex) : [];\n}\n\nfunction renderTurn(events: readonly MessageStreamEvent[]) {\n let rendered = \"\";\n for (const event of events) {\n if (event.type !== \"message.appended\") continue;\n const { messageDelta, messageSoFar } = event.data;\n if (messageSoFar.startsWith(rendered)) {\n rendered = messageSoFar;\n } else if (messageDelta) {\n rendered += messageDelta;\n }\n }\n return rendered;\n}\n\nfunction emitWorkItem(\n item: AgentWorkItem,\n handlers: AgentStreamHandlers,\n workItems: Map<string, AgentWorkItem>\n) {\n workItems.set(item.id, item);\n handlers.onWork?.(item);\n handlers.onStep?.(item.label, item.detail);\n}\n\nfunction completePlanning(\n handlers: AgentStreamHandlers,\n workItems: Map<string, AgentWorkItem>,\n nextItems: readonly AgentWorkItem[] = []\n) {\n const planning = workItems.get(\"planning\");\n if (!planning || planning.state !== \"active\") return;\n const specialists = nextItems.filter((item) => item.kind === \"specialist\");\n const detail =\n specialists.length === 1\n ? `Delegating to ${specialists[0]?.label}`\n : specialists.length > 1\n ? `Delegating to ${specialists.length} specialists`\n : nextItems.some((item) => item.kind === \"search\")\n ? \"Using built-in Search & Discovery\"\n : \"Picked the best way to help\";\n emitWorkItem(\n {\n ...planning,\n detail,\n state: \"completed\",\n },\n handlers,\n workItems\n );\n}\n\nfunction specialistNameFromInput(input: Readonly<Record<string, unknown>>) {\n const message = input.message;\n if (typeof message !== \"string\") return undefined;\n const match = /^Webless-Agent-Name:\\s*(.+)$/imu.exec(message);\n return match?.[1]?.trim() || undefined;\n}\n\nfunction requestedWorkItem(\n action: Extract<\n Extract<\n MessageStreamEvent,\n { type: \"actions.requested\" }\n >[\"data\"][\"actions\"][number],\n { callId: string }\n >\n): AgentWorkItem | null {\n if (action.kind === \"tool-call\" && action.toolName === \"search_discovery\") {\n return {\n id: action.callId,\n kind: \"search\",\n label: \"Search & Discovery\",\n detail: \"Searching this site\",\n state: \"active\",\n };\n }\n\n if (\n action.kind === \"subagent-call\" ||\n action.kind === \"remote-agent-call\" ||\n (action.kind === \"tool-call\" && action.toolName === \"agent\")\n ) {\n const name = specialistNameFromInput(action.input) ?? \"Specialist\";\n return {\n id: action.callId,\n kind: \"specialist\",\n label: name,\n detail: \"Reviewing your question\",\n state: \"active\",\n };\n }\n\n return null;\n}\n\nexport function applyWorkEvent(\n event: MessageStreamEvent,\n handlers: AgentStreamHandlers,\n workItems: Map<string, AgentWorkItem>\n) {\n if (event.type === \"step.started\" && workItems.size === 0) {\n emitWorkItem(\n {\n id: \"planning\",\n kind: \"planning\",\n label: \"Understanding your question\",\n state: \"active\",\n },\n handlers,\n workItems\n );\n return;\n }\n\n if (event.type === \"actions.requested\") {\n const nextItems = event.data.actions.flatMap((action) => {\n const item = requestedWorkItem(action);\n return item ? [item] : [];\n });\n completePlanning(handlers, workItems, nextItems);\n for (const item of nextItems) emitWorkItem(item, handlers, workItems);\n return;\n }\n\n if (event.type === \"subagent.called\") {\n completePlanning(handlers, workItems);\n const current = workItems.get(event.data.callId);\n if (!current) {\n emitWorkItem(\n {\n id: event.data.callId,\n kind: \"specialist\",\n label: event.data.name || \"Specialist\",\n detail: \"Reviewing your question\",\n state: \"active\",\n },\n handlers,\n workItems\n );\n }\n return;\n }\n\n if (event.type === \"subagent.completed\") {\n const current = workItems.get(event.data.callId);\n if (!current) return;\n emitWorkItem(\n {\n ...current,\n detail: \"Guidance received\",\n state: \"completed\",\n },\n handlers,\n workItems\n );\n return;\n }\n\n if (event.type !== \"action.result\") return;\n const { result, status } = event.data;\n const current = workItems.get(result.callId);\n if (!current) return;\n const failed = status !== \"completed\" || result.isError === true;\n emitWorkItem(\n {\n ...current,\n detail: failed\n ? \"Couldn’t complete; continuing with available information\"\n : current.kind === \"search\"\n ? \"Found relevant site content\"\n : \"Guidance received\",\n state: failed ? \"error\" : \"completed\",\n },\n handlers,\n workItems\n );\n}\n\nclass AgentSession {\n private client: Client | undefined;\n private clientHost: string | undefined;\n private session: ClientSession | undefined;\n private activeResponse: MessageResponse | undefined;\n private readonly capability: AgentRuntimeCapability;\n\n constructor(\n private readonly indexId: string,\n private readonly version: AgentIndexVersion,\n private readonly runtimeOrigin: string,\n private readonly visitorSessionId: string,\n private readonly storeOptions: SessionStoreOptions,\n previewBuildId?: string,\n getUnpublishedPreviewGrant?: () => Promise<string>\n ) {\n this.capability = createAgentRuntimeCapability({\n getUnpublishedPreviewGrant,\n indexId,\n previewBuildId,\n runtimeOrigin,\n version,\n visitorSessionId,\n });\n }\n\n getActiveSessionId(): string | undefined {\n return (\n this.session?.state.sessionId ??\n loadPersistedAgentSession(this.visitorSessionId, this.storeOptions)\n ?.sessionId\n );\n }\n\n reset() {\n if (this.activeResponse) {\n void this.activeResponse.cancel().catch(() => {});\n } else {\n void this.session?.cancel().catch(() => {});\n }\n this.activeResponse = undefined;\n this.session = undefined;\n this.capability.invalidate();\n clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);\n }\n\n private persistSessionCursor(session: ClientSession) {\n savePersistedAgentSession(\n this.visitorSessionId,\n session.state.sessionId,\n session.state.streamIndex,\n this.storeOptions\n );\n }\n\n private ensureClient(): Client {\n const config = resolveAgentRuntimeConfig({\n indexId: this.indexId,\n version: this.version,\n runtimeOrigin: this.runtimeOrigin,\n });\n if (!config.indexId) {\n throw new Error(\"indexId is required.\");\n }\n\n if (this.client && this.clientHost === config.host) {\n return this.client;\n }\n\n this.activeResponse = undefined;\n this.session = undefined;\n this.client = new Client({\n auth: { bearer: () => this.capability.getAccessToken() },\n host: config.host,\n redirect: \"error\",\n });\n this.clientHost = config.host;\n return this.client;\n }\n\n private attachPersistedSession(client: Client): ClientSession | undefined {\n const persisted = loadPersistedAgentSession(\n this.visitorSessionId,\n this.storeOptions\n );\n if (!persisted?.sessionId) return undefined;\n\n return client.sessions.attach(persisted.sessionId, {\n streamIndex: persisted.streamIndex,\n });\n }\n\n async sendTurn(\n message: string,\n signal: AbortSignal,\n handlers: AgentStreamHandlers\n ): Promise<string> {\n const client = this.ensureClient();\n let response: MessageResponse | undefined;\n let session = this.session ?? this.attachPersistedSession(client);\n\n if (session) {\n this.session = session;\n try {\n const activeSession = session;\n savePersistedAgentTurnMessage(\n this.visitorSessionId,\n message,\n this.storeOptions\n );\n response = await withCapabilityRefresh(this.capability, () =>\n activeSession.send(message, { signal })\n );\n } catch (error) {\n if (\n error instanceof ClientError &&\n error.status === 409 &&\n error.code === \"session_not_active\"\n ) {\n clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);\n this.session = undefined;\n session = undefined;\n } else {\n throw error;\n }\n }\n }\n\n if (!response) {\n savePersistedAgentTurnMessage(\n this.visitorSessionId,\n message,\n this.storeOptions\n );\n const created = await withCapabilityRefresh(this.capability, () =>\n client.sessions.create({ message, signal })\n );\n response = created.response;\n session = created.session;\n this.session = session;\n this.persistSessionCursor(session);\n }\n\n this.activeResponse = response;\n let streamIndex = session?.state.streamIndex ?? 0;\n let rendered = \"\";\n const workItems = new Map<string, AgentWorkItem>();\n\n try {\n for await (const event of response) {\n if (signal.aborted) break;\n rendered = applyMessageEvent(event, rendered, handlers, workItems);\n streamIndex += 1;\n if (session) {\n savePersistedAgentSession(\n this.visitorSessionId,\n session.state.sessionId,\n streamIndex,\n this.storeOptions\n );\n }\n }\n } finally {\n this.activeResponse = undefined;\n if (session) {\n this.persistSessionCursor(session);\n }\n }\n\n if (!rendered.trim() && !signal.aborted) {\n throw new Error(\"Empty response from runtime\");\n }\n\n return rendered.trim();\n }\n\n async resumeTurn(\n message: string,\n signal: AbortSignal,\n handlers: AgentStreamHandlers,\n initialText = \"\"\n ): Promise<string | null> {\n const persisted = loadPersistedAgentSession(\n this.visitorSessionId,\n this.storeOptions\n );\n if (!persisted) return null;\n\n const client = this.ensureClient();\n const attached = client.sessions.attach(persisted.sessionId, {\n streamIndex: persisted.streamIndex,\n });\n const snapshot = await withCapabilityRefresh(this.capability, () =>\n attached.snapshot({ signal })\n );\n const turnEvents = latestTurnEvents(snapshot.events);\n const received = turnEvents[0];\n const lastSent = persisted.lastMessage;\n const inFlight = !turnEvents.some((event) => isTurnBoundary(event));\n if (\n received?.type !== \"message.received\" ||\n !(\n isResumeTurnMessage(received.data.message, message) ||\n (inFlight && lastSent !== undefined && received.data.message === lastSent)\n )\n ) {\n return null;\n }\n let rendered = renderTurn(turnEvents);\n const workItems = new Map<string, AgentWorkItem>();\n for (const event of turnEvents) {\n applyWorkEvent(event, handlers, workItems);\n }\n\n if (rendered.startsWith(initialText)) {\n const missedText = rendered.slice(initialText.length);\n if (missedText) handlers.onDelta(missedText);\n } else if (initialText.startsWith(rendered)) {\n rendered = initialText;\n } else if (!initialText.startsWith(rendered)) {\n rendered = initialText + rendered;\n }\n\n let session = client.sessions.attach(snapshot.session.sessionId, {\n streamIndex: snapshot.session.streamIndex,\n });\n this.session = session;\n this.persistSessionCursor(session);\n\n let snapshotBoundary: MessageStreamEvent | undefined;\n for (let index = turnEvents.length - 1; index >= 0; index -= 1) {\n const event = turnEvents[index];\n if (event && isTurnBoundary(event)) {\n snapshotBoundary = event;\n break;\n }\n }\n if (snapshotBoundary) {\n if (snapshotBoundary.type === \"session.failed\") {\n throw new Error(\n snapshotBoundary.data.message || snapshotBoundary.data.code\n );\n }\n handlers.onComplete?.();\n if (!rendered.trim()) throw new Error(\"Empty response from runtime\");\n return rendered.trim();\n }\n\n let streamIndex = snapshot.session.streamIndex;\n for await (const event of session.stream({ signal })) {\n if (signal.aborted) break;\n rendered = applyMessageEvent(event, rendered, handlers, workItems);\n streamIndex += 1;\n savePersistedAgentSession(\n this.visitorSessionId,\n session.state.sessionId,\n streamIndex,\n this.storeOptions\n );\n if (isTurnBoundary(event)) break;\n }\n\n session = client.sessions.attach(session.state.sessionId, { streamIndex });\n this.session = session;\n this.persistSessionCursor(session);\n\n if (!rendered.trim() && !signal.aborted) {\n throw new Error(\"Empty response from runtime\");\n }\n return rendered.trim();\n }\n\n cancelActive() {\n if (this.activeResponse) {\n this.activeResponse.cancel().catch(() => {});\n } else {\n this.session?.cancel().catch(() => {});\n }\n }\n}\n\nexport function createAgentClient(options: AgentClientOptions): AgentClient {\n const indexId = options.indexId.trim();\n if (!indexId) {\n throw new Error(\"indexId is required.\");\n }\n\n const version = options.version ?? \"published\";\n const runtimeOrigin = resolveAgentRuntimeConfig({\n indexId,\n runtimeOrigin: options.runtimeOrigin,\n version,\n }).origin;\n const storeOptions: SessionStoreOptions = {\n storageKeyPrefix:\n options.storageKeyPrefix?.trim() ||\n buildAgentStorageKeyPrefix({\n customerId: options.customerId,\n indexId,\n version,\n runtimeOrigin,\n }),\n };\n const visitorSessionId =\n options.visitorSessionId?.trim() ||\n getOrCreateVisitorSessionId(storeOptions);\n\n const session = new AgentSession(\n indexId,\n version,\n runtimeOrigin,\n visitorSessionId,\n storeOptions,\n options.previewBuildId,\n options.getUnpublishedPreviewGrant\n );\n\n return {\n indexId,\n version,\n runtimeOrigin,\n visitorSessionId,\n sendTurn: (message, sendOptions: AgentSendTurnOptions) =>\n session.sendTurn(\n message,\n sendOptions.signal ?? new AbortController().signal,\n sendOptions.handlers\n ),\n resumeTurn: (resumeOptions: AgentResumeTurnOptions) =>\n session.resumeTurn(\n resumeOptions.message,\n resumeOptions.signal ?? new AbortController().signal,\n resumeOptions.handlers,\n resumeOptions.initialText\n ),\n reset: () => session.reset(),\n cancelActive: () => session.cancelActive(),\n getActiveSessionId: () => session.getActiveSessionId(),\n };\n}\n","import { ClientError } from \"eve/client\";\nimport type { AgentIndexVersion } from \"./types\";\n\ntype RuntimeCapability = {\n accessToken: string;\n refreshAt: number;\n};\n\ntype AgentRuntimeCapabilityOptions = {\n getUnpublishedPreviewGrant?: () => Promise<string>;\n indexId: string;\n previewBuildId?: string;\n runtimeOrigin: string;\n version: AgentIndexVersion;\n visitorSessionId: string;\n fetchImplementation?: typeof fetch;\n now?: () => number;\n};\n\nconst MAX_REFRESH_SKEW_MS = 30_000;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseBootstrapResponse(\n value: unknown,\n indexId: string,\n now: number\n): RuntimeCapability {\n if (\n !isRecord(value) ||\n value.apiVersion !== \"webless.ai/agent-runtime-bootstrap/v1\" ||\n typeof value.accessToken !== \"string\" ||\n !value.accessToken ||\n typeof value.expiresAt !== \"string\" ||\n !isRecord(value.identity) ||\n value.identity.indexId !== indexId ||\n typeof value.identity.revision !== \"string\" ||\n !value.identity.revision ||\n typeof value.identity.tenantId !== \"string\" ||\n !value.identity.tenantId ||\n typeof value.origin !== \"string\" ||\n !value.origin ||\n value.tokenType !== \"Bearer\" ||\n typeof value.visitorSubject !== \"string\" ||\n !value.visitorSubject\n ) {\n throw new Error(\"Agent Runtime returned an invalid access response.\");\n }\n\n const expiresAt = Date.parse(value.expiresAt);\n if (!Number.isFinite(expiresAt) || expiresAt <= now) {\n throw new Error(\"Agent Runtime returned an expired access response.\");\n }\n\n const refreshSkew = Math.min(\n MAX_REFRESH_SKEW_MS,\n Math.floor((expiresAt - now) / 10)\n );\n return {\n accessToken: value.accessToken,\n refreshAt: expiresAt - refreshSkew,\n };\n}\n\nasync function readBootstrapError(response: Response): Promise<string> {\n const fallback = `Agent Runtime is unavailable (${response.status}).`;\n try {\n const value: unknown = await response.json();\n return isRecord(value) && typeof value.error === \"string\" && value.error\n ? value.error\n : fallback;\n } catch {\n return fallback;\n }\n}\n\nexport function createAgentRuntimeCapability(\n options: AgentRuntimeCapabilityOptions\n) {\n const fetchImplementation = options.fetchImplementation ?? fetch;\n const now = options.now ?? Date.now;\n let capability: RuntimeCapability | undefined;\n let generation = 0;\n let pendingBootstrap: Promise<RuntimeCapability> | undefined;\n\n const bootstrap = async (): Promise<RuntimeCapability> => {\n let previewGrant: string | undefined;\n const previewBuildId = options.previewBuildId?.trim();\n if (options.version === \"unpublished\") {\n previewGrant = previewBuildId\n ? undefined\n : (await options.getUnpublishedPreviewGrant?.())?.trim();\n if (!previewGrant && !previewBuildId) {\n throw new Error(\n \"Unpublished preview authorization is required to use the Agent Runtime preview.\"\n );\n }\n }\n\n const response = await fetchImplementation(\n `${options.runtimeOrigin}/webless/v1/bootstrap`,\n {\n body: JSON.stringify({\n clientSessionId: options.visitorSessionId,\n indexId: options.indexId,\n ...(previewBuildId ? { previewBuildId } : {}),\n ...(previewGrant ? { previewGrant } : {}),\n version: options.version,\n }),\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n }\n );\n if (!response.ok) {\n throw new Error(await readBootstrapError(response));\n }\n\n let value: unknown;\n try {\n value = await response.json();\n } catch {\n throw new Error(\"Agent Runtime returned an invalid access response.\");\n }\n return parseBootstrapResponse(value, options.indexId, now());\n };\n\n const getAccessToken = async (): Promise<string> => {\n if (capability && capability.refreshAt > now()) {\n return capability.accessToken;\n }\n\n const requestedGeneration = generation;\n if (!pendingBootstrap) {\n const trackedBootstrap = bootstrap().finally(() => {\n if (pendingBootstrap === trackedBootstrap) {\n pendingBootstrap = undefined;\n }\n });\n pendingBootstrap = trackedBootstrap;\n }\n\n const nextCapability = await pendingBootstrap;\n if (requestedGeneration !== generation) {\n return getAccessToken();\n }\n\n capability = nextCapability;\n return capability.accessToken;\n };\n\n return {\n getAccessToken,\n invalidate: () => {\n capability = undefined;\n generation += 1;\n pendingBootstrap = undefined;\n },\n };\n}\n\nexport type AgentRuntimeCapability = ReturnType<\n typeof createAgentRuntimeCapability\n>;\n\nexport async function withCapabilityRefresh<T>(\n capability: AgentRuntimeCapability,\n request: () => Promise<T>\n): Promise<T> {\n try {\n return await request();\n } catch (error) {\n if (!(error instanceof ClientError) || error.status !== 401) {\n throw error;\n }\n capability.invalidate();\n return await request();\n }\n}\n","import type { AgentIndexVersion, AgentRuntimeConfig } from \"./types\";\n\nexport const DEFAULT_RUNTIME_ORIGIN = \"https://runtime.staging.webless.ai\";\n\nconst trimTrailingSlash = (value: string) => value.replace(/\\/+$/, \"\");\n\nexport function buildEveHost(\n origin: string,\n indexId: string,\n version: AgentIndexVersion = \"published\",\n): string {\n const base = trimTrailingSlash(origin);\n const searchParams = new URLSearchParams({ indexId: indexId.trim() });\n if (version === \"unpublished\") {\n searchParams.set(\"version\", version);\n }\n return `${base}?${searchParams.toString()}`;\n}\n\nexport function resolveAgentRuntimeConfig(input: {\n indexId: string;\n runtimeOrigin?: string;\n version?: AgentIndexVersion;\n}): AgentRuntimeConfig {\n const origin = trimTrailingSlash(input.runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);\n const resolvedIndexId = input.indexId.trim();\n const version = input.version ?? \"published\";\n\n return {\n origin,\n indexId: resolvedIndexId,\n version,\n host: resolvedIndexId ? buildEveHost(origin, resolvedIndexId, version) : origin,\n };\n}\n\nexport function agentHealthUrl(runtimeOrigin?: string): string {\n const origin = trimTrailingSlash(runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);\n return `${origin}/eve/v1/health`;\n}\n","import type { AgentIndexVersion, PersistedAgentSession } from \"./types\";\n\nconst DEFAULT_STORAGE_KEY_PREFIX = \"webless:agent\";\n\nexport type SessionStoreOptions = {\n storageKeyPrefix?: string;\n};\n\nfunction normalizeRuntimeOrigin(runtimeOrigin?: string) {\n const trimmed = runtimeOrigin?.trim();\n if (!trimmed) return \"_\";\n return trimmed.replace(/\\/+$/, \"\");\n}\n\nexport function buildAgentStorageKeyPrefix(input: {\n customerId?: string;\n indexId: string;\n runtimeOrigin?: string;\n version?: AgentIndexVersion;\n}) {\n const customerId = input.customerId?.trim() || \"_\";\n const indexId = input.indexId.trim();\n if (!indexId) {\n throw new Error(\"indexId is required to build agent storage keys.\");\n }\n\n const versionSuffix = input.version === \"unpublished\" ? \":unpublished\" : \"\";\n return `${DEFAULT_STORAGE_KEY_PREFIX}:${customerId}:${indexId}${versionSuffix}:${normalizeRuntimeOrigin(input.runtimeOrigin)}`;\n}\n\nfunction createSessionId(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `sess_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;\n}\n\nfunction resolvePrefix(options?: SessionStoreOptions) {\n return options?.storageKeyPrefix?.trim() || DEFAULT_STORAGE_KEY_PREFIX;\n}\n\nexport function getOrCreateVisitorSessionId(options?: SessionStoreOptions): string {\n const prefix = resolvePrefix(options);\n const visitorKey = `${prefix}:visitorSessionId`;\n\n if (typeof sessionStorage === \"undefined\") {\n return createSessionId();\n }\n\n const existing = sessionStorage.getItem(visitorKey)?.trim();\n if (existing) return existing;\n\n const next = createSessionId();\n sessionStorage.setItem(visitorKey, next);\n return next;\n}\n\nexport function clearVisitorSessionId(options?: SessionStoreOptions) {\n if (typeof sessionStorage === \"undefined\") return;\n\n const prefix = resolvePrefix(options);\n sessionStorage.removeItem(`${prefix}:visitorSessionId`);\n}\n\nfunction runtimeSessionIdKey(visitorSessionId: string, prefix: string) {\n return `${prefix}:eve:${visitorSessionId}:sessionId`;\n}\n\nfunction runtimeStreamIndexKey(visitorSessionId: string, prefix: string) {\n return `${prefix}:eve:${visitorSessionId}:streamIndex`;\n}\n\nfunction runtimeLastMessageKey(visitorSessionId: string, prefix: string) {\n return `${prefix}:eve:${visitorSessionId}:lastMessage`;\n}\n\nexport function loadPersistedAgentSession(\n visitorSessionId: string,\n options?: SessionStoreOptions,\n): PersistedAgentSession | null {\n if (typeof sessionStorage === \"undefined\" || !visitorSessionId.trim()) return null;\n\n const prefix = resolvePrefix(options);\n const sessionId = sessionStorage.getItem(runtimeSessionIdKey(visitorSessionId, prefix))?.trim();\n if (!sessionId) return null;\n\n const rawIndex = sessionStorage.getItem(runtimeStreamIndexKey(visitorSessionId, prefix));\n const streamIndex = rawIndex ? Number.parseInt(rawIndex, 10) : 0;\n\n const lastMessage = sessionStorage\n .getItem(runtimeLastMessageKey(visitorSessionId, prefix))\n ?.trim();\n\n return {\n sessionId,\n streamIndex: Number.isFinite(streamIndex) && streamIndex >= 0 ? streamIndex : 0,\n ...(lastMessage ? { lastMessage } : {}),\n };\n}\n\nexport function savePersistedAgentSession(\n visitorSessionId: string,\n sessionId: string,\n streamIndex: number,\n options?: SessionStoreOptions,\n) {\n if (typeof sessionStorage === \"undefined\" || !visitorSessionId.trim() || !sessionId.trim()) {\n return;\n }\n\n const prefix = resolvePrefix(options);\n sessionStorage.setItem(runtimeSessionIdKey(visitorSessionId, prefix), sessionId);\n sessionStorage.setItem(\n runtimeStreamIndexKey(visitorSessionId, prefix),\n String(Math.max(0, streamIndex)),\n );\n}\n\nexport function savePersistedAgentTurnMessage(\n visitorSessionId: string,\n message: string,\n options?: SessionStoreOptions,\n) {\n if (typeof sessionStorage === \"undefined\" || !visitorSessionId.trim() || !message) {\n return;\n }\n\n const prefix = resolvePrefix(options);\n sessionStorage.setItem(runtimeLastMessageKey(visitorSessionId, prefix), message);\n}\n\nexport function clearPersistedAgentSession(\n visitorSessionId: string,\n options?: SessionStoreOptions,\n) {\n if (typeof sessionStorage === \"undefined\" || !visitorSessionId.trim()) return;\n const prefix = resolvePrefix(options);\n sessionStorage.removeItem(runtimeSessionIdKey(visitorSessionId, prefix));\n sessionStorage.removeItem(runtimeStreamIndexKey(visitorSessionId, prefix));\n sessionStorage.removeItem(runtimeLastMessageKey(visitorSessionId, prefix));\n}\n","import { ClientError } from \"eve/client\";\n\nconst TRANSIENT_AGENT_ERROR_MESSAGE =\n \"I couldn’t finish that answer. Please try again.\";\nconst PREVIEW_AUTHORIZATION_ERROR_MESSAGE =\n \"This preview could not be authorized. Open the latest preview from Webless.\";\n\nfunction isTransientRuntimeMessage(message: string) {\n const normalized = message.trim().toLowerCase();\n return (\n normalized.includes(\"empty response from runtime\") ||\n normalized.includes(\"failed to fetch\") ||\n normalized.includes(\"networkerror\") ||\n normalized.includes(\"load failed\")\n );\n}\n\nfunction isPreviewAuthorizationMessage(message: string) {\n const normalized = message.trim().toLowerCase();\n return (\n normalized.includes(\"unpublished preview authorization\") ||\n normalized.includes(\"unpublished preview grant\") ||\n normalized.includes(\"agent studio preview grant\") ||\n normalized.includes(\"preview authorization\")\n );\n}\n\nexport function formatAgentError(error: unknown): string {\n if (error instanceof ClientError) {\n if (error.status === 401 && error.code === \"index_required\") {\n return \"Missing indexId — pass a published index id to createAgentClient().\";\n }\n if (error.status === 403 && error.code === \"agent_unavailable\") {\n return \"Agent unavailable for this index (disabled or unpublished).\";\n }\n if (error.status === 409 && error.code === \"session_not_active\") {\n return \"Session expired — send a new message to start again.\";\n }\n if (error.message && isPreviewAuthorizationMessage(error.message)) {\n return PREVIEW_AUTHORIZATION_ERROR_MESSAGE;\n }\n if (\n error.status >= 500 ||\n (error.message && isTransientRuntimeMessage(error.message))\n ) {\n return TRANSIENT_AGENT_ERROR_MESSAGE;\n }\n return error.message || \"This assistant is unavailable right now.\";\n }\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return \"\";\n }\n if (error instanceof Error) {\n if (isPreviewAuthorizationMessage(error.message)) {\n return PREVIEW_AUTHORIZATION_ERROR_MESSAGE;\n }\n return isTransientRuntimeMessage(error.message)\n ? TRANSIENT_AGENT_ERROR_MESSAGE\n : error.message;\n }\n return TRANSIENT_AGENT_ERROR_MESSAGE;\n}\n","export type VisitorBooking = {\n eventUri: string;\n inviteeUri?: string;\n inviteeEmail?: string;\n startTime?: string;\n};\n\nexport type BookingOfferEventType = {\n name: string;\n uri: string;\n duration?: number;\n locationKind?: string;\n location?: string;\n};\n\nexport type BookingOfferSlot = {\n startTime: string;\n eventTypeUri?: string;\n};\n\nexport type BookingOffer = {\n type: \"booking_offer\";\n eventTypes: BookingOfferEventType[];\n slots: BookingOfferSlot[];\n};\n\n/** Stable React key so BookingCard remounts when offer content changes. */\nexport function bookingOfferIdentityKey(offer: BookingOffer) {\n const eventTypes = offer.eventTypes\n .map(\n (item) =>\n `${item.uri}:${item.duration ?? \"\"}:${item.locationKind ?? \"\"}:${item.location ?? \"\"}`,\n )\n .join(\"|\");\n const slots = offer.slots\n .map((slot) => `${slot.eventTypeUri ?? \"\"}:${slot.startTime}`)\n .join(\"|\");\n return `${eventTypes}::${slots}` || \"offer\";\n}\n\nexport type BookingConfirmed = VisitorBooking & {\n type: \"booking_confirmed\";\n};\n\nexport type BookingCanceled = {\n type: \"booking_canceled\";\n eventUri: string;\n};\n\nexport type ToolCard = BookingOffer | BookingConfirmed | BookingCanceled;\n\nconst FENCE_PATTERN = /```(?:webless-tool-card|json)\\s*([\\s\\S]*?)```/gi;\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction asString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction isEventUri(value: string) {\n return /^https:\\/\\/api\\.calendly\\.com\\/scheduled_events\\/[^/]+$/i.test(value);\n}\n\nfunction isEventTypeUri(value: string) {\n return /^https:\\/\\/api\\.calendly\\.com\\/event_types\\/[^/]+$/i.test(value);\n}\n\nexport function parseToolCard(value: unknown): ToolCard | null {\n const record = asRecord(value);\n if (!record) return null;\n if (record.booking_offer && asString(record.type) !== \"booking_offer\") {\n const nested = parseToolCard(record.booking_offer);\n if (nested) return nested;\n }\n const type = asString(record.type);\n if (type === \"booking_offer\") {\n const eventTypes = Array.isArray(record.eventTypes)\n ? record.eventTypes.flatMap((item) => {\n const entry = asRecord(item);\n const uri = asString(entry?.uri);\n if (!entry || !isEventTypeUri(uri)) return [];\n const duration = entry.duration;\n const locationKind = asString(entry.locationKind);\n const location = asString(entry.location);\n return [\n {\n name: asString(entry.name) || \"Meeting\",\n uri,\n ...(typeof duration === \"number\" ? { duration } : {}),\n ...(locationKind ? { locationKind } : {}),\n ...(location ? { location } : {}),\n },\n ];\n })\n : [];\n const slots = Array.isArray(record.slots)\n ? record.slots.flatMap((item) => {\n const entry = asRecord(item);\n const startTime = asString(entry?.startTime);\n if (!entry || !startTime) return [];\n const eventTypeUri = asString(entry.eventTypeUri);\n return [\n {\n startTime,\n ...(isEventTypeUri(eventTypeUri) ? { eventTypeUri } : {}),\n },\n ];\n })\n : [];\n if (slots.length === 0) return null;\n return { type: \"booking_offer\", eventTypes, slots };\n }\n if (type === \"booking_confirmed\") {\n const eventUri = asString(record.eventUri);\n if (!isEventUri(eventUri)) return null;\n const inviteeUri = asString(record.inviteeUri);\n const inviteeEmail = asString(record.inviteeEmail);\n const startTime = asString(record.startTime);\n return {\n type: \"booking_confirmed\",\n eventUri,\n ...(inviteeUri ? { inviteeUri } : {}),\n ...(inviteeEmail ? { inviteeEmail } : {}),\n ...(startTime ? { startTime } : {}),\n };\n }\n if (type === \"booking_canceled\") {\n const eventUri = asString(record.eventUri);\n if (!isEventUri(eventUri)) return null;\n return { type: \"booking_canceled\", eventUri };\n }\n return null;\n}\n\nexport function formatBookingOfferFence(offer: BookingOffer) {\n return [\n \"```webless-tool-card\",\n JSON.stringify({\n type: \"booking_offer\",\n eventTypes: offer.eventTypes,\n slots: offer.slots,\n }),\n \"```\",\n ].join(\"\\n\");\n}\n\nexport function bookingOfferFromActionOutput(output: unknown): BookingOffer | null {\n const record = asRecord(output);\n const data = asRecord(record?.data) ?? record;\n const card = parseToolCard(data);\n return card?.type === \"booking_offer\" ? card : null;\n}\n\nexport function ensureBookingOfferText(text: string, offer: BookingOffer | null) {\n if (!offer) return text;\n if (extractToolCards(text).some((card) => card.type === \"booking_offer\")) {\n return text;\n }\n const visible = stripToolCards(text).trim() || text.trim();\n return `${visible}\\n\\n${formatBookingOfferFence(offer)}`;\n}\n\nexport function hideToolCardFences(text: string) {\n return text\n .replace(/```(?:webless-tool-card|json)\\s*[\\s\\S]*?```/gi, \"\")\n .replace(/```(?:webless-tool-card|json)[\\s\\S]*$/i, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nexport function visitorTimeZone() {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\";\n } catch {\n return \"UTC\";\n }\n}\n\nexport function extractToolCards(text: string): ToolCard[] {\n const cards: ToolCard[] = [];\n for (const match of text.matchAll(FENCE_PATTERN)) {\n try {\n const card = parseToolCard(JSON.parse(match[1] ?? \"\"));\n if (card) cards.push(card);\n } catch {\n // Ignore malformed fences so the rest of the reply still renders.\n }\n }\n return cards;\n}\n\nexport function stripToolCards(text: string): string {\n return text\n .replace(FENCE_PATTERN, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nfunction localDateKey(date: Date) {\n if (Number.isNaN(date.getTime())) return \"\";\n return [\n date.getFullYear(),\n String(date.getMonth() + 1).padStart(2, \"0\"),\n String(date.getDate()).padStart(2, \"0\"),\n ].join(\"-\");\n}\n\nexport function slotDateKey(startTime: string) {\n return localDateKey(new Date(startTime)) || startTime;\n}\n\nexport function bookingSlotsForEventType(\n slots: BookingOfferSlot[],\n eventTypeUri: string,\n) {\n return slots.filter(\n (slot) => !eventTypeUri || !slot.eventTypeUri || slot.eventTypeUri === eventTypeUri,\n );\n}\n\nexport function firstAvailableBookingMonth(slots: BookingOfferSlot[]) {\n let earliest: string | undefined;\n for (const slot of slots) {\n const key = slotDateKey(slot.startTime);\n if (!earliest || key < earliest) earliest = key;\n }\n const [year, month] = (earliest ?? slotDateKey(new Date().toISOString()))\n .split(\"-\")\n .map(Number);\n if (!year || !month) {\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth() };\n }\n return { year, month: month - 1 };\n}\n\nexport function formatDateChip(startTime: string, now = new Date()) {\n const date = new Date(startTime);\n if (Number.isNaN(date.getTime())) return startTime;\n if (localDateKey(date) === localDateKey(now)) return \"Today\";\n return new Intl.DateTimeFormat(undefined, {\n weekday: \"short\",\n day: \"numeric\",\n }).format(date);\n}\n\nexport function formatMonthTitle(year: number, month: number) {\n return new Intl.DateTimeFormat(undefined, {\n month: \"long\",\n year: \"numeric\",\n }).format(new Date(year, month, 1));\n}\n\nexport function formatLongDate(startTime: string) {\n const date = new Date(startTime);\n if (Number.isNaN(date.getTime())) return startTime;\n return new Intl.DateTimeFormat(undefined, {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n }).format(date);\n}\n\nexport function weekdayLabels() {\n return Array.from({ length: 7 }, (_, index) =>\n new Intl.DateTimeFormat(undefined, { weekday: \"short\" }).format(\n new Date(2026, 7, 3 + index),\n ),\n );\n}\n\nexport function formatTimeChip(startTime: string) {\n const date = new Date(startTime);\n if (Number.isNaN(date.getTime())) return startTime;\n return new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n}\n\nexport function formatSlotTimeZone(startTime: string) {\n const date = new Date(startTime);\n if (Number.isNaN(date.getTime())) return \"\";\n return (\n new Intl.DateTimeFormat(undefined, { timeZoneName: \"short\" })\n .formatToParts(date)\n .find((part) => part.type === \"timeZoneName\")?.value ?? \"\"\n );\n}\n\nexport function formatSlotLabel(startTime: string) {\n const date = new Date(startTime);\n if (Number.isNaN(date.getTime())) return startTime;\n return new Intl.DateTimeFormat(undefined, {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZoneName: \"short\",\n }).format(date);\n}\n\nexport function formatBookingRequest(input: {\n eventTypeUri: string;\n inviteeEmail: string;\n inviteeName: string;\n startTime: string;\n timezone: string;\n locationKind?: string;\n location?: string;\n}) {\n return [\n \"Book this meeting now with CALENDLY_POST_INVITEE.\",\n \"Do not open a Calendly URL and do not list other scheduled events.\",\n \"Do not invent a location kind. Use only the location fields below.\",\n `event_type: ${input.eventTypeUri}`,\n `start_time: ${input.startTime}`,\n `invitee.name: ${input.inviteeName}`,\n `invitee.email: ${input.inviteeEmail}`,\n `invitee.timezone: ${input.timezone}`,\n ...(input.locationKind\n ? [\n `location.kind: ${input.locationKind}`,\n ...(input.location ? [`location.location: ${input.location}`] : []),\n ]\n : [\"Do not send a location field.\"]),\n \"After it succeeds, reply with one short confirmation and a webless-tool-card booking_confirmed block using visitor_booking.\",\n ].join(\"\\n\");\n}\n\nexport function visitorBookingPrefix(booking: VisitorBooking) {\n return [\n \"This visitor already booked a meeting. Use only this meeting:\",\n `- scheduled event URI: ${booking.eventUri}`,\n ...(booking.inviteeUri ? [`- invitee URI: ${booking.inviteeUri}`] : []),\n ...(booking.inviteeEmail ? [`- invitee email: ${booking.inviteeEmail}`] : []),\n \"For details call CALENDLY_GET_EVENT or CALENDLY_GET_EVENT_INVITEE with those URIs.\",\n \"If you must list events, pass this invitee_email. Never describe any other scheduled event.\",\n \"start_time values from Calendly are UTC.\",\n ].join(\"\\n\");\n}\n","import type { ConversationMessage, ToolStep } from \"./types/conversation\";\n\nconst CONVERSATION_VERSION = 2;\n\nexport type PersistedAgentConversation = {\n messages: ConversationMessage[];\n pending: boolean;\n streamingText: string;\n toolSteps: ToolStep[];\n};\n\nfunction conversationKey(storageKeyPrefix: string, visitorSessionId: string) {\n return `${storageKeyPrefix}:conversation:${visitorSessionId}`;\n}\n\nfunction parseMessage(value: unknown): ConversationMessage | null {\n if (typeof value !== \"object\" || value === null) return null;\n const record = value as Record<string, unknown>;\n if (\n typeof record.id !== \"string\" ||\n (record.role !== \"agent\" && record.role !== \"visitor\") ||\n typeof record.text !== \"string\" ||\n typeof record.createdAt !== \"number\" ||\n !Number.isFinite(record.createdAt)\n ) {\n return null;\n }\n if (record.role === \"visitor\") {\n return {\n id: record.id,\n role: \"visitor\",\n text: record.text,\n createdAt: record.createdAt,\n ...(typeof record.runtimeText === \"string\" && record.runtimeText\n ? { runtimeText: record.runtimeText }\n : {}),\n };\n }\n return {\n id: record.id,\n role: \"agent\",\n text: record.text,\n createdAt: record.createdAt,\n };\n}\n\nfunction parseToolStep(value: unknown): ToolStep | null {\n if (typeof value !== \"object\" || value === null) return null;\n const record = value as Record<string, unknown>;\n if (\n typeof record.id !== \"string\" ||\n (record.kind !== \"planning\" &&\n record.kind !== \"search\" &&\n record.kind !== \"specialist\") ||\n typeof record.label !== \"string\" ||\n (record.state !== \"completed\" &&\n record.state !== \"active\" &&\n record.state !== \"pending\" &&\n record.state !== \"error\")\n ) {\n return null;\n }\n\n return {\n id: record.id,\n kind: record.kind,\n label: record.label,\n state: record.state,\n ...(typeof record.detail === \"string\" && record.detail\n ? { detail: record.detail }\n : {}),\n };\n}\n\nexport function visitorTurnText(message: ConversationMessage) {\n return message.role === \"visitor\" && message.runtimeText\n ? message.runtimeText\n : message.text;\n}\n\nexport function loadPersistedAgentConversation(\n storageKeyPrefix: string,\n visitorSessionId: string,\n): PersistedAgentConversation | null {\n if (typeof sessionStorage === \"undefined\") return null;\n const raw = sessionStorage.getItem(conversationKey(storageKeyPrefix, visitorSessionId));\n if (!raw) return null;\n\n try {\n const value: unknown = JSON.parse(raw);\n if (typeof value !== \"object\" || value === null) return null;\n const record = value as Record<string, unknown>;\n if (\n (record.version !== 1 && record.version !== CONVERSATION_VERSION) ||\n !Array.isArray(record.messages) ||\n typeof record.pending !== \"boolean\" ||\n typeof record.streamingText !== \"string\" ||\n (record.version === CONVERSATION_VERSION &&\n !Array.isArray(record.toolSteps))\n ) {\n return null;\n }\n const messages = record.messages.map(parseMessage);\n if (messages.some((message) => message === null)) return null;\n const storedToolSteps =\n record.version === CONVERSATION_VERSION && Array.isArray(record.toolSteps)\n ? record.toolSteps\n : [];\n const toolSteps = storedToolSteps.map(parseToolStep);\n if (toolSteps.some((step) => step === null)) return null;\n return {\n messages: messages.filter((message): message is ConversationMessage => message !== null),\n pending: record.pending,\n streamingText: record.streamingText,\n toolSteps: toolSteps.filter((step): step is ToolStep => step !== null),\n };\n } catch {\n return null;\n }\n}\n\nexport function savePersistedAgentConversation(\n storageKeyPrefix: string,\n visitorSessionId: string,\n conversation: PersistedAgentConversation,\n) {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.setItem(\n conversationKey(storageKeyPrefix, visitorSessionId),\n JSON.stringify({ version: CONVERSATION_VERSION, ...conversation }),\n );\n}\n\nexport function clearPersistedAgentConversation(\n storageKeyPrefix: string,\n visitorSessionId: string,\n) {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.removeItem(conversationKey(storageKeyPrefix, visitorSessionId));\n clearPendingWidgetBooking(storageKeyPrefix, visitorSessionId);\n}\n\nexport type PendingWidgetBooking = {\n eventUri: string;\n inviteeUri?: string;\n inviteeEmail?: string;\n startTime?: string;\n};\n\nfunction pendingBookingKey(storageKeyPrefix: string, visitorSessionId: string) {\n return `${storageKeyPrefix}:pending-booking:${visitorSessionId}`;\n}\n\nexport function loadPendingWidgetBooking(\n storageKeyPrefix: string,\n visitorSessionId: string,\n): PendingWidgetBooking | null {\n if (typeof sessionStorage === \"undefined\") return null;\n const raw = sessionStorage.getItem(\n pendingBookingKey(storageKeyPrefix, visitorSessionId),\n );\n if (!raw) return null;\n try {\n const value: unknown = JSON.parse(raw);\n if (typeof value !== \"object\" || value === null) return null;\n const record = value as Record<string, unknown>;\n if (typeof record.eventUri !== \"string\" || !record.eventUri) return null;\n return {\n eventUri: record.eventUri,\n ...(typeof record.inviteeUri === \"string\" && record.inviteeUri\n ? { inviteeUri: record.inviteeUri }\n : {}),\n ...(typeof record.inviteeEmail === \"string\" && record.inviteeEmail\n ? { inviteeEmail: record.inviteeEmail }\n : {}),\n ...(typeof record.startTime === \"string\" && record.startTime\n ? { startTime: record.startTime }\n : {}),\n };\n } catch {\n return null;\n }\n}\n\nexport function savePendingWidgetBooking(\n storageKeyPrefix: string,\n visitorSessionId: string,\n booking: PendingWidgetBooking,\n) {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.setItem(\n pendingBookingKey(storageKeyPrefix, visitorSessionId),\n JSON.stringify(booking),\n );\n}\n\nexport function clearPendingWidgetBooking(\n storageKeyPrefix: string,\n visitorSessionId: string,\n) {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.removeItem(pendingBookingKey(storageKeyPrefix, visitorSessionId));\n}\n","import type { AssistTabSide, AssistTabVariant } from \"./components/AssistEdgeTab/AssistEdgeTab\";\n\nexport type AgentPlacementConfig = {\n side: AssistTabSide;\n along: number;\n inset: number;\n variant: AssistTabVariant;\n};\n\nexport const DEFAULT_AGENT_PLACEMENT: AgentPlacementConfig = {\n side: \"right\",\n along: 50,\n inset: 0,\n variant: \"outline\",\n};\n\nexport function normalizeAgentPlacement(\n placement?: Partial<AgentPlacementConfig>,\n): AgentPlacementConfig {\n const along = placement?.along ?? DEFAULT_AGENT_PLACEMENT.along;\n return {\n side: placement?.side ?? DEFAULT_AGENT_PLACEMENT.side,\n along: Math.min(100, Math.max(0, along)),\n inset: Math.max(0, placement?.inset ?? DEFAULT_AGENT_PLACEMENT.inset),\n variant: placement?.variant ?? DEFAULT_AGENT_PLACEMENT.variant,\n };\n}\n","import type { BookingOffer } from \"../lib/tool-card\";\n\nexport type ToolStepState = \"completed\" | \"active\" | \"pending\" | \"error\";\n\nexport type ToolStep = {\n id: string;\n kind: \"planning\" | \"search\" | \"specialist\";\n label: string;\n state: ToolStepState;\n detail?: string;\n};\n\nexport type Citation = {\n id: string;\n label: string;\n url: string;\n};\n\nexport type FollowUpSuggestion = {\n id: string;\n label: string;\n};\n\nexport type JourneyContext = {\n id: string;\n name: string;\n currentStep?: number;\n totalSteps?: number;\n stepLabel?: string;\n};\n\nexport type ConversationMessage =\n | {\n id: string;\n role: \"visitor\";\n text: string;\n createdAt: number;\n runtimeText?: string;\n }\n | {\n id: string;\n role: \"agent\";\n text: string;\n createdAt: number;\n citations?: Citation[];\n toolReceipts?: string[];\n streaming?: boolean;\n };\n\nexport type AgentRailPhase =\n | \"idle\"\n | \"thinking\"\n | \"running-tools\"\n | \"streaming\"\n | \"error\"\n | \"complete\";\n\nexport type AgentRailState = {\n phase: AgentRailPhase;\n messages: ConversationMessage[];\n toolSteps: ToolStep[];\n journey: JourneyContext | null;\n followUps: FollowUpSuggestion[];\n streamingText: string;\n pendingOffer: BookingOffer | null;\n error: string | null;\n};\n\nexport type AgentRailTheme = {\n railMaxWidth: string;\n brand: string;\n brandSoft: string;\n brandDeep: string;\n surface: string;\n surfaceMuted: string;\n text: string;\n textMuted: string;\n textSubtle: string;\n border: string;\n visitorBubble: string;\n visitorText: string;\n success: string;\n danger: string;\n fontBody: string;\n fontDisplay: string;\n};\n\nexport type AgentColorScheme = \"auto\" | \"light\" | \"dark\";\n\nexport const defaultAgentRailTheme: AgentRailTheme = {\n railMaxWidth: \"450px\",\n brand: \"#6f16ff\",\n brandSoft: \"#f3edff\",\n brandDeep: \"#12043e\",\n surface: \"#ffffff\",\n surfaceMuted: \"#f4f6fb\",\n text: \"#171b2a\",\n textMuted: \"#5a6378\",\n textSubtle: \"#8a94a8\",\n border: \"rgb(42 51 70 / 0.1)\",\n visitorBubble: \"#6f16ff\",\n visitorText: \"#ffffff\",\n success: \"#18794e\",\n danger: \"#c94b63\",\n fontBody: '\"Mulish\", \"Avenir Next\", \"Segoe UI\", sans-serif',\n fontDisplay: '\"Space Grotesk\", sans-serif',\n};\n\nexport const defaultDarkAgentRailTheme: AgentRailTheme = {\n ...defaultAgentRailTheme,\n brand: \"#a77bff\",\n brandSoft: \"#2b2140\",\n brandDeep: \"#f5f0ff\",\n surface: \"#101218\",\n surfaceMuted: \"#1a1e27\",\n text: \"#f5f7fb\",\n textMuted: \"#b6bfce\",\n textSubtle: \"#919cad\",\n border: \"rgb(226 232 240 / 0.16)\",\n visitorBubble: \"#7c3aed\",\n success: \"#55cf91\",\n danger: \"#ff8da1\",\n};\n","import { useEffect, useRef, useState, type CSSProperties } from \"react\";\nimport {\n defaultDarkAgentRailTheme,\n defaultAgentRailTheme,\n type AgentColorScheme,\n type AgentRailState,\n type AgentRailTheme,\n} from \"../../types/conversation\";\nimport { useAgentColorScheme } from \"../../hooks/useAgentColorScheme\";\nimport { AgentActivityBubble } from \"../AgentActivityBubble/AgentActivityBubble\";\nimport { Composer } from \"../Composer/Composer\";\nimport { FollowUpChips } from \"../FollowUpChips/FollowUpChips\";\nimport { MessageBubble } from \"../MessageBubble/MessageBubble\";\nimport \"./AgentRail.css\";\n\nfunction MinimizeIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3.5 8h9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction NewChatIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M9.5 3.5h3v3M12.25 3.75 8 8M7 4H4.5A1.5 1.5 0 0 0 3 5.5v6A1.5 1.5 0 0 0 4.5 13h6a1.5 1.5 0 0 0 1.5-1.5V9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ExpandIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M6 3.5H3.5V6M10 3.5h2.5V6M10 12.5h2.5V10M6 12.5H3.5V10\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction RestoreIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5.5 5.5H3.5V7.5M10.5 5.5h2V7.5M10.5 10.5h2V8.5M5.5 10.5H3.5V8.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport type AgentRailProps = {\n state: AgentRailState;\n theme?: Partial<AgentRailTheme>;\n colorScheme?: AgentColorScheme;\n brandLabel?: string;\n brandLogoUrl?: string;\n poweredByLabel?: string;\n composerPlaceholder?: string;\n mobileFullscreen?: boolean;\n expanded?: boolean;\n onCollapse?: () => void;\n onClose?: () => void;\n onExpandToggle?: () => void;\n onReset?: () => void;\n onRetry?: () => void;\n onSubmit?: (message: string) => void;\n onFollowUpSelect?: (label: string) => void;\n onBook?: (input: { displayText: string; runtimeText: string }) => void;\n};\n\nexport function AgentRail({\n state,\n theme,\n colorScheme = \"auto\",\n brandLabel = \"\",\n brandLogoUrl,\n poweredByLabel = \"Powered by Webless\",\n composerPlaceholder = \"Ask anything…\",\n mobileFullscreen = false,\n expanded = false,\n onCollapse,\n onClose,\n onExpandToggle,\n onReset,\n onRetry,\n onSubmit,\n onFollowUpSelect,\n onBook,\n}: AgentRailProps) {\n const transcriptRef = useRef<HTMLDivElement>(null);\n const resolvedBrandLabel = brandLabel.trim();\n const resolvedBrandLogoUrl = brandLogoUrl?.trim();\n const [failedLogoUrl, setFailedLogoUrl] = useState<string | null>(null);\n const showBrandLogo =\n Boolean(resolvedBrandLogoUrl) && failedLogoUrl !== resolvedBrandLogoUrl;\n const resolvedColorScheme = useAgentColorScheme(colorScheme);\n const brandedTheme = { ...defaultAgentRailTheme, ...theme };\n const resolvedTheme =\n resolvedColorScheme === \"dark\"\n ? {\n ...brandedTheme,\n brand: theme?.brand ?? defaultDarkAgentRailTheme.brand,\n brandDeep: defaultDarkAgentRailTheme.brandDeep,\n brandSoft: `color-mix(in srgb, ${\n theme?.brand ?? defaultDarkAgentRailTheme.brand\n } 18%, ${defaultDarkAgentRailTheme.surface})`,\n border: defaultDarkAgentRailTheme.border,\n danger: defaultDarkAgentRailTheme.danger,\n success: defaultDarkAgentRailTheme.success,\n surface: defaultDarkAgentRailTheme.surface,\n surfaceMuted: defaultDarkAgentRailTheme.surfaceMuted,\n text: defaultDarkAgentRailTheme.text,\n textMuted: defaultDarkAgentRailTheme.textMuted,\n textSubtle: defaultDarkAgentRailTheme.textSubtle,\n visitorBubble:\n theme?.visitorBubble ??\n theme?.brand ??\n defaultDarkAgentRailTheme.visitorBubble,\n }\n : brandedTheme;\n const railStyle = {\n \"--rail-width\": resolvedTheme.railMaxWidth,\n \"--as-rail-max-width\": resolvedTheme.railMaxWidth,\n \"--as-brand\": resolvedTheme.brand,\n \"--as-brand-soft\": resolvedTheme.brandSoft,\n \"--as-brand-deep\": resolvedTheme.brandDeep,\n \"--as-surface\": resolvedTheme.surface,\n \"--as-surface-muted\": resolvedTheme.surfaceMuted,\n \"--as-text\": resolvedTheme.text,\n \"--as-text-muted\": resolvedTheme.textMuted,\n \"--as-text-subtle\": resolvedTheme.textSubtle,\n \"--as-border\": resolvedTheme.border,\n \"--as-visitor-bubble\": resolvedTheme.visitorBubble,\n \"--as-visitor-text\": resolvedTheme.visitorText,\n \"--as-success\": resolvedTheme.success,\n \"--as-danger\": resolvedTheme.danger,\n \"--as-font-body\": resolvedTheme.fontBody,\n \"--as-font-display\": resolvedTheme.fontDisplay,\n colorScheme: resolvedColorScheme,\n } as CSSProperties;\n\n const isBusy =\n state.phase === \"thinking\" ||\n state.phase === \"running-tools\" ||\n state.phase === \"streaming\";\n\n const showActivity = state.toolSteps.length > 0;\n\n const hasVisitorMessages = state.messages.some(\n (message) => message.role === \"visitor\"\n );\n const showIdleFollowUps = !hasVisitorMessages && state.followUps.length > 0;\n const greeting = state.messages.find(\n (message) => message.role === \"agent\" && message.id === \"greeting\"\n );\n const visibleMessages = hasVisitorMessages ? state.messages : [];\n const lastMessage = visibleMessages.at(-1);\n const completedAnswer =\n showActivity && state.phase === \"complete\" && lastMessage?.role === \"agent\"\n ? lastMessage\n : null;\n const transcriptMessages = completedAnswer\n ? visibleMessages.slice(0, -1)\n : visibleMessages;\n const streamingMessage =\n state.phase === \"streaming\" && state.streamingText\n ? {\n createdAt: 0,\n id: \"streaming-response\",\n role: \"agent\" as const,\n streaming: true,\n text: state.streamingText,\n }\n : state.pendingOffer\n ? {\n createdAt: 0,\n id: \"pending-booking\",\n role: \"agent\" as const,\n streaming: false,\n text: \"Pick a date and time that works for you.\",\n }\n : null;\n\n useEffect(() => {\n const node = transcriptRef.current;\n if (!node) return;\n node.scrollTop = node.scrollHeight;\n }, [\n state.messages,\n state.toolSteps,\n state.streamingText,\n state.followUps,\n state.journey,\n ]);\n\n return (\n <aside\n className={`agent-rail${\n mobileFullscreen ? \" agent-rail--mobile-fullscreen\" : \"\"\n }${expanded ? \" agent-rail--expanded\" : \"\"}`}\n data-color-scheme={resolvedColorScheme}\n style={railStyle}\n aria-label=\"Agent conversation\"\n aria-modal={mobileFullscreen || expanded ? true : undefined}\n autoFocus={mobileFullscreen || expanded}\n role={mobileFullscreen || expanded ? \"dialog\" : undefined}\n tabIndex={mobileFullscreen || expanded ? -1 : undefined}\n >\n <header className=\"agent-rail__header\">\n <div className=\"agent-rail__brand-row\">\n {onCollapse ? (\n <button\n type=\"button\"\n className=\"agent-rail__collapse\"\n aria-label=\"Collapse assist\"\n onClick={onCollapse}\n >\n <MinimizeIcon />\n </button>\n ) : onClose ? (\n <button\n type=\"button\"\n className=\"agent-rail__close\"\n aria-label=\"Close agent\"\n onClick={onClose}\n >\n <CloseIcon />\n </button>\n ) : (\n <span className=\"agent-rail__brand-spacer\" aria-hidden=\"true\" />\n )}\n {resolvedBrandLabel || showBrandLogo ? (\n <span className=\"agent-rail__identity\">\n {showBrandLogo ? (\n <span className=\"agent-rail__brand-mark\" aria-hidden=\"true\">\n <img\n className=\"agent-rail__brand-logo\"\n src={resolvedBrandLogoUrl}\n alt=\"\"\n onError={() => {\n setFailedLogoUrl(resolvedBrandLogoUrl ?? null);\n }}\n />\n </span>\n ) : null}\n {resolvedBrandLabel ? (\n <span className=\"agent-rail__brand-label\">\n {resolvedBrandLabel}\n </span>\n ) : null}\n </span>\n ) : null}\n <span className=\"agent-rail__actions\">\n {onReset ? (\n <button\n type=\"button\"\n className=\"agent-rail__new-chat\"\n aria-label=\"Start a new conversation\"\n disabled={!hasVisitorMessages}\n onClick={onReset}\n >\n <NewChatIcon />\n </button>\n ) : null}\n {onExpandToggle ? (\n <button\n type=\"button\"\n className=\"agent-rail__expand\"\n aria-label={expanded ? \"Exit full screen\" : \"Open full screen\"}\n onClick={onExpandToggle}\n >\n {expanded ? <RestoreIcon /> : <ExpandIcon />}\n </button>\n ) : null}\n </span>\n </div>\n </header>\n\n <div ref={transcriptRef} className=\"agent-rail__transcript\">\n <div className=\"agent-rail__thread\">\n {!hasVisitorMessages ? (\n <section className=\"agent-rail__welcome\" aria-label=\"Welcome\">\n {greeting?.role === \"agent\" ? (\n <MessageBubble\n message={greeting}\n brandLogoUrl={\n showBrandLogo ? resolvedBrandLogoUrl : undefined\n }\n onBook={onBook}\n />\n ) : null}\n {showIdleFollowUps ? (\n <div className=\"agent-rail__followups-slot\">\n <FollowUpChips\n suggestions={state.followUps}\n disabled={isBusy}\n label=\"Start here\"\n onSelect={(suggestion) =>\n onFollowUpSelect?.(suggestion.label)\n }\n />\n </div>\n ) : null}\n </section>\n ) : null}\n\n {transcriptMessages.map((message) => (\n <MessageBubble\n key={message.id}\n message={message}\n brandLogoUrl={showBrandLogo ? resolvedBrandLogoUrl : undefined}\n onBook={onBook}\n />\n ))}\n\n {showActivity ? (\n <AgentActivityBubble\n brandLabel={resolvedBrandLabel}\n brandLogoUrl={showBrandLogo ? resolvedBrandLogoUrl : undefined}\n failed={state.phase === \"error\"}\n steps={state.toolSteps}\n />\n ) : null}\n\n {completedAnswer ? (\n <MessageBubble\n message={completedAnswer}\n brandLogoUrl={showBrandLogo ? resolvedBrandLogoUrl : undefined}\n onBook={onBook}\n />\n ) : null}\n\n {streamingMessage ? (\n <MessageBubble\n message={streamingMessage}\n brandLogoUrl={showBrandLogo ? resolvedBrandLogoUrl : undefined}\n offer={state.pendingOffer}\n onBook={onBook}\n />\n ) : null}\n\n {state.error ? (\n <section className=\"agent-rail__error\" role=\"alert\">\n <div>\n <strong>Something went wrong</strong>\n <p>{state.error}</p>\n </div>\n {onRetry ? (\n <button type=\"button\" onClick={onRetry}>\n Try again\n </button>\n ) : null}\n </section>\n ) : null}\n </div>\n </div>\n\n <div className=\"agent-rail__composer-wrap\">\n <Composer\n variant={expanded || mobileFullscreen ? \"dock\" : \"default\"}\n disabled={isBusy}\n placeholder={composerPlaceholder}\n onSubmit={onSubmit}\n />\n <div className=\"agent-rail__footer\">\n <p>\n <span>AI can make mistakes. Check important info.</span>\n <span>{poweredByLabel}</span>\n </p>\n </div>\n </div>\n </aside>\n );\n}\n","import { useSyncExternalStore } from \"react\";\n\nimport type { AgentColorScheme } from \"../types/conversation\";\n\nconst DARK_MODE_QUERY = \"(prefers-color-scheme: dark)\";\n\nfunction subscribeToDarkMode(onChange: () => void) {\n if (typeof window === \"undefined\" || !window.matchMedia) {\n return () => undefined;\n }\n\n const mediaQuery = window.matchMedia(DARK_MODE_QUERY);\n if (typeof mediaQuery.addEventListener === \"function\") {\n mediaQuery.addEventListener(\"change\", onChange);\n return () => mediaQuery.removeEventListener(\"change\", onChange);\n }\n\n mediaQuery.addListener(onChange);\n return () => mediaQuery.removeListener(onChange);\n}\n\nfunction getPrefersDarkMode() {\n return (\n typeof window !== \"undefined\" &&\n Boolean(window.matchMedia?.(DARK_MODE_QUERY).matches)\n );\n}\n\nexport function useAgentColorScheme(\n colorScheme: AgentColorScheme = \"auto\"\n): Exclude<AgentColorScheme, \"auto\"> {\n const prefersDarkMode = useSyncExternalStore(\n subscribeToDarkMode,\n getPrefersDarkMode,\n () => false\n );\n\n return resolveAgentColorScheme(colorScheme, prefersDarkMode);\n}\n\nexport function resolveAgentColorScheme(\n colorScheme: AgentColorScheme = \"auto\",\n prefersDarkMode: boolean\n): Exclude<AgentColorScheme, \"auto\"> {\n return colorScheme === \"auto\"\n ? prefersDarkMode\n ? \"dark\"\n : \"light\"\n : colorScheme;\n}\n","import { useState } from \"react\";\nimport type { ToolStep } from \"../../types/conversation\";\nimport \"./AgentActivityBubble.css\";\n\nfunction workSummary(\n steps: readonly ToolStep[],\n failed: boolean,\n brandLabel: string\n) {\n const active = [...steps].reverse().find((step) => step.state === \"active\");\n if (active?.kind === \"specialist\")\n return `${active.label} is reviewing your question`;\n if (active?.kind === \"search\") return \"Searching this site\";\n if (active)\n return brandLabel\n ? `${brandLabel} is choosing the best way to help`\n : \"Choosing the best way to help\";\n\n if (failed) return \"Couldn’t complete this request\";\n\n const hasError = steps.some((step) => step.state === \"error\");\n const specialists = steps.filter(\n (step) => step.kind === \"specialist\" && step.state === \"completed\"\n );\n const searched = steps.some(\n (step) => step.kind === \"search\" && step.state === \"completed\"\n );\n if (hasError) return \"Answered with available information\";\n if (specialists.length > 1)\n return `Brought in ${specialists.length} specialists`;\n if (specialists.length === 1)\n return `Brought in ${specialists[0]?.label}`;\n if (searched) return \"Searched this site\";\n return \"Answer ready\";\n}\n\nfunction stepLabel(step: ToolStep, brandLabel: string) {\n return step.kind === \"planning\" ? brandLabel || \"Supervisor\" : step.label;\n}\n\nfunction stepDetail(\n step: ToolStep,\n steps: readonly ToolStep[]\n): string | undefined {\n if (step.kind !== \"planning\" || step.state !== \"completed\") {\n return step.detail;\n }\n\n const specialists = steps.filter((item) => item.kind === \"specialist\");\n if (specialists.length === 1)\n return `Routed your question to ${specialists[0]?.label}`;\n if (specialists.length > 1)\n return `Routed your question to ${specialists.length} specialists`;\n if (steps.some((item) => item.kind === \"search\"))\n return \"Used built-in Search & Discovery\";\n return step.detail;\n}\n\nfunction SearchIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"3.75\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path\n d=\"m10 10 3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction PlanningIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 4.5h8M4 8h5.5M4 11.5h7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AgentActivityBubble({\n brandLabel = \"\",\n brandLogoUrl,\n failed = false,\n steps,\n}: {\n brandLabel?: string;\n brandLogoUrl?: string;\n failed?: boolean;\n steps: ToolStep[];\n}) {\n const active = steps.some((step) => step.state === \"active\");\n const receiptId = steps.map((step) => step.id).join(\":\");\n const [expandedReceiptId, setExpandedReceiptId] = useState<string | null>(\n null\n );\n const detailsOpen = active || expandedReceiptId === receiptId;\n return (\n <article className=\"agent-activity-bubble\">\n <p className=\"agent-activity-bubble__status\" aria-live=\"polite\">\n <span\n className={`agent-activity-bubble__pulse${\n active ? \" is-active\" : failed ? \" is-error\" : \"\"\n }`}\n aria-hidden=\"true\"\n />\n {workSummary(steps, failed, brandLabel)}\n </p>\n <div className=\"agent-activity-bubble__details\">\n <button\n type=\"button\"\n className=\"agent-activity-bubble__summary\"\n aria-expanded={detailsOpen}\n onClick={() => {\n if (active) return;\n setExpandedReceiptId((current) =>\n current === receiptId ? null : receiptId\n );\n }}\n >\n How this answer was made\n </button>\n {detailsOpen ? (\n <ol className=\"agent-activity-bubble__steps\">\n {steps.map((step) => {\n const detail = stepDetail(step, steps);\n return (\n <li\n key={step.id}\n className=\"agent-activity-bubble__step\"\n data-kind={step.kind}\n data-state={step.state}\n >\n <span\n className=\"agent-activity-bubble__step-icon\"\n aria-hidden=\"true\"\n >\n {step.kind === \"planning\" ? (\n <>\n <PlanningIcon />\n {brandLogoUrl ? (\n <img\n src={brandLogoUrl}\n alt=\"\"\n onError={(event) => {\n event.currentTarget.hidden = true;\n }}\n />\n ) : null}\n </>\n ) : step.kind === \"search\" ? (\n <SearchIcon />\n ) : (\n step.label.slice(0, 1).toUpperCase()\n )}\n </span>\n <span className=\"agent-activity-bubble__step-copy\">\n <span className=\"agent-activity-bubble__step-heading\">\n <strong>{stepLabel(step, brandLabel)}</strong>\n {step.kind === \"planning\" && !brandLabel ? null : (\n <small>\n {step.kind === \"specialist\"\n ? \"Specialist\"\n : step.kind === \"search\"\n ? \"Built-in capability\"\n : \"Supervisor\"}\n </small>\n )}\n </span>\n {detail ? (\n <span className=\"agent-activity-bubble__step-detail\">\n {detail}\n </span>\n ) : null}\n </span>\n </li>\n );\n })}\n </ol>\n ) : null}\n </div>\n </article>\n );\n}\n","import { useRef, useState, type FormEvent, type KeyboardEvent } from \"react\";\nimport \"./Composer.css\";\n\nfunction SendIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M8 12V4M8 4l-3 3M8 4l3 3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function Composer({\n disabled = false,\n placeholder = \"Ask anything…\",\n variant = \"default\",\n onSubmit,\n}: {\n disabled?: boolean;\n placeholder?: string;\n variant?: \"default\" | \"dock\";\n onSubmit?: (message: string) => void;\n}) {\n const [value, setValue] = useState(\"\");\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n function submitCurrent() {\n const trimmed = value.trim();\n if (!trimmed || disabled) return;\n onSubmit?.(trimmed);\n setValue(\"\");\n inputRef.current?.focus();\n }\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault();\n submitCurrent();\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLTextAreaElement>) {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submitCurrent();\n }\n }\n\n return (\n <form className={`composer${variant === \"dock\" ? \" composer--dock\" : \"\"}`} onSubmit={handleSubmit}>\n <div className=\"composer__field\">\n <textarea\n ref={inputRef}\n className=\"composer__input\"\n rows={1}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n aria-label=\"Message\"\n onChange={(event) => setValue(event.target.value)}\n onKeyDown={handleKeyDown}\n />\n <button\n type=\"submit\"\n className=\"composer__send\"\n disabled={disabled || !value.trim()}\n aria-label=\"Send message\"\n >\n <SendIcon />\n </button>\n </div>\n </form>\n );\n}\n","import type { FollowUpSuggestion } from \"../../types/conversation\";\nimport \"./FollowUpChips.css\";\n\nexport function FollowUpChips({\n suggestions,\n disabled = false,\n label = \"Follow up\",\n variant = \"default\",\n onSelect,\n}: {\n suggestions: FollowUpSuggestion[];\n disabled?: boolean;\n label?: string;\n variant?: \"default\" | \"dock\";\n onSelect?: (suggestion: FollowUpSuggestion) => void;\n}) {\n if (suggestions.length === 0) return null;\n\n if (variant === \"dock\") {\n return (\n <div className=\"followups followups--dock\">\n <div className=\"followups__scroll\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion.id}\n type=\"button\"\n className=\"followups__chip followups__chip--dock\"\n disabled={disabled}\n onClick={() => onSelect?.(suggestion)}\n >\n {suggestion.label}\n </button>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"followups\">\n <span className=\"followups__label\">{label}</span>\n <div className=\"followups__list\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion.id}\n type=\"button\"\n className=\"followups__chip\"\n disabled={disabled}\n onClick={() => onSelect?.(suggestion)}\n >\n {suggestion.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { ConversationMessage } from \"../../types/conversation\";\nimport {\n extractToolCards,\n hideToolCardFences,\n bookingOfferIdentityKey,\n type BookingOffer,\n} from \"../../lib/tool-card\";\nimport { BookingCard } from \"../BookingCard/BookingCard\";\nimport { Streamdown } from \"streamdown\";\nimport \"streamdown/styles.css\";\nimport \"./MessageBubble.css\";\n\nexport function MessageBubble({\n message,\n brandLogoUrl,\n offer,\n onBook,\n}: {\n message: ConversationMessage;\n brandLogoUrl?: string;\n offer?: BookingOffer | null;\n onBook?: (input: { displayText: string; runtimeText: string }) => void;\n}) {\n const resolvedLogoUrl = brandLogoUrl?.trim();\n const [failedLogoUrl, setFailedLogoUrl] = useState<string | null>(null);\n const showBrandLogo =\n Boolean(resolvedLogoUrl) && failedLogoUrl !== resolvedLogoUrl;\n const cards =\n message.role === \"agent\" ? extractToolCards(message.text) : [];\n const extractedOffers = cards.filter(\n (card): card is BookingOffer => card.type === \"booking_offer\",\n );\n const offers = offer ? [offer] : extractedOffers;\n const visibleText = hideToolCardFences(message.text);\n const isStreaming = message.role === \"agent\" && Boolean(message.streaming);\n const displayText =\n offers.length > 0\n ? visibleText || \"Pick a date and time that works for you.\"\n : visibleText || (isStreaming ? \"\" : message.text);\n\n if (message.role === \"visitor\") {\n return (\n <article className=\"message-bubble message-bubble--visitor\">\n <p className=\"message-bubble__text\">{message.text}</p>\n </article>\n );\n }\n\n const agentText = (\n <div className=\"message-bubble__text\">\n <Streamdown\n animated\n caret=\"circle\"\n className=\"message-bubble__markdown\"\n controls={false}\n isAnimating={isStreaming}\n linkSafety={{ enabled: false }}\n mode={isStreaming ? \"streaming\" : \"static\"}\n skipHtml\n >\n {displayText}\n </Streamdown>\n </div>\n );\n\n return (\n <article className=\"message-bubble message-bubble--agent\">\n {displayText ? (\n showBrandLogo ? (\n <div className=\"message-bubble__agent-row\">\n <span className=\"message-bubble__agent-avatar\" aria-hidden=\"true\">\n <img\n src={resolvedLogoUrl}\n alt=\"\"\n onError={() => {\n setFailedLogoUrl(resolvedLogoUrl ?? null);\n }}\n />\n </span>\n {agentText}\n </div>\n ) : (\n agentText\n )\n ) : null}\n {offers.map((nextOffer, index) => (\n <BookingCard\n key={`${bookingOfferIdentityKey(nextOffer)}-${index}`}\n offer={nextOffer}\n onBook={onBook}\n />\n ))}\n </article>\n );\n}\n","import { useId, useMemo, useState, type FormEvent } from \"react\";\nimport {\n bookingSlotsForEventType,\n firstAvailableBookingMonth,\n formatBookingRequest,\n formatLongDate,\n formatMonthTitle,\n formatSlotLabel,\n formatSlotTimeZone,\n formatTimeChip,\n slotDateKey,\n visitorTimeZone,\n weekdayLabels,\n type BookingOffer,\n} from \"../../lib/tool-card\";\nimport \"./BookingCard.css\";\n\ntype BookingStep = \"date\" | \"time\" | \"details\";\n\nfunction monthFromKey(key: string) {\n const [year, month] = key.split(\"-\").map(Number);\n if (!year || !month) return { year: new Date().getFullYear(), month: new Date().getMonth() };\n return { year, month: month - 1 };\n}\n\nfunction dateKeyFromParts(year: number, month: number, day: number) {\n return [\n year,\n String(month + 1).padStart(2, \"0\"),\n String(day).padStart(2, \"0\"),\n ].join(\"-\");\n}\n\nfunction calendarCells(year: number, month: number) {\n const firstWeekday = (new Date(year, month, 1).getDay() + 6) % 7;\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const cells: Array<{ day: number; key: string } | null> = [];\n for (let index = 0; index < firstWeekday; index += 1) cells.push(null);\n for (let day = 1; day <= daysInMonth; day += 1) {\n cells.push({ day, key: dateKeyFromParts(year, month, day) });\n }\n while (cells.length < 42) cells.push(null);\n return cells;\n}\n\nexport function BookingCard({\n offer,\n onBook,\n}: {\n offer: BookingOffer;\n onBook?: (input: { displayText: string; runtimeText: string }) => void;\n}) {\n const fieldId = useId();\n const defaultType = offer.eventTypes[0]?.uri ?? offer.slots[0]?.eventTypeUri ?? \"\";\n const [step, setStep] = useState<BookingStep>(\"date\");\n const [eventTypeUri, setEventTypeUri] = useState(defaultType);\n const [selectedDate, setSelectedDate] = useState(\"\");\n const [startTime, setStartTime] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n\n const slots = useMemo(\n () => bookingSlotsForEventType(offer.slots, eventTypeUri),\n [eventTypeUri, offer.slots],\n );\n\n const availableByDate = useMemo(() => {\n const next = new Map<string, string>();\n for (const slot of slots) {\n const key = slotDateKey(slot.startTime);\n if (!next.has(key)) next.set(key, slot.startTime);\n }\n return next;\n }, [slots]);\n\n const [visibleMonth, setVisibleMonth] = useState(() =>\n firstAvailableBookingMonth(slots),\n );\n\n function selectEventType(nextType: string) {\n setEventTypeUri(nextType);\n setSelectedDate(\"\");\n setStartTime(\"\");\n setVisibleMonth(\n firstAvailableBookingMonth(bookingSlotsForEventType(offer.slots, nextType)),\n );\n }\n\n const daySlots = useMemo(\n () => slots.filter((slot) => slotDateKey(slot.startTime) === selectedDate),\n [selectedDate, slots],\n );\n\n const selectedType = offer.eventTypes.find((item) => item.uri === eventTypeUri);\n const selectedSample = availableByDate.get(selectedDate) ?? startTime;\n const timeZone = formatSlotTimeZone(slots[0]?.startTime ?? selectedSample);\n const weekdays = useMemo(() => weekdayLabels(), []);\n const cells = calendarCells(visibleMonth.year, visibleMonth.month);\n\n const canPrevMonth = [...availableByDate.keys()].some((key) => {\n const month = monthFromKey(key);\n return (\n month.year < visibleMonth.year ||\n (month.year === visibleMonth.year && month.month < visibleMonth.month)\n );\n });\n const canNextMonth = [...availableByDate.keys()].some((key) => {\n const month = monthFromKey(key);\n return (\n month.year > visibleMonth.year ||\n (month.year === visibleMonth.year && month.month > visibleMonth.month)\n );\n });\n\n function goToMonth(offset: number) {\n setVisibleMonth((current) => {\n const next = new Date(current.year, current.month + offset, 1);\n return { year: next.getFullYear(), month: next.getMonth() };\n });\n }\n\n function selectDate(key: string) {\n if (!availableByDate.has(key)) return;\n setSelectedDate(key);\n setStartTime(\"\");\n setStep(\"time\");\n }\n\n function selectTime(value: string) {\n setStartTime(value);\n setStep(\"details\");\n }\n\n function handleSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (!eventTypeUri || !startTime || !name.trim() || !email.trim()) return;\n onBook?.({\n displayText: `Book the ${formatSlotLabel(startTime)} demo`,\n runtimeText: formatBookingRequest({\n eventTypeUri,\n inviteeEmail: email.trim(),\n inviteeName: name.trim(),\n startTime,\n timezone: visitorTimeZone(),\n locationKind: selectedType?.locationKind,\n location: selectedType?.location,\n }),\n });\n }\n\n return (\n <section className=\"booking-card\" aria-label=\"Book a meeting\">\n <form className=\"booking-card__form\" onSubmit={handleSubmit}>\n {step === \"date\" ? (\n <div className=\"booking-card__step\" key=\"date\">\n <p className=\"booking-card__title\">\n {selectedType?.name || \"Pick a date\"}\n </p>\n {timeZone ? <p className=\"booking-card__tz\">Times in {timeZone}</p> : null}\n {offer.eventTypes.length > 1 ? (\n <label className=\"booking-card__field\" htmlFor={`${fieldId}-type`}>\n <span>Meeting</span>\n <select\n id={`${fieldId}-type`}\n value={eventTypeUri}\n onChange={(event) => selectEventType(event.target.value)}\n >\n {offer.eventTypes.map((item) => (\n <option key={item.uri} value={item.uri}>\n {item.name}\n </option>\n ))}\n </select>\n </label>\n ) : null}\n <div className=\"booking-card__month\">\n <button\n type=\"button\"\n className=\"booking-card__nav\"\n aria-label=\"Previous month\"\n disabled={!canPrevMonth}\n onClick={() => goToMonth(-1)}\n >\n ‹\n </button>\n <p className=\"booking-card__month-title\">\n {formatMonthTitle(visibleMonth.year, visibleMonth.month)}\n </p>\n <button\n type=\"button\"\n className=\"booking-card__nav\"\n aria-label=\"Next month\"\n disabled={!canNextMonth}\n onClick={() => goToMonth(1)}\n >\n ›\n </button>\n </div>\n <div className=\"booking-card__weekdays\">\n {weekdays.map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n <div className=\"booking-card__calendar\" role=\"grid\" aria-label=\"Available dates\">\n {cells.map((cell, index) => {\n if (!cell) {\n return <span key={`empty-${index}`} className=\"booking-card__day\" />;\n }\n const available = availableByDate.has(cell.key);\n const selected = cell.key === selectedDate;\n return (\n <button\n key={cell.key}\n type=\"button\"\n className={[\n \"booking-card__day\",\n available ? \"booking-card__day--available\" : \"\",\n selected ? \"booking-card__day--selected\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n disabled={!available}\n aria-pressed={selected}\n onClick={() => selectDate(cell.key)}\n >\n {cell.day}\n </button>\n );\n })}\n </div>\n </div>\n ) : null}\n\n {step === \"time\" ? (\n <div className=\"booking-card__step\" key=\"time\">\n <div className=\"booking-card__step-bar\">\n <button\n type=\"button\"\n className=\"booking-card__nav\"\n aria-label=\"Back to dates\"\n onClick={() => setStep(\"date\")}\n >\n ‹\n </button>\n <div>\n <p className=\"booking-card__title\">\n {selectedSample ? formatLongDate(selectedSample) : \"Pick a time\"}\n </p>\n {timeZone ? <p className=\"booking-card__tz\">Times in {timeZone}</p> : null}\n </div>\n </div>\n <div className=\"booking-card__times\">\n {daySlots.map((slot) => (\n <button\n key={slot.startTime}\n type=\"button\"\n className={\n startTime === slot.startTime\n ? \"booking-card__time booking-card__time--selected\"\n : \"booking-card__time\"\n }\n onClick={() => selectTime(slot.startTime)}\n >\n {formatTimeChip(slot.startTime)}\n </button>\n ))}\n </div>\n </div>\n ) : null}\n\n {step === \"details\" ? (\n <div className=\"booking-card__step\" key=\"details\">\n <div className=\"booking-card__step-bar\">\n <button\n type=\"button\"\n className=\"booking-card__nav\"\n aria-label=\"Back to times\"\n onClick={() => setStep(\"time\")}\n >\n ‹\n </button>\n <div>\n <p className=\"booking-card__title\">Enter details</p>\n <p className=\"booking-card__tz\">{formatSlotLabel(startTime)}</p>\n {selectedType?.location ? (\n <p className=\"booking-card__tz\">{selectedType.location}</p>\n ) : null}\n </div>\n </div>\n <div className=\"booking-card__identity\">\n <label className=\"booking-card__field\" htmlFor={`${fieldId}-name`}>\n <span>Name</span>\n <input\n id={`${fieldId}-name`}\n autoComplete=\"name\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n required\n />\n </label>\n <label className=\"booking-card__field\" htmlFor={`${fieldId}-email`}>\n <span>Email</span>\n <input\n id={`${fieldId}-email`}\n type=\"email\"\n autoComplete=\"email\"\n value={email}\n onChange={(event) => setEmail(event.target.value)}\n required\n />\n </label>\n </div>\n <button type=\"submit\" className=\"booking-card__submit\">\n Book this time\n </button>\n </div>\n ) : null}\n </form>\n </section>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport { useAgentColorScheme } from \"../../hooks/useAgentColorScheme\";\nimport {\n defaultDarkAgentRailTheme,\n type AgentColorScheme,\n} from \"../../types/conversation\";\nimport \"./AssistEdgeTab.css\";\n\nexport type AssistTabVariant = \"outline\" | \"ask\" | \"fill\";\nexport type AssistTabSide = \"right\" | \"left\" | \"top\" | \"bottom\";\n\nfunction SparklesIcon() {\n return (\n <svg\n className=\"assist-edge-tab__sparkles\"\n viewBox=\"0 0 18 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M8 1.2l.95 2.7 2.85.05-2.25 1.75.8 2.75L8 6.7 5.65 8.45l.8-2.75L4.2 3.95l2.85-.05L8 1.2z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M14.2 6.4l.55 1.55 1.65.03-1.3 1 .46 1.58-1.36-1-1.36 1 .46-1.58-1.3-1 1.65-.03.55-1.55z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M3.1 9.1l.4 1.15 1.22.02-.96.74.34 1.17-1-.74-1 .74.34-1.17-.96-.74 1.22-.02.4-1.15z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction TabMarkIcon({ customIconUrl }: { customIconUrl?: string }) {\n const url = customIconUrl?.trim();\n if (url) {\n return (\n <img\n alt=\"\"\n aria-hidden\n className=\"assist-edge-tab__custom-icon\"\n src={url}\n />\n );\n }\n\n return <SparklesIcon />;\n}\n\nfunction ChevronLeftIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M10 4L6 8l4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronDownIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DragDots() {\n return (\n <span className=\"assist-edge-tab__dots\" aria-hidden=\"true\">\n {Array.from({ length: 12 }, (_, index) => (\n <i key={index} />\n ))}\n </span>\n );\n}\n\nconst VARIANT_COPY: Record<AssistTabVariant, { label: string; aria: string }> =\n {\n outline: { label: \"Ask anything\", aria: \"Ask anything\" },\n ask: { label: \"Ask anything\", aria: \"Ask anything\" },\n fill: { label: \"Ask anything\", aria: \"Ask anything\" },\n };\n\nexport function AssistEdgeTab({\n variant,\n side,\n along,\n inset,\n visible,\n label,\n customIconUrl,\n logoUrl,\n brandColor,\n brandForeground,\n borderColor,\n fontFamily,\n mobile = false,\n surfaceColor,\n textColor,\n colorScheme = \"auto\",\n onOpen,\n}: {\n variant: AssistTabVariant;\n side: AssistTabSide;\n along: number;\n inset: number;\n visible: boolean;\n label?: string;\n customIconUrl?: string;\n logoUrl?: string;\n brandColor?: string;\n brandForeground?: string;\n borderColor?: string;\n fontFamily?: string;\n mobile?: boolean;\n surfaceColor?: string;\n textColor?: string;\n colorScheme?: AgentColorScheme;\n onOpen: () => void;\n}) {\n const resolvedColorScheme = useAgentColorScheme(colorScheme);\n const copy = VARIANT_COPY[variant];\n const visibleLabel = label?.trim() || copy.label;\n const showLogo = Boolean(logoUrl?.trim()) && !customIconUrl?.trim();\n const resolvedBrandColor =\n brandColor ??\n (resolvedColorScheme === \"dark\"\n ? defaultDarkAgentRailTheme.brand\n : undefined);\n const resolvedBorderColor =\n resolvedColorScheme === \"dark\"\n ? defaultDarkAgentRailTheme.border\n : borderColor;\n const resolvedSurfaceColor =\n resolvedColorScheme === \"dark\"\n ? defaultDarkAgentRailTheme.surface\n : surfaceColor;\n const resolvedTextColor =\n resolvedColorScheme === \"dark\" ? defaultDarkAgentRailTheme.text : textColor;\n const style = {\n \"--tab-along\": `${along}%`,\n \"--tab-inset\": `${inset}px`,\n ...(resolvedBrandColor ? { \"--as-brand\": resolvedBrandColor } : {}),\n ...(brandForeground ? { \"--as-visitor-text\": brandForeground } : {}),\n ...(resolvedBorderColor ? { \"--as-border\": resolvedBorderColor } : {}),\n ...(fontFamily ? { \"--as-font-display\": fontFamily } : {}),\n ...(resolvedSurfaceColor ? { \"--as-surface\": resolvedSurfaceColor } : {}),\n ...(resolvedTextColor ? { \"--as-text\": resolvedTextColor } : {}),\n colorScheme: resolvedColorScheme,\n } as CSSProperties;\n\n return (\n <button\n type=\"button\"\n className={`assist-edge-tab assist-edge-tab--${variant} assist-edge-tab--${side}${\n mobile ? \" assist-edge-tab--mobile\" : \"\"\n }${visible ? \" is-visible\" : \"\"}`}\n data-color-scheme={resolvedColorScheme}\n style={style}\n aria-label={`Open ${visibleLabel}`}\n aria-hidden={!visible}\n tabIndex={visible ? 0 : -1}\n onClick={onOpen}\n >\n {mobile ? (\n <>\n <span\n className=\"assist-edge-tab__mark assist-edge-tab__mark--mobile\"\n aria-hidden=\"true\"\n >\n <TabMarkIcon customIconUrl={customIconUrl} />\n {showLogo ? (\n <img\n className=\"assist-edge-tab__logo\"\n src={logoUrl}\n alt=\"\"\n onError={(event) => {\n event.currentTarget.hidden = true;\n }}\n />\n ) : null}\n </span>\n <span className=\"assist-edge-tab__label\">{visibleLabel}</span>\n </>\n ) : variant === \"outline\" ? (\n <>\n <span className=\"assist-edge-tab__mark\" aria-hidden=\"true\">\n <TabMarkIcon customIconUrl={customIconUrl} />\n {showLogo ? (\n <img\n className=\"assist-edge-tab__logo\"\n src={logoUrl}\n alt=\"\"\n onError={(event) => {\n event.currentTarget.hidden = true;\n }}\n />\n ) : null}\n </span>\n <span className=\"assist-edge-tab__label\">{visibleLabel}</span>\n <ChevronDownIcon />\n </>\n ) : null}\n\n {variant === \"ask\" ? (\n <>\n <ChevronLeftIcon />\n <span className=\"assist-edge-tab__label\">{visibleLabel}</span>\n <DragDots />\n </>\n ) : null}\n\n {variant === \"fill\" ? (\n <>\n <span className=\"assist-edge-tab__mark\" aria-hidden=\"true\">\n <TabMarkIcon customIconUrl={customIconUrl} />\n {showLogo ? (\n <img\n className=\"assist-edge-tab__logo\"\n src={logoUrl}\n alt=\"\"\n onError={(event) => {\n event.currentTarget.hidden = true;\n }}\n />\n ) : null}\n </span>\n <span className=\"assist-edge-tab__label\">{visibleLabel}</span>\n <ChevronLeftIcon />\n </>\n ) : null}\n </button>\n );\n}\n","import \"../../styles/all.css\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { shouldApplyPageShift, usePageShift } from \"../../page-shift\";\nimport { useAgentChat } from \"../../hooks/useAgentChat\";\nimport { useIsMobile } from \"../../hooks/useIsMobile\";\nimport type { AgentIndexVersion } from \"../../../runtime/types\";\nimport {\n normalizeAgentPlacement,\n type AgentPlacementConfig,\n} from \"../../placement\";\nimport {\n registerAgentPanelController,\n unregisterAgentPanelController,\n} from \"../../panel-controller\";\nimport { AgentRail } from \"../AgentRail\";\nimport { AssistEdgeTab } from \"../AssistEdgeTab/AssistEdgeTab\";\nimport type { AgentBrandingConfig } from \"../../../embed/manifest\";\nimport type { AgentRailTheme } from \"../../types/conversation\";\n\nexport type AgentWidgetProps = {\n indexId: string;\n customerId: string;\n getUnpublishedPreviewGrant?: () => Promise<string>;\n previewBuildId?: string;\n version?: AgentIndexVersion;\n runtimeOrigin?: string;\n placement?: Partial<AgentPlacementConfig>;\n defaultCollapsed?: boolean;\n pageShift?: boolean;\n registerPanelController?: boolean;\n branding?: AgentBrandingConfig;\n};\n\nexport function AgentWidget({\n indexId,\n customerId,\n getUnpublishedPreviewGrant,\n previewBuildId,\n version,\n runtimeOrigin,\n placement: placementInput,\n defaultCollapsed = true,\n pageShift = true,\n registerPanelController = false,\n branding,\n}: AgentWidgetProps) {\n const isMobile = useIsMobile();\n const placement = normalizeAgentPlacement(placementInput);\n const railSlotRef = useRef<HTMLDivElement>(null);\n const [railCollapsed, setRailCollapsed] = useState(defaultCollapsed);\n const [railExpanded, setRailExpanded] = useState(false);\n const pageShiftActive = shouldApplyPageShift({\n pageShift,\n isMobile,\n railCollapsed,\n railExpanded,\n });\n\n usePageShift({\n active: pageShiftActive,\n railSlotRef,\n });\n const { state, reset, retry, submit } = useAgentChat({\n customerId,\n getUnpublishedPreviewGrant,\n indexId,\n previewBuildId,\n version,\n runtimeOrigin,\n greeting: branding?.greeting,\n });\n\n const agentName = branding?.agentName ?? \"\";\n const tabLabel = branding?.tabLabel ?? agentName;\n const theme: Partial<AgentRailTheme> = {\n ...(branding?.fontFamily\n ? { fontBody: branding.fontFamily, fontDisplay: branding.fontFamily }\n : {}),\n ...(branding?.colors?.primary\n ? {\n brand: branding.colors.primary,\n visitorBubble: branding.colors.primary,\n }\n : {}),\n ...(branding?.colors?.primarySoft\n ? { brandSoft: branding.colors.primarySoft }\n : {}),\n ...(branding?.colors?.primaryForeground\n ? { visitorText: branding.colors.primaryForeground }\n : {}),\n ...(branding?.colors?.surface ? { surface: branding.colors.surface } : {}),\n ...(branding?.colors?.surfaceMuted\n ? { surfaceMuted: branding.colors.surfaceMuted }\n : {}),\n ...(branding?.colors?.text ? { text: branding.colors.text } : {}),\n ...(branding?.colors?.textMuted\n ? {\n textMuted: branding.colors.textMuted,\n textSubtle: branding.colors.textMuted,\n }\n : {}),\n ...(branding?.colors?.border ? { border: branding.colors.border } : {}),\n };\n\n useEffect(() => {\n if (!registerPanelController) return;\n\n registerAgentPanelController(customerId, {\n open: () => setRailCollapsed(false),\n close: () => {\n setRailCollapsed(true);\n setRailExpanded(false);\n },\n });\n\n return () => unregisterAgentPanelController(customerId);\n }, [customerId, registerPanelController]);\n\n async function handleSubmit(message: string) {\n if (isMobile) setRailCollapsed(false);\n await submit(message);\n }\n\n useEffect(() => {\n if (railCollapsed) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Tab\" && (isMobile || railExpanded)) {\n const focusable = railSlotRef.current?.querySelectorAll<HTMLElement>(\n 'button:not(:disabled), a[href], textarea:not(:disabled), input:not(:disabled), [tabindex]:not([tabindex=\"-1\"])'\n );\n if (!focusable || focusable.length === 0) return;\n const first = focusable.item(0);\n const last = focusable.item(focusable.length - 1);\n const dialog = railSlotRef.current?.querySelector(\".agent-rail\");\n if (document.activeElement === dialog) {\n event.preventDefault();\n (event.shiftKey ? last : first).focus();\n } else if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n return;\n }\n\n if (event.key === \"Escape\") {\n if (railExpanded) {\n setRailExpanded(false);\n return;\n }\n setRailCollapsed(true);\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [isMobile, railCollapsed, railExpanded]);\n\n return (\n <div className=\"webless-agent-root\">\n <div\n className={`webless-agent-root__shell${\n railCollapsed ? \" webless-agent-root__shell--collapsed\" : \"\"\n }${railExpanded ? \" webless-agent-root__shell--expanded\" : \"\"}`}\n >\n <div\n ref={railSlotRef}\n className=\"webless-agent-root__rail-slot\"\n inert={railCollapsed || undefined}\n aria-hidden={railCollapsed}\n >\n <AgentRail\n theme={theme}\n brandLabel={agentName}\n brandLogoUrl={branding?.logoUrl}\n composerPlaceholder={\n branding?.composerPlaceholder ?? \"Ask a question…\"\n }\n poweredByLabel={branding?.poweredByLabel ?? \"Powered by Webless\"}\n state={state}\n mobileFullscreen={isMobile && !railCollapsed}\n expanded={railExpanded}\n onCollapse={!isMobile ? () => setRailCollapsed(true) : undefined}\n onClose={isMobile ? () => setRailCollapsed(true) : undefined}\n onExpandToggle={\n !isMobile\n ? () => setRailExpanded((current) => !current)\n : undefined\n }\n onSubmit={handleSubmit}\n onReset={reset}\n onRetry={() => void retry()}\n onFollowUpSelect={(label) => void handleSubmit(label)}\n onBook={(input) =>\n void submit(input.displayText, { runtimeText: input.runtimeText })\n }\n />\n </div>\n </div>\n\n {railCollapsed ? (\n <AssistEdgeTab\n variant={placement.variant}\n side={placement.side}\n along={placement.along}\n inset={placement.inset}\n visible\n label={tabLabel}\n customIconUrl={branding?.tabIconUrl}\n logoUrl={branding?.logoUrl}\n brandColor={branding?.colors?.primary}\n brandForeground={branding?.colors?.primaryForeground}\n borderColor={branding?.colors?.border}\n fontFamily={branding?.fontFamily}\n mobile={isMobile}\n surfaceColor={branding?.colors?.surface}\n textColor={branding?.colors?.text}\n onOpen={() => setRailCollapsed(false)}\n />\n ) : null}\n </div>\n );\n}\n","import { useEffect, type RefObject } from \"react\";\n\nexport const PAGE_SHIFT_CLASS = \"webless-agent-page-shift\";\nconst DEFAULT_RAIL_WIDTH_PX = 450;\n\nexport function shouldApplyPageShift(input: {\n pageShift: boolean;\n isMobile: boolean;\n railCollapsed: boolean;\n railExpanded: boolean;\n}) {\n return input.pageShift && !input.isMobile && !input.railCollapsed && !input.railExpanded;\n}\n\nexport function resolvePageShiftWidth(railWidth: number | null | undefined) {\n if (typeof railWidth === \"number\" && railWidth > 0) {\n return railWidth;\n }\n\n if (typeof document !== \"undefined\") {\n const token = getComputedStyle(document.documentElement)\n .getPropertyValue(\"--as-rail-max-width\")\n .trim();\n const parsed = Number.parseFloat(token);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n\n return DEFAULT_RAIL_WIDTH_PX;\n}\n\ntype PageMarginSnapshot = {\n value: string;\n priority: string;\n};\n\nexport type PageMarginStyle = Pick<\n CSSStyleDeclaration,\n \"getPropertyValue\" | \"getPropertyPriority\" | \"setProperty\" | \"removeProperty\"\n>;\n\nlet savedPageMargin: PageMarginSnapshot | null = null;\n\nexport function readPageMarginSnapshot(style: PageMarginStyle): PageMarginSnapshot {\n return {\n value: style.getPropertyValue(\"margin-right\"),\n priority: style.getPropertyPriority(\"margin-right\"),\n };\n}\n\nexport function restorePageMargin(style: PageMarginStyle, snapshot: PageMarginSnapshot) {\n if (snapshot.value) {\n style.setProperty(\"margin-right\", snapshot.value, snapshot.priority || undefined);\n return;\n }\n\n style.removeProperty(\"margin-right\");\n}\n\nfunction snapshotPageMarginIfNeeded() {\n if (savedPageMargin !== null) {\n return;\n }\n\n savedPageMargin = readPageMarginSnapshot(document.documentElement.style);\n}\n\nfunction setPageMargin(margin: string) {\n snapshotPageMarginIfNeeded();\n document.documentElement.style.setProperty(\"margin-right\", margin, \"important\");\n}\n\nfunction clearPageMargin() {\n if (savedPageMargin === null) {\n return;\n }\n\n restorePageMargin(document.documentElement.style, savedPageMargin);\n savedPageMargin = null;\n}\n\nexport function usePageShift(input: {\n active: boolean;\n railSlotRef: RefObject<HTMLElement | null>;\n}) {\n const { active, railSlotRef } = input;\n\n useEffect(() => {\n if (typeof document === \"undefined\") {\n return;\n }\n\n if (!active) {\n document.documentElement.classList.remove(PAGE_SHIFT_CLASS);\n clearPageMargin();\n return;\n }\n\n document.documentElement.classList.add(PAGE_SHIFT_CLASS);\n\n function applyMargin() {\n const rail = railSlotRef.current?.querySelector(\".agent-rail\");\n const width = resolvePageShiftWidth(\n rail instanceof HTMLElement ? rail.offsetWidth : null,\n );\n setPageMargin(`${width}px`);\n }\n\n applyMargin();\n const frame = requestAnimationFrame(applyMargin);\n\n return () => {\n cancelAnimationFrame(frame);\n document.documentElement.classList.remove(PAGE_SHIFT_CLASS);\n clearPageMargin();\n };\n }, [active, railSlotRef]);\n}\n","import { useEffect, useState } from \"react\";\n\nexport function useIsMobile(breakpoint = 767) {\n const [isMobile, setIsMobile] = useState(\n () => typeof window !== \"undefined\" && window.matchMedia(`(max-width: ${breakpoint}px)`).matches,\n );\n\n useEffect(() => {\n const media = window.matchMedia(`(max-width: ${breakpoint}px)`);\n const onChange = () => setIsMobile(media.matches);\n onChange();\n media.addEventListener(\"change\", onChange);\n return () => media.removeEventListener(\"change\", onChange);\n }, [breakpoint]);\n\n return isMobile;\n}\n","type AgentPanelController = {\n open: () => void;\n close: () => void;\n};\n\nconst controllers = new Map<string, AgentPanelController>();\n\nexport function registerAgentPanelController(customerId: string, controller: AgentPanelController) {\n controllers.set(customerId, controller);\n}\n\nexport function unregisterAgentPanelController(customerId: string) {\n controllers.delete(customerId);\n}\n\nexport function openAgentPanel(customerId: string) {\n controllers.get(customerId)?.open();\n}\n\nexport function closeAgentPanel(customerId: string) {\n controllers.get(customerId)?.close();\n}\n"],"mappings":"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","names":["ClientError","current","ClientError","ClientError","useEffect","useRef","useState","useState","useState","useRef","useState","jsx","jsxs","useState","useRef","jsx","jsxs","useState","useMemo","useState","jsx","jsxs","useState","useMemo","jsx","jsxs","useState","jsx","jsxs","useRef","useState","hasVisitorMessages","useEffect","Fragment","jsx","jsxs","useEffect","useRef","useState","useEffect","useEffect","useState","jsx","jsxs","useRef","useState","useEffect"]}