@webless/agent 0.8.0 → 0.9.1
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 +39 -5
- package/dist/{chunk-JZPXXG76.js → chunk-3E632FNE.js} +354 -204
- package/dist/chunk-3E632FNE.js.map +1 -0
- package/dist/chunk-TCO62TRN.js +335 -0
- package/dist/chunk-TCO62TRN.js.map +1 -0
- package/dist/embed.cjs +770 -623
- package/dist/embed.cjs.map +1 -1
- package/dist/embed.css +102 -10
- package/dist/embed.css.map +1 -1
- package/dist/embed.d.cts +3 -9
- package/dist/embed.d.ts +3 -9
- package/dist/embed.js +1 -1
- package/dist/index.cjs +752 -680
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -180
- package/dist/index.d.ts +3 -180
- package/dist/index.js +51 -291
- package/dist/index.js.map +1 -1
- package/dist/{manifest-DgjT8-tW.d.cts → panel-controller-D_XIQa1U.d.cts} +9 -2
- package/dist/{manifest-DgjT8-tW.d.ts → panel-controller-D_XIQa1U.d.ts} +9 -2
- package/dist/presentation.cjs +862 -0
- package/dist/presentation.cjs.map +1 -0
- package/dist/presentation.d.cts +160 -0
- package/dist/presentation.d.ts +160 -0
- package/dist/presentation.js +553 -0
- package/dist/presentation.js.map +1 -0
- package/dist/react.cjs +749 -504
- package/dist/react.cjs.map +1 -1
- package/dist/react.css +102 -10
- package/dist/react.css.map +1 -1
- package/dist/react.d.cts +16 -5
- package/dist/react.d.ts +16 -5
- package/dist/react.js +110 -9
- package/dist/react.js.map +1 -1
- package/dist/types-sLEIYDqm.d.cts +181 -0
- package/dist/types-sLEIYDqm.d.ts +181 -0
- package/package.json +7 -2
- package/dist/chunk-JZPXXG76.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/presentation.ts","../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"],"sourcesContent":["import type { AgentToolResult } from \"./runtime/types\";\nimport { presentVisitorToolResult } from \"./react/lib/tool-result\";\nimport { parseAgentToolResultEnvelope } from \"./runtime/tool-result-envelope\";\n\nexport { presentVisitorToolResult } from \"./react/lib/tool-result\";\nexport type { ResolvedVisitorToolResultPresentation } from \"./react/lib/tool-result\";\n\n/** Pure projection for recorded results, including historical provider failures. */\nexport function presentTranscriptToolResult(result: AgentToolResult) {\n const output =\n parseAgentToolResultEnvelope(result.output)?.output ?? result.output;\n const legacyError =\n output !== null &&\n typeof output === \"object\" &&\n \"error\" in output &&\n typeof output.error === \"string\" &&\n output.error.trim().length > 0;\n return presentVisitorToolResult(\n legacyError ? { ...result, status: \"failed\" } : result,\n );\n}\n","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 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 return { sources, ...(cta ? { cta } : {}) };\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","export type ComposerFormFieldKind = \"text\" | \"email\" | \"tel\" | \"textarea\";\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.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 ...(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"],"mappings":"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","names":["isRecord","isJsonValue","value","isFieldKind","record","asRecord","asString","record","record","asRecord","text","asRecord","envelope","record"]}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { p as AgentToolResult, x as AgentToolUiSurface, q as AgentToolResultEnvelope } from './types-sLEIYDqm.cjs';
|
|
2
|
+
|
|
3
|
+
type AgentSearchSource = {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
};
|
|
8
|
+
type AgentSearchReferences = {
|
|
9
|
+
sources: AgentSearchSource[];
|
|
10
|
+
cta?: {
|
|
11
|
+
label: string;
|
|
12
|
+
url?: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
type ComposerFormFieldKind = "text" | "email" | "tel" | "textarea";
|
|
17
|
+
type ComposerFormField = {
|
|
18
|
+
id: string;
|
|
19
|
+
kind: ComposerFormFieldKind;
|
|
20
|
+
label: string;
|
|
21
|
+
placeholder: string;
|
|
22
|
+
required: boolean;
|
|
23
|
+
autocomplete?: string;
|
|
24
|
+
};
|
|
25
|
+
type VisitorFormCard = {
|
|
26
|
+
type: "visitor_form";
|
|
27
|
+
fields: ComposerFormField[];
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
type VisitorBooking = {
|
|
31
|
+
eventUri: string;
|
|
32
|
+
inviteeUri?: string;
|
|
33
|
+
inviteeEmail?: string;
|
|
34
|
+
startTime?: string;
|
|
35
|
+
};
|
|
36
|
+
type BookingOfferEventType = {
|
|
37
|
+
name: string;
|
|
38
|
+
uri: string;
|
|
39
|
+
duration?: number;
|
|
40
|
+
locationKind?: string;
|
|
41
|
+
location?: string;
|
|
42
|
+
};
|
|
43
|
+
type BookingOfferSlot = {
|
|
44
|
+
startTime: string;
|
|
45
|
+
eventTypeUri?: string;
|
|
46
|
+
};
|
|
47
|
+
type BookingOffer = {
|
|
48
|
+
type: "booking_offer";
|
|
49
|
+
eventTypes: BookingOfferEventType[];
|
|
50
|
+
slots: BookingOfferSlot[];
|
|
51
|
+
};
|
|
52
|
+
type BookingConfirmed = VisitorBooking & {
|
|
53
|
+
type: "booking_confirmed";
|
|
54
|
+
};
|
|
55
|
+
type BookingCanceled = {
|
|
56
|
+
type: "booking_canceled";
|
|
57
|
+
eventUri: string;
|
|
58
|
+
};
|
|
59
|
+
type ToolCard = BookingOffer | BookingConfirmed | BookingCanceled | VisitorFormCard;
|
|
60
|
+
|
|
61
|
+
type VisitorToolResultLink = {
|
|
62
|
+
label: string;
|
|
63
|
+
href: string;
|
|
64
|
+
};
|
|
65
|
+
type VisitorToolResultDetail = {
|
|
66
|
+
label: string;
|
|
67
|
+
value: string;
|
|
68
|
+
};
|
|
69
|
+
type VisitorToolResultPresentation = {
|
|
70
|
+
id: string;
|
|
71
|
+
toolName: string;
|
|
72
|
+
status: AgentToolResult["status"];
|
|
73
|
+
kind: "summary";
|
|
74
|
+
title: string;
|
|
75
|
+
description?: string;
|
|
76
|
+
details?: readonly VisitorToolResultDetail[];
|
|
77
|
+
links?: readonly VisitorToolResultLink[];
|
|
78
|
+
};
|
|
79
|
+
type VisitorEntityResultPresentation = {
|
|
80
|
+
id: string;
|
|
81
|
+
toolName: string;
|
|
82
|
+
status: AgentToolResult["status"];
|
|
83
|
+
kind: "entity";
|
|
84
|
+
title: string;
|
|
85
|
+
description?: string;
|
|
86
|
+
details?: readonly VisitorToolResultDetail[];
|
|
87
|
+
links?: readonly VisitorToolResultLink[];
|
|
88
|
+
};
|
|
89
|
+
type VisitorCollectionItemPresentation = {
|
|
90
|
+
title: string;
|
|
91
|
+
description?: string;
|
|
92
|
+
details?: readonly VisitorToolResultDetail[];
|
|
93
|
+
href?: string;
|
|
94
|
+
};
|
|
95
|
+
type VisitorCollectionResultPresentation = {
|
|
96
|
+
id: string;
|
|
97
|
+
toolName: string;
|
|
98
|
+
status: AgentToolResult["status"];
|
|
99
|
+
kind: "collection";
|
|
100
|
+
title: string;
|
|
101
|
+
items: readonly VisitorCollectionItemPresentation[];
|
|
102
|
+
};
|
|
103
|
+
type VisitorSignatureResultPresentation = {
|
|
104
|
+
id: string;
|
|
105
|
+
toolName: string;
|
|
106
|
+
status: AgentToolResult["status"];
|
|
107
|
+
kind: "signature";
|
|
108
|
+
title: string;
|
|
109
|
+
description?: string;
|
|
110
|
+
statusLabel?: string;
|
|
111
|
+
links?: readonly VisitorToolResultLink[];
|
|
112
|
+
};
|
|
113
|
+
type VisitorBookingResultPresentation = {
|
|
114
|
+
id: string;
|
|
115
|
+
toolName: string;
|
|
116
|
+
status: AgentToolResult["status"];
|
|
117
|
+
kind: "booking";
|
|
118
|
+
card: ToolCard;
|
|
119
|
+
};
|
|
120
|
+
type VisitorToolInputResultPresentation = {
|
|
121
|
+
id: string;
|
|
122
|
+
toolName: string;
|
|
123
|
+
status: AgentToolResult["status"];
|
|
124
|
+
kind: "input";
|
|
125
|
+
surface: AgentToolUiSurface;
|
|
126
|
+
};
|
|
127
|
+
type VisitorHiddenToolResultPresentation = {
|
|
128
|
+
id: string;
|
|
129
|
+
toolName: string;
|
|
130
|
+
status: AgentToolResult["status"];
|
|
131
|
+
kind: "hidden";
|
|
132
|
+
};
|
|
133
|
+
type VisitorSearchResultPresentation = AgentSearchReferences & {
|
|
134
|
+
id: string;
|
|
135
|
+
toolName: "search_discovery";
|
|
136
|
+
status: "completed";
|
|
137
|
+
kind: "search";
|
|
138
|
+
};
|
|
139
|
+
type ResolvedVisitorToolResultPresentation = VisitorSearchResultPresentation | VisitorToolResultPresentation | VisitorEntityResultPresentation | VisitorCollectionResultPresentation | VisitorSignatureResultPresentation | VisitorBookingResultPresentation | VisitorToolInputResultPresentation | VisitorHiddenToolResultPresentation;
|
|
140
|
+
type VisitorToolResultPresenterOutput = (Omit<VisitorToolResultPresentation, "id" | "toolName" | "status"> & {
|
|
141
|
+
status?: AgentToolResult["status"];
|
|
142
|
+
}) | Omit<VisitorEntityResultPresentation, "id" | "toolName" | "status"> | Omit<VisitorCollectionResultPresentation, "id" | "toolName" | "status"> | Omit<VisitorSignatureResultPresentation, "id" | "toolName" | "status"> | {
|
|
143
|
+
kind: "booking";
|
|
144
|
+
card: ToolCard;
|
|
145
|
+
};
|
|
146
|
+
type VisitorToolResultPresenter = {
|
|
147
|
+
kind: string;
|
|
148
|
+
present: (input: {
|
|
149
|
+
envelope: AgentToolResultEnvelope;
|
|
150
|
+
presentationKind: string;
|
|
151
|
+
result: AgentToolResult;
|
|
152
|
+
}) => VisitorToolResultPresenterOutput | null;
|
|
153
|
+
};
|
|
154
|
+
type VisitorToolResultRegistry = readonly VisitorToolResultPresenter[];
|
|
155
|
+
declare function presentVisitorToolResult(result: AgentToolResult, registry?: VisitorToolResultRegistry): ResolvedVisitorToolResultPresentation;
|
|
156
|
+
|
|
157
|
+
/** Pure projection for recorded results, including historical provider failures. */
|
|
158
|
+
declare function presentTranscriptToolResult(result: AgentToolResult): ResolvedVisitorToolResultPresentation;
|
|
159
|
+
|
|
160
|
+
export { type ResolvedVisitorToolResultPresentation, presentTranscriptToolResult, presentVisitorToolResult };
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { p as AgentToolResult, x as AgentToolUiSurface, q as AgentToolResultEnvelope } from './types-sLEIYDqm.js';
|
|
2
|
+
|
|
3
|
+
type AgentSearchSource = {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
};
|
|
8
|
+
type AgentSearchReferences = {
|
|
9
|
+
sources: AgentSearchSource[];
|
|
10
|
+
cta?: {
|
|
11
|
+
label: string;
|
|
12
|
+
url?: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
type ComposerFormFieldKind = "text" | "email" | "tel" | "textarea";
|
|
17
|
+
type ComposerFormField = {
|
|
18
|
+
id: string;
|
|
19
|
+
kind: ComposerFormFieldKind;
|
|
20
|
+
label: string;
|
|
21
|
+
placeholder: string;
|
|
22
|
+
required: boolean;
|
|
23
|
+
autocomplete?: string;
|
|
24
|
+
};
|
|
25
|
+
type VisitorFormCard = {
|
|
26
|
+
type: "visitor_form";
|
|
27
|
+
fields: ComposerFormField[];
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
type VisitorBooking = {
|
|
31
|
+
eventUri: string;
|
|
32
|
+
inviteeUri?: string;
|
|
33
|
+
inviteeEmail?: string;
|
|
34
|
+
startTime?: string;
|
|
35
|
+
};
|
|
36
|
+
type BookingOfferEventType = {
|
|
37
|
+
name: string;
|
|
38
|
+
uri: string;
|
|
39
|
+
duration?: number;
|
|
40
|
+
locationKind?: string;
|
|
41
|
+
location?: string;
|
|
42
|
+
};
|
|
43
|
+
type BookingOfferSlot = {
|
|
44
|
+
startTime: string;
|
|
45
|
+
eventTypeUri?: string;
|
|
46
|
+
};
|
|
47
|
+
type BookingOffer = {
|
|
48
|
+
type: "booking_offer";
|
|
49
|
+
eventTypes: BookingOfferEventType[];
|
|
50
|
+
slots: BookingOfferSlot[];
|
|
51
|
+
};
|
|
52
|
+
type BookingConfirmed = VisitorBooking & {
|
|
53
|
+
type: "booking_confirmed";
|
|
54
|
+
};
|
|
55
|
+
type BookingCanceled = {
|
|
56
|
+
type: "booking_canceled";
|
|
57
|
+
eventUri: string;
|
|
58
|
+
};
|
|
59
|
+
type ToolCard = BookingOffer | BookingConfirmed | BookingCanceled | VisitorFormCard;
|
|
60
|
+
|
|
61
|
+
type VisitorToolResultLink = {
|
|
62
|
+
label: string;
|
|
63
|
+
href: string;
|
|
64
|
+
};
|
|
65
|
+
type VisitorToolResultDetail = {
|
|
66
|
+
label: string;
|
|
67
|
+
value: string;
|
|
68
|
+
};
|
|
69
|
+
type VisitorToolResultPresentation = {
|
|
70
|
+
id: string;
|
|
71
|
+
toolName: string;
|
|
72
|
+
status: AgentToolResult["status"];
|
|
73
|
+
kind: "summary";
|
|
74
|
+
title: string;
|
|
75
|
+
description?: string;
|
|
76
|
+
details?: readonly VisitorToolResultDetail[];
|
|
77
|
+
links?: readonly VisitorToolResultLink[];
|
|
78
|
+
};
|
|
79
|
+
type VisitorEntityResultPresentation = {
|
|
80
|
+
id: string;
|
|
81
|
+
toolName: string;
|
|
82
|
+
status: AgentToolResult["status"];
|
|
83
|
+
kind: "entity";
|
|
84
|
+
title: string;
|
|
85
|
+
description?: string;
|
|
86
|
+
details?: readonly VisitorToolResultDetail[];
|
|
87
|
+
links?: readonly VisitorToolResultLink[];
|
|
88
|
+
};
|
|
89
|
+
type VisitorCollectionItemPresentation = {
|
|
90
|
+
title: string;
|
|
91
|
+
description?: string;
|
|
92
|
+
details?: readonly VisitorToolResultDetail[];
|
|
93
|
+
href?: string;
|
|
94
|
+
};
|
|
95
|
+
type VisitorCollectionResultPresentation = {
|
|
96
|
+
id: string;
|
|
97
|
+
toolName: string;
|
|
98
|
+
status: AgentToolResult["status"];
|
|
99
|
+
kind: "collection";
|
|
100
|
+
title: string;
|
|
101
|
+
items: readonly VisitorCollectionItemPresentation[];
|
|
102
|
+
};
|
|
103
|
+
type VisitorSignatureResultPresentation = {
|
|
104
|
+
id: string;
|
|
105
|
+
toolName: string;
|
|
106
|
+
status: AgentToolResult["status"];
|
|
107
|
+
kind: "signature";
|
|
108
|
+
title: string;
|
|
109
|
+
description?: string;
|
|
110
|
+
statusLabel?: string;
|
|
111
|
+
links?: readonly VisitorToolResultLink[];
|
|
112
|
+
};
|
|
113
|
+
type VisitorBookingResultPresentation = {
|
|
114
|
+
id: string;
|
|
115
|
+
toolName: string;
|
|
116
|
+
status: AgentToolResult["status"];
|
|
117
|
+
kind: "booking";
|
|
118
|
+
card: ToolCard;
|
|
119
|
+
};
|
|
120
|
+
type VisitorToolInputResultPresentation = {
|
|
121
|
+
id: string;
|
|
122
|
+
toolName: string;
|
|
123
|
+
status: AgentToolResult["status"];
|
|
124
|
+
kind: "input";
|
|
125
|
+
surface: AgentToolUiSurface;
|
|
126
|
+
};
|
|
127
|
+
type VisitorHiddenToolResultPresentation = {
|
|
128
|
+
id: string;
|
|
129
|
+
toolName: string;
|
|
130
|
+
status: AgentToolResult["status"];
|
|
131
|
+
kind: "hidden";
|
|
132
|
+
};
|
|
133
|
+
type VisitorSearchResultPresentation = AgentSearchReferences & {
|
|
134
|
+
id: string;
|
|
135
|
+
toolName: "search_discovery";
|
|
136
|
+
status: "completed";
|
|
137
|
+
kind: "search";
|
|
138
|
+
};
|
|
139
|
+
type ResolvedVisitorToolResultPresentation = VisitorSearchResultPresentation | VisitorToolResultPresentation | VisitorEntityResultPresentation | VisitorCollectionResultPresentation | VisitorSignatureResultPresentation | VisitorBookingResultPresentation | VisitorToolInputResultPresentation | VisitorHiddenToolResultPresentation;
|
|
140
|
+
type VisitorToolResultPresenterOutput = (Omit<VisitorToolResultPresentation, "id" | "toolName" | "status"> & {
|
|
141
|
+
status?: AgentToolResult["status"];
|
|
142
|
+
}) | Omit<VisitorEntityResultPresentation, "id" | "toolName" | "status"> | Omit<VisitorCollectionResultPresentation, "id" | "toolName" | "status"> | Omit<VisitorSignatureResultPresentation, "id" | "toolName" | "status"> | {
|
|
143
|
+
kind: "booking";
|
|
144
|
+
card: ToolCard;
|
|
145
|
+
};
|
|
146
|
+
type VisitorToolResultPresenter = {
|
|
147
|
+
kind: string;
|
|
148
|
+
present: (input: {
|
|
149
|
+
envelope: AgentToolResultEnvelope;
|
|
150
|
+
presentationKind: string;
|
|
151
|
+
result: AgentToolResult;
|
|
152
|
+
}) => VisitorToolResultPresenterOutput | null;
|
|
153
|
+
};
|
|
154
|
+
type VisitorToolResultRegistry = readonly VisitorToolResultPresenter[];
|
|
155
|
+
declare function presentVisitorToolResult(result: AgentToolResult, registry?: VisitorToolResultRegistry): ResolvedVisitorToolResultPresentation;
|
|
156
|
+
|
|
157
|
+
/** Pure projection for recorded results, including historical provider failures. */
|
|
158
|
+
declare function presentTranscriptToolResult(result: AgentToolResult): ResolvedVisitorToolResultPresentation;
|
|
159
|
+
|
|
160
|
+
export { type ResolvedVisitorToolResultPresentation, presentTranscriptToolResult, presentVisitorToolResult };
|