@webless/agent 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/{chunk-P6ZM4BIU.js → chunk-2Q754CIY.js} +372 -231
- package/dist/chunk-2Q754CIY.js.map +1 -0
- package/dist/embed.cjs +424 -283
- package/dist/embed.cjs.map +1 -1
- package/dist/embed.css +147 -200
- package/dist/embed.css.map +1 -1
- package/dist/embed.d.cts +2 -2
- package/dist/embed.d.ts +2 -2
- package/dist/embed.js +1 -1
- package/dist/embed.js.map +1 -1
- package/dist/{panel-controller-VmCsa5Si.d.cts → panel-controller-CDWodIJl.d.cts} +4 -0
- package/dist/{panel-controller-VmCsa5Si.d.ts → panel-controller-CDWodIJl.d.ts} +4 -0
- package/dist/react.cjs +426 -285
- package/dist/react.cjs.map +1 -1
- package/dist/react.css +147 -200
- package/dist/react.css.map +1 -1
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-P6ZM4BIU.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/tool-ui.ts","../src/runtime/tool-result-envelope.ts","../src/runtime/connected-tool-work.ts","../src/runtime/search-discovery.ts","../src/react/lib/composer-form.ts","../src/react/lib/tool-card.ts","../src/react/lib/tool-result.ts","../src/react/hooks/useAgentHandoff.ts","../src/react/hooks/useAgentChat.ts","../src/runtime/client.ts","../src/runtime/handoff.ts","../src/runtime/generated/handoff-contract.ts","../src/runtime/capability.ts","../src/runtime/config.ts","../src/runtime/session-store.ts","../src/runtime/subagent-child-stream.ts","../src/runtime/errors.ts","../src/react/persisted-conversation.ts","../src/react/lib/visitor-input.ts","../src/react/placement.ts","../src/react/panel-controller.ts","../src/react/types/conversation.ts","../src/react/components/MessageActions/MessageActions.tsx","../src/react/lib/speech.ts","../src/react/components/AgentRail/AgentRailOverlayContext.tsx","../src/react/components/AgentRail/AgentRail.tsx","../src/react/lib/agent-theme.ts","../src/react/hooks/useAgentColorScheme.ts","../src/react/components/AgentActivityBubble/AgentActivityBubble.tsx","../src/react/components/SearchReferences/SearchReferences.tsx","../src/react/components/ExploreMore/ExploreMore.tsx","../src/react/components/AnswerReceiptDialog/AnswerReceiptDialog.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/lib/brand-logo-display.ts","../src/react/lib/resolve-message-url.ts","../src/react/components/HumanInputCard/HumanInputCard.tsx","../src/react/components/ConfirmationCard/ConfirmationCard.tsx","../src/react/components/ToolInputCard/ToolInputCard.tsx","../src/react/components/LocationConsent/LocationConsent.tsx","../src/runtime/location-consent.ts","../src/react/components/CollectionResultCard/CollectionResultCard.tsx","../src/react/components/EntityResultCard/EntityResultCard.tsx","../src/react/components/SignatureResultCard/SignatureResultCard.tsx","../src/react/components/ToolResultCard/ToolResultCard.tsx","../src/react/components/VisitorToolResultView/VisitorToolResultView.tsx","../src/react/components/AssistEdgeTab/AssistEdgeTab.tsx","../src/react/lib/agent-feedback.ts","../src/react/components/AgentWidget/AgentWidget.tsx","../src/react/page-shift.ts","../src/react/hooks/useIsMobile.ts"],"sourcesContent":["import type { AgentToolResultJsonValue } from \"./tool-result-envelope\";\n\nexport const AGENT_TOOL_UI_SCHEMA_VERSION = \"webless.tool-ui.v1\" as const;\nexport const AGENT_STRUCTURED_TOOL_INPUT_SCHEMA_VERSION =\n \"webless.structured-tool-input.v1\" as const;\nexport const AGENT_STRUCTURED_TOOL_INPUT_HEADER =\n \"Webless-Structured-Tool-Input-JSON:\" as const;\n\nexport type AgentToolUiFieldKind =\n | \"text\"\n | \"textarea\"\n | \"email\"\n | \"number\"\n | \"select\"\n | \"multi-select\"\n | \"checkbox\"\n | \"confirmation\"\n | \"radio\"\n | \"date\"\n | \"time\"\n | \"date-time\"\n | \"calendar\"\n | \"range\"\n | \"json\";\n\nexport type AgentToolUiOption = {\n label: string;\n value: AgentToolResultJsonValue;\n};\n\nexport type AgentToolUiField = {\n description?: string;\n kind: AgentToolUiFieldKind;\n label: string;\n max?: number;\n maxItems?: number;\n maxLength?: number;\n min?: number;\n minLength?: number;\n options?: readonly AgentToolUiOption[];\n path: string;\n placeholder?: string;\n required?: boolean;\n step?: number;\n defaultValue?: AgentToolResultJsonValue;\n};\n\nexport type AgentToolUiStep = {\n description?: string;\n fieldPaths: readonly string[];\n id: string;\n label: string;\n};\n\nexport type AgentToolUiAction = {\n id: \"submit\" | \"back\" | \"next\" | \"reset\";\n label: string;\n};\n\nexport type AgentToolUiSurface = {\n actions?: readonly AgentToolUiAction[];\n description?: string;\n fields: readonly AgentToolUiField[];\n id: string;\n operationId?: string;\n requestId?: string;\n schemaVersion: typeof AGENT_TOOL_UI_SCHEMA_VERSION;\n steps?: readonly AgentToolUiStep[];\n submitLabel?: string;\n title: string;\n toolSlug: string;\n values?: Readonly<Record<string, AgentToolResultJsonValue>>;\n};\n\nexport type AgentStructuredToolInput = {\n schemaVersion: typeof AGENT_STRUCTURED_TOOL_INPUT_SCHEMA_VERSION;\n operationId?: string;\n toolSlug: string;\n values: Readonly<Record<string, AgentToolResultJsonValue>>;\n};\n\nexport function formatAgentStructuredToolInput(\n surface: AgentToolUiSurface,\n values: Readonly<Record<string, AgentToolResultJsonValue>>\n) {\n const payload: AgentStructuredToolInput = {\n schemaVersion: AGENT_STRUCTURED_TOOL_INPUT_SCHEMA_VERSION,\n toolSlug: surface.toolSlug,\n ...(surface.operationId ? { operationId: surface.operationId } : {}),\n values,\n };\n return `${AGENT_STRUCTURED_TOOL_INPUT_HEADER} ${JSON.stringify(payload)}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isJsonValue(\n value: unknown,\n seen = new Set<object>()\n): value is AgentToolResultJsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\") return false;\n if (seen.has(value)) return false;\n seen.add(value);\n const valid = Array.isArray(value)\n ? value.every((item) => isJsonValue(item, seen))\n : Object.entries(value).every(\n ([key, item]) => typeof key === \"string\" && isJsonValue(item, seen)\n );\n seen.delete(value);\n return valid;\n}\n\nfunction boundedString(value: unknown, max: number) {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0 ||\n value.length > max\n ) {\n return undefined;\n }\n return value.trim();\n}\n\nfunction numberValue(value: unknown) {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction integerValue(value: unknown) {\n return typeof value === \"number\" &&\n Number.isInteger(value) &&\n value >= 0 &&\n value <= 8_000\n ? value\n : undefined;\n}\n\nfunction isFieldKind(value: unknown): value is AgentToolUiFieldKind {\n return (\n typeof value === \"string\" &&\n [\n \"text\",\n \"textarea\",\n \"email\",\n \"number\",\n \"select\",\n \"multi-select\",\n \"checkbox\",\n \"confirmation\",\n \"radio\",\n \"date\",\n \"time\",\n \"date-time\",\n \"calendar\",\n \"range\",\n \"json\",\n ].includes(value)\n );\n}\n\nfunction parseField(value: unknown): AgentToolUiField | null {\n if (!isRecord(value)) return null;\n if (\n !hasOnlyKeys(value, [\n \"description\",\n \"kind\",\n \"label\",\n \"max\",\n \"maxItems\",\n \"maxLength\",\n \"min\",\n \"minLength\",\n \"options\",\n \"path\",\n \"placeholder\",\n \"required\",\n \"step\",\n \"defaultValue\",\n ])\n ) {\n return null;\n }\n if (!isFieldKind(value.kind)) return null;\n const path = boundedString(value.path, 160);\n const label = boundedString(value.label, 160);\n const description =\n value.description === undefined\n ? undefined\n : boundedString(value.description, 500);\n const placeholder =\n value.placeholder === undefined || typeof value.placeholder !== \"string\"\n ? undefined\n : value.placeholder;\n const required =\n value.required === undefined || typeof value.required !== \"boolean\"\n ? undefined\n : value.required;\n const min = value.min === undefined ? undefined : numberValue(value.min);\n const max = value.max === undefined ? undefined : numberValue(value.max);\n const maxItems =\n value.maxItems === undefined ? undefined : integerValue(value.maxItems);\n const step = value.step === undefined ? undefined : numberValue(value.step);\n const minLength =\n value.minLength === undefined ? undefined : integerValue(value.minLength);\n const maxLength =\n value.maxLength === undefined ? undefined : integerValue(value.maxLength);\n const defaultValue =\n value.defaultValue === undefined || !isJsonValue(value.defaultValue)\n ? undefined\n : value.defaultValue;\n if (!path || !/^[A-Za-z0-9_.[\\]-]+$/u.test(path) || !label) {\n return null;\n }\n if (value.description !== undefined && !description) return null;\n if (value.placeholder !== undefined && placeholder === undefined) return null;\n if (value.required !== undefined && required === undefined) return null;\n if (value.min !== undefined && min === undefined) return null;\n if (value.max !== undefined && max === undefined) return null;\n if (\n value.maxItems !== undefined &&\n (maxItems === undefined || maxItems < 1 || maxItems > 100)\n )\n return null;\n if (value.step !== undefined && step === undefined) return null;\n if (value.minLength !== undefined && minLength === undefined) return null;\n if (value.maxLength !== undefined && maxLength === undefined) return null;\n if (value.defaultValue !== undefined && defaultValue === undefined)\n return null;\n if (value.options !== undefined) {\n if (!Array.isArray(value.options) || value.options.length > 100)\n return null;\n for (const option of value.options) {\n if (\n !isRecord(option) ||\n !boundedString(option.label, 160) ||\n !isJsonValue(option.value)\n ) {\n return null;\n }\n }\n }\n return {\n kind: value.kind,\n path,\n label,\n ...(description ? { description } : {}),\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n ...(value.options !== undefined\n ? { options: value.options as AgentToolUiOption[] }\n : {}),\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...(maxItems !== undefined ? { maxItems } : {}),\n ...(step !== undefined ? { step } : {}),\n ...(minLength !== undefined ? { minLength } : {}),\n ...(maxLength !== undefined ? { maxLength } : {}),\n };\n}\n\nfunction parseStep(value: unknown): AgentToolUiStep | null {\n if (!isRecord(value)) return null;\n if (!hasOnlyKeys(value, [\"description\", \"fieldPaths\", \"id\", \"label\"])) {\n return null;\n }\n const id = boundedString(value.id, 80);\n const label = boundedString(value.label, 160);\n const description =\n value.description === undefined\n ? undefined\n : boundedString(value.description, 500);\n if (\n !id ||\n !/^[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(id) ||\n !label ||\n (value.description !== undefined && !description) ||\n !Array.isArray(value.fieldPaths) ||\n value.fieldPaths.length < 1 ||\n value.fieldPaths.length > 32 ||\n value.fieldPaths.some(\n (path) =>\n typeof path !== \"string\" ||\n !/^[A-Za-z0-9_.[\\]-]+$/u.test(path) ||\n path.length > 160\n )\n ) {\n return null;\n }\n return {\n id,\n label,\n fieldPaths: value.fieldPaths,\n ...(description ? { description } : {}),\n };\n}\n\nfunction parseAction(value: unknown): AgentToolUiAction | null {\n if (!isRecord(value)) return null;\n if (!hasOnlyKeys(value, [\"id\", \"label\"])) return null;\n const label = boundedString(value.label, 80);\n if (\n (value.id !== \"submit\" &&\n value.id !== \"back\" &&\n value.id !== \"next\" &&\n value.id !== \"reset\") ||\n !label\n ) {\n return null;\n }\n return {\n id: value.id,\n label,\n };\n}\n\nexport function parseAgentToolUiSurface(\n value: unknown\n): AgentToolUiSurface | null {\n if (!isRecord(value) || value.schemaVersion !== AGENT_TOOL_UI_SCHEMA_VERSION)\n return null;\n if (\n !hasOnlyKeys(value, [\n \"actions\",\n \"description\",\n \"fields\",\n \"id\",\n \"operationId\",\n \"requestId\",\n \"schemaVersion\",\n \"steps\",\n \"submitLabel\",\n \"title\",\n \"toolSlug\",\n \"values\",\n ])\n ) {\n return null;\n }\n const id = boundedString(value.id, 200);\n const title = boundedString(value.title, 200);\n const toolSlug = boundedString(value.toolSlug, 200);\n const description =\n value.description === undefined\n ? undefined\n : boundedString(value.description, 800);\n const operationId =\n value.operationId === undefined\n ? undefined\n : boundedString(value.operationId, 200);\n const requestId =\n value.requestId === undefined\n ? undefined\n : boundedString(value.requestId, 200);\n const submitLabel =\n value.submitLabel === undefined\n ? undefined\n : boundedString(value.submitLabel, 80);\n if (\n !id ||\n !title ||\n !toolSlug ||\n !Array.isArray(value.fields) ||\n value.fields.length < 1 ||\n value.fields.length > 32\n ) {\n return null;\n }\n const fields = value.fields.map(parseField);\n if (fields.some((field) => field === null)) return null;\n const steps =\n value.steps === undefined\n ? undefined\n : Array.isArray(value.steps) && value.steps.length <= 8\n ? value.steps.map(parseStep)\n : null;\n if (steps?.some((step) => step === null)) return null;\n const actions =\n value.actions === undefined\n ? undefined\n : Array.isArray(value.actions) && value.actions.length <= 8\n ? value.actions.map(parseAction)\n : null;\n if (actions?.some((action) => action === null)) return null;\n if (value.description !== undefined && !description) return null;\n if (value.operationId !== undefined && !operationId) return null;\n if (value.requestId !== undefined && !requestId) return null;\n if (value.submitLabel !== undefined && !submitLabel) return null;\n const values =\n value.values !== undefined && isRecord(value.values)\n ? value.values\n : undefined;\n if (value.values !== undefined) {\n if (!values || !Object.values(values).every((item) => isJsonValue(item)))\n return null;\n }\n return {\n schemaVersion: AGENT_TOOL_UI_SCHEMA_VERSION,\n id,\n title,\n toolSlug,\n fields: fields as AgentToolUiField[],\n ...(actions ? { actions: actions as AgentToolUiAction[] } : {}),\n ...(description ? { description } : {}),\n ...(operationId ? { operationId } : {}),\n ...(requestId ? { requestId } : {}),\n ...(submitLabel ? { submitLabel } : {}),\n ...(steps ? { steps: steps as AgentToolUiStep[] } : {}),\n ...(values\n ? { values: values as Record<string, AgentToolResultJsonValue> }\n : {}),\n };\n}\n\nfunction hasOnlyKeys(\n value: Record<string, unknown>,\n allowed: readonly string[]\n) {\n const allowedKeys = new Set(allowed);\n return Object.keys(value).every((key) => allowedKeys.has(key));\n}\n","import { parseAgentToolUiSurface, type AgentToolUiSurface } from \"./tool-ui\";\n\nexport type AgentToolResultJsonValue =\n | null\n | boolean\n | number\n | string\n | AgentToolResultJsonValue[]\n | { [key: string]: AgentToolResultJsonValue };\n\nexport type AgentToolResultEnvelope = {\n schemaVersion: \"webless.tool-result.v1\";\n output: AgentToolResultJsonValue;\n presentationKinds: string[];\n ui?: AgentToolUiSurface;\n};\n\nconst ENVELOPE_KEYS = new Set([\n \"schemaVersion\",\n \"output\",\n \"presentationKinds\",\n \"ui\",\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isJsonValue(\n value: unknown,\n seen: Set<object> = new Set()\n): value is AgentToolResultJsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\") return false;\n if (seen.has(value)) return false;\n seen.add(value);\n const valid = Array.isArray(value)\n ? value.every((item) => isJsonValue(item, seen))\n : Object.entries(value).every(\n ([key, item]) => typeof key === \"string\" && isJsonValue(item, seen)\n );\n seen.delete(value);\n return valid;\n}\n\nfunction decodeEnvelope(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return null;\n }\n}\n\nexport function parseAgentToolResultEnvelope(\n value: unknown\n): AgentToolResultEnvelope | null {\n const decoded = decodeEnvelope(value);\n if (!isRecord(decoded)) return null;\n const keys = Object.keys(decoded);\n if (\n keys.some((key) => !ENVELOPE_KEYS.has(key)) ||\n decoded.schemaVersion !== \"webless.tool-result.v1\" ||\n !isJsonValue(decoded.output) ||\n !Array.isArray(decoded.presentationKinds) ||\n decoded.presentationKinds.length < 1 ||\n decoded.presentationKinds.length > 16\n ) {\n return null;\n }\n const presentationKinds = decoded.presentationKinds.flatMap((kind) => {\n if (typeof kind !== \"string\") return [];\n const normalized = kind.trim();\n return normalized && normalized.length <= 128 ? [normalized] : [];\n });\n if (presentationKinds.length !== decoded.presentationKinds.length) {\n return null;\n }\n const ui =\n decoded.ui === undefined ? undefined : parseAgentToolUiSurface(decoded.ui);\n if (decoded.ui !== undefined && !ui) return null;\n return {\n schemaVersion: \"webless.tool-result.v1\",\n output: decoded.output,\n presentationKinds,\n ...(ui ? { ui } : {}),\n };\n}\n","import { parseAgentToolResultEnvelope } from \"./tool-result-envelope\";\nimport type { AgentToolResult, AgentWorkItem } from \"./types\";\n\nconst HUBSPOT_ACTION_LABELS: Readonly<Record<string, string>> = {\n HUBSPOT_LIST_CONTACTS: \"Checking your details\",\n HUBSPOT_CREATE_CONTACT: \"Saving your details\",\n HUBSPOT_UPDATE_CONTACT: \"Updating your details\",\n HUBSPOT_CREATE_COMPANY: \"Saving your company details\",\n};\n\nexport function connectedToolWork(action: {\n callId: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n}): AgentWorkItem | null {\n const slug =\n action.toolName === \"COMPOSIO_MULTI_EXECUTE_TOOL\"\n ? action.input.toolSlug\n : action.toolName;\n if (typeof slug !== \"string\") return null;\n const detail = HUBSPOT_ACTION_LABELS[slug];\n return detail\n ? {\n id: action.callId,\n kind: \"tool\",\n label: \"Contact details\",\n detail,\n state: \"active\",\n }\n : null;\n}\n\nexport function toolResultFailed(result: AgentToolResult): boolean {\n if (result.status !== \"completed\") return true;\n const output =\n parseAgentToolResultEnvelope(result.output)?.output ?? result.output;\n if (\n typeof output !== \"object\" ||\n output === null ||\n Array.isArray(output)\n )\n return false;\n return (\n (\"error\" in output && Boolean(output.error)) ||\n (\"providerError\" in output && Boolean(output.providerError))\n );\n}\n\nexport function completeConnectedToolWork(\n item: AgentWorkItem,\n result: AgentToolResult\n): AgentWorkItem {\n const failed = toolResultFailed(result);\n return {\n ...item,\n state: failed ? \"error\" : \"completed\",\n detail: failed ? \"Action could not be confirmed\" : \"Action completed\",\n };\n}\n","export type AgentSearchSource = {\n id: string;\n title: string;\n url?: string;\n};\n\nexport type AgentSearchReferences = {\n sources: AgentSearchSource[];\n suggestions?: string[];\n cta?: { label: string; url?: string };\n};\n\nexport type AgentSearchDiscoveryOutput = AgentSearchReferences & {\n answer: string;\n suggestions: string[];\n};\n\nfunction record(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 text(value: unknown, max = 500): value is string {\n return (\n typeof value === \"string\" &&\n value.trim().length > 0 &&\n value.trim().length <= max\n );\n}\n\n/** Search links are navigation destinations, never executable or credentialed URLs. */\nexport function safeSearchUrl(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n try {\n const url = new URL(value);\n return (url.protocol === \"https:\" || url.protocol === \"http:\") &&\n !url.username &&\n !url.password\n ? url.href\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Also used at the session-storage boundary; never trust persisted link data. */\nexport function parseAgentSearchReferences(\n value: unknown\n): AgentSearchReferences | null {\n const data = record(value);\n if (!data || !Array.isArray(data.sources) || data.sources.length > 20)\n return null;\n const sources: AgentSearchSource[] = [];\n for (const value of data.sources) {\n const source = record(value);\n if (\n !source ||\n Object.keys(source).some(\n (key) => ![\"id\", \"title\", \"url\"].includes(key)\n ) ||\n !text(source.id, Infinity) ||\n !text(source.title) ||\n (source.url !== undefined && typeof source.url !== \"string\")\n )\n return null;\n const url = safeSearchUrl(source.url);\n sources.push({\n id: source.id.trim(),\n title: source.title.trim(),\n ...(url ? { url } : {}),\n });\n }\n let cta: AgentSearchReferences[\"cta\"];\n if (data.cta !== undefined) {\n const action = record(data.cta);\n if (\n !action ||\n Object.keys(action).some((key) => ![\"label\", \"url\"].includes(key)) ||\n !text(action.label) ||\n (action.url !== undefined && typeof action.url !== \"string\")\n )\n return null;\n const url = safeSearchUrl(action.url);\n cta = { label: action.label.trim(), ...(url ? { url } : {}) };\n }\n const suggestions =\n Array.isArray(data.suggestions) &&\n data.suggestions.length <= 8 &&\n data.suggestions.every((item) => text(item))\n ? [...new Set(data.suggestions.map((item: string) => item.trim()))]\n : undefined;\n return {\n sources,\n ...(cta ? { cta } : {}),\n ...(suggestions ? { suggestions } : {}),\n };\n}\n\n/** Mirrors the runtime's search_discovery contract without adding a runtime dependency. */\nexport function parseAgentSearchDiscoveryOutput(\n value: unknown\n): AgentSearchDiscoveryOutput | null {\n let decoded: unknown = value;\n if (typeof value === \"string\") {\n try {\n decoded = JSON.parse(value) as unknown;\n } catch {\n return null;\n }\n }\n const data = record(decoded);\n if (\n !data ||\n Object.keys(data).some(\n (key) => ![\"answer\", \"sources\", \"cta\", \"suggestions\"].includes(key)\n ) ||\n !text(data.answer, 50_000) ||\n !Array.isArray(data.suggestions) ||\n data.suggestions.length > 8 ||\n !data.suggestions.every((item) => text(item))\n )\n return null;\n const references = parseAgentSearchReferences(data);\n return references\n ? {\n ...references,\n answer: data.answer.trim(),\n suggestions: data.suggestions.map((item: string) => item.trim()),\n }\n : null;\n}\n","import type { ConversationMessage } from \"../types/conversation\";\n\nexport type ComposerFormFieldKind = \"text\" | \"email\" | \"tel\" | \"textarea\";\n\nexport const COMPOSER_FORM_SKIP_DISMISSAL =\n \"I'd like to keep chatting without sharing the requested details for now. Please don't ask for them again unless I choose to proceed with something that needs them.\";\n\nexport function composerFormSkipRuntimeText(userMessage: string) {\n const trimmed = userMessage.trim();\n return `${COMPOSER_FORM_SKIP_DISMISSAL}\\n\\n${trimmed}`;\n}\n\nexport function visitorMessageDisplayText(message: ConversationMessage) {\n if (message.role !== \"visitor\") return message.text;\n const text = message.text.trim();\n if (!text) return message.text;\n if (text.startsWith(COMPOSER_FORM_SKIP_DISMISSAL)) {\n const afterDismissal = text\n .slice(COMPOSER_FORM_SKIP_DISMISSAL.length)\n .trim()\n .replace(/^\\n+/, \"\")\n .trim();\n if (afterDismissal) return afterDismissal;\n }\n const runtime = message.runtimeText?.trim();\n if (runtime && text === runtime && runtime.includes(COMPOSER_FORM_SKIP_DISMISSAL)) {\n const afterDismissal = runtime\n .slice(\n runtime.indexOf(COMPOSER_FORM_SKIP_DISMISSAL) +\n COMPOSER_FORM_SKIP_DISMISSAL.length,\n )\n .trim()\n .replace(/^\\n+/, \"\")\n .trim();\n if (afterDismissal) return afterDismissal;\n }\n return message.text;\n}\n\nexport type ComposerFormField = {\n id: string;\n kind: ComposerFormFieldKind;\n label: string;\n placeholder: string;\n required: boolean;\n autocomplete?: string;\n};\n\nexport type ComposerForm = {\n id: string;\n fields: ComposerFormField[];\n};\n\nexport type VisitorFormCard = {\n type: \"visitor_form\";\n fields: ComposerFormField[];\n};\n\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst MIN_FORM_FIELDS = 2;\nconst MAX_FORM_FIELDS = 5;\n\nconst FIELD_LIBRARY: Array<\n ComposerFormField & { patterns: RegExp[]; exclude?: RegExp }\n> = [\n {\n id: \"email\",\n kind: \"email\",\n label: \"Email\",\n placeholder: \"email@example.com\",\n required: true,\n autocomplete: \"email\",\n patterns: [/\\be-?mails?\\b/i],\n },\n {\n id: \"name\",\n kind: \"text\",\n label: \"Name\",\n placeholder: \"Your name\",\n required: true,\n autocomplete: \"name\",\n patterns: [/\\b((full|first|last)\\s+)?names?\\b/i],\n exclude: /\\bcompany\\s+names?\\b/i,\n },\n {\n id: \"phone\",\n kind: \"tel\",\n label: \"Phone\",\n placeholder: \"+1 555 0100\",\n required: true,\n autocomplete: \"tel\",\n patterns: [/\\b(phone|mobile|cell)\\b/i],\n },\n {\n id: \"company\",\n kind: \"text\",\n label: \"Company\",\n placeholder: \"Company name\",\n required: true,\n autocomplete: \"organization\",\n patterns: [/\\bcompan(y|ies)\\b/i],\n },\n {\n id: \"message\",\n kind: \"textarea\",\n label: \"Message\",\n placeholder: \"Message…\",\n required: true,\n patterns: [/\\b(your message|a message|the message|inquiry|enquiry)\\b/i],\n exclude: /\\bin one message\\b/i,\n },\n];\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) {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction isFieldKind(value: string): value is ComposerFormFieldKind {\n return value === \"text\" || value === \"email\" || value === \"tel\" || value === \"textarea\";\n}\n\nexport function parseVisitorFormFields(value: unknown): ComposerFormField[] {\n if (!Array.isArray(value)) return [];\n const fields: ComposerFormField[] = [];\n const seen = new Set<string>();\n for (const item of value) {\n const record = asRecord(item);\n const id = asString(record?.id).toLowerCase().replace(/[^a-z0-9_-]/g, \"\");\n const kind = asString(record?.kind);\n if (!record || !id || seen.has(id) || !isFieldKind(kind)) continue;\n seen.add(id);\n const label = asString(record.label) || id;\n fields.push({\n id,\n kind,\n label,\n placeholder: asString(record.placeholder) || label,\n required: record.required !== false,\n ...(asString(record.autocomplete)\n ? { autocomplete: asString(record.autocomplete) }\n : {}),\n });\n if (fields.length >= MAX_FORM_FIELDS) break;\n }\n return fields;\n}\n\nexport function readComposerControlValue(event: {\n target: EventTarget | null;\n currentTarget?: EventTarget | null;\n}) {\n const node = event.target ?? event.currentTarget ?? null;\n if (\n node &&\n typeof node === \"object\" &&\n \"value\" in node &&\n typeof node.value === \"string\"\n ) {\n return node.value;\n }\n return \"\";\n}\n\nexport function isValidComposerFieldValue(\n field: ComposerFormField,\n value: string,\n) {\n const trimmed = value.trim();\n if (!trimmed) return !field.required;\n if (field.kind === \"email\") return EMAIL_PATTERN.test(trimmed);\n if (field.kind === \"tel\") return trimmed.replace(/\\D/g, \"\").length >= 7;\n return trimmed.length > 0;\n}\n\nexport function isComposerFormComplete(\n form: ComposerForm,\n values: Record<string, string>,\n) {\n return form.fields.every((field) =>\n isValidComposerFieldValue(field, values[field.id] ?? \"\"),\n );\n}\n\nexport function formatComposerFormMessage(\n form: ComposerForm,\n values: Record<string, string>,\n) {\n return form.fields\n .map((field) => {\n const value = (values[field.id] ?? \"\").trim();\n return value ? `${field.label}: ${value}` : \"\";\n })\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction looksLikeFieldCollection(text: string) {\n return (\n /\\b(please|need|send|share|enter|provide|add|collect|what|which|use)\\b/i.test(\n text,\n ) ||\n /:\\s*$/m.test(text) ||\n /^[-*•]\\s+/m.test(text)\n );\n}\n\nfunction looksLikeBookingCopy(text: string) {\n return /book(ing)? (card|a demo|this time)|pick a (date|time)|available (times|slots)|calendly/i.test(\n text,\n );\n}\n\nfunction echoedLabeledFieldIds(text: string) {\n const ids = new Set<string>();\n if (/\\bname\\s*:\\s+\\S+/i.test(text)) ids.add(\"name\");\n if (/\\be-?mail\\s*:\\s+\\S+/i.test(text)) ids.add(\"email\");\n if (/\\bphone\\s*:\\s+\\S+/i.test(text)) ids.add(\"phone\");\n if (/\\bcompany\\s*:\\s+\\S+/i.test(text)) ids.add(\"company\");\n return ids;\n}\n\nfunction matchLibraryFields(text: string): ComposerFormField[] {\n return FIELD_LIBRARY.flatMap((field) => {\n if (field.exclude?.test(text)) {\n const leftover = text.replace(field.exclude, \" \");\n if (!field.patterns.some((pattern) => pattern.test(leftover))) return [];\n } else if (!field.patterns.some((pattern) => pattern.test(text))) {\n return [];\n }\n const { patterns: _patterns, exclude: _exclude, ...next } = field;\n return [next];\n }).slice(0, MAX_FORM_FIELDS);\n}\n\nfunction looksLikeCompletedActionRecap(text: string) {\n const confirmingCreate = /\\bshould i create this\\b/i.test(text);\n const echoingFilledFields =\n /\\b(?:name|email|phone|company)\\s*:\\s+\\S+/i.test(text) &&\n /[^\\s@]+@[^\\s@]+\\.[^\\s@]+/i.test(text);\n if (echoingFilledFields) {\n if (looksLikeFieldCollection(text)) {\n const echoed = echoedLabeledFieldIds(text);\n if (matchLibraryFields(text).some((field) => !echoed.has(field.id))) {\n return false;\n }\n }\n return true;\n }\n return confirmingCreate && !looksLikeFieldCollection(text);\n}\n\nexport function inferComposerForm(text: string): ComposerForm | null {\n const cleaned = text.trim();\n if (\n !cleaned ||\n looksLikeBookingCopy(cleaned) ||\n looksLikeCompletedActionRecap(cleaned) ||\n !looksLikeFieldCollection(cleaned)\n ) {\n return null;\n }\n const fields = matchLibraryFields(cleaned);\n if (fields.length < MIN_FORM_FIELDS) return null;\n return {\n id: `inferred:${fields.map((field) => field.id).join(\"+\")}`,\n fields,\n };\n}\n\nexport function resolveComposerForm(input: {\n agentText: string;\n cards?: Array<{ type: string; fields?: ComposerFormField[] }>;\n hasBookingOffer?: boolean;\n hasPendingConfirmation?: boolean;\n enabled?: boolean;\n}): ComposerForm | null {\n if (\n input.enabled === false ||\n input.hasBookingOffer ||\n input.hasPendingConfirmation\n ) {\n return null;\n }\n const text = input.agentText.trim();\n if (!text) return null;\n const card = input.cards?.find((item) => item.type === \"visitor_form\");\n if (card?.fields && card.fields.length >= MIN_FORM_FIELDS) {\n return {\n id: `card:${card.fields.map((field) => field.id).join(\"+\")}`,\n fields: card.fields.slice(0, MAX_FORM_FIELDS),\n };\n }\n return inferComposerForm(text);\n}\n","import { parseVisitorFormFields, type VisitorFormCard } from \"./composer-form\";\n\nexport 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 preferBookingOffer(\n current: BookingOffer | null,\n next: BookingOffer\n) {\n if (!current) return next;\n if (next.slots.length !== current.slots.length) {\n return next.slots.length > current.slots.length ? next : current;\n }\n if (next.eventTypes.length !== current.eventTypes.length) {\n return next.eventTypes.length > current.eventTypes.length ? next : current;\n }\n return next;\n}\n\nexport function looksLikeBookingReady(text: string) {\n return /demo option|options are ready|pick a (date|time)|available (times|slots)|book(ing)? (card|the demo)|\\bschedule\\b/i.test(\n text\n );\n}\n\nexport function bookingOfferIdentityKey(offer: BookingOffer) {\n const eventTypes = offer.eventTypes\n .map(\n (item) =>\n `${item.uri}:${item.duration ?? \"\"}:${item.locationKind ?? \"\"}:${\n item.location ?? \"\"\n }`\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 =\n | BookingOffer\n | BookingConfirmed\n | BookingCanceled\n | VisitorFormCard;\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 if (record.visitor_booking && asString(record.type) !== \"booking_confirmed\") {\n const nested = parseToolCard(record.visitor_booking);\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 || !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 (eventTypes.length === 0 && 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 if (type === \"visitor_form\") {\n const fields = parseVisitorFormFields(record.fields);\n if (fields.length < 2) return null;\n return { type: \"visitor_form\", fields };\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(\n output: unknown\n): BookingOffer | null {\n const card = bookingCardFromActionOutput(output);\n return card?.type === \"booking_offer\" ? card : null;\n}\n\nexport function bookingCardFromActionOutput(output: unknown): ToolCard | null {\n const record = asRecord(output);\n const data = asRecord(record?.output) ?? asRecord(record?.data) ?? record;\n return parseToolCard(data);\n}\n\nexport function ensureBookingOfferText(\n text: string,\n offer: BookingOffer | null\n) {\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\nconst BOOKING_CARD_FALLBACK = \"Pick a date and time that works for you.\";\n\nexport function looksLikeBookingAvailabilityDump(text: string) {\n const cleaned = text.trim();\n if (!cleaned) return false;\n const isoCount = (cleaned.match(/\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}/g) ?? [])\n .length;\n const utcCount = (cleaned.match(/\\bUTC\\b/g) ?? []).length;\n return (\n isoCount >= 2 ||\n utcCount >= 2 ||\n /api\\.calendly\\.com|calendly\\.com\\//i.test(cleaned) ||\n /webless-tool-card/i.test(cleaned)\n );\n}\n\nexport function sanitizeBookingOfferCopy(text: string) {\n const cleaned = hideToolCardFences(text);\n if (!cleaned || looksLikeBookingAvailabilityDump(cleaned)) {\n return BOOKING_CARD_FALLBACK;\n }\n return cleaned;\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) =>\n !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 \"Execute CALENDLY_POST_INVITEE in this turn with the fields below.\",\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\n ? [`- invitee email: ${booking.inviteeEmail}`]\n : []),\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 { toolResultFailed } from \"../../runtime/connected-tool-work\";\nimport {\n parseAgentSearchDiscoveryOutput,\n type AgentSearchReferences,\n} from \"../../runtime/search-discovery\";\nimport type { AgentToolResult } from \"../../runtime/types\";\nimport {\n parseAgentToolResultEnvelope,\n type AgentToolResultEnvelope,\n} from \"../../runtime/tool-result-envelope\";\nimport type { AgentToolUiSurface } from \"../../runtime/tool-ui\";\nimport { bookingCardFromActionOutput, type ToolCard } from \"./tool-card\";\n\nexport type VisitorToolResultLink = {\n label: string;\n href: string;\n};\n\nexport type VisitorToolResultDetail = {\n label: string;\n value: string;\n};\n\nexport type VisitorToolResultPresentation = {\n id: string;\n toolName: string;\n status: AgentToolResult[\"status\"];\n kind: \"summary\";\n title: string;\n description?: string;\n details?: readonly VisitorToolResultDetail[];\n links?: readonly VisitorToolResultLink[];\n};\n\nexport type VisitorEntityResultPresentation = {\n id: string;\n toolName: string;\n status: AgentToolResult[\"status\"];\n kind: \"entity\";\n title: string;\n description?: string;\n details?: readonly VisitorToolResultDetail[];\n links?: readonly VisitorToolResultLink[];\n};\n\nexport type VisitorCollectionItemPresentation = {\n title: string;\n description?: string;\n details?: readonly VisitorToolResultDetail[];\n href?: string;\n};\n\nexport type VisitorCollectionResultPresentation = {\n id: string;\n toolName: string;\n status: AgentToolResult[\"status\"];\n kind: \"collection\";\n title: string;\n items: readonly VisitorCollectionItemPresentation[];\n};\n\nexport type VisitorSignatureResultPresentation = {\n id: string;\n toolName: string;\n status: AgentToolResult[\"status\"];\n kind: \"signature\";\n title: string;\n description?: string;\n statusLabel?: string;\n links?: readonly VisitorToolResultLink[];\n};\n\nexport type VisitorBookingResultPresentation = {\n id: string;\n toolName: string;\n status: AgentToolResult[\"status\"];\n kind: \"booking\";\n card: ToolCard;\n};\n\nexport type VisitorToolInputResultPresentation = {\n id: string;\n toolName: string;\n status: AgentToolResult[\"status\"];\n kind: \"input\";\n surface: AgentToolUiSurface;\n};\n\nexport type VisitorHiddenToolResultPresentation = {\n id: string;\n toolName: string;\n status: AgentToolResult[\"status\"];\n kind: \"hidden\";\n};\n\nexport type VisitorSearchResultPresentation = AgentSearchReferences & {\n id: string;\n toolName: \"search_discovery\";\n status: \"completed\";\n kind: \"search\";\n};\n\nexport type ResolvedVisitorToolResultPresentation =\n | VisitorSearchResultPresentation\n | VisitorToolResultPresentation\n | VisitorEntityResultPresentation\n | VisitorCollectionResultPresentation\n | VisitorSignatureResultPresentation\n | VisitorBookingResultPresentation\n | VisitorToolInputResultPresentation\n | VisitorHiddenToolResultPresentation;\n\nexport type VisitorToolResultPresenterOutput =\n | (Omit<VisitorToolResultPresentation, \"id\" | \"toolName\" | \"status\"> & {\n status?: AgentToolResult[\"status\"];\n })\n | Omit<VisitorEntityResultPresentation, \"id\" | \"toolName\" | \"status\">\n | Omit<VisitorCollectionResultPresentation, \"id\" | \"toolName\" | \"status\">\n | Omit<VisitorSignatureResultPresentation, \"id\" | \"toolName\" | \"status\">\n | {\n kind: \"booking\";\n card: ToolCard;\n };\n\nexport type VisitorToolResultPresenter = {\n kind: string;\n present: (input: {\n envelope: AgentToolResultEnvelope;\n presentationKind: string;\n result: AgentToolResult;\n }) => VisitorToolResultPresenterOutput | null;\n};\n\nexport type VisitorToolResultRegistry = readonly VisitorToolResultPresenter[];\n\nconst MAX_TEXT_LENGTH = 240;\nconst MAX_DETAILS = 6;\nconst MAX_LINKS = 4;\nconst MAX_COLLECTION_ITEMS = 8;\nconst INTERNAL_FACT_LABEL =\n /^(hs\\b|createdate|created at|updatedate|updated at|firstname|first name|lastname|last name|vid|objectid|object id|all contact)/iu;\n\nfunction safeText(value: unknown) {\n if (typeof value !== \"string\") return \"\";\n return value.trim().slice(0, MAX_TEXT_LENGTH);\n}\n\nfunction safeHref(value: unknown) {\n const text = safeText(value);\n if (!text) return \"\";\n try {\n const url = new URL(text);\n return url.protocol === \"https:\" ? url.toString() : \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction fallbackTitle(result: AgentToolResult) {\n if (result.status === \"failed\") return \"Couldn’t complete this action\";\n if (result.status === \"rejected\") return \"Action not approved\";\n return \"Action completed\";\n}\n\nfunction bookingPresenter(kind: string): VisitorToolResultPresenter {\n return {\n kind,\n present: ({ envelope }) => {\n const card = bookingCardFromActionOutput(envelope.output);\n return card && card.type === kind ? { kind: \"booking\", card } : null;\n },\n };\n}\n\nfunction providerErrorPresenter(): VisitorToolResultPresenter {\n return {\n kind: \"provider_error\",\n present: ({ envelope }) => {\n const output = asRecord(envelope.output);\n const providerError = asRecord(output?.providerError);\n const message = safeText(providerError?.message);\n const action = safeText(providerError?.action);\n if (!message || !action) return null;\n const resourceLabels = Array.isArray(providerError?.resourceLabels)\n ? providerError.resourceLabels\n .map(safeText)\n .filter(Boolean)\n .slice(0, MAX_DETAILS)\n : [];\n return {\n kind: \"summary\",\n status: \"failed\",\n title: message,\n description: action,\n ...(resourceLabels.length\n ? {\n details: [\n { label: \"Affected\", value: resourceLabels.join(\", \") },\n ],\n }\n : {}),\n };\n },\n };\n}\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 parseFacts(value: unknown) {\n if (!Array.isArray(value)) return [];\n return value.flatMap((item) => {\n const fact = asRecord(item);\n const label = safeText(fact?.label);\n const factValue = safeText(fact?.value);\n if (!label || !factValue) return [];\n if (INTERNAL_FACT_LABEL.test(label)) return [];\n return [{ label, value: factValue }];\n });\n}\n\nfunction parseLinks(output: Record<string, unknown>, defaultLabel: string) {\n const href = safeHref(output.href);\n const linkLabel = safeText(output.linkLabel) || defaultLabel;\n return href ? [{ label: linkLabel, href }] : [];\n}\n\nfunction entityResultPresenter(): VisitorToolResultPresenter {\n return {\n kind: \"entity_result\",\n present: ({ envelope, result }) => {\n const output = asRecord(envelope.output);\n if (!output) return null;\n const title = safeText(output.title) || fallbackTitle(result);\n const description = safeText(output.description);\n const facts = parseFacts(output.facts)\n .filter((fact) => fact.value !== description && fact.value !== title)\n .slice(0, MAX_DETAILS);\n return {\n kind: \"entity\",\n title,\n ...(description && description !== title ? { description } : {}),\n ...(facts.length ? { details: facts } : {}),\n ...(parseLinks(output, \"Open record\").length\n ? { links: parseLinks(output, \"Open record\") }\n : {}),\n };\n },\n };\n}\n\nfunction collectionResultPresenter(): VisitorToolResultPresenter {\n return {\n kind: \"collection\",\n present: ({ envelope, result }) => {\n const output = asRecord(envelope.output);\n if (!output) return null;\n const title =\n safeText(output.title) || fallbackTitleFromKind(\"collection\");\n const items = Array.isArray(output.items)\n ? output.items.slice(0, MAX_COLLECTION_ITEMS).flatMap((item) => {\n const entry = asRecord(item);\n if (!entry) return [];\n const itemTitle = safeText(entry.title);\n if (!itemTitle) return [];\n const description = safeText(entry.description);\n const details = parseFacts(entry.facts).slice(0, MAX_DETAILS);\n const href = safeHref(entry.href);\n return [\n {\n title: itemTitle,\n ...(description ? { description } : {}),\n ...(details.length ? { details } : {}),\n ...(href ? { href } : {}),\n },\n ];\n })\n : [];\n return {\n kind: \"collection\",\n title,\n items,\n };\n },\n };\n}\n\nfunction signatureResultPresenter(): VisitorToolResultPresenter {\n return {\n kind: \"signature\",\n present: ({ envelope, result }) => {\n const output = asRecord(envelope.output);\n if (!output) return null;\n const title =\n safeText(output.title) || fallbackTitleFromKind(\"signature\");\n const description = safeText(output.description);\n const statusLabel = safeText(output.status);\n return {\n kind: \"signature\",\n title,\n ...(description ? { description } : {}),\n ...(statusLabel ? { statusLabel } : {}),\n ...(parseLinks(output, \"Sign now\").length\n ? { links: parseLinks(output, \"Sign now\") }\n : {}),\n };\n },\n };\n}\n\nfunction resultCardPresenter(kind: string): VisitorToolResultPresenter {\n return {\n kind,\n present: ({ envelope, result }) => {\n const output = asRecord(envelope.output);\n if (!output) return null;\n const title = safeText(output.title) || fallbackTitleFromKind(kind);\n const description = safeText(output.description);\n const facts = parseFacts(output.facts).slice(0, MAX_DETAILS);\n return {\n kind: \"summary\",\n title,\n ...(description && description !== title ? { description } : {}),\n ...(facts.length ? { details: facts } : {}),\n ...(parseLinks(output, \"Open\").length\n ? { links: parseLinks(output, \"Open\") }\n : {}),\n };\n },\n };\n}\n\nfunction fallbackTitleFromKind(kind: string) {\n if (kind === \"document\") return \"Document ready\";\n if (kind === \"signature\") return \"Ready to sign\";\n if (kind === \"payment\") return \"Payment link\";\n if (kind === \"collection\") return \"Results\";\n if (kind === \"confirmation_result\") return \"Confirmed\";\n return \"Saved\";\n}\n\nexport const builtInVisitorToolResultRegistry: VisitorToolResultRegistry = [\n providerErrorPresenter(),\n bookingPresenter(\"booking_offer\"),\n bookingPresenter(\"booking_confirmed\"),\n bookingPresenter(\"booking_canceled\"),\n entityResultPresenter(),\n collectionResultPresenter(),\n signatureResultPresenter(),\n resultCardPresenter(\"document\"),\n resultCardPresenter(\"payment\"),\n resultCardPresenter(\"confirmation_result\"),\n];\n\nfunction resolvePresenterOutput(\n result: AgentToolResult,\n envelope: AgentToolResultEnvelope,\n registry: VisitorToolResultRegistry\n) {\n const presenters = [...registry, ...builtInVisitorToolResultRegistry];\n for (const presentationKind of envelope.presentationKinds) {\n const presenter = presenters.find(\n (candidate) => candidate.kind === presentationKind\n );\n if (!presenter) continue;\n try {\n const presented = presenter.present({\n envelope,\n presentationKind,\n result,\n });\n if (presented) return presented;\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction finalizeSummaryPresentation(\n result: AgentToolResult,\n proposed: Extract<VisitorToolResultPresenterOutput, { kind: \"summary\" }>\n): VisitorToolResultPresentation {\n const title = safeText(proposed.title) || fallbackTitle(result);\n const description = safeText(proposed.description);\n const details = proposed.details?.slice(0, MAX_DETAILS).flatMap((detail) => {\n const label = safeText(detail.label);\n const value = safeText(detail.value);\n if (!label || !value) return [];\n if (INTERNAL_FACT_LABEL.test(label)) return [];\n if (value === title || value === description) return [];\n return [{ label, value }];\n });\n const links = proposed.links?.slice(0, MAX_LINKS).flatMap((link) => {\n const label = safeText(link.label);\n const href = safeHref(link.href);\n return label && href ? [{ label, href }] : [];\n });\n\n return {\n id: result.callId,\n toolName: result.toolName,\n status: proposed.status ?? result.status,\n kind: \"summary\",\n title,\n ...(description && description !== title ? { description } : {}),\n ...(details?.length ? { details } : {}),\n ...(links?.length ? { links } : {}),\n };\n}\n\nexport function presentVisitorToolResult(\n result: AgentToolResult,\n registry: VisitorToolResultRegistry = []\n): ResolvedVisitorToolResultPresentation {\n if (result.toolName === \"request_location\") {\n return { id: result.callId, toolName: result.toolName, status: result.status, kind: \"hidden\" };\n }\n if (result.status === \"completed\" && toolResultFailed(result)) {\n result = { ...result, status: \"failed\" };\n }\n // The built-in search tool returns its own typed output rather than a UI envelope.\n if (result.toolName === \"search_discovery\" && result.status === \"completed\") {\n const envelope = parseAgentToolResultEnvelope(result.output);\n const search = parseAgentSearchDiscoveryOutput(\n envelope?.output ?? result.output\n );\n if (search) {\n return {\n id: result.callId,\n toolName: \"search_discovery\",\n status: \"completed\",\n kind: \"search\",\n sources: search.sources,\n suggestions: search.suggestions,\n ...(search.cta ? { cta: search.cta } : {}),\n };\n }\n }\n const envelope =\n parseAgentToolResultEnvelope(result.output) ??\n providerErrorEnvelope(result.output) ??\n legacyBookingEnvelope(result.output);\n const proposed = envelope\n ? resolvePresenterOutput(result, envelope, registry)\n : null;\n if (proposed?.kind === \"booking\") {\n return {\n id: result.callId,\n toolName: result.toolName,\n status: result.status,\n kind: \"booking\",\n card: proposed.card,\n };\n }\n if (envelope?.ui && envelope.presentationKinds.includes(\"tool_input\")) {\n return {\n id: result.callId,\n toolName: result.toolName,\n status: result.status,\n kind: \"input\",\n surface: envelope.ui,\n };\n }\n if (!proposed || (result.status !== \"completed\" && proposed.kind !== \"summary\")) {\n if (result.status === \"failed\" || result.status === \"rejected\") {\n return {\n id: result.callId,\n toolName: result.toolName,\n status: result.status,\n kind: \"summary\",\n title: fallbackTitle(result),\n };\n }\n return {\n id: result.callId,\n toolName: result.toolName,\n status: result.status,\n kind: \"hidden\",\n };\n }\n\n if (proposed.kind === \"entity\") {\n return {\n id: result.callId,\n toolName: result.toolName,\n status: result.status,\n ...proposed,\n };\n }\n if (proposed.kind === \"collection\") {\n return {\n id: result.callId,\n toolName: result.toolName,\n status: result.status,\n ...proposed,\n };\n }\n if (proposed.kind === \"signature\") {\n return {\n id: result.callId,\n toolName: result.toolName,\n status: result.status,\n ...proposed,\n };\n }\n\n return finalizeSummaryPresentation(result, proposed);\n}\n\nfunction providerErrorEnvelope(\n output: unknown\n): AgentToolResultEnvelope | null {\n const record = asRecord(output);\n const providerError = asRecord(record?.providerError);\n const message = safeText(providerError?.message);\n const action = safeText(providerError?.action);\n if (!message || !action) return null;\n const resourceLabels = Array.isArray(providerError?.resourceLabels)\n ? providerError.resourceLabels\n .map(safeText)\n .filter(Boolean)\n .slice(0, MAX_DETAILS)\n : [];\n return {\n schemaVersion: \"webless.tool-result.v1\",\n output: {\n providerError: {\n action,\n message,\n ...(resourceLabels.length ? { resourceLabels } : {}),\n },\n },\n presentationKinds: [\"provider_error\"],\n };\n}\n\nfunction legacyBookingEnvelope(\n output: unknown\n): AgentToolResultEnvelope | null {\n const card = bookingCardFromActionOutput(output);\n return card\n ? {\n schemaVersion: \"webless.tool-result.v1\",\n output: card,\n presentationKinds: [card.type],\n }\n : null;\n}\n","import { ClientError } from \"eve/client\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { AgentClient } from \"../../runtime/types\";\nimport type {\n AgentHandoffEvent,\n AgentHandoffPage,\n} from \"../../runtime/handoff\";\n\ntype PendingOperation =\n | { type: \"start\"; operationId: string }\n | {\n type: \"message\";\n operationId: string;\n handoffId: string;\n epoch: number;\n message: string;\n }\n | { type: \"return\"; operationId: string; handoffId: string; epoch: number };\n\nexport function useAgentHandoff(options: {\n enabled: boolean;\n client: AgentClient;\n sessionId: string | undefined;\n onEvents: (events: AgentHandoffEvent[]) => void;\n onOwnership: () => void;\n}) {\n const [page, setPage] = useState<AgentHandoffPage | null>(null);\n const [busy, setBusy] = useState(false);\n const [rejected, setRejected] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const callbacks = useRef(options);\n callbacks.current = options;\n const pending = useRef<PendingOperation | null>(null);\n const inFlight = useRef<AbortController | null>(null);\n const pageRef = useRef<AgentHandoffPage | null>(null);\n const refreshRef = useRef<(() => Promise<void>) | null>(null);\n const generation = useRef(0);\n\n useEffect(() => {\n const token = ++generation.current;\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout> | undefined;\n let reading: Promise<void> | null = null;\n let cursor = 0;\n pageRef.current = null;\n pending.current = null;\n inFlight.current?.abort();\n inFlight.current = null;\n setRejected(false);\n setPage(null);\n setError(null);\n setBusy(false);\n if (!options.enabled || !options.sessionId) return;\n const active = () =>\n !controller.signal.aborted && generation.current === token;\n const refresh = () => {\n reading ??= (async () => {\n do {\n const next = await options.client.handoff.read({\n after: cursor,\n signal: AbortSignal.any([\n controller.signal,\n AbortSignal.timeout(15_000),\n ]),\n });\n if (!active()) return;\n callbacks.current.onEvents(next.events);\n if (next.status !== \"ai\") callbacks.current.onOwnership();\n cursor = next.cursor;\n pageRef.current = next;\n setPage(next);\n setRejected(false);\n if (!pending.current) setError(null);\n if (!next.hasMore) break;\n } while (active());\n })().finally(() => {\n reading = null;\n });\n return reading;\n };\n refreshRef.current = refresh;\n const poll = async () => {\n try {\n await refresh();\n } catch (cause) {\n if (active()) {\n const denied = cause instanceof ClientError && cause.status === 403;\n setRejected(denied);\n setError(\n denied\n ? \"This preview has changed. Restart the preview chat to test the current version.\"\n : \"Reconnecting to your conversation…\",\n );\n }\n } finally {\n if (active()) timer = setTimeout(() => void poll(), 1500);\n }\n };\n void poll();\n return () => {\n controller.abort();\n inFlight.current?.abort();\n clearTimeout(timer);\n refreshRef.current = null;\n };\n }, [options.client, options.enabled, options.sessionId]);\n\n async function execute(operation: PendingOperation) {\n if (inFlight.current) return;\n const controller = new AbortController();\n inFlight.current = controller;\n const signal = AbortSignal.any([\n controller.signal,\n AbortSignal.timeout(15_000),\n ]);\n const token = generation.current;\n pending.current = operation;\n setBusy(true);\n setError(null);\n try {\n if (operation.type === \"start\")\n await options.client.handoff.start(operation.operationId, signal);\n else if (operation.type === \"message\") {\n const { type: _, ...command } = operation;\n await options.client.handoff.send(command, signal);\n } else {\n const { type: _, ...command } = operation;\n await options.client.handoff.returnToAI(command, signal);\n }\n if (token !== generation.current) return;\n pending.current = null;\n await refreshRef.current?.();\n } catch {\n if (token === generation.current)\n setError(\n \"Could not confirm delivery. Retry to check the same request.\",\n );\n } finally {\n if (inFlight.current === controller) inFlight.current = null;\n if (token === generation.current) setBusy(false);\n }\n }\n\n const binding = () => {\n const current = pageRef.current;\n if (!current?.handoffId) throw new Error(\"No active human conversation.\");\n return { handoffId: current.handoffId, epoch: current.epoch };\n };\n return {\n page,\n busy,\n error,\n hasPending: Boolean(pending.current),\n canReset:\n !busy &&\n !pending.current &&\n (rejected ||\n page?.status === \"ai\" ||\n page?.status === \"failed\" ||\n !options.sessionId),\n blocksAI:\n Boolean(options.enabled && options.sessionId && !page) ||\n busy ||\n Boolean(pending.current) ||\n Boolean(page && page.status !== \"ai\"),\n start: () =>\n execute(\n pending.current ?? { type: \"start\", operationId: crypto.randomUUID() },\n ),\n send: (message: string) => {\n if (pending.current)\n throw new Error(\n \"Retry the pending request before sending another message.\",\n );\n return execute({\n type: \"message\",\n operationId: crypto.randomUUID(),\n ...binding(),\n message,\n });\n },\n returnToAI: () =>\n execute(\n pending.current ?? {\n type: \"return\",\n operationId: crypto.randomUUID(),\n ...binding(),\n },\n ),\n retry: async () => {\n if (pending.current) return execute(pending.current);\n try {\n await refreshRef.current?.();\n } catch {\n setError(\"Reconnecting to your conversation…\");\n }\n },\n };\n}\n","import { useAgentHandoff } from \"./useAgentHandoff\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createAgentClient } from \"../../runtime/client\";\nimport { formatAgentError } from \"../../runtime/errors\";\nimport type {\n AgentIndexVersion,\n AgentInputRequest,\n AgentInputResponse,\n AgentToolResult,\n AgentWorkItem,\n} from \"../../runtime/types\";\nimport type { AgentToolResultJsonValue } from \"../../runtime/tool-result-envelope\";\nimport {\n buildAgentStorageKeyPrefix,\n getOrCreateVisitorSessionId,\n} from \"../../runtime/session-store\";\nimport {\n ensureBookingOfferText,\n extractToolCards,\n hideToolCardFences,\n preferBookingOffer,\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\";\nimport {\n presentVisitorToolResult,\n type VisitorToolResultRegistry,\n} from \"../lib/tool-result\";\nimport {\n appendAgentTurnMessage,\n appendChatCollectiblePrompts,\n chatInputResponseForText,\n isChatCollectibleInputRequest,\n shouldRenderVisitorInputCard,\n} from \"../lib/visitor-input\";\nimport {\n formatAgentStructuredToolInput,\n type AgentToolUiSurface,\n} from \"../../runtime/tool-ui\";\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 pendingInputs: [],\n toolResults: [],\n error: null,\n declinedComposerFormIds: [],\n };\n}\n\nfunction stateFromConversation(\n conversation: PersistedAgentConversation | null,\n initialState: AgentRailState\n): AgentRailState {\n if (!conversation || conversation.messages.length === 0) return initialState;\n const pendingInputs = conversation.pendingInputs ?? [];\n const hasWaitingInput = pendingInputs.length > 0;\n return {\n ...initialState,\n messages: conversation.messages,\n phase: hasWaitingInput\n ? \"waiting-input\"\n : conversation.pending\n ? conversation.streamingText\n ? \"streaming\"\n : \"thinking\"\n : \"complete\",\n streamingText: conversation.streamingText,\n toolSteps: conversation.toolSteps,\n toolResults: conversation.toolResults,\n ...(hasWaitingInput ? { pendingInputs } : {}),\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 applyBookingOffer(\n prev: AgentRailState,\n card: BookingOffer\n): AgentRailState {\n const pendingOffer = preferBookingOffer(prev.pendingOffer, card);\n const last = prev.messages.at(-1);\n if (last?.role === \"agent\" && prev.phase === \"complete\") {\n return {\n ...prev,\n pendingOffer,\n messages: [\n ...prev.messages.slice(0, -1),\n {\n ...last,\n text: ensureBookingOfferText(last.text, pendingOffer),\n },\n ],\n };\n }\n return { ...prev, pendingOffer };\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\nfunction isJsonRecord(\n value: AgentToolResultJsonValue | undefined\n): value is Record<string, AgentToolResultJsonValue> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport type UseAgentChatOptions = {\n handoffEnabled?: boolean;\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 toolResultRegistry?: VisitorToolResultRegistry;\n};\n\ntype AgentChatSubmitOptions = {\n preservePendingOffer?: boolean;\n runtimeText?: string;\n declinedComposerFormId?: string;\n};\n\nexport function useAgentChat({\n handoffEnabled = false,\n customerId,\n getUnpublishedPreviewGrant,\n indexId,\n previewBuildId,\n version,\n runtimeOrigin,\n visitorSessionId,\n storageKeyPrefix,\n greeting,\n toolResultRegistry,\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 toolResultRegistryRef = useRef(toolResultRegistry);\n toolResultRegistryRef.current = toolResultRegistry;\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 locationConsent: true,\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 locationConsent: true,\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 toolResults: state.toolResults ?? [],\n ...(state.pendingInputs && state.pendingInputs.length > 0\n ? { pendingInputs: state.pendingInputs }\n : {}),\n });\n }, [\n resolvedStorageKeyPrefix,\n state.messages,\n state.pendingInputs,\n state.phase,\n state.streamingText,\n state.toolSteps,\n state.toolResults,\n visitorId,\n ]);\n\n const handoff = useAgentHandoff({\n enabled: handoffEnabled,\n client: clientRef.current,\n sessionId: clientRef.current.getActiveSessionId(),\n onOwnership: () => {\n runRef.current?.abort();\n runRef.current = null;\n setState((prev) =>\n prev.phase === \"complete\" &&\n !prev.streamingText &&\n !prev.pendingInputs?.length &&\n !prev.toolSteps.length\n ? prev\n : {\n ...prev,\n phase: \"complete\",\n streamingText: \"\",\n pendingInputs: [],\n toolSteps: [],\n toolResults: [],\n pendingOffer: null,\n error: null,\n }\n );\n },\n onEvents: (events) => {\n setState((prev) => {\n const seen = new Set(prev.messages.map((message) => message.id));\n const messages: ConversationMessage[] = [];\n for (const event of events) {\n if (event.type === \"status\" || seen.has(`handoff-${event.id}`))\n continue;\n messages.push(\n event.type === \"human.message\"\n ? {\n id: `handoff-${event.id}`,\n role: \"human\",\n text: event.message,\n createdAt: Date.parse(event.createdAt),\n representative: event.actor,\n }\n : {\n id: `handoff-${event.id}`,\n role: \"visitor\",\n text: event.message,\n createdAt: Date.parse(event.createdAt),\n }\n );\n }\n return messages.length\n ? {\n ...prev,\n messages: [...prev.messages, ...messages].sort(\n (a, b) => a.createdAt - b.createdAt\n ),\n }\n : prev;\n });\n },\n });\n\n const handoffBlocksAI = useRef(handoff.blocksAI);\n handoffBlocksAI.current = handoff.blocksAI;\n\n const reset = useCallback(() => {\n if (handoff.blocksAI && !handoff.canReset) return;\n runRef.current?.abort();\n runRef.current = null;\n clientRef.current.reset();\n pendingBookingRef.current = null;\n clearPersistedAgentConversation(resolvedStorageKeyPrefix, visitorId);\n setState(initialState);\n }, [\n handoff.blocksAI,\n handoff.canReset,\n initialState,\n resolvedStorageKeyPrefix,\n visitorId,\n ]);\n\n const runTurn = useCallback(\n async (input: {\n controller: AbortController;\n initialText?: string;\n regenerate?: boolean;\n resume: boolean;\n visitorText: string;\n responses?: readonly AgentInputResponse[];\n }): Promise<string | null> => {\n if (handoffBlocksAI.current) return null;\n const {\n controller,\n initialText = \"\",\n regenerate = false,\n responses,\n resume,\n visitorText,\n } = 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 let bookingConfirmed = false;\n let capturedInputCount = 0;\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 onToolResult: (result: AgentToolResult) => {\n const presentation = presentVisitorToolResult(\n result,\n toolResultRegistryRef.current\n );\n if (presentation.kind === \"booking\") {\n const card = presentation.card;\n if (card.type === \"booking_offer\") {\n capturedOffers.push(card);\n setState((prev) => applyBookingOffer(prev, card));\n return;\n }\n if (!isActiveRun()) return;\n if (card.type === \"booking_confirmed\") {\n bookingConfirmed = true;\n pendingBookingRef.current = card;\n savePendingWidgetBooking(\n resolvedStorageKeyPrefix,\n visitorId,\n card\n );\n } else if (\n card.type === \"booking_canceled\" &&\n pendingBookingRef.current?.eventUri === card.eventUri\n ) {\n pendingBookingRef.current = null;\n clearPendingWidgetBooking(resolvedStorageKeyPrefix, visitorId);\n }\n return;\n }\n if (!isActiveRun()) return;\n if (presentation.kind === \"hidden\") return;\n setState((prev) => ({\n ...prev,\n toolResults: [\n ...(prev.toolResults ?? []).filter(\n (item) => item.id !== presentation.id\n ),\n presentation,\n ],\n }));\n },\n onInputRequest: (requests: readonly AgentInputRequest[]) => {\n if (!isActiveRun()) return;\n capturedInputCount += requests.length;\n const cardRequests = requests.filter(shouldRenderVisitorInputCard);\n const chatRequests = requests.filter(isChatCollectibleInputRequest);\n setState((prev) => ({\n ...prev,\n phase: cardRequests.length > 0 ? \"waiting-input\" : \"complete\",\n pendingInputs: [...requests],\n ...(chatRequests.length > 0\n ? {\n messages: appendChatCollectiblePrompts(\n prev.messages,\n chatRequests\n ),\n toolSteps: completeActivePlanning(prev.toolSteps),\n }\n : {}),\n }));\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 = responses\n ? await clientRef.current.respondTurn({\n handlers,\n responses,\n signal,\n })\n : resume\n ? await clientRef.current.resumeTurn({\n handlers,\n initialText,\n message: visitorText,\n signal,\n })\n : regenerate\n ? await clientRef.current.regenerateTurn(visitorText, {\n handlers,\n signal,\n })\n : await clientRef.current.sendTurn(visitorText, {\n handlers,\n signal,\n });\n\n if (resume && finalText === null) {\n if (!isActiveRun() || handoffBlocksAI.current) return null;\n finalText = await clientRef.current.sendTurn(visitorText, {\n handlers,\n signal,\n });\n }\n\n if (!isActiveRun() || finalText === null) return null;\n if (!finalText.trim() && capturedInputCount > 0) {\n runRef.current = null;\n return null;\n }\n\n const displayText = ensureBookingOfferText(\n finalText,\n capturedOffers.at(-1) ?? null\n );\n const parsedCards = extractToolCards(displayText);\n for (const card of parsedCards) {\n if (card.type === \"booking_confirmed\") {\n bookingConfirmed = true;\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: (prev.pendingInputs ?? []).some(shouldRenderVisitorInputCard)\n ? \"waiting-input\"\n : \"complete\",\n messages: appendAgentTurnMessage(\n prev.messages,\n displayText,\n (prev.toolResults ?? []).filter(\n (result) => result.kind === \"search\"\n ),\n (prev.toolResults ?? []).filter(\n (result) => result.kind !== \"search\" && result.kind !== \"input\"\n )\n ),\n toolResults: (prev.toolResults ?? []).filter(\n (result) => result.kind === \"input\"\n ),\n toolSteps: completeActivePlanning(prev.toolSteps),\n streamingText: \"\",\n pendingOffer: bookingConfirmed\n ? null\n : capturedOffers.at(-1) ?? prev.pendingOffer,\n pendingInputs: (prev.pendingInputs ?? []).filter(\n isChatCollectibleInputRequest\n ),\n followUps: [],\n journey: null,\n }));\n runRef.current = null;\n return displayText;\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\")\n return null;\n if (!isActiveRun()) return null;\n const message = formatAgentError(error);\n if (!message) return null;\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 error: message,\n }));\n runRef.current = null;\n return 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?: AgentChatSubmitOptions\n ): Promise<string | null> => {\n const trimmed = visitorText.trim();\n const outgoing = options?.runtimeText ?? visitorText;\n if (!outgoing.trim()) return null;\n const declinedComposerFormId = options?.declinedComposerFormId?.trim();\n if (handoff.blocksAI) {\n if (\n ![\"requesting\", \"queued\", \"human\"].includes(\n handoff.page?.status ?? \"\"\n ) ||\n handoff.busy\n )\n return null;\n if (!trimmed) return null;\n await handoff.send(trimmed);\n return null;\n }\n\n const chatResponse = chatInputResponseForText(\n state.pendingInputs ?? [],\n outgoing.trim()\n );\n if (chatResponse) {\n const visitorMessage: ConversationMessage = {\n id: `visitor-${Date.now()}`,\n role: \"visitor\",\n text: trimmed,\n ...(outgoing !== trimmed ? { runtimeText: outgoing } : {}),\n createdAt: Date.now(),\n };\n if (runRef.current) {\n runRef.current.abort();\n clientRef.current.cancelActive();\n }\n const controller = new AbortController();\n runRef.current = controller;\n setState((prev) => ({\n ...prev,\n phase: \"running-tools\",\n messages: [...prev.messages, visitorMessage],\n pendingInputs: (prev.pendingInputs ?? []).filter(\n (request) => request.requestId !== chatResponse.requestId\n ),\n toolSteps: [\n {\n id: \"planning\",\n kind: \"planning\",\n label: \"Understanding your question\",\n state: \"active\",\n },\n ],\n error: null,\n ...(declinedComposerFormId\n ? {\n declinedComposerFormIds: [\n ...new Set([\n ...(prev.declinedComposerFormIds ?? []),\n declinedComposerFormId,\n ]),\n ],\n }\n : {}),\n }));\n return await runTurn({\n controller,\n responses: [chatResponse],\n resume: false,\n visitorText: \"\",\n });\n }\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 runtimeText = booking\n ? `${visitorBookingPrefix(booking)}\\n\\n${outgoing}`\n : outgoing;\n const visitorMessage: ConversationMessage = {\n id: `visitor-${Date.now()}`,\n role: \"visitor\",\n text: trimmed,\n createdAt: Date.now(),\n ...(runtimeText.trim() !== trimmed ? { 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: options?.preservePendingOffer ? prev.pendingOffer : null,\n pendingInputs: [],\n toolResults: [],\n error: null,\n ...(declinedComposerFormId\n ? {\n declinedComposerFormIds: [\n ...new Set([\n ...(prev.declinedComposerFormIds ?? []),\n declinedComposerFormId,\n ]),\n ],\n }\n : {}),\n }));\n return await runTurn({\n controller,\n resume: false,\n visitorText: runtimeText,\n });\n },\n [handoff, runTurn, state.pendingInputs]\n );\n\n const retry = useCallback(async () => {\n if (handoffBlocksAI.current) return;\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 pendingInputs: [],\n toolResults: [],\n error: null,\n }));\n await runTurn({\n controller,\n resume: false,\n visitorText: visitorTurnText(visitorMessage),\n });\n }, [runTurn, state.messages]);\n\n const regenerate = useCallback(async (): Promise<string | null> => {\n if (handoffBlocksAI.current) return null;\n let lastVisitorIndex = -1;\n for (let index = state.messages.length - 1; index >= 0; index -= 1) {\n if (state.messages[index]?.role === \"visitor\") {\n lastVisitorIndex = index;\n break;\n }\n }\n const visitorMessage =\n lastVisitorIndex >= 0 ? state.messages[lastVisitorIndex] : undefined;\n if (!visitorMessage) return null;\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 messages: prev.messages.slice(0, lastVisitorIndex + 1),\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 pendingInputs: [],\n toolResults: [],\n error: null,\n }));\n return await runTurn({\n controller,\n regenerate: true,\n resume: false,\n visitorText: visitorTurnText(visitorMessage),\n });\n }, [runTurn, state.messages]);\n\n const respondToToolInput = useCallback(\n async (\n surface: AgentToolUiSurface,\n values: Record<string, AgentToolResultJsonValue>\n ) => {\n await submit(`${surface.title} submitted`, {\n runtimeText: [\n formatAgentStructuredToolInput(surface, values),\n \"Use these exact structured values to retry the requested action.\",\n \"Reuse the operationId from the structured payload.\",\n \"Do not invent or alter any values.\",\n ].join(\"\\n\"),\n });\n },\n [submit]\n );\n\n const respondToInput = useCallback(\n async (response: AgentInputResponse) => {\n if (handoffBlocksAI.current || runRef.current) return;\n const pending = state.pendingInputs?.find(\n (request) => request.requestId === response.requestId\n );\n if (!pending) return;\n if (pending.ui && isJsonRecord(response.value)) {\n await respondToToolInput(pending.ui, response.value);\n return;\n }\n const controller = new AbortController();\n runRef.current = controller;\n setState((prev) => ({\n ...prev,\n phase: \"running-tools\",\n pendingInputs: (prev.pendingInputs ?? []).filter(\n (request) => request.requestId !== response.requestId\n ),\n error: null,\n }));\n await runTurn({\n controller,\n responses: [response],\n resume: false,\n visitorText: \"\",\n });\n },\n [respondToToolInput, runTurn, state.pendingInputs]\n );\n\n useEffect(() => {\n if (handoff.blocksAI) return;\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 }, [\n handoff.blocksAI,\n identityKey,\n resolvedStorageKeyPrefix,\n runTurn,\n visitorId,\n ]);\n\n useEffect(() => {\n return () => {\n runRef.current?.abort();\n runRef.current = null;\n };\n }, []);\n\n return {\n handoff,\n state,\n reset,\n retry,\n regenerate,\n respondToInput,\n respondToToolInput,\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 { connectedToolWork, completeConnectedToolWork } from \"./connected-tool-work\";\nimport {\n Client,\n ClientError,\n type ClientSession,\n type InputResponse,\n type MessageResponse,\n type MessageStreamEvent,\n} from \"eve/client\";\nimport { createHandoffClient } from \"./handoff\";\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 { SubagentChildStreamCoordinator } from \"./subagent-child-stream\";\nimport type {\n AgentClient,\n AgentClientOptions,\n AgentIndexVersion,\n AgentResumeTurnOptions,\n AgentRespondTurnOptions,\n AgentSendTurnOptions,\n AgentStreamHandlers,\n AgentWorkItem,\n} from \"./types\";\nimport { parseAgentToolUiSurface } from \"./tool-ui\";\n\ntype AgentRuntimeStreamEvent =\n | MessageStreamEvent\n | Extract<MessageStreamEvent, { type: \"subagent.event\" }>[\"data\"][\"event\"];\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 emitVisitorInteractionEvent(event, handlers);\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\nfunction emitActionResult(\n event: Extract<AgentRuntimeStreamEvent, { type: \"action.result\" }>,\n handlers: AgentStreamHandlers\n) {\n const result = event.data.result;\n if (result.kind === \"tool-result\") {\n handlers.onToolResult?.({\n callId: result.callId,\n toolName: result.toolName,\n status: result.isError ? \"failed\" : event.data.status,\n output: result.output,\n ...(event.data.error ? { error: event.data.error } : {}),\n });\n }\n if (\"output\" in result) handlers.onActionResult?.(result.output);\n}\n\nfunction emitInputRequests(\n event: Extract<AgentRuntimeStreamEvent, { type: \"input.requested\" }>,\n handlers: AgentStreamHandlers\n) {\n handlers.onInputRequest?.(\n event.data.requests.map((request) => {\n const ui = parseAgentToolUiSurface(\n (request as unknown as { ui?: unknown }).ui\n );\n return {\n requestId: request.requestId,\n kind: request.kind,\n prompt: request.prompt,\n ...(request.display ? { display: request.display } : {}),\n ...(request.allowFreeform !== undefined\n ? { allowFreeform: request.allowFreeform }\n : {}),\n ...(request.options ? { options: request.options } : {}),\n ...(ui ? { ui } : {}),\n action: {\n callId: request.action.callId,\n kind: \"tool-call\" as const,\n toolName: request.action.toolName,\n },\n };\n })\n );\n}\n\nfunction emitVisitorInteractionEvent(\n event: AgentRuntimeStreamEvent,\n handlers: AgentStreamHandlers\n) {\n if (event.type === \"action.result\") emitActionResult(event, handlers);\n if (event.type === \"input.requested\") emitInputRequests(event, handlers);\n if (event.type === \"subagent.event\") {\n emitVisitorInteractionEvent(event.data.event, handlers);\n }\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\nexport function streamIndexBeforeLastTurn(input: {\n currentStreamIndex: number;\n events: readonly MessageStreamEvent[];\n}): number | null {\n let turnStart = -1;\n for (let index = input.events.length - 1; index >= 0; index -= 1) {\n if (input.events[index]?.type === \"message.received\") {\n turnStart = index;\n break;\n }\n }\n if (turnStart < 0) return null;\n return Math.max(\n 0,\n input.currentStreamIndex - (input.events.length - turnStart)\n );\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 === \"request_location\") return 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 action.kind === \"tool-call\" ? connectedToolWork(action) : null;\n}\n\nexport function applyWorkEvent(\n event: AgentRuntimeStreamEvent,\n handlers: AgentStreamHandlers,\n workItems: Map<string, AgentWorkItem>\n) {\n if (event.type === \"subagent.event\") {\n applyWorkEvent(event.data.event, handlers, workItems);\n return;\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 if (current.kind === \"tool\" && result.kind === \"tool-result\") {\n emitWorkItem(completeConnectedToolWork(current, {\n callId: result.callId,\n toolName: result.toolName,\n status: result.isError ? \"failed\" : status,\n output: result.output,\n }), handlers, workItems);\n return;\n }\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 childStreams: SubagentChildStreamCoordinator | undefined;\n private readonly capability: AgentRuntimeCapability;\n readonly handoff;\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 locationConsent?: boolean\n ) {\n this.capability = createAgentRuntimeCapability({\n locationConsent,\n getUnpublishedPreviewGrant,\n indexId,\n previewBuildId,\n runtimeOrigin,\n version,\n visitorSessionId,\n });\n this.handoff = createHandoffClient({\n getClient: () => this.ensureClient(),\n getSessionId: () => this.getActiveSessionId(),\n capability: this.capability,\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 this.childStreams?.abortAll();\n this.childStreams = undefined;\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 async rewindBeforeLastTurn(signal: AbortSignal): Promise<boolean> {\n const persisted = loadPersistedAgentSession(\n this.visitorSessionId,\n this.storeOptions\n );\n if (!persisted?.sessionId) return false;\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 rewindStreamIndex = streamIndexBeforeLastTurn({\n currentStreamIndex: snapshot.session.streamIndex,\n events: snapshot.events,\n });\n if (rewindStreamIndex === null) return false;\n\n this.session = client.sessions.attach(persisted.sessionId, {\n streamIndex: rewindStreamIndex,\n });\n savePersistedAgentSession(\n this.visitorSessionId,\n persisted.sessionId,\n rewindStreamIndex,\n this.storeOptions\n );\n return true;\n }\n\n async regenerateTurn(\n message: string,\n signal: AbortSignal,\n handlers: AgentStreamHandlers\n ): Promise<string> {\n await this.rewindBeforeLastTurn(signal);\n return this.sendTurn(message, signal, handlers);\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 const childStreams = new SubagentChildStreamCoordinator(\n client,\n handlers,\n signal\n );\n this.childStreams = childStreams;\n let streamIndex = session?.state.streamIndex ?? 0;\n let rendered = \"\";\n const workItems = new Map<string, AgentWorkItem>();\n let requestedInput = false;\n\n try {\n for await (const event of response) {\n if (signal.aborted) break;\n if (event.type === \"subagent.called\") childStreams.begin(event);\n if (event.type === \"input.requested\") requestedInput = true;\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 await childStreams.waitForAll();\n } finally {\n childStreams.abortAll();\n this.activeResponse = undefined;\n if (this.childStreams === childStreams) this.childStreams = undefined;\n if (session) {\n this.persistSessionCursor(session);\n }\n }\n\n if (!rendered.trim() && !signal.aborted && !requestedInput) {\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 hasInputRequest = turnEvents.some(\n (event) => event.type === \"input.requested\"\n );\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 &&\n lastSent !== undefined &&\n received.data.message === lastSent)\n )\n ) {\n return null;\n }\n let rendered = renderTurn(turnEvents);\n const workItems = new Map<string, AgentWorkItem>();\n const childStreams = new SubagentChildStreamCoordinator(\n client,\n handlers,\n signal\n );\n this.childStreams = childStreams;\n try {\n for (const event of turnEvents) {\n if (event.type === \"subagent.called\") childStreams.begin(event);\n applyWorkEvent(event, handlers, workItems);\n emitVisitorInteractionEvent(event, handlers);\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 await childStreams.waitForAll();\n if (!rendered.trim() && !hasInputRequest) {\n throw new Error(\"Empty response from runtime\");\n }\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 if (event.type === \"subagent.called\") childStreams.begin(event);\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 await childStreams.waitForAll();\n\n session = client.sessions.attach(session.state.sessionId, {\n streamIndex,\n });\n this.session = session;\n this.persistSessionCursor(session);\n\n if (!rendered.trim() && !signal.aborted && !hasInputRequest) {\n throw new Error(\"Empty response from runtime\");\n }\n return rendered.trim();\n } finally {\n childStreams.abortAll();\n if (this.childStreams === childStreams) this.childStreams = undefined;\n }\n }\n\n async respondTurn(\n responses: AgentRespondTurnOptions[\"responses\"],\n signal: AbortSignal,\n handlers: AgentStreamHandlers\n ): Promise<string> {\n const client = this.ensureClient();\n const session = this.session ?? this.attachPersistedSession(client);\n if (!session) {\n throw new Error(\"No active session is waiting for input.\");\n }\n this.session = session;\n const inputResponses: InputResponse[] = responses.map(\n ({ requestId, optionId, text }) => ({\n requestId,\n ...(optionId ? { optionId } : {}),\n ...(text ? { text } : {}),\n })\n );\n const response = await withCapabilityRefresh(this.capability, () =>\n session.respond(inputResponses, { signal })\n );\n this.activeResponse = response;\n const childStreams = new SubagentChildStreamCoordinator(\n client,\n handlers,\n signal\n );\n this.childStreams = childStreams;\n let streamIndex = session.state.streamIndex;\n let rendered = \"\";\n let requestedInput = false;\n const workItems = new Map<string, AgentWorkItem>();\n\n try {\n for await (const event of response) {\n if (signal.aborted) break;\n if (event.type === \"subagent.called\") childStreams.begin(event);\n if (event.type === \"input.requested\") requestedInput = true;\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 }\n await childStreams.waitForAll();\n } finally {\n childStreams.abortAll();\n this.activeResponse = undefined;\n if (this.childStreams === childStreams) this.childStreams = undefined;\n this.session = client.sessions.attach(session.state.sessionId, {\n streamIndex,\n });\n this.persistSessionCursor(this.session);\n }\n\n if (!rendered.trim() && !signal.aborted && !requestedInput) {\n throw new Error(\"Empty response from runtime\");\n }\n return rendered.trim();\n }\n\n cancelActive() {\n this.childStreams?.abortAll();\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 options.locationConsent\n );\n\n return {\n indexId,\n handoff: session.handoff,\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 respondTurn: (respondOptions: AgentRespondTurnOptions) =>\n session.respondTurn(\n respondOptions.responses,\n respondOptions.signal ?? new AbortController().signal,\n respondOptions.handlers\n ),\n regenerateTurn: (message, regenerateOptions: AgentSendTurnOptions) =>\n session.regenerateTurn(\n message,\n regenerateOptions.signal ?? new AbortController().signal,\n regenerateOptions.handlers\n ),\n reset: () => session.reset(),\n cancelActive: () => session.cancelActive(),\n getActiveSessionId: () => session.getActiveSessionId(),\n };\n}\n","import { ClientError, type Client } from \"eve/client\";\nimport {\n agentRuntimeHandoffCommandSchema,\n agentRuntimeHandoffMessageSchema,\n agentRuntimeHandoffPageSchema,\n agentRuntimeHandoffReadRequestSchema,\n agentRuntimeHandoffStartSchema,\n type AgentRuntimeHandoffPage,\n} from \"./generated/handoff-contract\";\nimport {\n withCapabilityRefresh,\n type AgentRuntimeCapability,\n} from \"./capability\";\n\nexport type AgentHandoffCommand = {\n operationId: string;\n handoffId: string;\n epoch: number;\n};\n\nexport type AgentHandoffClient = {\n read(options?: {\n after?: number;\n signal?: AbortSignal;\n }): Promise<AgentRuntimeHandoffPage>;\n start(operationId: string, signal?: AbortSignal): Promise<void>;\n send(\n command: AgentHandoffCommand & { message: string },\n signal?: AbortSignal,\n ): Promise<void>;\n returnToAI(command: AgentHandoffCommand, signal?: AbortSignal): Promise<void>;\n};\n\nexport function createHandoffClient(options: {\n getClient: () => Client;\n getSessionId: () => string | undefined;\n capability: AgentRuntimeCapability;\n}): AgentHandoffClient {\n const target = () => {\n const sessionId = options.getSessionId();\n if (!sessionId)\n throw new Error(\n \"Start a conversation before requesting a representative.\",\n );\n return {\n sessionId,\n path: `/webless/v1/session/${encodeURIComponent(sessionId)}/handoff`,\n };\n };\n\n const request = (path: string, init?: RequestInit) =>\n withCapabilityRefresh(options.capability, async () => {\n const response = await options.getClient().fetch(path, {\n ...init,\n cache: \"no-store\",\n redirect: \"error\",\n });\n if (!response.ok) {\n throw new ClientError(\n response.status,\n await response.text(),\n response.headers,\n );\n }\n return response;\n });\n\n const command = async (\n suffix: string,\n body: object,\n signal?: AbortSignal,\n ) => {\n const { path } = target();\n await request(path + suffix, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n signal,\n });\n };\n\n return {\n async read(input = {}) {\n const { after } = agentRuntimeHandoffReadRequestSchema.parse({\n after: input.after,\n });\n const { sessionId, path } = target();\n const response = await request(`${path}?after=${after}`, {\n signal: input.signal,\n });\n const value: unknown = await response.json();\n const page = agentRuntimeHandoffPageSchema.parse(value);\n if (page.sessionId !== sessionId || page.after !== after) {\n throw new Error(\n \"The handoff response does not belong to this conversation or cursor.\",\n );\n }\n return page;\n },\n start: (operationId, signal) =>\n command(\n \"\",\n agentRuntimeHandoffStartSchema.parse({ operationId }),\n signal,\n ),\n send: (input, signal) =>\n command(\n \"/messages\",\n agentRuntimeHandoffMessageSchema.parse(input),\n signal,\n ),\n returnToAI: (input, signal) =>\n command(\"/return\", agentRuntimeHandoffCommandSchema.parse(input), signal),\n };\n}\n\nexport type {\n AgentRuntimeHandoffEvent as AgentHandoffEvent,\n AgentRuntimeHandoffPage as AgentHandoffPage,\n AgentRuntimeHandoffStatus as AgentHandoffStatus,\n} from \"./generated/handoff-contract\";\n","// Generated from console/packages/contracts/src/agent-runtime-handoff.ts.\n// Source SHA-256: d4c9554c9e0a5be29e51ea9a74548aef58d4f5952c92209712bd80e8f1feb5c2\n// Regenerate with scripts/sync-handoff-contract.mjs; do not edit here.\nimport { z } from \"zod\";\n\nconst id = z.string().min(1).max(200);\nconst sequence = z.number().int().min(0).max(Number.MAX_SAFE_INTEGER);\nconst text = z.string().trim().min(1).max(16_000);\n\nexport const agentRuntimeHandoffVersion = \"webless.ai/agent-runtime-handoff/v1\";\n\nexport const agentRuntimeHandoffStatusSchema = z.enum([\n \"ai\",\n \"requesting\",\n \"queued\",\n \"human\",\n \"resolved\",\n \"failed\",\n]);\n\nexport const agentRuntimeHandoffActorSchema = z.strictObject({\n id,\n name: z.string().trim().min(1).max(200),\n});\n\nconst eventBase = {\n id,\n sequence: sequence.refine((value) => value > 0),\n handoffId: id,\n epoch: sequence.refine((value) => value > 0),\n createdAt: z.iso.datetime(),\n};\n\nexport const agentRuntimeHandoffEventSchema = z.discriminatedUnion(\"type\", [\n z.strictObject({\n ...eventBase,\n type: z.literal(\"status\"),\n status: agentRuntimeHandoffStatusSchema,\n actor: agentRuntimeHandoffActorSchema.nullable(),\n }),\n z.strictObject({\n ...eventBase,\n type: z.literal(\"visitor.message\"),\n message: text,\n operationId: id,\n }),\n z.strictObject({\n ...eventBase,\n type: z.literal(\"human.message\"),\n message: text,\n actor: agentRuntimeHandoffActorSchema,\n }),\n]);\n\nexport const agentRuntimeHandoffReadRequestSchema = z.strictObject({\n after: sequence.default(0),\n});\n\nexport const agentRuntimeHandoffPageSchema = z\n .strictObject({\n apiVersion: z.literal(agentRuntimeHandoffVersion),\n sessionId: id,\n enabled: z.boolean(),\n status: agentRuntimeHandoffStatusSchema,\n handoffId: id.nullable(),\n epoch: sequence,\n after: sequence,\n cursor: sequence,\n hasMore: z.boolean(),\n events: z.array(agentRuntimeHandoffEventSchema).max(100),\n })\n .superRefine((page, ctx) => {\n let cursor = page.after;\n let previousEpoch = 0;\n const statuses = new Map<\n number,\n z.infer<typeof agentRuntimeHandoffStatusSchema>\n >();\n const ids = new Set<string>();\n const handoffs = new Map<number, string>();\n const terminalEpochs = new Set<number>();\n let currentStatus:\n | z.infer<typeof agentRuntimeHandoffStatusSchema>\n | undefined;\n for (const event of page.events) {\n if (event.epoch < previousEpoch)\n ctx.addIssue({\n code: \"custom\",\n message: \"Handoff epochs cannot decrease.\",\n });\n previousEpoch = event.epoch;\n\n if (ids.has(event.id))\n ctx.addIssue({\n code: \"custom\",\n message: \"Duplicate handoff event ID.\",\n });\n ids.add(event.id);\n const handoffId = handoffs.get(event.epoch);\n if (\n (handoffId !== undefined && handoffId !== event.handoffId) ||\n (event.epoch === page.epoch && event.handoffId !== page.handoffId)\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Inconsistent handoff epoch identity.\",\n });\n handoffs.set(event.epoch, event.handoffId);\n if (\n terminalEpochs.has(event.epoch) &&\n (event.type !== \"status\" || event.status !== \"ai\")\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Handoff event follows resolution.\",\n });\n if (event.type === \"status\") {\n if (event.status === \"human\" && event.actor === null)\n ctx.addIssue({\n code: \"custom\",\n message: \"Human ownership requires a representative.\",\n });\n const previous = statuses.get(event.epoch);\n const transitions: Record<\n z.infer<typeof agentRuntimeHandoffStatusSchema>,\n readonly z.infer<typeof agentRuntimeHandoffStatusSchema>[]\n > = {\n ai: [],\n requesting: [\"queued\", \"resolved\", \"failed\"],\n queued: [\"human\", \"resolved\", \"failed\"],\n human: [\"resolved\", \"failed\"],\n resolved: [\"ai\"],\n failed: [],\n };\n if (\n previous !== undefined &&\n !transitions[previous].includes(event.status)\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Invalid handoff ownership transition.\",\n });\n statuses.set(event.epoch, event.status);\n if ([\"resolved\", \"failed\", \"ai\"].includes(event.status))\n terminalEpochs.add(event.epoch);\n if (event.epoch === page.epoch) currentStatus = event.status;\n }\n if (event.sequence !== cursor + 1) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Handoff event gap or replay.\",\n });\n }\n cursor = event.sequence;\n if (event.epoch > page.epoch) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Event exceeds current epoch.\",\n });\n }\n }\n if (\n !page.hasMore &&\n currentStatus !== undefined &&\n currentStatus !== page.status\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Handoff ownership contradicts its final status event.\",\n });\n if (page.cursor !== cursor || (page.hasMore && page.events.length === 0)) {\n ctx.addIssue({ code: \"custom\", message: \"Invalid handoff page cursor.\" });\n }\n if ((page.epoch === 0) !== (page.handoffId === null)) {\n ctx.addIssue({ code: \"custom\", message: \"Invalid handoff identity.\" });\n }\n if (page.handoffId === null && page.status !== \"ai\") {\n ctx.addIssue({\n code: \"custom\",\n message: \"Handoff identity is required.\",\n });\n }\n });\n\nexport const agentRuntimeHandoffStartSchema = z.strictObject({\n operationId: id,\n});\n\nexport const agentRuntimeHandoffCommandSchema = z.strictObject({\n operationId: id,\n handoffId: id,\n epoch: sequence.refine((value) => value > 0),\n});\n\nexport const agentRuntimeHandoffMessageSchema =\n agentRuntimeHandoffCommandSchema.extend({ message: text });\n\n// Server-to-server identity is derived from verified visitor capabilities.\nexport const agentRuntimeHandoffBindingSchema = z.strictObject({\n tenantId: id,\n indexId: id,\n visitorSubject: id,\n sessionId: id,\n handoffId: id,\n epoch: sequence.refine((value) => value > 0),\n});\n\nconst providerEventBase = {\n apiVersion: z.literal(agentRuntimeHandoffVersion),\n binding: agentRuntimeHandoffBindingSchema,\n eventId: id,\n sequence: sequence.refine((value) => value > 0),\n};\n\nexport const agentRuntimeHandoffProviderEventSchema = z.discriminatedUnion(\n \"type\",\n [\n z.strictObject({ ...providerEventBase, type: z.literal(\"queued\") }),\n z.strictObject({\n ...providerEventBase,\n type: z.literal(\"assigned\"),\n actor: agentRuntimeHandoffActorSchema,\n }),\n z.strictObject({\n ...providerEventBase,\n type: z.literal(\"human.message\"),\n actor: agentRuntimeHandoffActorSchema,\n message: text,\n }),\n z.strictObject({ ...providerEventBase, type: z.literal(\"resolved\") }),\n z.strictObject({ ...providerEventBase, type: z.literal(\"failed\") }),\n ],\n);\n\nexport type AgentRuntimeHandoffStatus = z.infer<\n typeof agentRuntimeHandoffStatusSchema\n>;\nexport type AgentRuntimeHandoffReadRequest = z.input<\n typeof agentRuntimeHandoffReadRequestSchema\n>;\nexport type AgentRuntimeHandoffStart = z.infer<\n typeof agentRuntimeHandoffStartSchema\n>;\nexport type AgentRuntimeHandoffCommand = z.infer<\n typeof agentRuntimeHandoffCommandSchema\n>;\nexport type AgentRuntimeHandoffMessage = z.infer<\n typeof agentRuntimeHandoffMessageSchema\n>;\nexport type AgentRuntimeHandoffEvent = z.infer<\n typeof agentRuntimeHandoffEventSchema\n>;\nexport type AgentRuntimeHandoffPage = z.infer<\n typeof agentRuntimeHandoffPageSchema\n>;\nexport type AgentRuntimeHandoffBinding = z.infer<\n typeof agentRuntimeHandoffBindingSchema\n>;\nexport type AgentRuntimeHandoffProviderEvent = z.infer<\n typeof agentRuntimeHandoffProviderEventSchema\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 locationConsent?: boolean;\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;\nconst LOCAL_LOOPBACK_ORIGINS = [\n \"http://127.0.0.1:3010\",\n \"http://127.0.0.1:3001\",\n] as const;\n\nfunction isLoopbackRuntimeOrigin(origin: string) {\n try {\n const host = new URL(origin).hostname;\n return host === \"127.0.0.1\" || host === \"localhost\";\n } catch {\n return false;\n }\n}\n\nfunction localBootstrapOrigins(origin: string) {\n const normalized = origin.replace(/\\/$/, \"\");\n if (!isLoopbackRuntimeOrigin(normalized)) return [normalized];\n return [\n normalized,\n ...LOCAL_LOOPBACK_ORIGINS.filter((candidate) => candidate !== normalized),\n ];\n}\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 bootstrapBody = {\n clientSessionId: options.visitorSessionId,\n indexId: options.indexId,\n ...(previewBuildId ? { previewBuildId } : {}),\n ...(previewGrant ? { previewGrant } : {}),\n version: options.version,\n };\n const postBootstrap = async (origin: string) => {\n const send = (advertiseLocation: boolean) => fetchImplementation(`${origin}/webless/v1/bootstrap`, {\n body: JSON.stringify({ ...bootstrapBody, ...(advertiseLocation ? { locationConsent: \"v1\" } : {}) }),\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n });\n const response = await send(Boolean(options.locationConsent));\n if (options.locationConsent && response.status === 400) {\n const error: unknown = await response.clone().json().catch(() => null);\n // Older runtimes reject unknown bootstrap fields during rolling upgrades.\n if (isRecord(error) && error.code === \"invalid_request\") return send(false);\n }\n return response;\n };\n\n let response: Response | undefined;\n let lastError: unknown;\n for (const origin of localBootstrapOrigins(options.runtimeOrigin)) {\n try {\n response = await postBootstrap(origin);\n break;\n } catch (error) {\n lastError = error;\n }\n }\n if (!response) {\n throw lastError instanceof Error\n ? lastError\n : new Error(\"Agent Runtime is unavailable.\");\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 { connectedToolWork, completeConnectedToolWork } from \"./connected-tool-work\";\nimport { type Client, type MessageStreamEvent } from \"eve/client\";\nimport type { AgentStreamHandlers, AgentToolResult, AgentWorkItem } from \"./types\";\n\nconst INITIAL_RETRY_DELAY_MS = 100;\nconst MAX_RETRY_DELAY_MS = 2_000;\nconst MAX_CONSECUTIVE_RETRIES = 6;\n\ntype SubagentCalledEvent = Extract<\n MessageStreamEvent,\n { type: \"subagent.called\" }\n>;\n\ntype ChildStreamEvent =\n | { type: \"actions.requested\"; items: AgentWorkItem[] }\n | {\n type: \"action.result\";\n result: AgentToolResult;\n hasOutput: boolean;\n }\n | {\n type: \"subagent.called\";\n childStreamPath: string;\n }\n | {\n type: \"session.boundary\";\n }\n | {\n type: \"other\";\n };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseError(value: unknown): AgentToolResult[\"error\"] | undefined {\n if (!isRecord(value)) return undefined;\n const { code, message } = value;\n if (typeof code !== \"string\" || typeof message !== \"string\") {\n return undefined;\n }\n return { code, message };\n}\n\nfunction parseChildStreamEvent(value: unknown): ChildStreamEvent {\n if (!isRecord(value) || typeof value.type !== \"string\") {\n return { type: \"other\" };\n }\n\n if (\n value.type === \"session.waiting\" ||\n value.type === \"session.completed\" ||\n value.type === \"session.failed\"\n ) {\n return { type: \"session.boundary\" };\n }\n\n if (\n value.type === \"subagent.event\" &&\n isRecord(value.data) &&\n Object.hasOwn(value.data, \"event\")\n ) {\n return parseChildStreamEvent(value.data.event);\n }\n\n if (value.type === \"subagent.called\" && isRecord(value.data)) {\n const { childStreamPath } = value.data;\n if (typeof childStreamPath === \"string\") {\n return { childStreamPath, type: \"subagent.called\" };\n }\n }\n\n if (\n value.type === \"actions.requested\" &&\n isRecord(value.data) &&\n Array.isArray(value.data.actions)\n ) {\n const items = value.data.actions.flatMap((action) => {\n if (\n !isRecord(action) ||\n action.kind !== \"tool-call\" ||\n typeof action.callId !== \"string\" ||\n typeof action.toolName !== \"string\" ||\n !isRecord(action.input)\n ) return [];\n const item = connectedToolWork({\n callId: action.callId,\n toolName: action.toolName,\n input: action.input,\n });\n return item ? [item] : [];\n });\n return { type: \"actions.requested\", items };\n }\n if (value.type !== \"action.result\" || !isRecord(value.data)) {\n return { type: \"other\" };\n }\n\n const { data } = value;\n if (\n data.status !== \"completed\" &&\n data.status !== \"failed\" &&\n data.status !== \"rejected\"\n ) {\n return { type: \"other\" };\n }\n if (!isRecord(data.result) || data.result.kind !== \"tool-result\") {\n return { type: \"other\" };\n }\n\n const result = data.result;\n if (\n typeof result.callId !== \"string\" ||\n typeof result.toolName !== \"string\"\n ) {\n return { type: \"other\" };\n }\n\n const error = parseError(data.error);\n return {\n type: \"action.result\",\n hasOutput: Object.hasOwn(result, \"output\"),\n result: {\n callId: result.callId,\n toolName: result.toolName,\n status: result.isError === true ? \"failed\" : data.status,\n ...(Object.hasOwn(result, \"output\") ? { output: result.output } : {}),\n ...(error ? { error } : {}),\n },\n };\n}\n\nasync function* readNdjsonStream(\n body: ReadableStream<Uint8Array>\n): AsyncGenerator<unknown> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n buffer += decoder.decode(value, { stream: !done });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed: unknown = JSON.parse(trimmed);\n yield parsed;\n } catch {\n // Ignore one malformed event without dropping the remaining stream.\n }\n }\n\n if (done) break;\n }\n\n const trimmed = buffer.trim();\n if (trimmed) {\n try {\n const parsed: unknown = JSON.parse(trimmed);\n yield parsed;\n } catch {\n // Ignore a malformed trailing event.\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction streamPathAt(path: string, streamIndex: number): string {\n if (streamIndex === 0) return path;\n return `${path}${path.includes(\"?\") ? \"&\" : \"?\"}startIndex=${streamIndex}`;\n}\n\nfunction abortableDelay(delayMs: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const finish = () => {\n clearTimeout(timeout);\n signal.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timeout = setTimeout(finish, delayMs);\n signal.addEventListener(\"abort\", finish, { once: true });\n });\n}\n\nexport class SubagentChildStreamCoordinator {\n private readonly controllers = new Map<string, AbortController>();\n private readonly tasks = new Map<string, Promise<void>>();\n\n constructor(\n private readonly client: Client,\n private readonly handlers: AgentStreamHandlers,\n private readonly parentSignal: AbortSignal\n ) {}\n\n begin(event: SubagentCalledEvent): void {\n this.beginPath(event.data.childStreamPath);\n }\n\n async waitForAll(): Promise<void> {\n let observedTaskCount = -1;\n while (observedTaskCount !== this.tasks.size) {\n observedTaskCount = this.tasks.size;\n await Promise.all(this.tasks.values());\n }\n }\n\n abortAll(): void {\n for (const controller of this.controllers.values()) controller.abort();\n this.controllers.clear();\n }\n\n private beginPath(childStreamPath: string): void {\n if (this.tasks.has(childStreamPath)) return;\n\n const controller = new AbortController();\n const abort = () => controller.abort();\n if (this.parentSignal.aborted) {\n controller.abort();\n } else {\n this.parentSignal.addEventListener(\"abort\", abort, { once: true });\n }\n this.controllers.set(childStreamPath, controller);\n\n const task = this.consume(childStreamPath, controller.signal).finally(\n () => {\n this.parentSignal.removeEventListener(\"abort\", abort);\n if (this.controllers.get(childStreamPath) === controller) {\n this.controllers.delete(childStreamPath);\n }\n }\n );\n this.tasks.set(childStreamPath, task);\n }\n\n private async consume(path: string, signal: AbortSignal): Promise<void> {\n const workItems = new Map<string, AgentWorkItem>();\n let streamIndex = 0;\n let consecutiveRetries = 0;\n let retryDelayMs = INITIAL_RETRY_DELAY_MS;\n\n while (!signal.aborted && consecutiveRetries < MAX_CONSECUTIVE_RETRIES) {\n let receivedEvent = false;\n try {\n const response = await this.client.fetch(\n streamPathAt(path, streamIndex),\n {\n cache: \"no-store\",\n signal,\n }\n );\n if (!response.ok || response.body === null) {\n await response.body?.cancel().catch(() => {});\n throw new Error(`Child stream returned ${response.status}.`);\n }\n\n for await (const rawEvent of readNdjsonStream(response.body)) {\n if (signal.aborted) return;\n receivedEvent = true;\n streamIndex += 1;\n const event = parseChildStreamEvent(rawEvent);\n if (event.type === \"session.boundary\") return;\n if (event.type === \"subagent.called\") {\n this.beginPath(event.childStreamPath);\n continue;\n }\n if (event.type === \"actions.requested\") {\n for (const item of event.items) {\n workItems.set(item.id, item);\n this.handlers.onWork?.(item);\n }\n continue;\n }\n if (event.type !== \"action.result\") continue;\n const item = workItems.get(event.result.callId);\n if (item) {\n this.handlers.onWork?.(completeConnectedToolWork(item, event.result));\n }\n this.handlers.onToolResult?.(event.result);\n if (event.hasOutput) {\n this.handlers.onActionResult?.(event.result.output);\n }\n }\n } catch {\n if (signal.aborted) return;\n }\n\n consecutiveRetries = receivedEvent ? 0 : consecutiveRetries + 1;\n retryDelayMs = receivedEvent\n ? INITIAL_RETRY_DELAY_MS\n : Math.min(retryDelayMs * 2, MAX_RETRY_DELAY_MS);\n await abortableDelay(retryDelayMs, signal);\n }\n }\n}\n","import { ClientError } from \"eve/client\";\n\nconst TRANSIENT_AGENT_ERROR_MESSAGE =\n \"The agent run stopped before the action finished. 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(\"network error\") ||\n normalized.includes(\"load failed\") ||\n normalized.includes(\"the stream\")\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","import { parseAgentSearchReferences } from \"../runtime/search-discovery\";\nimport type { ConversationMessage, ToolStep } from \"./types/conversation\";\nimport type { AgentInputOption, AgentInputRequest } from \"../runtime/types\";\nimport {\n parseAgentToolUiSurface,\n type AgentToolUiSurface,\n} from \"../runtime/tool-ui\";\nimport type {\n VisitorSearchResultPresentation,\n VisitorCollectionResultPresentation,\n VisitorEntityResultPresentation,\n VisitorSignatureResultPresentation,\n VisitorToolInputResultPresentation,\n VisitorToolResultPresentation,\n} from \"./lib/tool-result\";\n\ntype PersistedToolResult =\n | VisitorSearchResultPresentation\n | VisitorToolResultPresentation\n | VisitorEntityResultPresentation\n | VisitorCollectionResultPresentation\n | VisitorSignatureResultPresentation\n | VisitorToolInputResultPresentation;\n\nconst CONVERSATION_VERSION = 3;\n\nexport type PersistedAgentConversation = {\n messages: ConversationMessage[];\n pending: boolean;\n streamingText: string;\n toolSteps: ToolStep[];\n toolResults?: PersistedToolResult[];\n pendingInputs?: AgentInputRequest[];\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\" &&\n record.role !== \"visitor\" &&\n record.role !== \"human\") ||\n typeof record.text !== \"string\" ||\n typeof record.createdAt !== \"number\" ||\n !Number.isFinite(record.createdAt)\n ) {\n return null;\n }\n if (record.role === \"human\") {\n const person = record.representative;\n if (\n typeof person !== \"object\" ||\n person === null ||\n !(\"id\" in person) ||\n !(\"name\" in person) ||\n typeof person.id !== \"string\" ||\n typeof person.name !== \"string\"\n )\n return null;\n return {\n id: record.id,\n role: \"human\",\n text: record.text,\n createdAt: record.createdAt,\n representative: { id: person.id, name: person.name },\n };\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 const searchResults = Array.isArray(record.searchResults)\n ? record.searchResults.flatMap((value) => {\n const result = parseToolResult(value);\n return result?.kind === \"search\" ? [result] : [];\n })\n : [];\n const toolResults = Array.isArray(record.toolResults)\n ? record.toolResults.flatMap((value) => {\n const result = parseToolResult(value);\n return result && result.kind !== \"search\" && result.kind !== \"input\" ? [result] : [];\n })\n : [];\n return {\n id: record.id,\n role: \"agent\",\n ...(searchResults.length ? { searchResults } : {}),\n ...(toolResults.length ? { toolResults } : {}),\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 record.kind !== \"tool\") ||\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\nfunction parseInputOption(value: unknown): AgentInputOption | null {\n if (typeof value !== \"object\" || value === null) return null;\n const record = value as Record<string, unknown>;\n if (typeof record.id !== \"string\" || typeof record.label !== \"string\") {\n return null;\n }\n return {\n id: record.id,\n label: record.label,\n ...(typeof record.description === \"string\"\n ? { description: record.description }\n : {}),\n ...(record.style === \"default\" ||\n record.style === \"primary\" ||\n record.style === \"danger\"\n ? { style: record.style }\n : {}),\n };\n}\n\nfunction parseInputRequest(value: unknown): AgentInputRequest | null {\n if (typeof value !== \"object\" || value === null) return null;\n const record = value as Record<string, unknown>;\n if (\n typeof record.requestId !== \"string\" ||\n (record.kind !== \"question\" &&\n record.kind !== \"session-limit\" &&\n record.kind !== \"tool-approval\") ||\n typeof record.prompt !== \"string\"\n ) {\n return null;\n }\n const action = record.action;\n if (typeof action !== \"object\" || action === null) return null;\n const actionRecord = action as Record<string, unknown>;\n if (\n typeof actionRecord.callId !== \"string\" ||\n actionRecord.kind !== \"tool-call\" ||\n typeof actionRecord.toolName !== \"string\"\n ) {\n return null;\n }\n const options = Array.isArray(record.options)\n ? record.options.map(parseInputOption)\n : undefined;\n if (\n Array.isArray(record.options) &&\n options?.some((option) => option === null)\n ) {\n return null;\n }\n const ui = record.ui ? parseAgentToolUiSurface(record.ui) : undefined;\n if (record.ui && !ui) return null;\n\n return {\n requestId: record.requestId,\n kind: record.kind,\n prompt: record.prompt,\n action: {\n callId: actionRecord.callId,\n kind: \"tool-call\",\n toolName: actionRecord.toolName,\n },\n ...(record.display === \"confirmation\" ||\n record.display === \"select\" ||\n record.display === \"text\"\n ? { display: record.display }\n : {}),\n ...(record.allowFreeform === true ? { allowFreeform: true } : {}),\n ...(options && options.length > 0\n ? {\n options: options.filter(\n (option): option is AgentInputOption => option !== null,\n ),\n }\n : {}),\n ...(ui ? { ui } : {}),\n };\n}\n\nfunction parseResultDetails(value: unknown) {\n if (!Array.isArray(value)) return [];\n return value.slice(0, 6).flatMap((item) => {\n if (typeof item !== \"object\" || item === null) return [];\n const detail = item as Record<string, unknown>;\n if (typeof detail.label !== \"string\" || typeof detail.value !== \"string\") return [];\n return [{ label: detail.label.slice(0, 240), value: detail.value.slice(0, 240) }];\n });\n}\n\nfunction parseToolResult(value: unknown): PersistedToolResult | 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 typeof record.toolName !== \"string\" ||\n (record.status !== \"completed\" &&\n record.status !== \"failed\" &&\n record.status !== \"rejected\")\n ) {\n return null;\n }\n if (\n record.kind === \"search\" &&\n record.toolName === \"search_discovery\" &&\n record.status === \"completed\"\n ) {\n const references = parseAgentSearchReferences(record);\n return references\n ? {\n id: record.id,\n toolName: \"search_discovery\",\n status: \"completed\",\n kind: \"search\",\n ...references,\n }\n : null;\n }\n if (record.kind === \"input\") {\n const surface = parseAgentToolUiSurface(\n record.surface,\n ) as AgentToolUiSurface | null;\n return surface\n ? {\n id: record.id,\n toolName: record.toolName,\n status: record.status,\n kind: \"input\",\n surface,\n }\n : null;\n }\n if (record.kind === \"entity\" && typeof record.title === \"string\") {\n return {\n id: record.id,\n toolName: record.toolName,\n status: record.status,\n kind: \"entity\",\n title: record.title,\n details: parseResultDetails(record.details),\n ...(typeof record.description === \"string\"\n ? { description: record.description }\n : {}),\n };\n }\n if (\n record.kind === \"collection\" &&\n typeof record.title === \"string\" &&\n Array.isArray(record.items)\n ) {\n return {\n id: record.id,\n toolName: record.toolName,\n status: record.status,\n kind: \"collection\",\n title: record.title,\n items: record.items.flatMap((item) => {\n if (typeof item !== \"object\" || item === null) return [];\n const entry = item as Record<string, unknown>;\n if (typeof entry.title !== \"string\") return [];\n return [\n {\n title: entry.title,\n ...(typeof entry.description === \"string\"\n ? { description: entry.description }\n : {}),\n ...(typeof entry.href === \"string\" ? { href: entry.href } : {}),\n },\n ];\n }),\n };\n }\n if (record.kind === \"signature\" && typeof record.title === \"string\") {\n return {\n id: record.id,\n toolName: record.toolName,\n status: record.status,\n kind: \"signature\",\n title: record.title,\n ...(typeof record.description === \"string\"\n ? { description: record.description }\n : {}),\n ...(typeof record.statusLabel === \"string\"\n ? { statusLabel: record.statusLabel }\n : {}),\n };\n }\n if (record.kind !== \"summary\" || typeof record.title !== \"string\")\n return null;\n return {\n id: record.id,\n toolName: record.toolName,\n status: record.status,\n kind: \"summary\",\n title: record.title,\n details: parseResultDetails(record.details),\n ...(typeof record.description === \"string\"\n ? { description: record.description }\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(\n conversationKey(storageKeyPrefix, visitorSessionId),\n );\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 &&\n record.version !== 2 &&\n 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 === 2 || record.version === CONVERSATION_VERSION) &&\n Array.isArray(record.toolSteps)\n ? record.toolSteps\n : [];\n const toolSteps = storedToolSteps.map(parseToolStep);\n if (toolSteps.some((step) => step === null)) return null;\n const storedToolResults =\n record.version === CONVERSATION_VERSION &&\n Array.isArray(record.toolResults)\n ? record.toolResults\n : [];\n const toolResults = storedToolResults.map(parseToolResult);\n if (toolResults.some((result) => result === null)) return null;\n const storedPendingInputs = Array.isArray(record.pendingInputs)\n ? record.pendingInputs\n : [];\n const pendingInputs = storedPendingInputs.map(parseInputRequest);\n if (pendingInputs.some((request) => request === null)) return null;\n return {\n messages: messages.filter(\n (message): message is ConversationMessage => message !== null,\n ),\n pending: record.pending,\n streamingText: record.streamingText,\n toolSteps: toolSteps.filter((step): step is ToolStep => step !== null),\n ...(Array.isArray(record.toolResults)\n ? {\n toolResults: toolResults.filter(\n (result): result is PersistedToolResult => result !== null,\n ),\n }\n : {}),\n ...(pendingInputs.length > 0\n ? {\n pendingInputs: pendingInputs.filter(\n (request): request is AgentInputRequest => request !== null,\n ),\n }\n : {}),\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(\n conversationKey(storageKeyPrefix, visitorSessionId),\n );\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(\n pendingBookingKey(storageKeyPrefix, visitorSessionId),\n );\n}\n","import type { VisitorSearchResultPresentation } from \"./tool-result\";\nimport type {\n AgentInputRequest,\n AgentInputResponse,\n} from \"../../runtime/types\";\nimport type { ConversationMessage } from \"../types/conversation\";\n\nexport function shouldRenderVisitorInputCard(\n request: AgentInputRequest,\n): boolean {\n if (request.ui) return true;\n if (request.kind === \"tool-approval\" || request.kind === \"session-limit\") {\n return true;\n }\n if (request.kind === \"question\") {\n return (request.options?.length ?? 0) > 0;\n }\n return false;\n}\n\nexport function isChatCollectibleInputRequest(\n request: AgentInputRequest,\n): boolean {\n return request.kind === \"question\" && (request.options?.length ?? 0) === 0;\n}\n\nexport function appendChatCollectiblePrompts(\n messages: readonly ConversationMessage[],\n requests: readonly AgentInputRequest[],\n): ConversationMessage[] {\n const next = [...messages];\n for (const request of requests.filter(isChatCollectibleInputRequest)) {\n const prompt = request.prompt.trim();\n if (!prompt) continue;\n const last = next.at(-1);\n if (last?.role === \"agent\" && last.text.trim() === prompt) continue;\n next.push({\n id: `agent-input-${request.requestId}`,\n role: \"agent\",\n text: prompt,\n createdAt: Date.now(),\n });\n }\n return next;\n}\n\nexport function chatInputResponseForText(\n requests: readonly AgentInputRequest[],\n text: string,\n): AgentInputResponse | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n const pending = requests.find(isChatCollectibleInputRequest);\n if (!pending) return null;\n return { requestId: pending.requestId, text: trimmed };\n}\n\nfunction normalizeAssistantDedupeKey(text: string) {\n return text.trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nexport function isNearDuplicateAssistantText(left: string, right: string) {\n const a = normalizeAssistantDedupeKey(left);\n const b = normalizeAssistantDedupeKey(right);\n if (!a || !b) return false;\n if (a === b) return true;\n const shorter = a.length <= b.length ? a : b;\n const longer = a.length <= b.length ? b : a;\n if (shorter.length < 40) return false;\n return longer.startsWith(\n shorter.slice(0, Math.floor(shorter.length * 0.85)),\n );\n}\n\nexport function appendAgentTurnMessage(\n messages: readonly ConversationMessage[],\n displayText: string,\n searchResults: VisitorSearchResultPresentation[] = [],\n toolResults: Extract<ConversationMessage, { role: \"agent\" }>[\"toolResults\"] = [],\n): ConversationMessage[] {\n const trimmed = displayText.trim();\n if (!trimmed && searchResults.length === 0 && toolResults.length === 0) return [...messages];\n const agentMessage: ConversationMessage = {\n id: `agent-${Date.now()}`,\n role: \"agent\",\n text: trimmed,\n ...(searchResults.length ? { searchResults } : {}),\n ...(toolResults.length ? { toolResults } : {}),\n createdAt: Date.now(),\n };\n const last = messages.at(-1);\n if (\n last?.role === \"agent\" &&\n (last.id.startsWith(\"agent-input-\") ||\n isNearDuplicateAssistantText(last.text, trimmed))\n ) {\n return [...messages.slice(0, -1), agentMessage];\n }\n return [...messages, agentMessage];\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","type AgentPanelController = {\n open: () => void;\n close: () => void;\n reset: () => void;\n submit: (\n message: string,\n options?: AgentPanelSubmitOptions,\n ) => Promise<string | null>;\n};\n\nexport type AgentPanelSubmitOptions = {\n runtimeText?: string;\n declinedComposerFormId?: string;\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\nexport function resetAgentPanel(customerId: string) {\n controllers.get(customerId)?.reset();\n}\n\nexport function submitAgentPanel(\n customerId: string,\n message: string,\n options?: AgentPanelSubmitOptions,\n) {\n const controller = controllers.get(customerId);\n if (!controller) {\n return Promise.reject(\n new Error(`Agent panel \"${customerId}\" is not mounted.`),\n );\n }\n return controller.submit(message, options);\n}\n","import type { BookingOffer } from \"../lib/tool-card\";\nimport type { AgentInputRequest } from \"../../runtime/types\";\nimport type {\n VisitorSearchResultPresentation,\n VisitorCollectionResultPresentation,\n VisitorEntityResultPresentation,\n VisitorSignatureResultPresentation,\n VisitorToolInputResultPresentation,\n VisitorToolResultPresentation,\n} from \"../lib/tool-result\";\n\nexport type ToolStepState = \"completed\" | \"active\" | \"pending\" | \"error\";\n\nexport type AgentMessageFeedback = \"positive\" | \"negative\";\n\nexport type ToolStep = {\n id: string;\n kind: \"planning\" | \"search\" | \"specialist\" | \"tool\";\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: \"human\";\n text: string;\n createdAt: number;\n representative: { id: string; name: string };\n }\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 searchResults?: VisitorSearchResultPresentation[];\n toolReceipts?: string[];\n toolResults?: (\n | VisitorToolResultPresentation\n | VisitorEntityResultPresentation\n | VisitorCollectionResultPresentation\n | VisitorSignatureResultPresentation\n )[];\n streaming?: boolean;\n };\n\nexport type AgentRailPhase =\n | \"idle\"\n | \"thinking\"\n | \"running-tools\"\n | \"waiting-input\"\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 pendingInputs?: AgentInputRequest[];\n toolResults?: (\n | VisitorSearchResultPresentation\n | VisitorToolResultPresentation\n | VisitorEntityResultPresentation\n | VisitorCollectionResultPresentation\n | VisitorSignatureResultPresentation\n | VisitorToolInputResultPresentation\n )[];\n error: string | null;\n declinedComposerFormIds?: string[];\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 onBrand: 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: \"#6b7280\",\n border: \"rgb(42 51 70 / 0.1)\",\n visitorBubble: \"#f3edff\",\n visitorText: \"#171b2a\",\n onBrand: \"#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: \"#2b2140\",\n visitorText: \"#f5f7fb\",\n onBrand: \"#171b2a\",\n success: \"#55cf91\",\n danger: \"#ff8da1\",\n};\n","import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { AgentMessageFeedback, ToolStep } from \"../../types/conversation\";\nimport {\n isSpeechSupported,\n stopSpeech,\n subscribeSpeechInterrupts,\n toSpeechText,\n} from \"../../lib/speech\";\nimport { useAgentRailMenuPortalRoot } from \"../AgentRail/AgentRailOverlayContext\";\nimport \"./MessageActions.css\";\n\nexport type { AgentMessageFeedback };\n\nfunction CopyIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect\n x=\"5.75\"\n y=\"5.75\"\n width=\"7.5\"\n height=\"7.5\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M10.25 5.25V4.5a1.75 1.75 0 0 0-1.75-1.75h-4A1.75 1.75 0 0 0 2.75 4.5v4c0 .97.78 1.75 1.75 1.75h.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3.5 8.5l3 3 6-7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ThumbUpIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4.67 6.67v8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M10 3.92 9.33 6.67h3.89a1.33 1.33 0 0 1 1.28 1.7l-1.55 5.33a1.33 1.33 0 0 1-1.28.97H2.67a1.33 1.33 0 0 1-1.34-1.34V8a1.33 1.33 0 0 1 1.34-1.33h1.84a1.33 1.33 0 0 0 1.19-.74L8 1.33a2.09 2.09 0 0 1 2 2.59Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ThumbDownIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <g transform=\"rotate(180 8 8)\">\n <path\n d=\"M4.67 6.67v8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M10 3.92 9.33 6.67h3.89a1.33 1.33 0 0 1 1.28 1.7l-1.55 5.33a1.33 1.33 0 0 1-1.28.97H2.67a1.33 1.33 0 0 1-1.34-1.34V8a1.33 1.33 0 0 1 1.34-1.33h1.84a1.33 1.33 0 0 0 1.19-.74L8 1.33a2.09 2.09 0 0 1 2 2.59Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n </svg>\n );\n}\n\nfunction RegenerateIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 8a6 6 0 0 1 6-6 6.5 6.5 0 0 1 4.5 1.83L14 5.33\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M14 2v3.33h-3.33\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 8a6 6 0 0 1-6 6 6.5 6.5 0 0 1-4.5-1.83L2 10.67\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M5.33 10.67H2V14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction MoreIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"3.5\" cy=\"8\" r=\"1.15\" fill=\"currentColor\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.15\" fill=\"currentColor\" />\n <circle cx=\"12.5\" cy=\"8\" r=\"1.15\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction SourcesIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8 4.5C6.9 3.4 5.3 3 3.5 3c-.4 0-.8 0-1.2.1-.3 0-.5.3-.5.6v8.1c0 .4.4.7.8.6.3-.1.7-.1 1.1-.1 1.6 0 3.2.4 4.3 1.3 1.1-.9 2.7-1.3 4.3-1.3.4 0 .8 0 1.1.1.4.1.8-.2.8-.6V3.7c0-.3-.2-.6-.5-.6-.4-.1-.8-.1-1.2-.1-1.8 0-3.4.4-4.5 1.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8 4.5v9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction ReadAloudIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8.5 3.8 5.8 6H3.5c-.6 0-1 .4-1 1v2c0 .6.4 1 1 1h2.3l2.7 2.2c.4.3 1 0 1-.5V4.3c0-.5-.6-.8-1-.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M11 6.2c.5.5.8 1.1.8 1.8s-.3 1.3-.8 1.8M12.8 4.5c.9.8 1.4 2 1.4 3.5s-.5 2.7-1.4 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction StopIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect\n x=\"4\"\n y=\"4\"\n width=\"8\"\n height=\"8\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n );\n}\n\nasync function writeToClipboard(text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n textarea.remove();\n }\n}\n\nfunction formatAnsweredAt(answeredAt: number): string | null {\n if (!answeredAt) return null;\n const date = new Date(answeredAt);\n if (Number.isNaN(date.getTime())) return null;\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n }).format(date);\n}\n\ntype MenuPosition = {\n left: number;\n top: number;\n};\n\nfunction resolveMenuPosition(input: {\n button: DOMRect;\n menuHeight: number;\n menuWidth: number;\n rail: DOMRect | null;\n}): MenuPosition {\n const padding = 8;\n const { button, menuHeight, menuWidth, rail } = input;\n\n if (!rail) {\n return {\n left: button.left,\n top: button.top - menuHeight - 6,\n };\n }\n\n let left = button.left - rail.left;\n let top = button.top - rail.top - menuHeight - 6;\n\n left = Math.min(\n Math.max(left, padding),\n rail.width - menuWidth - padding,\n );\n\n if (top < padding) {\n top = button.bottom - rail.top + 6;\n }\n\n top = Math.min(top, rail.height - menuHeight - padding);\n\n return { left, top };\n}\n\nexport function MessageActions({\n answeredAt,\n copyText,\n disabled = false,\n onOpenReceipt,\n onRegenerate,\n onFeedback,\n readAloud = false,\n receiptSteps,\n speechText,\n}: {\n answeredAt?: number;\n copyText: string;\n disabled?: boolean;\n onOpenReceipt?: () => void;\n onRegenerate?: () => void;\n onFeedback?: (rating: AgentMessageFeedback) => void;\n readAloud?: boolean;\n receiptBrandLabel?: string;\n receiptSteps?: ToolStep[];\n speechText?: string;\n}) {\n const menuPortalRoot = useAgentRailMenuPortalRoot();\n const [copied, setCopied] = useState(false);\n const [rating, setRating] = useState<AgentMessageFeedback | null>(null);\n const [menuOpen, setMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState<MenuPosition | null>(null);\n const [speaking, setSpeaking] = useState(false);\n const [speechSupported, setSpeechSupported] = useState<boolean | null>(null);\n const copyTimerRef = useRef<number | null>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const portaledMenuRef = useRef<HTMLDivElement>(null);\n const moreButtonRef = useRef<HTMLButtonElement>(null);\n\n const answeredLabel = formatAnsweredAt(answeredAt ?? 0);\n const resolvedSpeechText = speechText ?? toSpeechText(copyText);\n const canOpenReceipt = Boolean(receiptSteps) && Boolean(onOpenReceipt);\n const readAloudEligible = Boolean(readAloud && resolvedSpeechText);\n const canReadAloud = readAloudEligible && speechSupported === true;\n const showMenu =\n canOpenReceipt ||\n (speechSupported === null ? readAloudEligible : canReadAloud);\n\n useLayoutEffect(() => {\n setSpeechSupported(isSpeechSupported());\n }, []);\n\n useLayoutEffect(() => {\n if (!menuOpen || !moreButtonRef.current || !portaledMenuRef.current) {\n setMenuPosition(null);\n return;\n }\n\n const button = moreButtonRef.current.getBoundingClientRect();\n const menu = portaledMenuRef.current;\n const rail = menuPortalRoot?.current?.getBoundingClientRect() ?? null;\n\n setMenuPosition(\n resolveMenuPosition({\n button,\n menuHeight: menu.offsetHeight,\n menuWidth: menu.offsetWidth || 190,\n rail,\n }),\n );\n }, [menuOpen, menuPortalRoot]);\n\n useEffect(() => {\n const unsubscribe = subscribeSpeechInterrupts(() => setSpeaking(false));\n return () => {\n unsubscribe();\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n }\n stopSpeech();\n };\n }, []);\n\n useEffect(() => {\n if (!menuOpen) return;\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (\n !menuRef.current?.contains(target) &&\n !portaledMenuRef.current?.contains(target)\n ) {\n setMenuOpen(false);\n }\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n event.stopPropagation();\n setMenuOpen(false);\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [menuOpen]);\n\n function handleCopy() {\n void writeToClipboard(copyText);\n setCopied(true);\n if (copyTimerRef.current !== null) {\n window.clearTimeout(copyTimerRef.current);\n }\n copyTimerRef.current = window.setTimeout(() => setCopied(false), 1600);\n }\n\n function handleFeedback(next: AgentMessageFeedback) {\n const resolved = rating === next ? null : next;\n setRating(resolved);\n if (resolved) onFeedback?.(resolved);\n }\n\n function handleReadAloud() {\n if (!canReadAloud) return;\n setMenuOpen(false);\n if (speaking) {\n stopSpeech();\n setSpeaking(false);\n return;\n }\n const utterance = new SpeechSynthesisUtterance(resolvedSpeechText);\n utterance.onend = () => setSpeaking(false);\n utterance.onerror = () => setSpeaking(false);\n stopSpeech();\n window.speechSynthesis.speak(utterance);\n setSpeaking(true);\n }\n\n const menu = menuOpen ? (\n <div\n className=\"agent-message-actions__menu agent-message-actions__menu--portal\"\n ref={portaledMenuRef}\n role=\"menu\"\n style={\n menuPosition\n ? {\n left: `${menuPosition.left}px`,\n top: `${menuPosition.top}px`,\n }\n : { visibility: \"hidden\" }\n }\n >\n {answeredLabel ? (\n <p className=\"agent-message-actions__menu-meta\">\n Answered {answeredLabel}\n </p>\n ) : null}\n {canOpenReceipt ? (\n <button\n type=\"button\"\n className=\"agent-message-actions__menu-item\"\n role=\"menuitem\"\n onClick={() => {\n setMenuOpen(false);\n onOpenReceipt?.();\n }}\n >\n <SourcesIcon />\n How this answer was made\n </button>\n ) : null}\n {canReadAloud ? (\n <button\n type=\"button\"\n className=\"agent-message-actions__menu-item\"\n role=\"menuitem\"\n onClick={handleReadAloud}\n >\n {speaking ? <StopIcon /> : <ReadAloudIcon />}\n {speaking ? \"Stop reading\" : \"Read aloud\"}\n </button>\n ) : null}\n </div>\n ) : null;\n\n return (\n <div className=\"agent-message-actions\" aria-label=\"Answer actions\">\n <button\n type=\"button\"\n className={`agent-message-actions__button${\n copied ? \" is-copied\" : \"\"\n }`}\n aria-label={copied ? \"Copied\" : \"Copy answer\"}\n title={copied ? \"Copied\" : \"Copy answer\"}\n disabled={disabled}\n onClick={handleCopy}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n <button\n type=\"button\"\n className={`agent-message-actions__button${\n rating === \"positive\" ? \" is-active\" : \"\"\n }`}\n aria-label=\"Good answer\"\n aria-pressed={rating === \"positive\"}\n title=\"Good answer\"\n disabled={disabled}\n onClick={() => handleFeedback(\"positive\")}\n >\n <ThumbUpIcon />\n </button>\n <button\n type=\"button\"\n className={`agent-message-actions__button${\n rating === \"negative\" ? \" is-active\" : \"\"\n }`}\n aria-label=\"Bad answer\"\n aria-pressed={rating === \"negative\"}\n title=\"Bad answer\"\n disabled={disabled}\n onClick={() => handleFeedback(\"negative\")}\n >\n <ThumbDownIcon />\n </button>\n {onRegenerate ? (\n <button\n type=\"button\"\n className=\"agent-message-actions__button\"\n aria-label=\"Regenerate answer\"\n title=\"Regenerate answer\"\n disabled={disabled}\n onClick={onRegenerate}\n >\n <RegenerateIcon />\n </button>\n ) : null}\n {showMenu ? (\n <div className=\"agent-message-actions__more\" ref={menuRef}>\n <button\n ref={moreButtonRef}\n type=\"button\"\n className={`agent-message-actions__button${\n menuOpen ? \" is-menu-open\" : \"\"\n }`}\n aria-label=\"More actions\"\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n title=\"More actions\"\n disabled={disabled}\n onClick={() => setMenuOpen((open) => !open)}\n >\n <MoreIcon />\n </button>\n {menuPortalRoot?.current && menu\n ? createPortal(menu, menuPortalRoot.current)\n : menu}\n </div>\n ) : null}\n </div>\n );\n}\n","import { hideToolCardFences } from \"./tool-card\";\n\n/** Flatten markdown answer text into plain prose suitable for speech synthesis. */\nexport function toSpeechText(text: string): string {\n let out = hideToolCardFences(text);\n out = out.replace(/```[\\s\\S]*?```/g, \" \"); // code fences read poorly aloud\n out = out.replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\"); // images → alt text\n out = out.replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, \"$1\"); // links → link text\n out = out.replace(/^\\s{0,3}#{1,6}\\s+/gm, \"\"); // heading markers\n out = out.replace(/(\\*\\*|__)(.*?)\\1/g, \"$2\"); // bold\n out = out.replace(/(\\*|_)(.*?)\\1/g, \"$2\"); // italic\n out = out.replace(/~~(.*?)~~/g, \"$1\"); // strikethrough\n out = out.replace(/`([^`]*)`/g, \"$1\"); // inline code\n out = out.replace(/^\\s*>\\s?/gm, \"\"); // blockquotes\n out = out.replace(/^\\s*[-*+]\\s+/gm, \"\"); // unordered list markers\n out = out.replace(/^\\s*\\d+\\.\\s+/gm, \"\"); // ordered list markers\n out = out.replace(/\\|/g, \" \"); // table pipes\n out = out.replace(/^\\s*[-:]{3,}\\s*$/gm, \" \"); // table dividers / rules\n out = out.replace(/\\s*\\n\\s*/g, \". \"); // line breaks become pauses\n out = out.replace(/(?:\\.\\s*){2,}/g, \". \"); // collapse repeated pauses\n return out.replace(/\\s{2,}/g, \" \").trim();\n}\n\nexport function isSpeechSupported(): boolean {\n return (\n typeof window !== \"undefined\" &&\n \"speechSynthesis\" in window &&\n typeof window.SpeechSynthesisUtterance === \"function\"\n );\n}\n\nexport function stopSpeech() {\n if (!isSpeechSupported()) return;\n window.speechSynthesis.cancel();\n}\n\ntype HistoryMethod = typeof history.pushState;\ntype HistoryMethodName = \"pushState\" | \"replaceState\";\n\nconst speechInterruptListeners = new Set<() => void>();\nlet pageListenersAttached = false;\nlet lastPathname = \"\";\nlet originalPushState: HistoryMethod | null = null;\nlet originalReplaceState: HistoryMethod | null = null;\nlet patchedPushState: HistoryMethod | null = null;\nlet patchedReplaceState: HistoryMethod | null = null;\n\nfunction currentPathname() {\n return window.location.pathname;\n}\n\nfunction notifySpeechInterrupts() {\n if (speechInterruptListeners.size === 0) return;\n stopSpeech();\n for (const listener of speechInterruptListeners) {\n listener();\n }\n}\n\nfunction interruptIfPathChanged(nextPath: string) {\n if (nextPath === lastPathname) return;\n lastPathname = nextPath;\n notifySpeechInterrupts();\n}\n\nfunction patchHistoryMethod(original: HistoryMethod): HistoryMethod {\n return function patched(\n this: History,\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ) {\n const result = original.call(this, data, unused, url);\n interruptIfPathChanged(currentPathname());\n return result;\n };\n}\n\nfunction historyMethodState(name: HistoryMethodName) {\n return name === \"pushState\"\n ? {\n original: originalPushState,\n patched: patchedPushState,\n set(original: HistoryMethod | null, patched: HistoryMethod | null) {\n originalPushState = original;\n patchedPushState = patched;\n },\n }\n : {\n original: originalReplaceState,\n patched: patchedReplaceState,\n set(original: HistoryMethod | null, patched: HistoryMethod | null) {\n originalReplaceState = original;\n patchedReplaceState = patched;\n },\n };\n}\n\nfunction patchHistoryNamed(name: HistoryMethodName) {\n const state = historyMethodState(name);\n const current = history[name];\n if (state.patched && current === state.patched) return;\n const patched = patchHistoryMethod(current);\n state.set(current, patched);\n history[name] = patched;\n}\n\nfunction restoreHistoryMethod(name: HistoryMethodName) {\n const state = historyMethodState(name);\n if (!state.patched || !state.original || typeof history === \"undefined\") {\n return false;\n }\n if (history[name] !== state.patched) return false;\n history[name] = state.original;\n state.set(null, null);\n return true;\n}\n\nfunction handlePageHide() {\n notifySpeechInterrupts();\n}\n\nfunction handlePopState() {\n interruptIfPathChanged(currentPathname());\n}\n\nfunction handleVisibilityChange() {\n if (document.visibilityState === \"hidden\") {\n notifySpeechInterrupts();\n }\n}\n\nfunction attachPageListeners() {\n if (pageListenersAttached || typeof window === \"undefined\") return;\n pageListenersAttached = true;\n window.addEventListener(\"pagehide\", handlePageHide);\n window.addEventListener(\"popstate\", handlePopState);\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n}\n\nfunction detachPageListeners() {\n if (!pageListenersAttached || typeof window === \"undefined\") return;\n window.removeEventListener(\"pagehide\", handlePageHide);\n window.removeEventListener(\"popstate\", handlePopState);\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n pageListenersAttached = false;\n}\n\nfunction ensureSpeechInterruptsPatched() {\n if (typeof window === \"undefined\") return;\n lastPathname = currentPathname();\n patchHistoryNamed(\"pushState\");\n patchHistoryNamed(\"replaceState\");\n attachPageListeners();\n}\n\nfunction teardownSpeechInterrupts() {\n detachPageListeners();\n restoreHistoryMethod(\"pushState\");\n restoreHistoryMethod(\"replaceState\");\n if (!patchedPushState && !patchedReplaceState) {\n lastPathname = \"\";\n }\n}\n\n/** Stop speech when the host page changes, hides, or unloads. */\nexport function subscribeSpeechInterrupts(onInterrupt: () => void) {\n if (typeof window === \"undefined\") return () => {};\n ensureSpeechInterruptsPatched();\n speechInterruptListeners.add(onInterrupt);\n return () => {\n speechInterruptListeners.delete(onInterrupt);\n if (speechInterruptListeners.size === 0) {\n teardownSpeechInterrupts();\n }\n };\n}\n\nexport function resetSpeechInterruptsForTests() {\n speechInterruptListeners.clear();\n detachPageListeners();\n if (typeof history !== \"undefined\") {\n restoreHistoryMethod(\"pushState\");\n restoreHistoryMethod(\"replaceState\");\n }\n originalPushState = null;\n originalReplaceState = null;\n patchedPushState = null;\n patchedReplaceState = null;\n lastPathname = \"\";\n}\n","import { createContext, useContext, type RefObject } from \"react\";\n\nexport type AgentRailPortalRoots = {\n railRef: RefObject<HTMLElement | null>;\n overlayRef: RefObject<HTMLDivElement | null>;\n};\n\nexport const AgentRailOverlayContext =\n createContext<AgentRailPortalRoots | null>(null);\n\nexport function useAgentRailPortalRoots() {\n return useContext(AgentRailOverlayContext);\n}\n\nexport function useAgentRailOverlayRoot() {\n return useContext(AgentRailOverlayContext)?.overlayRef ?? null;\n}\n\nexport function useAgentRailMenuPortalRoot() {\n return useContext(AgentRailOverlayContext)?.railRef ?? null;\n}\n","import type { useAgentHandoff } from \"../../hooks/useAgentHandoff\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n type AgentColorScheme,\n type AgentRailState,\n type AgentRailTheme,\n type ConversationMessage,\n} from \"../../types/conversation\";\nimport { agentThemeStyle } from \"../../lib/agent-theme\";\nimport { useAgentColorScheme } from \"../../hooks/useAgentColorScheme\";\nimport { AgentActivityBubble } from \"../AgentActivityBubble/AgentActivityBubble\";\nimport { ExploreMore } from \"../ExploreMore/ExploreMore\";\nimport {\n searchActionLinkTitle,\n searchActions,\n searchSources,\n searchSuggestions,\n} from \"../SearchReferences/SearchReferences\";\nimport { AnswerReceiptDialog } from \"../AnswerReceiptDialog/AnswerReceiptDialog\";\nimport { Composer } from \"../Composer/Composer\";\nimport { FollowUpChips } from \"../FollowUpChips/FollowUpChips\";\nimport { MessageBubble } from \"../MessageBubble/MessageBubble\";\nimport {\n MessageActions,\n type AgentMessageFeedback,\n} from \"../MessageActions/MessageActions\";\nimport { BookingCardLoader } from \"../BookingCard/BookingCard\";\nimport { snapBrandLogoDisplaySize } from \"../../lib/brand-logo-display\";\nimport { shouldRenderVisitorInputCard } from \"../../lib/visitor-input\";\nimport { HumanInputCard } from \"../HumanInputCard/HumanInputCard\";\nimport { LocationConsent } from \"../LocationConsent/LocationConsent\";\nimport { isLocationConsentRequest } from \"../../../runtime/location-consent\";\nimport {\n isRenderableVisitorToolResult,\n VisitorToolResultView,\n} from \"../VisitorToolResultView/VisitorToolResultView\";\nimport {\n extractToolCards,\n hideToolCardFences,\n looksLikeBookingReady,\n} from \"../../lib/tool-card\";\nimport { AgentRailOverlayContext } from \"./AgentRailOverlayContext\";\nimport { resolveComposerForm } from \"../../lib/composer-form\";\nimport type { AgentInputResponse } from \"../../../runtime/types\";\nimport type { AgentToolResultJsonValue } from \"../../../runtime/tool-result-envelope\";\nimport type { AgentToolUiSurface } from \"../../../runtime/tool-ui\";\nimport type { AgentPanelSubmitOptions } from \"../../panel-controller\";\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 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.86L21 8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M21 3v5h-5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\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\nfunction ChevronDownIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 6.5l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst DEFAULT_DISCLAIMER_LABEL =\n \"Agent can make mistakes. Check important info.\";\n\nexport type AgentRailProps = {\n state: AgentRailState;\n handoff?: ReturnType<typeof useAgentHandoff>;\n theme?: Partial<AgentRailTheme>;\n colorScheme?: AgentColorScheme;\n brandLabel?: string;\n brandLogoUrl?: string;\n poweredByLabel?: string;\n disclaimerLabel?: string | null | undefined;\n disclaimerLink?: string | null | undefined;\n answerReceipt?: boolean;\n readAloud?: boolean;\n showLearnMore?: boolean;\n showSources?: boolean;\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 onRegenerate?: () => void;\n onFeedback?: (\n rating: AgentMessageFeedback,\n message: ConversationMessage\n ) => void;\n onSubmit?: (message: string, options?: AgentPanelSubmitOptions) => void;\n onFollowUpSelect?: (label: string) => void;\n onBook?: (input: { displayText: string; runtimeText: string }) => void;\n onInputResponse?: (response: AgentInputResponse) => void;\n onToolInput?: (\n surface: AgentToolUiSurface,\n values: Record<string, AgentToolResultJsonValue>\n ) => void;\n};\n\nexport function AgentRail({\n state,\n handoff,\n theme,\n colorScheme = \"auto\",\n brandLabel = \"\",\n brandLogoUrl,\n poweredByLabel,\n disclaimerLabel,\n disclaimerLink,\n answerReceipt = false,\n readAloud = false,\n showLearnMore = true,\n showSources = true,\n composerPlaceholder = \"Ask anything…\",\n mobileFullscreen = false,\n expanded = false,\n onCollapse,\n onClose,\n onExpandToggle,\n onReset,\n onRetry,\n onRegenerate,\n onFeedback,\n onSubmit,\n onFollowUpSelect,\n onBook,\n onInputResponse,\n onToolInput,\n}: AgentRailProps) {\n const railRef = useRef<HTMLElement>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n const transcriptRef = useRef<HTMLDivElement>(null);\n const responseRef = useRef<HTMLDivElement>(null);\n const threadRef = useRef<HTMLDivElement>(null);\n const lastScrolledVisitorIdRef = useRef<string | undefined>(undefined);\n const pinnedToBottomRef = useRef(true);\n const smoothScrollToLatestRef = useRef(false);\n const lockedTranscriptScrollTopRef = useRef<number | null>(null);\n const [showJumpToLatest, setShowJumpToLatest] = useState(false);\n const [receiptOpen, setReceiptOpen] = useState(false);\n const [expandedSourcesMessageId, setExpandedSourcesMessageId] = useState<\n string | null\n >(null);\n const resolvedBrandLabel = brandLabel.trim();\n const resolvedBrandLogoUrl = brandLogoUrl?.trim();\n const resolvedDisclaimerLabel =\n disclaimerLabel === undefined ? DEFAULT_DISCLAIMER_LABEL : disclaimerLabel;\n const [failedLogoUrl, setFailedLogoUrl] = useState<string | null>(null);\n const [brandLogoDisplay, setBrandLogoDisplay] = useState<{\n height: number;\n url: string;\n wide: boolean;\n width: number;\n } | null>(null);\n useEffect(() => {\n setFailedLogoUrl(null);\n }, [resolvedBrandLogoUrl]);\n const activeBrandLogoDisplay =\n brandLogoDisplay?.url === resolvedBrandLogoUrl ? brandLogoDisplay : null;\n const wideBrandLogo = activeBrandLogoDisplay?.wide ?? false;\n const brandLogoDisplaySize = activeBrandLogoDisplay\n ? {\n height: activeBrandLogoDisplay.height,\n width: activeBrandLogoDisplay.width,\n }\n : null;\n const showBrandLogo =\n Boolean(resolvedBrandLogoUrl) && failedLogoUrl !== resolvedBrandLogoUrl;\n const resolvedColorScheme = useAgentColorScheme(colorScheme);\n const railStyle = agentThemeStyle(theme, resolvedColorScheme);\n\n const handoffActive = Boolean(handoff?.blocksAI);\n const handoffStatus = handoff?.page?.status;\n const locationRequest = handoffActive\n ? undefined\n : state.pendingInputs?.find(isLocationConsentRequest);\n const pendingInputRequests = (state.pendingInputs ?? []).filter(\n (request) =>\n !handoffActive &&\n !isLocationConsentRequest(request) &&\n shouldRenderVisitorInputCard(request) &&\n (!state.pendingOffer || request.kind === \"tool-approval\")\n );\n const isBusy =\n state.phase === \"thinking\" ||\n state.phase === \"running-tools\" ||\n state.phase === \"streaming\" ||\n (state.phase === \"waiting-input\" &&\n (pendingInputRequests.length > 0 || Boolean(locationRequest)));\n const semanticSurfaceDisabled =\n handoffActive || (isBusy && state.phase !== \"waiting-input\");\n\n const visitorToolResults = (state.toolResults ?? []).filter(\n isRenderableVisitorToolResult\n );\n const activeVisitorToolInput = [...visitorToolResults]\n .reverse()\n .find((result) => result.kind === \"input\");\n const visibleVisitorToolResults = activeVisitorToolInput\n ? [activeVisitorToolInput]\n : visitorToolResults;\n const activityActive = state.toolSteps.some(\n (step) => step.state === \"active\"\n );\n const showActivity =\n state.toolSteps.length > 0 &&\n pendingInputRequests.length === 0 &&\n !state.pendingOffer &&\n (activityActive || (isBusy && !state.streamingText));\n\n const activitySteps =\n activityActive || !isBusy || state.streamingText\n ? state.toolSteps\n : [\n ...state.toolSteps,\n {\n id: \"preparing-answer\",\n kind: \"tool\" as const,\n label: \"Preparing your answer\",\n detail: \"Preparing your answer\",\n state: \"active\" as const,\n },\n ];\n\n const hasVisitorMessages = state.messages.some(\n (message) => message.role === \"visitor\"\n );\n const hasAgentResponseAfterVisitor = state.messages.some(\n (message) => message.role === \"agent\" && message.id !== \"greeting\"\n );\n const showDisclaimerLabel =\n Boolean(resolvedDisclaimerLabel) &&\n hasVisitorMessages &&\n (hasAgentResponseAfterVisitor || Boolean(state.streamingText));\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 let lastAgentIndex = -1;\n for (let index = visibleMessages.length - 1; index >= 0; index -= 1) {\n if (visibleMessages[index]?.role === \"agent\") {\n lastAgentIndex = index;\n break;\n }\n }\n let lastVisitorIndex = -1;\n for (let index = visibleMessages.length - 1; index >= 0; index -= 1) {\n if (visibleMessages[index]?.role === \"visitor\") {\n lastVisitorIndex = index;\n break;\n }\n }\n const lastIsAgent = lastMessage?.role === \"agent\";\n const showMessageActions =\n !handoffActive &&\n state.phase === \"complete\" &&\n lastIsAgent &&\n hasVisitorMessages &&\n Boolean(hideToolCardFences(lastMessage.text).trim());\n const streamingMessage: ConversationMessage | null =\n state.streamingText && !lastIsAgent\n ? {\n createdAt: 0,\n id: \"streaming-response\",\n role: \"agent\" as const,\n streaming: isBusy,\n text: state.streamingText,\n searchResults: (state.toolResults ?? []).filter(\n (result) => result.kind === \"search\"\n ),\n }\n : state.pendingOffer && !lastIsAgent\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 const transcriptMessages = streamingMessage\n ? [...visibleMessages, streamingMessage]\n : visibleMessages;\n const bookingReadyText =\n state.streamingText ||\n (lastIsAgent && lastMessage?.role === \"agent\" ? lastMessage.text : \"\");\n const waitingForBooking =\n !state.pendingOffer &&\n looksLikeBookingReady(bookingReadyText) &&\n (state.phase === \"thinking\" ||\n state.phase === \"running-tools\" ||\n state.phase === \"streaming\");\n const lastAgentText =\n lastIsAgent && lastMessage?.role === \"agent\" ? lastMessage.text : \"\";\n const hasPendingConfirmation = pendingInputRequests.some(\n (request) =>\n request.kind === \"tool-approval\" ||\n (request.kind === \"question\" && (request.options?.length ?? 0) > 0)\n );\n const inferredComposerForm = resolveComposerForm({\n agentText: lastAgentText,\n cards: extractToolCards(lastAgentText),\n hasBookingOffer: Boolean(state.pendingOffer) || waitingForBooking,\n hasPendingConfirmation,\n enabled: lastIsAgent && !isBusy,\n });\n const declinedComposerFormIds = state.declinedComposerFormIds ?? [];\n const composerForm =\n inferredComposerForm &&\n lastMessage?.role === \"agent\" &&\n declinedComposerFormIds.includes(\n `${lastMessage.id}:${inferredComposerForm.id}`\n )\n ? null\n : inferredComposerForm;\n const latestResultId = [\n ...visibleMessages.flatMap((message) =>\n message.role === \"agent\" ? message.toolResults ?? [] : []\n ),\n ...visibleVisitorToolResults,\n ]\n .reverse()\n .find((result) => result.kind !== \"input\")?.id;\n const receiptSteps =\n answerReceipt && state.toolSteps.length > 0 ? state.toolSteps : undefined;\n\n const latestAgentMessage =\n lastAgentIndex >= 0 ? visibleMessages[lastAgentIndex] : undefined;\n const composerCtaActions =\n !handoffActive &&\n state.phase === \"complete\" &&\n latestAgentMessage?.role === \"agent\" &&\n !latestAgentMessage.streaming\n ? searchActions(latestAgentMessage.searchResults ?? [])\n : [];\n const showHandoffAction =\n Boolean(handoff?.page?.enabled) && handoffStatus === \"ai\";\n const composerActions = (\n <>\n {composerCtaActions.map((action) => (\n <a\n key={action.url}\n className=\"composer__action-badge\"\n href={action.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={searchActionLinkTitle(action.url)}\n >\n {action.label}\n </a>\n ))}\n {showHandoffAction && handoff ? (\n <button\n type=\"button\"\n className=\"composer__action-badge\"\n disabled={handoff.busy || handoff.hasPending || isBusy}\n title=\"Chat with a human representative\"\n onClick={() => void handoff.start()}\n >\n Talk to a person\n </button>\n ) : null}\n </>\n );\n\n useEffect(() => {\n if (state.phase !== \"complete\") {\n setReceiptOpen(false);\n }\n }, [state.phase]);\n\n useEffect(() => {\n if (state.phase !== \"complete\" || !showSources) {\n setExpandedSourcesMessageId(null);\n }\n }, [state.phase, showSources]);\n\n function handleSubmit(message: string, options?: AgentPanelSubmitOptions) {\n setReceiptOpen(false);\n setExpandedSourcesMessageId(null);\n onSubmit?.(message, options);\n }\n\n function handleRegenerate() {\n setReceiptOpen(false);\n setExpandedSourcesMessageId(null);\n onRegenerate?.();\n }\n\n function handleReset() {\n setReceiptOpen(false);\n setExpandedSourcesMessageId(null);\n onReset?.();\n }\n\n function handleFollowUpSelect(label: string) {\n setReceiptOpen(false);\n setExpandedSourcesMessageId(null);\n if (onFollowUpSelect) onFollowUpSelect(label);\n else onSubmit?.(label);\n }\n\n const latestVisitorId = visibleMessages[lastVisitorIndex]?.id;\n useEffect(() => {\n const node = transcriptRef.current;\n if (!node) return;\n if (latestVisitorId !== lastScrolledVisitorIdRef.current) {\n lastScrolledVisitorIdRef.current = latestVisitorId;\n pinnedToBottomRef.current = true;\n }\n const followResponse = () => {\n if (node.clientHeight === 0 || !pinnedToBottomRef.current) return;\n const bottom = Math.max(0, node.scrollHeight - node.clientHeight);\n const response = responseRef.current;\n const responseTop = response\n ? node.scrollTop +\n response.getBoundingClientRect().top -\n node.getBoundingClientRect().top\n : bottom;\n node.scrollTop = Math.max(node.scrollTop, Math.min(bottom, responseTop));\n const pinned = bottom - node.scrollTop < 48;\n pinnedToBottomRef.current = pinned;\n setShowJumpToLatest(!pinned);\n };\n followResponse();\n const observer = new ResizeObserver(followResponse);\n observer.observe(node);\n if (threadRef.current) observer.observe(threadRef.current);\n return () => observer.disconnect();\n }, [\n latestVisitorId,\n state.messages,\n state.toolSteps,\n state.streamingText,\n state.followUps,\n state.journey,\n ]);\n\n useEffect(() => {\n const node = transcriptRef.current;\n if (!node) return;\n const handleScroll = () => {\n if (node.clientHeight === 0) return;\n const distanceFromBottom =\n node.scrollHeight - node.scrollTop - node.clientHeight;\n const pinned = distanceFromBottom < 48 || smoothScrollToLatestRef.current;\n pinnedToBottomRef.current = pinned;\n setShowJumpToLatest(!pinned);\n };\n node.addEventListener(\"scroll\", handleScroll, { passive: true });\n handleScroll();\n return () => node.removeEventListener(\"scroll\", handleScroll);\n }, []);\n\n useEffect(() => {\n if (!receiptOpen) {\n lockedTranscriptScrollTopRef.current = null;\n return;\n }\n const node = transcriptRef.current;\n if (!node || lockedTranscriptScrollTopRef.current === null) return;\n node.scrollTop = lockedTranscriptScrollTopRef.current;\n }, [receiptOpen]);\n\n function openReceipt() {\n const node = transcriptRef.current;\n lockedTranscriptScrollTopRef.current = node?.scrollTop ?? null;\n setReceiptOpen(true);\n }\n\n function scrollToLatest() {\n const node = transcriptRef.current;\n if (!node) return;\n pinnedToBottomRef.current = true;\n setShowJumpToLatest(false);\n const reduceMotion = window.matchMedia(\n \"(prefers-reduced-motion: reduce)\"\n ).matches;\n if (reduceMotion) {\n node.scrollTo({ top: node.scrollHeight, behavior: \"instant\" });\n return;\n }\n smoothScrollToLatestRef.current = true;\n const settle = () => {\n smoothScrollToLatestRef.current = false;\n const distanceFromBottom =\n node.scrollHeight - node.scrollTop - node.clientHeight;\n const pinned = distanceFromBottom < 48;\n pinnedToBottomRef.current = pinned;\n setShowJumpToLatest(!pinned);\n };\n node.addEventListener(\"scrollend\", settle, { once: true });\n window.setTimeout(settle, 900);\n node.scrollTo({ top: node.scrollHeight, behavior: \"smooth\" });\n }\n\n return (\n <aside\n ref={railRef}\n className={`agent-rail not-typeset${\n mobileFullscreen ? \" agent-rail--mobile-fullscreen\" : \"\"\n }${expanded ? \" agent-rail--expanded\" : \"\"}${\n receiptOpen ? \" agent-rail--receipt-open\" : \"\"\n }`}\n data-not-typeset=\"\"\n data-color-scheme={resolvedColorScheme}\n spellCheck={false}\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 <AgentRailOverlayContext.Provider value={{ railRef, overlayRef }}>\n <div className=\"agent-rail__surface\" inert={receiptOpen || undefined}>\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\n className={`agent-rail__brand-mark${wideBrandLogo ? \" agent-rail__brand-mark--wide\" : \"\"}`}\n aria-hidden=\"true\"\n >\n <img\n key={resolvedBrandLogoUrl}\n className=\"agent-rail__brand-logo as-brand-logo-img\"\n src={resolvedBrandLogoUrl}\n alt=\"\"\n decoding=\"async\"\n {...(brandLogoDisplaySize\n ? {\n height: brandLogoDisplaySize.height,\n width: brandLogoDisplaySize.width,\n }\n : {})}\n onLoad={(event) => {\n const img = event.currentTarget;\n const display = snapBrandLogoDisplaySize({\n naturalHeight: img.naturalHeight,\n naturalWidth: img.naturalWidth,\n surface: \"header\",\n });\n if (!resolvedBrandLogoUrl) return;\n setBrandLogoDisplay({\n height: display.height,\n url: resolvedBrandLogoUrl,\n wide: display.wide,\n width: display.width,\n });\n }}\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={\n !hasVisitorMessages ||\n (handoffActive && !handoff?.canReset)\n }\n onClick={handleReset}\n >\n <NewChatIcon />\n </button>\n ) : null}\n {onExpandToggle ? (\n <button\n type=\"button\"\n className=\"agent-rail__expand\"\n aria-label={\n expanded ? \"Exit full screen\" : \"Open full screen\"\n }\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 ref={threadRef} className=\"agent-rail__thread\">\n {!hasVisitorMessages ? (\n <section className=\"agent-rail__welcome\" aria-label=\"Welcome\">\n {greeting?.role === \"agent\" ? (\n <MessageBubble\n showProvenance\n message={greeting}\n bookingDisabled={isBusy || handoffActive}\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 || handoffActive}\n label=\"Start here\"\n onSelect={(suggestion) =>\n handleFollowUpSelect(suggestion.label)\n }\n />\n </div>\n ) : null}\n {showActivity ? (\n <AgentActivityBubble\n brandLabel={resolvedBrandLabel}\n brandLogoUrl={\n showBrandLogo ? resolvedBrandLogoUrl : undefined\n }\n failed={state.phase === \"error\"}\n steps={activitySteps}\n />\n ) : null}\n {visibleVisitorToolResults.map((result) => (\n <VisitorToolResultView\n key={result.id}\n result={result}\n disabled={semanticSurfaceDisabled}\n onToolInput={onToolInput}\n />\n ))}\n {pendingInputRequests.slice(0, 1).map((request) => (\n <HumanInputCard\n key={request.requestId}\n request={request}\n onRespond={onInputResponse}\n />\n ))}\n </section>\n ) : null}\n\n {transcriptMessages.map((message, index) => {\n const messageResults =\n message.role === \"agent\" ? (message.searchResults ?? []) : [];\n const messageSourceCount = showSources\n ? searchSources(messageResults).length\n : 0;\n const messageQuestionCount =\n index === lastAgentIndex && showLearnMore && !handoffActive\n ? searchSuggestions(messageResults).length\n : 0;\n const showAnswerActions =\n message.role === \"agent\" &&\n index === lastAgentIndex &&\n showMessageActions;\n const showExploreToggle =\n message.role === \"agent\" &&\n state.phase === \"complete\" &&\n !message.streaming &&\n (messageSourceCount > 0 || messageQuestionCount > 0);\n return (\n <div\n key={\n message.role === \"agent\" &&\n transcriptMessages[index - 1]?.role === \"visitor\"\n ? `answer-${transcriptMessages[index - 1]?.id}`\n : message.id\n }\n ref={index === lastVisitorIndex + 1 ? responseRef : undefined}\n className=\"agent-rail__turn-block\"\n >\n {message.role === \"agent\"\n ? message.toolResults?.map((result) => (\n <VisitorToolResultView\n key={result.id}\n result={result}\n />\n ))\n : null}\n <MessageBubble\n showProvenance\n message={message}\n showSearchReferences={false}\n bookingDisabled={isBusy || handoffActive}\n brandLogoUrl={\n showBrandLogo ? resolvedBrandLogoUrl : undefined\n }\n offer={\n index === transcriptMessages.length - 1\n ? state.pendingOffer\n : undefined\n }\n onBook={onBook}\n />\n {showAnswerActions || showExploreToggle ? (\n <div className=\"agent-rail__answer-footer\">\n <div className=\"agent-rail__answer-actions\">\n {showAnswerActions ? (\n <MessageActions\n answeredAt={message.createdAt}\n copyText={\n hideToolCardFences(message.text).trim() ||\n message.text\n }\n readAloud={readAloud}\n receiptSteps={receiptSteps}\n onOpenReceipt={\n receiptSteps ? () => openReceipt() : undefined\n }\n onRegenerate={\n onRegenerate ? handleRegenerate : undefined\n }\n onFeedback={\n onFeedback\n ? (rating) => onFeedback(rating, message)\n : undefined\n }\n />\n ) : null}\n {showExploreToggle ? (\n <button\n className=\"agent-rail__sources-button\"\n type=\"button\"\n aria-expanded={\n expandedSourcesMessageId === message.id\n }\n aria-controls={`agent-rail-sources-${message.id}`}\n onClick={() =>\n setExpandedSourcesMessageId((current) =>\n current === message.id ? null : message.id\n )\n }\n >\n Explore more\n <span\n className=\"agent-rail__sources-button-chevron\"\n aria-hidden=\"true\"\n >\n <ChevronDownIcon />\n </span>\n </button>\n ) : null}\n </div>\n {showExploreToggle ? (\n <div\n id={`agent-rail-sources-${message.id}`}\n className={`agent-rail__sources-panel${\n expandedSourcesMessageId === message.id\n ? \" agent-rail__sources-panel--open\"\n : \"\"\n }`}\n role=\"region\"\n aria-label=\"Explore more\"\n >\n <div className=\"agent-rail__sources-panel-inner\">\n <ExploreMore\n results={message.searchResults ?? []}\n disabled={\n isBusy || !(onFollowUpSelect || onSubmit)\n }\n showLearnMore={\n showLearnMore &&\n index === lastAgentIndex &&\n !handoffActive\n }\n showSources={showSources}\n onSelectQuestion={handleFollowUpSelect}\n />\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n {index === lastVisitorIndex ? (\n <>\n {showActivity ? (\n <AgentActivityBubble\n brandLabel={resolvedBrandLabel}\n brandLogoUrl={\n showBrandLogo ? resolvedBrandLogoUrl : undefined\n }\n failed={state.phase === \"error\"}\n steps={activitySteps}\n />\n ) : null}\n {visibleVisitorToolResults.map((result) => (\n <VisitorToolResultView\n key={result.id}\n result={result}\n disabled={semanticSurfaceDisabled}\n onToolInput={onToolInput}\n />\n ))}\n {pendingInputRequests.slice(0, 1).map((request) => (\n <HumanInputCard\n key={request.requestId}\n request={request}\n onRespond={onInputResponse}\n />\n ))}\n </>\n ) : null}\n </div>\n );\n })}\n\n {waitingForBooking ? <BookingCardLoader /> : 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 {handoff &&\n (handoff.page?.enabled || handoffActive) &&\n handoffStatus !== \"ai\" ? (\n <div className=\"agent-rail__handoff\">\n {handoffStatus === \"human\" ||\n handoffStatus === \"queued\" ||\n handoffStatus === \"requesting\" ? (\n <span className=\"agent-rail__handoff-dot\" aria-hidden=\"true\" />\n ) : null}\n <p\n className=\"agent-rail__handoff-status\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {!handoff.page ? (\n \"Checking conversation…\"\n ) : handoffStatus === \"human\" ? (\n \"Connected with support\"\n ) : handoffStatus === \"queued\" ? (\n \"Waiting for a representative\"\n ) : handoffStatus === \"requesting\" ? (\n \"Connecting you to support…\"\n ) : handoffStatus === \"resolved\" ? (\n \"Your conversation with support has ended\"\n ) : handoffStatus === \"failed\" ? (\n \"We couldn’t connect you to support\"\n ) : (\n \"Need a person?\"\n )}\n </p>\n {handoffStatus === \"resolved\" ? (\n <button\n type=\"button\"\n className=\"agent-rail__handoff-action\"\n disabled={handoff.busy || handoff.hasPending}\n onClick={() => void handoff.returnToAI()}\n >\n Return to AI\n </button>\n ) : null}\n {handoffStatus === \"failed\" && onReset ? (\n <button\n type=\"button\"\n className=\"agent-rail__handoff-action\"\n disabled={!handoff.canReset}\n onClick={handleReset}\n >\n Start a new conversation\n </button>\n ) : null}\n {handoff.error ? (\n <span className=\"agent-rail__handoff-error\" role=\"alert\">\n {handoff.error}\n <button\n type=\"button\"\n className=\"agent-rail__handoff-action\"\n disabled={handoff.busy}\n onClick={() => void handoff.retry()}\n >\n Retry\n </button>\n </span>\n ) : null}\n </div>\n ) : null}\n <div className=\"agent-rail__composer-wrap\">\n <LocationConsent\n key={\n state.messages.find((message) => message.role === \"visitor\")\n ?.id ?? \"empty\"\n }\n request={locationRequest}\n onRespond={onInputResponse}\n />\n {showJumpToLatest ? (\n <button\n type=\"button\"\n className=\"agent-rail__jump-to-latest\"\n aria-label=\"Jump to the latest message\"\n title=\"Jump to the latest message\"\n onClick={scrollToLatest}\n >\n <ChevronDownIcon />\n </button>\n ) : null}\n <Composer\n key={`${\n state.messages.find((message) => message.role === \"visitor\")\n ?.id ?? \"empty\"\n }:${latestResultId ?? \"\"}`}\n actions={\n composerCtaActions.length > 0 || showHandoffAction\n ? composerActions\n : undefined\n }\n variant={expanded || mobileFullscreen ? \"dock\" : \"default\"}\n disabled={\n isBusy ||\n Boolean(handoff?.busy || handoff?.hasPending) ||\n (handoffActive &&\n ![\"requesting\", \"queued\", \"human\"].includes(\n handoffStatus ?? \"\"\n ))\n }\n form={\n !handoffActive && composerForm && lastMessage\n ? {\n ...composerForm,\n id: `${lastMessage.id}:${composerForm.id}`,\n }\n : null\n }\n allowFormResume={\n !handoffActive &&\n !state.pendingOffer &&\n !waitingForBooking &&\n !hasPendingConfirmation\n }\n placeholder={\n handoffActive ? \"Message support…\" : composerPlaceholder\n }\n onSubmit={handleSubmit}\n />\n {showDisclaimerLabel ? (\n <div className=\"agent-rail__disclaimer\">\n <p>\n {disclaimerLink ? (\n <a\n href={disclaimerLink}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n {resolvedDisclaimerLabel}\n </a>\n ) : (\n resolvedDisclaimerLabel\n )}\n </p>\n </div>\n ) : null}\n {poweredByLabel ? (\n <div className=\"agent-rail__footer\">\n <p>\n <span>{poweredByLabel}</span>\n </p>\n </div>\n ) : null}\n </div>\n </div>\n <div ref={overlayRef} className=\"agent-rail__overlay\" />\n {receiptOpen && receiptSteps ? (\n <AnswerReceiptDialog\n brandLabel={resolvedBrandLabel}\n onClose={() => setReceiptOpen(false)}\n steps={receiptSteps}\n />\n ) : null}\n </AgentRailOverlayContext.Provider>\n </aside>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport {\n defaultAgentRailTheme,\n defaultDarkAgentRailTheme,\n type AgentRailTheme,\n} from \"../types/conversation\";\n\nconst HEX_COLOR_PATTERN = /^#(?:[\\dA-Fa-f]{3}|[\\dA-Fa-f]{6})$/;\n\n/** CSS named colors, so luminance resolves without a DOM (SSR included). */\nconst NAMED_COLOR_HEX: Record<string, string> = Object.fromEntries(\n \"aliceblue:#f0f8ff,antiquewhite:#faebd7,aqua:#00ffff,aquamarine:#7fffd4,azure:#f0ffff,beige:#f5f5dc,bisque:#ffe4c4,black:#000000,blanchedalmond:#ffebcd,blue:#0000ff,blueviolet:#8a2be2,brown:#a52a2a,burlywood:#deb887,cadetblue:#5f9ea0,chartreuse:#7fff00,chocolate:#d2691e,coral:#ff7f50,cornflowerblue:#6495ed,cornsilk:#fff8dc,crimson:#dc143c,cyan:#00ffff,darkblue:#00008b,darkcyan:#008b8b,darkgoldenrod:#b8860b,darkgray:#a9a9a9,darkgreen:#006400,darkgrey:#a9a9a9,darkkhaki:#bdb76b,darkmagenta:#8b008b,darkolivegreen:#556b2f,darkorange:#ff8c00,darkorchid:#9932cc,darkred:#8b0000,darksalmon:#e9967a,darkseagreen:#8fbc8f,darkslateblue:#483d8b,darkslategray:#2f4f4f,darkslategrey:#2f4f4f,darkturquoise:#00ced1,darkviolet:#9400d3,deeppink:#ff1493,deepskyblue:#00bfff,dimgray:#696969,dimgrey:#696969,dodgerblue:#1e90ff,firebrick:#b22222,floralwhite:#fffaf0,forestgreen:#228b22,fuchsia:#ff00ff,gainsboro:#dcdcdc,ghostwhite:#f8f8ff,gold:#ffd700,goldenrod:#daa520,gray:#808080,green:#008000,greenyellow:#adff2f,grey:#808080,honeydew:#f0fff0,hotpink:#ff69b4,indianred:#cd5c5c,indigo:#4b0082,ivory:#fffff0,khaki:#f0e68c,lavender:#e6e6fa,lavenderblush:#fff0f5,lawngreen:#7cfc00,lemonchiffon:#fffacd,lightblue:#add8e6,lightcoral:#f08080,lightcyan:#e0ffff,lightgoldenrodyellow:#fafad2,lightgray:#d3d3d3,lightgreen:#90ee90,lightgrey:#d3d3d3,lightpink:#ffb6c1,lightsalmon:#ffa07a,lightseagreen:#20b2aa,lightskyblue:#87cefa,lightslategray:#778899,lightslategrey:#778899,lightsteelblue:#b0c4de,lightyellow:#ffffe0,lime:#00ff00,limegreen:#32cd32,linen:#faf0e6,magenta:#ff00ff,maroon:#800000,mediumaquamarine:#66cdaa,mediumblue:#0000cd,mediumorchid:#ba55d3,mediumpurple:#9370db,mediumseagreen:#3cb371,mediumslateblue:#7b68ee,mediumspringgreen:#00fa9a,mediumturquoise:#48d1cc,mediumvioletred:#c71585,midnightblue:#191970,mintcream:#f5fffa,mistyrose:#ffe4e1,moccasin:#ffe4b5,navajowhite:#ffdead,navy:#000080,oldlace:#fdf5e6,olive:#808000,olivedrab:#6b8e23,orange:#ffa500,orangered:#ff4500,orchid:#da70d6,palegoldenrod:#eee8aa,palegreen:#98fb98,paleturquoise:#afeeee,palevioletred:#db7093,papayawhip:#ffefd5,peachpuff:#ffdab9,peru:#cd853f,pink:#ffc0cb,plum:#dda0dd,powderblue:#b0e0e6,purple:#800080,rebeccapurple:#663399,red:#ff0000,rosybrown:#bc8f8f,royalblue:#4169e1,saddlebrown:#8b4513,salmon:#fa8072,sandybrown:#f4a460,seagreen:#2e8b57,seashell:#fff5ee,sienna:#a0522d,silver:#c0c0c0,skyblue:#87ceeb,slateblue:#6a5acd,slategray:#708090,slategrey:#708090,snow:#fffafa,springgreen:#00ff7f,steelblue:#4682b4,tan:#d2b48c,teal:#008080,thistle:#d8bfd8,tomato:#ff6347,turquoise:#40e0d0,violet:#ee82ee,wheat:#f5deb3,white:#ffffff,whitesmoke:#f5f5f5,yellow:#ffff00,yellowgreen:#9acd32\"\n .split(\",\")\n .map((entry) => entry.split(\":\") as [string, string]),\n);\n\n/** WCAG relative luminance from 0-255 RGB channels. */\nfunction rgbLuminance(r: number, g: number, b: number): number {\n const [lr = 0, lg = 0, lb = 0] = [r, g, b].map((channel) => {\n const normalized = channel / 255;\n return normalized <= 0.03928\n ? normalized / 12.92\n : Math.pow((normalized + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * lr + 0.7152 * lg + 0.0722 * lb;\n}\n\n/** WCAG relative luminance of a hex color; null when the value is not hex. */\nfunction hexColorLuminance(value: string): number | null {\n const normalized = value.trim();\n if (!HEX_COLOR_PATTERN.test(normalized)) return null;\n const raw = normalized.slice(1);\n const full =\n raw.length === 3\n ? raw\n .split(\"\")\n .map((channel) => channel + channel)\n .join(\"\")\n : raw;\n const [r = 0, g = 0, b = 0] = [0, 2, 4].map((index) =>\n parseInt(full.slice(index, index + 2), 16),\n );\n return rgbLuminance(r, g, b);\n}\n\n/** RGBA channels of a CSS function color; alpha defaults to 1. */\ntype RgbaChannels = [number, number, number, number];\n\n/** Splits a color function body into channel tokens and the alpha token. */\nfunction splitColorBody(body: string): { parts: string[]; alphaToken?: string } {\n let colorPart = body;\n let alphaToken: string | undefined;\n const slashIndex = body.lastIndexOf(\"/\");\n if (slashIndex >= 0) {\n colorPart = body.slice(0, slashIndex);\n alphaToken = body.slice(slashIndex + 1);\n }\n const parts = colorPart.includes(\",\")\n ? colorPart.split(\",\")\n : colorPart.trim().split(/\\s+/);\n // Comma syntax carries alpha as a fourth channel: rgba(r, g, b, a).\n if (colorPart.includes(\",\") && parts.length === 4) {\n alphaToken = parts.pop();\n }\n return { parts, alphaToken };\n}\n\nfunction parseAlpha(token: string | undefined): number {\n if (token === undefined) return 1;\n const trimmed = token.trim();\n if (!trimmed) return 1;\n return trimmed.endsWith(\"%\")\n ? parseFloat(trimmed) / 100\n : parseFloat(trimmed);\n}\n\n/** RGBA channels of rgb()/rgba() in comma or space syntax; channels may be %. */\nfunction parseRgbChannels(value: string): RgbaChannels | null {\n const match = /^rgba?\\(\\s*([^)]*?)\\s*\\)$/i.exec(value);\n if (!match) return null;\n const { parts, alphaToken } = splitColorBody(match[1] ?? \"\");\n if (parts.length < 3) return null;\n const alpha = parseAlpha(alphaToken);\n const channels = parts.slice(0, 3).map((part) => {\n const token = part.trim();\n return token.endsWith(\"%\")\n ? (parseFloat(token) / 100) * 255\n : parseFloat(token);\n });\n if ([...channels, alpha].some((channel) => Number.isNaN(channel))) {\n return null;\n }\n return [channels[0] ?? 0, channels[1] ?? 0, channels[2] ?? 0, alpha];\n}\n\n/** RGBA channels of hsl()/hsla(); hue may be deg, rad, or turn. */\nfunction parseHslChannels(value: string): RgbaChannels | null {\n const match = /^hsla?\\(\\s*([^)]*?)\\s*\\)$/i.exec(value);\n if (!match) return null;\n const { parts, alphaToken } = splitColorBody(match[1] ?? \"\");\n if (parts.length < 3) return null;\n const alpha = parseAlpha(alphaToken);\n const hueToken = (parts[0] ?? \"\").trim().toLowerCase();\n const hueRaw = parseFloat(hueToken);\n const saturation = parseFloat(parts[1] ?? \"\");\n const lightness = parseFloat(parts[2] ?? \"\");\n if ([hueRaw, saturation, lightness, alpha].some((n) => Number.isNaN(n))) {\n return null;\n }\n const hueDeg = hueToken.endsWith(\"turn\")\n ? hueRaw * 360\n : hueToken.endsWith(\"rad\")\n ? (hueRaw * 180) / Math.PI\n : hueRaw;\n const s = saturation / 100;\n const l = lightness / 100;\n const chroma = (1 - Math.abs(2 * l - 1)) * s;\n const huePrime = (((hueDeg % 360) + 360) % 360) / 60;\n const x = chroma * (1 - Math.abs((huePrime % 2) - 1));\n const pairs: Array<[number, number, number]> = [\n [chroma, x, 0],\n [x, chroma, 0],\n [0, chroma, x],\n [0, x, chroma],\n [x, 0, chroma],\n [chroma, 0, x],\n ];\n const [r1 = 0, g1 = 0, b1 = 0] = pairs[Math.floor(huePrime) % 6] ?? [];\n const m = l - chroma / 2;\n return [(r1 + m) * 255, (g1 + m) * 255, (b1 + m) * 255, alpha];\n}\n\nlet colorProbeElement: HTMLElement | null = null;\n\n/**\n * Normalizes any CSS color the browser understands (named colors, lab(), …)\n * to a rgb()/hex serialization. Null when there is no DOM (SSR) or the value\n * is not a valid color.\n */\nfunction normalizeColorWithDom(value: string): string | null {\n if (typeof document === \"undefined\") return null;\n colorProbeElement ??= document.createElement(\"span\");\n colorProbeElement.style.color = \"\";\n colorProbeElement.style.color = value;\n return colorProbeElement.style.color || null;\n}\n\n/**\n * Luminance above which a pinned surface counts as light and keeps the light\n * token ramp even when the visitor's device is in dark mode.\n */\nconst LIGHT_SURFACE_LUMINANCE_THRESHOLD = 0.35;\n\n/**\n * Luminance of possibly-translucent channels. The host backdrop behind a\n * translucent surface is unknown, so the color is composited against both a\n * black and a white backdrop; when the two extremes disagree on the light/dark\n * classification the color is indeterminate and resolves to null.\n */\nfunction channelsLuminance([r, g, b, alpha]: RgbaChannels): number | null {\n if (alpha >= 1) return rgbLuminance(r, g, b);\n if (alpha <= 0) return null;\n const overBlack = rgbLuminance(r * alpha, g * alpha, b * alpha);\n const overWhite = rgbLuminance(\n r * alpha + (1 - alpha) * 255,\n g * alpha + (1 - alpha) * 255,\n b * alpha + (1 - alpha) * 255,\n );\n const blackIsLight = overBlack > LIGHT_SURFACE_LUMINANCE_THRESHOLD;\n const whiteIsLight = overWhite > LIGHT_SURFACE_LUMINANCE_THRESHOLD;\n if (blackIsLight !== whiteIsLight) return null;\n return blackIsLight\n ? Math.min(overBlack, overWhite)\n : Math.max(overBlack, overWhite);\n}\n\n/** WCAG relative luminance of a CSS color; null when it cannot be resolved. */\nfunction cssColorLuminance(value: string): number | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n const namedHex = NAMED_COLOR_HEX[trimmed.toLowerCase()];\n const hex = hexColorLuminance(namedHex ?? trimmed);\n if (hex !== null) return hex;\n const channels = parseRgbChannels(trimmed) ?? parseHslChannels(trimmed);\n if (channels) return channelsLuminance(channels);\n const normalized = normalizeColorWithDom(trimmed);\n if (!normalized || normalized === trimmed) return null;\n const normalizedHex = hexColorLuminance(normalized);\n if (normalizedHex !== null) return normalizedHex;\n const normalizedChannels =\n parseRgbChannels(normalized) ?? parseHslChannels(normalized);\n return normalizedChannels ? channelsLuminance(normalizedChannels) : null;\n}\n\n/**\n * A pinned light surface means the customer owns a light panel. Applying the\n * visitor's dark scheme anyway would paint dark-ramp text tokens (e.g. muted\n * #b6bfce) onto that light surface, which is near-invisible. When a light\n * surface is pinned, keep the light ramp for every unpinned token instead.\n */\nfunction resolveEffectiveColorScheme(\n theme: Partial<AgentRailTheme> | undefined,\n resolvedColorScheme: \"light\" | \"dark\",\n): \"light\" | \"dark\" {\n if (resolvedColorScheme !== \"dark\") return \"light\";\n const surface = theme?.surface?.trim();\n if (!surface) return \"dark\";\n const luminance = cssColorLuminance(surface);\n if (luminance === null) return \"dark\";\n return luminance > LIGHT_SURFACE_LUMINANCE_THRESHOLD ? \"light\" : \"dark\";\n}\n\nexport function agentThemeStyle(\n theme: Partial<AgentRailTheme> | undefined,\n resolvedColorScheme: \"light\" | \"dark\",\n): CSSProperties {\n const brandedTheme = { ...defaultAgentRailTheme, ...theme };\n const effectiveColorScheme = resolveEffectiveColorScheme(\n theme,\n resolvedColorScheme,\n );\n const resolvedTheme =\n effectiveColorScheme === \"dark\"\n ? {\n ...brandedTheme,\n brand: theme?.brand ?? defaultDarkAgentRailTheme.brand,\n brandDeep: theme?.brandDeep ?? defaultDarkAgentRailTheme.brandDeep,\n brandSoft:\n theme?.brandSoft ??\n `color-mix(in srgb, ${\n theme?.brand ?? defaultDarkAgentRailTheme.brand\n } 18%, ${defaultDarkAgentRailTheme.surface})`,\n border: theme?.border ?? defaultDarkAgentRailTheme.border,\n danger: theme?.danger ?? defaultDarkAgentRailTheme.danger,\n onBrand: theme?.onBrand ?? defaultDarkAgentRailTheme.onBrand,\n success: theme?.success ?? defaultDarkAgentRailTheme.success,\n surface: theme?.surface ?? defaultDarkAgentRailTheme.surface,\n surfaceMuted:\n theme?.surfaceMuted ?? defaultDarkAgentRailTheme.surfaceMuted,\n text: theme?.text ?? defaultDarkAgentRailTheme.text,\n textMuted: theme?.textMuted ?? defaultDarkAgentRailTheme.textMuted,\n textSubtle: theme?.textSubtle ?? defaultDarkAgentRailTheme.textSubtle,\n visitorBubble:\n theme?.visitorBubble ??\n theme?.brand ??\n defaultDarkAgentRailTheme.visitorBubble,\n }\n : brandedTheme;\n return {\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-on-brand\": resolvedTheme.onBrand,\n \"--as-success\": resolvedTheme.success,\n \"--as-danger\": resolvedTheme.danger,\n \"--as-font-body\": resolvedTheme.fontBody,\n \"--as-font-display\": resolvedTheme.fontDisplay,\n colorScheme: effectiveColorScheme,\n } as CSSProperties;\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 joinLabels(labels: readonly string[]) {\n if (labels.length <= 1) return labels[0] ?? \"\";\n if (labels.length === 2) return `${labels[0]} and ${labels[1]}`;\n return `${labels.slice(0, -1).join(\", \")} and ${labels.at(-1) ?? \"\"}`;\n}\n\nexport const AGENT_SOFT_REVIEW_STATUS =\n \"Reviewing your details to find the best approach\";\n\nexport function workSummary(\n steps: readonly ToolStep[],\n failed: boolean,\n brandLabel: string\n) {\n const activeTool = [...steps].reverse().find(\n (step) => step.kind === \"tool\" && step.state === \"active\"\n );\n if (activeTool) return activeTool.detail ?? \"Working on your request\";\n const activeSpecialists = steps.filter(\n (step) => step.kind === \"specialist\" && step.state === \"active\"\n );\n if (activeSpecialists.length > 0)\n return `Working with ${joinLabels(\n activeSpecialists.map((step) => step.label)\n )}`;\n const active = [...steps].reverse().find((step) => step.state === \"active\");\n if (active?.kind === \"search\") return \"Searching this site\";\n if (active) return AGENT_SOFT_REVIEW_STATUS;\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 brandLabel ? `Answered with ${brandLabel}` : \"Answer ready\";\n}\n\nfunction stepLabel(step: ToolStep, brandLabel: string) {\n return step.kind === \"planning\" ? brandLabel : 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 `Brought in ${specialists[0]?.label}`;\n if (specialists.length > 1)\n return `Brought in ${specialists.length} specialists`;\n if (steps.some((item) => item.kind === \"search\"))\n return \"Searched this site\";\n return step.detail;\n}\n\nexport function AgentWorkSteps({\n brandLabel = \"\",\n onRetryStep,\n steps,\n}: {\n brandLabel?: string;\n onRetryStep?: (step: ToolStep) => void;\n steps: readonly ToolStep[];\n}) {\n const delegationCount = steps.filter(\n (step) => step.kind === \"specialist\"\n ).length;\n const delegated =\n delegationCount > 0 && steps.some((step) => step.kind === \"planning\");\n const visibleSteps = steps.filter(\n (step) => step.kind !== \"planning\" || Boolean(brandLabel)\n );\n return (\n <ol className=\"agent-activity-bubble__steps\">\n {visibleSteps.map((step) => {\n const detail = stepDetail(step, steps);\n const child = delegated && step.kind === \"specialist\";\n return (\n <li\n key={step.id}\n className={`agent-activity-bubble__step${\n child ? \" agent-activity-bubble__step--child\" : \"\"\n }`}\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 <span className=\"agent-activity-bubble__step-copy\">\n <span className=\"agent-activity-bubble__step-heading\">\n <strong>{stepLabel(step, brandLabel)}</strong>\n </span>\n {detail ? (\n <span className=\"agent-activity-bubble__step-detail\">\n {detail}\n </span>\n ) : null}\n {delegated && step.kind === \"planning\" ? (\n <span className=\"agent-activity-bubble__delegation\">\n Delegated {delegationCount}{\" \"}\n {delegationCount === 1 ? \"task\" : \"tasks\"}\n </span>\n ) : null}\n {step.state === \"error\" && onRetryStep ? (\n <button\n type=\"button\"\n className=\"agent-activity-bubble__step-retry\"\n onClick={() => onRetryStep(step)}\n >\n Retry\n </button>\n ) : null}\n </span>\n </li>\n );\n })}\n </ol>\n );\n}\n\nexport function AgentActivityBubble({\n brandLabel = \"\",\n failed = false,\n steps,\n onRetryStep,\n}: {\n brandLabel?: string;\n brandLogoUrl?: string;\n failed?: boolean;\n steps: ToolStep[];\n onRetryStep?: (step: ToolStep) => void;\n}) {\n const active = steps.some((step) => step.state === \"active\");\n const statusText = workSummary(steps, failed, brandLabel);\n const softReview = statusText === AGENT_SOFT_REVIEW_STATUS;\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\n className={`agent-activity-bubble__status${\n softReview ? \" agent-activity-bubble__status--soft\" : \"\"\n }`}\n aria-live=\"polite\"\n >\n <span\n className={`agent-activity-bubble__pulse${\n active ? \" is-active\" : failed ? \" is-error\" : \"\"\n }`}\n aria-hidden=\"true\"\n />\n {statusText}\n {active ? \"...\" : \"\"}\n </p>\n {!active ? (\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 setExpandedReceiptId((current) =>\n current === receiptId ? null : receiptId\n );\n }}\n >\n How this answer was made\n </button>\n {detailsOpen ? (\n <AgentWorkSteps\n brandLabel={brandLabel}\n onRetryStep={onRetryStep}\n steps={steps}\n />\n ) : null}\n </div>\n ) : null}\n </article>\n );\n}\n","import { useState } from \"react\";\nimport type { AgentSearchReferences } from \"../../../runtime/search-discovery\";\nimport { safeSearchUrl } from \"../../../runtime/search-discovery\";\nimport \"./SearchReferences.css\";\n\nfunction SiteIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <ellipse cx=\"12\" cy=\"12\" rx=\"4\" ry=\"9\" />\n <path d=\"M3 12h18M5 6.5h14M5 17.5h14\" />\n </svg>\n );\n}\n\n/** Sources are usually pages on the customer's own site, so the origin\n favicon carries real identity; the globe stays as the fallback. */\nfunction SourceFavicon({ url }: { url?: string | null }) {\n const [failed, setFailed] = useState(false);\n let faviconUrl: string | null = null;\n if (url) {\n try {\n faviconUrl = `${new URL(url).origin}/favicon.ico`;\n } catch {\n faviconUrl = null;\n }\n }\n if (!faviconUrl || failed) return <SiteIcon />;\n return (\n <img\n src={faviconUrl}\n alt=\"\"\n loading=\"lazy\"\n onError={() => setFailed(true)}\n />\n );\n}\n\nexport function searchSources(results: readonly AgentSearchReferences[]) {\n const seenSources = new Set<string>();\n return results\n .flatMap((result) => result.sources)\n .flatMap((source) => {\n const url = safeSearchUrl(source.url);\n const key = url ?? source.id;\n if (seenSources.has(key)) return [];\n seenSources.add(key);\n return [{ ...source, url, key }];\n });\n}\n\nexport function searchActions(results: readonly AgentSearchReferences[]) {\n const seenActions = new Set<string>();\n return results.flatMap((result) => {\n const url = safeSearchUrl(result.cta?.url);\n if (!url || !result.cta || seenActions.has(url)) return [];\n seenActions.add(url);\n return [{ label: result.cta.label, url }];\n });\n}\n\nexport function searchSuggestions(results: readonly AgentSearchReferences[]) {\n return [\n ...new Set(results.flatMap((result) => result.suggestions ?? [])),\n ].slice(0, 3);\n}\n\nexport function searchActionLinkTitle(url: string) {\n try {\n const hostname = new URL(url).hostname.replace(/^www\\./, \"\");\n return hostname ? `Opens ${hostname} in a new tab` : \"Opens in a new tab\";\n } catch {\n return \"Opens in a new tab\";\n }\n}\n\n/** Structured search metadata accompanies the Agent's answer, never repeats it. */\nexport function SearchReferences({\n results,\n mode = \"default\",\n}: {\n results: readonly AgentSearchReferences[];\n mode?: \"default\" | \"sources\" | \"actions\";\n}) {\n const sources = searchSources(results);\n const actions = searchActions(results);\n if (\n !(mode !== \"actions\" && sources.length) &&\n !(mode !== \"sources\" && actions.length)\n )\n return null;\n\n const Container = mode === \"default\" ? \"details\" : \"div\";\n return (\n <div className=\"search-references\">\n {mode !== \"actions\" && sources.length > 0 ? (\n <Container\n className=\"search-references__disclosure\"\n aria-label=\"Sources\"\n >\n {mode === \"default\" ? (\n <summary className=\"search-references__heading\">\n Sources ({sources.length})\n </summary>\n ) : null}\n <ul className=\"search-references__list\">\n {sources.map((source) => {\n const content = (\n <>\n <span className=\"search-references__icon\">\n <SourceFavicon url={source.url} />\n </span>\n <span\n className=\"search-references__title\"\n title={source.title}\n >\n {source.title}\n </span>\n {source.url ? (\n <svg\n className=\"search-references__row-arrow\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M7 17 17 7\" />\n <path d=\"M8 7h9v9\" />\n </svg>\n ) : null}\n </>\n );\n return (\n <li key={source.key}>\n {source.url ? (\n <a\n className=\"search-references__source\"\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {content}\n </a>\n ) : (\n <div className=\"search-references__source\">{content}</div>\n )}\n </li>\n );\n })}\n </ul>\n </Container>\n ) : null}\n {mode !== \"sources\" && actions.length > 0 ? (\n <div className=\"search-references__actions\">\n {actions.map((action) => (\n <a\n className=\"search-references__cta\"\n key={action.url}\n href={action.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {action.label}\n </a>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n","import type { AgentSearchReferences } from \"../../../runtime/search-discovery\";\nimport {\n SearchReferences,\n searchSources,\n searchSuggestions,\n} from \"../SearchReferences/SearchReferences\";\nimport \"./ExploreMore.css\";\n\nfunction QuestionIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n}\n\n/** Labeled sections inside the Explore more panel: references the answer used\n plus suggested follow-up questions. */\nexport function ExploreMore({\n results,\n disabled,\n onSelectQuestion,\n showLearnMore = true,\n showSources = true,\n}: {\n results: readonly AgentSearchReferences[];\n disabled?: boolean;\n onSelectQuestion: (question: string) => void;\n showLearnMore?: boolean;\n showSources?: boolean;\n}) {\n const sources = showSources ? searchSources(results) : [];\n const questions = showLearnMore ? searchSuggestions(results) : [];\n if (!sources.length && !questions.length) return null;\n return (\n <div className=\"explore-more\">\n {sources.length > 0 ? (\n <div className=\"explore-more__section\">\n <p className=\"explore-more__label\">\n Based on {sources.length}{\" \"}\n {sources.length === 1 ? \"page\" : \"pages\"}\n </p>\n <SearchReferences results={results} mode=\"sources\" />\n </div>\n ) : null}\n {questions.length > 0 ? (\n <div className=\"explore-more__section\">\n <p className=\"explore-more__label\">Learn more</p>\n <ul className=\"explore-more__questions\">\n {questions.map((question) => (\n <li key={question}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onSelectQuestion(question)}\n >\n <span className=\"explore-more__question-icon\">\n <QuestionIcon />\n </span>\n <span className=\"explore-more__question-text\">\n {question}\n </span>\n <svg\n className=\"explore-more__question-arrow\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 12h16m-7-7 7 7-7 7\" />\n </svg>\n </button>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n );\n}\n","import { useEffect, useRef, useId, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { ToolStep } from \"../../types/conversation\";\nimport {\n AgentWorkSteps,\n workSummary,\n} from \"../AgentActivityBubble/AgentActivityBubble\";\nimport { useAgentRailPortalRoots } from \"../AgentRail/AgentRailOverlayContext\";\nimport \"./AnswerReceiptDialog.css\";\n\nconst FOCUSABLE_SELECTOR =\n 'button:not(:disabled), a[href], textarea:not(:disabled), input:not(:disabled), [tabindex]:not([tabindex=\"-1\"])';\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\nexport function AnswerReceiptDialog({\n brandLabel = \"\",\n onClose,\n steps = [],\n title = \"How this answer was made\",\n summary,\n children,\n}: {\n brandLabel?: string;\n onClose: () => void;\n steps?: ToolStep[];\n title?: ReactNode;\n summary?: string;\n children?: ReactNode;\n}) {\n const titleId = useId();\n const portalRoots = useAgentRailPortalRoots();\n const overlayRoot = portalRoots?.overlayRef ?? null;\n const cardRef = useRef<HTMLDivElement>(null);\n const closeButtonRef = useRef<HTMLButtonElement>(null);\n const previouslyFocusedRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n previouslyFocusedRef.current =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n closeButtonRef.current?.focus({ preventScroll: true });\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n return;\n }\n\n if (event.key !== \"Tab\" || !cardRef.current) return;\n\n const focusable =\n cardRef.current.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR);\n if (focusable.length === 0) return;\n\n const first = focusable.item(0);\n const last = focusable.item(focusable.length - 1);\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus({ preventScroll: true });\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus({ preventScroll: true });\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n previouslyFocusedRef.current?.focus({ preventScroll: true });\n };\n }, [onClose]);\n\n const content = (\n <div className=\"agent-receipt-dialog\">\n <button\n type=\"button\"\n className=\"agent-receipt-dialog__backdrop\"\n aria-label=\"Close\"\n tabIndex={-1}\n onClick={onClose}\n />\n <div\n ref={cardRef}\n className=\"agent-receipt-dialog__card\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n >\n <div className=\"agent-receipt-dialog__header\">\n <p className=\"agent-receipt-dialog__title\" id={titleId}>\n {title}\n </p>\n <button\n ref={closeButtonRef}\n type=\"button\"\n className=\"agent-receipt-dialog__close\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <CloseIcon />\n </button>\n </div>\n <p className=\"agent-receipt-dialog__summary\">\n {summary ?? workSummary(steps, false, brandLabel)}\n </p>\n <div className=\"agent-receipt-dialog__body\">\n {children ?? <AgentWorkSteps brandLabel={brandLabel} steps={steps} />}\n </div>\n </div>\n </div>\n );\n\n if (overlayRoot?.current) {\n return createPortal(content, overlayRoot.current);\n }\n\n return content;\n}\n","import {\n useEffect,\n useId,\n useRef,\n useState,\n type FormEvent,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport {\n formatComposerFormMessage,\n isComposerFormComplete,\n isValidComposerFieldValue,\n readComposerControlValue,\n type ComposerForm,\n} from \"../../lib/composer-form\";\nimport \"./Composer.css\";\nimport type { AgentPanelSubmitOptions } from \"../../panel-controller\";\n\nconst FORM_SUBMITTED_MESSAGE = \"Shared my details\";\n\nfunction SendIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8 12V4M8 4l-3 3M8 4l3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2.5 6.2l2.3 2.3 4.7-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction CollapseIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 10l4-4 4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction emptyValues(form: ComposerForm | null) {\n const values: Record<string, string> = {};\n for (const field of form?.fields ?? []) values[field.id] = \"\";\n return values;\n}\n\nfunction createDraft(form: ComposerForm | null) {\n return {\n form,\n values: emptyValues(form),\n expanded: Boolean(form),\n submitted: false,\n dismissalSent: false,\n attempted: false,\n };\n}\n\nexport function Composer({\n actions,\n disabled = false,\n placeholder = \"Ask anything…\",\n variant = \"default\",\n form = null,\n allowFormResume = true,\n onSubmit,\n}: {\n actions?: ReactNode;\n disabled?: boolean;\n placeholder?: string;\n variant?: \"default\" | \"dock\";\n form?: ComposerForm | null;\n allowFormResume?: boolean;\n onSubmit?: (message: string, options?: AgentPanelSubmitOptions) => void;\n}) {\n const [value, setValue] = useState(\"\");\n const [draft, setDraft] = useState(() => createDraft(form));\n const [multiline, setMultiline] = useState(false);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const firstFieldRef = useRef<HTMLElement | null>(null);\n const formRef = useRef<HTMLFormElement>(null);\n const formId = useId();\n\n // A temporary absence during a chat turn must not discard a skipped draft.\n if (form && form.id !== draft.form?.id) setDraft(createDraft(form));\n\n const savedForm = allowFormResume && !draft.submitted ? draft.form : null;\n const activeForm = !disabled && draft.expanded ? savedForm : null;\n const showResumeBadge = Boolean(savedForm) && !activeForm;\n const canSend = !disabled && Boolean(value.trim() || activeForm);\n\n useEffect(() => {\n if (activeForm) firstFieldRef.current?.focus();\n else if ((savedForm || draft.submitted) && !disabled)\n inputRef.current?.focus();\n }, [activeForm?.id, disabled, savedForm?.id, draft.submitted]);\n\n useEffect(() => {\n const input = inputRef.current;\n if (!input) return;\n const check = () => {\n const style = window.getComputedStyle(input);\n const singleLine =\n (parseFloat(style.lineHeight) || 20) +\n parseFloat(style.paddingTop) +\n parseFloat(style.paddingBottom) +\n 2;\n setMultiline(input.offsetHeight > singleLine);\n };\n check();\n const observer = new ResizeObserver(check);\n observer.observe(input);\n return () => observer.disconnect();\n }, []);\n\n function collapseForm() {\n setDraft((current) => ({ ...current, expanded: false }));\n }\n\n function submitChat() {\n const trimmed = value.trim();\n if (!trimmed || disabled) return;\n const shareDismissal = savedForm && !draft.dismissalSent;\n if (shareDismissal) {\n onSubmit?.(trimmed, {\n declinedComposerFormId: savedForm.id,\n });\n } else {\n onSubmit?.(trimmed);\n }\n setDraft((current) => ({\n ...current,\n expanded: false,\n dismissalSent: shareDismissal ? true : current.dismissalSent,\n }));\n setValue(\"\");\n inputRef.current?.focus();\n }\n\n function submitForm() {\n if (!activeForm || disabled) return;\n if (!isComposerFormComplete(activeForm, draft.values)) {\n setDraft((current) => ({ ...current, attempted: true }));\n const invalidField = activeForm.fields.find(\n (field) =>\n !isValidComposerFieldValue(field, draft.values[field.id] ?? \"\"),\n );\n const control =\n invalidField && formRef.current?.elements.namedItem(invalidField.id);\n if (control instanceof HTMLElement) control.focus();\n return;\n }\n onSubmit?.(FORM_SUBMITTED_MESSAGE, {\n runtimeText: formatComposerFormMessage(activeForm, draft.values),\n });\n setDraft((current) => ({\n ...current,\n values: emptyValues(activeForm),\n expanded: false,\n submitted: true,\n attempted: false,\n }));\n }\n\n function handleSend() {\n if (value.trim()) {\n submitChat();\n return;\n }\n if (activeForm) submitForm();\n }\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault();\n handleSend();\n }\n\n function handleChatKeyDown(event: KeyboardEvent<HTMLTextAreaElement>) {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submitChat();\n }\n }\n\n function handleFormKeyDown(event: KeyboardEvent<HTMLElement>) {\n const target = event.target;\n const isTextarea =\n Boolean(target && \"tagName\" in target && target.tagName === \"TEXTAREA\");\n if (event.key === \"Enter\" && !event.shiftKey && !isTextarea) {\n event.preventDefault();\n submitForm();\n }\n }\n\n const chatField = (\n <>\n <textarea\n ref={inputRef}\n className=\"composer__input\"\n rows={1}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n spellCheck={false}\n aria-label=\"Message\"\n onChange={(event) => setValue(event.target.value)}\n onKeyDown={handleChatKeyDown}\n />\n <button\n type=\"submit\"\n className=\"composer__send\"\n disabled={!canSend}\n aria-label=\"Send message\"\n >\n <SendIcon />\n </button>\n </>\n );\n\n return (\n <form\n ref={formRef}\n noValidate\n className={[\n \"composer\",\n variant === \"dock\" ? \"composer--dock\" : \"\",\n activeForm ? \"composer--form\" : \"\",\n multiline ? \"composer--multiline\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onSubmit={handleSubmit}\n >\n {actions || showResumeBadge ? (\n <div className=\"composer__actions\">\n {actions}\n {showResumeBadge ? (\n <button\n type=\"button\"\n className=\"composer__action-badge\"\n disabled={disabled}\n title=\"Share your details and we'll reach out shortly\"\n onClick={() =>\n setDraft((current) => ({ ...current, expanded: true }))\n }\n >\n Review follow-up\n </button>\n ) : null}\n </div>\n ) : null}\n {activeForm ? (\n <div\n className=\"composer__sheet\"\n role=\"group\"\n aria-label=\"Contact details\"\n >\n <div className=\"composer__form-heading\">\n <strong>Share your details</strong>\n <span>Optional</span>\n <button\n type=\"button\"\n className=\"composer__collapse\"\n aria-label=\"Collapse form\"\n disabled={disabled}\n onClick={collapseForm}\n >\n <CollapseIcon />\n </button>\n </div>\n <div className=\"composer__fields\">\n {activeForm.fields.map((field, index) => {\n const fieldId = `${formId}-${field.id}`;\n const fieldValue = draft.values[field.id] ?? \"\";\n const invalid =\n draft.attempted &&\n !isValidComposerFieldValue(field, fieldValue);\n const complete =\n fieldValue.trim().length > 0 &&\n isValidComposerFieldValue(field, fieldValue);\n const controlProps = {\n id: fieldId,\n name: field.id,\n disabled,\n required: field.required,\n autoComplete: field.autocomplete,\n placeholder: field.placeholder,\n spellCheck: false,\n value: fieldValue,\n \"aria-invalid\": invalid || undefined,\n \"aria-describedby\": invalid ? `${fieldId}-error` : undefined,\n onChange: (event: { target: EventTarget | null }) => {\n const next = readComposerControlValue(event);\n setDraft((current) => ({\n ...current,\n values: { ...current.values, [field.id]: next },\n }));\n },\n onKeyDown: handleFormKeyDown,\n };\n return (\n <div\n key={field.id}\n className={[\n \"composer__row\",\n field.kind === \"textarea\" ? \"composer__row--area\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <div className=\"composer__line\">\n <label className=\"composer__label\" htmlFor={fieldId}>\n {field.label}\n </label>\n {field.kind === \"textarea\" ? (\n <textarea\n {...controlProps}\n ref={\n index === 0\n ? (node) => {\n firstFieldRef.current = node;\n }\n : undefined\n }\n className=\"composer__control composer__control--area\"\n rows={2}\n />\n ) : (\n <input\n {...controlProps}\n ref={\n index === 0\n ? (node) => {\n firstFieldRef.current = node;\n }\n : undefined\n }\n className=\"composer__control\"\n type={field.kind}\n inputMode={field.kind === \"tel\" ? \"tel\" : undefined}\n />\n )}\n {complete && field.kind !== \"textarea\" ? (\n <span className=\"composer__check\" aria-hidden=\"true\">\n <CheckIcon />\n </span>\n ) : null}\n </div>\n {invalid ? (\n <p className=\"composer__error\" id={`${fieldId}-error`}>\n {field.kind === \"email\"\n ? \"Enter a valid email to share your details.\"\n : `Add your ${field.label.toLowerCase()} to share your details.`}\n </p>\n ) : null}\n </div>\n );\n })}\n </div>\n <div className=\"composer__field composer__field--inset\">\n {chatField}\n </div>\n </div>\n ) : (\n <div className=\"composer__field\">{chatField}</div>\n )}\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 { useEffect, useState } from \"react\";\nimport type { ConversationMessage } from \"../../types/conversation\";\nimport {\n extractToolCards,\n hideToolCardFences,\n looksLikeBookingAvailabilityDump,\n sanitizeBookingOfferCopy,\n bookingOfferIdentityKey,\n type BookingOffer,\n} from \"../../lib/tool-card\";\nimport { SearchReferences } from \"../SearchReferences/SearchReferences\";\nimport { BookingCard } from \"../BookingCard/BookingCard\";\nimport { Streamdown, defaultUrlTransform } from \"streamdown\";\nimport { snapBrandLogoDisplaySize } from \"../../lib/brand-logo-display\";\nimport { visitorMessageDisplayText } from \"../../lib/composer-form\";\nimport { resolveMessageUrl } from \"../../lib/resolve-message-url\";\nimport \"streamdown/styles.css\";\nimport \"./MessageBubble.css\";\n\nfunction normalizeDedupeText(text: string) {\n return text.trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nfunction paragraphsAreNearDuplicates(first: string, second: string) {\n const left = normalizeDedupeText(first);\n const right = normalizeDedupeText(second);\n if (left.length < 40 || right.length < 40) return false;\n if (left === right) return true;\n const shorter = left.length <= right.length ? left : right;\n const longer = left.length <= right.length ? right : left;\n return longer.startsWith(shorter.slice(0, Math.floor(shorter.length * 0.85)));\n}\n\nfunction paragraphsShareOpening(first: string, second: string) {\n const opening = first.split(\"\\n\")[0]?.trim();\n if (!opening || opening.length < 20) return false;\n return second.trim().startsWith(opening);\n}\n\nfunction collapseRepeatedText(text: string) {\n const trimmed = text.trim();\n if (trimmed.length < 40) return trimmed;\n const paragraphs = trimmed\n .split(/\\n{2,}/u)\n .map((part) => part.trim())\n .filter(Boolean);\n if (\n paragraphs.length === 2 &&\n (paragraphsAreNearDuplicates(paragraphs[0]!, paragraphs[1]!) ||\n paragraphsShareOpening(paragraphs[0]!, paragraphs[1]!))\n ) {\n return paragraphs[0]!;\n }\n if (paragraphs.length >= 2 && paragraphs.length % 2 === 0) {\n const mid = paragraphs.length / 2;\n const first = paragraphs.slice(0, mid).join(\"\\n\\n\");\n const second = paragraphs.slice(mid).join(\"\\n\\n\");\n if (first === second) return first;\n }\n const mid = Math.floor(trimmed.length / 2);\n const left = trimmed.slice(0, mid).trim();\n const right = trimmed.slice(mid).trim();\n return left.length >= 20 && left === right ? left : trimmed;\n}\n\nexport function MessageBubble({\n message,\n brandLogoUrl,\n bookingDisabled = false,\n showProvenance = false,\n showSearchReferences = true,\n bookingReadOnly = false,\n linkBaseUrl,\n offer,\n onBook,\n}: {\n message: ConversationMessage;\n brandLogoUrl?: string;\n bookingDisabled?: boolean;\n showProvenance?: boolean;\n showSearchReferences?: boolean;\n bookingReadOnly?: boolean;\n linkBaseUrl?: string | undefined;\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 [logoDisplay, setLogoDisplay] = useState<{\n height: number;\n url: string;\n wide: boolean;\n width: number;\n } | null>(null);\n useEffect(() => {\n setFailedLogoUrl(null);\n }, [resolvedLogoUrl]);\n const activeLogoDisplay =\n logoDisplay?.url === resolvedLogoUrl ? logoDisplay : null;\n const wideLogo = activeLogoDisplay?.wide ?? false;\n const logoDisplaySize = activeLogoDisplay\n ? { height: activeLogoDisplay.height, width: activeLogoDisplay.width }\n : null;\n const showBrandLogo =\n Boolean(resolvedLogoUrl) && failedLogoUrl !== resolvedLogoUrl;\n const cards = 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 = collapseRepeatedText(\n offers.length > 0\n ? sanitizeBookingOfferCopy(visibleText)\n : looksLikeBookingAvailabilityDump(visibleText)\n ? sanitizeBookingOfferCopy(visibleText)\n : visibleText || (isStreaming ? \"\" : message.text)\n );\n\n if (message.role === \"visitor\") {\n const visitorText = visitorMessageDisplayText(message).trim();\n if (!visitorText) return null;\n return (\n <article\n className=\"message-bubble message-bubble--visitor\"\n aria-label=\"Message from visitor\"\n >\n {showProvenance ? (\n <span className=\"message-bubble__speaker\">You</span>\n ) : null}\n <p className=\"message-bubble__text\">{visitorText}</p>\n </article>\n );\n }\n\n if (message.role === \"human\") {\n return (\n <article\n className=\"message-bubble message-bubble--human\"\n aria-label={`Message from ${message.representative.name}`}\n >\n <strong className=\"message-bubble__representative\">\n {message.representative.name} <span>Human representative</span>\n </strong>\n <p className=\"message-bubble__text\">{message.text}</p>\n </article>\n );\n }\n const citations = message.citations ?? [];\n const agentText = (\n <div className=\"message-bubble__text\">\n <Streamdown\n animated={false}\n caret=\"circle\"\n className=\"message-bubble__markdown\"\n controls={false}\n isAnimating={isStreaming}\n linkSafety={{ enabled: false }}\n mode={isStreaming ? \"streaming\" : \"static\"}\n urlTransform={(url, key, node) =>\n resolveMessageUrl(\n defaultUrlTransform(url, key, node) ?? \"\",\n key === \"href\" ? linkBaseUrl : undefined\n )\n }\n skipHtml\n >\n {displayText}\n </Streamdown>\n {!isStreaming && showSearchReferences ? (\n <SearchReferences results={message.searchResults ?? []} />\n ) : null}\n {!isStreaming && citations.length > 0 ? (\n <ul className=\"message-bubble__sources\" aria-label=\"Sources\">\n {citations.map((citation) => (\n <li key={citation.id}>\n <a href={citation.url} target=\"_blank\" rel=\"noreferrer\">\n <span\n className=\"message-bubble__source-icon\"\n aria-hidden=\"true\"\n >\n ▦\n </span>\n <span>{citation.label}</span>\n </a>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n\n if (!displayText && !message.searchResults?.length && offers.length === 0)\n return null;\n\n return (\n <article\n className=\"message-bubble message-bubble--agent\"\n aria-label=\"Message from AI assistant\"\n >\n {displayText || message.searchResults?.length ? (\n <div className=\"message-bubble__agent-stack\">\n {showProvenance || showBrandLogo ? (\n <div className=\"message-bubble__agent-header\">\n {showBrandLogo ? (\n <span\n className={`message-bubble__agent-avatar${wideLogo ? \" message-bubble__agent-avatar--wide\" : \"\"}`}\n aria-hidden=\"true\"\n >\n <img\n key={resolvedLogoUrl}\n className=\"as-brand-logo-img\"\n src={resolvedLogoUrl}\n alt=\"\"\n decoding=\"async\"\n {...(logoDisplaySize\n ? {\n height: logoDisplaySize.height,\n width: logoDisplaySize.width,\n }\n : {})}\n onLoad={(event) => {\n const img = event.currentTarget;\n const display = snapBrandLogoDisplaySize({\n naturalHeight: img.naturalHeight,\n naturalWidth: img.naturalWidth,\n surface: \"message\",\n });\n if (!resolvedLogoUrl) return;\n setLogoDisplay({\n height: display.height,\n url: resolvedLogoUrl,\n wide: display.wide,\n width: display.width,\n });\n }}\n onError={() => {\n setFailedLogoUrl(resolvedLogoUrl ?? null);\n }}\n />\n </span>\n ) : null}\n {showProvenance ? (\n <span className=\"message-bubble__speaker\">AI assistant</span>\n ) : null}\n </div>\n ) : null}\n {agentText}\n </div>\n ) : null}\n {offers.map((nextOffer, index) => (\n <BookingCard\n key={`${bookingOfferIdentityKey(nextOffer)}-${index}`}\n disabled={bookingDisabled}\n readOnly={bookingReadOnly}\n offer={nextOffer}\n onBook={onBook}\n />\n ))}\n </article>\n );\n}\n","import {\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n} 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\nconst BOOKING_STEPS: readonly {\n id: BookingStep;\n label: string;\n}[] = [\n { id: \"date\", label: \"Date\" },\n { id: \"time\", label: \"Time\" },\n { id: \"details\", label: \"Details\" },\n];\n\nfunction monthFromKey(key: string) {\n const [year, month] = key.split(\"-\").map(Number);\n if (!year || !month)\n 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 BookingCardLoader() {\n return (\n <section className=\"booking-card\" aria-label=\"Book a meeting\">\n <p className=\"booking-card__loading\" role=\"status\">\n Finding available times…\n </p>\n </section>\n );\n}\n\ntype BookingCardProps = {\n disabled?: boolean | undefined;\n readOnly?: boolean | undefined;\n offer: BookingOffer;\n onBook?:\n | ((input: { displayText: string; runtimeText: string }) => void)\n | undefined;\n};\n\nexport function BookingCard(props: BookingCardProps) {\n if (!props.readOnly) return <InteractiveBookingCard {...props} />;\n return (\n <section className=\"booking-card\" aria-label=\"Recorded available times\">\n <p className=\"booking-card__title\">Available times offered</p>\n {props.offer.slots.length ? (\n <ul>\n {props.offer.slots.map((slot, index) => {\n const eventType = props.offer.eventTypes.find(\n (item) => item.uri === slot.eventTypeUri,\n );\n const label = Number.isFinite(Date.parse(slot.startTime))\n ? formatSlotLabel(slot.startTime)\n : \"Time unavailable\";\n return (\n <li key={`${slot.eventTypeUri ?? \"\"}:${slot.startTime}:${index}`}>\n {eventType ? `${eventType.name} · ` : \"\"}\n {label}\n </li>\n );\n })}\n </ul>\n ) : (\n <p>No available times were recorded.</p>\n )}\n </section>\n );\n}\n\nfunction InteractiveBookingCard({\n disabled = false,\n offer,\n onBook,\n}: {\n disabled?: boolean;\n offer: BookingOffer;\n onBook?: (input: { displayText: string; runtimeText: string }) => void;\n}) {\n const fieldId = useId();\n const defaultType =\n 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 const activeStepRef = useRef<HTMLDivElement>(null);\n const previousStepRef = useRef<BookingStep>(step);\n const stepIndex = BOOKING_STEPS.findIndex((item) => item.id === step);\n\n useEffect(() => {\n if (previousStepRef.current === step) return;\n previousStepRef.current = step;\n activeStepRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [step]);\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(\n bookingSlotsForEventType(offer.slots, nextType),\n ),\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(\n (item) => item.uri === eventTypeUri,\n );\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\n className=\"booking-card\"\n aria-busy={disabled || undefined}\n aria-label=\"Book a meeting\"\n >\n <form className=\"booking-card__form\" onSubmit={handleSubmit}>\n <ol className=\"booking-card__steps\" aria-label=\"Booking steps\">\n {BOOKING_STEPS.map((item, index) => (\n <li\n key={item.id}\n className={[\n \"booking-card__step-indicator\",\n index === stepIndex\n ? \"booking-card__step-indicator--active\"\n : \"\",\n index < stepIndex\n ? \"booking-card__step-indicator--complete\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-current={index === stepIndex ? \"step\" : undefined}\n >\n <span aria-hidden=\"true\">{index + 1}</span>\n <span>{item.label}</span>\n </li>\n ))}\n </ol>\n {step === \"date\" ? (\n <div className=\"booking-card__step\" key=\"date\" ref={activeStepRef}>\n <p className=\"booking-card__title\">\n {selectedType?.name || \"Pick a date\"}\n </p>\n {timeZone ? (\n <p className=\"booking-card__tz\">Times in {timeZone}</p>\n ) : null}\n {offer.eventTypes.length > 1 ? (\n <label\n className=\"booking-card__field\"\n htmlFor={`${fieldId}-type`}\n >\n <span>Meeting</span>\n <select\n id={`${fieldId}-type`}\n value={eventTypeUri}\n disabled={disabled}\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={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={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 {offer.slots.length === 0 ? (\n <p className=\"booking-card__loading\" role=\"status\">\n Finding available times…\n </p>\n ) : null}\n <div\n className=\"booking-card__calendar\"\n role=\"grid\"\n aria-label=\"Available dates\"\n >\n {cells.map((cell, index) => {\n if (!cell) {\n return (\n <span\n key={`empty-${index}`}\n className=\"booking-card__day\"\n />\n );\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={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\" ref={activeStepRef}>\n <div className=\"booking-card__step-bar\">\n <button\n type=\"button\"\n className=\"booking-card__nav\"\n aria-label=\"Back to dates\"\n disabled={disabled}\n onClick={() => setStep(\"date\")}\n >\n ‹\n </button>\n <div>\n <p className=\"booking-card__title\">\n {selectedSample\n ? formatLongDate(selectedSample)\n : \"Pick a time\"}\n </p>\n {timeZone ? (\n <p className=\"booking-card__tz\">Times in {timeZone}</p>\n ) : 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 disabled={disabled}\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\" ref={activeStepRef}>\n <div className=\"booking-card__step-bar\">\n <button\n type=\"button\"\n className=\"booking-card__nav\"\n aria-label=\"Back to times\"\n disabled={disabled}\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\n className=\"booking-card__field\"\n htmlFor={`${fieldId}-name`}\n >\n <span>Name</span>\n <input\n id={`${fieldId}-name`}\n autoComplete=\"name\"\n disabled={disabled}\n value={name}\n onChange={(event) => setName(event.target.value)}\n required\n />\n </label>\n <label\n className=\"booking-card__field\"\n htmlFor={`${fieldId}-email`}\n >\n <span>Email</span>\n <input\n id={`${fieldId}-email`}\n type=\"email\"\n autoComplete=\"email\"\n disabled={disabled}\n value={email}\n onChange={(event) => setEmail(event.target.value)}\n required\n />\n </label>\n </div>\n <button\n type=\"submit\"\n className=\"booking-card__submit\"\n disabled={disabled || !name.trim() || !email.trim()}\n >\n {disabled ? \"Booking…\" : \"Book this time\"}\n </button>\n </div>\n ) : null}\n </form>\n </section>\n );\n}\n","/** Layout caps for brand logos — keep in sync with tokens.css custom properties. */\nexport const BRAND_LOGO_LAYOUT = {\n header: { maxHeight: 20, maxWidth: 96, square: 24 },\n message: { maxHeight: 18, maxWidth: 80, square: 22 },\n /** Bottom/mobile launcher pill orb — keep in sync with AssistEdgeTab chip CSS. */\n launcher: { maxHeight: 24, maxWidth: 104, square: 38 },\n} as const;\n\nexport type BrandLogoSurface = keyof typeof BRAND_LOGO_LAYOUT;\n\nexport function isWideBrandLogo(naturalWidth: number, naturalHeight: number) {\n return naturalWidth > naturalHeight * 1.4;\n}\n\n/** Integer width/height so raster wordmarks downscale without soft subpixels. */\nexport function snapBrandLogoDisplaySize(input: {\n naturalWidth: number;\n naturalHeight: number;\n surface: BrandLogoSurface;\n}) {\n const { maxHeight, maxWidth } = BRAND_LOGO_LAYOUT[input.surface];\n const { naturalWidth, naturalHeight } = input;\n if (naturalWidth <= 0 || naturalHeight <= 0) {\n return { width: maxWidth, height: maxHeight, wide: false };\n }\n const wide = isWideBrandLogo(naturalWidth, naturalHeight);\n if (!wide) {\n const size = BRAND_LOGO_LAYOUT[input.surface].square;\n return { width: size, height: size, wide: false };\n }\n const scale = Math.min(\n maxHeight / naturalHeight,\n maxWidth / naturalWidth,\n 1,\n );\n const height = Math.max(1, Math.round(naturalHeight * scale));\n const width = Math.max(1, Math.round(naturalWidth * scale));\n return { width, height, wide: true };\n}\n","export function resolveMessageUrl(safeUrl: string, baseUrl?: string): string {\n if (!safeUrl || !baseUrl) return safeUrl;\n try {\n const base = new URL(baseUrl);\n if (base.protocol !== \"https:\" && base.protocol !== \"http:\") return \"\";\n return new URL(safeUrl, base).href;\n } catch {\n return \"\";\n }\n}\n","import { useState, type FormEvent } from \"react\";\nimport type {\n AgentInputRequest,\n AgentInputResponse,\n} from \"../../../runtime/types\";\nimport { ConfirmationCard } from \"../ConfirmationCard/ConfirmationCard\";\nimport { ToolInputCard } from \"../ToolInputCard/ToolInputCard\";\nimport \"./HumanInputCard.css\";\n\nexport function HumanInputCard({\n disabled = false,\n request,\n onRespond,\n}: {\n disabled?: boolean;\n request: AgentInputRequest;\n onRespond?: (response: AgentInputResponse) => void;\n}) {\n const [text, setText] = useState(\"\");\n const options = request.options ?? [];\n const showText =\n request.display === \"text\" ||\n (request.allowFreeform && options.length === 0);\n if (request.ui) {\n return (\n <ToolInputCard\n disabled={disabled}\n surface={request.ui}\n onSubmit={(_, value) =>\n onRespond?.({ requestId: request.requestId, value })\n }\n />\n );\n }\n if (options.length > 0) {\n return (\n <ConfirmationCard\n disabled={disabled}\n request={request}\n onRespond={onRespond}\n />\n );\n }\n\n function submitText(event: FormEvent) {\n event.preventDefault();\n const value = text.trim();\n if (!value || disabled) return;\n onRespond?.({ requestId: request.requestId, text: value });\n }\n\n return (\n <section\n className=\"human-input-card\"\n aria-labelledby={`human-input-${request.requestId}`}\n >\n <div className=\"human-input-card__heading\">\n <strong id={`human-input-${request.requestId}`}>\n {request.prompt}\n </strong>\n </div>\n {showText ? (\n <form onSubmit={submitText}>\n <label htmlFor={`human-input-text-${request.requestId}`}>\n Response\n </label>\n <div>\n <input\n id={`human-input-text-${request.requestId}`}\n value={text}\n disabled={disabled}\n onChange={(event) => setText(event.target.value)}\n />\n <button type=\"submit\" disabled={disabled || !text.trim()}>\n Send\n </button>\n </div>\n </form>\n ) : null}\n {!showText && options.length === 0 ? (\n <p className=\"human-input-card__unavailable\" role=\"status\">\n This request can’t be answered here.\n </p>\n ) : null}\n </section>\n );\n}\n","import type {\n AgentInputRequest,\n AgentInputResponse,\n} from \"../../../runtime/types\";\nimport \"./ConfirmationCard.css\";\n\nexport function ConfirmationCard({\n disabled = false,\n request,\n onRespond,\n}: {\n disabled?: boolean;\n request: AgentInputRequest;\n onRespond?: (response: AgentInputResponse) => void;\n}) {\n const options = request.options ?? [];\n const heading =\n request.kind === \"tool-approval\" ? \"Confirm this action\" : request.prompt;\n const prompt =\n request.kind === \"tool-approval\" ? request.prompt : undefined;\n return (\n <section\n className=\"confirmation-card\"\n aria-labelledby={`confirmation-${request.requestId}`}\n >\n <div className=\"confirmation-card__heading\">\n <strong id={`confirmation-${request.requestId}`}>{heading}</strong>\n {prompt ? <p>{prompt}</p> : null}\n </div>\n <div className=\"confirmation-card__actions\">\n {options.map((option) => (\n <button\n key={option.id}\n type=\"button\"\n className={`confirmation-card__action confirmation-card__action--${\n option.style ?? \"default\"\n }`}\n disabled={disabled}\n onClick={() =>\n onRespond?.({\n requestId: request.requestId,\n optionId: option.id,\n })\n }\n >\n {option.label}\n </button>\n ))}\n </div>\n </section>\n );\n}\n","import { useState, type FormEvent } from \"react\";\nimport type { AgentToolResultJsonValue } from \"../../../runtime/tool-result-envelope\";\nimport type {\n AgentToolUiField,\n AgentToolUiOption,\n AgentToolUiSurface,\n} from \"../../../runtime/tool-ui\";\nimport \"./ToolInputCard.css\";\n\ntype FieldValues = Record<string, AgentToolResultJsonValue>;\ntype FieldErrors = Record<string, string>;\n\nfunction isRecord(\n value: AgentToolResultJsonValue | undefined\n): value is Record<string, AgentToolResultJsonValue> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction pathSegments(path: string) {\n return path\n .replace(/\\[(\\d+)\\]/gu, \".$1\")\n .split(\".\")\n .filter(Boolean);\n}\n\nfunction valueAtPath(\n root: Readonly<Record<string, AgentToolResultJsonValue>> | undefined,\n path: string\n): AgentToolResultJsonValue | undefined {\n let current: AgentToolResultJsonValue | undefined = root;\n for (const segment of pathSegments(path)) {\n if (Array.isArray(current)) {\n const index = Number(segment);\n current = Number.isInteger(index) ? current[index] : undefined;\n continue;\n }\n current = isRecord(current) ? current[segment] : undefined;\n }\n return current;\n}\n\nfunction initialFieldValue(\n field: AgentToolUiField,\n surface: AgentToolUiSurface\n): AgentToolResultJsonValue {\n const supplied = valueAtPath(surface.values, field.path);\n if (supplied !== undefined) return supplied;\n if (field.defaultValue !== undefined) return field.defaultValue;\n if (field.kind === \"checkbox\" || field.kind === \"confirmation\") return false;\n if (field.kind === \"multi-select\") return [];\n if (field.kind === \"range\") return field.min ?? 0;\n return \"\";\n}\n\nfunction initialValues(surface: AgentToolUiSurface): FieldValues {\n return Object.fromEntries(\n surface.fields.map((field) => [\n field.path,\n initialFieldValue(field, surface),\n ])\n );\n}\n\nfunction cloneJsonValue(\n value: AgentToolResultJsonValue\n): AgentToolResultJsonValue {\n if (Array.isArray(value)) return value.map(cloneJsonValue);\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, cloneJsonValue(item)])\n );\n }\n return value;\n}\n\nfunction assignPath(\n target: Record<string, AgentToolResultJsonValue>,\n path: string,\n value: AgentToolResultJsonValue\n) {\n const segments = pathSegments(path);\n let current: Record<string, AgentToolResultJsonValue> = target;\n segments.forEach((segment, index) => {\n if (index === segments.length - 1) {\n current[segment] = value;\n return;\n }\n const existing = current[segment];\n if (!isRecord(existing)) current[segment] = {};\n current = current[segment] as Record<string, AgentToolResultJsonValue>;\n });\n}\n\nfunction isJsonValue(\n value: unknown,\n seen = new Set<object>()\n): value is AgentToolResultJsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\" || seen.has(value)) return false;\n seen.add(value);\n const valid = Array.isArray(value)\n ? value.every((item) => isJsonValue(item, seen))\n : Object.values(value).every((item) => isJsonValue(item, seen));\n seen.delete(value);\n return valid;\n}\n\nfunction parsedFieldValue(\n field: AgentToolUiField,\n value: AgentToolResultJsonValue\n): AgentToolResultJsonValue | undefined {\n if (field.kind !== \"json\" || typeof value !== \"string\") return value;\n try {\n const parsed: unknown = JSON.parse(value);\n return isJsonValue(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isEmpty(value: AgentToolResultJsonValue) {\n if (typeof value === \"string\") return value.trim().length === 0;\n if (Array.isArray(value)) return value.length === 0;\n return value === null || value === false;\n}\n\nfunction validateField(\n field: AgentToolUiField,\n value: AgentToolResultJsonValue\n) {\n if (field.required && isEmpty(value))\n return `Enter ${field.label.toLowerCase()}.`;\n if (typeof value === \"string\" && value.trim().length === 0) return \"\";\n if (\n field.kind === \"email\" &&\n (typeof value !== \"string\" || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/u.test(value))\n ) {\n return \"Enter a valid email address.\";\n }\n if (typeof value === \"string\") {\n if (field.minLength !== undefined && value.length < field.minLength) {\n return `Use at least ${field.minLength} characters.`;\n }\n if (field.maxLength !== undefined && value.length > field.maxLength) {\n return `Use no more than ${field.maxLength} characters.`;\n }\n }\n if (typeof value === \"number\") {\n if (field.min !== undefined && value < field.min) {\n return `Choose ${field.min} or higher.`;\n }\n if (field.max !== undefined && value > field.max) {\n return `Choose ${field.max} or lower.`;\n }\n }\n if (\n field.maxItems !== undefined &&\n Array.isArray(value) &&\n value.length > field.maxItems\n ) {\n return `Choose no more than ${field.maxItems}.`;\n }\n if (field.kind === \"json\" && parsedFieldValue(field, value) === undefined) {\n return \"Enter valid JSON.\";\n }\n return \"\";\n}\n\nfunction optionKey(option: AgentToolUiOption) {\n return JSON.stringify(option.value);\n}\n\nfunction valuesMatch(\n left: AgentToolResultJsonValue,\n right: AgentToolResultJsonValue\n) {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction FieldDescription({\n field,\n id,\n}: {\n field: AgentToolUiField;\n id: string;\n}) {\n return field.description ? (\n <span id={id} className=\"tool-input-card__description\">\n {field.description}\n </span>\n ) : null;\n}\n\nfunction ChoiceField({\n field,\n id,\n value,\n disabled,\n describedBy,\n error,\n onBlur,\n onChange,\n}: {\n field: AgentToolUiField;\n id: string;\n value: AgentToolResultJsonValue;\n disabled: boolean;\n describedBy?: string;\n error: string;\n onBlur: () => void;\n onChange: (value: AgentToolResultJsonValue) => void;\n}) {\n const options = field.options ?? [];\n const multiple = field.kind === \"multi-select\";\n const selected = Array.isArray(value) ? value : [];\n\n if (field.kind === \"select\") {\n const selectedIndex = options.findIndex((option) =>\n valuesMatch(option.value, value)\n );\n return (\n <select\n id={id}\n value={selectedIndex >= 0 ? String(selectedIndex) : \"\"}\n disabled={disabled}\n required={field.required}\n aria-describedby={describedBy}\n aria-invalid={Boolean(error)}\n onBlur={onBlur}\n onChange={(event) => {\n const option = options[Number(event.target.value)];\n if (option) onChange(option.value);\n }}\n >\n <option value=\"\" disabled={field.required}>\n Choose an option\n </option>\n {options.map((option, index) => (\n <option key={optionKey(option)} value={index}>\n {option.label}\n </option>\n ))}\n </select>\n );\n }\n\n return (\n <div\n className=\"tool-input-card__choices\"\n role={multiple ? \"group\" : \"radiogroup\"}\n aria-labelledby={`${id}-label`}\n aria-describedby={describedBy}\n aria-invalid={Boolean(error)}\n aria-required={field.required}\n >\n {options.map((option, index) => {\n const checked = multiple\n ? selected.some((item) => valuesMatch(item, option.value))\n : valuesMatch(value, option.value);\n return (\n <label className=\"tool-input-card__choice\" key={optionKey(option)}>\n <input\n type={multiple ? \"checkbox\" : \"radio\"}\n name={id}\n value={String(index)}\n checked={checked}\n disabled={disabled}\n onBlur={onBlur}\n onChange={() => {\n if (!multiple) {\n onChange(option.value);\n return;\n }\n onChange(\n checked\n ? selected.filter(\n (item) => !valuesMatch(item, option.value)\n )\n : [...selected, option.value]\n );\n }}\n />\n <span>{option.label}</span>\n </label>\n );\n })}\n </div>\n );\n}\n\nfunction ToolField({\n disabled,\n error,\n field,\n id,\n value,\n onBlur,\n onChange,\n}: {\n disabled: boolean;\n error: string;\n field: AgentToolUiField;\n id: string;\n value: AgentToolResultJsonValue;\n onBlur: () => void;\n onChange: (value: AgentToolResultJsonValue) => void;\n}) {\n const describedBy = [\n field.description ? `${id}-description` : \"\",\n error ? `${id}-error` : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (field.kind === \"checkbox\" || field.kind === \"confirmation\") {\n return (\n <div className=\"tool-input-card__field\">\n <label className=\"tool-input-card__check\" htmlFor={id}>\n <input\n id={id}\n type=\"checkbox\"\n checked={value === true}\n disabled={disabled}\n aria-describedby={describedBy || undefined}\n aria-invalid={Boolean(error)}\n onBlur={onBlur}\n onChange={(event) => onChange(event.target.checked)}\n />\n <span>\n <strong>{field.label}</strong>\n {field.description ? (\n <span id={`${id}-description`}>{field.description}</span>\n ) : null}\n </span>\n </label>\n {error ? (\n <span id={`${id}-error`} className=\"tool-input-card__error\">\n {error}\n </span>\n ) : null}\n </div>\n );\n }\n\n const label = (\n <label id={`${id}-label`} htmlFor={id}>\n {field.label}\n {field.required ? <span aria-hidden=\"true\"> *</span> : null}\n </label>\n );\n const common = {\n id,\n disabled,\n required: field.required,\n \"aria-describedby\": describedBy || undefined,\n \"aria-invalid\": Boolean(error),\n onBlur,\n };\n let control;\n\n if (\n field.kind === \"select\" ||\n field.kind === \"radio\" ||\n field.kind === \"multi-select\"\n ) {\n control = (\n <ChoiceField\n field={field}\n id={id}\n value={value}\n disabled={disabled}\n describedBy={describedBy || undefined}\n error={error}\n onBlur={onBlur}\n onChange={onChange}\n />\n );\n } else if (field.kind === \"textarea\" || field.kind === \"json\") {\n control = (\n <textarea\n {...common}\n rows={field.kind === \"json\" ? 4 : 3}\n maxLength={field.maxLength}\n minLength={field.minLength}\n placeholder={field.placeholder}\n value={typeof value === \"string\" ? value : JSON.stringify(value)}\n onChange={(event) => onChange(event.target.value)}\n />\n );\n } else if (field.kind === \"range\") {\n const numericValue = typeof value === \"number\" ? value : field.min ?? 0;\n control = (\n <div className=\"tool-input-card__range\">\n <input\n {...common}\n type=\"range\"\n min={field.min}\n max={field.max}\n step={field.step}\n value={numericValue}\n onChange={(event) => onChange(Number(event.target.value))}\n />\n <output htmlFor={id}>{numericValue}</output>\n </div>\n );\n } else {\n const type =\n field.kind === \"date-time\"\n ? \"datetime-local\"\n : field.kind === \"calendar\"\n ? \"date\"\n : field.kind;\n control = (\n <input\n {...common}\n type={type}\n min={field.min}\n max={field.max}\n step={field.step}\n minLength={field.minLength}\n maxLength={field.maxLength}\n placeholder={field.placeholder}\n value={\n typeof value === \"number\" || typeof value === \"string\" ? value : \"\"\n }\n onChange={(event) =>\n onChange(\n field.kind === \"number\" && event.target.value !== \"\"\n ? Number(event.target.value)\n : event.target.value\n )\n }\n />\n );\n }\n\n return (\n <div className=\"tool-input-card__field\">\n {label}\n <FieldDescription field={field} id={`${id}-description`} />\n {control}\n {error ? (\n <span id={`${id}-error`} className=\"tool-input-card__error\">\n {error}\n </span>\n ) : null}\n </div>\n );\n}\n\nexport function ToolInputCard({\n disabled = false,\n surface,\n onSubmit,\n}: {\n disabled?: boolean;\n surface: AgentToolUiSurface;\n onSubmit?: (\n surface: AgentToolUiSurface,\n values: Record<string, AgentToolResultJsonValue>\n ) => void;\n}) {\n const [values, setValues] = useState<FieldValues>(() =>\n initialValues(surface)\n );\n const [touched, setTouched] = useState<ReadonlySet<string>>(() => new Set());\n const [submitted, setSubmitted] = useState(false);\n const errors = Object.fromEntries(\n surface.fields.map((field) => [\n field.path,\n touched.has(field.path)\n ? validateField(field, values[field.path] ?? \"\")\n : \"\",\n ])\n ) as FieldErrors;\n\n function submit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (disabled || submitted) return;\n const allTouched = new Set(surface.fields.map((field) => field.path));\n setTouched(allTouched);\n const nextErrors = surface.fields.map((field) =>\n validateField(field, values[field.path] ?? \"\")\n );\n if (nextErrors.some(Boolean)) return;\n\n const result = isRecord(surface.values)\n ? (cloneJsonValue(surface.values) as Record<\n string,\n AgentToolResultJsonValue\n >)\n : {};\n for (const field of surface.fields) {\n const parsed = parsedFieldValue(field, values[field.path] ?? \"\");\n if (parsed !== undefined) assignPath(result, field.path, parsed);\n }\n setSubmitted(true);\n onSubmit?.(surface, result);\n }\n\n if (submitted) {\n return (\n <section\n className=\"tool-input-card tool-input-card--submitted\"\n role=\"status\"\n >\n <span aria-hidden=\"true\">✓</span>\n <strong>{surface.title} submitted</strong>\n </section>\n );\n }\n\n return (\n <section\n className=\"tool-input-card\"\n aria-labelledby={`tool-input-${surface.id}`}\n >\n <div className=\"tool-input-card__heading\">\n <strong id={`tool-input-${surface.id}`}>{surface.title}</strong>\n {surface.description ? <p>{surface.description}</p> : null}\n </div>\n <form noValidate onSubmit={submit}>\n <div className=\"tool-input-card__fields\">\n {surface.fields.map((field, index) => (\n <ToolField\n key={field.path}\n disabled={disabled}\n error={errors[field.path] ?? \"\"}\n field={field}\n id={`tool-input-${surface.id}-${index}`}\n value={values[field.path] ?? \"\"}\n onBlur={() =>\n setTouched((current) => new Set([...current, field.path]))\n }\n onChange={(value) =>\n setValues((current) => ({ ...current, [field.path]: value }))\n }\n />\n ))}\n </div>\n <div className=\"tool-input-card__actions\">\n {surface.actions?.some((action) => action.id === \"reset\") ? (\n <button\n type=\"button\"\n className=\"tool-input-card__secondary\"\n disabled={disabled}\n onClick={() => {\n setValues(initialValues(surface));\n setTouched(new Set());\n }}\n >\n {surface.actions.find((action) => action.id === \"reset\")?.label ??\n \"Clear\"}\n </button>\n ) : null}\n <button type=\"submit\" disabled={disabled}>\n {surface.submitLabel ??\n surface.actions?.find((action) => action.id === \"submit\")\n ?.label ??\n \"Continue\"}\n </button>\n </div>\n </form>\n </section>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type {\n AgentInputRequest,\n AgentInputResponse,\n} from \"../../../runtime/types\";\nimport {\n getPreciseLocation,\n preciseLocationResponse,\n} from \"../../../runtime/location-consent\";\nimport \"./LocationConsent.css\";\n\nexport function LocationConsent({\n request,\n onRespond,\n}: {\n request?: AgentInputRequest;\n onRespond?: (response: AgentInputResponse) => void;\n}) {\n const [preference, setPreference] = useState<\"unset\" | \"on\" | \"off\">(\"unset\");\n const [locating, setLocating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const respond = useRef(onRespond);\n const answered = useRef<string | null>(null);\n const requestId = request?.requestId;\n useEffect(() => {\n respond.current = onRespond;\n }, [onRespond]);\n\n useEffect(() => {\n if (\n !requestId ||\n preference === \"unset\" ||\n answered.current === requestId ||\n !respond.current\n )\n return;\n if (preference === \"off\") {\n setLocating(false);\n answered.current = requestId;\n respond.current({\n requestId,\n optionId: \"approve\",\n text: JSON.stringify({ status: \"declined\" }),\n });\n return;\n }\n let cancelled = false;\n const pendingId = requestId;\n setLocating(true);\n setError(null);\n async function locate() {\n try {\n if (!Reflect.has(navigator, \"geolocation\"))\n throw new Error(\"Location sharing isn’t available in this browser.\");\n const position = await getPreciseLocation(navigator.geolocation);\n if (cancelled) return;\n const response = preciseLocationResponse(pendingId, position);\n answered.current = pendingId;\n respond.current?.(response);\n } catch (failure: unknown) {\n if (cancelled) return;\n setPreference(\"unset\");\n setError(\n failure instanceof Error\n ? failure.message\n : \"Location sharing failed. Try again or continue without sharing.\"\n );\n } finally {\n if (!cancelled) setLocating(false);\n }\n }\n void locate();\n return () => {\n cancelled = true;\n };\n }, [requestId, preference]);\n\n const isLocating = Boolean(requestId) && preference === \"on\" && locating;\n if (!request && preference === \"unset\") return null;\n return (\n <section className=\"location-consent\" aria-label=\"Location sharing\">\n <div className=\"location-consent__copy\">\n <strong>\n {isLocating\n ? \"Getting your location…\"\n : request\n ? \"Get better results\"\n : \"Precise location\"}\n </strong>\n <span>\n {isLocating\n ? \"Allow location access in your browser.\"\n : request\n ? \"Share your precise location\"\n : preference === \"on\"\n ? \"On for location-aware answers\"\n : \"Off for this chat\"}\n </span>\n </div>\n <div className=\"location-consent__actions\">\n <button\n type=\"button\"\n role=\"switch\"\n className=\"location-consent__toggle\"\n aria-label=\"Share precise location\"\n aria-checked={preference === \"on\"}\n aria-busy={isLocating}\n disabled={!onRespond}\n onClick={() => {\n setError(null);\n setPreference(preference === \"on\" ? \"off\" : \"on\");\n }}\n >\n <span />\n </button>\n {request && (\n <button\n type=\"button\"\n className=\"location-consent__decline\"\n disabled={!onRespond}\n onClick={() => {\n setError(null);\n setPreference(\"off\");\n }}\n >\n No thanks\n </button>\n )}\n </div>\n {error && (\n <p role=\"alert\" className=\"location-consent__error\">\n {error}\n </p>\n )}\n </section>\n );\n}\n","import type { AgentInputRequest, AgentInputResponse } from \"./types\";\n\nexport function isLocationConsentRequest(request: AgentInputRequest) {\n return (\n request.kind === \"tool-approval\" &&\n request.action.toolName === \"request_location\"\n );\n}\n\nexport function preciseLocationResponse(\n requestId: string,\n position: GeolocationPosition\n): AgentInputResponse {\n const { latitude, longitude, accuracy } = position.coords;\n if (\n !Number.isFinite(latitude) ||\n latitude < -90 ||\n latitude > 90 ||\n !Number.isFinite(longitude) ||\n longitude < -180 ||\n longitude > 180 ||\n !Number.isFinite(accuracy) ||\n accuracy < 0 ||\n !Number.isFinite(position.timestamp)\n ) {\n throw new Error(\"Your device returned an invalid location.\");\n }\n return {\n requestId,\n optionId: \"approve\",\n text: JSON.stringify({\n status: \"shared\",\n location: {\n source: \"device\",\n latitude,\n longitude,\n accuracyMeters: accuracy,\n capturedAt: new Date(position.timestamp).toISOString(),\n consentedAt: new Date().toISOString(),\n scope: \"conversation\",\n },\n }),\n };\n}\n\nexport function getPreciseLocation(\n geolocation: Pick<Geolocation, \"getCurrentPosition\">\n): Promise<GeolocationPosition> {\n return new Promise((resolve, reject) =>\n geolocation.getCurrentPosition(\n resolve,\n (error) =>\n reject(\n new Error(\n error.code === 1\n ? \"Location access is blocked. Allow it in your browser, or continue without sharing.\"\n : \"Your location couldn’t be found. Try again or continue without sharing.\"\n )\n ),\n { enableHighAccuracy: true, maximumAge: 0, timeout: 10_000 }\n )\n );\n}\n","import type { VisitorCollectionResultPresentation } from \"../../lib/tool-result\";\nimport \"../ToolResultCard/ToolResultCard.css\";\nimport \"./CollectionResultCard.css\";\n\nexport function CollectionResultCard({\n result,\n}: {\n result: VisitorCollectionResultPresentation;\n}) {\n const empty = result.items.length === 0;\n return (\n <section\n className={`collection-result-card tool-result-card tool-result-card--${result.status}`}\n aria-label={result.title}\n role={result.status === \"completed\" ? \"status\" : \"alert\"}\n >\n <div className=\"tool-result-card__heading\">\n <span className=\"tool-result-card__status\" aria-hidden=\"true\" />\n <strong>{result.title}</strong>\n </div>\n {empty ? (\n <p className=\"collection-result-card__empty\">\n No matching record for the email you shared.\n </p>\n ) : (\n <ul className=\"collection-result-card__list\">\n {result.items.map((item) => (\n <li key={item.title}>\n <div className=\"collection-result-card__item-title\">{item.title}</div>\n {item.description ? <p>{item.description}</p> : null}\n {item.details?.length ? (\n <dl>\n {item.details.map((detail) => (\n <div key={`${detail.label}:${detail.value}`}>\n <dt>{detail.label}</dt>\n <dd>{detail.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {item.href ? (\n <a href={item.href} target=\"_blank\" rel=\"noreferrer\">\n Open record\n </a>\n ) : null}\n </li>\n ))}\n </ul>\n )}\n </section>\n );\n}\n","import type { VisitorEntityResultPresentation } from \"../../lib/tool-result\";\nimport \"../ToolResultCard/ToolResultCard.css\";\nimport \"./EntityResultCard.css\";\n\nexport function EntityResultCard({\n result,\n}: {\n result: VisitorEntityResultPresentation;\n}) {\n const compact =\n !result.description && !result.details?.length && !result.links?.length;\n const collapsible =\n result.status === \"completed\" &&\n Boolean(result.details?.length) &&\n !result.links?.length;\n const heading = (\n <span className=\"tool-result-card__heading\">\n <span className=\"tool-result-card__status\" aria-hidden=\"true\" />\n <strong>{result.title}</strong>\n </span>\n );\n const content = (\n <>\n {result.description ? <p>{result.description}</p> : null}\n {result.details?.length ? (\n <dl>\n {result.details.map((detail) => (\n <div key={`${detail.label}:${detail.value}`}>\n <dt>{detail.label}</dt>\n <dd>{detail.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {result.links?.length ? (\n <div className=\"tool-result-card__links\">\n {result.links.map((link) => (\n <a\n key={link.href}\n href={link.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {link.label}\n </a>\n ))}\n </div>\n ) : null}\n </>\n );\n if (collapsible) {\n return (\n <details className=\"entity-result-card tool-result-card entity-result-card--disclosure\">\n <summary>\n <span role=\"status\">{heading}</span>\n </summary>\n {content}\n </details>\n );\n }\n return (\n <section\n className={`entity-result-card tool-result-card tool-result-card--${result.status}${compact ? \" entity-result-card--compact\" : \"\"}`}\n aria-label={result.title}\n role={result.status === \"completed\" ? \"status\" : \"alert\"}\n >\n {heading}\n {content}\n </section>\n );\n}\n","import type { VisitorSignatureResultPresentation } from \"../../lib/tool-result\";\nimport \"../ToolResultCard/ToolResultCard.css\";\nimport \"./SignatureResultCard.css\";\n\nexport function SignatureResultCard({\n result,\n}: {\n result: VisitorSignatureResultPresentation;\n}) {\n const primaryLink = result.links?.[0];\n return (\n <section\n className={`signature-result-card tool-result-card tool-result-card--${result.status}`}\n aria-label={result.title}\n >\n <div className=\"tool-result-card__heading\">\n <span className=\"tool-result-card__status\" aria-hidden=\"true\" />\n <strong>{result.title}</strong>\n </div>\n {result.statusLabel ? (\n <span className=\"signature-result-card__badge\">{result.statusLabel}</span>\n ) : null}\n {result.description ? <p>{result.description}</p> : null}\n {primaryLink ? (\n <a\n className=\"signature-result-card__cta\"\n href={primaryLink.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {primaryLink.label}\n </a>\n ) : null}\n </section>\n );\n}\n","import type { VisitorToolResultPresentation } from \"../../lib/tool-result\";\nimport \"./ToolResultCard.css\";\n\nexport function ToolResultCard({\n result,\n}: {\n result: VisitorToolResultPresentation;\n}) {\n return (\n <section\n className={`tool-result-card tool-result-card--${result.status}`}\n aria-label={result.title}\n role={result.status === \"completed\" ? \"status\" : \"alert\"}\n >\n <div className=\"tool-result-card__heading\">\n <span className=\"tool-result-card__status\" aria-hidden=\"true\" />\n <strong>{result.title}</strong>\n </div>\n {result.description ? <p>{result.description}</p> : null}\n {result.details?.length ? (\n <dl>\n {result.details.map((detail) => (\n <div key={`${detail.label}:${detail.value}`}>\n <dt>{detail.label}</dt>\n <dd>{detail.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {result.links?.length ? (\n <div className=\"tool-result-card__links\">\n {result.links.map((link) => (\n <a\n key={link.href}\n href={link.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {link.label}\n </a>\n ))}\n </div>\n ) : null}\n </section>\n );\n}\n","import type { ResolvedVisitorToolResultPresentation } from \"../../lib/tool-result\";\nimport type { AgentToolResultJsonValue } from \"../../../runtime/tool-result-envelope\";\nimport type { AgentToolUiSurface } from \"../../../runtime/tool-ui\";\nimport { CollectionResultCard } from \"../CollectionResultCard/CollectionResultCard\";\nimport { EntityResultCard } from \"../EntityResultCard/EntityResultCard\";\nimport { SignatureResultCard } from \"../SignatureResultCard/SignatureResultCard\";\nimport { ToolResultCard } from \"../ToolResultCard/ToolResultCard\";\nimport { ToolInputCard } from \"../ToolInputCard/ToolInputCard\";\n\nexport function VisitorToolResultView({\n disabled = false,\n onToolInput,\n result,\n}: {\n disabled?: boolean;\n onToolInput?: (\n surface: AgentToolUiSurface,\n values: Record<string, AgentToolResultJsonValue>,\n ) => void;\n result: ResolvedVisitorToolResultPresentation;\n}) {\n if (result.kind === \"input\") {\n return (\n <ToolInputCard\n disabled={disabled}\n surface={result.surface}\n onSubmit={onToolInput}\n />\n );\n }\n if (result.kind === \"entity\") {\n return <EntityResultCard result={result} />;\n }\n if (result.kind === \"collection\") {\n return <CollectionResultCard result={result} />;\n }\n if (result.kind === \"signature\") {\n return <SignatureResultCard result={result} />;\n }\n if (result.kind === \"summary\") {\n return <ToolResultCard result={result} />;\n }\n return null;\n}\n\nexport function isRenderableVisitorToolResult(\n result: ResolvedVisitorToolResultPresentation,\n) {\n return (\n result.kind === \"summary\" ||\n result.kind === \"input\" ||\n result.kind === \"entity\" ||\n result.kind === \"collection\" ||\n result.kind === \"signature\"\n );\n}\n","import { useState, type CSSProperties } from \"react\";\nimport { snapBrandLogoDisplaySize } from \"../../lib/brand-logo-display\";\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 ChatSparkIcon() {\n return (\n <svg\n className=\"assist-edge-tab__chat-spark\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n className=\"assist-edge-tab__spark assist-edge-tab__spark--a\"\n d=\"M19.55 1.55l.78 1.82 1.82.78-1.82.78-.78 1.82-.78-1.82-1.82-.78 1.82-.78.78-1.82z\"\n fill=\"currentColor\"\n />\n <path\n className=\"assist-edge-tab__spark assist-edge-tab__spark--b\"\n d=\"M4.15 17.35l.48 1.12 1.12.48-1.12.48-.48 1.12-.48-1.12-1.12-.48 1.12-.48.48-1.12z\"\n fill=\"currentColor\"\n />\n <g className=\"assist-edge-tab__bot\">\n <path\n d=\"M11.15 5.2V3.05\"\n stroke=\"currentColor\"\n strokeWidth=\"1.9\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"11.15\" cy=\"2.45\" r=\"0.85\" fill=\"currentColor\" />\n <rect\n x=\"3.55\"\n y=\"5.35\"\n width=\"15.2\"\n height=\"11.15\"\n rx=\"3.9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.9\"\n />\n <circle\n className=\"assist-edge-tab__eye\"\n cx=\"8.7\"\n cy=\"10.85\"\n r=\"1.28\"\n fill=\"currentColor\"\n />\n <circle\n className=\"assist-edge-tab__eye assist-edge-tab__eye--r\"\n cx=\"14.35\"\n cy=\"10.85\"\n r=\"1.28\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n );\n}\n\nfunction TabMarkIcon({\n customIconUrl,\n logoUrl,\n chip = false,\n}: {\n customIconUrl?: string;\n logoUrl?: string;\n chip?: boolean;\n}) {\n const custom = customIconUrl?.trim();\n const logo = logoUrl?.trim();\n const [customFailed, setCustomFailed] = useState(false);\n const [logoFailed, setLogoFailed] = useState(false);\n const [markDisplay, setMarkDisplay] = useState<{\n url: string;\n width: number;\n height: number;\n wide: boolean;\n } | null>(null);\n\n function applyLauncherLogoSize(img: HTMLImageElement, sourceUrl: string) {\n if (!chip) return;\n const display = snapBrandLogoDisplaySize({\n naturalHeight: img.naturalHeight,\n naturalWidth: img.naturalWidth,\n surface: \"launcher\",\n });\n setMarkDisplay({\n url: sourceUrl,\n width: display.width,\n height: display.height,\n wide: display.wide,\n });\n }\n\n const chipMarkStyle =\n chip && markDisplay\n ? {\n width: `${markDisplay.width}px`,\n height: `${markDisplay.height}px`,\n }\n : undefined;\n\n if (custom && !customFailed) {\n return (\n <img\n alt=\"\"\n aria-hidden\n className={`assist-edge-tab__custom-icon as-brand-logo-img${\n chip ? \" assist-edge-tab__custom-icon--chip\" : \"\"\n }`}\n src={custom}\n decoding=\"async\"\n style={markDisplay?.url === custom ? chipMarkStyle : undefined}\n onLoad={(event) => {\n if (chip) {\n applyLauncherLogoSize(event.currentTarget, custom);\n }\n }}\n onError={() => setCustomFailed(true)}\n />\n );\n }\n\n if (logo && !logoFailed) {\n return (\n <img\n alt=\"\"\n aria-hidden\n className={`assist-edge-tab__logo as-brand-logo-img${\n chip ? \" assist-edge-tab__logo--chip\" : \"\"\n }${\n chip && markDisplay?.url === logo && markDisplay.wide\n ? \" assist-edge-tab__logo--wide\"\n : \"\"\n }`}\n src={logo}\n decoding=\"async\"\n style={markDisplay?.url === logo ? chipMarkStyle : undefined}\n onLoad={(event) => {\n applyLauncherLogoSize(event.currentTarget, logo);\n }}\n onError={() => setLogoFailed(true)}\n />\n );\n }\n\n return <ChatSparkIcon />;\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 subLabel,\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 subLabel?: 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 visibleSubLabel = subLabel?.trim() || \"\";\n const pill = mobile || side === \"bottom\";\n const chromeScheme = pill ? \"light\" : resolvedColorScheme;\n const ariaLabel = visibleSubLabel\n ? `Open ${visibleLabel} — ${visibleSubLabel}`\n : `Open ${visibleLabel}`;\n const alignment = along < 50 ? \"start\" : along > 50 ? \"end\" : \"center\";\n const resolvedBrandColor =\n brandColor ??\n (chromeScheme === \"dark\" ? defaultDarkAgentRailTheme.brand : undefined);\n const resolvedBorderColor =\n chromeScheme === \"dark\" ? defaultDarkAgentRailTheme.border : borderColor;\n const resolvedSurfaceColor =\n chromeScheme === \"dark\" ? defaultDarkAgentRailTheme.surface : surfaceColor;\n const resolvedTextColor =\n chromeScheme === \"dark\" ? defaultDarkAgentRailTheme.text : textColor;\n const markSourceKey = `${customIconUrl?.trim() ?? \"\"}|${logoUrl?.trim() ?? \"\"}`;\n const style = {\n \"--tab-along\": `${along}%`,\n \"--tab-inset\": `${inset}px`,\n ...(resolvedBrandColor ? { \"--as-brand\": resolvedBrandColor } : {}),\n ...(pill && resolvedBrandColor\n ? { \"--pill-logo-surface\": resolvedBrandColor }\n : {}),\n ...(brandForeground ? { \"--as-visitor-text\": brandForeground } : {}),\n ...(resolvedBorderColor ? { \"--as-border\": resolvedBorderColor } : {}),\n ...(fontFamily ? { \"--as-font-display\": fontFamily } : {}),\n ...(pill\n ? {\n \"--as-surface\": \"#ffffff\",\n \"--as-text\": \"#171717\",\n backgroundColor: \"#ffffff\",\n }\n : resolvedSurfaceColor\n ? { \"--as-surface\": resolvedSurfaceColor }\n : {}),\n ...(!pill && resolvedTextColor ? { \"--as-text\": resolvedTextColor } : {}),\n colorScheme: chromeScheme,\n } as unknown as CSSProperties;\n\n return (\n <button\n type=\"button\"\n className={`assist-edge-tab assist-edge-tab--${variant} assist-edge-tab--${side} assist-edge-tab--align-${alignment}${\n mobile ? \" assist-edge-tab--mobile\" : \"\"\n }${visible ? \" is-visible\" : \"\"}`}\n data-color-scheme={chromeScheme}\n style={style}\n aria-label={ariaLabel}\n aria-hidden={!visible}\n tabIndex={visible ? 0 : -1}\n onClick={onOpen}\n >\n {pill ? (\n <>\n <span\n className={`assist-edge-tab__mark assist-edge-tab__mark--chip${\n mobile ? \" assist-edge-tab__mark--mobile\" : \"\"\n }`}\n aria-hidden=\"true\"\n >\n <TabMarkIcon\n key={markSourceKey}\n chip\n customIconUrl={customIconUrl}\n logoUrl={logoUrl}\n />\n </span>\n <span className=\"assist-edge-tab__text\">\n <span className=\"assist-edge-tab__label\">{visibleLabel}</span>\n {visibleSubLabel ? (\n <span className=\"assist-edge-tab__sublabel\">\n {visibleSubLabel}\n </span>\n ) : null}\n </span>\n </>\n ) : variant === \"outline\" ? (\n <>\n <span className=\"assist-edge-tab__mark\" aria-hidden=\"true\">\n <TabMarkIcon\n key={markSourceKey}\n chip\n customIconUrl={customIconUrl}\n logoUrl={logoUrl}\n />\n </span>\n <span className=\"assist-edge-tab__label\">{visibleLabel}</span>\n <ChevronDownIcon />\n </>\n ) : null}\n\n {!pill && variant === \"ask\" ? (\n <>\n <ChevronLeftIcon />\n <span className=\"assist-edge-tab__label\">{visibleLabel}</span>\n <DragDots />\n </>\n ) : null}\n\n {!pill && variant === \"fill\" ? (\n <>\n <span className=\"assist-edge-tab__mark\" aria-hidden=\"true\">\n <TabMarkIcon\n key={markSourceKey}\n chip\n customIconUrl={customIconUrl}\n logoUrl={logoUrl}\n />\n </span>\n <span className=\"assist-edge-tab__label\">{visibleLabel}</span>\n <ChevronLeftIcon />\n </>\n ) : null}\n </button>\n );\n}\n","import type { AgentAnalyticsConfig } from \"../../embed/manifest\";\nimport type { AgentIndexVersion } from \"../../runtime/types\";\nimport type {\n AgentMessageFeedback,\n ConversationMessage,\n} from \"../types/conversation\";\n\nexport const AGENT_ANSWER_FEEDBACK_EVENT_TYPE = \"agent_answer_feedback\";\n\n/** The visitor question that produced the rated agent answer. */\nexport function findPrecedingVisitorText(\n messages: readonly ConversationMessage[],\n agentMessageId: string\n): string | undefined {\n const agentIndex = messages.findIndex(\n (message) => message.id === agentMessageId && message.role === \"agent\"\n );\n if (agentIndex < 0) return undefined;\n for (let index = agentIndex - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message?.role === \"visitor\") {\n return message.text.trim() || undefined;\n }\n }\n return undefined;\n}\n\nexport function normalizeAgentFeedbackAnswerText(text: string): string | undefined {\n const normalized = text.replace(/\\s+/g, \" \").trim();\n if (!normalized) return undefined;\n return normalized.length > 4000\n ? `${normalized.slice(0, 3997)}...`\n : normalized;\n}\n\nexport function buildAgentAnswerFeedbackEvent(input: {\n agentSessionId?: string | undefined;\n analytics: AgentAnalyticsConfig;\n answer?: string | undefined;\n indexId: string;\n messageId: string;\n page: string;\n query?: string | undefined;\n rating: AgentMessageFeedback;\n version: AgentIndexVersion;\n visitorSessionId: string;\n}) {\n const positive = input.rating === \"positive\";\n const answer = input.answer\n ? normalizeAgentFeedbackAnswerText(input.answer)\n : undefined;\n return {\n event_type: AGENT_ANSWER_FEEDBACK_EVENT_TYPE,\n company: input.analytics.companyIndex,\n session_id: input.visitorSessionId,\n page: input.page,\n timestamp: Date.now(),\n tracking_consent: input.analytics.trackingConsent,\n feedback_value: positive ? 1 : -1,\n // Aggregate-safe rating enum, kept even for anonymous (no-consent) events.\n feedback_rating: positive ? \"helpful\" : \"not_helpful\",\n surface: \"agent_panel\",\n index_id: input.indexId,\n index_version: input.version,\n message_id: input.messageId,\n ...(input.agentSessionId ? { agent_session_id: input.agentSessionId } : {}),\n ...(input.analytics.trackingConsent && input.query\n ? { query: input.query }\n : {}),\n ...(input.analytics.trackingConsent && answer ? { answer } : {}),\n } as const;\n}\n\n/**\n * Fire-and-forget analytics POST. Analytics must never break the widget, so\n * every failure is swallowed.\n */\nexport function sendAgentAnswerFeedback(\n eventUrl: string,\n event: Record<string, unknown>\n): void {\n try {\n void fetch(eventUrl, {\n body: JSON.stringify(event),\n credentials: \"omit\",\n headers: { \"Content-Type\": \"application/json\" },\n keepalive: true,\n method: \"POST\",\n }).catch(() => {});\n } catch {\n // Ignore: analytics delivery is best-effort.\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 type AgentPanelSubmitOptions,\n} from \"../../panel-controller\";\nimport { AgentRail } from \"../AgentRail\";\nimport { AssistEdgeTab } from \"../AssistEdgeTab/AssistEdgeTab\";\nimport type {\n AgentAnalyticsConfig,\n AgentBrandingConfig,\n} from \"../../../embed/manifest\";\nimport {\n buildAgentAnswerFeedbackEvent,\n findPrecedingVisitorText,\n sendAgentAnswerFeedback,\n} from \"../../lib/agent-feedback\";\nimport type { AgentMessageFeedback } from \"../MessageActions/MessageActions\";\nimport type {\n AgentColorScheme,\n AgentRailTheme,\n ConversationMessage,\n} from \"../../types/conversation\";\nimport type { VisitorToolResultRegistry } from \"../../lib/tool-result\";\n\nexport type AgentWidgetProps = {\n indexId: string;\n customerId: string;\n getUnpublishedPreviewGrant?: () => Promise<string>;\n previewBuildId?: string;\n version?: AgentIndexVersion;\n runtimeOrigin?: string;\n handoffEnabled?: boolean;\n placement?: Partial<AgentPlacementConfig>;\n defaultCollapsed?: boolean;\n pageShift?: boolean;\n registerPanelController?: boolean;\n colorScheme?: AgentColorScheme;\n branding?: AgentBrandingConfig;\n analytics?: AgentAnalyticsConfig;\n toolResultRegistry?: VisitorToolResultRegistry;\n};\n\nexport function AgentWidget({\n indexId,\n customerId,\n getUnpublishedPreviewGrant,\n previewBuildId,\n version,\n runtimeOrigin,\n handoffEnabled = false,\n placement: placementInput,\n defaultCollapsed = true,\n pageShift = true,\n registerPanelController = false,\n colorScheme = \"auto\",\n branding,\n analytics,\n toolResultRegistry,\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 {\n state,\n handoff,\n reset,\n retry,\n regenerate,\n respondToInput,\n respondToToolInput,\n submit,\n visitorSessionId,\n sessionId,\n } = useAgentChat({\n handoffEnabled,\n customerId,\n getUnpublishedPreviewGrant,\n indexId,\n previewBuildId,\n version,\n runtimeOrigin,\n greeting: branding?.greeting,\n toolResultRegistry,\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 ? {\n onBrand: branding.colors.primaryForeground,\n visitorText: branding.colors.primaryForeground,\n }\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 reset,\n submit,\n });\n\n return () => unregisterAgentPanelController(customerId);\n }, [customerId, registerPanelController, reset, submit]);\n\n async function handleSubmit(message: string, options?: AgentPanelSubmitOptions) {\n if (isMobile) setRailCollapsed(false);\n await submit(message, options);\n }\n\n function handleFeedback(\n rating: AgentMessageFeedback,\n message: ConversationMessage\n ) {\n if (!analytics) return;\n sendAgentAnswerFeedback(\n analytics.eventUrl,\n buildAgentAnswerFeedbackEvent({\n agentSessionId: sessionId,\n analytics,\n indexId,\n messageId: message.id,\n page: window.location.href,\n query: findPrecedingVisitorText(state.messages, message.id),\n answer: message.text,\n rating,\n version: version ?? \"published\",\n visitorSessionId,\n })\n );\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 colorScheme={colorScheme}\n brandLabel={agentName}\n brandLogoUrl={branding?.logoUrl}\n composerPlaceholder={\n branding?.composerPlaceholder ?? \"Ask a question…\"\n }\n poweredByLabel={branding?.poweredByLabel}\n disclaimerLabel={branding?.disclaimer}\n disclaimerLink={branding?.disclaimerLink}\n answerReceipt={branding?.answerReceipt}\n readAloud={branding?.readAloud}\n showLearnMore={branding?.showLearnMore}\n showSources={branding?.showSources}\n state={state}\n handoff={handoff}\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 onRegenerate={() => void regenerate()}\n onFeedback={analytics ? handleFeedback : undefined}\n onInputResponse={(response) => void respondToInput(response)}\n onToolInput={(surface, values) =>\n void respondToToolInput(surface, values)\n }\n onFollowUpSelect={(label) => void handleSubmit(label)}\n onBook={(input) =>\n void submit(input.displayText, {\n preservePendingOffer: true,\n runtimeText: input.runtimeText,\n })\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 subLabel={branding?.tabSubLabel}\n customIconUrl={branding?.tabIconUrl}\n logoUrl={branding?.logoUrl}\n brandColor={\n branding?.colors?.launcherPrimary ?? branding?.colors?.primary\n }\n brandForeground={\n branding?.colors?.launcherPrimaryForeground ??\n branding?.colors?.primaryForeground\n }\n borderColor={\n branding?.colors?.launcherBorder ?? branding?.colors?.border\n }\n fontFamily={branding?.fontFamily}\n mobile={isMobile}\n surfaceColor={branding?.colors?.surface}\n textColor={branding?.colors?.text}\n colorScheme={colorScheme}\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"],"mappings":"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","names":["id","isRecord","isJsonValue","value","text","isFieldKind","record","id","text","asRecord","asString","record","record","asRecord","text","text","asRecord","envelope","record","useEffect","useRef","useState","ClientError","ClientError","text","ClientError","isRecord","response","ClientError","isRecord","trimmed","item","current","ClientError","text","ClientError","record","value","text","useRef","useState","useEffect","regenerate","visitorMessage","controller","useEffect","useRef","useState","text","text","useState","useRef","menu","useEffect","useEffect","useRef","useState","useState","jsx","jsxs","useState","useState","jsx","jsxs","useState","jsx","jsxs","useEffect","useRef","createPortal","jsx","jsxs","useRef","useEffect","createPortal","useEffect","useId","useRef","useState","Fragment","jsx","jsxs","CheckIcon","useState","useRef","useId","useEffect","jsx","jsxs","useEffect","useState","useEffect","useId","useMemo","useRef","useState","jsx","jsxs","useId","useState","useRef","useEffect","useMemo","jsx","jsxs","text","mid","useState","useEffect","useState","jsx","jsxs","useState","jsx","jsxs","isRecord","isJsonValue","id","useState","jsx","jsxs","text","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","Fragment","jsx","jsxs","CloseIcon","useRef","useState","useEffect","hasVisitorMessages","useState","Fragment","jsx","jsxs","useState","ChevronDownIcon","text","useEffect","useRef","useState","useEffect","useEffect","useState","jsx","jsxs","useRef","useState","useEffect"]}
|