@ukiahinsure/a2ui-react-adapter 0.1.19 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +41 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapter.ts","../src/HospitalChoice.tsx","../src/DateTimeInput.tsx","../src/SurfaceHost.tsx","../src/session.ts","../src/actions.ts","../src/join.ts"],"sourcesContent":["/**\n * A2UIClientAdapter: the only place protocol messages are applied client-side.\n *\n * Wraps the official A2UI v0.9.1 message processor with the trusted Basic\n * Catalog. Hosts never see protocol SDK types directly; they receive the\n * adapter's surface handles and safe error events using the locked\n * client-error codes. Unsupported catalogs or malformed messages produce an\n * error callback and leave prior committed surfaces untouched — there is no\n * partial render path and no dynamic catalog loading.\n */\n\nimport { basicCatalog } from \"@a2ui/react/v0_9\";\nimport type { ReactComponentImplementation } from \"@a2ui/react/v0_9\";\nimport {\n A2uiError,\n Catalog,\n A2uiMessageListSchema,\n MessageProcessor,\n} from \"@a2ui/web_core/v0_9\";\n\nimport { HospitalChoice } from \"./HospitalChoice.js\";\nimport { DateTimeInput } from \"./DateTimeInput.js\";\n\nimport type {\n A2UIFieldInteractionGroup,\n A2UIServerEnvelope,\n ClientErrorCode,\n SnapshotEnvelope,\n SurfaceUpdateEnvelope,\n} from \"./envelope.js\";\n\n/** Opaque renderer-owned handle. Hosts may identify it, but never inspect SDK state. */\nexport interface AdapterSurface {\n readonly id: string;\n}\n\nexport interface A2UIClientErrorEvent {\n errorCode: ClientErrorCode;\n surfaceId?: string;\n detail?: string;\n}\n\n/** Protocol-neutral action emitted by the trusted official renderer. */\nexport interface A2UIRendererActionEvent {\n actionName: string;\n surfaceId: string;\n sourceComponentId: string;\n context: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Fields whose values a server update changed on an already-rendered surface\n * (the agent filled or corrected them). Values themselves are never exposed.\n */\nexport interface A2UIFieldUpdateEvent {\n surfaceId: string;\n fields: readonly string[];\n}\n\nexport type A2UIFieldControl = \"text\" | \"date\" | \"choice\";\nexport type A2UIFieldValue = string | number | boolean | null;\n\n/** Safe structural metadata used only for labels, validation, and focus. */\nexport interface A2UIFieldDescriptor {\n readonly componentId: string;\n readonly field: string;\n readonly label: string;\n readonly control: A2UIFieldControl;\n readonly required: boolean;\n readonly validationRegexp?: string;\n readonly max?: string;\n}\n\n/** Safe authored tab title/child binding; section status remains envelope-owned. */\nexport interface A2UITabDescriptor {\n readonly componentId: string;\n readonly title: string;\n readonly childId: string;\n}\n\nexport interface A2UISurfaceStructure {\n readonly fields: readonly A2UIFieldDescriptor[];\n readonly tabs: readonly A2UITabDescriptor[];\n}\n\nexport interface A2UIClientAdapterOptions {\n /** Safe client-error events (locked codes); wired to LiveKit in later items. */\n onClientError?: (event: A2UIClientErrorEvent) => void;\n /** Trusted catalog actions normalized without exposing official A2UI types. */\n onAction?: (action: A2UIRendererActionEvent) => void;\n /** Application acknowledgements; consumed by Queue-Item 024-005. */\n onAck?: (envelope: Extract<A2UIServerEnvelope, { kind: \"ack\" }>) => void;\n /** Server updates that changed field values on a rendered surface. */\n onFieldUpdate?: (event: A2UIFieldUpdateEvent) => void;\n}\n\nconst editableDateCatalog = new Catalog<ReactComponentImplementation>(\n basicCatalog.id,\n [...basicCatalog.components.values()].map((component) =>\n component.name === DateTimeInput.name ? DateTimeInput :\n component.name === HospitalChoice.name ? HospitalChoice : component,\n ),\n [...basicCatalog.functions.values()],\n basicCatalog.themeSchema,\n);\n\nconst RENDERER_NAME = \"a2ui_react_adapter\";\nconst RENDERER_VERSION = \"0.1.0\";\n\nexport class A2UIClientAdapter {\n readonly rendererName = RENDERER_NAME;\n readonly rendererVersion = RENDERER_VERSION;\n\n #processor: MessageProcessor<ReactComponentImplementation>;\n #options: A2UIClientAdapterOptions;\n #listeners = new Set<() => void>();\n #actionListeners = new Set<(event: A2UIRendererActionEvent) => void>();\n #errorListeners = new Set<(event: A2UIClientErrorEvent) => void>();\n #fieldUpdateListeners = new Set<(event: A2UIFieldUpdateEvent) => void>();\n #surfaceOrder: string[] = [];\n #structureBySurface = new Map<string, MutableSurfaceStructure>();\n #persistedListRowsByPath = new Map<string, unknown[]>();\n #deletedListItemIdsByPath = new Map<string, Set<string>>();\n #stagedListRowUpdatesBySurface = new Map<\n string,\n Record<string, A2UIFieldValue>\n >();\n #activeListRowEditsBySurface = new Map<\n string,\n Map<string, Record<string, A2UIFieldValue>>\n >();\n #optimisticListRowsByPath = new Map<\n string,\n Map<string, Record<string, unknown>>\n >();\n #version = 0;\n #lastSeq = 0;\n #disposed = false;\n\n constructor(options: A2UIClientAdapterOptions = {}) {\n this.#options = options;\n this.#processor = this.#createProcessor();\n }\n\n /** Catalog ids this adapter will announce in capability envelopes. */\n get supportedCatalogIds(): string[] {\n return [basicCatalog.id];\n }\n\n get lastSeq(): number {\n return this.#lastSeq;\n }\n\n /** The most recently created live surface, if any. */\n get currentSurface(): AdapterSurface | undefined {\n const id = this.#surfaceOrder[this.#surfaceOrder.length - 1];\n return id === undefined ? undefined : this.getSurface(id);\n }\n\n getSurface(id: string): AdapterSurface | undefined {\n return this.#processor.model.getSurface(id);\n }\n\n /** Immutable value-free structure for host accessibility augmentation. */\n getSurfaceStructure(id: string): A2UISurfaceStructure {\n const structure = this.#structureBySurface.get(id);\n if (structure === undefined) {\n return { fields: [], tabs: [] };\n }\n return {\n fields: [...structure.fieldsByComponent.values()].map((field) => ({\n ...field,\n })),\n tabs: [...structure.tabsByComponent.values()]\n .flat()\n .map((tab) => ({ ...tab })),\n };\n }\n\n /** Read a complete scalar field set without exposing the SDK data model. */\n getFieldValues(\n surfaceId: string,\n fields: readonly string[],\n ): Record<string, A2UIFieldValue> | null {\n const surface = this.#processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n return null;\n }\n const values: Record<string, A2UIFieldValue> = {};\n for (const field of fields) {\n const value = surface.dataModel.get(fieldPointer(field));\n if (Array.isArray(value) && value.length === 1 && isFieldValue(value[0])) {\n values[field] = value[0];\n continue;\n }\n if (!isFieldValue(value)) {\n return null;\n }\n values[field] = value;\n }\n return values;\n }\n\n /** Restore a private draft after a trusted processor replacement. */\n applyFieldValues(\n surfaceId: string,\n values: Readonly<Record<string, A2UIFieldValue>>,\n ): boolean {\n const surface = this.#processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n return false;\n }\n let changed = false;\n for (const [field, value] of Object.entries(values)) {\n const path = fieldPointer(field);\n const next = this.#dataModelValueForField(surfaceId, field, value);\n if (!fieldValueEquivalent(surface.dataModel.get(path), next)) {\n surface.dataModel.set(path, next);\n changed = true;\n }\n }\n if (changed) {\n this.#notify();\n }\n return true;\n }\n\n stageListRowUpdate(\n surfaceId: string,\n values: Readonly<Record<string, A2UIFieldValue>>,\n ): void {\n this.#stagedListRowUpdatesBySurface.set(surfaceId, { ...values });\n }\n\n beginListRowEdit(\n surfaceId: string,\n rowKey: string,\n values: Readonly<Record<string, A2UIFieldValue>>,\n ): void {\n let edits = this.#activeListRowEditsBySurface.get(surfaceId);\n if (edits === undefined) {\n edits = new Map();\n this.#activeListRowEditsBySurface.set(surfaceId, edits);\n }\n edits.set(rowKey, { ...values });\n }\n\n updateListRowEdit(\n surfaceId: string,\n rowKey: string,\n values: Readonly<Record<string, A2UIFieldValue>>,\n ): void {\n const edits = this.#activeListRowEditsBySurface.get(surfaceId);\n if (edits?.has(rowKey) !== true) {\n return;\n }\n edits.set(rowKey, { ...values });\n }\n\n getListRowEdit(\n surfaceId: string,\n rowKey: string,\n ): Readonly<Record<string, A2UIFieldValue>> | undefined {\n const values = this.#activeListRowEditsBySurface.get(surfaceId)?.get(rowKey);\n return values === undefined ? undefined : { ...values };\n }\n\n clearListRowEdit(surfaceId: string, rowKey: string): void {\n const edits = this.#activeListRowEditsBySurface.get(surfaceId);\n if (edits === undefined) {\n return;\n }\n edits.delete(rowKey);\n if (edits.size === 0) {\n this.#activeListRowEditsBySurface.delete(surfaceId);\n }\n }\n\n #dataModelValueForField(\n surfaceId: string,\n field: string,\n value: A2UIFieldValue,\n ): A2UIFieldValue | readonly A2UIFieldValue[] {\n const descriptor = this.#fieldDescriptor(surfaceId, field);\n if (\n descriptor?.control === \"choice\" &&\n typeof value === \"string\" &&\n value.length > 0\n ) {\n return [value];\n }\n return value;\n }\n\n #fieldDescriptor(\n surfaceId: string,\n field: string,\n ): A2UIFieldDescriptor | undefined {\n const structure = this.#structureBySurface.get(surfaceId);\n if (structure === undefined) {\n return undefined;\n }\n return [...structure.fieldsByComponent.values()].find(\n (descriptor) => descriptor.field === field,\n );\n }\n\n /**\n * Apply one validated server envelope. Returns false for duplicates and\n * out-of-order deliveries (the per-session `seq` guard) and for envelopes\n * that fail to apply; committed surfaces are never partially replaced.\n */\n applyServerEnvelope(envelope: A2UIServerEnvelope): boolean {\n if (this.#disposed) {\n return false;\n }\n if (envelope.seq <= this.#lastSeq) {\n return false;\n }\n this.#lastSeq = envelope.seq;\n if (envelope.kind === \"ack\") {\n this.#options.onAck?.(envelope);\n return true;\n }\n return this.#applySurfaceEnvelope(envelope);\n }\n\n /**\n * Reset the ordering guard; used when a reconnect snapshot restarts the\n * server sequence (Queue-Item 024-004).\n */\n resetSequence(): void {\n this.#lastSeq = 0;\n }\n\n /** Clear every generated surface without disposing the reusable adapter. */\n clearSurfaces(): void {\n if (this.#disposed) {\n return;\n }\n const replacement = this.#createProcessor();\n const previous = this.#processor;\n this.#processor = replacement;\n this.#surfaceOrder = [];\n this.#structureBySurface.clear();\n this.#persistedListRowsByPath.clear();\n this.#deletedListItemIdsByPath.clear();\n this.#activeListRowEditsBySurface.clear();\n this.#optimisticListRowsByPath.clear();\n previous.model.dispose();\n this.#notify();\n }\n\n /** Emit one of the locked, body-free client error events. */\n reportClientError(\n errorCode: ClientErrorCode,\n surfaceId?: string,\n detail?: string,\n ): void {\n if (this.#disposed) {\n return;\n }\n const event = { errorCode, surfaceId, detail };\n this.#options.onClientError?.(event);\n for (const listener of this.#errorListeners) {\n listener(event);\n }\n }\n\n /** Report a rendering failure (used by the surface host error boundary). */\n reportRenderFailure(surfaceId: string | undefined, detail: string): void {\n this.reportClientError(\"render_failed\", surfaceId, detail);\n }\n\n subscribe = (listener: () => void): (() => void) => {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n };\n\n subscribeActions = (\n listener: (event: A2UIRendererActionEvent) => void,\n ): (() => void) => {\n this.#actionListeners.add(listener);\n return () => this.#actionListeners.delete(listener);\n };\n\n subscribeClientErrors = (\n listener: (event: A2UIClientErrorEvent) => void,\n ): (() => void) => {\n this.#errorListeners.add(listener);\n return () => this.#errorListeners.delete(listener);\n };\n\n subscribeFieldUpdates = (\n listener: (event: A2UIFieldUpdateEvent) => void,\n ): (() => void) => {\n this.#fieldUpdateListeners.add(listener);\n return () => this.#fieldUpdateListeners.delete(listener);\n };\n\n /** Monotonic change counter for `useSyncExternalStore`. */\n getVersion = (): number => this.#version;\n\n dispose(): void {\n if (this.#disposed) {\n return;\n }\n this.#disposed = true;\n this.#processor.model.dispose();\n this.#structureBySurface.clear();\n this.#persistedListRowsByPath.clear();\n this.#deletedListItemIdsByPath.clear();\n this.#activeListRowEditsBySurface.clear();\n this.#optimisticListRowsByPath.clear();\n this.#listeners.clear();\n this.#actionListeners.clear();\n this.#errorListeners.clear();\n this.#fieldUpdateListeners.clear();\n }\n\n #applySurfaceEnvelope(\n envelope: SurfaceUpdateEnvelope | SnapshotEnvelope,\n ): boolean {\n const validated = A2uiMessageListSchema.safeParse(envelope.messages);\n if (!validated.success) {\n this.reportClientError(\n \"message_malformed\",\n envelope.surfaceId,\n \"message_schema_invalid\",\n );\n return false;\n }\n const rawMessages =\n envelope.kind === \"snapshot\"\n ? validated.data\n : mergePersistedListRowsIntoMessages(\n validated.data as readonly unknown[],\n envelope.surfaceId,\n this.#persistedListRowsByPath,\n this.#deletedListItemIdsByPath,\n this.#optimisticListRowsByPath,\n );\n const listAddFreeMessages = removeListAddActionMessages(\n rawMessages as readonly unknown[],\n envelope.surfaceId,\n );\n const actionCompleteMessages = ensureOptionalCoverageSkipActionMessages(\n listAddFreeMessages,\n envelope.surfaceId,\n );\n const nextStructure = updateSurfaceStructures(\n actionCompleteMessages as unknown[],\n envelope.kind === \"snapshot\"\n ? new Map()\n : cloneSurfaceStructures(this.#structureBySurface),\n );\n const messages = normalizeChoiceValuesInMessages(\n actionCompleteMessages as readonly unknown[],\n envelope.surfaceId,\n nextStructure.get(envelope.surfaceId),\n );\n\n // Apply against a staged processor. A malformed lifecycle sequence can\n // mutate the official processor before throwing, so committing only the\n // successful candidate keeps the currently rendered surface atomic.\n const candidate = this.#createProcessor();\n try {\n if (envelope.kind !== \"snapshot\") {\n candidate.processMessages(this.#snapshotMessages());\n }\n candidate.processMessages(\n messages as Parameters<\n MessageProcessor<ReactComponentImplementation>[\"processMessages\"]\n >[0],\n );\n } catch (error) {\n candidate.model.dispose();\n this.reportClientError(\n classifyProcessingError(error),\n envelope.surfaceId,\n error instanceof A2uiError ? error.code : \"processing_failed\",\n );\n return false;\n }\n\n const previous = this.#processor;\n pruneSurfaceStructures(nextStructure, candidate);\n if (\n !fieldInteractionBindingsTrusted(\n envelope.fieldInteractions ?? [],\n nextStructure.get(envelope.surfaceId),\n )\n ) {\n candidate.model.dispose();\n this.reportClientError(\n \"message_malformed\",\n envelope.surfaceId,\n \"field_interaction_untrusted\",\n );\n return false;\n }\n const changedFields =\n envelope.kind === \"snapshot\"\n ? []\n : changedFieldNames(\n previous,\n candidate,\n envelope.surfaceId,\n nextStructure.get(envelope.surfaceId),\n );\n this.#processor = candidate;\n this.#surfaceOrder = [...candidate.model.surfacesMap.keys()];\n this.#structureBySurface = nextStructure;\n if (envelope.kind === \"snapshot\") {\n this.#persistedListRowsByPath.clear();\n this.#deletedListItemIdsByPath.clear();\n this.#activeListRowEditsBySurface.clear();\n this.#optimisticListRowsByPath.clear();\n }\n rememberPersistedListRows(\n this.#persistedListRowsByPath,\n this.#deletedListItemIdsByPath,\n candidate.model.getSurface(envelope.surfaceId)?.dataModel.get(\"/\"),\n );\n previous.model.dispose();\n this.#notify();\n if (changedFields.length > 0) {\n this.#emitFieldUpdate({\n surfaceId: envelope.surfaceId,\n fields: changedFields,\n });\n }\n return true;\n }\n\n #emitFieldUpdate(event: A2UIFieldUpdateEvent): void {\n this.#options.onFieldUpdate?.(event);\n for (const listener of this.#fieldUpdateListeners) {\n listener(event);\n }\n }\n\n #createProcessor(): MessageProcessor<ReactComponentImplementation> {\n return new MessageProcessor<ReactComponentImplementation>(\n [editableDateCatalog],\n (action) => this.#emitAction(action),\n );\n }\n\n #emitAction(action: unknown): void {\n if (\n !isRecord(action) ||\n !isNonEmptyString(action.name) ||\n !isNonEmptyString(action.surfaceId) ||\n !isNonEmptyString(action.sourceComponentId) ||\n !isRecord(action.context)\n ) {\n this.reportClientError(\n \"message_malformed\",\n undefined,\n \"renderer_action_invalid\",\n );\n return;\n }\n const stagedListRowUpdate =\n action.name === \"flow.list.update\"\n ? this.#stagedListRowUpdatesBySurface.get(action.surfaceId)\n : undefined;\n if (stagedListRowUpdate !== undefined) {\n this.#stagedListRowUpdatesBySurface.delete(action.surfaceId);\n }\n const event: A2UIRendererActionEvent = {\n actionName: action.name,\n surfaceId: action.surfaceId,\n sourceComponentId: action.sourceComponentId,\n context: {\n ...action.context,\n ...(stagedListRowUpdate ?? {}),\n },\n };\n const submittedProviderRow = submittedProviderRowFromEvent(event);\n if (submittedProviderRow !== undefined) {\n this.#rememberSubmittedProviderRow(\n event.surfaceId,\n submittedProviderRow,\n event.context,\n );\n }\n if (event.actionName === \"flow.list.delete\") {\n this.#removeDeletedListRow(event.surfaceId, event.context);\n }\n if (event.actionName === \"flow.list.update\") {\n this.#updateListRow(event.surfaceId, event.context);\n }\n this.#options.onAction?.(event);\n for (const listener of this.#actionListeners) {\n listener(event);\n }\n }\n\n #rememberSubmittedProviderRow(\n surfaceId: string,\n row: Record<string, unknown>,\n context: Readonly<Record<string, unknown>>,\n ): void {\n const rows = upsertListRow(\n this.#persistedListRowsByPath.get(\"needs.providers\") ?? [],\n row,\n );\n this.#persistedListRowsByPath.set(\"needs.providers\", rows);\n const surface = this.#processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n return;\n }\n surface.dataModel.set(\"/needs.providers\", cloneJsonArray(rows));\n surface.dataModel.set(\"/needs/providers\", cloneJsonArray(rows));\n clearSubmittedProviderDraft(surface.dataModel, context);\n removeSubmittedProviderDraftControls(\n surface.componentsModel.entries,\n eventSourceFieldPaths(context),\n context,\n );\n this.#notify();\n }\n\n #removeDeletedListRow(\n surfaceId: string,\n context: Readonly<Record<string, unknown>>,\n ): void {\n const listPath = context.listPath;\n const itemId = context.itemId;\n if (\n typeof listPath !== \"string\" ||\n listPath.length === 0 ||\n typeof itemId !== \"string\" ||\n itemId.length === 0\n ) {\n return;\n }\n const cachedRows = this.#persistedListRowsByPath.get(listPath) ?? [];\n const nextRows = removeListRowByItemId(cachedRows, itemId);\n this.#persistedListRowsByPath.set(listPath, nextRows);\n this.#optimisticListRowsByPath.get(listPath)?.delete(itemId);\n rememberDeletedListItemId(this.#deletedListItemIdsByPath, listPath, itemId);\n\n const surface = this.#processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n return;\n }\n surface.dataModel.set(`/${listPath}`, cloneJsonArray(nextRows));\n surface.dataModel.set(\n `/${listPath.replaceAll(\".\", \"/\")}`,\n cloneJsonArray(nextRows),\n );\n this.#notify();\n }\n\n #updateListRow(\n surfaceId: string,\n context: Readonly<Record<string, unknown>>,\n ): void {\n const listPath = context.listPath;\n const itemId = context.itemId;\n if (\n typeof listPath !== \"string\" ||\n listPath.length === 0 ||\n typeof itemId !== \"string\" ||\n itemId.length === 0\n ) {\n return;\n }\n const cachedRows = this.#persistedListRowsByPath.get(listPath) ?? [];\n const existingRow = cachedRows.find(\n (candidate) => isRecord(candidate) && candidate.itemId === itemId,\n );\n const row = updateListRowFromContext(context, existingRow);\n if (row === undefined) {\n return;\n }\n const rows = normalizeListRows(listPath, upsertListRow(cachedRows, row));\n this.#persistedListRowsByPath.set(listPath, rows);\n let optimisticRows = this.#optimisticListRowsByPath.get(listPath);\n if (optimisticRows === undefined) {\n optimisticRows = new Map();\n this.#optimisticListRowsByPath.set(listPath, optimisticRows);\n }\n optimisticRows.set(itemId, cloneJsonRecord(row));\n\n const surface = this.#processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n return;\n }\n surface.dataModel.set(`/${listPath}`, cloneJsonArray(rows));\n surface.dataModel.set(\n `/${listPath.replaceAll(\".\", \"/\")}`,\n cloneJsonArray(rows),\n );\n this.#notify();\n }\n\n #snapshotMessages(): Parameters<\n MessageProcessor<ReactComponentImplementation>[\"processMessages\"]\n >[0] {\n const messages: unknown[] = [];\n for (const surface of this.#processor.model.surfacesMap.values()) {\n messages.push({\n version: \"v0.9\",\n createSurface: {\n surfaceId: surface.id,\n catalogId: surface.catalog.id,\n theme: surface.theme,\n sendDataModel: surface.sendDataModel,\n },\n });\n const components = [...surface.componentsModel.entries].map(\n ([id, component]) => ({\n id,\n component: component.type,\n ...component.properties,\n }),\n );\n if (components.length > 0) {\n messages.push({\n version: \"v0.9\",\n updateComponents: { surfaceId: surface.id, components },\n });\n }\n const data = surface.dataModel.get(\"/\");\n if (data !== undefined) {\n messages.push({\n version: \"v0.9\",\n updateDataModel: { surfaceId: surface.id, path: \"/\", value: data },\n });\n }\n }\n return messages as Parameters<\n MessageProcessor<ReactComponentImplementation>[\"processMessages\"]\n >[0];\n }\n\n #notify(): void {\n this.#version += 1;\n for (const listener of this.#listeners) {\n listener();\n }\n }\n}\n\ninterface MutableSurfaceStructure {\n fieldsByComponent: Map<string, A2UIFieldDescriptor>;\n tabsByComponent: Map<string, A2UITabDescriptor[]>;\n}\n\nfunction emptySurfaceStructure(): MutableSurfaceStructure {\n return {\n fieldsByComponent: new Map(),\n tabsByComponent: new Map(),\n };\n}\n\nfunction cloneSurfaceStructures(\n source: Map<string, MutableSurfaceStructure>,\n): Map<string, MutableSurfaceStructure> {\n return new Map(\n [...source].map(([surfaceId, structure]) => [\n surfaceId,\n {\n fieldsByComponent: new Map(\n [...structure.fieldsByComponent].map(([id, field]) => [\n id,\n { ...field },\n ]),\n ),\n tabsByComponent: new Map(\n [...structure.tabsByComponent].map(([id, tabs]) => [\n id,\n tabs.map((tab) => ({ ...tab })),\n ]),\n ),\n },\n ]),\n );\n}\n\nfunction ensureOptionalCoverageSkipActionMessages(\n messages: readonly unknown[],\n surfaceId: string,\n): readonly unknown[] {\n for (let index = 0; index < messages.length; index += 1) {\n const message = messages[index];\n if (!isRecord(message) || !isRecord(message.updateComponents)) {\n continue;\n }\n const update = message.updateComponents;\n if (update.surfaceId !== surfaceId || !Array.isArray(update.components)) {\n continue;\n }\n const submit = update.components.find(\n (component) =>\n isRecord(component) &&\n isNonEmptyString(component.id) &&\n hasActionName(component, \"flow.submit\"),\n );\n if (!isRecord(submit) || !isNonEmptyString(submit.id)) {\n return messages;\n }\n const optionalCoverageField = optionalCoverageFieldName(\n update.components,\n submit.id,\n );\n if (optionalCoverageField === undefined) {\n continue;\n }\n const patchedSubmit = submitActionWithDefaultUnknown(\n submit,\n optionalCoverageField,\n );\n const hasSkip = update.components.some((component) =>\n hasActionName(component, \"flow.skip\"),\n );\n if (hasSkip && patchedSubmit === submit) {\n return messages;\n }\n if (hasSkip) {\n const nextMessages = [...messages];\n nextMessages[index] = {\n ...message,\n updateComponents: {\n ...update,\n components: update.components.map((component) =>\n component === submit ? patchedSubmit : component,\n ),\n },\n };\n return nextMessages;\n }\n const parent = update.components.find(\n (component) =>\n isRecord(component) &&\n Array.isArray(component.children) &&\n component.children.includes(submit.id),\n );\n if (!isRecord(parent) || !Array.isArray(parent.children)) {\n return messages;\n }\n\n const labelId = `${submit.id}:optional-skip-label`;\n const buttonId = `${submit.id}:optional-skip`;\n if (\n update.components.some(\n (component) =>\n isRecord(component) &&\n (component.id === labelId || component.id === buttonId),\n )\n ) {\n return messages;\n }\n\n const nextParent = {\n ...parent,\n children: parent.children.flatMap((child) =>\n child === submit.id ? [child, buttonId] : [child],\n ),\n };\n const nextComponents = update.components.map((component) =>\n component === parent\n ? nextParent\n : component === submit\n ? patchedSubmit\n : component,\n );\n nextComponents.push(\n {\n id: labelId,\n component: \"Text\",\n text: \"Skip\",\n },\n {\n id: buttonId,\n component: \"Button\",\n child: labelId,\n action: {\n event: {\n name: \"flow.submit\",\n context: { [optionalCoverageField]: \"unknown\" },\n },\n },\n },\n );\n\n const nextMessages = [...messages];\n nextMessages[index] = {\n ...message,\n updateComponents: {\n ...update,\n components: nextComponents,\n },\n };\n return nextMessages;\n }\n return messages;\n}\n\nfunction removeListAddActionMessages(\n messages: readonly unknown[],\n surfaceId: string,\n): readonly unknown[] {\n for (let index = 0; index < messages.length; index += 1) {\n const message = messages[index];\n if (!isRecord(message) || !isRecord(message.updateComponents)) {\n continue;\n }\n const update = message.updateComponents;\n if (update.surfaceId !== surfaceId || !Array.isArray(update.components)) {\n continue;\n }\n const addIds = listAddComponentIds(update.components);\n if (addIds.size === 0) {\n continue;\n }\n const nextMessages = [...messages];\n nextMessages[index] = {\n ...message,\n updateComponents: {\n ...update,\n components: update.components\n .filter(\n (component) =>\n !(\n isRecord(component) &&\n isNonEmptyString(component.id) &&\n addIds.has(component.id)\n ),\n )\n .map((component) =>\n removeComponentChildren(component, addIds),\n ),\n },\n };\n return nextMessages;\n }\n return messages;\n}\n\nfunction listAddComponentIds(components: readonly unknown[]): Set<string> {\n const ids = new Set<string>();\n for (const component of components) {\n if (\n !isRecord(component) ||\n !isNonEmptyString(component.id) ||\n !hasActionName(component, \"flow.list.add\")\n ) {\n continue;\n }\n ids.add(component.id);\n const child = component.child;\n if (typeof child === \"string\" && child.length > 0) {\n ids.add(child);\n }\n }\n return ids;\n}\n\nfunction removeComponentChildren(\n component: unknown,\n removedIds: ReadonlySet<string>,\n): unknown {\n if (!isRecord(component) || !Array.isArray(component.children)) {\n return component;\n }\n const children = component.children.filter(\n (child) => typeof child !== \"string\" || !removedIds.has(child),\n );\n return children.length === component.children.length\n ? component\n : { ...component, children };\n}\n\nfunction submitActionWithDefaultUnknown(\n submit: Record<string, unknown>,\n field:\n | \"current_coverage_type\"\n | \"employer_union_coverage\"\n | \"va_tricare_benefits\",\n): Record<string, unknown> {\n if (!isRecord(submit.action) || !isRecord(submit.action.event)) {\n return submit;\n }\n const event = submit.action.event;\n const context = isRecord(event.context) ? event.context : {};\n if (Object.hasOwn(context, field)) {\n return submit;\n }\n return {\n ...submit,\n action: {\n ...submit.action,\n event: {\n ...event,\n context: {\n ...context,\n [field]: \"unknown\",\n },\n },\n },\n };\n}\n\nfunction optionalCoverageFieldName(\n components: readonly unknown[],\n submitId: string,\n):\n | \"current_coverage_type\"\n | \"employer_union_coverage\"\n | \"va_tricare_benefits\"\n | undefined {\n const statePrefix = componentStatePrefix(submitId);\n if (statePrefix !== undefined) {\n const stateField = optionalCoverageFieldFromFieldBindings(\n components.filter(\n (component) =>\n isRecord(component) &&\n isNonEmptyString(component.id) &&\n component.id.startsWith(`${statePrefix}:`),\n ),\n );\n if (stateField !== undefined) {\n return stateField;\n }\n }\n\n const parent = components.find(\n (component) =>\n isRecord(component) &&\n Array.isArray(component.children) &&\n component.children.includes(submitId),\n );\n if (isRecord(parent) && Array.isArray(parent.children)) {\n const childIds = new Set(parent.children.filter(isNonEmptyString));\n const childField = optionalCoverageFieldFromFieldBindings(\n components.filter(\n (component) =>\n isRecord(component) &&\n isNonEmptyString(component.id) &&\n childIds.has(component.id),\n ),\n );\n if (childField !== undefined) {\n return childField;\n }\n }\n\n return undefined;\n}\n\nfunction componentStatePrefix(componentId: string): string | undefined {\n const marker = \":action:\";\n const markerIndex = componentId.indexOf(marker);\n if (markerIndex > 0) {\n return componentId.slice(0, markerIndex);\n }\n const fallbackIndex = componentId.lastIndexOf(\":\");\n return fallbackIndex > 0 ? componentId.slice(0, fallbackIndex) : undefined;\n}\n\nfunction optionalCoverageFieldFromFieldBindings(\n components: readonly unknown[],\n):\n | \"current_coverage_type\"\n | \"employer_union_coverage\"\n | \"va_tricare_benefits\"\n | undefined {\n const normalized = components\n .flatMap((component) => componentFieldSearchText(component))\n .map(normalizeSearchText)\n .join(\" \");\n if (\n normalized.includes(\"vatricarebenefits\") ||\n normalized.includes(\"coveragevatricarebenefits\") ||\n normalized.includes(\"tricareorchampvabenefits\") ||\n normalized.includes(\"vachampvabenefits\")\n ) {\n return \"va_tricare_benefits\";\n }\n if (\n normalized.includes(\"employerunioncoverage\") ||\n normalized.includes(\"coverageemployerunioncoverage\")\n ) {\n return \"employer_union_coverage\";\n }\n if (\n normalized.includes(\"currentcoveragetype\") ||\n normalized.includes(\"coveragecurrentcoveragetype\")\n ) {\n return \"current_coverage_type\";\n }\n return undefined;\n}\n\nfunction componentFieldSearchText(component: unknown): string[] {\n if (!isRecord(component)) {\n return [];\n }\n const values: string[] = [];\n for (const key of [\"label\", \"field\"] as const) {\n const value = component[key];\n if (typeof value === \"string\") {\n values.push(value);\n }\n }\n const value = component.value;\n if (isRecord(value) && typeof value.path === \"string\") {\n values.push(value.path);\n }\n return values;\n}\n\nfunction normalizeSearchText(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction hasActionName(component: unknown, actionName: string): boolean {\n if (!isRecord(component) || !isRecord(component.action)) {\n return false;\n }\n const event = component.action.event;\n return isRecord(event) && event.name === actionName;\n}\n\nfunction updateSurfaceStructures(\n messages: readonly unknown[],\n structures: Map<string, MutableSurfaceStructure>,\n): Map<string, MutableSurfaceStructure> {\n for (const message of messages) {\n if (!isRecord(message)) {\n continue;\n }\n const deletion = message.deleteSurface;\n if (isRecord(deletion) && isNonEmptyString(deletion.surfaceId)) {\n structures.delete(deletion.surfaceId);\n continue;\n }\n const creation = message.createSurface;\n if (isRecord(creation) && isNonEmptyString(creation.surfaceId)) {\n structures.set(creation.surfaceId, emptySurfaceStructure());\n }\n const update = message.updateComponents;\n if (\n !isRecord(update) ||\n !isNonEmptyString(update.surfaceId) ||\n !Array.isArray(update.components)\n ) {\n continue;\n }\n const structure =\n structures.get(update.surfaceId) ?? emptySurfaceStructure();\n structures.set(update.surfaceId, structure);\n for (const component of update.components) {\n if (!isRecord(component) || !isNonEmptyString(component.id)) {\n continue;\n }\n structure.fieldsByComponent.delete(component.id);\n structure.tabsByComponent.delete(component.id);\n const field = fieldDescriptor(component);\n if (field !== undefined) {\n structure.fieldsByComponent.set(component.id, field);\n }\n const tabs = tabDescriptors(component);\n if (tabs.length > 0) {\n structure.tabsByComponent.set(component.id, tabs);\n }\n }\n }\n return structures;\n}\n\nfunction pruneSurfaceStructures(\n structures: Map<string, MutableSurfaceStructure>,\n processor: MessageProcessor<ReactComponentImplementation>,\n): void {\n for (const [surfaceId, structure] of structures) {\n const surface = processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n structures.delete(surfaceId);\n continue;\n }\n const componentIds = new Set(\n [...surface.componentsModel.entries].map(([componentId]) => componentId),\n );\n for (const componentId of structure.fieldsByComponent.keys()) {\n if (!componentIds.has(componentId)) {\n structure.fieldsByComponent.delete(componentId);\n }\n }\n for (const componentId of structure.tabsByComponent.keys()) {\n if (!componentIds.has(componentId)) {\n structure.tabsByComponent.delete(componentId);\n }\n }\n }\n}\n\nfunction fieldInteractionBindingsTrusted(\n groups: readonly A2UIFieldInteractionGroup[],\n structure: MutableSurfaceStructure | undefined,\n): boolean {\n if (groups.length === 0) {\n return true;\n }\n if (structure === undefined) {\n return false;\n }\n return groups.every((group) =>\n group.fields.every((binding) => {\n const field = structure.fieldsByComponent.get(binding.componentId);\n return field?.field === binding.field;\n }),\n );\n}\n\nfunction fieldDescriptor(\n component: Record<string, unknown>,\n): A2UIFieldDescriptor | undefined {\n const controls: Record<string, A2UIFieldControl> = {\n TextField: \"text\",\n DateTimeInput: \"date\",\n ChoicePicker: \"choice\",\n };\n const control =\n typeof component.component === \"string\"\n ? controls[component.component]\n : undefined;\n const componentId = isNonEmptyString(component.id) ? component.id : undefined;\n const value = component.value;\n const field =\n isRecord(value) && typeof value.path === \"string\"\n ? fieldFromPointer(value.path) ?? listFieldFromComponentId(componentId)\n : listFieldFromComponentId(componentId);\n if (\n control === undefined ||\n field === undefined ||\n componentId === undefined\n ) {\n return undefined;\n }\n return {\n componentId,\n field,\n label:\n typeof component.label === \"string\" && component.label.length > 0\n ? component.label\n : field,\n control,\n required: hasRequiredCheck(component.checks),\n ...(typeof component.validationRegexp === \"string\"\n ? { validationRegexp: component.validationRegexp }\n : {}),\n ...(typeof component.max === \"string\" ? { max: component.max } : {}),\n };\n}\n\nfunction normalizeChoiceValuesInMessages(\n messages: readonly unknown[],\n surfaceId: string,\n structure: MutableSurfaceStructure | undefined,\n): unknown[] {\n if (structure === undefined) {\n return [...messages];\n }\n const choiceFields = new Set(\n [...structure.fieldsByComponent.values()]\n .filter((field) => field.control === \"choice\")\n .map((field) => field.field),\n );\n if (choiceFields.size === 0) {\n return [...messages];\n }\n return messages.map((message) => {\n if (!isRecord(message) || !isRecord(message.updateDataModel)) {\n return message;\n }\n const update = message.updateDataModel;\n if (update.surfaceId !== surfaceId) {\n return message;\n }\n const path = typeof update.path === \"string\" ? update.path : \"/\";\n if (path === \"/\" && isRecord(update.value)) {\n const value = cloneJsonRecord(update.value);\n for (const field of choiceFields) {\n if (Object.hasOwn(value, field)) {\n value[field] = choiceDataModelValue(value[field]);\n }\n }\n return {\n ...message,\n updateDataModel: { ...update, value },\n };\n }\n const field = fieldFromPointer(path);\n if (field !== undefined && choiceFields.has(field)) {\n return {\n ...message,\n updateDataModel: {\n ...update,\n value: choiceDataModelValue(update.value),\n },\n };\n }\n return message;\n });\n}\n\nfunction choiceDataModelValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n return value.length === 0 ? [] : [value];\n }\n return value;\n}\n\nfunction hasRequiredCheck(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.some(\n (check) =>\n isRecord(check) &&\n isRecord(check.condition) &&\n check.condition.call === \"required\",\n )\n );\n}\n\nfunction listFieldFromComponentId(\n componentId: string | undefined,\n): string | undefined {\n if (componentId === undefined) {\n return undefined;\n }\n const markers = [\":list-new:field:\", \":list-row:field:\"];\n for (const marker of markers) {\n const markerIndex = componentId.indexOf(marker);\n if (markerIndex < 0) {\n continue;\n }\n const field = componentId.slice(markerIndex + marker.length);\n return field.length > 0 ? field : undefined;\n }\n return undefined;\n}\n\nfunction fieldFromPointer(path: string): string | undefined {\n if (!path.startsWith(\"/\") || path.length < 2 || path.slice(1).includes(\"/\")) {\n return undefined;\n }\n return path.slice(1).replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n}\n\nfunction fieldPointer(field: string): string {\n return `/${field.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\")}`;\n}\n\nfunction mergePersistedListRowsIntoMessages(\n messages: readonly unknown[],\n surfaceId: string,\n persistedRowsByPath: ReadonlyMap<string, unknown[]>,\n deletedItemIdsByPath: ReadonlyMap<string, ReadonlySet<string>>,\n optimisticRowsByPath: ReadonlyMap<\n string,\n ReadonlyMap<string, Record<string, unknown>>\n >,\n): unknown[] {\n if (\n persistedRowsByPath.size === 0 &&\n deletedItemIdsByPath.size === 0 &&\n optimisticRowsByPath.size === 0\n ) {\n return [...messages];\n }\n let mergedRoot = false;\n const mergedMessages = messages.map((message) => {\n if (!isRootDataModelUpdate(message, surfaceId)) {\n return message;\n }\n mergedRoot = true;\n return {\n ...message,\n updateDataModel: {\n ...message.updateDataModel,\n value: mergePersistedListRowsIntoRoot(\n message.updateDataModel.value,\n persistedRowsByPath,\n deletedItemIdsByPath,\n optimisticRowsByPath,\n ),\n },\n };\n });\n if (mergedRoot) {\n return mergedMessages;\n }\n return [\n ...mergedMessages,\n {\n version: \"v0.9\",\n updateDataModel: {\n surfaceId,\n path: \"/\",\n value: mergePersistedListRowsIntoRoot(\n {},\n persistedRowsByPath,\n deletedItemIdsByPath,\n optimisticRowsByPath,\n ),\n },\n },\n ];\n}\n\nfunction mergePersistedListRowsIntoRoot(\n root: Record<string, unknown>,\n persistedRowsByPath: ReadonlyMap<string, unknown[]>,\n deletedItemIdsByPath: ReadonlyMap<string, ReadonlySet<string>>,\n optimisticRowsByPath: ReadonlyMap<\n string,\n ReadonlyMap<string, Record<string, unknown>>\n >,\n): Record<string, unknown> {\n const merged = cloneJsonRecord(root);\n for (const listPath of new Set([\n ...persistedRowsByPath.keys(),\n ...deletedItemIdsByPath.keys(),\n ...optimisticRowsByPath.keys(),\n ])) {\n const rows = persistedRowsByPath.get(listPath) ?? [];\n const optimisticRows = optimisticRowsByPath.get(listPath);\n const dottedRows = merged[listPath];\n const nestedRows = getNestedValue(merged, listPath);\n const incomingRows = Array.isArray(dottedRows)\n ? dottedRows\n : Array.isArray(nestedRows)\n ? nestedRows\n : undefined;\n const shouldPreserveCachedRows =\n rows.length > 0 &&\n (incomingRows === undefined ||\n (incomingRows.length === 0 &&\n (!hasListDraft(merged, listPath) ||\n hasBlankListDraft(merged, listPath))));\n const effectiveRows = shouldPreserveCachedRows\n ? rows\n : incomingRows ?? rows;\n const optimisticEffectiveRows = mergeOptimisticListRows(\n effectiveRows,\n optimisticRows,\n );\n const visibleRows = filterDeletedListRows(\n optimisticEffectiveRows,\n deletedItemIdsByPath.get(listPath),\n );\n const normalizedRows = normalizeListRows(listPath, visibleRows);\n merged[listPath] = cloneJsonArray(normalizedRows);\n setNestedValue(merged, listPath, cloneJsonArray(normalizedRows));\n }\n return merged;\n}\n\nfunction hasBlankListDraft(root: Record<string, unknown>, listPath: string): boolean {\n const drafts = root.__listDrafts;\n if (!isRecord(drafts)) {\n return false;\n }\n const draft = drafts[listPath];\n if (!isRecord(draft)) {\n return false;\n }\n return Object.values(draft).every(isBlankDraftValue);\n}\n\nfunction hasListDraft(root: Record<string, unknown>, listPath: string): boolean {\n const drafts = root.__listDrafts;\n return isRecord(drafts) && isRecord(drafts[listPath]);\n}\n\nfunction isBlankDraftValue(value: unknown): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n if (typeof value === \"string\") {\n return value.trim().length === 0;\n }\n if (Array.isArray(value)) {\n return value.length === 0 || value.every(isBlankDraftValue);\n }\n return false;\n}\n\nfunction mergeOptimisticListRows(\n rows: readonly unknown[],\n optimisticRows: ReadonlyMap<string, Record<string, unknown>> | undefined,\n): unknown[] {\n if (optimisticRows === undefined || optimisticRows.size === 0) {\n return cloneJsonArray(rows);\n }\n let merged = cloneJsonArray(rows);\n for (const row of optimisticRows.values()) {\n merged = upsertListRow(merged, cloneJsonRecord(row));\n }\n return merged;\n}\n\nfunction rememberPersistedListRows(\n persistedRowsByPath: Map<string, unknown[]>,\n deletedItemIdsByPath: ReadonlyMap<string, ReadonlySet<string>>,\n root: unknown,\n): void {\n if (!isRecord(root)) {\n return;\n }\n for (const [listPath, rows] of listRowsFromRoot(root)) {\n const visibleRows = filterDeletedListRows(\n rows,\n deletedItemIdsByPath.get(listPath),\n );\n persistedRowsByPath.set(\n listPath,\n normalizeListRows(listPath, visibleRows),\n );\n }\n}\n\nfunction normalizeListRows(\n listPath: string,\n rows: readonly unknown[],\n): unknown[] {\n const clonedRows = cloneJsonArray(rows);\n if (listPath !== \"needs.providers\") {\n return clonedRows;\n }\n return clonedRows.map((row) =>\n isRecord(row) ? normalizeProviderRow(row) : row,\n );\n}\n\nfunction normalizeProviderRow(\n row: Readonly<Record<string, unknown>>,\n fallback?: Readonly<Record<string, unknown>>,\n): Record<string, unknown> {\n const normalized = cloneJsonRecord(row);\n const name =\n firstProviderName(normalized) ??\n (fallback === undefined ? undefined : firstProviderName(fallback));\n const location =\n firstProviderLocation(normalized) ??\n (fallback === undefined ? undefined : firstProviderLocation(fallback));\n if (\n normalized.primary_care_provider === undefined &&\n name !== undefined\n ) {\n normalized.primary_care_provider = name;\n }\n if (\n normalized.primary_care_provider_location === undefined &&\n location !== undefined\n ) {\n normalized.primary_care_provider_location = location;\n }\n if (\n name !== undefined &&\n location !== undefined &&\n typeof normalized.__displayText === \"string\" &&\n !normalized.__displayText.includes(location)\n ) {\n normalized.__displayText = `${normalized.__displayText} | Provider Location: ${location}`;\n } else if (\n normalized.__displayText === undefined &&\n (name !== undefined || location !== undefined)\n ) {\n normalized.__displayText = [\n name === undefined ? undefined : `Provider Name: ${name}`,\n location === undefined ? undefined : `Provider Location: ${location}`,\n ]\n .filter((part): part is string => part !== undefined)\n .join(\" | \");\n }\n return normalized;\n}\n\nfunction submittedProviderRowFromEvent(\n event: A2UIRendererActionEvent,\n): Record<string, unknown> | undefined {\n if (event.actionName !== \"flow.submit\") {\n return undefined;\n }\n const listPath = event.context.listPath;\n if (listPath !== \"needs.providers\") {\n return undefined;\n }\n const name = firstProviderName(event.context);\n const location = firstProviderLocation(event.context);\n if (name === undefined && location === undefined) {\n return undefined;\n }\n return {\n itemId: \"submitted-primary-care-provider\",\n ...(name === undefined ? {} : { primary_care_provider: name }),\n ...(location === undefined\n ? {}\n : { primary_care_provider_location: location }),\n __displayText: [\n name === undefined ? undefined : `Provider Name: ${name}`,\n location === undefined ? undefined : `Provider Location: ${location}`,\n ]\n .filter((part): part is string => part !== undefined)\n .join(\" | \"),\n };\n}\n\nfunction clearSubmittedProviderDraft(\n dataModel: { set(path: string, value: unknown): void },\n context: Readonly<Record<string, unknown>>,\n): void {\n for (const key of Object.keys(context)) {\n if (key === \"listPath\") {\n continue;\n }\n if (\n firstTextField(context, [key]) === undefined ||\n !isProviderSubmitField(key)\n ) {\n continue;\n }\n dataModel.set(`/__listDrafts/needs.providers/${key}`, \"\");\n }\n}\n\nfunction removeSubmittedProviderDraftControls(\n entries: IterableIterator<\n [string, { type: string; properties: Record<string, unknown> }]\n >,\n fieldPaths: ReadonlySet<string>,\n context: Readonly<Record<string, unknown>>,\n): void {\n const components = [...entries];\n const controlIds = new Set<string>();\n for (const [id, component] of components) {\n if (\n component.type === \"Button\" &&\n isProviderSubmitButton(component, context)\n ) {\n controlIds.add(id);\n const child = component.properties.child;\n if (typeof child === \"string\") {\n controlIds.add(child);\n }\n continue;\n }\n if (component.type !== \"TextField\") {\n continue;\n }\n const value = component.properties.value;\n const label = component.properties.label;\n if (\n (isRecord(value) &&\n typeof value.path === \"string\" &&\n (fieldPaths.has(value.path) || isProviderDraftFieldPath(value.path))) ||\n (typeof label === \"string\" && isProviderSubmitLabel(label))\n ) {\n controlIds.add(id);\n }\n }\n\n let changed = true;\n while (changed) {\n changed = false;\n for (const [id, component] of components) {\n if (controlIds.has(id) || component.type === \"Column\") {\n continue;\n }\n const children = component.properties.children;\n if (\n Array.isArray(children) &&\n children.length > 0 &&\n children.every(\n (child) => typeof child === \"string\" && controlIds.has(child),\n )\n ) {\n controlIds.add(id);\n changed = true;\n }\n }\n }\n\n for (const [, component] of components) {\n const children = component.properties.children;\n if (!Array.isArray(children)) {\n continue;\n }\n const nextChildren = children.filter(\n (child) => typeof child !== \"string\" || !controlIds.has(child),\n );\n if (nextChildren.length === children.length) {\n continue;\n }\n component.properties = {\n ...component.properties,\n children: nextChildren,\n };\n }\n}\n\nfunction isProviderSubmitButton(\n component: { properties: Record<string, unknown> },\n context: Readonly<Record<string, unknown>>,\n): boolean {\n const action = component.properties.action;\n if (!isRecord(action) || !isRecord(action.event)) {\n return false;\n }\n const event = action.event;\n return (\n event.name === \"flow.submit\" &&\n sameProviderSubmitContext(event.context, context)\n );\n}\n\nfunction sameProviderSubmitContext(\n candidate: unknown,\n context: Readonly<Record<string, unknown>>,\n): boolean {\n if (\n !isRecord(candidate) ||\n (candidate.listPath !== \"needs.providers\" && !hasProviderSubmitFields(candidate))\n ) {\n return false;\n }\n for (const key of Object.keys(context)) {\n if (key === \"listPath\" || !isProviderSubmitField(key)) {\n continue;\n }\n if (!(key in candidate)) {\n return false;\n }\n }\n return true;\n}\n\nfunction hasProviderSubmitFields(context: Readonly<Record<string, unknown>>): boolean {\n return Object.keys(context).some(\n (key) => key !== \"listPath\" && isProviderSubmitField(key),\n );\n}\n\nfunction isProviderSubmitField(key: string): boolean {\n return new Set([\n \"primary_care_provider\",\n \"primaryCareProvider\",\n \"primary_provider\",\n \"primaryProvider\",\n \"primary_care_doctor\",\n \"primaryCareDoctor\",\n \"pcp\",\n \"providerName\",\n \"provider_name\",\n \"displayName\",\n \"display_name\",\n \"name\",\n \"primary_care_provider_location\",\n \"primaryCareProviderLocation\",\n \"provider_location\",\n \"providerLocation\",\n \"location_details\",\n \"locationDetails\",\n \"office_location\",\n \"officeLocation\",\n \"practice_location\",\n \"practiceLocation\",\n \"location\",\n \"address\",\n ]).has(key);\n}\n\nfunction eventSourceFieldPaths(\n context: Readonly<Record<string, unknown>>,\n): ReadonlySet<string> {\n const paths = new Set<string>();\n for (const [key, value] of Object.entries(context)) {\n if (key === \"listPath\" || !isProviderSubmitField(key) || !isRecord(value)) {\n continue;\n }\n const path = value.path;\n if (typeof path === \"string\") {\n paths.add(path);\n }\n }\n return paths;\n}\n\nfunction isProviderDraftFieldPath(path: string): boolean {\n const prefix = \"/__listDrafts/needs.providers/\";\n const field = path.startsWith(prefix) ? path.slice(prefix.length) : lastPathSegment(path);\n return field !== undefined && isProviderSubmitField(field);\n}\n\nfunction lastPathSegment(path: string): string | undefined {\n const normalized = path.trim().replaceAll(\"\\\\\", \"/\");\n const index = normalized.lastIndexOf(\"/\");\n const segment = index >= 0 ? normalized.slice(index + 1) : normalized;\n return segment.length > 0 ? segment : undefined;\n}\n\nfunction isProviderSubmitLabel(label: string): boolean {\n switch (normalizeFieldKey(label)) {\n case \"provider_name\":\n case \"primary_care_provider\":\n case \"primary_care_provider_name\":\n case \"provider_location\":\n case \"primary_care_provider_location\":\n case \"location_details\":\n return true;\n default:\n return false;\n }\n}\n\nfunction normalizeFieldKey(key: string): string {\n return key\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"_\")\n .replaceAll(/^_+|_+$/g, \"\");\n}\n\nfunction updateListRowFromContext(\n context: Readonly<Record<string, unknown>>,\n existingRow: unknown,\n): Record<string, unknown> | undefined {\n const itemId = context.itemId;\n if (typeof itemId !== \"string\" || itemId.length === 0) {\n return undefined;\n }\n const row = isRecord(existingRow) ? cloneJsonRecord(existingRow) : {};\n row.itemId = itemId;\n let hasUpdate = false;\n for (const [key, value] of Object.entries(context)) {\n if (key === \"listPath\" || key === \"itemId\" || !isFieldValue(value)) {\n continue;\n }\n row[key] = value;\n hasUpdate = true;\n }\n if (!hasUpdate) {\n return undefined;\n }\n row.__displayText = listRowDisplayText(row);\n return row;\n}\n\nfunction listRowDisplayText(row: Readonly<Record<string, unknown>>): string {\n return Object.entries(row)\n .filter(([key, value]) => {\n if (key === \"itemId\" || key === \"__displayText\" || value === null) {\n return false;\n }\n return isFieldValue(value) && String(value).trim().length > 0;\n })\n .map(([key, value]) => `${key}: ${String(value).trim()}`)\n .join(\" | \");\n}\n\nfunction upsertListRow(rows: unknown[], row: Record<string, unknown>): unknown[] {\n const itemId = row.itemId;\n if (typeof itemId !== \"string\" || itemId.length === 0) {\n return [...rows, row];\n }\n const next = [...rows];\n const existing = next.findIndex(\n (candidate) => isRecord(candidate) && candidate.itemId === itemId,\n );\n if (existing >= 0) {\n next[existing] = row;\n return next;\n }\n return [...next, row];\n}\n\nfunction removeListRowByItemId(rows: unknown[], itemId: string): unknown[] {\n return rows.filter(\n (row) => !isRecord(row) || row.itemId !== itemId,\n );\n}\n\nfunction rememberDeletedListItemId(\n deletedItemIdsByPath: Map<string, Set<string>>,\n listPath: string,\n itemId: string,\n): void {\n const deleted = deletedItemIdsByPath.get(listPath) ?? new Set<string>();\n deleted.add(itemId);\n deletedItemIdsByPath.set(listPath, deleted);\n}\n\nfunction filterDeletedListRows(\n rows: readonly unknown[],\n deletedItemIds: ReadonlySet<string> | undefined,\n): unknown[] {\n const clonedRows = cloneJsonArray(rows);\n if (deletedItemIds === undefined || deletedItemIds.size === 0) {\n return clonedRows;\n }\n return clonedRows.filter(\n (row) => !isRecord(row) || !deletedItemIds.has(stringRowItemId(row)),\n );\n}\n\nfunction stringRowItemId(row: Readonly<Record<string, unknown>>): string {\n const itemId = row.itemId;\n return typeof itemId === \"string\" ? itemId : \"\";\n}\n\nconst PROVIDER_NAME_FIELDS = new Set([\n \"primary_care_provider\",\n \"primarycareprovider\",\n \"primary_care_provider_name\",\n \"primarycareprovidername\",\n \"primary_provider\",\n \"primaryprovider\",\n \"primary_provider_name\",\n \"primaryprovidername\",\n \"primary_care_doctor\",\n \"primarycaredoctor\",\n \"primary_care_doctor_name\",\n \"primarycaredoctorname\",\n \"pcp\",\n \"pcp_name\",\n \"pcpname\",\n \"provider\",\n \"provider_name\",\n \"providername\",\n \"display_name\",\n \"displayname\",\n \"name\",\n]);\n\nconst PROVIDER_LOCATION_FIELDS = new Set([\n \"primary_care_provider_location\",\n \"primarycareproviderlocation\",\n \"primary_provider_location\",\n \"primaryproviderlocation\",\n \"primary_care_location\",\n \"primarycarelocation\",\n \"primary_care_doctor_location\",\n \"primarycaredoctorlocation\",\n \"pcp_location\",\n \"pcplocation\",\n \"provider_location\",\n \"providerlocation\",\n \"provider_location_details\",\n \"providerlocationdetails\",\n \"location\",\n \"location_details\",\n \"locationdetails\",\n \"office_location\",\n \"officelocation\",\n \"practice_location\",\n \"practicelocation\",\n \"provider_address\",\n \"provideraddress\",\n \"address\",\n \"city_state\",\n \"citystate\",\n]);\n\nfunction firstProviderName(\n source: Readonly<Record<string, unknown>>,\n): string | undefined {\n return firstTextByNormalizedField(source, PROVIDER_NAME_FIELDS);\n}\n\nfunction firstProviderLocation(\n source: Readonly<Record<string, unknown>>,\n): string | undefined {\n return firstTextByNormalizedField(source, PROVIDER_LOCATION_FIELDS);\n}\n\nfunction firstTextByNormalizedField(\n source: Readonly<Record<string, unknown>>,\n fields: ReadonlySet<string>,\n): string | undefined {\n for (const [key, value] of Object.entries(source)) {\n if (!fields.has(normalizeFieldKey(key))) {\n continue;\n }\n const text = scalarText(value);\n if (text !== undefined) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction scalarText(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n const text = value.trim();\n return text.length > 0 ? text : undefined;\n }\n if (!isRecord(value)) {\n return undefined;\n }\n return firstTextField(value, [\n \"value\",\n \"displayValue\",\n \"display_value\",\n \"text\",\n \"answer\",\n \"label\",\n ]);\n}\n\nfunction firstTextField(\n source: Readonly<Record<string, unknown>>,\n keys: readonly string[],\n): string | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value !== \"string\") {\n continue;\n }\n const text = value.trim();\n if (text.length > 0) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction listRowsFromRoot(root: Record<string, unknown>): Map<string, unknown[]> {\n const rowsByPath = new Map<string, unknown[]>();\n for (const [key, value] of Object.entries(root)) {\n if (key.includes(\".\") && Array.isArray(value)) {\n rowsByPath.set(key, cloneJsonArray(value));\n }\n }\n collectNestedListRows(root, [], rowsByPath);\n return rowsByPath;\n}\n\nfunction collectNestedListRows(\n value: unknown,\n path: string[],\n rowsByPath: Map<string, unknown[]>,\n): void {\n if (Array.isArray(value)) {\n if (path.length > 1) {\n rowsByPath.set(path.join(\".\"), cloneJsonArray(value));\n }\n return;\n }\n if (!isRecord(value)) {\n return;\n }\n for (const [key, child] of Object.entries(value)) {\n if (key === \"__listDrafts\") {\n continue;\n }\n collectNestedListRows(child, [...path, key], rowsByPath);\n }\n}\n\nfunction isRootDataModelUpdate(\n message: unknown,\n surfaceId: string,\n): message is {\n updateDataModel: { surfaceId: string; path?: string; value: Record<string, unknown> };\n} {\n return (\n isRecord(message) &&\n isRecord(message.updateDataModel) &&\n message.updateDataModel.surfaceId === surfaceId &&\n (message.updateDataModel.path === undefined ||\n message.updateDataModel.path === \"/\") &&\n isRecord(message.updateDataModel.value)\n );\n}\n\nfunction getNestedValue(root: Record<string, unknown>, listPath: string): unknown {\n let current: unknown = root;\n for (const segment of listPath.split(\".\")) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction setNestedValue(\n root: Record<string, unknown>,\n listPath: string,\n value: unknown[],\n): void {\n const segments = listPath.split(\".\");\n let current = root;\n for (const segment of segments.slice(0, -1)) {\n const next = current[segment];\n if (isRecord(next)) {\n current = next;\n continue;\n }\n const created: Record<string, unknown> = {};\n current[segment] = created;\n current = created;\n }\n const leaf = segments.at(-1);\n if (leaf !== undefined) {\n current[leaf] = value;\n }\n}\n\nfunction cloneJsonRecord(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return JSON.parse(JSON.stringify(value)) as Record<string, unknown>;\n}\n\nfunction cloneJsonArray(value: readonly unknown[]): unknown[] {\n return JSON.parse(JSON.stringify(value)) as unknown[];\n}\n\nfunction isFieldValue(value: unknown): value is A2UIFieldValue {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\n/**\n * Fields of an already-rendered surface that the candidate processor fills\n * with a different, non-empty value. The candidate replays the committed data\n * model first, so local edits carry over and only server changes differ;\n * cleared fields are skipped because a root data-model replacement briefly\n * clears unsaved drafts that the session controller restores.\n */\nfunction changedFieldNames(\n previous: MessageProcessor<ReactComponentImplementation>,\n candidate: MessageProcessor<ReactComponentImplementation>,\n surfaceId: string,\n structure: MutableSurfaceStructure | undefined,\n): string[] {\n const before = previous.model.getSurface(surfaceId);\n const after = candidate.model.getSurface(surfaceId);\n if (before === undefined || after === undefined || structure === undefined) {\n return [];\n }\n const fields = new Set<string>();\n for (const { field } of structure.fieldsByComponent.values()) {\n const path = fieldPointer(field);\n const next = after.dataModel.get(path);\n if (\n hasFieldValue(next) &&\n !fieldValueEquivalent(before.dataModel.get(path), next)\n ) {\n fields.add(field);\n }\n }\n return [...fields];\n}\n\nfunction hasFieldValue(value: unknown): boolean {\n return Array.isArray(value)\n ? value.length > 0\n : value !== undefined && value !== null && value !== \"\";\n}\n\nfunction fieldValueEquivalent(left: unknown, right: unknown): boolean {\n if (Array.isArray(left) && Array.isArray(right)) {\n return (\n left.length === right.length &&\n left.every((value, index) => Object.is(value, right[index]))\n );\n }\n return Object.is(left, right);\n}\n\nfunction tabDescriptors(\n component: Record<string, unknown>,\n): A2UITabDescriptor[] {\n if (\n component.component !== \"Tabs\" ||\n !isNonEmptyString(component.id) ||\n !Array.isArray(component.tabs)\n ) {\n return [];\n }\n const tabs: A2UITabDescriptor[] = [];\n for (const tab of component.tabs) {\n if (\n isRecord(tab) &&\n isNonEmptyString(tab.title) &&\n isNonEmptyString(tab.child)\n ) {\n tabs.push({\n componentId: component.id,\n title: tab.title,\n childId: tab.child,\n });\n }\n }\n return tabs;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction classifyProcessingError(error: unknown): ClientErrorCode {\n if (\n error instanceof A2uiError &&\n typeof error.message === \"string\" &&\n error.message.startsWith(\"Catalog not found\")\n ) {\n return \"catalog_unsupported\";\n }\n return \"message_malformed\";\n}\n","import { useId } from \"react\";\nimport { basicCatalog, createComponentImplementation } from \"@a2ui/react/v0_9\";\nimport { ChoicePickerApi } from \"@a2ui/web_core/v0_9/basic_catalog\";\n\nconst OriginalChoice = basicCatalog.components.get(\"ChoicePicker\")!.render;\nexport const HospitalChoice = createComponentImplementation(ChoicePickerApi, ({ props, context, buildChild }) => {\n const id = useId();\n if (props.label !== \"hospital_preference\") {\n return <OriginalChoice context={context} buildChild={buildChild} />;\n }\n const selected = Array.isArray(props.value) ? props.value[0] ?? \"\" : \"\";\n return <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.25rem\" }}>\n <label htmlFor={id}>Hospital preference</label>\n <select id={id} data-a2ui-field=\"hospital_preference\" value={selected} required\n style={{ padding: \"0.5rem\", border: \"var(--a2ui-border)\", borderRadius: \"var(--a2ui-border-radius)\" }}\n onChange={(event) => props.setValue(event.currentTarget.value ? [event.currentTarget.value] : [])}>\n <option value=\"\">Choose Prefer or Avoid</option>\n <option value=\"Prefer\">Prefer</option>\n <option value=\"Avoid\">Avoid</option>\n </select>\n </div>;\n});\n","import { useId, useLayoutEffect, useRef, useState, type CSSProperties } from \"react\";\nimport { createComponentImplementation } from \"@a2ui/react/v0_9\";\nimport { DateTimeInputApi } from \"@a2ui/web_core/v0_9/basic_catalog\";\n\ninterface DateProps {\n value: string;\n setValue: (value: string) => void;\n label?: string;\n min?: unknown;\n max?: unknown;\n}\nconst inputStyle: CSSProperties = {\n backgroundColor: \"var(--a2ui-datetimeinput-background, var(--a2ui-color-input, #fff))\",\n color: \"var(--a2ui-datetimeinput-color, var(--a2ui-color-on-input, #333))\",\n border: \"var(--a2ui-datetimeinput-border, var(--a2ui-border))\",\n borderRadius: \"var(--a2ui-datetimeinput-border-radius, var(--a2ui-border-radius))\",\n padding: \"var(--a2ui-datetimeinput-padding, var(--a2ui-spacing-s))\",\n boxSizing: \"border-box\",\n};\nconst labelStyle: CSSProperties = { fontSize: \"var(--a2ui-label-font-size, var(--a2ui-font-size-s))\", fontWeight: \"bold\" };\n\nexport function parseDateDraft(raw: string): string | null {\n const value = raw.trim();\n const iso = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n const us = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/.exec(value);\n if (!iso && !us) return null;\n const year = Number(iso ? iso[1] : us![3]);\n const month = Number(iso ? iso[2] : us![1]);\n const day = Number(iso ? iso[3] : us![2]);\n const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n const days = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n if (year < 1 || month < 1 || month > 12 || day < 1 || day > days[month - 1]!) return null;\n return `${String(year).padStart(4, \"0\")}-${String(month).padStart(2, \"0\")}-${String(day).padStart(2, \"0\")}`;\n}\nfunction displayDate(value: string): string {\n const iso = parseDateDraft(value);\n return iso ? `${iso.slice(5, 7)}/${iso.slice(8, 10)}/${iso.slice(0, 4)}` : value;\n}\n\nfunction DateOnlyInput(props: DateProps) {\n const id = useId();\n const [draft, setDraft] = useState(() => displayDate(props.value || \"\"));\n const [pickerOpen, setPickerOpen] = useState(false);\n const published = useRef(props.value || \"\");\n const inputRef = useRef<HTMLInputElement>(null);\n const pickerRef = useRef<HTMLInputElement>(null);\n const min = typeof props.min === \"string\" ? props.min : undefined;\n const max = typeof props.max === \"string\" ? props.max : undefined;\n const parsed = parseDateDraft(draft);\n\n // Keep partial human text across render/model echoes, including empty model\n // values emitted while a date is incomplete. Only a different value replaces it.\n useLayoutEffect(() => {\n const incoming = props.value || \"\";\n if (incoming !== published.current) {\n published.current = incoming;\n setDraft(displayDate(incoming));\n }\n }, [props.value]);\n useLayoutEffect(() => {\n const message = draft.trim() && !parsed ? \"Enter a valid date in MM/DD/YYYY format.\"\n : parsed && min && parsed < min ? `Enter a date on or after ${displayDate(min)}.`\n : parsed && max && parsed > max ? `Enter a date on or before ${displayDate(max)}.` : \"\";\n inputRef.current?.setCustomValidity(message);\n }, [draft, parsed, min, max]);\n\n const update = (raw: string) => {\n setDraft(raw);\n const value = parseDateDraft(raw) || \"\";\n published.current = value;\n props.setValue(value);\n };\n return (\n <div data-a2ui-date-editor=\"true\" style={{ display: \"flex\", flexDirection: \"column\", gap: \"var(--a2ui-spacing-xs, 0.25rem)\" }}>\n {props.label && <label htmlFor={id} style={labelStyle}>{props.label}</label>}\n <div style={{ display: \"flex\", gap: \"0.25rem\", position: \"relative\" }}>\n <input ref={inputRef} id={id} type=\"text\" inputMode=\"numeric\" autoComplete=\"off\"\n data-a2ui-date-text-draft=\"true\" placeholder=\"MM/DD/YYYY\" value={draft}\n onChange={(event) => update(event.currentTarget.value)}\n onBlur={() => { if (parsed) setDraft(displayDate(parsed)); }}\n style={{ ...inputStyle, minWidth: 0, flex: 1 }} />\n <button type=\"button\" aria-label={`Choose ${props.label || \"date\"} from calendar`} style={inputStyle}\n onClick={() => {\n const picker = pickerRef.current;\n if (picker && typeof picker.showPicker === \"function\") {\n try { picker.showPicker(); return; } catch { /* Expose the native fallback below. */ }\n }\n setPickerOpen(true);\n }}>▦</button>\n <input ref={pickerRef} type=\"date\" aria-label={`${props.label || \"Date\"} calendar`} tabIndex={pickerOpen ? 0 : -1}\n aria-hidden={!pickerOpen} data-a2ui-calendar-input=\"true\" value={parsed || \"\"} min={min} max={max}\n onChange={(event) => { update(displayDate(event.currentTarget.value)); setPickerOpen(false); }}\n style={pickerOpen ? inputStyle : { position: \"absolute\", opacity: 0, pointerEvents: \"none\", width: 1, height: 1, bottom: 0, right: 0 }} />\n </div>\n </div>\n );\n}\n\nfunction NativeTimeInput(props: DateProps & { enableDate?: boolean; enableTime?: boolean }) {\n const id = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const initialValue = useRef(props.value || \"\");\n useLayoutEffect(() => {\n if (inputRef.current && inputRef.current.value !== (props.value || \"\")) inputRef.current.value = props.value || \"\";\n }, [props.value]);\n return <div>\n {props.label && <label htmlFor={id} style={labelStyle}>{props.label}</label>}\n <input ref={inputRef} id={id} type={!props.enableDate && props.enableTime ? \"time\" : \"datetime-local\"}\n defaultValue={initialValue.current} onChange={(event) => props.setValue(event.currentTarget.value)}\n min={typeof props.min === \"string\" ? props.min : undefined} max={typeof props.max === \"string\" ? props.max : undefined} style={inputStyle} />\n </div>;\n}\n\nexport const DateTimeInput = createComponentImplementation(DateTimeInputApi, ({ props }) =>\n props.enableDate && !props.enableTime ? <DateOnlyInput {...props} /> : <NativeTimeInput {...props} />,\n);\n","/** Accessible host around the official A2UI v0.9.1 React surface. */\n\nimport {\n Component,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useSyncExternalStore,\n} from \"react\";\nimport type { KeyboardEvent as ReactKeyboardEvent, ReactNode } from \"react\";\nimport { A2uiSurface } from \"@a2ui/react/v0_9\";\n\nimport type {\n A2UIClientAdapter,\n A2UIFieldDescriptor,\n A2UIFieldValue,\n A2UISurfaceStructure,\n A2UITabDescriptor,\n AdapterSurface,\n} from \"./adapter.js\";\nimport type { SectionNavigation } from \"./envelope.js\";\nimport type {\n A2UIEditingSnapshot,\n A2UISessionController,\n A2UISessionSnapshot,\n A2UISurfaceMetadata,\n} from \"./session.js\";\n\n/**\n * The agent changed what the form shows: it filled or corrected field values\n * (`field-value`), or moved the conversation to a new current field group\n * (`current-group`). `element` is the rendered container for the first\n * affected field (the whole choice group or date editor, not one option), so\n * hosts can scroll to it for any control type.\n */\nexport interface A2UIAgentUpdateEvent {\n reason: \"field-value\" | \"current-group\";\n surfaceId: string;\n fields: readonly string[];\n groupId?: string;\n element?: HTMLElement;\n}\n\nexport interface A2UISurfaceHostProps {\n adapter: A2UIClientAdapter;\n /** Render a specific surface; defaults to the adapter's current surface. */\n surfaceId?: string;\n /** Authoritative protocol-neutral state/revision/section metadata. */\n surfaceMetadata?: A2UISurfaceMetadata | null;\n /** Optional session owner used for server-authorized blur commits. */\n sessionController?: A2UISessionController;\n /** Stable DOM target for host validation-summary field links. */\n hostId?: string;\n ariaLabel?: string;\n /** Makes stale/pending controls inert while voice remains available. */\n disabled?: boolean;\n busy?: boolean;\n /** Server-rejected fields. Values and server details are never accepted. */\n invalidFields?: readonly string[];\n validationSummaryId?: string;\n /** Shown when no surface is live (voice-only operation continues). */\n noSurfaceFallback?: ReactNode;\n /** Shown when the surface fails to render. */\n errorFallback?: ReactNode;\n /** Called after the DOM reflects an agent-driven field or group change. */\n onAgentUpdate?: (event: A2UIAgentUpdateEvent) => void;\n}\n\nexport function A2UISurfaceHost({\n adapter,\n surfaceId,\n surfaceMetadata,\n sessionController,\n hostId,\n ariaLabel = \"Current intake step\",\n disabled = false,\n busy = false,\n invalidFields = [],\n validationSummaryId,\n noSurfaceFallback,\n errorFallback,\n onAgentUpdate,\n}: A2UISurfaceHostProps): ReactNode {\n const version = useSyncExternalStore(\n adapter.subscribe,\n adapter.getVersion,\n adapter.getVersion,\n );\n const readSessionSnapshot: () => A2UISessionSnapshot | null =\n sessionController?.getSnapshot ?? getNoSessionSnapshot;\n const subscribeSession: (listener: () => void) => () => void =\n sessionController?.subscribe ?? subscribeToNothing;\n const controllerSnapshot = useSyncExternalStore(\n subscribeSession,\n readSessionSnapshot,\n readSessionSnapshot,\n );\n const generatedId = useId().replaceAll(\":\", \"\");\n const rootRef = useRef<HTMLDivElement>(null);\n const lastFocusedState = useRef<string | undefined>(undefined);\n const lastViewedSection = useRef<string | null | undefined>(undefined);\n const lastValidationKey = useRef(\"\");\n const pendingFieldUpdates = useRef(new Map<string, Set<string>>());\n const lastCurrentGroupId = useRef<string | undefined>(undefined);\n const onAgentUpdateRef = useRef(onAgentUpdate);\n onAgentUpdateRef.current = onAgentUpdate;\n const resolvedSurfaceMetadata =\n surfaceMetadata ?? controllerSnapshot?.surface ?? null;\n const editing =\n controllerSnapshot?.editing ??\n editingForSurface(resolvedSurfaceMetadata);\n const surface =\n surfaceId === undefined\n ? adapter.currentSurface\n : adapter.getSurface(surfaceId);\n const structure =\n surface === undefined\n ? EMPTY_STRUCTURE\n : adapter.getSurfaceStructure(surface.id);\n const focusKey =\n surface === undefined\n ? undefined\n : `${surface.id}:${resolvedSurfaceMetadata?.activeStateId ?? \"surface\"}`;\n const frameId = hostId ?? `a2ui-surface-${generatedId}`;\n\n useEffect(\n () =>\n adapter.subscribeFieldUpdates((event) => {\n const pending =\n pendingFieldUpdates.current.get(event.surfaceId) ?? new Set();\n for (const field of event.fields) {\n pending.add(field);\n }\n pendingFieldUpdates.current.set(event.surfaceId, pending);\n }),\n [adapter],\n );\n\n useLayoutEffect(() => {\n const root = rootRef.current;\n if (root === null || surface === undefined) {\n return;\n }\n let cancelled = false;\n let controlCleanups: Array<() => void> = [];\n const refreshControls = (): void => {\n if (cancelled || !root.isConnected) {\n return;\n }\n for (const cleanup of controlCleanups.reverse()) {\n cleanup();\n }\n controlCleanups = [\n annotateFields(\n root,\n structure.fields,\n new Set(invalidFields),\n validationSummaryId,\n ),\n formatFieldLabels(root),\n annotateSavedLoopTables(root, adapter, surface.id),\n bindFieldInteractionGroups(\n root,\n resolvedSurfaceMetadata?.fieldInteractions ?? [],\n editing,\n sessionController,\n ),\n hideGeneratedGroupLabels(\n root,\n resolvedSurfaceMetadata?.fieldInteractions ?? [],\n ),\n annotateActionControls(root),\n suppressSkipForMandatoryFields(root, structure.fields, resolvedSurfaceMetadata?.fieldInteractions ?? []),\n blockInvalidActionControls(root),\n setPendingGroupsDisabled(\n root,\n new Set(editing.pendingGroupIds),\n ),\n setInteractionDisabled(root, disabled || busy),\n ];\n reportAgentUpdates();\n };\n const reportAgentUpdates = (): void => {\n const changedFields = [\n ...(pendingFieldUpdates.current.get(surface.id) ?? []),\n ];\n pendingFieldUpdates.current.clear();\n const currentGroup = resolvedSurfaceMetadata?.fieldInteractions.find(\n (group) => group.mode === \"current\",\n );\n const previousGroupId = lastCurrentGroupId.current;\n if (currentGroup !== undefined) {\n lastCurrentGroupId.current = currentGroup.groupId;\n }\n const report = onAgentUpdateRef.current;\n if (report === undefined) {\n return;\n }\n if (changedFields.length > 0) {\n report({\n reason: \"field-value\",\n surfaceId: surface.id,\n fields: changedFields,\n element: agentUpdateElement(root, changedFields, structure.fields),\n });\n }\n if (\n currentGroup !== undefined &&\n previousGroupId !== undefined &&\n currentGroup.groupId !== previousGroupId\n ) {\n const fields = currentGroup.fields.map((binding) => binding.field);\n report({\n reason: \"current-group\",\n surfaceId: surface.id,\n fields,\n groupId: currentGroup.groupId,\n element: agentUpdateElement(root, fields, structure.fields),\n });\n }\n };\n const scheduleControlRefresh = (): void => {\n queueMicrotask(refreshControls);\n };\n const tabCleanup = enhanceTabs(\n root,\n structure.tabs,\n resolvedSurfaceMetadata?.sectionNavigation ?? null,\n editing.viewedSectionId,\n frameId,\n scheduleControlRefresh,\n (sectionId) => sessionController?.viewSection(sectionId),\n );\n scheduleControlRefresh();\n\n const previousViewedSection = lastViewedSection.current;\n const authoritativeSection = editing.authoritativeSectionId;\n const hasRetainedEdit =\n editing.dirtyGroupIds.length > 0 ||\n editing.pendingGroupIds.length > 0 ||\n editing.rejectedGroupIds.length > 0;\n const authoritativeStateChanged =\n focusKey !== undefined && lastFocusedState.current !== focusKey;\n const returnedToCurrent =\n previousViewedSection !== undefined &&\n previousViewedSection !== authoritativeSection &&\n editing.viewedSectionId === authoritativeSection;\n const validationKey =\n invalidFields.length === 0\n ? \"\"\n : `${controllerSnapshot?.actions.lastResult?.requestId ?? \"fields\"}:${invalidFields.join(\"\\u0000\")}`;\n const validationChanged =\n validationKey.length > 0 && validationKey !== lastValidationKey.current;\n lastFocusedState.current = focusKey;\n lastViewedSection.current = editing.viewedSectionId;\n lastValidationKey.current = validationKey;\n\n if (\n (validationChanged && validationSummaryId === undefined) ||\n returnedToCurrent ||\n (authoritativeStateChanged &&\n !hasRetainedEdit &&\n editing.viewedSectionId === authoritativeSection)\n ) {\n queueMicrotask(() => {\n refreshControls();\n if (cancelled || !root.isConnected) {\n return;\n }\n focusProgressTarget(\n root,\n resolvedSurfaceMetadata,\n invalidFields,\n );\n });\n }\n return () => {\n cancelled = true;\n for (const cleanup of controlCleanups.reverse()) {\n cleanup();\n }\n tabCleanup();\n };\n }, [\n busy,\n disabled,\n editing,\n focusKey,\n frameId,\n invalidFields,\n structure,\n surface,\n resolvedSurfaceMetadata,\n sessionController,\n controllerSnapshot?.actions.lastResult?.requestId,\n validationSummaryId,\n version,\n ]);\n\n if (surface === undefined) {\n return (\n noSurfaceFallback ?? (\n <div data-a2ui-host=\"no-surface\" role=\"status\" aria-live=\"polite\">\n Your conversation continues by voice.\n </div>\n )\n );\n }\n return (\n <div\n ref={rootRef}\n id={frameId}\n className=\"a2ui-accessible-surface\"\n data-a2ui-host=\"surface\"\n data-a2ui-disabled={disabled || busy ? \"true\" : \"false\"}\n role=\"region\"\n aria-label={ariaLabel}\n aria-busy={busy || undefined}\n aria-disabled={disabled || busy || undefined}\n tabIndex={-1}\n >\n <SurfaceErrorBoundary\n key={surface.id}\n adapter={adapter}\n surface={surface}\n fallback={\n errorFallback ?? (\n <div data-a2ui-host=\"render-error\" role=\"alert\">\n This step can't be shown right now. Please continue by voice.\n </div>\n )\n }\n >\n <A2uiSurface surface={surface as OfficialSurface} />\n </SurfaceErrorBoundary>\n </div>\n );\n}\n\nfunction getNoSessionSnapshot(): null {\n return null;\n}\n\nfunction subscribeToNothing(): () => void {\n return () => undefined;\n}\n\nfunction editingForSurface(\n surface: A2UISurfaceMetadata | null,\n): A2UIEditingSnapshot {\n const authoritative = surface?.sectionNavigation?.activeSectionId ?? null;\n return {\n authoritativeSectionId: authoritative,\n viewedSectionId: authoritative,\n dirtyGroupIds: [],\n pendingGroupIds: [],\n rejectedGroupIds: [],\n };\n}\n\nfunction focusProgressTarget(\n root: HTMLElement,\n metadata: A2UISurfaceMetadata | null,\n invalidFields: readonly string[],\n): void {\n const controls = [\n ...root.querySelectorAll<HTMLElement>(\"[data-a2ui-field]\"),\n ].filter((control) => !isControlDisabled(control));\n const invalid = invalidFields\n .map((field) =>\n controls.find((control) => control.dataset.a2uiField === field),\n )\n .find((control) => control !== undefined);\n const currentFields =\n metadata?.fieldInteractions\n .find((group) => group.mode === \"current\")\n ?.fields.map((binding) => binding.field) ?? [];\n const current = currentFields\n .map((field) =>\n controls.find((control) => control.dataset.a2uiField === field),\n )\n .find((control) => control !== undefined);\n const target = invalid ?? current ?? controls[0] ?? root;\n target.focus({ preventScroll: true });\n if (target !== root) {\n target.scrollIntoView?.({\n block: \"nearest\",\n behavior: prefersReducedMotion() ? \"auto\" : \"smooth\",\n });\n }\n}\n\n/** The rendered container for the first of `fields` present in the DOM. */\nfunction agentUpdateElement(\n root: HTMLElement,\n fields: readonly string[],\n descriptors: readonly A2UIFieldDescriptor[],\n): HTMLElement | undefined {\n const controls = [\n ...root.querySelectorAll<HTMLElement>(\"[data-a2ui-field]\"),\n ];\n for (const field of fields) {\n const control = controls.find(\n (candidate) => candidate.dataset.a2uiField === field,\n );\n if (control !== undefined) {\n return (\n control.closest<HTMLElement>(\"[data-a2ui-date-editor]\") ??\n control.closest<HTMLElement>('[role=\"radiogroup\"]') ??\n control\n );\n }\n const descriptor = descriptors.find(\n (candidate) => candidate.field === field,\n );\n const labels = new Set([displayFieldLabel(field)]);\n if (descriptor !== undefined) {\n labels.add(descriptor.label);\n }\n const label = [\n ...root.querySelectorAll<HTMLElement>(\"label, strong, legend\"),\n ].find((candidate) => labels.has(candidate.textContent?.trim() ?? \"\"));\n if (label?.parentElement != null && root.contains(label.parentElement)) {\n return label.parentElement;\n }\n }\n return undefined;\n}\n\nfunction isControlDisabled(control: HTMLElement): boolean {\n return (\n control.getAttribute(\"aria-disabled\") === \"true\" ||\n (\"disabled\" in control && control.disabled === true)\n );\n}\n\nfunction prefersReducedMotion(): boolean {\n return globalThis.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n}\n\nfunction bindFieldInteractionGroups(\n root: HTMLElement,\n groups: A2UISurfaceMetadata[\"fieldInteractions\"],\n editing: A2UIEditingSnapshot,\n controller: A2UISessionController | undefined,\n): () => void {\n if (groups.length === 0) {\n return () => undefined;\n }\n const groupByField = new Map(\n groups.flatMap((group) =>\n group.fields.map(\n (binding) => [binding.field, group] as const,\n ),\n ),\n );\n const originalGroupAttributes = new Map<\n HTMLElement,\n {\n groupId: string | undefined;\n groupMode: string | undefined;\n editState: string | undefined;\n }\n >();\n for (const control of root.querySelectorAll<HTMLElement>(\n \"[data-a2ui-field]\",\n )) {\n const field = control.dataset.a2uiField;\n const group = field === undefined ? undefined : groupByField.get(field);\n if (group !== undefined) {\n const dateEditor = control.closest<HTMLElement>(\"[data-a2ui-date-editor]\");\n const targets = dateEditor\n ? [control, ...dateEditor.querySelectorAll<HTMLElement>(\"button, input[data-a2ui-calendar-input]\")]\n : [control];\n for (const target of targets) {\n originalGroupAttributes.set(target, {\n groupId: target.dataset.a2uiGroupId,\n groupMode: target.dataset.a2uiGroupMode,\n editState: target.dataset.a2uiEditState,\n });\n target.dataset.a2uiGroupId = group.groupId;\n target.dataset.a2uiGroupMode = group.mode;\n target.dataset.a2uiEditState = groupEditState(group.groupId, editing);\n }\n }\n }\n\n if (controller === undefined) {\n return () => {\n restoreGroupAttributes(originalGroupAttributes);\n };\n }\n\n const queuedCaptures = new Set<string>();\n const scheduleCapture = (groupId: string): void => {\n if (queuedCaptures.has(groupId)) {\n return;\n }\n queuedCaptures.add(groupId);\n queueMicrotask(() => {\n queuedCaptures.delete(groupId);\n controller.captureFieldGroupDraft(groupId);\n });\n };\n const onInput = (event: Event): void => {\n const groupId = interactionGroupId(root, event.target);\n if (groupId !== undefined) {\n scheduleCapture(groupId);\n }\n };\n const onFocusOut = (event: FocusEvent): void => {\n const groupId = interactionGroupId(root, event.target);\n const group = groups.find((candidate) => candidate.groupId === groupId);\n if (\n groupId === undefined ||\n group?.mode === \"current\" ||\n interactionGroupId(root, event.relatedTarget) === groupId\n ) {\n return;\n }\n queueMicrotask(() => {\n if (\n interactionGroupId(root, root.ownerDocument.activeElement) !== groupId\n ) {\n const invalidDate = [...root.querySelectorAll<HTMLInputElement>(\"input[data-a2ui-date-text-draft]\")]\n .some((input) => input.dataset.a2uiGroupId === groupId && !input.checkValidity());\n if (!invalidDate) controller.commitFieldGroup(groupId);\n }\n });\n };\n root.addEventListener(\"input\", onInput, true);\n root.addEventListener(\"change\", onInput, true);\n root.addEventListener(\"focusout\", onFocusOut, true);\n\n return () => {\n root.removeEventListener(\"input\", onInput, true);\n root.removeEventListener(\"change\", onInput, true);\n root.removeEventListener(\"focusout\", onFocusOut, true);\n restoreGroupAttributes(originalGroupAttributes);\n };\n}\n\nfunction groupEditState(\n groupId: string,\n editing: A2UIEditingSnapshot,\n): \"dirty\" | \"saving\" | \"rejected\" | \"saved\" {\n if (editing.pendingGroupIds.includes(groupId)) {\n return \"saving\";\n }\n if (editing.rejectedGroupIds.includes(groupId)) {\n return \"rejected\";\n }\n return editing.dirtyGroupIds.includes(groupId) ? \"dirty\" : \"saved\";\n}\n\nfunction hideGeneratedGroupLabels(\n root: HTMLElement,\n groups: A2UISurfaceMetadata[\"fieldInteractions\"],\n): () => void {\n if (groups.length === 0) {\n return () => undefined;\n }\n const originals = new Map<\n HTMLElement,\n {\n hidden: boolean;\n ariaHidden: string | null;\n generatedGroupLabel: string | undefined;\n }\n >();\n for (const group of groups) {\n const controls = [\n ...root.querySelectorAll<HTMLElement>(\"[data-a2ui-group-id]\"),\n ].filter((control) => control.dataset.a2uiGroupId === group.groupId);\n const label = generatedGroupLabelForControls(root, controls);\n if (label === undefined || originals.has(label)) {\n continue;\n }\n originals.set(label, {\n hidden: label.hidden,\n ariaHidden: label.getAttribute(\"aria-hidden\"),\n generatedGroupLabel: label.dataset.a2uiGeneratedGroupLabel,\n });\n label.hidden = true;\n label.setAttribute(\"aria-hidden\", \"true\");\n label.dataset.a2uiGeneratedGroupLabel = \"true\";\n }\n return () => {\n for (const [label, original] of originals) {\n label.hidden = original.hidden;\n restoreAttribute(label, \"aria-hidden\", original.ariaHidden);\n restoreDataset(\n label,\n \"a2uiGeneratedGroupLabel\",\n original.generatedGroupLabel,\n );\n }\n };\n}\n\nfunction generatedGroupLabelForControls(\n root: HTMLElement,\n controls: readonly HTMLElement[],\n): HTMLElement | undefined {\n for (const control of controls) {\n const label = generatedGroupLabelForControl(root, control);\n if (label !== undefined) {\n return label;\n }\n }\n return undefined;\n}\n\nfunction generatedGroupLabelForControl(\n root: HTMLElement,\n control: HTMLElement,\n): HTMLElement | undefined {\n let current: HTMLElement | null = control;\n while (current !== null && current !== root) {\n const parent: HTMLElement | null = current.parentElement;\n if (parent === null) {\n return undefined;\n }\n const siblings = [...parent.children];\n const currentIndex = siblings.indexOf(current);\n const precedingText = siblings\n .slice(0, currentIndex)\n .filter(isGeneratedTextElement);\n if (precedingText.length >= 2) {\n return precedingText[0];\n }\n if (\n precedingText.length === 1 &&\n subtreeHasGeneratedTextElement(current)\n ) {\n return precedingText[0];\n }\n current = parent;\n }\n return undefined;\n}\n\nfunction subtreeHasGeneratedTextElement(element: HTMLElement): boolean {\n return [...element.querySelectorAll(\"*\")].some(isGeneratedTextElement);\n}\n\nfunction isGeneratedTextElement(element: Element): element is HTMLElement {\n return (\n element instanceof HTMLElement &&\n element.textContent?.trim() !== \"\" &&\n element.querySelector(\"button, input, textarea, select, label\") === null &&\n (element.classList.contains(\"a2ui-text\") ||\n element.classList.contains(\"no-markdown-renderer\") ||\n [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"body\", \"caption\"].some((className) =>\n element.classList.contains(className),\n ) ||\n element.querySelector(\":scope > section > :is(h1, h2, h3, h4, h5, p)\") !==\n null)\n );\n}\n\nfunction restoreGroupAttributes(\n originals: ReadonlyMap<\n HTMLElement,\n {\n groupId: string | undefined;\n groupMode: string | undefined;\n editState: string | undefined;\n }\n >,\n): void {\n for (const [control, original] of originals) {\n restoreDataset(control, \"a2uiGroupId\", original.groupId);\n restoreDataset(control, \"a2uiGroupMode\", original.groupMode);\n restoreDataset(control, \"a2uiEditState\", original.editState);\n }\n}\n\nfunction restoreDataset(\n element: HTMLElement,\n key:\n | \"a2uiGroupId\"\n | \"a2uiGroupMode\"\n | \"a2uiEditState\"\n | \"a2uiGroupPending\"\n | \"a2uiGeneratedGroupLabel\"\n | \"a2uiLoopTable\"\n | \"a2uiLoopRow\"\n | \"a2uiLoopHeader\"\n | \"a2uiLoopField\"\n | \"a2uiLoopCell\"\n | \"a2uiLoopColumn\"\n | \"a2uiLoopColumnCount\"\n | \"a2uiLoopLabel\"\n | \"a2uiLoopActionControl\"\n | \"a2uiLoopGeneratedHeader\",\n value: string | undefined,\n): void {\n if (value === undefined) {\n delete element.dataset[key];\n } else {\n element.dataset[key] = value;\n }\n}\n\nfunction interactionGroupId(\n root: HTMLElement,\n target: EventTarget | null,\n): string | undefined {\n if (!(target instanceof Element) || !root.contains(target)) {\n return undefined;\n }\n return target.closest<HTMLElement>(\"[data-a2ui-group-id]\")?.dataset\n .a2uiGroupId;\n}\n\nfunction annotateActionControls(root: HTMLElement): () => void {\n const actions = [...root.querySelectorAll<HTMLButtonElement>(\"button\")].filter(\n (button) =>\n button.getAttribute(\"role\") !== \"tab\" &&\n [\"submit\", \"skip\", \"revise\"].includes(\n button.textContent?.trim().toLowerCase() ?? \"\",\n ),\n );\n const groups = new Set<HTMLElement>();\n for (const action of actions) {\n const label = action.textContent?.trim().toLowerCase() ?? \"\";\n action.dataset.a2uiAction = \"true\";\n action.dataset.a2uiActionLabel = label;\n if (action.parentElement !== null) {\n action.parentElement.dataset.a2uiActionGroup = \"true\";\n groups.add(action.parentElement);\n }\n }\n return () => {\n for (const action of actions) {\n delete action.dataset.a2uiAction;\n delete action.dataset.a2uiActionLabel;\n }\n for (const group of groups) {\n delete group.dataset.a2uiActionGroup;\n }\n };\n}\n\nfunction suppressSkipForMandatoryFields(\n root: HTMLElement,\n fields: readonly A2UIFieldDescriptor[],\n groups: A2UISurfaceMetadata[\"fieldInteractions\"],\n): () => void {\n const currentFields = new Set(groups.filter((group) => group.mode === \"current\")\n .flatMap((group) => group.fields.map((binding) => binding.field)));\n const requiredFields = fields.filter(\n (field) => field.required &&\n (groups.length === 0 || currentFields.has(field.field)) &&\n !field.componentId.includes(\":list-new:field:\") &&\n !field.componentId.includes(\":list-row:field:\"),\n );\n if (\n requiredFields.length === 0 ||\n requiredFields.every((field) => isOptionalCoverageField(field.field))\n ) {\n return () => undefined;\n }\n const skipButtons = [\n ...root.querySelectorAll<HTMLButtonElement>(\"[data-a2ui-action='true']\"),\n ].filter((button) => button.dataset.a2uiActionLabel === \"skip\");\n const originals = skipButtons.map((button) => ({\n button,\n hidden: button.hidden,\n ariaHidden: button.getAttribute(\"aria-hidden\"),\n }));\n for (const button of skipButtons) {\n button.hidden = true;\n button.setAttribute(\"aria-hidden\", \"true\");\n }\n return () => {\n for (const original of originals) {\n original.button.hidden = original.hidden;\n restoreAttribute(original.button, \"aria-hidden\", original.ariaHidden);\n }\n };\n}\n\nfunction isOptionalCoverageField(field: string): boolean {\n return (\n field === \"employer_union_coverage\" ||\n field === \"va_tricare_benefits\" ||\n field === \"coverage.employerUnionCoverage\" ||\n field === \"coverage.vaTricareBenefits\"\n );\n}\n\nconst EMPTY_STRUCTURE: A2UISurfaceStructure = { fields: [], tabs: [] };\ntype OfficialSurface = Parameters<typeof A2uiSurface>[0][\"surface\"];\n\ninterface BoundaryProps {\n adapter: A2UIClientAdapter;\n surface: AdapterSurface;\n fallback: ReactNode;\n children: ReactNode;\n}\n\nexport class SurfaceErrorBoundary extends Component<\n BoundaryProps,\n { failedSurfaceId: string | undefined }\n> {\n state = { failedSurfaceId: undefined as string | undefined };\n\n static getDerivedStateFromError(): { failedSurfaceId: string } {\n return { failedSurfaceId: \"pending\" };\n }\n\n componentDidCatch(error: Error): void {\n this.setState({ failedSurfaceId: this.props.surface.id });\n this.props.adapter.reportRenderFailure(this.props.surface.id, error.name);\n }\n\n render(): ReactNode {\n if (this.state.failedSurfaceId !== undefined) {\n return (\n <div\n data-a2ui-error-boundary=\"true\"\n tabIndex={-1}\n ref={(node) => node?.focus()}\n >\n {this.props.fallback}\n </div>\n );\n }\n return this.props.children;\n }\n}\n\nfunction annotateFields(\n root: HTMLElement,\n fields: readonly A2UIFieldDescriptor[],\n invalidFields: ReadonlySet<string>,\n validationSummaryId: string | undefined,\n): () => void {\n const originalAttributes = new Map<\n HTMLElement,\n {\n field: string | undefined;\n required: string | null;\n invalid: string | null;\n describedBy: string | null;\n pattern: string | null;\n max: string | null;\n inputMode: string | null;\n maxLength: string | null;\n }\n >();\n const matchCleanups: Array<() => void> = [];\n for (const field of fields) {\n const match = findFieldControls(root, field);\n matchCleanups.push(match.cleanup);\n for (const control of match.controls) {\n if (!originalAttributes.has(control)) {\n originalAttributes.set(control, {\n field: control.dataset.a2uiField,\n required: control.getAttribute(\"aria-required\"),\n invalid: control.getAttribute(\"aria-invalid\"),\n describedBy: control.getAttribute(\"aria-describedby\"),\n pattern: control.getAttribute(\"pattern\"),\n max: control.getAttribute(\"max\"),\n inputMode: control.getAttribute(\"inputmode\"),\n maxLength: control.getAttribute(\"maxlength\"),\n });\n }\n control.dataset.a2uiField = field.field;\n if (field.required) {\n control.setAttribute(\"aria-required\", \"true\");\n }\n if (invalidFields.has(field.field)) {\n control.setAttribute(\"aria-invalid\", \"true\");\n if (validationSummaryId !== undefined) {\n const describedBy = new Set(\n (control.getAttribute(\"aria-describedby\") ?? \"\")\n .split(/\\s+/)\n .filter(Boolean),\n );\n describedBy.add(validationSummaryId);\n control.setAttribute(\n \"aria-describedby\",\n [...describedBy].join(\" \"),\n );\n }\n }\n applyControlValidationAttributes(control, field);\n const cleanup = attachControlValidationBehavior(control, field);\n if (cleanup !== undefined) {\n matchCleanups.push(cleanup);\n }\n }\n }\n return () => {\n for (const [control, original] of originalAttributes) {\n if (original.field === undefined) {\n delete control.dataset.a2uiField;\n } else {\n control.dataset.a2uiField = original.field;\n }\n restoreAttribute(control, \"aria-required\", original.required);\n restoreAttribute(control, \"aria-invalid\", original.invalid);\n restoreAttribute(control, \"aria-describedby\", original.describedBy);\n restoreAttribute(control, \"pattern\", original.pattern);\n restoreAttribute(control, \"max\", original.max);\n restoreAttribute(control, \"inputmode\", original.inputMode);\n restoreAttribute(control, \"maxlength\", original.maxLength);\n }\n for (const cleanup of matchCleanups.reverse()) {\n cleanup();\n }\n };\n}\n\nfunction applyControlValidationAttributes(\n control: HTMLElement,\n field: A2UIFieldDescriptor,\n): void {\n if (field.validationRegexp !== undefined) {\n control.setAttribute(\"pattern\", field.validationRegexp);\n }\n if (field.max !== undefined) {\n control.setAttribute(\"max\", field.max);\n }\n if (isPhoneValidationRegexp(field.validationRegexp)) {\n control.setAttribute(\"inputmode\", \"numeric\");\n control.setAttribute(\"maxlength\", \"10\");\n } else if (isZipValidationRegexp(field.validationRegexp)) {\n control.setAttribute(\"inputmode\", \"numeric\");\n control.setAttribute(\"maxlength\", \"5\");\n } else if (isIntegerValidationRegexp(field.validationRegexp)) {\n control.setAttribute(\"inputmode\", \"numeric\");\n control.setAttribute(\"maxlength\", \"2\");\n }\n}\n\nfunction attachControlValidationBehavior(\n control: HTMLElement,\n field: A2UIFieldDescriptor,\n): (() => void) | undefined {\n const maxLength = numericMaxLengthForField(field);\n const customValidation = customValidationForField(field);\n if (maxLength === undefined || !isTextInput(control)) {\n if (customValidation === undefined || !isTextInput(control)) {\n return undefined;\n }\n const validate = (): void => {\n applyCustomValidationMessage(control, customValidation);\n };\n control.addEventListener(\"input\", validate);\n control.addEventListener(\"change\", validate);\n validate();\n return () => {\n control.setCustomValidity(\"\");\n control.removeEventListener(\"input\", validate);\n control.removeEventListener(\"change\", validate);\n };\n }\n const sanitize = (): void => {\n const next = control.value.replace(/\\D/g, \"\").slice(0, maxLength);\n if (control.value !== next) {\n control.value = next;\n control.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n if (customValidation !== undefined) {\n applyCustomValidationMessage(control, customValidation);\n }\n };\n control.addEventListener(\"input\", sanitize);\n control.addEventListener(\"change\", sanitize);\n sanitize();\n return () => {\n control.setCustomValidity(\"\");\n control.removeEventListener(\"input\", sanitize);\n control.removeEventListener(\"change\", sanitize);\n };\n}\n\nfunction customValidationForField(\n field: A2UIFieldDescriptor,\n): { message: string; pattern?: RegExp } | undefined {\n if (isZipValidationRegexp(field.validationRegexp)) {\n return {\n message: \"Enter a valid 5-digit ZIP code.\",\n pattern: regexpFromPattern(field.validationRegexp),\n };\n }\n if (isPhoneValidationRegexp(field.validationRegexp)) {\n return {\n message: \"Enter a valid 10-digit US phone number.\",\n pattern: regexpFromPattern(field.validationRegexp),\n };\n }\n return undefined;\n}\n\nfunction applyCustomValidationMessage(\n control: HTMLInputElement,\n validation: { message: string; pattern?: RegExp },\n): void {\n control.setCustomValidity(\"\");\n if (\n control.value.length > 0 &&\n (validation.pattern?.test(control.value) === false ||\n !control.checkValidity())\n ) {\n control.setCustomValidity(validation.message);\n }\n}\n\nfunction regexpFromPattern(pattern: string | undefined): RegExp | undefined {\n if (pattern === undefined) {\n return undefined;\n }\n try {\n return new RegExp(pattern);\n } catch {\n return undefined;\n }\n}\n\nfunction numericMaxLengthForField(\n field: A2UIFieldDescriptor,\n): number | undefined {\n if (isPhoneValidationRegexp(field.validationRegexp)) {\n return 10;\n }\n if (isZipValidationRegexp(field.validationRegexp)) {\n return 5;\n }\n if (isIntegerValidationRegexp(field.validationRegexp)) {\n return 2;\n }\n return undefined;\n}\n\nfunction isPhoneValidationRegexp(pattern: string | undefined): boolean {\n return (\n pattern === \"^[2-9]\\\\d{2}[2-9]\\\\d{6}$\" ||\n (pattern?.startsWith(\"^(?:\") === true &&\n pattern.endsWith(\")[2-9]\\\\d{6}$\"))\n );\n}\n\nfunction isZipValidationRegexp(pattern: string | undefined): boolean {\n return (\n pattern === \"^(?!00000$)\\\\d{5}$\" ||\n pattern ===\n \"^(?:00(?:50[1-9]|5[1-9][0-9]|[6-9][0-9]{2})|0[1-9][0-9]{3}|[1-8][0-9]{4}|9[0-8][0-9]{3}|99[0-8][0-9]{2}|999[0-4][0-9]|99950)$\"\n );\n}\n\nfunction isIntegerValidationRegexp(pattern: string | undefined): boolean {\n return pattern === \"^\\\\d{1,2}$\";\n}\n\nfunction isTextInput(element: HTMLElement): element is HTMLInputElement {\n return element instanceof HTMLInputElement && element.type !== \"radio\";\n}\n\nfunction blockInvalidActionControls(root: HTMLElement): () => void {\n const blockIfInvalid = (event: Event): void => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const action = target.closest<HTMLElement>(\"[data-a2ui-action='true']\");\n if (action === null || !root.contains(action)) {\n return;\n }\n if (action.dataset.a2uiActionLabel === \"skip\") {\n return;\n }\n const invalid = firstInvalidInput(root);\n if (invalid === undefined) {\n return;\n }\n event.preventDefault();\n event.stopImmediatePropagation();\n invalid.setAttribute(\"aria-invalid\", \"true\");\n invalid.reportValidity();\n invalid.focus();\n };\n root.addEventListener(\"click\", blockIfInvalid, true);\n root.addEventListener(\"keydown\", blockIfInvalid, true);\n return () => {\n root.removeEventListener(\"click\", blockIfInvalid, true);\n root.removeEventListener(\"keydown\", blockIfInvalid, true);\n };\n}\n\nfunction firstInvalidInput(root: HTMLElement): HTMLInputElement | HTMLSelectElement | undefined {\n return [...root.querySelectorAll<HTMLInputElement | HTMLSelectElement>(\"input[data-a2ui-field], select[data-a2ui-field]\")]\n .filter((input) => input.type !== \"radio\" && !isControlDisabled(input))\n .find((input) => !input.checkValidity());\n}\n\ninterface FieldControlMatch {\n controls: HTMLElement[];\n cleanup: () => void;\n}\n\nfunction findFieldControls(\n root: HTMLElement,\n field: A2UIFieldDescriptor,\n): FieldControlMatch {\n const labels = [...root.querySelectorAll<HTMLLabelElement>(\"label\")];\n const label = labels.find(\n (candidate) => candidate.textContent?.trim() === field.label,\n );\n if (label?.htmlFor) {\n const control = root.ownerDocument.getElementById(label.htmlFor);\n if (control instanceof HTMLElement && root.contains(control)) {\n return { controls: [control], cleanup: () => undefined };\n }\n }\n const headings = [...root.querySelectorAll<HTMLElement>(\"strong\")];\n const heading = headings.find(\n (candidate) => candidate.textContent?.trim() === field.label,\n );\n if (heading === undefined) {\n return { controls: [], cleanup: () => undefined };\n }\n const group = heading.parentElement;\n if (group === null) {\n return { controls: [], cleanup: () => undefined };\n }\n const originalHeadingId = heading.getAttribute(\"id\");\n const originalRole = group.getAttribute(\"role\");\n const originalLabelledBy = group.getAttribute(\"aria-labelledby\");\n const headingId = heading.id || `${safeDomToken(field.componentId)}-label`;\n heading.id = headingId;\n group.setAttribute(\"role\", \"radiogroup\");\n group.setAttribute(\"aria-labelledby\", headingId);\n return {\n controls: [\n ...group.querySelectorAll<HTMLElement>(\n 'input[type=\"radio\"], input[type=\"checkbox\"], button',\n ),\n ],\n cleanup: () => {\n restoreAttribute(heading, \"id\", originalHeadingId);\n restoreAttribute(group, \"role\", originalRole);\n restoreAttribute(group, \"aria-labelledby\", originalLabelledBy);\n },\n };\n}\n\nfunction formatFieldLabels(root: HTMLElement): () => void {\n const originals = new Map<HTMLElement, string>();\n for (const control of root.querySelectorAll<HTMLElement>(\"[data-a2ui-field]\")) {\n const field = control.dataset.a2uiField;\n if (field === undefined) {\n continue;\n }\n const label = labelElementForControl(root, control);\n if (label === undefined || originals.has(label)) {\n continue;\n }\n if (label.textContent?.trim() !== field) {\n continue;\n }\n originals.set(label, label.textContent ?? \"\");\n label.textContent = displayFieldLabel(field);\n }\n for (const element of root.querySelectorAll<HTMLElement>(\"*\")) {\n if (!isGeneratedTextElement(element) || originals.has(element)) {\n continue;\n }\n const field = generatedFieldLabelName(element.textContent ?? \"\");\n if (field === undefined) {\n continue;\n }\n originals.set(element, element.textContent ?? \"\");\n element.textContent = displayFieldLabel(field);\n }\n return () => {\n for (const [label, text] of originals) {\n label.textContent = text;\n }\n };\n}\n\nfunction generatedFieldLabelName(text: string): string | undefined {\n const trimmed = text.trim();\n const unwrapped =\n trimmed.startsWith(\"*\") && trimmed.endsWith(\"*\")\n ? trimmed.slice(1, -1).trim()\n : trimmed;\n return /^[A-Za-z][A-Za-z0-9_]*$/.test(unwrapped) &&\n /[_A-Z]/.test(unwrapped)\n ? unwrapped\n : undefined;\n}\n\nfunction annotateSavedLoopTables(\n root: HTMLElement,\n adapter: A2UIClientAdapter,\n surfaceId: string,\n): () => void {\n const originals = new Map<\n HTMLElement,\n {\n loopTable: string | undefined;\n loopRow: string | undefined;\n loopHeader: string | undefined;\n loopField: string | undefined;\n loopCell: string | undefined;\n loopColumn: string | undefined;\n loopColumnCount: string | undefined;\n loopLabel: string | undefined;\n generatedHeader: string | undefined;\n actionControl: string | undefined;\n hidden: string | null;\n ariaHidden: string | null;\n }\n >();\n const textOriginals = new Map<HTMLElement, string>();\n const listeners: Array<() => void> = [];\n const remember = (element: HTMLElement): void => {\n if (originals.has(element)) {\n return;\n }\n originals.set(element, {\n loopTable: element.dataset.a2uiLoopTable,\n loopRow: element.dataset.a2uiLoopRow,\n loopHeader: element.dataset.a2uiLoopHeader,\n loopField: element.dataset.a2uiLoopField,\n loopCell: element.dataset.a2uiLoopCell,\n loopColumn: element.dataset.a2uiLoopColumn,\n loopColumnCount: element.dataset.a2uiLoopColumnCount,\n loopLabel: element.dataset.a2uiLoopLabel,\n generatedHeader: element.dataset.a2uiLoopGeneratedHeader,\n actionControl: element.dataset.a2uiLoopActionControl,\n hidden: element.getAttribute(\"hidden\"),\n ariaHidden: element.getAttribute(\"aria-hidden\"),\n });\n };\n const setText = (element: HTMLElement, text: string): void => {\n if (!textOriginals.has(element)) {\n textOriginals.set(element, element.textContent ?? \"\");\n }\n element.textContent = text;\n };\n const commitText = (element: HTMLElement, text: string): void => {\n textOriginals.set(element, text);\n element.textContent = text;\n };\n const generatedElements: HTMLElement[] = [];\n const rows = [...root.querySelectorAll<HTMLElement>(\"div, section, article, li\")]\n .filter(\n (row) =>\n getSavedLoopRowFields(row).length > 0 &&\n normalizedLoopSummaryFields(getSavedLoopSummaryFields(row)).length >= 2,\n );\n for (const row of rows) {\n const parent = row.parentElement;\n if (parent !== null) {\n remember(parent);\n parent.dataset.a2uiLoopTable = \"true\";\n }\n }\n const rowsByParent = new Map<HTMLElement, HTMLElement[]>();\n for (const row of rows) {\n const parent = row.parentElement;\n if (parent === null) {\n continue;\n }\n const siblings = rowsByParent.get(parent) ?? [];\n siblings.push(row);\n rowsByParent.set(parent, siblings);\n }\n for (const siblings of rowsByParent.values()) {\n const firstRow = siblings[0];\n const parent = firstRow?.parentElement;\n if (parent !== null && parent !== undefined && firstRow !== undefined) {\n const header = buildSavedLoopHeader(parent, firstRow);\n if (header !== undefined) {\n parent.dataset.a2uiLoopColumnCount =\n header.dataset.a2uiLoopColumnCount ?? undefined;\n parent.insertBefore(header, firstRow);\n generatedElements.push(header);\n }\n }\n siblings.forEach((row, rowIndex) => {\n remember(row);\n row.dataset.a2uiLoopRow = \"true\";\n row.dataset.a2uiLoopHeader = \"false\";\n let columnIndex = 0;\n for (const child of [...row.children]) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n const button = child.matches(\"button\")\n ? child\n : child.querySelector<HTMLElement>(\"button\");\n if (button !== null) {\n const label = button.textContent?.trim().toLowerCase();\n remember(child);\n child.dataset.a2uiLoopCell = label === \"save\" ? \"save\" : \"action\";\n if (label === \"save\") {\n child.setAttribute(\"hidden\", \"\");\n child.setAttribute(\"aria-hidden\", \"true\");\n }\n continue;\n }\n const fieldParts = getSavedLoopFieldParts(child);\n if (fieldParts !== undefined) {\n remember(child);\n child.dataset.a2uiLoopField = \"true\";\n const column = String(columnIndex + 1);\n child.dataset.a2uiLoopColumn = column;\n remember(fieldParts.label);\n fieldParts.label.dataset.a2uiLoopCell = \"label\";\n fieldParts.label.dataset.a2uiLoopColumn = column;\n remember(fieldParts.value);\n fieldParts.value.dataset.a2uiLoopCell = \"value\";\n fieldParts.value.dataset.a2uiLoopColumn = column;\n columnIndex += 1;\n continue;\n }\n if (isSavedLoopSummary(child)) {\n remember(child);\n child.dataset.a2uiLoopCell = \"summary\";\n child.setAttribute(\"hidden\", \"\");\n child.setAttribute(\"aria-hidden\", \"true\");\n continue;\n }\n remember(child);\n child.dataset.a2uiLoopCell = columnIndex % 2 === 0 ? \"label\" : \"value\";\n child.dataset.a2uiLoopColumn = String(Math.floor(columnIndex / 2) + 1);\n columnIndex += 1;\n }\n normalizeSavedLoopRow(\n row,\n rowIndex,\n remember,\n setText,\n commitText,\n generatedElements,\n listeners,\n adapter,\n surfaceId,\n );\n });\n }\n return () => {\n for (const remove of listeners.reverse()) {\n remove();\n }\n for (const [element, original] of originals) {\n restoreDataset(element, \"a2uiLoopTable\", original.loopTable);\n restoreDataset(element, \"a2uiLoopRow\", original.loopRow);\n restoreDataset(element, \"a2uiLoopHeader\", original.loopHeader);\n restoreDataset(element, \"a2uiLoopField\", original.loopField);\n restoreDataset(element, \"a2uiLoopCell\", original.loopCell);\n restoreDataset(element, \"a2uiLoopColumn\", original.loopColumn);\n restoreDataset(element, \"a2uiLoopColumnCount\", original.loopColumnCount);\n restoreDataset(element, \"a2uiLoopLabel\", original.loopLabel);\n restoreDataset(\n element,\n \"a2uiLoopGeneratedHeader\",\n original.generatedHeader,\n );\n restoreDataset(element, \"a2uiLoopActionControl\", original.actionControl);\n restoreAttribute(element, \"hidden\", original.hidden);\n restoreAttribute(element, \"aria-hidden\", original.ariaHidden);\n }\n for (const [element, text] of textOriginals) {\n element.textContent = text;\n }\n for (const element of generatedElements) {\n if (element.dataset.a2uiGeneratedLoopActionCell === \"true\") {\n const parent = element.parentElement;\n if (parent !== null) {\n while (element.firstChild !== null) {\n parent.insertBefore(element.firstChild, element);\n }\n }\n }\n element.remove();\n }\n };\n}\n\nfunction buildSavedLoopHeader(\n parent: HTMLElement,\n firstRow: HTMLElement,\n): HTMLElement | undefined {\n const fields = normalizedLoopSummaryFields(getSavedLoopSummaryFields(firstRow));\n if (fields.length < 2) {\n return undefined;\n }\n const header = parent.ownerDocument.createElement(\"div\");\n header.dataset.a2uiLoopGeneratedHeader = \"true\";\n const columnCount = Math.min(fields.length, 3);\n header.dataset.a2uiLoopColumnCount = String(columnCount);\n fields.slice(0, columnCount).forEach((field, index) => {\n const cell = parent.ownerDocument.createElement(\"div\");\n cell.dataset.a2uiLoopCell = \"label\";\n cell.dataset.a2uiLoopColumn = String(index + 1);\n cell.textContent = displayFieldLabel(field);\n header.appendChild(cell);\n });\n const action = parent.ownerDocument.createElement(\"div\");\n action.dataset.a2uiLoopCell = \"label\";\n action.dataset.a2uiLoopColumn = String(columnCount + 1);\n action.textContent = \"Action\";\n header.appendChild(action);\n return header;\n}\n\nfunction normalizeSavedLoopRow(\n row: HTMLElement,\n rowIndex: number,\n remember: (element: HTMLElement) => void,\n setText: (element: HTMLElement, text: string) => void,\n commitText: (element: HTMLElement, text: string) => void,\n generatedElements: HTMLElement[],\n listeners: Array<() => void>,\n adapter: A2UIClientAdapter,\n surfaceId: string,\n): void {\n const summaryFields = normalizedLoopSummaryFields(getSavedLoopSummaryFields(row));\n if (summaryFields.length < 2) {\n return;\n }\n const columnCount = Math.min(summaryFields.length, 3);\n row.dataset.a2uiLoopColumnCount = String(columnCount);\n const fields = [...row.querySelectorAll<HTMLElement>(\"[data-a2ui-loop-field='true']\")];\n const summaryValues = getSavedLoopSummaryValues(row);\n const action = row.querySelector<HTMLElement>(\"[data-a2ui-loop-cell='action']\");\n const save = row.querySelector<HTMLElement>(\"[data-a2ui-loop-cell='save']\");\n const orderedFields = summaryFields\n .slice(0, columnCount)\n .map((fieldName) => {\n const field = findSavedLoopField(fields, fieldName);\n if (field !== undefined) {\n return field;\n }\n const value = summaryValues.get(fieldName);\n if (value === undefined) {\n return undefined;\n }\n const generated = createSavedLoopField(row.ownerDocument, fieldName, value);\n if (action !== null) {\n row.insertBefore(generated, action);\n } else {\n row.appendChild(generated);\n }\n generatedElements.push(generated);\n return generated;\n })\n .filter((field): field is HTMLElement => field !== undefined);\n orderedFields.forEach((field, index) => {\n const column = String(index + 1);\n remember(field);\n field.dataset.a2uiLoopColumn = column;\n const label = field.querySelector<HTMLElement>(\"[data-a2ui-loop-cell='label']\");\n const value = field.querySelector<HTMLElement>(\"[data-a2ui-loop-cell='value']\");\n if (label !== null) {\n remember(label);\n label.dataset.a2uiLoopColumn = column;\n label.dataset.a2uiLoopCell = \"label\";\n const displayLabel = displayFieldLabel(summaryFields[index] ?? \"\");\n label.dataset.a2uiLoopLabel = displayLabel;\n setText(label, displayLabel);\n }\n if (value !== null) {\n remember(value);\n value.dataset.a2uiLoopColumn = column;\n value.dataset.a2uiLoopCell = \"value\";\n }\n });\n const rowEditValues = savedLoopRowEditValues(orderedFields, summaryFields);\n const rowKey = savedLoopRowEditKey(rowIndex, summaryFields, rowEditValues);\n if (action !== null) {\n remember(action);\n action.dataset.a2uiLoopColumn = String(columnCount + 1);\n createSavedLoopActionCell(\n row,\n save,\n action,\n columnCount + 1,\n remember,\n setText,\n commitText,\n generatedElements,\n listeners,\n adapter,\n surfaceId,\n rowKey,\n orderedFields,\n summaryFields.slice(0, columnCount),\n );\n }\n for (const field of fields) {\n if (orderedFields.includes(field)) {\n continue;\n }\n remember(field);\n field.dataset.a2uiLoopCell = \"save\";\n field.setAttribute(\"hidden\", \"\");\n field.setAttribute(\"aria-hidden\", \"true\");\n }\n}\n\nfunction createSavedLoopActionCell(\n row: HTMLElement,\n save: HTMLElement | null,\n action: HTMLElement,\n column: number,\n remember: (element: HTMLElement) => void,\n setText: (element: HTMLElement, text: string) => void,\n commitText: (element: HTMLElement, text: string) => void,\n generatedElements: HTMLElement[],\n listeners: Array<() => void>,\n adapter: A2UIClientAdapter,\n surfaceId: string,\n rowKey: string,\n orderedFields: readonly HTMLElement[],\n summaryFields: readonly string[],\n): HTMLElement | undefined {\n if (save === null) {\n return undefined;\n }\n remember(save);\n remember(action);\n const actionCell = row.ownerDocument.createElement(\"div\");\n const editButton = row.ownerDocument.createElement(\"button\");\n editButton.type = \"button\";\n actionCell.dataset.a2uiLoopCell = \"action\";\n actionCell.dataset.a2uiLoopColumn = String(column);\n actionCell.dataset.a2uiLoopActionGroup = \"true\";\n actionCell.dataset.a2uiGeneratedLoopActionCell = \"true\";\n editButton.dataset.a2uiLoopCell = \"edit\";\n editButton.dataset.a2uiLoopColumn = String(column);\n editButton.dataset.a2uiGeneratedLoopEditButton = \"true\";\n editButton.textContent = \"Edit\";\n row.insertBefore(actionCell, action);\n actionCell.append(editButton, save, action);\n save.dataset.a2uiLoopCell = \"save\";\n save.dataset.a2uiLoopColumn = String(column);\n save.setAttribute(\"hidden\", \"\");\n save.setAttribute(\"aria-hidden\", \"true\");\n action.dataset.a2uiLoopColumn = String(column);\n listeners.push(\n bindSavedLoopEditAction(\n editButton,\n save,\n row,\n orderedFields,\n summaryFields,\n adapter,\n surfaceId,\n rowKey,\n setText,\n commitText,\n generatedElements,\n listeners,\n ),\n );\n const activeEditValues = adapter.getListRowEdit(surfaceId, rowKey);\n if (activeEditValues !== undefined) {\n renderSavedLoopEditInputs(\n editButton,\n row,\n orderedFields,\n summaryFields,\n adapter,\n surfaceId,\n rowKey,\n setText,\n generatedElements,\n listeners,\n activeEditValues,\n false,\n );\n }\n generatedElements.push(editButton);\n generatedElements.push(actionCell);\n delete action.dataset.a2uiLoopCell;\n delete action.dataset.a2uiLoopColumn;\n action.dataset.a2uiLoopActionControl = \"true\";\n return actionCell;\n}\n\nfunction bindSavedLoopEditAction(\n editButton: HTMLElement,\n submitButton: HTMLElement,\n row: HTMLElement,\n orderedFields: readonly HTMLElement[],\n summaryFields: readonly string[],\n adapter: A2UIClientAdapter,\n surfaceId: string,\n rowKey: string,\n setText: (element: HTMLElement, text: string) => void,\n commitText: (element: HTMLElement, text: string) => void,\n generatedElements: HTMLElement[],\n listeners: Array<() => void>,\n): () => void {\n const onClick = (event: MouseEvent): void => {\n if (adapter.getListRowEdit(surfaceId, rowKey) === undefined) {\n event.preventDefault();\n event.stopImmediatePropagation();\n const values = savedLoopRowEditValues(orderedFields, summaryFields);\n adapter.beginListRowEdit(surfaceId, rowKey, values);\n renderSavedLoopEditInputs(\n editButton,\n row,\n orderedFields,\n summaryFields,\n adapter,\n surfaceId,\n rowKey,\n setText,\n generatedElements,\n listeners,\n values,\n true,\n );\n return;\n }\n event.preventDefault();\n event.stopImmediatePropagation();\n const values = savedLoopRowInputValues(orderedFields, summaryFields);\n adapter.clearListRowEdit(surfaceId, rowKey);\n delete row.dataset.a2uiLoopEditing;\n setText(editButton, \"Edit\");\n orderedFields.forEach((field, index) => {\n const fieldName = summaryFields[index];\n const value = field.querySelector<HTMLElement>(\n \"[data-a2ui-loop-cell='value']\",\n );\n if (fieldName !== undefined && value !== null) {\n commitText(value, stringEditValue(values[fieldName]));\n }\n });\n adapter.stageListRowUpdate(surfaceId, values);\n window.setTimeout(() => {\n const clickable =\n submitButton instanceof HTMLButtonElement\n ? submitButton\n : submitButton.querySelector<HTMLButtonElement>(\"button\");\n (clickable ?? submitButton).click();\n }, 0);\n };\n editButton.addEventListener(\"click\", onClick, { capture: true });\n return () => {\n editButton.removeEventListener(\"click\", onClick, { capture: true });\n };\n}\n\nfunction renderSavedLoopEditInputs(\n editButton: HTMLElement,\n row: HTMLElement,\n orderedFields: readonly HTMLElement[],\n summaryFields: readonly string[],\n adapter: A2UIClientAdapter,\n surfaceId: string,\n rowKey: string,\n setText: (element: HTMLElement, text: string) => void,\n generatedElements: HTMLElement[],\n listeners: Array<() => void>,\n values: Readonly<Record<string, A2UIFieldValue>>,\n focusFirstInput: boolean,\n): void {\n row.dataset.a2uiLoopEditing = \"true\";\n for (const [index, field] of orderedFields.entries()) {\n const fieldName = summaryFields[index];\n const value = field.querySelector<HTMLElement>(\n \"[data-a2ui-loop-cell='value']\",\n );\n if (fieldName === undefined || value === null) {\n continue;\n }\n let input = value.querySelector<HTMLInputElement | HTMLSelectElement>(\n \"[data-a2ui-loop-edit-input='true']\",\n );\n if (input === null) {\n if (fieldName === \"hospital_preference\") {\n const select = row.ownerDocument.createElement(\"select\");\n for (const choice of [\"\", \"Prefer\", \"Avoid\"]) {\n const option = row.ownerDocument.createElement(\"option\");\n option.value = choice;\n option.textContent = choice || \"Choose Prefer or Avoid\";\n select.appendChild(option);\n }\n select.required = true;\n input = select;\n } else {\n input = row.ownerDocument.createElement(\"input\");\n input.type = \"text\";\n }\n input.name = fieldName;\n input.setAttribute(\"aria-label\", displayFieldLabel(fieldName));\n input.dataset.a2uiLoopEditInput = \"true\";\n setText(value, \"\");\n value.appendChild(input);\n generatedElements.push(input);\n }\n input.value = stringEditValue(values[fieldName]);\n const syncEditValue = (): void => {\n adapter.updateListRowEdit(\n surfaceId,\n rowKey,\n savedLoopRowInputValues(orderedFields, summaryFields),\n );\n };\n input.addEventListener(\"input\", syncEditValue);\n input.addEventListener(\"change\", syncEditValue);\n listeners.push(() => {\n input.removeEventListener(\"input\", syncEditValue);\n input.removeEventListener(\"change\", syncEditValue);\n });\n }\n setText(editButton, \"Save\");\n if (focusFirstInput) {\n row.querySelector<HTMLInputElement | HTMLSelectElement>(\n \"[data-a2ui-loop-edit-input='true']\",\n )?.focus();\n }\n}\n\nfunction savedLoopRowEditValues(\n orderedFields: readonly HTMLElement[],\n summaryFields: readonly string[],\n): Record<string, A2UIFieldValue> {\n const values: Record<string, A2UIFieldValue> = {};\n orderedFields.forEach((field, index) => {\n const fieldName = summaryFields[index];\n const value = field.querySelector<HTMLElement>(\n \"[data-a2ui-loop-cell='value']\",\n );\n if (fieldName !== undefined) {\n values[fieldName] = value?.textContent?.trim() ?? \"\";\n }\n });\n return values;\n}\n\nfunction savedLoopRowInputValues(\n orderedFields: readonly HTMLElement[],\n summaryFields: readonly string[],\n): Record<string, A2UIFieldValue> {\n const values: Record<string, A2UIFieldValue> = {};\n orderedFields.forEach((field, index) => {\n const fieldName = summaryFields[index];\n const input = field.querySelector<HTMLInputElement | HTMLSelectElement>(\n \"[data-a2ui-loop-edit-input='true']\",\n );\n const value = field.querySelector<HTMLElement>(\n \"[data-a2ui-loop-cell='value']\",\n );\n if (fieldName !== undefined) {\n values[fieldName] =\n input?.value ?? value?.textContent?.trim() ?? \"\";\n }\n });\n return values;\n}\n\nfunction savedLoopRowEditKey(\n rowIndex: number,\n summaryFields: readonly string[],\n values: Readonly<Record<string, A2UIFieldValue>>,\n): string {\n return `${rowIndex}:${summaryFields\n .map((field) => `${field}=${stringEditValue(values[field])}`)\n .join(\"|\")}`;\n}\n\nfunction stringEditValue(value: A2UIFieldValue | undefined): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n return String(value);\n}\n\nfunction findSavedLoopField(\n fields: readonly HTMLElement[],\n summaryField: string,\n): HTMLElement | undefined {\n const expectedName = canonicalLoopFieldName(summaryField).toLowerCase();\n const expectedLabel = displayFieldLabel(expectedName).toLowerCase();\n return fields.find((field) => {\n const parts = getSavedLoopFieldParts(field);\n if (parts?.fieldName === undefined) {\n return false;\n }\n const name = canonicalLoopFieldName(parts.fieldName).toLowerCase();\n return name === expectedName || name === expectedLabel;\n });\n}\n\nfunction createSavedLoopField(\n document: Document,\n fieldName: string,\n value: string,\n): HTMLElement {\n const field = document.createElement(\"div\");\n field.dataset.a2uiLoopField = \"true\";\n const label = document.createElement(\"span\");\n label.dataset.a2uiLoopCell = \"label\";\n label.textContent = displayFieldLabel(fieldName);\n const valueCell = document.createElement(\"div\");\n valueCell.dataset.a2uiLoopCell = \"value\";\n valueCell.textContent = value;\n field.append(label, valueCell);\n return field;\n}\n\nfunction normalizedLoopSummaryFields(fields: string[]): string[] {\n const withoutInternal = uniqueStrings(\n fields\n .map(canonicalLoopFieldName)\n .filter(\n (field) =>\n ![\"itemid\", \"__displaytext\", \"role\", \"save\", \"delete\", \"action\"].includes(\n field.toLowerCase(),\n ),\n ),\n );\n const providerFields = [\n \"doctor_name\",\n \"doctor_location\",\n \"specialization_type\",\n ];\n const hasProviderFields = providerFields.some((field) =>\n withoutInternal.includes(field),\n );\n if (hasProviderFields) {\n return providerFields.filter((field) => withoutInternal.includes(field));\n }\n const prescriptionFields = [\n \"prescription_name\",\n \"prescription_dosage\",\n \"prescription_frequency\",\n \"prescriptions\",\n ];\n const hasPrescriptionFields = prescriptionFields.some((field) =>\n withoutInternal.includes(field),\n );\n if (hasPrescriptionFields) {\n return prescriptionFields.filter((field) => withoutInternal.includes(field));\n }\n const pharmacyFields = [\"pharmacy_name\", \"pharmacy_type\", \"pharmacy_address\"];\n const hasPharmacyFields = pharmacyFields.some((field) =>\n withoutInternal.includes(field),\n );\n if (hasPharmacyFields) {\n return pharmacyFields.filter((field) => withoutInternal.includes(field));\n }\n const hospitalFields = [\"hospital_name\", \"hospital_city_state\", \"hospital_preference\"];\n const hasHospitalFields = hospitalFields.some((field) =>\n withoutInternal.includes(field),\n );\n if (hasHospitalFields) {\n return hospitalFields.filter((field) => withoutInternal.includes(field));\n }\n return withoutInternal;\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n const seen = new Set<string>();\n const output: string[] = [];\n for (const value of values) {\n const key = value.toLowerCase();\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n output.push(value);\n }\n return output;\n}\n\nfunction getSavedLoopSummaryFields(row: HTMLElement): string[] {\n const summary = [...row.children].find(\n (child): child is HTMLElement =>\n child instanceof HTMLElement && isSavedLoopSummary(child),\n );\n if (summary === undefined) {\n return [];\n }\n return (summary.textContent ?? \"\")\n .split(/\\s+\\|\\s+/)\n .map((part) => part.trim().match(/^\\*?([^:*]+?)\\*?\\s*:/)?.[1])\n .filter((field): field is string => field !== undefined);\n}\n\nfunction getSavedLoopSummaryValues(row: HTMLElement): Map<string, string> {\n const summary = [...row.children].find(\n (child): child is HTMLElement =>\n child instanceof HTMLElement && isSavedLoopSummary(child),\n );\n const values = new Map<string, string>();\n const text = summary?.textContent ?? \"\";\n for (const part of text.split(/\\s+\\|\\s+/)) {\n const match = /^([^:]+):\\s*(.*)$/.exec(part.trim());\n if (match === null) {\n continue;\n }\n const [, label, value] = match;\n const fieldName = canonicalLoopFieldName(label ?? \"\");\n if (fieldName && value !== undefined) {\n values.set(fieldName, value.trim());\n }\n }\n return values;\n}\n\nfunction getSavedLoopRowFields(row: HTMLElement): HTMLElement[] {\n if (\n row.dataset.a2uiActionGroup === \"true\" ||\n row.querySelector(\"input, textarea, select\") !== null ||\n row.querySelector(\"button\") === null\n ) {\n return [];\n }\n return [...row.children].filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n !child.matches(\"button\") &&\n child.querySelector(\"button\") === null &&\n getSavedLoopFieldParts(child) !== undefined,\n );\n}\n\nfunction getSavedLoopFieldParts(\n element: Element,\n): { fieldName: string | undefined; label: HTMLElement; value: HTMLElement } | undefined {\n if (!(element instanceof HTMLElement)) {\n return undefined;\n }\n const children = [...element.children].filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n !child.matches(\"button\") &&\n child.querySelector(\"button\") === null,\n );\n if (children.length < 2) {\n return undefined;\n }\n const [label, value] = children;\n if (label === undefined || value === undefined) {\n return undefined;\n }\n const labelText = label.textContent ?? \"\";\n const fieldName = savedLoopFieldLabelName(labelText);\n return fieldName !== undefined || isLoopActionText(labelText)\n ? { fieldName, label, value }\n : undefined;\n}\n\nfunction savedLoopFieldLabelName(text: string): string | undefined {\n const trimmed = text.trim();\n if (isLoopActionText(trimmed)) {\n return undefined;\n }\n const generated = generatedFieldLabelName(trimmed);\n if (generated !== undefined) {\n return generated;\n }\n return LOOP_FIELD_LABELS.get(trimmed.replace(/\\s+/g, \" \").toLowerCase());\n}\n\nfunction canonicalLoopFieldName(text: string): string {\n const generated = generatedFieldLabelName(text);\n if (generated !== undefined) {\n return generated;\n }\n const normalized = text.trim().replace(/\\s+/g, \" \").toLowerCase();\n const mapped = LOOP_FIELD_LABELS.get(normalized);\n if (mapped !== undefined) {\n return mapped;\n }\n return text;\n}\n\nfunction isLoopActionText(text: string | null | undefined): boolean {\n const normalized = text?.trim().toLowerCase();\n return normalized === \"save\" || normalized === \"delete\";\n}\n\nconst LOOP_FIELD_LABELS = new Map<string, string>([\n [\"role\", \"role\"],\n [\"doctor name\", \"doctor_name\"],\n [\"doctor location\", \"doctor_location\"],\n [\"specialization type\", \"specialization_type\"],\n [\"location\", \"location\"],\n [\"prescription name\", \"prescription_name\"],\n [\"prescription dosage\", \"prescription_dosage\"],\n [\"prescription frequency\", \"prescription_frequency\"],\n [\"pharmacy name\", \"pharmacy_name\"],\n [\"pharmacy type\", \"pharmacy_type\"],\n [\"pharmacy address\", \"pharmacy_address\"],\n [\"hospital name\", \"hospital_name\"],\n [\"hospital city state\", \"hospital_city_state\"],\n [\"hospital preference\", \"hospital_preference\"],\n]);\n\nfunction isSavedLoopSummary(element: HTMLElement): boolean {\n if (element.children.length > 0) {\n return false;\n }\n return /\\b[A-Za-z][A-Za-z0-9_]*:\\s*/.test(element.textContent ?? \"\");\n}\n\nfunction labelElementForControl(\n root: HTMLElement,\n control: HTMLElement,\n): HTMLElement | undefined {\n if (control.id.length > 0) {\n const label = root.querySelector<HTMLLabelElement>(\n `label[for=\"${cssString(control.id)}\"]`,\n );\n if (label !== null) {\n return label;\n }\n }\n const group = control.closest<HTMLElement>('[role=\"radiogroup\"]');\n const labelledBy = group?.getAttribute(\"aria-labelledby\");\n if (labelledBy === null || labelledBy === undefined || labelledBy === \"\") {\n return undefined;\n }\n const label = root.ownerDocument.getElementById(labelledBy);\n return label instanceof HTMLElement && root.contains(label) ? label : undefined;\n}\n\nfunction displayFieldLabel(field: string): string {\n const words = field\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .split(/[\\s_-]+/)\n .filter(Boolean);\n return words\n .map((word, index) => displayFieldLabelWord(word, index))\n .join(\" \");\n}\n\nfunction displayFieldLabelWord(word: string, index: number): string {\n const lower = word.toLowerCase();\n const acronyms: Record<string, string> = {\n dob: \"DOB\",\n id: \"ID\",\n ssn: \"SSN\",\n url: \"URL\",\n us: \"US\",\n zip: \"ZIP\",\n };\n if (lower in acronyms) {\n return acronyms[lower]!;\n }\n if (index > 0 && [\"a\", \"an\", \"and\", \"for\", \"in\", \"of\", \"on\", \"or\", \"the\", \"to\", \"with\"].includes(lower)) {\n return lower;\n }\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n}\n\nfunction cssString(value: string): string {\n return globalThis.CSS?.escape?.(value) ?? value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n\nfunction enhanceTabs(\n root: HTMLElement,\n tabs: readonly A2UITabDescriptor[],\n navigation: SectionNavigation | null,\n viewedSectionId: string | null,\n frameId: string,\n onPanelChange: () => void,\n onViewSection: (sectionId: string) => unknown,\n): () => void {\n if (\n tabs.length === 0 ||\n navigation === null ||\n tabs.length !== navigation.orderedSectionIds.length\n ) {\n return () => undefined;\n }\n const header = findTabHeader(root, tabs);\n if (header === undefined) {\n return () => undefined;\n }\n const buttons = [...header.children].filter(\n (child): child is HTMLButtonElement => child instanceof HTMLButtonElement,\n );\n const panel = header.nextElementSibling as HTMLElement | null;\n if (buttons.length !== tabs.length || panel === null) {\n return () => undefined;\n }\n\n const statuses = tabStatuses(navigation);\n const sectionIds = navigation.orderedSectionIds;\n const enabled = statuses\n .map((status, index) => (status === \"future\" ? -1 : index))\n .filter((index) => index >= 0);\n const authoritative = statuses.findIndex((status) => status === \"active\");\n const requested =\n viewedSectionId === null ? -1 : sectionIds.indexOf(viewedSectionId);\n const selectedIndex =\n requested >= 0 && statuses[requested] !== \"future\"\n ? requested\n : authoritative >= 0\n ? authoritative\n : (enabled[0] ?? 0);\n const listeners: Array<() => void> = [];\n let synchronizingRenderer = false;\n header.dataset.a2uiTabList = \"true\";\n header.setAttribute(\"role\", \"tablist\");\n header.setAttribute(\"aria-label\", \"Intake sections\");\n panel.dataset.a2uiTabPanel = \"true\";\n panel.setAttribute(\"role\", \"tabpanel\");\n panel.tabIndex = 0;\n panel.id = `${safeDomToken(frameId)}-tabpanel`;\n\n const activate = (index: number): void => {\n const selected = buttons[index];\n if (selected === undefined || statuses[index] === \"future\") {\n return;\n }\n buttons.forEach((button, buttonIndex) => {\n const isSelected = buttonIndex === index;\n button.setAttribute(\"aria-selected\", String(isSelected));\n button.tabIndex = isSelected ? 0 : -1;\n });\n panel.setAttribute(\"aria-labelledby\", selected.id);\n onPanelChange();\n };\n\n buttons.forEach((button, index) => {\n button.dataset.a2uiTab = statuses[index];\n button.setAttribute(\"role\", \"tab\");\n button.id = `${safeDomToken(frameId)}-tab-${index}`;\n button.setAttribute(\"aria-controls\", panel.id);\n if (statuses[index] === \"future\") {\n button.disabled = true;\n button.setAttribute(\"aria-disabled\", \"true\");\n button.tabIndex = -1;\n }\n const onClick = (): void => {\n activate(index);\n if (!synchronizingRenderer) {\n onViewSection(sectionIds[index]!);\n }\n };\n const onKeyDown = (event: KeyboardEvent): void => {\n const destination = tabKeyboardDestination(\n event,\n index,\n enabled,\n );\n if (destination === undefined) {\n return;\n }\n event.preventDefault();\n buttons[destination]?.focus();\n buttons[destination]?.click();\n };\n button.addEventListener(\"click\", onClick);\n button.addEventListener(\"keydown\", onKeyDown);\n listeners.push(() => {\n button.removeEventListener(\"click\", onClick);\n button.removeEventListener(\"keydown\", onKeyDown);\n });\n });\n synchronizingRenderer = true;\n buttons[selectedIndex]?.click();\n synchronizingRenderer = false;\n activate(selectedIndex);\n\n return () => {\n for (const remove of listeners) {\n remove();\n }\n delete header.dataset.a2uiTabList;\n header.removeAttribute(\"role\");\n header.removeAttribute(\"aria-label\");\n delete panel.dataset.a2uiTabPanel;\n panel.removeAttribute(\"role\");\n panel.removeAttribute(\"aria-labelledby\");\n panel.removeAttribute(\"id\");\n panel.removeAttribute(\"tabindex\");\n buttons.forEach((button) => {\n delete button.dataset.a2uiTab;\n button.removeAttribute(\"role\");\n button.removeAttribute(\"aria-selected\");\n button.removeAttribute(\"aria-controls\");\n button.removeAttribute(\"aria-disabled\");\n button.removeAttribute(\"id\");\n button.removeAttribute(\"tabindex\");\n button.disabled = false;\n });\n };\n}\n\nfunction findTabHeader(\n root: HTMLElement,\n tabs: readonly A2UITabDescriptor[],\n): HTMLElement | undefined {\n return [...root.querySelectorAll<HTMLElement>(\"div\")].find((candidate) => {\n const directButtons = [...candidate.children].filter(\n (child): child is HTMLButtonElement => child instanceof HTMLButtonElement,\n );\n return (\n directButtons.length === tabs.length &&\n directButtons.every(\n (button, index) => button.textContent?.trim() === tabs[index]?.title,\n )\n );\n });\n}\n\ntype TabStatus = \"active\" | \"completed\" | \"future\";\n\nfunction tabStatuses(navigation: SectionNavigation): TabStatus[] {\n const completed = new Set(navigation.completedSectionIds);\n const future = new Set(navigation.futureSectionIds);\n return navigation.orderedSectionIds.map((sectionId): TabStatus => {\n if (sectionId === navigation.activeSectionId) {\n return \"active\";\n }\n return completed.has(sectionId)\n ? \"completed\"\n : future.has(sectionId)\n ? \"future\"\n : \"future\";\n });\n}\n\nfunction tabKeyboardDestination(\n event: KeyboardEvent | ReactKeyboardEvent,\n current: number,\n enabled: readonly number[],\n): number | undefined {\n const currentEnabledIndex = enabled.indexOf(current);\n if (event.key === \"Home\") {\n return enabled[0];\n }\n if (event.key === \"End\") {\n return enabled.at(-1);\n }\n if (event.key !== \"ArrowRight\" && event.key !== \"ArrowLeft\") {\n return undefined;\n }\n const delta = event.key === \"ArrowRight\" ? 1 : -1;\n const start = currentEnabledIndex >= 0 ? currentEnabledIndex : 0;\n return enabled[(start + delta + enabled.length) % enabled.length];\n}\n\nfunction setPendingGroupsDisabled(\n root: HTMLElement,\n pendingGroupIds: ReadonlySet<string>,\n): () => void {\n if (pendingGroupIds.size === 0) {\n return () => undefined;\n }\n const originals = new Map<\n HTMLButtonElement | HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n {\n disabled: boolean;\n busy: string | null;\n pending: string | undefined;\n }\n >();\n for (const control of root.querySelectorAll<HTMLElement>(\n \"[data-a2ui-group-id]\",\n )) {\n if (\n !isDisableableControl(control) ||\n !pendingGroupIds.has(control.dataset.a2uiGroupId ?? \"\")\n ) {\n continue;\n }\n originals.set(control, {\n disabled: control.disabled,\n busy: control.getAttribute(\"aria-busy\"),\n pending: control.dataset.a2uiGroupPending,\n });\n control.disabled = true;\n control.setAttribute(\"aria-busy\", \"true\");\n control.dataset.a2uiGroupPending = \"true\";\n }\n return () => {\n for (const [control, original] of originals) {\n control.disabled = original.disabled;\n restoreAttribute(control, \"aria-busy\", original.busy);\n restoreDataset(\n control,\n \"a2uiGroupPending\",\n original.pending,\n );\n }\n };\n}\n\nfunction isDisableableControl(\n control: HTMLElement,\n): control is\n | HTMLButtonElement\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement {\n return (\n control instanceof HTMLButtonElement ||\n control instanceof HTMLInputElement ||\n control instanceof HTMLTextAreaElement ||\n control instanceof HTMLSelectElement\n );\n}\n\nfunction setInteractionDisabled(\n root: HTMLElement,\n disabled: boolean,\n): () => void {\n if (!disabled) {\n root.removeAttribute(\"inert\");\n return () => undefined;\n }\n root.setAttribute(\"inert\", \"\");\n const controls = [\n ...root.querySelectorAll<\n HTMLButtonElement | HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >(\"button, input, textarea, select\"),\n ];\n for (const control of controls) {\n if (!control.disabled) {\n control.disabled = true;\n control.dataset.a2uiSessionDisabled = \"true\";\n }\n }\n return () => {\n root.removeAttribute(\"inert\");\n for (const control of controls) {\n if (control.dataset.a2uiSessionDisabled === \"true\") {\n control.disabled = false;\n delete control.dataset.a2uiSessionDisabled;\n }\n }\n };\n}\n\nfunction safeDomToken(value: string): string {\n return value.replace(/[^A-Za-z0-9_-]/g, \"-\");\n}\n\nfunction restoreAttribute(\n element: HTMLElement,\n name: string,\n value: string | null,\n): void {\n if (value === null) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value);\n }\n}\n","/**\n * Protocol-neutral A2UI session lifecycle over a structural LiveKit room.\n *\n * LiveKit SDK imports stay out of this module and its declarations. Hosts\n * retain ownership of shared rooms and must explicitly identify which remote\n * participant is trusted to publish Flow Factory server envelopes.\n */\n\nimport { A2uiMessageListSchema } from \"@a2ui/web_core/v0_9\";\n\nimport type {\n A2UIClientAdapter,\n A2UIClientErrorEvent,\n A2UIFieldValue,\n A2UIRendererActionEvent,\n} from \"./adapter.js\";\nimport { A2UIClientActionBridge } from \"./actions.js\";\nimport type { A2UIActionState } from \"./actions.js\";\nimport {\n A2UI_CAPABILITIES_TOPIC,\n A2UI_CLIENT_TOPIC,\n A2UI_PROTOCOL_VERSION,\n A2UI_SERVER_TOPIC,\n ENVELOPE_VERSION,\n MAX_ENVELOPE_BYTES,\n} from \"./envelope.js\";\nimport type {\n A2UICapabilityEnvelope,\n A2UIFieldInteractionGroup,\n A2UIServerEnvelope,\n AckEnvelope,\n ClientErrorCode,\n ParticipantRole,\n SectionNavigation,\n SnapshotEnvelope,\n SurfaceUpdateEnvelope,\n} from \"./envelope.js\";\n\ninterface A2UITextStreamReaderLike {\n readonly info?: { readonly size?: number };\n readAll(options?: { signal?: AbortSignal }): Promise<string>;\n}\n\nexport interface A2UIStreamParticipant {\n readonly identity: string;\n}\n\ntype A2UITextStreamHandler = (\n reader: A2UITextStreamReaderLike,\n participant: A2UIStreamParticipant,\n) => void;\n\ntype A2UIRoomEvent = \"reconnected\" | \"disconnected\";\n\n/** Minimal room contract used by the adapter; no LiveKit SDK type is exposed. */\nexport interface A2UIRoomLike {\n readonly localParticipant: {\n sendText(text: string, options: { topic: string }): Promise<unknown>;\n };\n registerTextStreamHandler(\n topic: string,\n handler: A2UITextStreamHandler,\n ): void;\n unregisterTextStreamHandler(topic: string): void;\n on(event: A2UIRoomEvent, listener: () => void): unknown;\n off(event: A2UIRoomEvent, listener: () => void): unknown;\n}\n\nexport type A2UITrustedServerParticipant = (\n participant: A2UIStreamParticipant,\n) => boolean;\n\nexport type A2UISessionStatus =\n | \"idle\"\n | \"connecting\"\n | \"connected\"\n | \"unsupported\"\n | \"closed\";\n\nexport interface A2UISurfaceMetadata {\n readonly surfaceId: string;\n readonly activeStateId: string | null;\n readonly revision: number;\n readonly sectionNavigation: SectionNavigation | null;\n readonly fieldInteractions: readonly A2UIFieldInteractionGroup[];\n}\n\n/** Protocol-neutral local edit/navigation state exposed to host applications. */\nexport interface A2UIEditingSnapshot {\n readonly authoritativeSectionId: string | null;\n readonly viewedSectionId: string | null;\n readonly dirtyGroupIds: readonly string[];\n readonly pendingGroupIds: readonly string[];\n readonly rejectedGroupIds: readonly string[];\n}\n\nexport interface A2UISessionSnapshot {\n readonly status: A2UISessionStatus;\n readonly restoring: boolean;\n readonly surface: A2UISurfaceMetadata | null;\n readonly actions: A2UIActionState;\n readonly editing: A2UIEditingSnapshot;\n}\n\nexport interface A2UISessionControllerOptions {\n room: A2UIRoomLike;\n adapter: A2UIClientAdapter;\n isTrustedServerParticipant: A2UITrustedServerParticipant;\n participantRole?: ParticipantRole;\n /** Time before a delivered action becomes explicitly retryable. */\n actionAckTimeoutMs?: number;\n /** Best-effort capability retry schedule for servers that attach after join. */\n capabilityRetryScheduleMs?: readonly number[];\n}\n\ninterface RevisionBaseline {\n surfaceId: string;\n revision: number;\n}\n\ninterface FieldGroupDraft {\n readonly surfaceId: string;\n readonly fields: readonly string[];\n readonly baseValues: Readonly<Record<string, A2UIFieldValue>>;\n readonly values: Readonly<Record<string, A2UIFieldValue>>;\n}\n\nconst DEFAULT_CAPABILITY_RETRY_SCHEDULE_MS = [250, 1000, 2500, 5000] as const;\n\n/** Attach one A2UI adapter to an existing, caller-owned room. */\nexport class A2UISessionController {\n readonly #room: A2UIRoomLike;\n readonly #adapter: A2UIClientAdapter;\n readonly #isTrustedServerParticipant: A2UITrustedServerParticipant;\n readonly #participantRole: ParticipantRole;\n readonly #capabilityRetryScheduleMs: readonly number[];\n readonly #actionBridge: A2UIClientActionBridge;\n readonly #listeners = new Set<() => void>();\n\n #sessionSnapshot: A2UISessionSnapshot = {\n status: \"idle\",\n restoring: false,\n surface: null,\n actions: { pendingRequests: [], lastResult: null },\n editing: emptyEditingSnapshot(),\n };\n #startPromise: Promise<void> | undefined;\n #deliveryQueue: Promise<void> = Promise.resolve();\n #handlerRegistered = false;\n #listenersRegistered = false;\n #closed = false;\n #pendingSnapshotRequestId: string | undefined;\n #capabilityGeneration = 0;\n #restoreResetsSequence = false;\n #revisionBaseline: RevisionBaseline | undefined;\n #unsubscribeActions: (() => void) | undefined;\n #unsubscribeClientErrors: (() => void) | undefined;\n #capabilityRetryTimers: ReturnType<typeof globalThis.setTimeout>[] = [];\n #draftsByGroup = new Map<string, FieldGroupDraft>();\n #authoritativeByGroup = new Map<\n string,\n Readonly<Record<string, A2UIFieldValue>>\n >();\n #rejectedGroupIds = new Set<string>();\n #handledActionResultRequestId: string | undefined;\n\n constructor(options: A2UISessionControllerOptions) {\n this.#room = options.room;\n this.#adapter = options.adapter;\n this.#isTrustedServerParticipant = options.isTrustedServerParticipant;\n this.#participantRole = options.participantRole ?? \"member\";\n this.#capabilityRetryScheduleMs =\n options.capabilityRetryScheduleMs ?? DEFAULT_CAPABILITY_RETRY_SCHEDULE_MS;\n this.#actionBridge = new A2UIClientActionBridge({\n publish: async (text) =>\n this.#room.localParticipant.sendText(text, {\n topic: A2UI_CLIENT_TOPIC,\n }),\n canPublish: () =>\n !this.#closed && this.status === \"connected\" && !this.restoring,\n getSurfaceMetadata: () => this.surfaceMetadata,\n reportClientError: (errorCode, surfaceId, detail) =>\n this.#adapter.reportClientError(errorCode, surfaceId, detail),\n onStateChange: (actions) => this.#handleActionStateChange(actions),\n participantRole: this.#participantRole,\n ackTimeoutMs: options.actionAckTimeoutMs,\n });\n }\n\n get status(): A2UISessionStatus {\n return this.#sessionSnapshot.status;\n }\n\n get restoring(): boolean {\n return this.#sessionSnapshot.restoring;\n }\n\n get surfaceMetadata(): A2UISurfaceMetadata | null {\n return this.#sessionSnapshot.surface;\n }\n\n get actionState(): A2UIActionState {\n return this.#sessionSnapshot.actions;\n }\n\n /** Retry one or every delivery-failed/timed-out request with its original id. */\n retryPendingAction(requestId?: string): boolean {\n return this.#actionBridge.retryPendingAction(requestId);\n }\n\n /** Select the authoritative server-owned section without choosing workflow state. */\n returnToCurrentSection(): boolean {\n const authoritative = this.#sessionSnapshot.editing.authoritativeSectionId;\n if (authoritative === null) {\n return false;\n }\n return this.viewSection(authoritative);\n }\n\n /** View one exact server-issued active/completed section locally. */\n viewSection(sectionId: string): boolean {\n const navigation = this.surfaceMetadata?.sectionNavigation;\n if (\n navigation === null ||\n navigation === undefined ||\n sectionId === this.#sessionSnapshot.editing.viewedSectionId ||\n (sectionId !== navigation.activeSectionId &&\n !navigation.completedSectionIds.includes(sectionId))\n ) {\n return false;\n }\n this.#replaceSnapshot({\n editing: {\n ...this.#sessionSnapshot.editing,\n viewedSectionId: sectionId,\n },\n });\n return true;\n }\n\n /** Capture a renderer-owned group after a real user input/change event. */\n captureFieldGroupDraft(groupId: string): boolean {\n const surface = this.surfaceMetadata;\n const group = surface?.fieldInteractions.find(\n (candidate) => candidate.groupId === groupId,\n );\n if (\n surface === null ||\n group === undefined ||\n this.#pendingGroupIds(this.actionState).has(groupId)\n ) {\n return false;\n }\n const fields = group.fields.map((binding) => binding.field);\n const values = this.#adapter.getFieldValues(surface.surfaceId, fields);\n const authoritative = this.#authoritativeByGroup.get(groupId);\n if (values === null || authoritative === undefined) {\n return false;\n }\n if (fieldValuesEqual(values, authoritative, fields)) {\n this.#draftsByGroup.delete(groupId);\n this.#rejectedGroupIds.delete(groupId);\n } else {\n this.#draftsByGroup.set(groupId, {\n surfaceId: surface.surfaceId,\n fields,\n baseValues: { ...authoritative },\n values: { ...values },\n });\n this.#rejectedGroupIds.delete(groupId);\n }\n this.#replaceSnapshot({ editing: this.#editingSnapshot() });\n return true;\n }\n\n /** Commit one complete owning group against the latest surface revision. */\n commitFieldGroup(groupId: string): boolean {\n if (this.status !== \"connected\" || this.restoring) {\n return false;\n }\n this.captureFieldGroupDraft(groupId);\n const surface = this.surfaceMetadata;\n const group = surface?.fieldInteractions.find(\n (candidate) => candidate.groupId === groupId,\n );\n const draft = this.#draftsByGroup.get(groupId);\n const authoritative = this.#authoritativeByGroup.get(groupId);\n if (\n surface === null ||\n group === undefined ||\n draft === undefined ||\n authoritative === undefined ||\n this.#pendingGroupIds(this.actionState).has(groupId) ||\n fieldValuesEqual(draft.values, authoritative, draft.fields) ||\n !this.#groupIsComplete(surface, group, draft.values)\n ) {\n return false;\n }\n return this.#actionBridge.handleFieldGroupCommit(group, draft.values);\n }\n\n getSnapshot = (): A2UISessionSnapshot => this.#sessionSnapshot;\n\n subscribe = (listener: () => void): (() => void) => {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n };\n\n /** Register the server stream before announcing exact renderer capability. */\n async start(): Promise<void> {\n if (this.#closed || this.status === \"closed\") {\n return;\n }\n if (this.#startPromise === undefined) {\n this.#startPromise = this.#startInternal();\n }\n await this.#startPromise;\n }\n\n /**\n * Detach only A2UI handlers/listeners. The shared room remains caller-owned.\n */\n stop(): void {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.#capabilityGeneration += 1;\n this.#pendingSnapshotRequestId = undefined;\n this.#clearCapabilityRetryTimers();\n this.#restoreResetsSequence = false;\n this.#actionBridge.stop();\n this.#detach();\n this.#adapter.clearSurfaces();\n this.#revisionBaseline = undefined;\n this.#clearDrafts();\n this.#replaceSnapshot({\n status: \"closed\",\n restoring: false,\n surface: null,\n actions: { pendingRequests: [], lastResult: null },\n editing: emptyEditingSnapshot(),\n });\n this.#listeners.clear();\n }\n\n async #startInternal(): Promise<void> {\n this.#replaceSnapshot({ status: \"connecting\" });\n try {\n this.#unsubscribeActions = this.#adapter.subscribeActions(\n this.#handleRendererAction,\n );\n this.#unsubscribeClientErrors = this.#adapter.subscribeClientErrors(\n this.#handleClientError,\n );\n this.#room.registerTextStreamHandler(\n A2UI_SERVER_TOPIC,\n this.#handleTextStream,\n );\n this.#handlerRegistered = true;\n this.#listenersRegistered = true;\n this.#room.on(\"reconnected\", this.#handleReconnected);\n this.#room.on(\"disconnected\", this.#handleDisconnected);\n } catch {\n this.#closeAfterStartupFailure();\n return;\n }\n\n const requestId = await this.#announceCapabilities();\n if (requestId === undefined) {\n this.#closeAfterStartupFailure();\n return;\n }\n if (!this.#closed) {\n this.#replaceSnapshot({ status: \"connected\" });\n }\n }\n\n #closeAfterStartupFailure(): void {\n this.#closed = true;\n this.#pendingSnapshotRequestId = undefined;\n this.#clearCapabilityRetryTimers();\n this.#actionBridge.stop();\n this.#detach();\n this.#adapter.clearSurfaces();\n this.#revisionBaseline = undefined;\n this.#clearDrafts();\n this.#replaceSnapshot({\n status: \"closed\",\n restoring: false,\n surface: null,\n actions: { pendingRequests: [], lastResult: null },\n editing: emptyEditingSnapshot(),\n });\n }\n\n #detach(): void {\n this.#clearCapabilityRetryTimers();\n this.#unsubscribeActions?.();\n this.#unsubscribeActions = undefined;\n this.#unsubscribeClientErrors?.();\n this.#unsubscribeClientErrors = undefined;\n if (this.#handlerRegistered) {\n try {\n this.#room.unregisterTextStreamHandler(A2UI_SERVER_TOPIC);\n } catch {\n // Cleanup remains best-effort and body-free.\n }\n this.#handlerRegistered = false;\n }\n if (this.#listenersRegistered) {\n try {\n this.#room.off(\"reconnected\", this.#handleReconnected);\n } catch {\n // Cleanup remains best-effort and body-free.\n }\n try {\n this.#room.off(\"disconnected\", this.#handleDisconnected);\n } catch {\n // Cleanup remains best-effort and body-free.\n }\n this.#listenersRegistered = false;\n }\n }\n\n #handleTextStream: A2UITextStreamHandler = (reader, participant) => {\n if (this.#closed || !this.#handlerRegistered) {\n return;\n }\n let trusted = false;\n try {\n trusted =\n isNonEmptyString(participant?.identity) &&\n this.#isTrustedServerParticipant(participant);\n } catch {\n trusted = false;\n }\n if (!trusted) {\n return;\n }\n\n this.#deliveryQueue = this.#deliveryQueue\n .then(async () => this.#readAndProcess(reader))\n .catch(() => {\n this.#reportInboundError(\"message_malformed\", \"delivery_failed\");\n });\n };\n\n #handleRendererAction = (event: A2UIRendererActionEvent): void => {\n this.#actionBridge.handleRendererAction(event);\n };\n\n #handleClientError = (event: A2UIClientErrorEvent): void => {\n this.#actionBridge.handleClientError(event);\n };\n\n async #readAndProcess(reader: A2UITextStreamReaderLike): Promise<void> {\n if (this.#closed) {\n return;\n }\n if (\n typeof reader.info?.size === \"number\" &&\n reader.info.size > MAX_ENVELOPE_BYTES\n ) {\n this.#reportInboundError(\"message_malformed\", \"envelope_too_large\");\n return;\n }\n\n let text: string;\n try {\n text = await reader.readAll();\n } catch {\n this.#reportInboundError(\"message_malformed\", \"stream_read_failed\");\n return;\n }\n if (this.#closed || typeof text !== \"string\") {\n return;\n }\n if (new TextEncoder().encode(text).byteLength > MAX_ENVELOPE_BYTES) {\n this.#reportInboundError(\"message_malformed\", \"envelope_too_large\");\n return;\n }\n\n const decoded = decodeServerEnvelope(text);\n if (!decoded.ok) {\n this.#reportInboundError(decoded.errorCode, decoded.detail);\n return;\n }\n await this.#processEnvelope(decoded.envelope);\n }\n\n async #processEnvelope(envelope: A2UIServerEnvelope): Promise<void> {\n if (this.#closed) {\n return;\n }\n\n const correlated =\n this.#pendingSnapshotRequestId !== undefined &&\n \"inResponseTo\" in envelope &&\n envelope.inResponseTo === this.#pendingSnapshotRequestId;\n\n if (correlated && envelope.kind === \"snapshot\") {\n await this.#applyAuthoritativeSnapshot(envelope);\n return;\n }\n if (correlated && envelope.kind === \"ack\") {\n if (await this.#handleCapabilityAck(envelope)) {\n return;\n }\n }\n\n if (this.status === \"unsupported\") {\n return;\n }\n\n if (this.restoring && envelope.kind !== \"ack\") {\n // Ordinary surface traffic cannot cross the restore barrier.\n if (this.#pendingSnapshotRequestId === undefined) {\n await this.#announceCapabilities();\n }\n return;\n }\n if (envelope.seq <= this.#adapter.lastSeq) {\n return;\n }\n if (envelope.kind === \"ack\") {\n if (this.#adapter.applyServerEnvelope(envelope) && !this.restoring) {\n this.#actionBridge.handleAck(envelope);\n }\n return;\n }\n if (envelope.kind === \"snapshot\") {\n await this.#applyAuthoritativeSnapshot(envelope);\n return;\n }\n\n await this.#applyContiguousUpdate(envelope);\n }\n\n async #applyContiguousUpdate(\n envelope: SurfaceUpdateEnvelope,\n ): Promise<void> {\n const baseline = this.#revisionBaseline;\n if (baseline !== undefined) {\n if (baseline.surfaceId !== envelope.surfaceId) {\n await this.#enterRestoreBarrier();\n return;\n }\n if (envelope.revision <= baseline.revision) {\n return;\n }\n if (envelope.revision !== baseline.revision + 1) {\n await this.#enterRestoreBarrier();\n return;\n }\n }\n\n if (!this.#adapter.applyServerEnvelope(envelope)) {\n await this.#enterRestoreBarrier();\n return;\n }\n this.#revisionBaseline = {\n surfaceId: envelope.surfaceId,\n revision: envelope.revision,\n };\n const surface = this.#metadataAfterApply(envelope);\n this.#reconcileDrafts(envelope, surface);\n this.#replaceSnapshot({\n surface,\n editing: this.#editingSnapshot(surface),\n });\n }\n\n async #applyAuthoritativeSnapshot(\n envelope: SnapshotEnvelope,\n ): Promise<void> {\n const correlated =\n this.#pendingSnapshotRequestId !== undefined &&\n envelope.inResponseTo === this.#pendingSnapshotRequestId;\n if (this.restoring && !correlated) {\n return;\n }\n\n if (correlated && this.#restoreResetsSequence) {\n this.#adapter.resetSequence();\n this.#restoreResetsSequence = false;\n } else if (envelope.seq <= this.#adapter.lastSeq) {\n return;\n }\n\n if (!this.#adapter.applyServerEnvelope(envelope)) {\n if (correlated) {\n this.#pendingSnapshotRequestId = undefined;\n }\n await this.#enterRestoreBarrier();\n return;\n }\n\n this.#revisionBaseline = {\n surfaceId: envelope.surfaceId,\n revision: envelope.revision,\n };\n this.#clearCapabilityRetryTimers();\n if (correlated) {\n this.#pendingSnapshotRequestId = undefined;\n }\n const surface = this.#metadataAfterApply(envelope);\n this.#reconcileDrafts(envelope, surface);\n this.#replaceSnapshot({\n status: \"connected\",\n restoring: false,\n surface,\n editing: this.#editingSnapshot(surface),\n });\n this.#actionBridge.retryAfterRestore();\n }\n\n async #handleCapabilityAck(envelope: AckEnvelope): Promise<boolean> {\n if (\n envelope.status === \"rejected\" &&\n (envelope.reasonCode === \"a2ui_version_unsupported\" ||\n envelope.reasonCode === \"catalog_unsupported\")\n ) {\n if (this.#restoreResetsSequence) {\n this.#adapter.resetSequence();\n this.#restoreResetsSequence = false;\n }\n this.#adapter.applyServerEnvelope(envelope);\n this.#adapter.clearSurfaces();\n this.#actionBridge.discardPending();\n this.#pendingSnapshotRequestId = undefined;\n this.#clearCapabilityRetryTimers();\n this.#revisionBaseline = undefined;\n this.#clearDrafts();\n this.#replaceSnapshot({\n status: \"unsupported\",\n restoring: false,\n surface: null,\n });\n return true;\n }\n\n if (envelope.status === \"accepted\" && envelope.noSurface === true) {\n if (this.#restoreResetsSequence) {\n this.#adapter.resetSequence();\n this.#restoreResetsSequence = false;\n }\n this.#adapter.applyServerEnvelope(envelope);\n this.#adapter.clearSurfaces();\n this.#pendingSnapshotRequestId = undefined;\n this.#clearCapabilityRetryTimers();\n this.#revisionBaseline = undefined;\n this.#clearDrafts();\n this.#replaceSnapshot({\n status: \"connected\",\n restoring: false,\n surface: null,\n });\n this.#actionBridge.retryAfterRestore();\n return true;\n }\n\n return false;\n }\n\n async #enterRestoreBarrier(): Promise<void> {\n if (this.#closed) {\n return;\n }\n if (!this.restoring) {\n this.#actionBridge.markReconnect();\n this.#replaceSnapshot({ restoring: true });\n }\n if (this.#pendingSnapshotRequestId === undefined) {\n await this.#announceCapabilities();\n }\n }\n\n #metadataAfterApply(\n envelope: SurfaceUpdateEnvelope | SnapshotEnvelope,\n ): A2UISurfaceMetadata | null {\n if (this.#adapter.getSurface(envelope.surfaceId) === undefined) {\n return null;\n }\n return {\n surfaceId: envelope.surfaceId,\n activeStateId: envelope.activeStateId ?? null,\n revision: envelope.revision,\n sectionNavigation: cloneSectionNavigation(\n envelope.sectionNavigation ?? null,\n ),\n fieldInteractions: cloneFieldInteractions(\n envelope.fieldInteractions ?? [],\n ),\n };\n }\n\n #handleActionStateChange(actions: A2UIActionState): void {\n const result = actions.lastResult;\n let acceptedGroup = false;\n let rejectedGroupId: string | undefined;\n if (\n result?.groupId !== undefined &&\n result.requestId !== this.#handledActionResultRequestId\n ) {\n this.#handledActionResultRequestId = result.requestId;\n if (result.status === \"accepted\") {\n acceptedGroup = true;\n const acceptedDraft = this.#draftsByGroup.get(result.groupId);\n if (acceptedDraft !== undefined) {\n this.#authoritativeByGroup.set(result.groupId, {\n ...acceptedDraft.values,\n });\n }\n this.#draftsByGroup.delete(result.groupId);\n this.#rejectedGroupIds.delete(result.groupId);\n } else if (this.#draftsByGroup.has(result.groupId)) {\n this.#rejectedGroupIds.add(result.groupId);\n rejectedGroupId = result.groupId;\n }\n }\n let editing = this.#editingSnapshot(undefined, actions);\n if (rejectedGroupId !== undefined) {\n const rejectedSection = this.surfaceMetadata?.fieldInteractions.find(\n (group) => group.groupId === rejectedGroupId,\n )?.sectionId;\n if (rejectedSection !== undefined) {\n editing = { ...editing, viewedSectionId: rejectedSection };\n }\n }\n if (\n acceptedGroup &&\n editing.dirtyGroupIds.length === 0 &&\n editing.pendingGroupIds.length === 0 &&\n editing.rejectedGroupIds.length === 0\n ) {\n editing = {\n ...editing,\n viewedSectionId: editing.authoritativeSectionId,\n };\n }\n this.#replaceSnapshot({\n actions,\n editing,\n });\n }\n\n #pendingGroupIds(actions: A2UIActionState): Set<string> {\n return new Set(\n actions.pendingRequests.flatMap((pending) =>\n pending.groupId === undefined ? [] : [pending.groupId],\n ),\n );\n }\n\n #editingSnapshot(\n surface: A2UISurfaceMetadata | null | undefined = undefined,\n actions: A2UIActionState = this.#sessionSnapshot.actions,\n ): A2UIEditingSnapshot {\n const resolvedSurface =\n surface === undefined ? this.#sessionSnapshot.surface : surface;\n if (resolvedSurface === null) {\n return emptyEditingSnapshot();\n }\n const pending = this.#pendingGroupIds(actions);\n const order = resolvedSurface.fieldInteractions.map(\n (group) => group.groupId,\n );\n const ordered = (ids: Iterable<string>): string[] => {\n const values = new Set(ids);\n return [\n ...order.filter((groupId) => values.delete(groupId)),\n ...[...values].sort(),\n ];\n };\n const rejected = new Set(\n [...this.#rejectedGroupIds].filter((groupId) =>\n this.#draftsByGroup.has(groupId),\n ),\n );\n const dirty = [...this.#draftsByGroup.keys()].filter(\n (groupId) => !pending.has(groupId) && !rejected.has(groupId),\n );\n const authoritative =\n resolvedSurface.sectionNavigation?.activeSectionId ?? null;\n const authoritativeChanged =\n authoritative !== this.#sessionSnapshot.editing.authoritativeSectionId;\n const viewed = this.#sessionSnapshot.editing.viewedSectionId;\n const viewedStillAvailable =\n viewed !== null &&\n (viewed === authoritative ||\n (resolvedSurface.sectionNavigation?.completedSectionIds.includes(\n viewed,\n ) ?? false));\n const preserveView =\n dirty.length > 0 || pending.size > 0 || rejected.size > 0;\n return {\n authoritativeSectionId: authoritative,\n viewedSectionId:\n preserveView || (!authoritativeChanged && viewedStillAvailable)\n ? (viewed ?? authoritative)\n : authoritative,\n dirtyGroupIds: ordered(dirty),\n pendingGroupIds: ordered(pending),\n rejectedGroupIds: ordered(rejected),\n };\n }\n\n #groupIsComplete(\n surface: A2UISurfaceMetadata,\n group: A2UIFieldInteractionGroup,\n values: Readonly<Record<string, A2UIFieldValue>>,\n ): boolean {\n const descriptors = new Map(\n this.#adapter\n .getSurfaceStructure(surface.surfaceId)\n .fields.map((field) => [field.componentId, field]),\n );\n return group.fields.every((binding) => {\n const descriptor = descriptors.get(binding.componentId);\n const value = values[binding.field];\n return (\n descriptor?.field === binding.field &&\n isFieldValue(value) &&\n (!descriptor.required || !isIncompleteRequiredValue(value))\n );\n });\n }\n\n #reconcileDrafts(\n envelope: SurfaceUpdateEnvelope | SnapshotEnvelope,\n surface: A2UISurfaceMetadata | null,\n ): void {\n if (surface === null) {\n this.#clearDrafts();\n return;\n }\n const incoming = envelopeRootFieldValues(envelope);\n const presentGroups = new Set(\n surface.fieldInteractions.map((group) => group.groupId),\n );\n const pending = this.#pendingGroupIds(this.actionState);\n for (const group of surface.fieldInteractions) {\n const fields = group.fields.map((binding) => binding.field);\n const incomingValues = selectFieldValues(incoming, fields);\n const authoritative =\n incomingValues ??\n this.#authoritativeByGroup.get(group.groupId) ??\n this.#adapter.getFieldValues(surface.surfaceId, fields);\n if (authoritative !== null && authoritative !== undefined) {\n this.#authoritativeByGroup.set(group.groupId, {\n ...authoritative,\n });\n }\n\n const draft = this.#draftsByGroup.get(group.groupId);\n if (draft === undefined) {\n continue;\n }\n if (\n draft.surfaceId !== surface.surfaceId ||\n !arraysEqual(draft.fields, fields)\n ) {\n this.#draftsByGroup.delete(group.groupId);\n this.#rejectedGroupIds.delete(group.groupId);\n continue;\n }\n if (\n authoritative !== null &&\n authoritative !== undefined &&\n fieldValuesEqual(draft.values, authoritative, fields) &&\n !pending.has(group.groupId)\n ) {\n this.#draftsByGroup.delete(group.groupId);\n this.#rejectedGroupIds.delete(group.groupId);\n continue;\n }\n if (\n authoritative !== null &&\n authoritative !== undefined &&\n !pending.has(group.groupId) &&\n !fieldValuesEqual(draft.baseValues, authoritative, fields)\n ) {\n this.#draftsByGroup.delete(group.groupId);\n this.#rejectedGroupIds.delete(group.groupId);\n continue;\n }\n this.#adapter.applyFieldValues(surface.surfaceId, draft.values);\n }\n\n for (const groupId of [...this.#authoritativeByGroup.keys()]) {\n if (!presentGroups.has(groupId)) {\n this.#authoritativeByGroup.delete(groupId);\n }\n }\n for (const groupId of [...this.#draftsByGroup.keys()]) {\n if (!presentGroups.has(groupId) && !pending.has(groupId)) {\n this.#draftsByGroup.delete(groupId);\n this.#rejectedGroupIds.delete(groupId);\n }\n }\n }\n\n #clearDrafts(): void {\n this.#draftsByGroup.clear();\n this.#authoritativeByGroup.clear();\n this.#rejectedGroupIds.clear();\n this.#handledActionResultRequestId = undefined;\n }\n\n #handleReconnected = (): void => {\n if (this.#closed) {\n return;\n }\n void this.#beginReconnectRestore();\n };\n\n async #beginReconnectRestore(): Promise<void> {\n if (this.#closed) {\n return;\n }\n if (\n this.#restoreResetsSequence &&\n this.restoring &&\n this.#pendingSnapshotRequestId !== undefined\n ) {\n return;\n }\n this.#pendingSnapshotRequestId = undefined;\n this.#restoreResetsSequence = true;\n this.#actionBridge.markReconnect();\n this.#replaceSnapshot({ restoring: true });\n await this.#announceCapabilities();\n }\n\n #handleDisconnected = (): void => {\n this.stop();\n };\n\n async #announceCapabilities(): Promise<string | undefined> {\n if (this.#closed) {\n return undefined;\n }\n let requestId: string;\n try {\n requestId = createCapabilityRequestId();\n } catch {\n return undefined;\n }\n const envelope: A2UICapabilityEnvelope = {\n envelopeVersion: ENVELOPE_VERSION,\n kind: \"capabilities\",\n requestId,\n role: this.#participantRole,\n supportedA2uiVersions: [A2UI_PROTOCOL_VERSION],\n supportedCatalogIds: this.#adapter.supportedCatalogIds,\n renderer: {\n name: this.#adapter.rendererName,\n version: this.#adapter.rendererVersion,\n },\n requestSnapshot: true,\n };\n this.#pendingSnapshotRequestId = requestId;\n const generation = ++this.#capabilityGeneration;\n try {\n const encoded = JSON.stringify(envelope);\n await this.#room.localParticipant.sendText(encoded, {\n topic: A2UI_CAPABILITIES_TOPIC,\n });\n this.#scheduleCapabilityRetries(encoded, requestId, generation);\n } catch {\n if (this.#pendingSnapshotRequestId === requestId) {\n this.#pendingSnapshotRequestId = undefined;\n }\n return undefined;\n }\n return requestId;\n }\n\n #scheduleCapabilityRetries(\n encoded: string,\n requestId: string,\n generation: number,\n ): void {\n this.#clearCapabilityRetryTimers();\n for (const retryAfterMs of this.#capabilityRetryScheduleMs) {\n const timer = globalThis.setTimeout(() => {\n if (\n this.#closed ||\n generation !== this.#capabilityGeneration ||\n this.#pendingSnapshotRequestId !== requestId ||\n !this.#handlerRegistered\n ) {\n return;\n }\n void this.#room.localParticipant\n .sendText(encoded, { topic: A2UI_CAPABILITIES_TOPIC })\n .catch(() => undefined);\n }, retryAfterMs);\n this.#capabilityRetryTimers.push(timer);\n }\n }\n\n #clearCapabilityRetryTimers(): void {\n for (const timer of this.#capabilityRetryTimers) {\n globalThis.clearTimeout(timer);\n }\n this.#capabilityRetryTimers = [];\n }\n\n #reportInboundError(errorCode: ClientErrorCode, detail: string): void {\n if (!this.#closed) {\n this.#adapter.reportClientError(errorCode, undefined, detail);\n }\n }\n\n #replaceSnapshot(\n patch: Partial<\n Pick<\n A2UISessionSnapshot,\n \"status\" | \"restoring\" | \"surface\" | \"actions\" | \"editing\"\n >\n >,\n ): void {\n const nextSurface =\n patch.surface === undefined ? this.#sessionSnapshot.surface : patch.surface;\n const nextEditing =\n patch.editing ??\n editingAfterSurface(this.#sessionSnapshot.editing, patch.surface);\n this.#sessionSnapshot = {\n status: patch.status ?? this.#sessionSnapshot.status,\n restoring: patch.restoring ?? this.#sessionSnapshot.restoring,\n surface:\n patch.surface === undefined\n ? this.#sessionSnapshot.surface\n : patch.surface,\n actions: patch.actions ?? this.#sessionSnapshot.actions,\n editing: nextSurface === null ? emptyEditingSnapshot() : nextEditing,\n };\n for (const listener of this.#listeners) {\n listener();\n }\n }\n}\n\nfunction createCapabilityRequestId(): string {\n return `cap-${globalThis.crypto.randomUUID()}`;\n}\n\nfunction cloneSectionNavigation(\n navigation: SectionNavigation | null,\n): SectionNavigation | null {\n if (navigation === null) {\n return null;\n }\n return {\n orderedSectionIds: [...navigation.orderedSectionIds],\n activeSectionId: navigation.activeSectionId,\n completedSectionIds: [...navigation.completedSectionIds],\n futureSectionIds: [...navigation.futureSectionIds],\n };\n}\n\nfunction cloneFieldInteractions(\n groups: readonly A2UIFieldInteractionGroup[],\n): A2UIFieldInteractionGroup[] {\n return groups.map((group) => ({\n groupId: group.groupId,\n ownerStateId: group.ownerStateId,\n ...(group.sectionId === undefined ? {} : { sectionId: group.sectionId }),\n mode: group.mode,\n fields: group.fields.map((field) => ({ ...field })),\n }));\n}\n\nfunction emptyEditingSnapshot(): A2UIEditingSnapshot {\n return {\n authoritativeSectionId: null,\n viewedSectionId: null,\n dirtyGroupIds: [],\n pendingGroupIds: [],\n rejectedGroupIds: [],\n };\n}\n\nfunction editingAfterSurface(\n editing: A2UIEditingSnapshot,\n surface: A2UISurfaceMetadata | null | undefined,\n): A2UIEditingSnapshot {\n if (surface === undefined) {\n return editing;\n }\n if (surface === null) {\n return emptyEditingSnapshot();\n }\n const authoritative = surface.sectionNavigation?.activeSectionId ?? null;\n const viewedStillAvailable =\n editing.viewedSectionId !== null &&\n (editing.viewedSectionId === authoritative ||\n (surface.sectionNavigation?.completedSectionIds.includes(\n editing.viewedSectionId,\n ) ?? false));\n const preserveView =\n editing.dirtyGroupIds.length > 0 ||\n editing.pendingGroupIds.length > 0 ||\n editing.rejectedGroupIds.length > 0 ||\n (editing.authoritativeSectionId === authoritative && viewedStillAvailable);\n return {\n ...editing,\n authoritativeSectionId: authoritative,\n viewedSectionId: preserveView\n ? editing.viewedSectionId\n : authoritative,\n };\n}\n\ntype DecodeResult =\n | { ok: true; envelope: A2UIServerEnvelope }\n | { ok: false; errorCode: ClientErrorCode; detail: string };\n\nexport function decodeServerEnvelope(text: string): DecodeResult {\n let value: unknown;\n try {\n value = JSON.parse(text) as unknown;\n } catch {\n return invalid(\"message_malformed\", \"json_invalid\");\n }\n if (!isRecord(value)) {\n return invalid(\"message_malformed\", \"envelope_invalid\");\n }\n if (value.envelopeVersion !== ENVELOPE_VERSION) {\n return invalid(\"envelope_unsupported\", \"envelope_version_unsupported\");\n }\n if (\n value.a2uiVersion !== A2UI_PROTOCOL_VERSION ||\n !isPositiveInteger(value.seq)\n ) {\n return invalid(\"envelope_unsupported\", \"protocol_unsupported\");\n }\n if (value.kind === \"surfaceUpdate\" || value.kind === \"snapshot\") {\n return decodeSurfaceEnvelope(value, value.kind);\n }\n if (value.kind === \"ack\") {\n return decodeAckEnvelope(value);\n }\n return invalid(\"envelope_unsupported\", \"kind_unsupported\");\n}\n\nfunction decodeSurfaceEnvelope(\n value: Record<string, unknown>,\n kind: \"surfaceUpdate\" | \"snapshot\",\n): DecodeResult {\n const allowed = [\n \"envelopeVersion\",\n \"a2uiVersion\",\n \"kind\",\n \"seq\",\n \"surfaceId\",\n \"revision\",\n \"activeStateId\",\n \"sectionNavigation\",\n \"fieldInteractions\",\n \"messages\",\n ...(kind === \"snapshot\" ? [\"inResponseTo\"] : []),\n ];\n const required = [\n \"envelopeVersion\",\n \"a2uiVersion\",\n \"kind\",\n \"seq\",\n \"surfaceId\",\n \"revision\",\n \"messages\",\n ];\n if (!hasExactKeys(value, allowed, required)) {\n return invalid(\"envelope_unsupported\", \"envelope_properties_invalid\");\n }\n if (\n !isNonEmptyString(value.surfaceId) ||\n !isPositiveInteger(value.revision) ||\n (\"activeStateId\" in value &&\n value.activeStateId !== null &&\n !isNonEmptyString(value.activeStateId)) ||\n (\"inResponseTo\" in value && !isNonEmptyString(value.inResponseTo)) ||\n (\"sectionNavigation\" in value &&\n !isSectionNavigation(value.sectionNavigation)) ||\n (\"fieldInteractions\" in value &&\n !isFieldInteractions(\n value.fieldInteractions,\n value.activeStateId,\n value.sectionNavigation,\n ))\n ) {\n return invalid(\"message_malformed\", \"surface_metadata_invalid\");\n }\n const parsedMessages = A2uiMessageListSchema.safeParse(value.messages);\n if (!parsedMessages.success || parsedMessages.data.length === 0) {\n return invalid(\"message_malformed\", \"messages_invalid\");\n }\n if (\n parsedMessages.data.some((message) => {\n const lifecycle = [\n \"createSurface\",\n \"updateComponents\",\n \"updateDataModel\",\n \"deleteSurface\",\n ].find((key) => key in message);\n if (lifecycle === undefined) {\n return true;\n }\n const body = message[lifecycle as keyof typeof message] as {\n surfaceId?: unknown;\n };\n return body.surfaceId !== value.surfaceId;\n })\n ) {\n return invalid(\"message_malformed\", \"message_surface_mismatch\");\n }\n return {\n ok: true,\n envelope: value as unknown as A2UIServerEnvelope,\n };\n}\n\nconst SERVER_REASON_CODES = new Set([\n \"envelope_version_unsupported\",\n \"a2ui_version_unsupported\",\n \"catalog_unsupported\",\n \"role_unauthorized\",\n \"surface_unknown\",\n \"state_mismatch\",\n \"revision_stale\",\n \"request_duplicate\",\n \"action_disallowed\",\n \"field_unknown\",\n \"value_invalid\",\n \"payload_malformed\",\n \"envelope_too_large\",\n]);\n\nfunction decodeAckEnvelope(value: Record<string, unknown>): DecodeResult {\n const allowed = [\n \"envelopeVersion\",\n \"a2uiVersion\",\n \"kind\",\n \"seq\",\n \"inResponseTo\",\n \"status\",\n \"reasonCode\",\n \"fieldErrors\",\n \"noSurface\",\n ];\n const required = [\n \"envelopeVersion\",\n \"a2uiVersion\",\n \"kind\",\n \"seq\",\n \"inResponseTo\",\n \"status\",\n ];\n if (!hasExactKeys(value, allowed, required)) {\n return invalid(\"envelope_unsupported\", \"envelope_properties_invalid\");\n }\n if (\n !isNonEmptyString(value.inResponseTo) ||\n (value.status !== \"accepted\" && value.status !== \"rejected\") ||\n (value.status === \"accepted\" && \"reasonCode\" in value) ||\n (value.status === \"rejected\" &&\n (!isNonEmptyString(value.reasonCode) ||\n !SERVER_REASON_CODES.has(value.reasonCode))) ||\n (\"noSurface\" in value && typeof value.noSurface !== \"boolean\") ||\n (\"fieldErrors\" in value && !isFieldErrors(value.fieldErrors))\n ) {\n return invalid(\"message_malformed\", \"ack_invalid\");\n }\n return {\n ok: true,\n envelope: value as unknown as A2UIServerEnvelope,\n };\n}\n\nfunction isFieldErrors(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.every(\n (entry) =>\n isRecord(entry) &&\n hasExactKeys(entry, [\"field\", \"reasonCode\"], [\"field\", \"reasonCode\"]) &&\n isNonEmptyString(entry.field) &&\n isNonEmptyString(entry.reasonCode) &&\n SERVER_REASON_CODES.has(entry.reasonCode),\n )\n );\n}\n\nfunction isSectionNavigation(value: unknown): value is SectionNavigation {\n if (\n !isRecord(value) ||\n !hasExactKeys(\n value,\n [\n \"orderedSectionIds\",\n \"activeSectionId\",\n \"completedSectionIds\",\n \"futureSectionIds\",\n ],\n [\n \"orderedSectionIds\",\n \"activeSectionId\",\n \"completedSectionIds\",\n \"futureSectionIds\",\n ],\n ) ||\n !isNonEmptyStringArray(value.orderedSectionIds) ||\n value.orderedSectionIds.length === 0 ||\n new Set(value.orderedSectionIds).size !== value.orderedSectionIds.length ||\n (value.activeSectionId !== null &&\n !isNonEmptyString(value.activeSectionId)) ||\n !isNonEmptyStringArray(value.completedSectionIds) ||\n !isNonEmptyStringArray(value.futureSectionIds) ||\n new Set(value.completedSectionIds).size !==\n value.completedSectionIds.length ||\n new Set(value.futureSectionIds).size !== value.futureSectionIds.length\n ) {\n return false;\n }\n const orderedSectionIds = value.orderedSectionIds as string[];\n const completedSectionIds = value.completedSectionIds as string[];\n const futureSectionIds = value.futureSectionIds as string[];\n const activeSectionId = value.activeSectionId as string | null;\n const classified = [\n ...completedSectionIds,\n ...futureSectionIds,\n ...(activeSectionId === null ? [] : [activeSectionId]),\n ];\n return (\n new Set(classified).size === classified.length &&\n classified.length === orderedSectionIds.length &&\n classified.every((sectionId) =>\n orderedSectionIds.includes(sectionId),\n ) &&\n arraysEqual(\n completedSectionIds,\n orderedSectionIds.filter((sectionId) =>\n completedSectionIds.includes(sectionId),\n ),\n ) &&\n arraysEqual(\n futureSectionIds,\n orderedSectionIds.filter((sectionId) =>\n futureSectionIds.includes(sectionId),\n ),\n )\n );\n}\n\nfunction isFieldInteractions(\n value: unknown,\n activeStateId: unknown,\n navigationValue: unknown,\n): value is A2UIFieldInteractionGroup[] {\n if (!Array.isArray(value) || value.length === 0) {\n return false;\n }\n const navigation = isSectionNavigation(navigationValue)\n ? navigationValue\n : null;\n const groupIds = new Set<string>();\n const fields = new Set<string>();\n const componentIds = new Set<string>();\n let currentCount = 0;\n for (const group of value) {\n if (\n !isRecord(group) ||\n !hasExactKeys(\n group,\n [\"groupId\", \"ownerStateId\", \"sectionId\", \"mode\", \"fields\"],\n [\"groupId\", \"ownerStateId\", \"mode\", \"fields\"],\n ) ||\n !isNonEmptyString(group.groupId) ||\n !isNonEmptyString(group.ownerStateId) ||\n (group.mode !== \"current\" && group.mode !== \"revision\") ||\n !Array.isArray(group.fields) ||\n group.fields.length === 0 ||\n groupIds.has(group.groupId)\n ) {\n return false;\n }\n groupIds.add(group.groupId);\n if (group.mode === \"current\") {\n currentCount += 1;\n if (group.ownerStateId !== activeStateId) {\n return false;\n }\n } else if (group.ownerStateId === activeStateId) {\n return false;\n }\n if (\"sectionId\" in group) {\n if (\n !isNonEmptyString(group.sectionId) ||\n navigation === null ||\n !navigation.orderedSectionIds.includes(group.sectionId) ||\n (group.mode === \"current\" &&\n group.sectionId !== navigation.activeSectionId) ||\n (group.mode === \"revision\" &&\n group.sectionId !== navigation.activeSectionId &&\n !navigation.completedSectionIds.includes(group.sectionId))\n ) {\n return false;\n }\n }\n for (const binding of group.fields) {\n if (\n !isRecord(binding) ||\n !hasExactKeys(\n binding,\n [\"field\", \"componentId\"],\n [\"field\", \"componentId\"],\n ) ||\n !isNonEmptyString(binding.field) ||\n !isNonEmptyString(binding.componentId) ||\n fields.has(binding.field) ||\n componentIds.has(binding.componentId)\n ) {\n return false;\n }\n fields.add(binding.field);\n componentIds.add(binding.componentId);\n }\n }\n return currentCount <= 1;\n}\n\nfunction isNonEmptyStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(isNonEmptyString);\n}\n\nfunction arraysEqual(left: readonly string[], right: readonly string[]): boolean {\n return (\n left.length === right.length &&\n left.every((value, index) => value === right[index])\n );\n}\n\nfunction fieldValuesEqual(\n left: Readonly<Record<string, A2UIFieldValue>>,\n right: Readonly<Record<string, A2UIFieldValue>>,\n fields: readonly string[],\n): boolean {\n return fields.every(\n (field) =>\n Object.hasOwn(left, field) &&\n Object.hasOwn(right, field) &&\n Object.is(left[field], right[field]),\n );\n}\n\nfunction isFieldValue(value: unknown): value is A2UIFieldValue {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction isIncompleteRequiredValue(value: A2UIFieldValue): boolean {\n return value === null || (typeof value === \"string\" && value.trim() === \"\");\n}\n\nfunction envelopeRootFieldValues(\n envelope: SurfaceUpdateEnvelope | SnapshotEnvelope,\n): Readonly<Record<string, A2UIFieldValue>> | null {\n let values: Record<string, A2UIFieldValue> | null = null;\n for (const message of envelope.messages as readonly unknown[]) {\n if (!isRecord(message) || !isRecord(message.updateDataModel)) {\n continue;\n }\n const update = message.updateDataModel;\n if (\n update.surfaceId !== envelope.surfaceId ||\n (update.path !== undefined && update.path !== \"/\") ||\n !isRecord(update.value)\n ) {\n continue;\n }\n const candidate: Record<string, A2UIFieldValue> = {};\n for (const [field, value] of Object.entries(update.value)) {\n if (isFieldValue(value)) {\n candidate[field] = value;\n }\n }\n values = candidate;\n }\n return values;\n}\n\nfunction selectFieldValues(\n source: Readonly<Record<string, A2UIFieldValue>> | null,\n fields: readonly string[],\n): Readonly<Record<string, A2UIFieldValue>> | null {\n if (source === null) {\n return null;\n }\n const selected: Record<string, A2UIFieldValue> = {};\n for (const field of fields) {\n if (!Object.hasOwn(source, field)) {\n return null;\n }\n selected[field] = source[field] ?? null;\n }\n return selected;\n}\n\nfunction hasExactKeys(\n value: Record<string, unknown>,\n allowed: readonly string[],\n required: readonly string[],\n): boolean {\n const keys = Object.keys(value);\n return (\n keys.every((key) => allowed.includes(key)) &&\n required.every((key) => Object.hasOwn(value, key))\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 isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isPositiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === \"number\" && value > 0;\n}\n\nfunction invalid(\n errorCode: ClientErrorCode,\n detail: string,\n): DecodeResult {\n return { ok: false, errorCode, detail };\n}\n","/**\n * MedAid v0.9.1 action/correlation bridge.\n *\n * The official renderer emits protocol actions; this bridge binds them to the\n * authoritative session metadata and the MedAid v1 envelope. It deliberately\n * separates LiveKit delivery from application acknowledgement so a successful\n * `sendText` call can never be mistaken for a workflow transition.\n */\n\nimport type {\n A2UIClientErrorEvent,\n A2UIFieldValue,\n A2UIRendererActionEvent,\n} from \"./adapter.js\";\nimport {\n A2UI_PROTOCOL_VERSION,\n CLIENT_ACTIONS,\n ENVELOPE_VERSION,\n MAX_ENVELOPE_BYTES,\n} from \"./envelope.js\";\nimport type {\n A2UIClientActionEnvelope,\n A2UIClientErrorEnvelope,\n A2UIFieldInteractionGroup,\n AckEnvelope,\n AckFieldError,\n ClientAction,\n ClientErrorCode,\n ParticipantRole,\n} from \"./envelope.js\";\n\nconst DEFAULT_ACK_TIMEOUT_MS = 10_000;\nconst SAFE_DETAIL = /^[A-Za-z0-9_.:-]{1,96}$/;\nconst MAX_IDENTIFIER_LENGTH = 256;\n\nexport type A2UIActionDeliveryStatus =\n | \"publishing\"\n | \"awaiting_ack\"\n | \"retryable\";\n\nexport interface A2UIPendingAction {\n readonly requestId: string;\n readonly action: ClientAction;\n readonly surfaceId: string;\n readonly stateId: string;\n readonly revision: number;\n readonly deliveryStatus: A2UIActionDeliveryStatus;\n readonly attemptCount: number;\n readonly groupId?: string;\n}\n\nexport interface A2UIActionResult {\n readonly requestId: string;\n readonly action: ClientAction;\n readonly surfaceId: string;\n readonly stateId: string;\n readonly revision: number;\n readonly status: \"accepted\" | \"rejected\";\n readonly reasonCode?: string;\n readonly fieldErrors: readonly AckFieldError[];\n readonly groupId?: string;\n}\n\nexport interface A2UIActionState {\n readonly pendingRequests: readonly A2UIPendingAction[];\n readonly lastResult: A2UIActionResult | null;\n}\n\nexport interface ActionSurfaceMetadata {\n readonly surfaceId: string;\n readonly activeStateId: string | null;\n readonly revision: number;\n}\n\ninterface ActionBridgeOptions {\n publish(text: string): Promise<unknown>;\n canPublish(): boolean;\n getSurfaceMetadata(): ActionSurfaceMetadata | null;\n reportClientError(\n errorCode: ClientErrorCode,\n surfaceId?: string,\n detail?: string,\n ): void;\n onStateChange(state: A2UIActionState): void;\n participantRole?: ParticipantRole;\n ackTimeoutMs?: number;\n}\n\ninterface InternalPendingAction extends A2UIPendingAction {\n envelope: A2UIClientActionEnvelope;\n encoded: string;\n key: string;\n deliveryStatus: A2UIActionDeliveryStatus;\n attemptCount: number;\n generation: number;\n timeoutId?: number;\n}\n\ntype DecodedAction = Pick<A2UIClientActionEnvelope, \"action\" | \"payload\">;\n\nconst EMPTY_ACTION_STATE: A2UIActionState = {\n pendingRequests: [],\n lastResult: null,\n};\n\n/** Internal replaceable compatibility bridge; hosts use A2UISessionController. */\nexport class A2UIClientActionBridge {\n readonly #options: ActionBridgeOptions;\n readonly #pendingByKey = new Map<string, InternalPendingAction>();\n readonly #pendingByRequestId = new Map<string, InternalPendingAction>();\n #lastResult: A2UIActionResult | null = null;\n #publishQueue: Promise<void> = Promise.resolve();\n #closed = false;\n\n constructor(options: ActionBridgeOptions) {\n this.#options = options;\n }\n\n getSnapshot(): A2UIActionState {\n if (this.#pendingByKey.size === 0 && this.#lastResult === null) {\n return EMPTY_ACTION_STATE;\n }\n return {\n pendingRequests: [...this.#pendingByKey.values()].map((pending) => ({\n requestId: pending.requestId,\n action: pending.action,\n surfaceId: pending.surfaceId,\n stateId: pending.stateId,\n revision: pending.revision,\n deliveryStatus: pending.deliveryStatus,\n attemptCount: pending.attemptCount,\n ...(pending.groupId === undefined ? {} : { groupId: pending.groupId }),\n })),\n lastResult:\n this.#lastResult === null\n ? null\n : {\n ...this.#lastResult,\n fieldErrors: this.#lastResult.fieldErrors.map((entry) => ({\n ...entry,\n })),\n ...(this.#lastResult.groupId === undefined\n ? {}\n : { groupId: this.#lastResult.groupId }),\n },\n };\n }\n\n handleRendererAction(event: A2UIRendererActionEvent): void {\n if (this.#closed || !this.#options.canPublish()) {\n return;\n }\n const metadata = this.#options.getSurfaceMetadata();\n if (\n metadata === null ||\n metadata.activeStateId === null ||\n event.surfaceId !== metadata.surfaceId\n ) {\n this.#rejectRendererAction(event.surfaceId, \"action_metadata_stale\");\n return;\n }\n const decoded = decodeRendererAction(event);\n if (decoded === null) {\n this.#rejectRendererAction(event.surfaceId, \"action_context_invalid\");\n return;\n }\n\n const key = pendingKey(metadata.surfaceId, metadata.activeStateId);\n const existing = this.#pendingByKey.get(key);\n if (existing !== undefined) {\n if (\n existing.deliveryStatus === \"retryable\" &&\n isSameLogicalAction(existing.envelope, decoded)\n ) {\n this.#queueAttempt(existing);\n }\n return;\n }\n\n this.#startLogicalAction(decoded, key);\n }\n\n /** Publish one strict server-issued owning-group commit. */\n handleFieldGroupCommit(\n group: A2UIFieldInteractionGroup,\n fields: Readonly<Record<string, A2UIFieldValue>>,\n ): boolean {\n if (this.#closed || !this.#options.canPublish()) {\n return false;\n }\n const metadata = this.#options.getSurfaceMetadata();\n if (metadata === null || metadata.activeStateId === null) {\n return false;\n }\n const expected = group.fields.map((binding) => binding.field);\n if (\n expected.length === 0 ||\n Object.keys(fields).length !== expected.length ||\n expected.some((field) => !Object.hasOwn(fields, field)) ||\n (group.mode === \"current\" &&\n group.ownerStateId !== metadata.activeStateId) ||\n (group.mode === \"revision\" &&\n group.ownerStateId === metadata.activeStateId)\n ) {\n return false;\n }\n const orderedFields: Record<string, A2UIFieldValue> = {};\n for (const field of expected) {\n const value = normalizeFieldValue(fields[field]);\n if (value === undefined) {\n return false;\n }\n orderedFields[field] = value;\n }\n const key = groupPendingKey(metadata.surfaceId, group.groupId);\n if (this.#pendingByKey.has(key)) {\n return false;\n }\n const decoded: DecodedAction =\n group.mode === \"current\"\n ? { action: \"flow.submit\", payload: { fields: orderedFields } }\n : {\n action: \"flow.revise\",\n payload: {\n targetStateId: group.ownerStateId,\n fields: orderedFields,\n },\n };\n return this.#startLogicalAction(decoded, key, group.groupId);\n }\n\n #startLogicalAction(\n decoded: DecodedAction,\n key: string,\n groupId?: string,\n ): boolean {\n const metadata = this.#options.getSurfaceMetadata();\n if (metadata === null || metadata.activeStateId === null) {\n return false;\n }\n let requestId: string;\n try {\n requestId = createRequestId(\"req\");\n } catch {\n return false;\n }\n const envelope: A2UIClientActionEnvelope = {\n envelopeVersion: ENVELOPE_VERSION,\n a2uiVersion: A2UI_PROTOCOL_VERSION,\n kind: \"action\",\n requestId,\n role: this.#options.participantRole ?? \"member\",\n surfaceId: metadata.surfaceId,\n stateId: metadata.activeStateId,\n revision: metadata.revision,\n action: decoded.action,\n ...(decoded.payload === undefined ? {} : { payload: decoded.payload }),\n };\n const encoded = encodeEnvelope(envelope);\n if (encoded === null) {\n this.#options.reportClientError(\n \"message_malformed\",\n envelope.surfaceId,\n \"action_envelope_too_large\",\n );\n return false;\n }\n const pending: InternalPendingAction = {\n requestId,\n action: envelope.action,\n surfaceId: envelope.surfaceId,\n stateId: envelope.stateId,\n revision: envelope.revision,\n deliveryStatus: \"publishing\",\n attemptCount: 0,\n generation: 0,\n envelope,\n encoded,\n key,\n ...(groupId === undefined ? {} : { groupId }),\n };\n this.#pendingByKey.set(key, pending);\n this.#pendingByRequestId.set(requestId, pending);\n this.#queueAttempt(pending);\n return true;\n }\n\n handleClientError(event: A2UIClientErrorEvent): void {\n if (this.#closed || !this.#options.canPublish()) {\n return;\n }\n let requestId: string;\n try {\n requestId = createRequestId(\"err\");\n } catch {\n return;\n }\n const surfaceId = safeIdentifier(event.surfaceId);\n const detail = safeDetail(event.detail);\n const envelope: A2UIClientErrorEnvelope = {\n envelopeVersion: ENVELOPE_VERSION,\n a2uiVersion: A2UI_PROTOCOL_VERSION,\n kind: \"clientError\",\n requestId,\n role: this.#options.participantRole ?? \"member\",\n errorCode: event.errorCode,\n ...(surfaceId === undefined ? {} : { surfaceId }),\n ...(detail === undefined ? {} : { detail }),\n };\n const encoded = encodeEnvelope(envelope);\n if (encoded !== null) {\n this.#enqueue(async () => {\n await this.#options.publish(encoded);\n });\n }\n }\n\n handleAck(envelope: AckEnvelope): boolean {\n if (this.#closed) {\n return false;\n }\n const pending = this.#pendingByRequestId.get(envelope.inResponseTo);\n if (pending === undefined) {\n return false;\n }\n this.#removePending(pending);\n this.#lastResult = {\n requestId: pending.requestId,\n action: pending.action,\n surfaceId: pending.surfaceId,\n stateId: pending.stateId,\n revision: pending.revision,\n status: envelope.status,\n ...(envelope.reasonCode === undefined\n ? {}\n : { reasonCode: envelope.reasonCode }),\n fieldErrors: (envelope.fieldErrors ?? []).map((entry) => ({ ...entry })),\n ...(pending.groupId === undefined ? {} : { groupId: pending.groupId }),\n };\n this.#notify();\n return true;\n }\n\n markReconnect(): void {\n if (this.#closed) {\n return;\n }\n let changed = false;\n for (const pending of this.#pendingByKey.values()) {\n this.#clearTimer(pending);\n pending.generation += 1;\n if (pending.deliveryStatus !== \"retryable\") {\n pending.deliveryStatus = \"retryable\";\n changed = true;\n }\n }\n if (changed) {\n this.#notify();\n }\n }\n\n retryAfterRestore(): void {\n if (this.#closed || !this.#options.canPublish()) {\n return;\n }\n for (const pending of this.#pendingByKey.values()) {\n if (pending.deliveryStatus === \"retryable\") {\n this.#queueAttempt(pending);\n }\n }\n }\n\n retryPendingAction(requestId?: string): boolean {\n if (this.#closed || !this.#options.canPublish()) {\n return false;\n }\n const candidates =\n requestId === undefined\n ? [...this.#pendingByKey.values()]\n : [this.#pendingByRequestId.get(requestId)].filter(\n (entry): entry is InternalPendingAction => entry !== undefined,\n );\n let retried = false;\n for (const pending of candidates) {\n if (pending.deliveryStatus === \"retryable\") {\n this.#queueAttempt(pending);\n retried = true;\n }\n }\n return retried;\n }\n\n discardPending(): void {\n if (this.#pendingByKey.size === 0) {\n return;\n }\n for (const pending of this.#pendingByKey.values()) {\n this.#clearTimer(pending);\n pending.generation += 1;\n }\n this.#pendingByKey.clear();\n this.#pendingByRequestId.clear();\n this.#notify();\n }\n\n stop(): void {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.discardPending();\n this.#lastResult = null;\n }\n\n #rejectRendererAction(surfaceId: string, detail: string): void {\n this.#options.reportClientError(\n \"message_malformed\",\n safeIdentifier(surfaceId),\n detail,\n );\n }\n\n #queueAttempt(pending: InternalPendingAction): void {\n if (this.#closed || !this.#options.canPublish()) {\n return;\n }\n this.#clearTimer(pending);\n pending.deliveryStatus = \"publishing\";\n pending.attemptCount += 1;\n pending.generation += 1;\n const generation = pending.generation;\n this.#notify();\n this.#enqueue(async () => {\n if (!this.#isCurrent(pending, generation)) {\n return;\n }\n try {\n await this.#options.publish(pending.encoded);\n } catch {\n if (this.#isCurrent(pending, generation)) {\n pending.deliveryStatus = \"retryable\";\n this.#notify();\n }\n return;\n }\n if (!this.#isCurrent(pending, generation)) {\n return;\n }\n pending.deliveryStatus = \"awaiting_ack\";\n pending.timeoutId = globalThis.setTimeout(() => {\n if (this.#isCurrent(pending, generation)) {\n pending.timeoutId = undefined;\n pending.deliveryStatus = \"retryable\";\n this.#notify();\n }\n }, this.#ackTimeoutMs());\n this.#notify();\n });\n }\n\n #enqueue(operation: () => Promise<void>): void {\n this.#publishQueue = this.#publishQueue\n .then(operation)\n .catch(() => undefined);\n }\n\n #ackTimeoutMs(): number {\n const configured = this.#options.ackTimeoutMs;\n return typeof configured === \"number\" &&\n Number.isFinite(configured) &&\n configured > 0\n ? configured\n : DEFAULT_ACK_TIMEOUT_MS;\n }\n\n #isCurrent(pending: InternalPendingAction, generation: number): boolean {\n return (\n !this.#closed &&\n pending.generation === generation &&\n this.#pendingByRequestId.get(pending.requestId) === pending\n );\n }\n\n #removePending(pending: InternalPendingAction): void {\n this.#clearTimer(pending);\n pending.generation += 1;\n this.#pendingByKey.delete(pending.key);\n this.#pendingByRequestId.delete(pending.requestId);\n }\n\n #clearTimer(pending: InternalPendingAction): void {\n if (pending.timeoutId !== undefined) {\n globalThis.clearTimeout(pending.timeoutId);\n pending.timeoutId = undefined;\n }\n }\n\n #notify(): void {\n this.#options.onStateChange(this.getSnapshot());\n }\n}\n\nfunction decodeRendererAction(event: A2UIRendererActionEvent): DecodedAction | null {\n if (!CLIENT_ACTIONS.includes(event.actionName as ClientAction)) {\n return null;\n }\n const action = event.actionName as ClientAction;\n const entries = Object.entries(event.context).sort(([left], [right]) =>\n left.localeCompare(right),\n );\n if (entries.some(([key]) => key.length === 0)) {\n return null;\n }\n\n if (action === \"flow.skip\") {\n return entries.length === 0 ? { action } : null;\n }\n if (action === \"flow.submit\") {\n const listPath = event.context.listPath;\n if (typeof listPath === \"string\" && listPath.length > 0) {\n const fieldEntries = entries.filter(([key]) => key !== \"listPath\");\n const fields = scalarFields(fieldEntries, listPath);\n if (fields === null) {\n return null;\n }\n return {\n action,\n payload: {\n listPath,\n ...(Object.keys(fields).length > 0 ? { fields } : {}),\n },\n };\n }\n const fields = scalarFields(entries);\n if (fields === null) {\n return null;\n }\n return Object.keys(fields).length === 0\n ? { action, payload: {} }\n : { action, payload: { fields } };\n }\n\n if (\n action === \"flow.list.add\" ||\n action === \"flow.list.update\" ||\n action === \"flow.list.delete\"\n ) {\n const listPath = event.context.listPath;\n if (typeof listPath !== \"string\" || listPath.length === 0) {\n return null;\n }\n const itemId = event.context.itemId;\n if (\n (action === \"flow.list.update\" || action === \"flow.list.delete\") &&\n (typeof itemId !== \"string\" || itemId.length === 0)\n ) {\n return null;\n }\n const fieldEntries = entries.filter(\n ([key]) => key !== \"listPath\" && key !== \"itemId\",\n );\n const fields = scalarFields(fieldEntries, listPath);\n const targetStateId = listActionTargetStateId(event.sourceComponentId);\n if (action !== \"flow.list.delete\" &&\n (fields === null || Object.keys(fields).length === 0)) {\n return null;\n }\n return {\n action,\n payload: {\n listPath,\n ...(targetStateId === undefined ? {} : { targetStateId }),\n ...(typeof itemId === \"string\" ? { itemId } : {}),\n ...(fields !== null && Object.keys(fields).length > 0 ? { fields } : {}),\n },\n };\n }\n\n const targetStateId = event.context.targetStateId;\n if (typeof targetStateId !== \"string\" || targetStateId.length === 0) {\n return null;\n }\n const fieldEntries = entries.filter(([key]) => key !== \"targetStateId\");\n const fields = scalarFields(fieldEntries);\n if (fields === null) {\n return null;\n }\n return {\n action,\n payload: {\n targetStateId,\n ...(Object.keys(fields).length === 0 ? {} : { fields }),\n },\n };\n}\n\nfunction listActionTargetStateId(\n sourceComponentId: string,\n): string | undefined {\n const markerIndex = sourceComponentId.indexOf(\":list\");\n if (markerIndex <= 0) {\n return undefined;\n }\n const stateId = sourceComponentId.slice(0, markerIndex);\n return stateId.length > 0 ? stateId : undefined;\n}\n\nfunction scalarFields(\n entries: [string, unknown][],\n listPath?: string,\n): Record<string, string | number | boolean | null> | null {\n const fields: Record<string, string | number | boolean | null> = {};\n for (const [key, value] of entries) {\n const normalized = normalizeFieldValue(value);\n if (normalized === undefined) {\n return null;\n }\n fields[canonicalListFieldKey(listPath, key)] = normalized;\n }\n return fields;\n}\n\nfunction canonicalListFieldKey(listPath: string | undefined, key: string): string {\n if (listPath !== \"needs.providers\") {\n return key;\n }\n switch (normalizeFieldKey(key)) {\n case \"primary_care_provider\":\n case \"primarycareprovider\":\n case \"primarycare\":\n case \"primary_care\":\n case \"primary_care_doctor\":\n case \"primary_doctor\":\n case \"primarydoctor\":\n case \"primary_provider\":\n case \"primaryprovider\":\n case \"pcp\":\n case \"provider_name\":\n case \"providername\":\n case \"display_name\":\n case \"displayname\":\n return \"primary_care_provider\";\n case \"primary_care_provider_location\":\n case \"primarycareproviderlocation\":\n case \"primarycarelocation\":\n case \"primary_care_location\":\n case \"provider_location\":\n case \"providerlocation\":\n case \"location_details\":\n case \"locationdetails\":\n case \"provider_address\":\n case \"provideraddress\":\n case \"office_location\":\n case \"officelocation\":\n case \"practice_location\":\n case \"practicelocation\":\n case \"city\":\n case \"city_state\":\n case \"cityandstate\":\n case \"city_and_state\":\n case \"location\":\n case \"address\":\n return \"primary_care_provider_location\";\n default:\n return key;\n }\n}\n\nfunction normalizeFieldKey(key: string): string {\n return key\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"_\")\n .replaceAll(/^_+|_+$/g, \"\");\n}\n\nfunction isSameLogicalAction(\n envelope: A2UIClientActionEnvelope,\n candidate: DecodedAction,\n): boolean {\n return (\n envelope.action === candidate.action &&\n JSON.stringify(envelope.payload) === JSON.stringify(candidate.payload)\n );\n}\n\nfunction pendingKey(surfaceId: string, stateId: string): string {\n return JSON.stringify([surfaceId, stateId]);\n}\n\nfunction groupPendingKey(surfaceId: string, groupId: string): string {\n return JSON.stringify([\"group\", surfaceId, groupId]);\n}\n\nfunction isFieldValue(value: unknown): value is A2UIFieldValue {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction normalizeFieldValue(value: unknown): A2UIFieldValue | undefined {\n if (isFieldValue(value)) {\n return value;\n }\n if (!Array.isArray(value)) {\n return undefined;\n }\n if (value.length === 0) {\n return null;\n }\n if (value.length !== 1) {\n return undefined;\n }\n return normalizeFieldValue(value[0]);\n}\n\nfunction encodeEnvelope(\n envelope: A2UIClientActionEnvelope | A2UIClientErrorEnvelope,\n): string | null {\n let encoded: string;\n try {\n encoded = JSON.stringify(envelope);\n } catch {\n return null;\n }\n return new TextEncoder().encode(encoded).byteLength <= MAX_ENVELOPE_BYTES\n ? encoded\n : null;\n}\n\nfunction createRequestId(prefix: \"req\" | \"err\"): string {\n return `${prefix}-${globalThis.crypto.randomUUID()}`;\n}\n\nfunction safeIdentifier(value: string | undefined): string | undefined {\n return value !== undefined &&\n value.length > 0 &&\n value.length <= MAX_IDENTIFIER_LENGTH\n ? value\n : undefined;\n}\n\nfunction safeDetail(value: string | undefined): string | undefined {\n return value !== undefined && SAFE_DETAIL.test(value) ? value : undefined;\n}\n","/** Explicit room-ownership helper backed by backend-issued runtime material. */\n\nimport type { A2UIRoomLike } from \"./session.js\";\n\nexport interface A2UIRuntimeMaterial {\n readonly serverUrl: string;\n readonly token: string;\n}\n\nexport type A2UITokenProvider = () => Promise<A2UIRuntimeMaterial>;\n\nexport interface A2UIJoinedRoom {\n readonly room: A2UIRoomLike;\n close(): Promise<void>;\n}\n\ninterface A2UIOwnedRoom extends A2UIRoomLike {\n connect(serverUrl: string, token: string): Promise<void>;\n disconnect(): Promise<void>;\n}\n\n/**\n * Create and connect a room owned by this helper.\n *\n * Runtime material is requested exactly once and remains local to the join\n * operation. The returned handle retains the room and idempotent cleanup,\n * never the token or material object.\n */\nexport async function joinA2UIRoom(\n tokenProvider: A2UITokenProvider,\n): Promise<A2UIJoinedRoom> {\n let material: A2UIRuntimeMaterial;\n try {\n material = await tokenProvider();\n } catch {\n throw new Error(\"A2UI room runtime material is unavailable.\");\n }\n if (!isValidRuntimeMaterial(material)) {\n throw new Error(\"A2UI room runtime material is invalid.\");\n }\n\n let room: A2UIOwnedRoom;\n try {\n const { Room } = await import(\"livekit-client\");\n room = new Room();\n } catch {\n throw new Error(\"Unable to initialize the A2UI room.\");\n }\n try {\n await room.connect(material.serverUrl, material.token);\n } catch {\n try {\n await room.disconnect();\n } catch {\n // The sanitized join error below remains the only exposed failure.\n }\n throw new Error(\"Unable to join the A2UI room.\");\n }\n\n let closePromise: Promise<void> | undefined;\n return {\n room,\n close() {\n closePromise ??= disconnectWithoutLeaking(room);\n return closePromise;\n },\n };\n}\n\nfunction isValidRuntimeMaterial(\n material: A2UIRuntimeMaterial,\n): material is A2UIRuntimeMaterial {\n if (\n typeof material !== \"object\" ||\n material === null ||\n typeof material.serverUrl !== \"string\" ||\n material.serverUrl.length === 0 ||\n typeof material.token !== \"string\" ||\n material.token.length === 0\n ) {\n return false;\n }\n try {\n const protocol = new URL(material.serverUrl).protocol;\n return [\"wss:\", \"ws:\", \"https:\", \"http:\"].includes(protocol);\n } catch {\n return false;\n }\n}\n\nasync function disconnectWithoutLeaking(room: {\n disconnect(): Promise<void>;\n}): Promise<void> {\n try {\n await room.disconnect();\n } catch {\n // Cleanup is idempotent and safe for navigation/unload paths.\n }\n}\n"],"mappings":"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","names":["basicCatalog","useId","createComponentImplementation","jsx","jsxs","basicCatalog","nextMessages","value","field","useId","useLayoutEffect","useRef","jsx","invalid","values","label","A2uiMessageListSchema","fieldEntries","fields","targetStateId","normalizeFieldKey","isFieldValue","isNonEmptyString","isFieldValue","isRecord","A2uiMessageListSchema"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapter.ts","../src/HospitalChoice.tsx","../src/DateTimeInput.tsx","../src/SurfaceHost.tsx","../src/session.ts","../src/actions.ts","../src/join.ts"],"sourcesContent":["/**\n * A2UIClientAdapter: the only place protocol messages are applied client-side.\n *\n * Wraps the official A2UI v0.9.1 message processor with the trusted Basic\n * Catalog. Hosts never see protocol SDK types directly; they receive the\n * adapter's surface handles and safe error events using the locked\n * client-error codes. Unsupported catalogs or malformed messages produce an\n * error callback and leave prior committed surfaces untouched — there is no\n * partial render path and no dynamic catalog loading.\n */\n\nimport { basicCatalog } from \"@a2ui/react/v0_9\";\nimport type { ReactComponentImplementation } from \"@a2ui/react/v0_9\";\nimport {\n A2uiError,\n Catalog,\n A2uiMessageListSchema,\n MessageProcessor,\n} from \"@a2ui/web_core/v0_9\";\n\nimport { HospitalChoice } from \"./HospitalChoice.js\";\nimport { DateTimeInput } from \"./DateTimeInput.js\";\n\nimport type {\n A2UIFieldInteractionGroup,\n A2UIServerEnvelope,\n ClientErrorCode,\n SnapshotEnvelope,\n SurfaceUpdateEnvelope,\n} from \"./envelope.js\";\n\n/** Opaque renderer-owned handle. Hosts may identify it, but never inspect SDK state. */\nexport interface AdapterSurface {\n readonly id: string;\n}\n\nexport interface A2UIClientErrorEvent {\n errorCode: ClientErrorCode;\n surfaceId?: string;\n detail?: string;\n}\n\n/** Protocol-neutral action emitted by the trusted official renderer. */\nexport interface A2UIRendererActionEvent {\n actionName: string;\n surfaceId: string;\n sourceComponentId: string;\n context: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Fields whose values a server update changed on an already-rendered surface\n * (the agent filled or corrected them). Values themselves are never exposed.\n */\nexport interface A2UIFieldUpdateEvent {\n surfaceId: string;\n fields: readonly string[];\n}\n\nexport type A2UIFieldControl = \"text\" | \"date\" | \"choice\";\nexport type A2UIFieldValue = string | number | boolean | null;\n\n/** Safe structural metadata used only for labels, validation, and focus. */\nexport interface A2UIFieldDescriptor {\n readonly componentId: string;\n readonly field: string;\n readonly label: string;\n readonly control: A2UIFieldControl;\n readonly required: boolean;\n readonly validationRegexp?: string;\n readonly max?: string;\n}\n\n/** Safe authored tab title/child binding; section status remains envelope-owned. */\nexport interface A2UITabDescriptor {\n readonly componentId: string;\n readonly title: string;\n readonly childId: string;\n}\n\nexport interface A2UISurfaceStructure {\n readonly fields: readonly A2UIFieldDescriptor[];\n readonly tabs: readonly A2UITabDescriptor[];\n}\n\nexport interface A2UIClientAdapterOptions {\n /** Safe client-error events (locked codes); wired to LiveKit in later items. */\n onClientError?: (event: A2UIClientErrorEvent) => void;\n /** Trusted catalog actions normalized without exposing official A2UI types. */\n onAction?: (action: A2UIRendererActionEvent) => void;\n /** Application acknowledgements; consumed by Queue-Item 024-005. */\n onAck?: (envelope: Extract<A2UIServerEnvelope, { kind: \"ack\" }>) => void;\n /** Server updates that changed field values on a rendered surface. */\n onFieldUpdate?: (event: A2UIFieldUpdateEvent) => void;\n}\n\nconst editableDateCatalog = new Catalog<ReactComponentImplementation>(\n basicCatalog.id,\n [...basicCatalog.components.values()].map((component) =>\n component.name === DateTimeInput.name ? DateTimeInput :\n component.name === HospitalChoice.name ? HospitalChoice : component,\n ),\n [...basicCatalog.functions.values()],\n basicCatalog.themeSchema,\n);\n\nconst RENDERER_NAME = \"a2ui_react_adapter\";\nconst RENDERER_VERSION = \"0.1.0\";\n\nexport class A2UIClientAdapter {\n readonly rendererName = RENDERER_NAME;\n readonly rendererVersion = RENDERER_VERSION;\n\n #processor: MessageProcessor<ReactComponentImplementation>;\n #options: A2UIClientAdapterOptions;\n #listeners = new Set<() => void>();\n #actionListeners = new Set<(event: A2UIRendererActionEvent) => void>();\n #errorListeners = new Set<(event: A2UIClientErrorEvent) => void>();\n #fieldUpdateListeners = new Set<(event: A2UIFieldUpdateEvent) => void>();\n #surfaceOrder: string[] = [];\n #structureBySurface = new Map<string, MutableSurfaceStructure>();\n #persistedListRowsByPath = new Map<string, unknown[]>();\n #deletedListItemIdsByPath = new Map<string, Set<string>>();\n #stagedListRowUpdatesBySurface = new Map<\n string,\n Record<string, A2UIFieldValue>\n >();\n #activeListRowEditsBySurface = new Map<\n string,\n Map<string, Record<string, A2UIFieldValue>>\n >();\n #optimisticListRowsByPath = new Map<\n string,\n Map<string, Record<string, unknown>>\n >();\n #version = 0;\n #lastSeq = 0;\n #disposed = false;\n\n constructor(options: A2UIClientAdapterOptions = {}) {\n this.#options = options;\n this.#processor = this.#createProcessor();\n }\n\n /** Catalog ids this adapter will announce in capability envelopes. */\n get supportedCatalogIds(): string[] {\n return [basicCatalog.id];\n }\n\n get lastSeq(): number {\n return this.#lastSeq;\n }\n\n /** The most recently created live surface, if any. */\n get currentSurface(): AdapterSurface | undefined {\n const id = this.#surfaceOrder[this.#surfaceOrder.length - 1];\n return id === undefined ? undefined : this.getSurface(id);\n }\n\n getSurface(id: string): AdapterSurface | undefined {\n return this.#processor.model.getSurface(id);\n }\n\n /** Immutable value-free structure for host accessibility augmentation. */\n getSurfaceStructure(id: string): A2UISurfaceStructure {\n const structure = this.#structureBySurface.get(id);\n if (structure === undefined) {\n return { fields: [], tabs: [] };\n }\n return {\n fields: [...structure.fieldsByComponent.values()].map((field) => ({\n ...field,\n })),\n tabs: [...structure.tabsByComponent.values()]\n .flat()\n .map((tab) => ({ ...tab })),\n };\n }\n\n /** Read a complete scalar field set without exposing the SDK data model. */\n getFieldValues(\n surfaceId: string,\n fields: readonly string[],\n ): Record<string, A2UIFieldValue> | null {\n const surface = this.#processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n return null;\n }\n const values: Record<string, A2UIFieldValue> = {};\n for (const field of fields) {\n const value = surface.dataModel.get(fieldPointer(field));\n if (Array.isArray(value) && value.length === 1 && isFieldValue(value[0])) {\n values[field] = value[0];\n continue;\n }\n if (!isFieldValue(value)) {\n return null;\n }\n values[field] = value;\n }\n return values;\n }\n\n /** Restore a private draft after a trusted processor replacement. */\n applyFieldValues(\n surfaceId: string,\n values: Readonly<Record<string, A2UIFieldValue>>,\n ): boolean {\n const surface = this.#processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n return false;\n }\n let changed = false;\n for (const [field, value] of Object.entries(values)) {\n const path = fieldPointer(field);\n const next = this.#dataModelValueForField(surfaceId, field, value);\n if (!fieldValueEquivalent(surface.dataModel.get(path), next)) {\n surface.dataModel.set(path, next);\n changed = true;\n }\n }\n if (changed) {\n this.#notify();\n }\n return true;\n }\n\n stageListRowUpdate(\n surfaceId: string,\n values: Readonly<Record<string, A2UIFieldValue>>,\n ): void {\n this.#stagedListRowUpdatesBySurface.set(surfaceId, { ...values });\n }\n\n beginListRowEdit(\n surfaceId: string,\n rowKey: string,\n values: Readonly<Record<string, A2UIFieldValue>>,\n ): void {\n let edits = this.#activeListRowEditsBySurface.get(surfaceId);\n if (edits === undefined) {\n edits = new Map();\n this.#activeListRowEditsBySurface.set(surfaceId, edits);\n }\n edits.set(rowKey, { ...values });\n }\n\n updateListRowEdit(\n surfaceId: string,\n rowKey: string,\n values: Readonly<Record<string, A2UIFieldValue>>,\n ): void {\n const edits = this.#activeListRowEditsBySurface.get(surfaceId);\n if (edits?.has(rowKey) !== true) {\n return;\n }\n edits.set(rowKey, { ...values });\n }\n\n getListRowEdit(\n surfaceId: string,\n rowKey: string,\n ): Readonly<Record<string, A2UIFieldValue>> | undefined {\n const values = this.#activeListRowEditsBySurface.get(surfaceId)?.get(rowKey);\n return values === undefined ? undefined : { ...values };\n }\n\n clearListRowEdit(surfaceId: string, rowKey: string): void {\n const edits = this.#activeListRowEditsBySurface.get(surfaceId);\n if (edits === undefined) {\n return;\n }\n edits.delete(rowKey);\n if (edits.size === 0) {\n this.#activeListRowEditsBySurface.delete(surfaceId);\n }\n }\n\n #dataModelValueForField(\n surfaceId: string,\n field: string,\n value: A2UIFieldValue,\n ): A2UIFieldValue | readonly A2UIFieldValue[] {\n const descriptor = this.#fieldDescriptor(surfaceId, field);\n if (\n descriptor?.control === \"choice\" &&\n typeof value === \"string\" &&\n value.length > 0\n ) {\n return [value];\n }\n return value;\n }\n\n #fieldDescriptor(\n surfaceId: string,\n field: string,\n ): A2UIFieldDescriptor | undefined {\n const structure = this.#structureBySurface.get(surfaceId);\n if (structure === undefined) {\n return undefined;\n }\n return [...structure.fieldsByComponent.values()].find(\n (descriptor) => descriptor.field === field,\n );\n }\n\n /**\n * Apply one validated server envelope. Returns false for duplicates and\n * out-of-order deliveries (the per-session `seq` guard) and for envelopes\n * that fail to apply; committed surfaces are never partially replaced.\n */\n applyServerEnvelope(envelope: A2UIServerEnvelope): boolean {\n if (this.#disposed) {\n return false;\n }\n if (envelope.seq <= this.#lastSeq) {\n return false;\n }\n this.#lastSeq = envelope.seq;\n if (envelope.kind === \"ack\") {\n this.#options.onAck?.(envelope);\n return true;\n }\n return this.#applySurfaceEnvelope(envelope);\n }\n\n /**\n * Reset the ordering guard; used when a reconnect snapshot restarts the\n * server sequence (Queue-Item 024-004).\n */\n resetSequence(): void {\n this.#lastSeq = 0;\n }\n\n /** Clear every generated surface without disposing the reusable adapter. */\n clearSurfaces(): void {\n if (this.#disposed) {\n return;\n }\n const replacement = this.#createProcessor();\n const previous = this.#processor;\n this.#processor = replacement;\n this.#surfaceOrder = [];\n this.#structureBySurface.clear();\n this.#persistedListRowsByPath.clear();\n this.#deletedListItemIdsByPath.clear();\n this.#activeListRowEditsBySurface.clear();\n this.#optimisticListRowsByPath.clear();\n previous.model.dispose();\n this.#notify();\n }\n\n /** Emit one of the locked, body-free client error events. */\n reportClientError(\n errorCode: ClientErrorCode,\n surfaceId?: string,\n detail?: string,\n ): void {\n if (this.#disposed) {\n return;\n }\n const event = { errorCode, surfaceId, detail };\n this.#options.onClientError?.(event);\n for (const listener of this.#errorListeners) {\n listener(event);\n }\n }\n\n /** Report a rendering failure (used by the surface host error boundary). */\n reportRenderFailure(surfaceId: string | undefined, detail: string): void {\n this.reportClientError(\"render_failed\", surfaceId, detail);\n }\n\n subscribe = (listener: () => void): (() => void) => {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n };\n\n subscribeActions = (\n listener: (event: A2UIRendererActionEvent) => void,\n ): (() => void) => {\n this.#actionListeners.add(listener);\n return () => this.#actionListeners.delete(listener);\n };\n\n subscribeClientErrors = (\n listener: (event: A2UIClientErrorEvent) => void,\n ): (() => void) => {\n this.#errorListeners.add(listener);\n return () => this.#errorListeners.delete(listener);\n };\n\n subscribeFieldUpdates = (\n listener: (event: A2UIFieldUpdateEvent) => void,\n ): (() => void) => {\n this.#fieldUpdateListeners.add(listener);\n return () => this.#fieldUpdateListeners.delete(listener);\n };\n\n /** Monotonic change counter for `useSyncExternalStore`. */\n getVersion = (): number => this.#version;\n\n dispose(): void {\n if (this.#disposed) {\n return;\n }\n this.#disposed = true;\n this.#processor.model.dispose();\n this.#structureBySurface.clear();\n this.#persistedListRowsByPath.clear();\n this.#deletedListItemIdsByPath.clear();\n this.#activeListRowEditsBySurface.clear();\n this.#optimisticListRowsByPath.clear();\n this.#listeners.clear();\n this.#actionListeners.clear();\n this.#errorListeners.clear();\n this.#fieldUpdateListeners.clear();\n }\n\n #applySurfaceEnvelope(\n envelope: SurfaceUpdateEnvelope | SnapshotEnvelope,\n ): boolean {\n const validated = A2uiMessageListSchema.safeParse(envelope.messages);\n if (!validated.success) {\n this.reportClientError(\n \"message_malformed\",\n envelope.surfaceId,\n \"message_schema_invalid\",\n );\n return false;\n }\n const rawMessages =\n envelope.kind === \"snapshot\"\n ? validated.data\n : mergePersistedListRowsIntoMessages(\n validated.data as readonly unknown[],\n envelope.surfaceId,\n this.#persistedListRowsByPath,\n this.#deletedListItemIdsByPath,\n this.#optimisticListRowsByPath,\n );\n const listAddFreeMessages = removeListAddActionMessages(\n rawMessages as readonly unknown[],\n envelope.surfaceId,\n );\n const actionCompleteMessages = ensureOptionalCoverageSkipActionMessages(\n listAddFreeMessages,\n envelope.surfaceId,\n );\n const nextStructure = updateSurfaceStructures(\n actionCompleteMessages as unknown[],\n envelope.kind === \"snapshot\"\n ? new Map()\n : cloneSurfaceStructures(this.#structureBySurface),\n );\n const messages = normalizeChoiceValuesInMessages(\n actionCompleteMessages as readonly unknown[],\n envelope.surfaceId,\n nextStructure.get(envelope.surfaceId),\n );\n\n // Apply against a staged processor. A malformed lifecycle sequence can\n // mutate the official processor before throwing, so committing only the\n // successful candidate keeps the currently rendered surface atomic.\n const candidate = this.#createProcessor();\n try {\n if (envelope.kind !== \"snapshot\") {\n candidate.processMessages(this.#snapshotMessages());\n }\n candidate.processMessages(\n messages as Parameters<\n MessageProcessor<ReactComponentImplementation>[\"processMessages\"]\n >[0],\n );\n } catch (error) {\n candidate.model.dispose();\n this.reportClientError(\n classifyProcessingError(error),\n envelope.surfaceId,\n error instanceof A2uiError ? error.code : \"processing_failed\",\n );\n return false;\n }\n\n const previous = this.#processor;\n pruneSurfaceStructures(nextStructure, candidate);\n if (\n !fieldInteractionBindingsTrusted(\n envelope.fieldInteractions ?? [],\n nextStructure.get(envelope.surfaceId),\n )\n ) {\n candidate.model.dispose();\n this.reportClientError(\n \"message_malformed\",\n envelope.surfaceId,\n \"field_interaction_untrusted\",\n );\n return false;\n }\n const changedFields =\n envelope.kind === \"snapshot\"\n ? []\n : changedFieldNames(\n previous,\n candidate,\n envelope.surfaceId,\n nextStructure.get(envelope.surfaceId),\n );\n this.#processor = candidate;\n this.#surfaceOrder = [...candidate.model.surfacesMap.keys()];\n this.#structureBySurface = nextStructure;\n if (envelope.kind === \"snapshot\") {\n this.#persistedListRowsByPath.clear();\n this.#deletedListItemIdsByPath.clear();\n this.#activeListRowEditsBySurface.clear();\n this.#optimisticListRowsByPath.clear();\n }\n rememberPersistedListRows(\n this.#persistedListRowsByPath,\n this.#deletedListItemIdsByPath,\n candidate.model.getSurface(envelope.surfaceId)?.dataModel.get(\"/\"),\n );\n previous.model.dispose();\n this.#notify();\n if (changedFields.length > 0) {\n this.#emitFieldUpdate({\n surfaceId: envelope.surfaceId,\n fields: changedFields,\n });\n }\n return true;\n }\n\n #emitFieldUpdate(event: A2UIFieldUpdateEvent): void {\n this.#options.onFieldUpdate?.(event);\n for (const listener of this.#fieldUpdateListeners) {\n listener(event);\n }\n }\n\n #createProcessor(): MessageProcessor<ReactComponentImplementation> {\n return new MessageProcessor<ReactComponentImplementation>(\n [editableDateCatalog],\n (action) => this.#emitAction(action),\n );\n }\n\n #emitAction(action: unknown): void {\n if (\n !isRecord(action) ||\n !isNonEmptyString(action.name) ||\n !isNonEmptyString(action.surfaceId) ||\n !isNonEmptyString(action.sourceComponentId) ||\n !isRecord(action.context)\n ) {\n this.reportClientError(\n \"message_malformed\",\n undefined,\n \"renderer_action_invalid\",\n );\n return;\n }\n const stagedListRowUpdate =\n action.name === \"flow.list.update\"\n ? this.#stagedListRowUpdatesBySurface.get(action.surfaceId)\n : undefined;\n if (stagedListRowUpdate !== undefined) {\n this.#stagedListRowUpdatesBySurface.delete(action.surfaceId);\n }\n const event: A2UIRendererActionEvent = {\n actionName: action.name,\n surfaceId: action.surfaceId,\n sourceComponentId: action.sourceComponentId,\n context: {\n ...action.context,\n ...(stagedListRowUpdate ?? {}),\n },\n };\n const submittedProviderRow = submittedProviderRowFromEvent(event);\n if (submittedProviderRow !== undefined) {\n this.#rememberSubmittedProviderRow(\n event.surfaceId,\n submittedProviderRow,\n event.context,\n );\n }\n if (event.actionName === \"flow.list.delete\") {\n this.#removeDeletedListRow(event.surfaceId, event.context);\n }\n if (event.actionName === \"flow.list.update\") {\n this.#updateListRow(event.surfaceId, event.context);\n }\n this.#options.onAction?.(event);\n for (const listener of this.#actionListeners) {\n listener(event);\n }\n }\n\n #rememberSubmittedProviderRow(\n surfaceId: string,\n row: Record<string, unknown>,\n context: Readonly<Record<string, unknown>>,\n ): void {\n const rows = upsertListRow(\n this.#persistedListRowsByPath.get(\"needs.providers\") ?? [],\n row,\n );\n this.#persistedListRowsByPath.set(\"needs.providers\", rows);\n const surface = this.#processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n return;\n }\n surface.dataModel.set(\"/needs.providers\", cloneJsonArray(rows));\n surface.dataModel.set(\"/needs/providers\", cloneJsonArray(rows));\n clearSubmittedProviderDraft(surface.dataModel, context);\n removeSubmittedProviderDraftControls(\n surface.componentsModel.entries,\n eventSourceFieldPaths(context),\n context,\n );\n this.#notify();\n }\n\n #removeDeletedListRow(\n surfaceId: string,\n context: Readonly<Record<string, unknown>>,\n ): void {\n const listPath = context.listPath;\n const itemId = context.itemId;\n if (\n typeof listPath !== \"string\" ||\n listPath.length === 0 ||\n typeof itemId !== \"string\" ||\n itemId.length === 0\n ) {\n return;\n }\n const cachedRows = this.#persistedListRowsByPath.get(listPath) ?? [];\n const nextRows = removeListRowByItemId(cachedRows, itemId);\n this.#persistedListRowsByPath.set(listPath, nextRows);\n this.#optimisticListRowsByPath.get(listPath)?.delete(itemId);\n rememberDeletedListItemId(this.#deletedListItemIdsByPath, listPath, itemId);\n\n const surface = this.#processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n return;\n }\n surface.dataModel.set(`/${listPath}`, cloneJsonArray(nextRows));\n surface.dataModel.set(\n `/${listPath.replaceAll(\".\", \"/\")}`,\n cloneJsonArray(nextRows),\n );\n this.#notify();\n }\n\n #updateListRow(\n surfaceId: string,\n context: Readonly<Record<string, unknown>>,\n ): void {\n const listPath = context.listPath;\n const itemId = context.itemId;\n if (\n typeof listPath !== \"string\" ||\n listPath.length === 0 ||\n typeof itemId !== \"string\" ||\n itemId.length === 0\n ) {\n return;\n }\n const cachedRows = this.#persistedListRowsByPath.get(listPath) ?? [];\n const existingRow = cachedRows.find(\n (candidate) => isRecord(candidate) && candidate.itemId === itemId,\n );\n const row = updateListRowFromContext(context, existingRow);\n if (row === undefined) {\n return;\n }\n const rows = normalizeListRows(listPath, upsertListRow(cachedRows, row));\n this.#persistedListRowsByPath.set(listPath, rows);\n let optimisticRows = this.#optimisticListRowsByPath.get(listPath);\n if (optimisticRows === undefined) {\n optimisticRows = new Map();\n this.#optimisticListRowsByPath.set(listPath, optimisticRows);\n }\n optimisticRows.set(itemId, cloneJsonRecord(row));\n\n const surface = this.#processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n return;\n }\n surface.dataModel.set(`/${listPath}`, cloneJsonArray(rows));\n surface.dataModel.set(\n `/${listPath.replaceAll(\".\", \"/\")}`,\n cloneJsonArray(rows),\n );\n this.#notify();\n }\n\n #snapshotMessages(): Parameters<\n MessageProcessor<ReactComponentImplementation>[\"processMessages\"]\n >[0] {\n const messages: unknown[] = [];\n for (const surface of this.#processor.model.surfacesMap.values()) {\n messages.push({\n version: \"v0.9\",\n createSurface: {\n surfaceId: surface.id,\n catalogId: surface.catalog.id,\n theme: surface.theme,\n sendDataModel: surface.sendDataModel,\n },\n });\n const components = [...surface.componentsModel.entries].map(\n ([id, component]) => ({\n id,\n component: component.type,\n ...component.properties,\n }),\n );\n if (components.length > 0) {\n messages.push({\n version: \"v0.9\",\n updateComponents: { surfaceId: surface.id, components },\n });\n }\n const data = surface.dataModel.get(\"/\");\n if (data !== undefined) {\n messages.push({\n version: \"v0.9\",\n updateDataModel: { surfaceId: surface.id, path: \"/\", value: data },\n });\n }\n }\n return messages as Parameters<\n MessageProcessor<ReactComponentImplementation>[\"processMessages\"]\n >[0];\n }\n\n #notify(): void {\n this.#version += 1;\n for (const listener of this.#listeners) {\n listener();\n }\n }\n}\n\ninterface MutableSurfaceStructure {\n fieldsByComponent: Map<string, A2UIFieldDescriptor>;\n tabsByComponent: Map<string, A2UITabDescriptor[]>;\n}\n\nfunction emptySurfaceStructure(): MutableSurfaceStructure {\n return {\n fieldsByComponent: new Map(),\n tabsByComponent: new Map(),\n };\n}\n\nfunction cloneSurfaceStructures(\n source: Map<string, MutableSurfaceStructure>,\n): Map<string, MutableSurfaceStructure> {\n return new Map(\n [...source].map(([surfaceId, structure]) => [\n surfaceId,\n {\n fieldsByComponent: new Map(\n [...structure.fieldsByComponent].map(([id, field]) => [\n id,\n { ...field },\n ]),\n ),\n tabsByComponent: new Map(\n [...structure.tabsByComponent].map(([id, tabs]) => [\n id,\n tabs.map((tab) => ({ ...tab })),\n ]),\n ),\n },\n ]),\n );\n}\n\nfunction ensureOptionalCoverageSkipActionMessages(\n messages: readonly unknown[],\n surfaceId: string,\n): readonly unknown[] {\n for (let index = 0; index < messages.length; index += 1) {\n const message = messages[index];\n if (!isRecord(message) || !isRecord(message.updateComponents)) {\n continue;\n }\n const update = message.updateComponents;\n if (update.surfaceId !== surfaceId || !Array.isArray(update.components)) {\n continue;\n }\n const submit = update.components.find(\n (component) =>\n isRecord(component) &&\n isNonEmptyString(component.id) &&\n hasActionName(component, \"flow.submit\"),\n );\n if (!isRecord(submit) || !isNonEmptyString(submit.id)) {\n return messages;\n }\n const optionalCoverageField = optionalCoverageFieldName(\n update.components,\n submit.id,\n );\n if (optionalCoverageField === undefined) {\n continue;\n }\n const patchedSubmit = submitActionWithDefaultUnknown(\n submit,\n optionalCoverageField,\n );\n const hasSkip = update.components.some((component) =>\n hasActionName(component, \"flow.skip\"),\n );\n if (hasSkip && patchedSubmit === submit) {\n return messages;\n }\n if (hasSkip) {\n const nextMessages = [...messages];\n nextMessages[index] = {\n ...message,\n updateComponents: {\n ...update,\n components: update.components.map((component) =>\n component === submit ? patchedSubmit : component,\n ),\n },\n };\n return nextMessages;\n }\n const parent = update.components.find(\n (component) =>\n isRecord(component) &&\n Array.isArray(component.children) &&\n component.children.includes(submit.id),\n );\n if (!isRecord(parent) || !Array.isArray(parent.children)) {\n return messages;\n }\n\n const labelId = `${submit.id}:optional-skip-label`;\n const buttonId = `${submit.id}:optional-skip`;\n if (\n update.components.some(\n (component) =>\n isRecord(component) &&\n (component.id === labelId || component.id === buttonId),\n )\n ) {\n return messages;\n }\n\n const nextParent = {\n ...parent,\n children: parent.children.flatMap((child) =>\n child === submit.id ? [child, buttonId] : [child],\n ),\n };\n const nextComponents = update.components.map((component) =>\n component === parent\n ? nextParent\n : component === submit\n ? patchedSubmit\n : component,\n );\n nextComponents.push(\n {\n id: labelId,\n component: \"Text\",\n text: \"Skip\",\n },\n {\n id: buttonId,\n component: \"Button\",\n child: labelId,\n action: {\n event: {\n name: \"flow.submit\",\n context: { [optionalCoverageField]: \"unknown\" },\n },\n },\n },\n );\n\n const nextMessages = [...messages];\n nextMessages[index] = {\n ...message,\n updateComponents: {\n ...update,\n components: nextComponents,\n },\n };\n return nextMessages;\n }\n return messages;\n}\n\nfunction removeListAddActionMessages(\n messages: readonly unknown[],\n surfaceId: string,\n): readonly unknown[] {\n for (let index = 0; index < messages.length; index += 1) {\n const message = messages[index];\n if (!isRecord(message) || !isRecord(message.updateComponents)) {\n continue;\n }\n const update = message.updateComponents;\n if (update.surfaceId !== surfaceId || !Array.isArray(update.components)) {\n continue;\n }\n const addIds = listAddComponentIds(update.components);\n if (addIds.size === 0) {\n continue;\n }\n const nextMessages = [...messages];\n nextMessages[index] = {\n ...message,\n updateComponents: {\n ...update,\n components: update.components\n .filter(\n (component) =>\n !(\n isRecord(component) &&\n isNonEmptyString(component.id) &&\n addIds.has(component.id)\n ),\n )\n .map((component) =>\n removeComponentChildren(component, addIds),\n ),\n },\n };\n return nextMessages;\n }\n return messages;\n}\n\nfunction listAddComponentIds(components: readonly unknown[]): Set<string> {\n const ids = new Set<string>();\n for (const component of components) {\n if (\n !isRecord(component) ||\n !isNonEmptyString(component.id) ||\n !hasActionName(component, \"flow.list.add\")\n ) {\n continue;\n }\n ids.add(component.id);\n const child = component.child;\n if (typeof child === \"string\" && child.length > 0) {\n ids.add(child);\n }\n }\n return ids;\n}\n\nfunction removeComponentChildren(\n component: unknown,\n removedIds: ReadonlySet<string>,\n): unknown {\n if (!isRecord(component) || !Array.isArray(component.children)) {\n return component;\n }\n const children = component.children.filter(\n (child) => typeof child !== \"string\" || !removedIds.has(child),\n );\n return children.length === component.children.length\n ? component\n : { ...component, children };\n}\n\nfunction submitActionWithDefaultUnknown(\n submit: Record<string, unknown>,\n field:\n | \"current_coverage_type\"\n | \"employer_union_coverage\"\n | \"va_tricare_benefits\",\n): Record<string, unknown> {\n if (!isRecord(submit.action) || !isRecord(submit.action.event)) {\n return submit;\n }\n const event = submit.action.event;\n const context = isRecord(event.context) ? event.context : {};\n if (Object.hasOwn(context, field)) {\n return submit;\n }\n return {\n ...submit,\n action: {\n ...submit.action,\n event: {\n ...event,\n context: {\n ...context,\n [field]: \"unknown\",\n },\n },\n },\n };\n}\n\nfunction optionalCoverageFieldName(\n components: readonly unknown[],\n submitId: string,\n):\n | \"current_coverage_type\"\n | \"employer_union_coverage\"\n | \"va_tricare_benefits\"\n | undefined {\n const statePrefix = componentStatePrefix(submitId);\n if (statePrefix !== undefined) {\n const stateField = optionalCoverageFieldFromFieldBindings(\n components.filter(\n (component) =>\n isRecord(component) &&\n isNonEmptyString(component.id) &&\n component.id.startsWith(`${statePrefix}:`),\n ),\n );\n if (stateField !== undefined) {\n return stateField;\n }\n }\n\n const parent = components.find(\n (component) =>\n isRecord(component) &&\n Array.isArray(component.children) &&\n component.children.includes(submitId),\n );\n if (isRecord(parent) && Array.isArray(parent.children)) {\n const childIds = new Set(parent.children.filter(isNonEmptyString));\n const childField = optionalCoverageFieldFromFieldBindings(\n components.filter(\n (component) =>\n isRecord(component) &&\n isNonEmptyString(component.id) &&\n childIds.has(component.id),\n ),\n );\n if (childField !== undefined) {\n return childField;\n }\n }\n\n return undefined;\n}\n\nfunction componentStatePrefix(componentId: string): string | undefined {\n const marker = \":action:\";\n const markerIndex = componentId.indexOf(marker);\n if (markerIndex > 0) {\n return componentId.slice(0, markerIndex);\n }\n const fallbackIndex = componentId.lastIndexOf(\":\");\n return fallbackIndex > 0 ? componentId.slice(0, fallbackIndex) : undefined;\n}\n\nfunction optionalCoverageFieldFromFieldBindings(\n components: readonly unknown[],\n):\n | \"current_coverage_type\"\n | \"employer_union_coverage\"\n | \"va_tricare_benefits\"\n | undefined {\n const normalized = components\n .flatMap((component) => componentFieldSearchText(component))\n .map(normalizeSearchText)\n .join(\" \");\n if (\n normalized.includes(\"vatricarebenefits\") ||\n normalized.includes(\"coveragevatricarebenefits\") ||\n normalized.includes(\"tricareorchampvabenefits\") ||\n normalized.includes(\"vachampvabenefits\")\n ) {\n return \"va_tricare_benefits\";\n }\n if (\n normalized.includes(\"employerunioncoverage\") ||\n normalized.includes(\"coverageemployerunioncoverage\")\n ) {\n return \"employer_union_coverage\";\n }\n if (\n normalized.includes(\"currentcoveragetype\") ||\n normalized.includes(\"coveragecurrentcoveragetype\")\n ) {\n return \"current_coverage_type\";\n }\n return undefined;\n}\n\nfunction componentFieldSearchText(component: unknown): string[] {\n if (!isRecord(component)) {\n return [];\n }\n const values: string[] = [];\n for (const key of [\"label\", \"field\"] as const) {\n const value = component[key];\n if (typeof value === \"string\") {\n values.push(value);\n }\n }\n const value = component.value;\n if (isRecord(value) && typeof value.path === \"string\") {\n values.push(value.path);\n }\n return values;\n}\n\nfunction normalizeSearchText(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction hasActionName(component: unknown, actionName: string): boolean {\n if (!isRecord(component) || !isRecord(component.action)) {\n return false;\n }\n const event = component.action.event;\n return isRecord(event) && event.name === actionName;\n}\n\nfunction updateSurfaceStructures(\n messages: readonly unknown[],\n structures: Map<string, MutableSurfaceStructure>,\n): Map<string, MutableSurfaceStructure> {\n for (const message of messages) {\n if (!isRecord(message)) {\n continue;\n }\n const deletion = message.deleteSurface;\n if (isRecord(deletion) && isNonEmptyString(deletion.surfaceId)) {\n structures.delete(deletion.surfaceId);\n continue;\n }\n const creation = message.createSurface;\n if (isRecord(creation) && isNonEmptyString(creation.surfaceId)) {\n structures.set(creation.surfaceId, emptySurfaceStructure());\n }\n const update = message.updateComponents;\n if (\n !isRecord(update) ||\n !isNonEmptyString(update.surfaceId) ||\n !Array.isArray(update.components)\n ) {\n continue;\n }\n const structure =\n structures.get(update.surfaceId) ?? emptySurfaceStructure();\n structures.set(update.surfaceId, structure);\n for (const component of update.components) {\n if (!isRecord(component) || !isNonEmptyString(component.id)) {\n continue;\n }\n structure.fieldsByComponent.delete(component.id);\n structure.tabsByComponent.delete(component.id);\n const field = fieldDescriptor(component);\n if (field !== undefined) {\n structure.fieldsByComponent.set(component.id, field);\n }\n const tabs = tabDescriptors(component);\n if (tabs.length > 0) {\n structure.tabsByComponent.set(component.id, tabs);\n }\n }\n }\n return structures;\n}\n\nfunction pruneSurfaceStructures(\n structures: Map<string, MutableSurfaceStructure>,\n processor: MessageProcessor<ReactComponentImplementation>,\n): void {\n for (const [surfaceId, structure] of structures) {\n const surface = processor.model.getSurface(surfaceId);\n if (surface === undefined) {\n structures.delete(surfaceId);\n continue;\n }\n const componentIds = new Set(\n [...surface.componentsModel.entries].map(([componentId]) => componentId),\n );\n for (const componentId of structure.fieldsByComponent.keys()) {\n if (!componentIds.has(componentId)) {\n structure.fieldsByComponent.delete(componentId);\n }\n }\n for (const componentId of structure.tabsByComponent.keys()) {\n if (!componentIds.has(componentId)) {\n structure.tabsByComponent.delete(componentId);\n }\n }\n }\n}\n\nfunction fieldInteractionBindingsTrusted(\n groups: readonly A2UIFieldInteractionGroup[],\n structure: MutableSurfaceStructure | undefined,\n): boolean {\n if (groups.length === 0) {\n return true;\n }\n if (structure === undefined) {\n return false;\n }\n return groups.every((group) =>\n group.fields.every((binding) => {\n const field = structure.fieldsByComponent.get(binding.componentId);\n return field?.field === binding.field;\n }),\n );\n}\n\nfunction fieldDescriptor(\n component: Record<string, unknown>,\n): A2UIFieldDescriptor | undefined {\n const controls: Record<string, A2UIFieldControl> = {\n TextField: \"text\",\n DateTimeInput: \"date\",\n ChoicePicker: \"choice\",\n };\n const control =\n typeof component.component === \"string\"\n ? controls[component.component]\n : undefined;\n const componentId = isNonEmptyString(component.id) ? component.id : undefined;\n const value = component.value;\n const field =\n isRecord(value) && typeof value.path === \"string\"\n ? fieldFromPointer(value.path) ?? listFieldFromComponentId(componentId)\n : listFieldFromComponentId(componentId);\n if (\n control === undefined ||\n field === undefined ||\n componentId === undefined\n ) {\n return undefined;\n }\n return {\n componentId,\n field,\n label:\n typeof component.label === \"string\" && component.label.length > 0\n ? component.label\n : field,\n control,\n required: hasRequiredCheck(component.checks),\n ...(typeof component.validationRegexp === \"string\"\n ? { validationRegexp: component.validationRegexp }\n : {}),\n ...(typeof component.max === \"string\" ? { max: component.max } : {}),\n };\n}\n\nfunction normalizeChoiceValuesInMessages(\n messages: readonly unknown[],\n surfaceId: string,\n structure: MutableSurfaceStructure | undefined,\n): unknown[] {\n if (structure === undefined) {\n return [...messages];\n }\n const choiceFields = new Set(\n [...structure.fieldsByComponent.values()]\n .filter((field) => field.control === \"choice\")\n .map((field) => field.field),\n );\n if (choiceFields.size === 0) {\n return [...messages];\n }\n return messages.map((message) => {\n if (!isRecord(message) || !isRecord(message.updateDataModel)) {\n return message;\n }\n const update = message.updateDataModel;\n if (update.surfaceId !== surfaceId) {\n return message;\n }\n const path = typeof update.path === \"string\" ? update.path : \"/\";\n if (path === \"/\" && isRecord(update.value)) {\n const value = cloneJsonRecord(update.value);\n for (const field of choiceFields) {\n if (Object.hasOwn(value, field)) {\n value[field] = choiceDataModelValue(value[field]);\n }\n }\n return {\n ...message,\n updateDataModel: { ...update, value },\n };\n }\n const field = fieldFromPointer(path);\n if (field !== undefined && choiceFields.has(field)) {\n return {\n ...message,\n updateDataModel: {\n ...update,\n value: choiceDataModelValue(update.value),\n },\n };\n }\n return message;\n });\n}\n\nfunction choiceDataModelValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n return value.length === 0 ? [] : [value];\n }\n return value;\n}\n\nfunction hasRequiredCheck(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.some(\n (check) =>\n isRecord(check) &&\n isRecord(check.condition) &&\n check.condition.call === \"required\",\n )\n );\n}\n\nfunction listFieldFromComponentId(\n componentId: string | undefined,\n): string | undefined {\n if (componentId === undefined) {\n return undefined;\n }\n const markers = [\":list-new:field:\", \":list-row:field:\"];\n for (const marker of markers) {\n const markerIndex = componentId.indexOf(marker);\n if (markerIndex < 0) {\n continue;\n }\n const field = componentId.slice(markerIndex + marker.length);\n return field.length > 0 ? field : undefined;\n }\n return undefined;\n}\n\nfunction fieldFromPointer(path: string): string | undefined {\n if (!path.startsWith(\"/\") || path.length < 2 || path.slice(1).includes(\"/\")) {\n return undefined;\n }\n return path.slice(1).replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n}\n\nfunction fieldPointer(field: string): string {\n return `/${field.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\")}`;\n}\n\nfunction mergePersistedListRowsIntoMessages(\n messages: readonly unknown[],\n surfaceId: string,\n persistedRowsByPath: ReadonlyMap<string, unknown[]>,\n deletedItemIdsByPath: ReadonlyMap<string, ReadonlySet<string>>,\n optimisticRowsByPath: ReadonlyMap<\n string,\n ReadonlyMap<string, Record<string, unknown>>\n >,\n): unknown[] {\n if (\n persistedRowsByPath.size === 0 &&\n deletedItemIdsByPath.size === 0 &&\n optimisticRowsByPath.size === 0\n ) {\n return [...messages];\n }\n let mergedRoot = false;\n const mergedMessages = messages.map((message) => {\n if (!isRootDataModelUpdate(message, surfaceId)) {\n return message;\n }\n mergedRoot = true;\n return {\n ...message,\n updateDataModel: {\n ...message.updateDataModel,\n value: mergePersistedListRowsIntoRoot(\n message.updateDataModel.value,\n persistedRowsByPath,\n deletedItemIdsByPath,\n optimisticRowsByPath,\n ),\n },\n };\n });\n if (mergedRoot) {\n return mergedMessages;\n }\n return [\n ...mergedMessages,\n {\n version: \"v0.9\",\n updateDataModel: {\n surfaceId,\n path: \"/\",\n value: mergePersistedListRowsIntoRoot(\n {},\n persistedRowsByPath,\n deletedItemIdsByPath,\n optimisticRowsByPath,\n ),\n },\n },\n ];\n}\n\nfunction mergePersistedListRowsIntoRoot(\n root: Record<string, unknown>,\n persistedRowsByPath: ReadonlyMap<string, unknown[]>,\n deletedItemIdsByPath: ReadonlyMap<string, ReadonlySet<string>>,\n optimisticRowsByPath: ReadonlyMap<\n string,\n ReadonlyMap<string, Record<string, unknown>>\n >,\n): Record<string, unknown> {\n const merged = cloneJsonRecord(root);\n for (const listPath of new Set([\n ...persistedRowsByPath.keys(),\n ...deletedItemIdsByPath.keys(),\n ...optimisticRowsByPath.keys(),\n ])) {\n const rows = persistedRowsByPath.get(listPath) ?? [];\n const optimisticRows = optimisticRowsByPath.get(listPath);\n const dottedRows = merged[listPath];\n const nestedRows = getNestedValue(merged, listPath);\n const incomingRows = Array.isArray(dottedRows)\n ? dottedRows\n : Array.isArray(nestedRows)\n ? nestedRows\n : undefined;\n const shouldPreserveCachedRows =\n rows.length > 0 &&\n (incomingRows === undefined ||\n (incomingRows.length === 0 &&\n (!hasListDraft(merged, listPath) ||\n hasBlankListDraft(merged, listPath))));\n const effectiveRows = shouldPreserveCachedRows\n ? rows\n : incomingRows ?? rows;\n const optimisticEffectiveRows = mergeOptimisticListRows(\n effectiveRows,\n optimisticRows,\n );\n const visibleRows = filterDeletedListRows(\n optimisticEffectiveRows,\n deletedItemIdsByPath.get(listPath),\n );\n const normalizedRows = normalizeListRows(listPath, visibleRows);\n merged[listPath] = cloneJsonArray(normalizedRows);\n setNestedValue(merged, listPath, cloneJsonArray(normalizedRows));\n }\n return merged;\n}\n\nfunction hasBlankListDraft(root: Record<string, unknown>, listPath: string): boolean {\n const drafts = root.__listDrafts;\n if (!isRecord(drafts)) {\n return false;\n }\n const draft = drafts[listPath];\n if (!isRecord(draft)) {\n return false;\n }\n return Object.values(draft).every(isBlankDraftValue);\n}\n\nfunction hasListDraft(root: Record<string, unknown>, listPath: string): boolean {\n const drafts = root.__listDrafts;\n return isRecord(drafts) && isRecord(drafts[listPath]);\n}\n\nfunction isBlankDraftValue(value: unknown): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n if (typeof value === \"string\") {\n return value.trim().length === 0;\n }\n if (Array.isArray(value)) {\n return value.length === 0 || value.every(isBlankDraftValue);\n }\n return false;\n}\n\nfunction mergeOptimisticListRows(\n rows: readonly unknown[],\n optimisticRows: ReadonlyMap<string, Record<string, unknown>> | undefined,\n): unknown[] {\n if (optimisticRows === undefined || optimisticRows.size === 0) {\n return cloneJsonArray(rows);\n }\n let merged = cloneJsonArray(rows);\n for (const row of optimisticRows.values()) {\n merged = upsertListRow(merged, cloneJsonRecord(row));\n }\n return merged;\n}\n\nfunction rememberPersistedListRows(\n persistedRowsByPath: Map<string, unknown[]>,\n deletedItemIdsByPath: ReadonlyMap<string, ReadonlySet<string>>,\n root: unknown,\n): void {\n if (!isRecord(root)) {\n return;\n }\n for (const [listPath, rows] of listRowsFromRoot(root)) {\n const visibleRows = filterDeletedListRows(\n rows,\n deletedItemIdsByPath.get(listPath),\n );\n persistedRowsByPath.set(\n listPath,\n normalizeListRows(listPath, visibleRows),\n );\n }\n}\n\nfunction normalizeListRows(\n listPath: string,\n rows: readonly unknown[],\n): unknown[] {\n const clonedRows = cloneJsonArray(rows);\n if (listPath !== \"needs.providers\") {\n return clonedRows;\n }\n return clonedRows.map((row) =>\n isRecord(row) ? normalizeProviderRow(row) : row,\n );\n}\n\nfunction normalizeProviderRow(\n row: Readonly<Record<string, unknown>>,\n fallback?: Readonly<Record<string, unknown>>,\n): Record<string, unknown> {\n const normalized = cloneJsonRecord(row);\n const name =\n firstProviderName(normalized) ??\n (fallback === undefined ? undefined : firstProviderName(fallback));\n const location =\n firstProviderLocation(normalized) ??\n (fallback === undefined ? undefined : firstProviderLocation(fallback));\n if (\n normalized.primary_care_provider === undefined &&\n name !== undefined\n ) {\n normalized.primary_care_provider = name;\n }\n if (\n normalized.primary_care_provider_location === undefined &&\n location !== undefined\n ) {\n normalized.primary_care_provider_location = location;\n }\n if (\n name !== undefined &&\n location !== undefined &&\n typeof normalized.__displayText === \"string\" &&\n !normalized.__displayText.includes(location)\n ) {\n normalized.__displayText = `${normalized.__displayText} | Provider Location: ${location}`;\n } else if (\n normalized.__displayText === undefined &&\n (name !== undefined || location !== undefined)\n ) {\n normalized.__displayText = [\n name === undefined ? undefined : `Provider Name: ${name}`,\n location === undefined ? undefined : `Provider Location: ${location}`,\n ]\n .filter((part): part is string => part !== undefined)\n .join(\" | \");\n }\n return normalized;\n}\n\nfunction submittedProviderRowFromEvent(\n event: A2UIRendererActionEvent,\n): Record<string, unknown> | undefined {\n if (event.actionName !== \"flow.submit\") {\n return undefined;\n }\n const listPath = event.context.listPath;\n if (listPath !== \"needs.providers\") {\n return undefined;\n }\n const name = firstProviderName(event.context);\n const location = firstProviderLocation(event.context);\n if (name === undefined && location === undefined) {\n return undefined;\n }\n return {\n itemId: \"submitted-primary-care-provider\",\n ...(name === undefined ? {} : { primary_care_provider: name }),\n ...(location === undefined\n ? {}\n : { primary_care_provider_location: location }),\n __displayText: [\n name === undefined ? undefined : `Provider Name: ${name}`,\n location === undefined ? undefined : `Provider Location: ${location}`,\n ]\n .filter((part): part is string => part !== undefined)\n .join(\" | \"),\n };\n}\n\nfunction clearSubmittedProviderDraft(\n dataModel: { set(path: string, value: unknown): void },\n context: Readonly<Record<string, unknown>>,\n): void {\n for (const key of Object.keys(context)) {\n if (key === \"listPath\") {\n continue;\n }\n if (\n firstTextField(context, [key]) === undefined ||\n !isProviderSubmitField(key)\n ) {\n continue;\n }\n dataModel.set(`/__listDrafts/needs.providers/${key}`, \"\");\n }\n}\n\nfunction removeSubmittedProviderDraftControls(\n entries: IterableIterator<\n [string, { type: string; properties: Record<string, unknown> }]\n >,\n fieldPaths: ReadonlySet<string>,\n context: Readonly<Record<string, unknown>>,\n): void {\n const components = [...entries];\n const controlIds = new Set<string>();\n for (const [id, component] of components) {\n if (\n component.type === \"Button\" &&\n isProviderSubmitButton(component, context)\n ) {\n controlIds.add(id);\n const child = component.properties.child;\n if (typeof child === \"string\") {\n controlIds.add(child);\n }\n continue;\n }\n if (component.type !== \"TextField\") {\n continue;\n }\n const value = component.properties.value;\n const label = component.properties.label;\n if (\n (isRecord(value) &&\n typeof value.path === \"string\" &&\n (fieldPaths.has(value.path) || isProviderDraftFieldPath(value.path))) ||\n (typeof label === \"string\" && isProviderSubmitLabel(label))\n ) {\n controlIds.add(id);\n }\n }\n\n let changed = true;\n while (changed) {\n changed = false;\n for (const [id, component] of components) {\n if (controlIds.has(id) || component.type === \"Column\") {\n continue;\n }\n const children = component.properties.children;\n if (\n Array.isArray(children) &&\n children.length > 0 &&\n children.every(\n (child) => typeof child === \"string\" && controlIds.has(child),\n )\n ) {\n controlIds.add(id);\n changed = true;\n }\n }\n }\n\n for (const [, component] of components) {\n const children = component.properties.children;\n if (!Array.isArray(children)) {\n continue;\n }\n const nextChildren = children.filter(\n (child) => typeof child !== \"string\" || !controlIds.has(child),\n );\n if (nextChildren.length === children.length) {\n continue;\n }\n component.properties = {\n ...component.properties,\n children: nextChildren,\n };\n }\n}\n\nfunction isProviderSubmitButton(\n component: { properties: Record<string, unknown> },\n context: Readonly<Record<string, unknown>>,\n): boolean {\n const action = component.properties.action;\n if (!isRecord(action) || !isRecord(action.event)) {\n return false;\n }\n const event = action.event;\n return (\n event.name === \"flow.submit\" &&\n sameProviderSubmitContext(event.context, context)\n );\n}\n\nfunction sameProviderSubmitContext(\n candidate: unknown,\n context: Readonly<Record<string, unknown>>,\n): boolean {\n if (\n !isRecord(candidate) ||\n (candidate.listPath !== \"needs.providers\" && !hasProviderSubmitFields(candidate))\n ) {\n return false;\n }\n for (const key of Object.keys(context)) {\n if (key === \"listPath\" || !isProviderSubmitField(key)) {\n continue;\n }\n if (!(key in candidate)) {\n return false;\n }\n }\n return true;\n}\n\nfunction hasProviderSubmitFields(context: Readonly<Record<string, unknown>>): boolean {\n return Object.keys(context).some(\n (key) => key !== \"listPath\" && isProviderSubmitField(key),\n );\n}\n\nfunction isProviderSubmitField(key: string): boolean {\n return new Set([\n \"primary_care_provider\",\n \"primaryCareProvider\",\n \"primary_provider\",\n \"primaryProvider\",\n \"primary_care_doctor\",\n \"primaryCareDoctor\",\n \"pcp\",\n \"providerName\",\n \"provider_name\",\n \"displayName\",\n \"display_name\",\n \"name\",\n \"primary_care_provider_location\",\n \"primaryCareProviderLocation\",\n \"provider_location\",\n \"providerLocation\",\n \"location_details\",\n \"locationDetails\",\n \"office_location\",\n \"officeLocation\",\n \"practice_location\",\n \"practiceLocation\",\n \"location\",\n \"address\",\n ]).has(key);\n}\n\nfunction eventSourceFieldPaths(\n context: Readonly<Record<string, unknown>>,\n): ReadonlySet<string> {\n const paths = new Set<string>();\n for (const [key, value] of Object.entries(context)) {\n if (key === \"listPath\" || !isProviderSubmitField(key) || !isRecord(value)) {\n continue;\n }\n const path = value.path;\n if (typeof path === \"string\") {\n paths.add(path);\n }\n }\n return paths;\n}\n\nfunction isProviderDraftFieldPath(path: string): boolean {\n const prefix = \"/__listDrafts/needs.providers/\";\n const field = path.startsWith(prefix) ? path.slice(prefix.length) : lastPathSegment(path);\n return field !== undefined && isProviderSubmitField(field);\n}\n\nfunction lastPathSegment(path: string): string | undefined {\n const normalized = path.trim().replaceAll(\"\\\\\", \"/\");\n const index = normalized.lastIndexOf(\"/\");\n const segment = index >= 0 ? normalized.slice(index + 1) : normalized;\n return segment.length > 0 ? segment : undefined;\n}\n\nfunction isProviderSubmitLabel(label: string): boolean {\n switch (normalizeFieldKey(label)) {\n case \"provider_name\":\n case \"primary_care_provider\":\n case \"primary_care_provider_name\":\n case \"provider_location\":\n case \"primary_care_provider_location\":\n case \"location_details\":\n return true;\n default:\n return false;\n }\n}\n\nfunction normalizeFieldKey(key: string): string {\n return key\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"_\")\n .replaceAll(/^_+|_+$/g, \"\");\n}\n\nfunction updateListRowFromContext(\n context: Readonly<Record<string, unknown>>,\n existingRow: unknown,\n): Record<string, unknown> | undefined {\n const itemId = context.itemId;\n if (typeof itemId !== \"string\" || itemId.length === 0) {\n return undefined;\n }\n const row = isRecord(existingRow) ? cloneJsonRecord(existingRow) : {};\n row.itemId = itemId;\n let hasUpdate = false;\n for (const [key, value] of Object.entries(context)) {\n if (key === \"listPath\" || key === \"itemId\" || !isFieldValue(value)) {\n continue;\n }\n row[key] = value;\n hasUpdate = true;\n }\n if (!hasUpdate) {\n return undefined;\n }\n row.__displayText = listRowDisplayText(row);\n return row;\n}\n\nfunction listRowDisplayText(row: Readonly<Record<string, unknown>>): string {\n return Object.entries(row)\n .filter(([key, value]) => {\n if (key === \"itemId\" || key === \"__displayText\" || value === null) {\n return false;\n }\n return isFieldValue(value) && String(value).trim().length > 0;\n })\n .map(([key, value]) => `${key}: ${String(value).trim()}`)\n .join(\" | \");\n}\n\nfunction upsertListRow(rows: unknown[], row: Record<string, unknown>): unknown[] {\n const itemId = row.itemId;\n if (typeof itemId !== \"string\" || itemId.length === 0) {\n return [...rows, row];\n }\n const next = [...rows];\n const existing = next.findIndex(\n (candidate) => isRecord(candidate) && candidate.itemId === itemId,\n );\n if (existing >= 0) {\n next[existing] = row;\n return next;\n }\n return [...next, row];\n}\n\nfunction removeListRowByItemId(rows: unknown[], itemId: string): unknown[] {\n return rows.filter(\n (row) => !isRecord(row) || row.itemId !== itemId,\n );\n}\n\nfunction rememberDeletedListItemId(\n deletedItemIdsByPath: Map<string, Set<string>>,\n listPath: string,\n itemId: string,\n): void {\n const deleted = deletedItemIdsByPath.get(listPath) ?? new Set<string>();\n deleted.add(itemId);\n deletedItemIdsByPath.set(listPath, deleted);\n}\n\nfunction filterDeletedListRows(\n rows: readonly unknown[],\n deletedItemIds: ReadonlySet<string> | undefined,\n): unknown[] {\n const clonedRows = cloneJsonArray(rows);\n if (deletedItemIds === undefined || deletedItemIds.size === 0) {\n return clonedRows;\n }\n return clonedRows.filter(\n (row) => !isRecord(row) || !deletedItemIds.has(stringRowItemId(row)),\n );\n}\n\nfunction stringRowItemId(row: Readonly<Record<string, unknown>>): string {\n const itemId = row.itemId;\n return typeof itemId === \"string\" ? itemId : \"\";\n}\n\nconst PROVIDER_NAME_FIELDS = new Set([\n \"primary_care_provider\",\n \"primarycareprovider\",\n \"primary_care_provider_name\",\n \"primarycareprovidername\",\n \"primary_provider\",\n \"primaryprovider\",\n \"primary_provider_name\",\n \"primaryprovidername\",\n \"primary_care_doctor\",\n \"primarycaredoctor\",\n \"primary_care_doctor_name\",\n \"primarycaredoctorname\",\n \"pcp\",\n \"pcp_name\",\n \"pcpname\",\n \"provider\",\n \"provider_name\",\n \"providername\",\n \"display_name\",\n \"displayname\",\n \"name\",\n]);\n\nconst PROVIDER_LOCATION_FIELDS = new Set([\n \"primary_care_provider_location\",\n \"primarycareproviderlocation\",\n \"primary_provider_location\",\n \"primaryproviderlocation\",\n \"primary_care_location\",\n \"primarycarelocation\",\n \"primary_care_doctor_location\",\n \"primarycaredoctorlocation\",\n \"pcp_location\",\n \"pcplocation\",\n \"provider_location\",\n \"providerlocation\",\n \"provider_location_details\",\n \"providerlocationdetails\",\n \"location\",\n \"location_details\",\n \"locationdetails\",\n \"office_location\",\n \"officelocation\",\n \"practice_location\",\n \"practicelocation\",\n \"provider_address\",\n \"provideraddress\",\n \"address\",\n \"city_state\",\n \"citystate\",\n]);\n\nfunction firstProviderName(\n source: Readonly<Record<string, unknown>>,\n): string | undefined {\n return firstTextByNormalizedField(source, PROVIDER_NAME_FIELDS);\n}\n\nfunction firstProviderLocation(\n source: Readonly<Record<string, unknown>>,\n): string | undefined {\n return firstTextByNormalizedField(source, PROVIDER_LOCATION_FIELDS);\n}\n\nfunction firstTextByNormalizedField(\n source: Readonly<Record<string, unknown>>,\n fields: ReadonlySet<string>,\n): string | undefined {\n for (const [key, value] of Object.entries(source)) {\n if (!fields.has(normalizeFieldKey(key))) {\n continue;\n }\n const text = scalarText(value);\n if (text !== undefined) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction scalarText(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n const text = value.trim();\n return text.length > 0 ? text : undefined;\n }\n if (!isRecord(value)) {\n return undefined;\n }\n return firstTextField(value, [\n \"value\",\n \"displayValue\",\n \"display_value\",\n \"text\",\n \"answer\",\n \"label\",\n ]);\n}\n\nfunction firstTextField(\n source: Readonly<Record<string, unknown>>,\n keys: readonly string[],\n): string | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value !== \"string\") {\n continue;\n }\n const text = value.trim();\n if (text.length > 0) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction listRowsFromRoot(root: Record<string, unknown>): Map<string, unknown[]> {\n const rowsByPath = new Map<string, unknown[]>();\n for (const [key, value] of Object.entries(root)) {\n if (key.includes(\".\") && Array.isArray(value)) {\n rowsByPath.set(key, cloneJsonArray(value));\n }\n }\n collectNestedListRows(root, [], rowsByPath);\n return rowsByPath;\n}\n\nfunction collectNestedListRows(\n value: unknown,\n path: string[],\n rowsByPath: Map<string, unknown[]>,\n): void {\n if (Array.isArray(value)) {\n if (path.length > 1) {\n rowsByPath.set(path.join(\".\"), cloneJsonArray(value));\n }\n return;\n }\n if (!isRecord(value)) {\n return;\n }\n for (const [key, child] of Object.entries(value)) {\n if (key === \"__listDrafts\") {\n continue;\n }\n collectNestedListRows(child, [...path, key], rowsByPath);\n }\n}\n\nfunction isRootDataModelUpdate(\n message: unknown,\n surfaceId: string,\n): message is {\n updateDataModel: { surfaceId: string; path?: string; value: Record<string, unknown> };\n} {\n return (\n isRecord(message) &&\n isRecord(message.updateDataModel) &&\n message.updateDataModel.surfaceId === surfaceId &&\n (message.updateDataModel.path === undefined ||\n message.updateDataModel.path === \"/\") &&\n isRecord(message.updateDataModel.value)\n );\n}\n\nfunction getNestedValue(root: Record<string, unknown>, listPath: string): unknown {\n let current: unknown = root;\n for (const segment of listPath.split(\".\")) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction setNestedValue(\n root: Record<string, unknown>,\n listPath: string,\n value: unknown[],\n): void {\n const segments = listPath.split(\".\");\n let current = root;\n for (const segment of segments.slice(0, -1)) {\n const next = current[segment];\n if (isRecord(next)) {\n current = next;\n continue;\n }\n const created: Record<string, unknown> = {};\n current[segment] = created;\n current = created;\n }\n const leaf = segments.at(-1);\n if (leaf !== undefined) {\n current[leaf] = value;\n }\n}\n\nfunction cloneJsonRecord(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return JSON.parse(JSON.stringify(value)) as Record<string, unknown>;\n}\n\nfunction cloneJsonArray(value: readonly unknown[]): unknown[] {\n return JSON.parse(JSON.stringify(value)) as unknown[];\n}\n\nfunction isFieldValue(value: unknown): value is A2UIFieldValue {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\n/**\n * Fields of an already-rendered surface that the candidate processor fills\n * with a different, non-empty value. The candidate replays the committed data\n * model first, so local edits carry over and only server changes differ;\n * cleared fields are skipped because a root data-model replacement briefly\n * clears unsaved drafts that the session controller restores.\n */\nfunction changedFieldNames(\n previous: MessageProcessor<ReactComponentImplementation>,\n candidate: MessageProcessor<ReactComponentImplementation>,\n surfaceId: string,\n structure: MutableSurfaceStructure | undefined,\n): string[] {\n const before = previous.model.getSurface(surfaceId);\n const after = candidate.model.getSurface(surfaceId);\n if (before === undefined || after === undefined || structure === undefined) {\n return [];\n }\n const fields = new Set<string>();\n for (const { field } of structure.fieldsByComponent.values()) {\n const path = fieldPointer(field);\n const next = after.dataModel.get(path);\n if (\n hasFieldValue(next) &&\n !fieldValueEquivalent(before.dataModel.get(path), next)\n ) {\n fields.add(field);\n }\n }\n return [...fields];\n}\n\nfunction hasFieldValue(value: unknown): boolean {\n return Array.isArray(value)\n ? value.length > 0\n : value !== undefined && value !== null && value !== \"\";\n}\n\nfunction fieldValueEquivalent(left: unknown, right: unknown): boolean {\n if (Array.isArray(left) && Array.isArray(right)) {\n return (\n left.length === right.length &&\n left.every((value, index) => Object.is(value, right[index]))\n );\n }\n return Object.is(left, right);\n}\n\nfunction tabDescriptors(\n component: Record<string, unknown>,\n): A2UITabDescriptor[] {\n if (\n component.component !== \"Tabs\" ||\n !isNonEmptyString(component.id) ||\n !Array.isArray(component.tabs)\n ) {\n return [];\n }\n const tabs: A2UITabDescriptor[] = [];\n for (const tab of component.tabs) {\n if (\n isRecord(tab) &&\n isNonEmptyString(tab.title) &&\n isNonEmptyString(tab.child)\n ) {\n tabs.push({\n componentId: component.id,\n title: tab.title,\n childId: tab.child,\n });\n }\n }\n return tabs;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction classifyProcessingError(error: unknown): ClientErrorCode {\n if (\n error instanceof A2uiError &&\n typeof error.message === \"string\" &&\n error.message.startsWith(\"Catalog not found\")\n ) {\n return \"catalog_unsupported\";\n }\n return \"message_malformed\";\n}\n","import { useId } from \"react\";\nimport { basicCatalog, createComponentImplementation } from \"@a2ui/react/v0_9\";\nimport { ChoicePickerApi } from \"@a2ui/web_core/v0_9/basic_catalog\";\n\nconst OriginalChoice = basicCatalog.components.get(\"ChoicePicker\")!.render;\nexport const HospitalChoice = createComponentImplementation(ChoicePickerApi, ({ props, context, buildChild }) => {\n const id = useId();\n if (props.label !== \"hospital_preference\") {\n return <OriginalChoice context={context} buildChild={buildChild} />;\n }\n const selected = Array.isArray(props.value) ? props.value[0] ?? \"\" : \"\";\n return <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"0.25rem\" }}>\n <label htmlFor={id}>Hospital preference</label>\n <select id={id} data-a2ui-field=\"hospital_preference\" value={selected} required\n style={{ padding: \"0.5rem\", border: \"var(--a2ui-border)\", borderRadius: \"var(--a2ui-border-radius)\" }}\n onChange={(event) => props.setValue(event.currentTarget.value ? [event.currentTarget.value] : [])}>\n <option value=\"\">Choose Prefer or Avoid</option>\n <option value=\"Prefer\">Prefer</option>\n <option value=\"Avoid\">Avoid</option>\n </select>\n </div>;\n});\n","import { useId, useLayoutEffect, useRef, useState, type CSSProperties } from \"react\";\nimport { createComponentImplementation } from \"@a2ui/react/v0_9\";\nimport { DateTimeInputApi } from \"@a2ui/web_core/v0_9/basic_catalog\";\n\ninterface DateProps {\n value: string;\n setValue: (value: string) => void;\n label?: string;\n min?: unknown;\n max?: unknown;\n}\nconst inputStyle: CSSProperties = {\n backgroundColor: \"var(--a2ui-datetimeinput-background, var(--a2ui-color-input, #fff))\",\n color: \"var(--a2ui-datetimeinput-color, var(--a2ui-color-on-input, #333))\",\n border: \"var(--a2ui-datetimeinput-border, var(--a2ui-border))\",\n borderRadius: \"var(--a2ui-datetimeinput-border-radius, var(--a2ui-border-radius))\",\n padding: \"var(--a2ui-datetimeinput-padding, var(--a2ui-spacing-s))\",\n boxSizing: \"border-box\",\n};\nconst labelStyle: CSSProperties = { fontSize: \"var(--a2ui-label-font-size, var(--a2ui-font-size-s))\", fontWeight: \"bold\" };\n\nexport function parseDateDraft(raw: string): string | null {\n const value = raw.trim();\n const iso = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n const us = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/.exec(value);\n if (!iso && !us) return null;\n const year = Number(iso ? iso[1] : us![3]);\n const month = Number(iso ? iso[2] : us![1]);\n const day = Number(iso ? iso[3] : us![2]);\n const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n const days = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n if (year < 1 || month < 1 || month > 12 || day < 1 || day > days[month - 1]!) return null;\n return `${String(year).padStart(4, \"0\")}-${String(month).padStart(2, \"0\")}-${String(day).padStart(2, \"0\")}`;\n}\n/**\n * Phone number pads (inputMode=\"numeric\") have no \"/\" key, so digits typed in\n * MM/DD/YYYY order get their slashes inserted as the caller types. Text that\n * doesn't follow that shape (\"1/2/1950\", ISO dates) is left as typed.\n */\nexport function formatDateDigits(raw: string): string {\n if (!/^(\\d*|\\d{2}\\/\\d*|\\d{2}\\/\\d{2}\\/\\d*)$/.test(raw)) return raw;\n const digits = raw.replace(/\\D/g, \"\").slice(0, 8);\n const typedSlash = raw.endsWith(\"/\") && (digits.length === 2 || digits.length === 4) ? \"/\" : \"\";\n if (digits.length <= 2) return digits + typedSlash;\n if (digits.length <= 4) return `${digits.slice(0, 2)}/${digits.slice(2)}${typedSlash}`;\n return `${digits.slice(0, 2)}/${digits.slice(2, 4)}/${digits.slice(4)}`;\n}\nfunction displayDate(value: string): string {\n const iso = parseDateDraft(value);\n return iso ? `${iso.slice(5, 7)}/${iso.slice(8, 10)}/${iso.slice(0, 4)}` : value;\n}\n\nfunction DateOnlyInput(props: DateProps) {\n const id = useId();\n const [draft, setDraft] = useState(() => displayDate(props.value || \"\"));\n const [pickerOpen, setPickerOpen] = useState(false);\n const published = useRef(props.value || \"\");\n const inputRef = useRef<HTMLInputElement>(null);\n const pickerRef = useRef<HTMLInputElement>(null);\n const min = typeof props.min === \"string\" ? props.min : undefined;\n const max = typeof props.max === \"string\" ? props.max : undefined;\n const parsed = parseDateDraft(draft);\n\n // Keep partial human text across render/model echoes, including empty model\n // values emitted while a date is incomplete. Only a different value replaces it.\n useLayoutEffect(() => {\n const incoming = props.value || \"\";\n if (incoming !== published.current) {\n published.current = incoming;\n setDraft(displayDate(incoming));\n }\n }, [props.value]);\n useLayoutEffect(() => {\n const message = draft.trim() && !parsed ? \"Enter a valid date in MM/DD/YYYY format.\"\n : parsed && min && parsed < min ? `Enter a date on or after ${displayDate(min)}.`\n : parsed && max && parsed > max ? `Enter a date on or before ${displayDate(max)}.` : \"\";\n inputRef.current?.setCustomValidity(message);\n }, [draft, parsed, min, max]);\n\n const update = (typed: string) => {\n const raw = formatDateDigits(typed);\n setDraft(raw);\n const value = parseDateDraft(raw) || \"\";\n published.current = value;\n props.setValue(value);\n };\n return (\n <div data-a2ui-date-editor=\"true\" style={{ display: \"flex\", flexDirection: \"column\", gap: \"var(--a2ui-spacing-xs, 0.25rem)\" }}>\n {props.label && <label htmlFor={id} style={labelStyle}>{props.label}</label>}\n <div style={{ display: \"flex\", gap: \"0.25rem\", position: \"relative\" }}>\n <input ref={inputRef} id={id} type=\"text\" inputMode=\"numeric\" autoComplete=\"off\"\n data-a2ui-date-text-draft=\"true\" placeholder=\"MM/DD/YYYY\" value={draft}\n onChange={(event) => update(event.currentTarget.value)}\n onBlur={() => { if (parsed) setDraft(displayDate(parsed)); }}\n style={{ ...inputStyle, minWidth: 0, flex: 1 }} />\n <button type=\"button\" aria-label={`Choose ${props.label || \"date\"} from calendar`} style={inputStyle}\n onClick={() => {\n const picker = pickerRef.current;\n if (picker && typeof picker.showPicker === \"function\") {\n try { picker.showPicker(); return; } catch { /* Expose the native fallback below. */ }\n }\n setPickerOpen(true);\n }}>▦</button>\n <input ref={pickerRef} type=\"date\" aria-label={`${props.label || \"Date\"} calendar`} tabIndex={pickerOpen ? 0 : -1}\n aria-hidden={!pickerOpen} data-a2ui-calendar-input=\"true\" value={parsed || \"\"} min={min} max={max}\n onChange={(event) => { update(displayDate(event.currentTarget.value)); setPickerOpen(false); }}\n style={pickerOpen ? inputStyle : { position: \"absolute\", opacity: 0, pointerEvents: \"none\", width: 1, height: 1, bottom: 0, right: 0 }} />\n </div>\n </div>\n );\n}\n\nfunction NativeTimeInput(props: DateProps & { enableDate?: boolean; enableTime?: boolean }) {\n const id = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const initialValue = useRef(props.value || \"\");\n useLayoutEffect(() => {\n if (inputRef.current && inputRef.current.value !== (props.value || \"\")) inputRef.current.value = props.value || \"\";\n }, [props.value]);\n return <div>\n {props.label && <label htmlFor={id} style={labelStyle}>{props.label}</label>}\n <input ref={inputRef} id={id} type={!props.enableDate && props.enableTime ? \"time\" : \"datetime-local\"}\n defaultValue={initialValue.current} onChange={(event) => props.setValue(event.currentTarget.value)}\n min={typeof props.min === \"string\" ? props.min : undefined} max={typeof props.max === \"string\" ? props.max : undefined} style={inputStyle} />\n </div>;\n}\n\nexport const DateTimeInput = createComponentImplementation(DateTimeInputApi, ({ props }) =>\n props.enableDate && !props.enableTime ? <DateOnlyInput {...props} /> : <NativeTimeInput {...props} />,\n);\n","/** Accessible host around the official A2UI v0.9.1 React surface. */\n\nimport {\n Component,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useSyncExternalStore,\n} from \"react\";\nimport type { KeyboardEvent as ReactKeyboardEvent, ReactNode } from \"react\";\nimport { A2uiSurface } from \"@a2ui/react/v0_9\";\n\nimport type {\n A2UIClientAdapter,\n A2UIFieldDescriptor,\n A2UIFieldValue,\n A2UISurfaceStructure,\n A2UITabDescriptor,\n AdapterSurface,\n} from \"./adapter.js\";\nimport type { SectionNavigation } from \"./envelope.js\";\nimport type {\n A2UIEditingSnapshot,\n A2UISessionController,\n A2UISessionSnapshot,\n A2UISurfaceMetadata,\n} from \"./session.js\";\n\n/**\n * The agent changed what the form shows: it filled or corrected field values\n * (`field-value`), or moved the conversation to a new current field group\n * (`current-group`). `element` is the rendered container for the first\n * affected field (the whole choice group or date editor, not one option), so\n * hosts can scroll to it for any control type.\n */\nexport interface A2UIAgentUpdateEvent {\n reason: \"field-value\" | \"current-group\";\n surfaceId: string;\n fields: readonly string[];\n groupId?: string;\n element?: HTMLElement;\n}\n\nexport interface A2UISurfaceHostProps {\n adapter: A2UIClientAdapter;\n /** Render a specific surface; defaults to the adapter's current surface. */\n surfaceId?: string;\n /** Authoritative protocol-neutral state/revision/section metadata. */\n surfaceMetadata?: A2UISurfaceMetadata | null;\n /** Optional session owner used for server-authorized blur commits. */\n sessionController?: A2UISessionController;\n /** Stable DOM target for host validation-summary field links. */\n hostId?: string;\n ariaLabel?: string;\n /** Makes stale/pending controls inert while voice remains available. */\n disabled?: boolean;\n busy?: boolean;\n /** Server-rejected fields. Values and server details are never accepted. */\n invalidFields?: readonly string[];\n validationSummaryId?: string;\n /** Shown when no surface is live (voice-only operation continues). */\n noSurfaceFallback?: ReactNode;\n /** Shown when the surface fails to render. */\n errorFallback?: ReactNode;\n /** Called after the DOM reflects an agent-driven field or group change. */\n onAgentUpdate?: (event: A2UIAgentUpdateEvent) => void;\n}\n\nexport function A2UISurfaceHost({\n adapter,\n surfaceId,\n surfaceMetadata,\n sessionController,\n hostId,\n ariaLabel = \"Current intake step\",\n disabled = false,\n busy = false,\n invalidFields = [],\n validationSummaryId,\n noSurfaceFallback,\n errorFallback,\n onAgentUpdate,\n}: A2UISurfaceHostProps): ReactNode {\n const version = useSyncExternalStore(\n adapter.subscribe,\n adapter.getVersion,\n adapter.getVersion,\n );\n const readSessionSnapshot: () => A2UISessionSnapshot | null =\n sessionController?.getSnapshot ?? getNoSessionSnapshot;\n const subscribeSession: (listener: () => void) => () => void =\n sessionController?.subscribe ?? subscribeToNothing;\n const controllerSnapshot = useSyncExternalStore(\n subscribeSession,\n readSessionSnapshot,\n readSessionSnapshot,\n );\n const generatedId = useId().replaceAll(\":\", \"\");\n const rootRef = useRef<HTMLDivElement>(null);\n const lastFocusedState = useRef<string | undefined>(undefined);\n const lastViewedSection = useRef<string | null | undefined>(undefined);\n const lastValidationKey = useRef(\"\");\n const pendingFieldUpdates = useRef(new Map<string, Set<string>>());\n const lastQuestionKey = useRef<string | undefined>(undefined);\n const onAgentUpdateRef = useRef(onAgentUpdate);\n onAgentUpdateRef.current = onAgentUpdate;\n const resolvedSurfaceMetadata =\n surfaceMetadata ?? controllerSnapshot?.surface ?? null;\n const editing =\n controllerSnapshot?.editing ??\n editingForSurface(resolvedSurfaceMetadata);\n const surface =\n surfaceId === undefined\n ? adapter.currentSurface\n : adapter.getSurface(surfaceId);\n const structure =\n surface === undefined\n ? EMPTY_STRUCTURE\n : adapter.getSurfaceStructure(surface.id);\n const focusKey =\n surface === undefined\n ? undefined\n : `${surface.id}:${resolvedSurfaceMetadata?.activeStateId ?? \"surface\"}`;\n const frameId = hostId ?? `a2ui-surface-${generatedId}`;\n\n useEffect(\n () =>\n adapter.subscribeFieldUpdates((event) => {\n const pending =\n pendingFieldUpdates.current.get(event.surfaceId) ?? new Set();\n for (const field of event.fields) {\n pending.add(field);\n }\n pendingFieldUpdates.current.set(event.surfaceId, pending);\n }),\n [adapter],\n );\n\n useLayoutEffect(() => {\n const root = rootRef.current;\n if (root === null || surface === undefined) {\n return;\n }\n let cancelled = false;\n let controlCleanups: Array<() => void> = [];\n const refreshControls = (): void => {\n if (cancelled || !root.isConnected) {\n return;\n }\n for (const cleanup of controlCleanups.reverse()) {\n cleanup();\n }\n controlCleanups = [\n annotateFields(\n root,\n structure.fields,\n new Set(invalidFields),\n validationSummaryId,\n ),\n formatFieldLabels(root),\n annotateSavedLoopTables(root, adapter, surface.id),\n bindFieldInteractionGroups(\n root,\n resolvedSurfaceMetadata?.fieldInteractions ?? [],\n editing,\n sessionController,\n ),\n hideGeneratedGroupLabels(\n root,\n resolvedSurfaceMetadata?.fieldInteractions ?? [],\n ),\n annotateActionControls(root),\n suppressSkipForMandatoryFields(root, structure.fields, resolvedSurfaceMetadata?.fieldInteractions ?? []),\n blockInvalidActionControls(root),\n setPendingGroupsDisabled(\n root,\n new Set(editing.pendingGroupIds),\n ),\n setInteractionDisabled(root, disabled || busy),\n ];\n reportAgentUpdates();\n };\n const reportAgentUpdates = (): void => {\n const changedFields = [\n ...(pendingFieldUpdates.current.get(surface.id) ?? []),\n ];\n pendingFieldUpdates.current.clear();\n const currentGroup = resolvedSurfaceMetadata?.fieldInteractions.find(\n (group) => group.mode === \"current\",\n );\n // Confirmation steps (phone, consent) may have no editable current\n // group, so a new active state also counts as a new question.\n const activeStateId = resolvedSurfaceMetadata?.activeStateId;\n const questionKey =\n currentGroup?.groupId ??\n (activeStateId == null ? undefined : `state:${activeStateId}`);\n const previousQuestionKey = lastQuestionKey.current;\n if (questionKey !== undefined) {\n lastQuestionKey.current = questionKey;\n }\n const report = onAgentUpdateRef.current;\n if (report === undefined) {\n return;\n }\n if (changedFields.length > 0) {\n report({\n reason: \"field-value\",\n surfaceId: surface.id,\n fields: changedFields,\n element: agentUpdateElement(root, changedFields, structure.fields),\n });\n }\n if (\n questionKey !== undefined &&\n previousQuestionKey !== undefined &&\n questionKey !== previousQuestionKey\n ) {\n const fields =\n currentGroup?.fields.map((binding) => binding.field) ?? [];\n report({\n reason: \"current-group\",\n surfaceId: surface.id,\n fields,\n ...(currentGroup === undefined\n ? {}\n : { groupId: currentGroup.groupId }),\n element:\n agentUpdateElement(root, fields, structure.fields) ??\n currentQuestionElement(root),\n });\n }\n };\n const scheduleControlRefresh = (): void => {\n queueMicrotask(refreshControls);\n };\n const tabCleanup = enhanceTabs(\n root,\n structure.tabs,\n resolvedSurfaceMetadata?.sectionNavigation ?? null,\n editing.viewedSectionId,\n frameId,\n scheduleControlRefresh,\n (sectionId) => sessionController?.viewSection(sectionId),\n );\n scheduleControlRefresh();\n\n const previousViewedSection = lastViewedSection.current;\n const authoritativeSection = editing.authoritativeSectionId;\n const hasRetainedEdit =\n editing.dirtyGroupIds.length > 0 ||\n editing.pendingGroupIds.length > 0 ||\n editing.rejectedGroupIds.length > 0;\n const authoritativeStateChanged =\n focusKey !== undefined && lastFocusedState.current !== focusKey;\n const returnedToCurrent =\n previousViewedSection !== undefined &&\n previousViewedSection !== authoritativeSection &&\n editing.viewedSectionId === authoritativeSection;\n const validationKey =\n invalidFields.length === 0\n ? \"\"\n : `${controllerSnapshot?.actions.lastResult?.requestId ?? \"fields\"}:${invalidFields.join(\"\\u0000\")}`;\n const validationChanged =\n validationKey.length > 0 && validationKey !== lastValidationKey.current;\n lastFocusedState.current = focusKey;\n lastViewedSection.current = editing.viewedSectionId;\n lastValidationKey.current = validationKey;\n\n if (\n (validationChanged && validationSummaryId === undefined) ||\n returnedToCurrent ||\n (authoritativeStateChanged &&\n !hasRetainedEdit &&\n editing.viewedSectionId === authoritativeSection)\n ) {\n queueMicrotask(() => {\n refreshControls();\n if (cancelled || !root.isConnected) {\n return;\n }\n focusProgressTarget(\n root,\n resolvedSurfaceMetadata,\n invalidFields,\n );\n });\n }\n return () => {\n cancelled = true;\n for (const cleanup of controlCleanups.reverse()) {\n cleanup();\n }\n tabCleanup();\n };\n }, [\n busy,\n disabled,\n editing,\n focusKey,\n frameId,\n invalidFields,\n structure,\n surface,\n resolvedSurfaceMetadata,\n sessionController,\n controllerSnapshot?.actions.lastResult?.requestId,\n validationSummaryId,\n version,\n ]);\n\n if (surface === undefined) {\n return (\n noSurfaceFallback ?? (\n <div data-a2ui-host=\"no-surface\" role=\"status\" aria-live=\"polite\">\n Your conversation continues by voice.\n </div>\n )\n );\n }\n return (\n <div\n ref={rootRef}\n id={frameId}\n className=\"a2ui-accessible-surface\"\n data-a2ui-host=\"surface\"\n data-a2ui-disabled={disabled || busy ? \"true\" : \"false\"}\n role=\"region\"\n aria-label={ariaLabel}\n aria-busy={busy || undefined}\n aria-disabled={disabled || busy || undefined}\n tabIndex={-1}\n >\n <SurfaceErrorBoundary\n key={surface.id}\n adapter={adapter}\n surface={surface}\n fallback={\n errorFallback ?? (\n <div data-a2ui-host=\"render-error\" role=\"alert\">\n This step can't be shown right now. Please continue by voice.\n </div>\n )\n }\n >\n <A2uiSurface surface={surface as OfficialSurface} />\n </SurfaceErrorBoundary>\n </div>\n );\n}\n\nfunction getNoSessionSnapshot(): null {\n return null;\n}\n\nfunction subscribeToNothing(): () => void {\n return () => undefined;\n}\n\nfunction editingForSurface(\n surface: A2UISurfaceMetadata | null,\n): A2UIEditingSnapshot {\n const authoritative = surface?.sectionNavigation?.activeSectionId ?? null;\n return {\n authoritativeSectionId: authoritative,\n viewedSectionId: authoritative,\n dirtyGroupIds: [],\n pendingGroupIds: [],\n rejectedGroupIds: [],\n };\n}\n\nfunction focusProgressTarget(\n root: HTMLElement,\n metadata: A2UISurfaceMetadata | null,\n invalidFields: readonly string[],\n): void {\n const controls = [\n ...root.querySelectorAll<HTMLElement>(\"[data-a2ui-field]\"),\n ].filter((control) => !isControlDisabled(control));\n const invalid = invalidFields\n .map((field) =>\n controls.find((control) => control.dataset.a2uiField === field),\n )\n .find((control) => control !== undefined);\n const currentFields =\n metadata?.fieldInteractions\n .find((group) => group.mode === \"current\")\n ?.fields.map((binding) => binding.field) ?? [];\n const current = currentFields\n .map((field) =>\n controls.find((control) => control.dataset.a2uiField === field),\n )\n .find((control) => control !== undefined);\n const target = invalid ?? current ?? controls[0] ?? root;\n target.focus({ preventScroll: true });\n if (target !== root) {\n target.scrollIntoView?.({\n block: \"nearest\",\n behavior: prefersReducedMotion() ? \"auto\" : \"smooth\",\n });\n }\n}\n\n/** The rendered container for the first of `fields` present in the DOM. */\nfunction agentUpdateElement(\n root: HTMLElement,\n fields: readonly string[],\n descriptors: readonly A2UIFieldDescriptor[],\n): HTMLElement | undefined {\n const controls = [\n ...root.querySelectorAll<HTMLElement>(\"[data-a2ui-field]\"),\n ];\n for (const field of fields) {\n const control = controls.find(\n (candidate) => candidate.dataset.a2uiField === field,\n );\n if (control !== undefined) {\n return (\n control.closest<HTMLElement>(\"[data-a2ui-date-editor]\") ??\n control.closest<HTMLElement>('[role=\"radiogroup\"]') ??\n control\n );\n }\n const descriptor = descriptors.find(\n (candidate) => candidate.field === field,\n );\n const labels = new Set([displayFieldLabel(field)]);\n if (descriptor !== undefined) {\n labels.add(descriptor.label);\n }\n // Read-only fields (a phone number to confirm) render as plain text.\n const label = [...root.querySelectorAll<HTMLElement>(\"*\")].find(\n (candidate) =>\n candidate.childElementCount === 0 &&\n labels.has(candidate.textContent?.trim() ?? \"\"),\n );\n if (label?.parentElement != null && root.contains(label.parentElement)) {\n return label.parentElement;\n }\n }\n return undefined;\n}\n\n/** The block around the current question's action (e.g. its Submit). */\nfunction currentQuestionElement(root: HTMLElement): HTMLElement | undefined {\n const action = [\n ...root.querySelectorAll<HTMLElement>(\"[data-a2ui-action='true']\"),\n ].find(\n (candidate) =>\n candidate.dataset.a2uiActionLabel !== \"skip\" &&\n candidate.closest(\"[data-a2ui-loop-row]\") === null,\n );\n if (action === undefined) {\n return undefined;\n }\n let container = action.parentElement;\n // Step past a row that holds only the action buttons.\n if (\n container !== null &&\n textOf(container) ===\n [...container.querySelectorAll(\"button\")].map(textOf).join(\"\")\n ) {\n container = container.parentElement;\n }\n return container !== null && container !== root && root.contains(container)\n ? container\n : action;\n}\n\nfunction textOf(element: Element): string {\n return (element.textContent ?? \"\").replace(/\\s+/g, \"\");\n}\n\nfunction isControlDisabled(control: HTMLElement): boolean {\n return (\n control.getAttribute(\"aria-disabled\") === \"true\" ||\n (\"disabled\" in control && control.disabled === true)\n );\n}\n\nfunction prefersReducedMotion(): boolean {\n return globalThis.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n}\n\nfunction bindFieldInteractionGroups(\n root: HTMLElement,\n groups: A2UISurfaceMetadata[\"fieldInteractions\"],\n editing: A2UIEditingSnapshot,\n controller: A2UISessionController | undefined,\n): () => void {\n if (groups.length === 0) {\n return () => undefined;\n }\n const groupByField = new Map(\n groups.flatMap((group) =>\n group.fields.map(\n (binding) => [binding.field, group] as const,\n ),\n ),\n );\n const originalGroupAttributes = new Map<\n HTMLElement,\n {\n groupId: string | undefined;\n groupMode: string | undefined;\n editState: string | undefined;\n }\n >();\n for (const control of root.querySelectorAll<HTMLElement>(\n \"[data-a2ui-field]\",\n )) {\n const field = control.dataset.a2uiField;\n const group = field === undefined ? undefined : groupByField.get(field);\n if (group !== undefined) {\n const dateEditor = control.closest<HTMLElement>(\"[data-a2ui-date-editor]\");\n const targets = dateEditor\n ? [control, ...dateEditor.querySelectorAll<HTMLElement>(\"button, input[data-a2ui-calendar-input]\")]\n : [control];\n for (const target of targets) {\n originalGroupAttributes.set(target, {\n groupId: target.dataset.a2uiGroupId,\n groupMode: target.dataset.a2uiGroupMode,\n editState: target.dataset.a2uiEditState,\n });\n target.dataset.a2uiGroupId = group.groupId;\n target.dataset.a2uiGroupMode = group.mode;\n target.dataset.a2uiEditState = groupEditState(group.groupId, editing);\n }\n }\n }\n\n if (controller === undefined) {\n return () => {\n restoreGroupAttributes(originalGroupAttributes);\n };\n }\n\n const queuedCaptures = new Set<string>();\n const scheduleCapture = (groupId: string): void => {\n if (queuedCaptures.has(groupId)) {\n return;\n }\n queuedCaptures.add(groupId);\n queueMicrotask(() => {\n queuedCaptures.delete(groupId);\n controller.captureFieldGroupDraft(groupId);\n });\n };\n const onInput = (event: Event): void => {\n const groupId = interactionGroupId(root, event.target);\n if (groupId !== undefined) {\n scheduleCapture(groupId);\n }\n };\n const onFocusOut = (event: FocusEvent): void => {\n const groupId = interactionGroupId(root, event.target);\n const group = groups.find((candidate) => candidate.groupId === groupId);\n if (\n groupId === undefined ||\n group?.mode === \"current\" ||\n interactionGroupId(root, event.relatedTarget) === groupId\n ) {\n return;\n }\n queueMicrotask(() => {\n if (\n interactionGroupId(root, root.ownerDocument.activeElement) !== groupId\n ) {\n const invalidDate = [...root.querySelectorAll<HTMLInputElement>(\"input[data-a2ui-date-text-draft]\")]\n .some((input) => input.dataset.a2uiGroupId === groupId && !input.checkValidity());\n if (!invalidDate) controller.commitFieldGroup(groupId);\n }\n });\n };\n root.addEventListener(\"input\", onInput, true);\n root.addEventListener(\"change\", onInput, true);\n root.addEventListener(\"focusout\", onFocusOut, true);\n\n return () => {\n root.removeEventListener(\"input\", onInput, true);\n root.removeEventListener(\"change\", onInput, true);\n root.removeEventListener(\"focusout\", onFocusOut, true);\n restoreGroupAttributes(originalGroupAttributes);\n };\n}\n\nfunction groupEditState(\n groupId: string,\n editing: A2UIEditingSnapshot,\n): \"dirty\" | \"saving\" | \"rejected\" | \"saved\" {\n if (editing.pendingGroupIds.includes(groupId)) {\n return \"saving\";\n }\n if (editing.rejectedGroupIds.includes(groupId)) {\n return \"rejected\";\n }\n return editing.dirtyGroupIds.includes(groupId) ? \"dirty\" : \"saved\";\n}\n\nfunction hideGeneratedGroupLabels(\n root: HTMLElement,\n groups: A2UISurfaceMetadata[\"fieldInteractions\"],\n): () => void {\n if (groups.length === 0) {\n return () => undefined;\n }\n const originals = new Map<\n HTMLElement,\n {\n hidden: boolean;\n ariaHidden: string | null;\n generatedGroupLabel: string | undefined;\n }\n >();\n for (const group of groups) {\n const controls = [\n ...root.querySelectorAll<HTMLElement>(\"[data-a2ui-group-id]\"),\n ].filter((control) => control.dataset.a2uiGroupId === group.groupId);\n const label = generatedGroupLabelForControls(root, controls);\n if (label === undefined || originals.has(label)) {\n continue;\n }\n originals.set(label, {\n hidden: label.hidden,\n ariaHidden: label.getAttribute(\"aria-hidden\"),\n generatedGroupLabel: label.dataset.a2uiGeneratedGroupLabel,\n });\n label.hidden = true;\n label.setAttribute(\"aria-hidden\", \"true\");\n label.dataset.a2uiGeneratedGroupLabel = \"true\";\n }\n return () => {\n for (const [label, original] of originals) {\n label.hidden = original.hidden;\n restoreAttribute(label, \"aria-hidden\", original.ariaHidden);\n restoreDataset(\n label,\n \"a2uiGeneratedGroupLabel\",\n original.generatedGroupLabel,\n );\n }\n };\n}\n\nfunction generatedGroupLabelForControls(\n root: HTMLElement,\n controls: readonly HTMLElement[],\n): HTMLElement | undefined {\n for (const control of controls) {\n const label = generatedGroupLabelForControl(root, control);\n if (label !== undefined) {\n return label;\n }\n }\n return undefined;\n}\n\nfunction generatedGroupLabelForControl(\n root: HTMLElement,\n control: HTMLElement,\n): HTMLElement | undefined {\n let current: HTMLElement | null = control;\n while (current !== null && current !== root) {\n const parent: HTMLElement | null = current.parentElement;\n if (parent === null) {\n return undefined;\n }\n const siblings = [...parent.children];\n const currentIndex = siblings.indexOf(current);\n const precedingText = siblings\n .slice(0, currentIndex)\n .filter(isGeneratedTextElement);\n if (precedingText.length >= 2) {\n return precedingText[0];\n }\n if (\n precedingText.length === 1 &&\n subtreeHasGeneratedTextElement(current)\n ) {\n return precedingText[0];\n }\n current = parent;\n }\n return undefined;\n}\n\nfunction subtreeHasGeneratedTextElement(element: HTMLElement): boolean {\n return [...element.querySelectorAll(\"*\")].some(isGeneratedTextElement);\n}\n\nfunction isGeneratedTextElement(element: Element): element is HTMLElement {\n return (\n element instanceof HTMLElement &&\n element.textContent?.trim() !== \"\" &&\n element.querySelector(\"button, input, textarea, select, label\") === null &&\n (element.classList.contains(\"a2ui-text\") ||\n element.classList.contains(\"no-markdown-renderer\") ||\n [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"body\", \"caption\"].some((className) =>\n element.classList.contains(className),\n ) ||\n element.querySelector(\":scope > section > :is(h1, h2, h3, h4, h5, p)\") !==\n null)\n );\n}\n\nfunction restoreGroupAttributes(\n originals: ReadonlyMap<\n HTMLElement,\n {\n groupId: string | undefined;\n groupMode: string | undefined;\n editState: string | undefined;\n }\n >,\n): void {\n for (const [control, original] of originals) {\n restoreDataset(control, \"a2uiGroupId\", original.groupId);\n restoreDataset(control, \"a2uiGroupMode\", original.groupMode);\n restoreDataset(control, \"a2uiEditState\", original.editState);\n }\n}\n\nfunction restoreDataset(\n element: HTMLElement,\n key:\n | \"a2uiGroupId\"\n | \"a2uiGroupMode\"\n | \"a2uiEditState\"\n | \"a2uiGroupPending\"\n | \"a2uiGeneratedGroupLabel\"\n | \"a2uiLoopTable\"\n | \"a2uiLoopRow\"\n | \"a2uiLoopHeader\"\n | \"a2uiLoopField\"\n | \"a2uiLoopCell\"\n | \"a2uiLoopColumn\"\n | \"a2uiLoopColumnCount\"\n | \"a2uiLoopLabel\"\n | \"a2uiLoopActionControl\"\n | \"a2uiLoopGeneratedHeader\",\n value: string | undefined,\n): void {\n if (value === undefined) {\n delete element.dataset[key];\n } else {\n element.dataset[key] = value;\n }\n}\n\nfunction interactionGroupId(\n root: HTMLElement,\n target: EventTarget | null,\n): string | undefined {\n if (!(target instanceof Element) || !root.contains(target)) {\n return undefined;\n }\n return target.closest<HTMLElement>(\"[data-a2ui-group-id]\")?.dataset\n .a2uiGroupId;\n}\n\nfunction annotateActionControls(root: HTMLElement): () => void {\n const actions = [...root.querySelectorAll<HTMLButtonElement>(\"button\")].filter(\n (button) =>\n button.getAttribute(\"role\") !== \"tab\" &&\n [\"submit\", \"skip\", \"revise\"].includes(\n button.textContent?.trim().toLowerCase() ?? \"\",\n ),\n );\n const groups = new Set<HTMLElement>();\n for (const action of actions) {\n const label = action.textContent?.trim().toLowerCase() ?? \"\";\n action.dataset.a2uiAction = \"true\";\n action.dataset.a2uiActionLabel = label;\n if (action.parentElement !== null) {\n action.parentElement.dataset.a2uiActionGroup = \"true\";\n groups.add(action.parentElement);\n }\n }\n return () => {\n for (const action of actions) {\n delete action.dataset.a2uiAction;\n delete action.dataset.a2uiActionLabel;\n }\n for (const group of groups) {\n delete group.dataset.a2uiActionGroup;\n }\n };\n}\n\nfunction suppressSkipForMandatoryFields(\n root: HTMLElement,\n fields: readonly A2UIFieldDescriptor[],\n groups: A2UISurfaceMetadata[\"fieldInteractions\"],\n): () => void {\n const currentFields = new Set(groups.filter((group) => group.mode === \"current\")\n .flatMap((group) => group.fields.map((binding) => binding.field)));\n const requiredFields = fields.filter(\n (field) => field.required &&\n (groups.length === 0 || currentFields.has(field.field)) &&\n !field.componentId.includes(\":list-new:field:\") &&\n !field.componentId.includes(\":list-row:field:\"),\n );\n if (\n requiredFields.length === 0 ||\n requiredFields.every((field) => isOptionalCoverageField(field.field))\n ) {\n return () => undefined;\n }\n const skipButtons = [\n ...root.querySelectorAll<HTMLButtonElement>(\"[data-a2ui-action='true']\"),\n ].filter((button) => button.dataset.a2uiActionLabel === \"skip\");\n const originals = skipButtons.map((button) => ({\n button,\n hidden: button.hidden,\n ariaHidden: button.getAttribute(\"aria-hidden\"),\n }));\n for (const button of skipButtons) {\n button.hidden = true;\n button.setAttribute(\"aria-hidden\", \"true\");\n }\n return () => {\n for (const original of originals) {\n original.button.hidden = original.hidden;\n restoreAttribute(original.button, \"aria-hidden\", original.ariaHidden);\n }\n };\n}\n\nfunction isOptionalCoverageField(field: string): boolean {\n return (\n field === \"employer_union_coverage\" ||\n field === \"va_tricare_benefits\" ||\n field === \"coverage.employerUnionCoverage\" ||\n field === \"coverage.vaTricareBenefits\"\n );\n}\n\nconst EMPTY_STRUCTURE: A2UISurfaceStructure = { fields: [], tabs: [] };\ntype OfficialSurface = Parameters<typeof A2uiSurface>[0][\"surface\"];\n\ninterface BoundaryProps {\n adapter: A2UIClientAdapter;\n surface: AdapterSurface;\n fallback: ReactNode;\n children: ReactNode;\n}\n\nexport class SurfaceErrorBoundary extends Component<\n BoundaryProps,\n { failedSurfaceId: string | undefined }\n> {\n state = { failedSurfaceId: undefined as string | undefined };\n\n static getDerivedStateFromError(): { failedSurfaceId: string } {\n return { failedSurfaceId: \"pending\" };\n }\n\n componentDidCatch(error: Error): void {\n this.setState({ failedSurfaceId: this.props.surface.id });\n this.props.adapter.reportRenderFailure(this.props.surface.id, error.name);\n }\n\n render(): ReactNode {\n if (this.state.failedSurfaceId !== undefined) {\n return (\n <div\n data-a2ui-error-boundary=\"true\"\n tabIndex={-1}\n ref={(node) => node?.focus()}\n >\n {this.props.fallback}\n </div>\n );\n }\n return this.props.children;\n }\n}\n\nfunction annotateFields(\n root: HTMLElement,\n fields: readonly A2UIFieldDescriptor[],\n invalidFields: ReadonlySet<string>,\n validationSummaryId: string | undefined,\n): () => void {\n const originalAttributes = new Map<\n HTMLElement,\n {\n field: string | undefined;\n required: string | null;\n invalid: string | null;\n describedBy: string | null;\n pattern: string | null;\n max: string | null;\n inputMode: string | null;\n maxLength: string | null;\n }\n >();\n const matchCleanups: Array<() => void> = [];\n for (const field of fields) {\n const match = findFieldControls(root, field);\n matchCleanups.push(match.cleanup);\n for (const control of match.controls) {\n if (!originalAttributes.has(control)) {\n originalAttributes.set(control, {\n field: control.dataset.a2uiField,\n required: control.getAttribute(\"aria-required\"),\n invalid: control.getAttribute(\"aria-invalid\"),\n describedBy: control.getAttribute(\"aria-describedby\"),\n pattern: control.getAttribute(\"pattern\"),\n max: control.getAttribute(\"max\"),\n inputMode: control.getAttribute(\"inputmode\"),\n maxLength: control.getAttribute(\"maxlength\"),\n });\n }\n control.dataset.a2uiField = field.field;\n if (field.required) {\n control.setAttribute(\"aria-required\", \"true\");\n }\n if (invalidFields.has(field.field)) {\n control.setAttribute(\"aria-invalid\", \"true\");\n if (validationSummaryId !== undefined) {\n const describedBy = new Set(\n (control.getAttribute(\"aria-describedby\") ?? \"\")\n .split(/\\s+/)\n .filter(Boolean),\n );\n describedBy.add(validationSummaryId);\n control.setAttribute(\n \"aria-describedby\",\n [...describedBy].join(\" \"),\n );\n }\n }\n applyControlValidationAttributes(control, field);\n const cleanup = attachControlValidationBehavior(control, field);\n if (cleanup !== undefined) {\n matchCleanups.push(cleanup);\n }\n }\n }\n return () => {\n for (const [control, original] of originalAttributes) {\n if (original.field === undefined) {\n delete control.dataset.a2uiField;\n } else {\n control.dataset.a2uiField = original.field;\n }\n restoreAttribute(control, \"aria-required\", original.required);\n restoreAttribute(control, \"aria-invalid\", original.invalid);\n restoreAttribute(control, \"aria-describedby\", original.describedBy);\n restoreAttribute(control, \"pattern\", original.pattern);\n restoreAttribute(control, \"max\", original.max);\n restoreAttribute(control, \"inputmode\", original.inputMode);\n restoreAttribute(control, \"maxlength\", original.maxLength);\n }\n for (const cleanup of matchCleanups.reverse()) {\n cleanup();\n }\n };\n}\n\nfunction applyControlValidationAttributes(\n control: HTMLElement,\n field: A2UIFieldDescriptor,\n): void {\n if (field.validationRegexp !== undefined) {\n control.setAttribute(\"pattern\", field.validationRegexp);\n }\n if (field.max !== undefined) {\n control.setAttribute(\"max\", field.max);\n }\n if (isPhoneValidationRegexp(field.validationRegexp)) {\n control.setAttribute(\"inputmode\", \"numeric\");\n control.setAttribute(\"maxlength\", \"10\");\n } else if (isZipValidationRegexp(field.validationRegexp)) {\n control.setAttribute(\"inputmode\", \"numeric\");\n control.setAttribute(\"maxlength\", \"5\");\n } else if (isIntegerValidationRegexp(field.validationRegexp)) {\n control.setAttribute(\"inputmode\", \"numeric\");\n control.setAttribute(\"maxlength\", \"2\");\n }\n}\n\nfunction attachControlValidationBehavior(\n control: HTMLElement,\n field: A2UIFieldDescriptor,\n): (() => void) | undefined {\n const maxLength = numericMaxLengthForField(field);\n const customValidation = customValidationForField(field);\n if (maxLength === undefined || !isTextInput(control)) {\n if (customValidation === undefined || !isTextInput(control)) {\n return undefined;\n }\n const validate = (): void => {\n applyCustomValidationMessage(control, customValidation);\n };\n control.addEventListener(\"input\", validate);\n control.addEventListener(\"change\", validate);\n validate();\n return () => {\n control.setCustomValidity(\"\");\n control.removeEventListener(\"input\", validate);\n control.removeEventListener(\"change\", validate);\n };\n }\n const sanitize = (): void => {\n const next = control.value.replace(/\\D/g, \"\").slice(0, maxLength);\n if (control.value !== next) {\n control.value = next;\n control.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n if (customValidation !== undefined) {\n applyCustomValidationMessage(control, customValidation);\n }\n };\n control.addEventListener(\"input\", sanitize);\n control.addEventListener(\"change\", sanitize);\n sanitize();\n return () => {\n control.setCustomValidity(\"\");\n control.removeEventListener(\"input\", sanitize);\n control.removeEventListener(\"change\", sanitize);\n };\n}\n\nfunction customValidationForField(\n field: A2UIFieldDescriptor,\n): { message: string; pattern?: RegExp } | undefined {\n if (isZipValidationRegexp(field.validationRegexp)) {\n return {\n message: \"Enter a valid 5-digit ZIP code.\",\n pattern: regexpFromPattern(field.validationRegexp),\n };\n }\n if (isPhoneValidationRegexp(field.validationRegexp)) {\n return {\n message: \"Enter a valid 10-digit US phone number.\",\n pattern: regexpFromPattern(field.validationRegexp),\n };\n }\n return undefined;\n}\n\nfunction applyCustomValidationMessage(\n control: HTMLInputElement,\n validation: { message: string; pattern?: RegExp },\n): void {\n control.setCustomValidity(\"\");\n if (\n control.value.length > 0 &&\n (validation.pattern?.test(control.value) === false ||\n !control.checkValidity())\n ) {\n control.setCustomValidity(validation.message);\n }\n}\n\nfunction regexpFromPattern(pattern: string | undefined): RegExp | undefined {\n if (pattern === undefined) {\n return undefined;\n }\n try {\n return new RegExp(pattern);\n } catch {\n return undefined;\n }\n}\n\nfunction numericMaxLengthForField(\n field: A2UIFieldDescriptor,\n): number | undefined {\n if (isPhoneValidationRegexp(field.validationRegexp)) {\n return 10;\n }\n if (isZipValidationRegexp(field.validationRegexp)) {\n return 5;\n }\n if (isIntegerValidationRegexp(field.validationRegexp)) {\n return 2;\n }\n return undefined;\n}\n\nfunction isPhoneValidationRegexp(pattern: string | undefined): boolean {\n return (\n pattern === \"^[2-9]\\\\d{2}[2-9]\\\\d{6}$\" ||\n (pattern?.startsWith(\"^(?:\") === true &&\n pattern.endsWith(\")[2-9]\\\\d{6}$\"))\n );\n}\n\nfunction isZipValidationRegexp(pattern: string | undefined): boolean {\n return (\n pattern === \"^(?!00000$)\\\\d{5}$\" ||\n pattern ===\n \"^(?:00(?:50[1-9]|5[1-9][0-9]|[6-9][0-9]{2})|0[1-9][0-9]{3}|[1-8][0-9]{4}|9[0-8][0-9]{3}|99[0-8][0-9]{2}|999[0-4][0-9]|99950)$\"\n );\n}\n\nfunction isIntegerValidationRegexp(pattern: string | undefined): boolean {\n return pattern === \"^\\\\d{1,2}$\";\n}\n\nfunction isTextInput(element: HTMLElement): element is HTMLInputElement {\n return element instanceof HTMLInputElement && element.type !== \"radio\";\n}\n\nfunction blockInvalidActionControls(root: HTMLElement): () => void {\n const blockIfInvalid = (event: Event): void => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const action = target.closest<HTMLElement>(\"[data-a2ui-action='true']\");\n if (action === null || !root.contains(action)) {\n return;\n }\n if (action.dataset.a2uiActionLabel === \"skip\") {\n return;\n }\n const invalid = firstInvalidInput(root);\n if (invalid === undefined) {\n return;\n }\n event.preventDefault();\n event.stopImmediatePropagation();\n invalid.setAttribute(\"aria-invalid\", \"true\");\n invalid.reportValidity();\n invalid.focus();\n };\n root.addEventListener(\"click\", blockIfInvalid, true);\n root.addEventListener(\"keydown\", blockIfInvalid, true);\n return () => {\n root.removeEventListener(\"click\", blockIfInvalid, true);\n root.removeEventListener(\"keydown\", blockIfInvalid, true);\n };\n}\n\nfunction firstInvalidInput(root: HTMLElement): HTMLInputElement | HTMLSelectElement | undefined {\n return [...root.querySelectorAll<HTMLInputElement | HTMLSelectElement>(\"input[data-a2ui-field], select[data-a2ui-field]\")]\n .filter((input) => input.type !== \"radio\" && !isControlDisabled(input))\n .find((input) => !input.checkValidity());\n}\n\ninterface FieldControlMatch {\n controls: HTMLElement[];\n cleanup: () => void;\n}\n\nfunction findFieldControls(\n root: HTMLElement,\n field: A2UIFieldDescriptor,\n): FieldControlMatch {\n const labels = [...root.querySelectorAll<HTMLLabelElement>(\"label\")];\n const label = labels.find(\n (candidate) => candidate.textContent?.trim() === field.label,\n );\n if (label?.htmlFor) {\n const control = root.ownerDocument.getElementById(label.htmlFor);\n if (control instanceof HTMLElement && root.contains(control)) {\n return { controls: [control], cleanup: () => undefined };\n }\n }\n const headings = [...root.querySelectorAll<HTMLElement>(\"strong\")];\n const heading = headings.find(\n (candidate) => candidate.textContent?.trim() === field.label,\n );\n if (heading === undefined) {\n return { controls: [], cleanup: () => undefined };\n }\n const group = heading.parentElement;\n if (group === null) {\n return { controls: [], cleanup: () => undefined };\n }\n const originalHeadingId = heading.getAttribute(\"id\");\n const originalRole = group.getAttribute(\"role\");\n const originalLabelledBy = group.getAttribute(\"aria-labelledby\");\n const headingId = heading.id || `${safeDomToken(field.componentId)}-label`;\n heading.id = headingId;\n group.setAttribute(\"role\", \"radiogroup\");\n group.setAttribute(\"aria-labelledby\", headingId);\n return {\n controls: [\n ...group.querySelectorAll<HTMLElement>(\n 'input[type=\"radio\"], input[type=\"checkbox\"], button',\n ),\n ],\n cleanup: () => {\n restoreAttribute(heading, \"id\", originalHeadingId);\n restoreAttribute(group, \"role\", originalRole);\n restoreAttribute(group, \"aria-labelledby\", originalLabelledBy);\n },\n };\n}\n\nfunction formatFieldLabels(root: HTMLElement): () => void {\n const originals = new Map<HTMLElement, string>();\n for (const control of root.querySelectorAll<HTMLElement>(\"[data-a2ui-field]\")) {\n const field = control.dataset.a2uiField;\n if (field === undefined) {\n continue;\n }\n const label = labelElementForControl(root, control);\n if (label === undefined || originals.has(label)) {\n continue;\n }\n if (label.textContent?.trim() !== field) {\n continue;\n }\n originals.set(label, label.textContent ?? \"\");\n label.textContent = displayFieldLabel(field);\n }\n for (const element of root.querySelectorAll<HTMLElement>(\"*\")) {\n if (!isGeneratedTextElement(element) || originals.has(element)) {\n continue;\n }\n const field = generatedFieldLabelName(element.textContent ?? \"\");\n if (field === undefined) {\n continue;\n }\n originals.set(element, element.textContent ?? \"\");\n element.textContent = displayFieldLabel(field);\n }\n return () => {\n for (const [label, text] of originals) {\n label.textContent = text;\n }\n };\n}\n\nfunction generatedFieldLabelName(text: string): string | undefined {\n const trimmed = text.trim();\n const unwrapped =\n trimmed.startsWith(\"*\") && trimmed.endsWith(\"*\")\n ? trimmed.slice(1, -1).trim()\n : trimmed;\n return /^[A-Za-z][A-Za-z0-9_]*$/.test(unwrapped) &&\n /[_A-Z]/.test(unwrapped)\n ? unwrapped\n : undefined;\n}\n\nfunction annotateSavedLoopTables(\n root: HTMLElement,\n adapter: A2UIClientAdapter,\n surfaceId: string,\n): () => void {\n const originals = new Map<\n HTMLElement,\n {\n loopTable: string | undefined;\n loopRow: string | undefined;\n loopHeader: string | undefined;\n loopField: string | undefined;\n loopCell: string | undefined;\n loopColumn: string | undefined;\n loopColumnCount: string | undefined;\n loopLabel: string | undefined;\n generatedHeader: string | undefined;\n actionControl: string | undefined;\n hidden: string | null;\n ariaHidden: string | null;\n }\n >();\n const textOriginals = new Map<HTMLElement, string>();\n const listeners: Array<() => void> = [];\n const remember = (element: HTMLElement): void => {\n if (originals.has(element)) {\n return;\n }\n originals.set(element, {\n loopTable: element.dataset.a2uiLoopTable,\n loopRow: element.dataset.a2uiLoopRow,\n loopHeader: element.dataset.a2uiLoopHeader,\n loopField: element.dataset.a2uiLoopField,\n loopCell: element.dataset.a2uiLoopCell,\n loopColumn: element.dataset.a2uiLoopColumn,\n loopColumnCount: element.dataset.a2uiLoopColumnCount,\n loopLabel: element.dataset.a2uiLoopLabel,\n generatedHeader: element.dataset.a2uiLoopGeneratedHeader,\n actionControl: element.dataset.a2uiLoopActionControl,\n hidden: element.getAttribute(\"hidden\"),\n ariaHidden: element.getAttribute(\"aria-hidden\"),\n });\n };\n const setText = (element: HTMLElement, text: string): void => {\n if (!textOriginals.has(element)) {\n textOriginals.set(element, element.textContent ?? \"\");\n }\n element.textContent = text;\n };\n const commitText = (element: HTMLElement, text: string): void => {\n textOriginals.set(element, text);\n element.textContent = text;\n };\n const generatedElements: HTMLElement[] = [];\n const rows = [...root.querySelectorAll<HTMLElement>(\"div, section, article, li\")]\n .filter(\n (row) =>\n getSavedLoopRowFields(row).length > 0 &&\n normalizedLoopSummaryFields(getSavedLoopSummaryFields(row)).length >= 2,\n );\n for (const row of rows) {\n const parent = row.parentElement;\n if (parent !== null) {\n remember(parent);\n parent.dataset.a2uiLoopTable = \"true\";\n }\n }\n const rowsByParent = new Map<HTMLElement, HTMLElement[]>();\n for (const row of rows) {\n const parent = row.parentElement;\n if (parent === null) {\n continue;\n }\n const siblings = rowsByParent.get(parent) ?? [];\n siblings.push(row);\n rowsByParent.set(parent, siblings);\n }\n for (const siblings of rowsByParent.values()) {\n const firstRow = siblings[0];\n const parent = firstRow?.parentElement;\n if (parent !== null && parent !== undefined && firstRow !== undefined) {\n const header = buildSavedLoopHeader(parent, firstRow);\n if (header !== undefined) {\n parent.dataset.a2uiLoopColumnCount =\n header.dataset.a2uiLoopColumnCount ?? undefined;\n parent.insertBefore(header, firstRow);\n generatedElements.push(header);\n }\n }\n siblings.forEach((row, rowIndex) => {\n remember(row);\n row.dataset.a2uiLoopRow = \"true\";\n row.dataset.a2uiLoopHeader = \"false\";\n let columnIndex = 0;\n for (const child of [...row.children]) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n const button = child.matches(\"button\")\n ? child\n : child.querySelector<HTMLElement>(\"button\");\n if (button !== null) {\n const label = button.textContent?.trim().toLowerCase();\n remember(child);\n child.dataset.a2uiLoopCell = label === \"save\" ? \"save\" : \"action\";\n if (label === \"save\") {\n child.setAttribute(\"hidden\", \"\");\n child.setAttribute(\"aria-hidden\", \"true\");\n }\n continue;\n }\n const fieldParts = getSavedLoopFieldParts(child);\n if (fieldParts !== undefined) {\n remember(child);\n child.dataset.a2uiLoopField = \"true\";\n const column = String(columnIndex + 1);\n child.dataset.a2uiLoopColumn = column;\n remember(fieldParts.label);\n fieldParts.label.dataset.a2uiLoopCell = \"label\";\n fieldParts.label.dataset.a2uiLoopColumn = column;\n remember(fieldParts.value);\n fieldParts.value.dataset.a2uiLoopCell = \"value\";\n fieldParts.value.dataset.a2uiLoopColumn = column;\n columnIndex += 1;\n continue;\n }\n if (isSavedLoopSummary(child)) {\n remember(child);\n child.dataset.a2uiLoopCell = \"summary\";\n child.setAttribute(\"hidden\", \"\");\n child.setAttribute(\"aria-hidden\", \"true\");\n continue;\n }\n remember(child);\n child.dataset.a2uiLoopCell = columnIndex % 2 === 0 ? \"label\" : \"value\";\n child.dataset.a2uiLoopColumn = String(Math.floor(columnIndex / 2) + 1);\n columnIndex += 1;\n }\n normalizeSavedLoopRow(\n row,\n rowIndex,\n remember,\n setText,\n commitText,\n generatedElements,\n listeners,\n adapter,\n surfaceId,\n );\n });\n }\n return () => {\n for (const remove of listeners.reverse()) {\n remove();\n }\n for (const [element, original] of originals) {\n restoreDataset(element, \"a2uiLoopTable\", original.loopTable);\n restoreDataset(element, \"a2uiLoopRow\", original.loopRow);\n restoreDataset(element, \"a2uiLoopHeader\", original.loopHeader);\n restoreDataset(element, \"a2uiLoopField\", original.loopField);\n restoreDataset(element, \"a2uiLoopCell\", original.loopCell);\n restoreDataset(element, \"a2uiLoopColumn\", original.loopColumn);\n restoreDataset(element, \"a2uiLoopColumnCount\", original.loopColumnCount);\n restoreDataset(element, \"a2uiLoopLabel\", original.loopLabel);\n restoreDataset(\n element,\n \"a2uiLoopGeneratedHeader\",\n original.generatedHeader,\n );\n restoreDataset(element, \"a2uiLoopActionControl\", original.actionControl);\n restoreAttribute(element, \"hidden\", original.hidden);\n restoreAttribute(element, \"aria-hidden\", original.ariaHidden);\n }\n for (const [element, text] of textOriginals) {\n element.textContent = text;\n }\n for (const element of generatedElements) {\n if (element.dataset.a2uiGeneratedLoopActionCell === \"true\") {\n const parent = element.parentElement;\n if (parent !== null) {\n while (element.firstChild !== null) {\n parent.insertBefore(element.firstChild, element);\n }\n }\n }\n element.remove();\n }\n };\n}\n\nfunction buildSavedLoopHeader(\n parent: HTMLElement,\n firstRow: HTMLElement,\n): HTMLElement | undefined {\n const fields = normalizedLoopSummaryFields(getSavedLoopSummaryFields(firstRow));\n if (fields.length < 2) {\n return undefined;\n }\n const header = parent.ownerDocument.createElement(\"div\");\n header.dataset.a2uiLoopGeneratedHeader = \"true\";\n const columnCount = Math.min(fields.length, 3);\n header.dataset.a2uiLoopColumnCount = String(columnCount);\n fields.slice(0, columnCount).forEach((field, index) => {\n const cell = parent.ownerDocument.createElement(\"div\");\n cell.dataset.a2uiLoopCell = \"label\";\n cell.dataset.a2uiLoopColumn = String(index + 1);\n cell.textContent = displayFieldLabel(field);\n header.appendChild(cell);\n });\n const action = parent.ownerDocument.createElement(\"div\");\n action.dataset.a2uiLoopCell = \"label\";\n action.dataset.a2uiLoopColumn = String(columnCount + 1);\n action.textContent = \"Action\";\n header.appendChild(action);\n return header;\n}\n\nfunction normalizeSavedLoopRow(\n row: HTMLElement,\n rowIndex: number,\n remember: (element: HTMLElement) => void,\n setText: (element: HTMLElement, text: string) => void,\n commitText: (element: HTMLElement, text: string) => void,\n generatedElements: HTMLElement[],\n listeners: Array<() => void>,\n adapter: A2UIClientAdapter,\n surfaceId: string,\n): void {\n const summaryFields = normalizedLoopSummaryFields(getSavedLoopSummaryFields(row));\n if (summaryFields.length < 2) {\n return;\n }\n const columnCount = Math.min(summaryFields.length, 3);\n row.dataset.a2uiLoopColumnCount = String(columnCount);\n const fields = [...row.querySelectorAll<HTMLElement>(\"[data-a2ui-loop-field='true']\")];\n const summaryValues = getSavedLoopSummaryValues(row);\n const action = row.querySelector<HTMLElement>(\"[data-a2ui-loop-cell='action']\");\n const save = row.querySelector<HTMLElement>(\"[data-a2ui-loop-cell='save']\");\n const orderedFields = summaryFields\n .slice(0, columnCount)\n .map((fieldName) => {\n const field = findSavedLoopField(fields, fieldName);\n if (field !== undefined) {\n return field;\n }\n const value = summaryValues.get(fieldName);\n if (value === undefined) {\n return undefined;\n }\n const generated = createSavedLoopField(row.ownerDocument, fieldName, value);\n if (action !== null) {\n row.insertBefore(generated, action);\n } else {\n row.appendChild(generated);\n }\n generatedElements.push(generated);\n return generated;\n })\n .filter((field): field is HTMLElement => field !== undefined);\n orderedFields.forEach((field, index) => {\n const column = String(index + 1);\n remember(field);\n field.dataset.a2uiLoopColumn = column;\n const label = field.querySelector<HTMLElement>(\"[data-a2ui-loop-cell='label']\");\n const value = field.querySelector<HTMLElement>(\"[data-a2ui-loop-cell='value']\");\n if (label !== null) {\n remember(label);\n label.dataset.a2uiLoopColumn = column;\n label.dataset.a2uiLoopCell = \"label\";\n const displayLabel = displayFieldLabel(summaryFields[index] ?? \"\");\n label.dataset.a2uiLoopLabel = displayLabel;\n setText(label, displayLabel);\n }\n if (value !== null) {\n remember(value);\n value.dataset.a2uiLoopColumn = column;\n value.dataset.a2uiLoopCell = \"value\";\n }\n });\n const rowEditValues = savedLoopRowEditValues(orderedFields, summaryFields);\n const rowKey = savedLoopRowEditKey(rowIndex, summaryFields, rowEditValues);\n if (action !== null) {\n remember(action);\n action.dataset.a2uiLoopColumn = String(columnCount + 1);\n createSavedLoopActionCell(\n row,\n save,\n action,\n columnCount + 1,\n remember,\n setText,\n commitText,\n generatedElements,\n listeners,\n adapter,\n surfaceId,\n rowKey,\n orderedFields,\n summaryFields.slice(0, columnCount),\n );\n }\n for (const field of fields) {\n if (orderedFields.includes(field)) {\n continue;\n }\n remember(field);\n field.dataset.a2uiLoopCell = \"save\";\n field.setAttribute(\"hidden\", \"\");\n field.setAttribute(\"aria-hidden\", \"true\");\n }\n}\n\nfunction createSavedLoopActionCell(\n row: HTMLElement,\n save: HTMLElement | null,\n action: HTMLElement,\n column: number,\n remember: (element: HTMLElement) => void,\n setText: (element: HTMLElement, text: string) => void,\n commitText: (element: HTMLElement, text: string) => void,\n generatedElements: HTMLElement[],\n listeners: Array<() => void>,\n adapter: A2UIClientAdapter,\n surfaceId: string,\n rowKey: string,\n orderedFields: readonly HTMLElement[],\n summaryFields: readonly string[],\n): HTMLElement | undefined {\n if (save === null) {\n return undefined;\n }\n remember(save);\n remember(action);\n const actionCell = row.ownerDocument.createElement(\"div\");\n const editButton = row.ownerDocument.createElement(\"button\");\n editButton.type = \"button\";\n actionCell.dataset.a2uiLoopCell = \"action\";\n actionCell.dataset.a2uiLoopColumn = String(column);\n actionCell.dataset.a2uiLoopActionGroup = \"true\";\n actionCell.dataset.a2uiGeneratedLoopActionCell = \"true\";\n editButton.dataset.a2uiLoopCell = \"edit\";\n editButton.dataset.a2uiLoopColumn = String(column);\n editButton.dataset.a2uiGeneratedLoopEditButton = \"true\";\n editButton.textContent = \"Edit\";\n row.insertBefore(actionCell, action);\n actionCell.append(editButton, save, action);\n save.dataset.a2uiLoopCell = \"save\";\n save.dataset.a2uiLoopColumn = String(column);\n save.setAttribute(\"hidden\", \"\");\n save.setAttribute(\"aria-hidden\", \"true\");\n action.dataset.a2uiLoopColumn = String(column);\n listeners.push(\n bindSavedLoopEditAction(\n editButton,\n save,\n row,\n orderedFields,\n summaryFields,\n adapter,\n surfaceId,\n rowKey,\n setText,\n commitText,\n generatedElements,\n listeners,\n ),\n );\n const activeEditValues = adapter.getListRowEdit(surfaceId, rowKey);\n if (activeEditValues !== undefined) {\n renderSavedLoopEditInputs(\n editButton,\n row,\n orderedFields,\n summaryFields,\n adapter,\n surfaceId,\n rowKey,\n setText,\n generatedElements,\n listeners,\n activeEditValues,\n false,\n );\n }\n generatedElements.push(editButton);\n generatedElements.push(actionCell);\n delete action.dataset.a2uiLoopCell;\n delete action.dataset.a2uiLoopColumn;\n action.dataset.a2uiLoopActionControl = \"true\";\n return actionCell;\n}\n\nfunction bindSavedLoopEditAction(\n editButton: HTMLElement,\n submitButton: HTMLElement,\n row: HTMLElement,\n orderedFields: readonly HTMLElement[],\n summaryFields: readonly string[],\n adapter: A2UIClientAdapter,\n surfaceId: string,\n rowKey: string,\n setText: (element: HTMLElement, text: string) => void,\n commitText: (element: HTMLElement, text: string) => void,\n generatedElements: HTMLElement[],\n listeners: Array<() => void>,\n): () => void {\n const onClick = (event: MouseEvent): void => {\n if (adapter.getListRowEdit(surfaceId, rowKey) === undefined) {\n event.preventDefault();\n event.stopImmediatePropagation();\n const values = savedLoopRowEditValues(orderedFields, summaryFields);\n adapter.beginListRowEdit(surfaceId, rowKey, values);\n renderSavedLoopEditInputs(\n editButton,\n row,\n orderedFields,\n summaryFields,\n adapter,\n surfaceId,\n rowKey,\n setText,\n generatedElements,\n listeners,\n values,\n true,\n );\n return;\n }\n event.preventDefault();\n event.stopImmediatePropagation();\n const values = savedLoopRowInputValues(orderedFields, summaryFields);\n adapter.clearListRowEdit(surfaceId, rowKey);\n delete row.dataset.a2uiLoopEditing;\n setText(editButton, \"Edit\");\n orderedFields.forEach((field, index) => {\n const fieldName = summaryFields[index];\n const value = field.querySelector<HTMLElement>(\n \"[data-a2ui-loop-cell='value']\",\n );\n if (fieldName !== undefined && value !== null) {\n commitText(value, stringEditValue(values[fieldName]));\n }\n });\n adapter.stageListRowUpdate(surfaceId, values);\n window.setTimeout(() => {\n const clickable =\n submitButton instanceof HTMLButtonElement\n ? submitButton\n : submitButton.querySelector<HTMLButtonElement>(\"button\");\n (clickable ?? submitButton).click();\n }, 0);\n };\n editButton.addEventListener(\"click\", onClick, { capture: true });\n return () => {\n editButton.removeEventListener(\"click\", onClick, { capture: true });\n };\n}\n\nfunction renderSavedLoopEditInputs(\n editButton: HTMLElement,\n row: HTMLElement,\n orderedFields: readonly HTMLElement[],\n summaryFields: readonly string[],\n adapter: A2UIClientAdapter,\n surfaceId: string,\n rowKey: string,\n setText: (element: HTMLElement, text: string) => void,\n generatedElements: HTMLElement[],\n listeners: Array<() => void>,\n values: Readonly<Record<string, A2UIFieldValue>>,\n focusFirstInput: boolean,\n): void {\n row.dataset.a2uiLoopEditing = \"true\";\n for (const [index, field] of orderedFields.entries()) {\n const fieldName = summaryFields[index];\n const value = field.querySelector<HTMLElement>(\n \"[data-a2ui-loop-cell='value']\",\n );\n if (fieldName === undefined || value === null) {\n continue;\n }\n let input = value.querySelector<HTMLInputElement | HTMLSelectElement>(\n \"[data-a2ui-loop-edit-input='true']\",\n );\n if (input === null) {\n if (fieldName === \"hospital_preference\") {\n const select = row.ownerDocument.createElement(\"select\");\n for (const choice of [\"\", \"Prefer\", \"Avoid\"]) {\n const option = row.ownerDocument.createElement(\"option\");\n option.value = choice;\n option.textContent = choice || \"Choose Prefer or Avoid\";\n select.appendChild(option);\n }\n select.required = true;\n input = select;\n } else {\n input = row.ownerDocument.createElement(\"input\");\n input.type = \"text\";\n }\n input.name = fieldName;\n input.setAttribute(\"aria-label\", displayFieldLabel(fieldName));\n input.dataset.a2uiLoopEditInput = \"true\";\n setText(value, \"\");\n value.appendChild(input);\n generatedElements.push(input);\n }\n input.value = stringEditValue(values[fieldName]);\n const syncEditValue = (): void => {\n adapter.updateListRowEdit(\n surfaceId,\n rowKey,\n savedLoopRowInputValues(orderedFields, summaryFields),\n );\n };\n input.addEventListener(\"input\", syncEditValue);\n input.addEventListener(\"change\", syncEditValue);\n listeners.push(() => {\n input.removeEventListener(\"input\", syncEditValue);\n input.removeEventListener(\"change\", syncEditValue);\n });\n }\n setText(editButton, \"Save\");\n if (focusFirstInput) {\n row.querySelector<HTMLInputElement | HTMLSelectElement>(\n \"[data-a2ui-loop-edit-input='true']\",\n )?.focus();\n }\n}\n\nfunction savedLoopRowEditValues(\n orderedFields: readonly HTMLElement[],\n summaryFields: readonly string[],\n): Record<string, A2UIFieldValue> {\n const values: Record<string, A2UIFieldValue> = {};\n orderedFields.forEach((field, index) => {\n const fieldName = summaryFields[index];\n const value = field.querySelector<HTMLElement>(\n \"[data-a2ui-loop-cell='value']\",\n );\n if (fieldName !== undefined) {\n values[fieldName] = value?.textContent?.trim() ?? \"\";\n }\n });\n return values;\n}\n\nfunction savedLoopRowInputValues(\n orderedFields: readonly HTMLElement[],\n summaryFields: readonly string[],\n): Record<string, A2UIFieldValue> {\n const values: Record<string, A2UIFieldValue> = {};\n orderedFields.forEach((field, index) => {\n const fieldName = summaryFields[index];\n const input = field.querySelector<HTMLInputElement | HTMLSelectElement>(\n \"[data-a2ui-loop-edit-input='true']\",\n );\n const value = field.querySelector<HTMLElement>(\n \"[data-a2ui-loop-cell='value']\",\n );\n if (fieldName !== undefined) {\n values[fieldName] =\n input?.value ?? value?.textContent?.trim() ?? \"\";\n }\n });\n return values;\n}\n\nfunction savedLoopRowEditKey(\n rowIndex: number,\n summaryFields: readonly string[],\n values: Readonly<Record<string, A2UIFieldValue>>,\n): string {\n return `${rowIndex}:${summaryFields\n .map((field) => `${field}=${stringEditValue(values[field])}`)\n .join(\"|\")}`;\n}\n\nfunction stringEditValue(value: A2UIFieldValue | undefined): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n return String(value);\n}\n\nfunction findSavedLoopField(\n fields: readonly HTMLElement[],\n summaryField: string,\n): HTMLElement | undefined {\n const expectedName = canonicalLoopFieldName(summaryField).toLowerCase();\n const expectedLabel = displayFieldLabel(expectedName).toLowerCase();\n return fields.find((field) => {\n const parts = getSavedLoopFieldParts(field);\n if (parts?.fieldName === undefined) {\n return false;\n }\n const name = canonicalLoopFieldName(parts.fieldName).toLowerCase();\n return name === expectedName || name === expectedLabel;\n });\n}\n\nfunction createSavedLoopField(\n document: Document,\n fieldName: string,\n value: string,\n): HTMLElement {\n const field = document.createElement(\"div\");\n field.dataset.a2uiLoopField = \"true\";\n const label = document.createElement(\"span\");\n label.dataset.a2uiLoopCell = \"label\";\n label.textContent = displayFieldLabel(fieldName);\n const valueCell = document.createElement(\"div\");\n valueCell.dataset.a2uiLoopCell = \"value\";\n valueCell.textContent = value;\n field.append(label, valueCell);\n return field;\n}\n\nfunction normalizedLoopSummaryFields(fields: string[]): string[] {\n const withoutInternal = uniqueStrings(\n fields\n .map(canonicalLoopFieldName)\n .filter(\n (field) =>\n ![\"itemid\", \"__displaytext\", \"role\", \"save\", \"delete\", \"action\"].includes(\n field.toLowerCase(),\n ),\n ),\n );\n const providerFields = [\n \"doctor_name\",\n \"doctor_location\",\n \"specialization_type\",\n ];\n const hasProviderFields = providerFields.some((field) =>\n withoutInternal.includes(field),\n );\n if (hasProviderFields) {\n return providerFields.filter((field) => withoutInternal.includes(field));\n }\n const prescriptionFields = [\n \"prescription_name\",\n \"prescription_dosage\",\n \"prescription_frequency\",\n \"prescriptions\",\n ];\n const hasPrescriptionFields = prescriptionFields.some((field) =>\n withoutInternal.includes(field),\n );\n if (hasPrescriptionFields) {\n return prescriptionFields.filter((field) => withoutInternal.includes(field));\n }\n const pharmacyFields = [\"pharmacy_name\", \"pharmacy_type\", \"pharmacy_address\"];\n const hasPharmacyFields = pharmacyFields.some((field) =>\n withoutInternal.includes(field),\n );\n if (hasPharmacyFields) {\n return pharmacyFields.filter((field) => withoutInternal.includes(field));\n }\n const hospitalFields = [\"hospital_name\", \"hospital_city_state\", \"hospital_preference\"];\n const hasHospitalFields = hospitalFields.some((field) =>\n withoutInternal.includes(field),\n );\n if (hasHospitalFields) {\n return hospitalFields.filter((field) => withoutInternal.includes(field));\n }\n return withoutInternal;\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n const seen = new Set<string>();\n const output: string[] = [];\n for (const value of values) {\n const key = value.toLowerCase();\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n output.push(value);\n }\n return output;\n}\n\nfunction getSavedLoopSummaryFields(row: HTMLElement): string[] {\n const summary = [...row.children].find(\n (child): child is HTMLElement =>\n child instanceof HTMLElement && isSavedLoopSummary(child),\n );\n if (summary === undefined) {\n return [];\n }\n return (summary.textContent ?? \"\")\n .split(/\\s+\\|\\s+/)\n .map((part) => part.trim().match(/^\\*?([^:*]+?)\\*?\\s*:/)?.[1])\n .filter((field): field is string => field !== undefined);\n}\n\nfunction getSavedLoopSummaryValues(row: HTMLElement): Map<string, string> {\n const summary = [...row.children].find(\n (child): child is HTMLElement =>\n child instanceof HTMLElement && isSavedLoopSummary(child),\n );\n const values = new Map<string, string>();\n const text = summary?.textContent ?? \"\";\n for (const part of text.split(/\\s+\\|\\s+/)) {\n const match = /^([^:]+):\\s*(.*)$/.exec(part.trim());\n if (match === null) {\n continue;\n }\n const [, label, value] = match;\n const fieldName = canonicalLoopFieldName(label ?? \"\");\n if (fieldName && value !== undefined) {\n values.set(fieldName, value.trim());\n }\n }\n return values;\n}\n\nfunction getSavedLoopRowFields(row: HTMLElement): HTMLElement[] {\n if (\n row.dataset.a2uiActionGroup === \"true\" ||\n row.querySelector(\"input, textarea, select\") !== null ||\n row.querySelector(\"button\") === null\n ) {\n return [];\n }\n return [...row.children].filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n !child.matches(\"button\") &&\n child.querySelector(\"button\") === null &&\n getSavedLoopFieldParts(child) !== undefined,\n );\n}\n\nfunction getSavedLoopFieldParts(\n element: Element,\n): { fieldName: string | undefined; label: HTMLElement; value: HTMLElement } | undefined {\n if (!(element instanceof HTMLElement)) {\n return undefined;\n }\n const children = [...element.children].filter(\n (child): child is HTMLElement =>\n child instanceof HTMLElement &&\n !child.matches(\"button\") &&\n child.querySelector(\"button\") === null,\n );\n if (children.length < 2) {\n return undefined;\n }\n const [label, value] = children;\n if (label === undefined || value === undefined) {\n return undefined;\n }\n const labelText = label.textContent ?? \"\";\n const fieldName = savedLoopFieldLabelName(labelText);\n return fieldName !== undefined || isLoopActionText(labelText)\n ? { fieldName, label, value }\n : undefined;\n}\n\nfunction savedLoopFieldLabelName(text: string): string | undefined {\n const trimmed = text.trim();\n if (isLoopActionText(trimmed)) {\n return undefined;\n }\n const generated = generatedFieldLabelName(trimmed);\n if (generated !== undefined) {\n return generated;\n }\n return LOOP_FIELD_LABELS.get(trimmed.replace(/\\s+/g, \" \").toLowerCase());\n}\n\nfunction canonicalLoopFieldName(text: string): string {\n const generated = generatedFieldLabelName(text);\n if (generated !== undefined) {\n return generated;\n }\n const normalized = text.trim().replace(/\\s+/g, \" \").toLowerCase();\n const mapped = LOOP_FIELD_LABELS.get(normalized);\n if (mapped !== undefined) {\n return mapped;\n }\n return text;\n}\n\nfunction isLoopActionText(text: string | null | undefined): boolean {\n const normalized = text?.trim().toLowerCase();\n return normalized === \"save\" || normalized === \"delete\";\n}\n\nconst LOOP_FIELD_LABELS = new Map<string, string>([\n [\"role\", \"role\"],\n [\"doctor name\", \"doctor_name\"],\n [\"doctor location\", \"doctor_location\"],\n [\"specialization type\", \"specialization_type\"],\n [\"location\", \"location\"],\n [\"prescription name\", \"prescription_name\"],\n [\"prescription dosage\", \"prescription_dosage\"],\n [\"prescription frequency\", \"prescription_frequency\"],\n [\"pharmacy name\", \"pharmacy_name\"],\n [\"pharmacy type\", \"pharmacy_type\"],\n [\"pharmacy address\", \"pharmacy_address\"],\n [\"hospital name\", \"hospital_name\"],\n [\"hospital city state\", \"hospital_city_state\"],\n [\"hospital preference\", \"hospital_preference\"],\n]);\n\nfunction isSavedLoopSummary(element: HTMLElement): boolean {\n if (element.children.length > 0) {\n return false;\n }\n return /\\b[A-Za-z][A-Za-z0-9_]*:\\s*/.test(element.textContent ?? \"\");\n}\n\nfunction labelElementForControl(\n root: HTMLElement,\n control: HTMLElement,\n): HTMLElement | undefined {\n if (control.id.length > 0) {\n const label = root.querySelector<HTMLLabelElement>(\n `label[for=\"${cssString(control.id)}\"]`,\n );\n if (label !== null) {\n return label;\n }\n }\n const group = control.closest<HTMLElement>('[role=\"radiogroup\"]');\n const labelledBy = group?.getAttribute(\"aria-labelledby\");\n if (labelledBy === null || labelledBy === undefined || labelledBy === \"\") {\n return undefined;\n }\n const label = root.ownerDocument.getElementById(labelledBy);\n return label instanceof HTMLElement && root.contains(label) ? label : undefined;\n}\n\nfunction displayFieldLabel(field: string): string {\n const words = field\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .split(/[\\s_-]+/)\n .filter(Boolean);\n return words\n .map((word, index) => displayFieldLabelWord(word, index))\n .join(\" \");\n}\n\nfunction displayFieldLabelWord(word: string, index: number): string {\n const lower = word.toLowerCase();\n const acronyms: Record<string, string> = {\n dob: \"DOB\",\n id: \"ID\",\n ssn: \"SSN\",\n url: \"URL\",\n us: \"US\",\n zip: \"ZIP\",\n };\n if (lower in acronyms) {\n return acronyms[lower]!;\n }\n if (index > 0 && [\"a\", \"an\", \"and\", \"for\", \"in\", \"of\", \"on\", \"or\", \"the\", \"to\", \"with\"].includes(lower)) {\n return lower;\n }\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n}\n\nfunction cssString(value: string): string {\n return globalThis.CSS?.escape?.(value) ?? value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n\nfunction enhanceTabs(\n root: HTMLElement,\n tabs: readonly A2UITabDescriptor[],\n navigation: SectionNavigation | null,\n viewedSectionId: string | null,\n frameId: string,\n onPanelChange: () => void,\n onViewSection: (sectionId: string) => unknown,\n): () => void {\n if (\n tabs.length === 0 ||\n navigation === null ||\n tabs.length !== navigation.orderedSectionIds.length\n ) {\n return () => undefined;\n }\n const header = findTabHeader(root, tabs);\n if (header === undefined) {\n return () => undefined;\n }\n const buttons = [...header.children].filter(\n (child): child is HTMLButtonElement => child instanceof HTMLButtonElement,\n );\n const panel = header.nextElementSibling as HTMLElement | null;\n if (buttons.length !== tabs.length || panel === null) {\n return () => undefined;\n }\n\n const statuses = tabStatuses(navigation);\n const sectionIds = navigation.orderedSectionIds;\n const enabled = statuses\n .map((status, index) => (status === \"future\" ? -1 : index))\n .filter((index) => index >= 0);\n const authoritative = statuses.findIndex((status) => status === \"active\");\n const requested =\n viewedSectionId === null ? -1 : sectionIds.indexOf(viewedSectionId);\n const selectedIndex =\n requested >= 0 && statuses[requested] !== \"future\"\n ? requested\n : authoritative >= 0\n ? authoritative\n : (enabled[0] ?? 0);\n const listeners: Array<() => void> = [];\n let synchronizingRenderer = false;\n header.dataset.a2uiTabList = \"true\";\n header.setAttribute(\"role\", \"tablist\");\n header.setAttribute(\"aria-label\", \"Intake sections\");\n panel.dataset.a2uiTabPanel = \"true\";\n panel.setAttribute(\"role\", \"tabpanel\");\n panel.tabIndex = 0;\n panel.id = `${safeDomToken(frameId)}-tabpanel`;\n\n const activate = (index: number): void => {\n const selected = buttons[index];\n if (selected === undefined || statuses[index] === \"future\") {\n return;\n }\n buttons.forEach((button, buttonIndex) => {\n const isSelected = buttonIndex === index;\n button.setAttribute(\"aria-selected\", String(isSelected));\n button.tabIndex = isSelected ? 0 : -1;\n });\n panel.setAttribute(\"aria-labelledby\", selected.id);\n onPanelChange();\n };\n\n buttons.forEach((button, index) => {\n button.dataset.a2uiTab = statuses[index];\n button.setAttribute(\"role\", \"tab\");\n button.id = `${safeDomToken(frameId)}-tab-${index}`;\n button.setAttribute(\"aria-controls\", panel.id);\n if (statuses[index] === \"future\") {\n button.disabled = true;\n button.setAttribute(\"aria-disabled\", \"true\");\n button.tabIndex = -1;\n }\n const onClick = (): void => {\n activate(index);\n if (!synchronizingRenderer) {\n onViewSection(sectionIds[index]!);\n }\n };\n const onKeyDown = (event: KeyboardEvent): void => {\n const destination = tabKeyboardDestination(\n event,\n index,\n enabled,\n );\n if (destination === undefined) {\n return;\n }\n event.preventDefault();\n buttons[destination]?.focus();\n buttons[destination]?.click();\n };\n button.addEventListener(\"click\", onClick);\n button.addEventListener(\"keydown\", onKeyDown);\n listeners.push(() => {\n button.removeEventListener(\"click\", onClick);\n button.removeEventListener(\"keydown\", onKeyDown);\n });\n });\n synchronizingRenderer = true;\n buttons[selectedIndex]?.click();\n synchronizingRenderer = false;\n activate(selectedIndex);\n\n return () => {\n for (const remove of listeners) {\n remove();\n }\n delete header.dataset.a2uiTabList;\n header.removeAttribute(\"role\");\n header.removeAttribute(\"aria-label\");\n delete panel.dataset.a2uiTabPanel;\n panel.removeAttribute(\"role\");\n panel.removeAttribute(\"aria-labelledby\");\n panel.removeAttribute(\"id\");\n panel.removeAttribute(\"tabindex\");\n buttons.forEach((button) => {\n delete button.dataset.a2uiTab;\n button.removeAttribute(\"role\");\n button.removeAttribute(\"aria-selected\");\n button.removeAttribute(\"aria-controls\");\n button.removeAttribute(\"aria-disabled\");\n button.removeAttribute(\"id\");\n button.removeAttribute(\"tabindex\");\n button.disabled = false;\n });\n };\n}\n\nfunction findTabHeader(\n root: HTMLElement,\n tabs: readonly A2UITabDescriptor[],\n): HTMLElement | undefined {\n return [...root.querySelectorAll<HTMLElement>(\"div\")].find((candidate) => {\n const directButtons = [...candidate.children].filter(\n (child): child is HTMLButtonElement => child instanceof HTMLButtonElement,\n );\n return (\n directButtons.length === tabs.length &&\n directButtons.every(\n (button, index) => button.textContent?.trim() === tabs[index]?.title,\n )\n );\n });\n}\n\ntype TabStatus = \"active\" | \"completed\" | \"future\";\n\nfunction tabStatuses(navigation: SectionNavigation): TabStatus[] {\n const completed = new Set(navigation.completedSectionIds);\n const future = new Set(navigation.futureSectionIds);\n return navigation.orderedSectionIds.map((sectionId): TabStatus => {\n if (sectionId === navigation.activeSectionId) {\n return \"active\";\n }\n return completed.has(sectionId)\n ? \"completed\"\n : future.has(sectionId)\n ? \"future\"\n : \"future\";\n });\n}\n\nfunction tabKeyboardDestination(\n event: KeyboardEvent | ReactKeyboardEvent,\n current: number,\n enabled: readonly number[],\n): number | undefined {\n const currentEnabledIndex = enabled.indexOf(current);\n if (event.key === \"Home\") {\n return enabled[0];\n }\n if (event.key === \"End\") {\n return enabled.at(-1);\n }\n if (event.key !== \"ArrowRight\" && event.key !== \"ArrowLeft\") {\n return undefined;\n }\n const delta = event.key === \"ArrowRight\" ? 1 : -1;\n const start = currentEnabledIndex >= 0 ? currentEnabledIndex : 0;\n return enabled[(start + delta + enabled.length) % enabled.length];\n}\n\nfunction setPendingGroupsDisabled(\n root: HTMLElement,\n pendingGroupIds: ReadonlySet<string>,\n): () => void {\n if (pendingGroupIds.size === 0) {\n return () => undefined;\n }\n const originals = new Map<\n HTMLButtonElement | HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n {\n disabled: boolean;\n busy: string | null;\n pending: string | undefined;\n }\n >();\n for (const control of root.querySelectorAll<HTMLElement>(\n \"[data-a2ui-group-id]\",\n )) {\n if (\n !isDisableableControl(control) ||\n !pendingGroupIds.has(control.dataset.a2uiGroupId ?? \"\")\n ) {\n continue;\n }\n originals.set(control, {\n disabled: control.disabled,\n busy: control.getAttribute(\"aria-busy\"),\n pending: control.dataset.a2uiGroupPending,\n });\n control.disabled = true;\n control.setAttribute(\"aria-busy\", \"true\");\n control.dataset.a2uiGroupPending = \"true\";\n }\n return () => {\n for (const [control, original] of originals) {\n control.disabled = original.disabled;\n restoreAttribute(control, \"aria-busy\", original.busy);\n restoreDataset(\n control,\n \"a2uiGroupPending\",\n original.pending,\n );\n }\n };\n}\n\nfunction isDisableableControl(\n control: HTMLElement,\n): control is\n | HTMLButtonElement\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement {\n return (\n control instanceof HTMLButtonElement ||\n control instanceof HTMLInputElement ||\n control instanceof HTMLTextAreaElement ||\n control instanceof HTMLSelectElement\n );\n}\n\nfunction setInteractionDisabled(\n root: HTMLElement,\n disabled: boolean,\n): () => void {\n if (!disabled) {\n root.removeAttribute(\"inert\");\n return () => undefined;\n }\n root.setAttribute(\"inert\", \"\");\n const controls = [\n ...root.querySelectorAll<\n HTMLButtonElement | HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >(\"button, input, textarea, select\"),\n ];\n for (const control of controls) {\n if (!control.disabled) {\n control.disabled = true;\n control.dataset.a2uiSessionDisabled = \"true\";\n }\n }\n return () => {\n root.removeAttribute(\"inert\");\n for (const control of controls) {\n if (control.dataset.a2uiSessionDisabled === \"true\") {\n control.disabled = false;\n delete control.dataset.a2uiSessionDisabled;\n }\n }\n };\n}\n\nfunction safeDomToken(value: string): string {\n return value.replace(/[^A-Za-z0-9_-]/g, \"-\");\n}\n\nfunction restoreAttribute(\n element: HTMLElement,\n name: string,\n value: string | null,\n): void {\n if (value === null) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value);\n }\n}\n","/**\n * Protocol-neutral A2UI session lifecycle over a structural LiveKit room.\n *\n * LiveKit SDK imports stay out of this module and its declarations. Hosts\n * retain ownership of shared rooms and must explicitly identify which remote\n * participant is trusted to publish Flow Factory server envelopes.\n */\n\nimport { A2uiMessageListSchema } from \"@a2ui/web_core/v0_9\";\n\nimport type {\n A2UIClientAdapter,\n A2UIClientErrorEvent,\n A2UIFieldValue,\n A2UIRendererActionEvent,\n} from \"./adapter.js\";\nimport { A2UIClientActionBridge } from \"./actions.js\";\nimport type { A2UIActionState } from \"./actions.js\";\nimport {\n A2UI_CAPABILITIES_TOPIC,\n A2UI_CLIENT_TOPIC,\n A2UI_PROTOCOL_VERSION,\n A2UI_SERVER_TOPIC,\n ENVELOPE_VERSION,\n MAX_ENVELOPE_BYTES,\n} from \"./envelope.js\";\nimport type {\n A2UICapabilityEnvelope,\n A2UIFieldInteractionGroup,\n A2UIServerEnvelope,\n AckEnvelope,\n ClientErrorCode,\n ParticipantRole,\n SectionNavigation,\n SnapshotEnvelope,\n SurfaceUpdateEnvelope,\n} from \"./envelope.js\";\n\ninterface A2UITextStreamReaderLike {\n readonly info?: { readonly size?: number };\n readAll(options?: { signal?: AbortSignal }): Promise<string>;\n}\n\nexport interface A2UIStreamParticipant {\n readonly identity: string;\n}\n\ntype A2UITextStreamHandler = (\n reader: A2UITextStreamReaderLike,\n participant: A2UIStreamParticipant,\n) => void;\n\ntype A2UIRoomEvent = \"reconnected\" | \"disconnected\";\n\n/** Minimal room contract used by the adapter; no LiveKit SDK type is exposed. */\nexport interface A2UIRoomLike {\n readonly localParticipant: {\n sendText(text: string, options: { topic: string }): Promise<unknown>;\n };\n registerTextStreamHandler(\n topic: string,\n handler: A2UITextStreamHandler,\n ): void;\n unregisterTextStreamHandler(topic: string): void;\n on(event: A2UIRoomEvent, listener: () => void): unknown;\n off(event: A2UIRoomEvent, listener: () => void): unknown;\n}\n\nexport type A2UITrustedServerParticipant = (\n participant: A2UIStreamParticipant,\n) => boolean;\n\nexport type A2UISessionStatus =\n | \"idle\"\n | \"connecting\"\n | \"connected\"\n | \"unsupported\"\n | \"closed\";\n\nexport interface A2UISurfaceMetadata {\n readonly surfaceId: string;\n readonly activeStateId: string | null;\n readonly revision: number;\n readonly sectionNavigation: SectionNavigation | null;\n readonly fieldInteractions: readonly A2UIFieldInteractionGroup[];\n}\n\n/** Protocol-neutral local edit/navigation state exposed to host applications. */\nexport interface A2UIEditingSnapshot {\n readonly authoritativeSectionId: string | null;\n readonly viewedSectionId: string | null;\n readonly dirtyGroupIds: readonly string[];\n readonly pendingGroupIds: readonly string[];\n readonly rejectedGroupIds: readonly string[];\n}\n\nexport interface A2UISessionSnapshot {\n readonly status: A2UISessionStatus;\n readonly restoring: boolean;\n readonly surface: A2UISurfaceMetadata | null;\n readonly actions: A2UIActionState;\n readonly editing: A2UIEditingSnapshot;\n}\n\nexport interface A2UISessionControllerOptions {\n room: A2UIRoomLike;\n adapter: A2UIClientAdapter;\n isTrustedServerParticipant: A2UITrustedServerParticipant;\n participantRole?: ParticipantRole;\n /** Time before a delivered action becomes explicitly retryable. */\n actionAckTimeoutMs?: number;\n /** Best-effort capability retry schedule for servers that attach after join. */\n capabilityRetryScheduleMs?: readonly number[];\n}\n\ninterface RevisionBaseline {\n surfaceId: string;\n revision: number;\n}\n\ninterface FieldGroupDraft {\n readonly surfaceId: string;\n readonly fields: readonly string[];\n readonly baseValues: Readonly<Record<string, A2UIFieldValue>>;\n readonly values: Readonly<Record<string, A2UIFieldValue>>;\n}\n\nconst DEFAULT_CAPABILITY_RETRY_SCHEDULE_MS = [250, 1000, 2500, 5000] as const;\n\n/** Attach one A2UI adapter to an existing, caller-owned room. */\nexport class A2UISessionController {\n readonly #room: A2UIRoomLike;\n readonly #adapter: A2UIClientAdapter;\n readonly #isTrustedServerParticipant: A2UITrustedServerParticipant;\n readonly #participantRole: ParticipantRole;\n readonly #capabilityRetryScheduleMs: readonly number[];\n readonly #actionBridge: A2UIClientActionBridge;\n readonly #listeners = new Set<() => void>();\n\n #sessionSnapshot: A2UISessionSnapshot = {\n status: \"idle\",\n restoring: false,\n surface: null,\n actions: { pendingRequests: [], lastResult: null },\n editing: emptyEditingSnapshot(),\n };\n #startPromise: Promise<void> | undefined;\n #deliveryQueue: Promise<void> = Promise.resolve();\n #handlerRegistered = false;\n #listenersRegistered = false;\n #closed = false;\n #pendingSnapshotRequestId: string | undefined;\n #capabilityGeneration = 0;\n #restoreResetsSequence = false;\n #revisionBaseline: RevisionBaseline | undefined;\n #unsubscribeActions: (() => void) | undefined;\n #unsubscribeClientErrors: (() => void) | undefined;\n #capabilityRetryTimers: ReturnType<typeof globalThis.setTimeout>[] = [];\n #draftsByGroup = new Map<string, FieldGroupDraft>();\n #authoritativeByGroup = new Map<\n string,\n Readonly<Record<string, A2UIFieldValue>>\n >();\n #rejectedGroupIds = new Set<string>();\n #handledActionResultRequestId: string | undefined;\n\n constructor(options: A2UISessionControllerOptions) {\n this.#room = options.room;\n this.#adapter = options.adapter;\n this.#isTrustedServerParticipant = options.isTrustedServerParticipant;\n this.#participantRole = options.participantRole ?? \"member\";\n this.#capabilityRetryScheduleMs =\n options.capabilityRetryScheduleMs ?? DEFAULT_CAPABILITY_RETRY_SCHEDULE_MS;\n this.#actionBridge = new A2UIClientActionBridge({\n publish: async (text) =>\n this.#room.localParticipant.sendText(text, {\n topic: A2UI_CLIENT_TOPIC,\n }),\n canPublish: () =>\n !this.#closed && this.status === \"connected\" && !this.restoring,\n getSurfaceMetadata: () => this.surfaceMetadata,\n reportClientError: (errorCode, surfaceId, detail) =>\n this.#adapter.reportClientError(errorCode, surfaceId, detail),\n onStateChange: (actions) => this.#handleActionStateChange(actions),\n participantRole: this.#participantRole,\n ackTimeoutMs: options.actionAckTimeoutMs,\n });\n }\n\n get status(): A2UISessionStatus {\n return this.#sessionSnapshot.status;\n }\n\n get restoring(): boolean {\n return this.#sessionSnapshot.restoring;\n }\n\n get surfaceMetadata(): A2UISurfaceMetadata | null {\n return this.#sessionSnapshot.surface;\n }\n\n get actionState(): A2UIActionState {\n return this.#sessionSnapshot.actions;\n }\n\n /** Retry one or every delivery-failed/timed-out request with its original id. */\n retryPendingAction(requestId?: string): boolean {\n return this.#actionBridge.retryPendingAction(requestId);\n }\n\n /** Select the authoritative server-owned section without choosing workflow state. */\n returnToCurrentSection(): boolean {\n const authoritative = this.#sessionSnapshot.editing.authoritativeSectionId;\n if (authoritative === null) {\n return false;\n }\n return this.viewSection(authoritative);\n }\n\n /** View one exact server-issued active/completed section locally. */\n viewSection(sectionId: string): boolean {\n const navigation = this.surfaceMetadata?.sectionNavigation;\n if (\n navigation === null ||\n navigation === undefined ||\n sectionId === this.#sessionSnapshot.editing.viewedSectionId ||\n (sectionId !== navigation.activeSectionId &&\n !navigation.completedSectionIds.includes(sectionId))\n ) {\n return false;\n }\n this.#replaceSnapshot({\n editing: {\n ...this.#sessionSnapshot.editing,\n viewedSectionId: sectionId,\n },\n });\n return true;\n }\n\n /** Capture a renderer-owned group after a real user input/change event. */\n captureFieldGroupDraft(groupId: string): boolean {\n const surface = this.surfaceMetadata;\n const group = surface?.fieldInteractions.find(\n (candidate) => candidate.groupId === groupId,\n );\n if (\n surface === null ||\n group === undefined ||\n this.#pendingGroupIds(this.actionState).has(groupId)\n ) {\n return false;\n }\n const fields = group.fields.map((binding) => binding.field);\n const values = this.#adapter.getFieldValues(surface.surfaceId, fields);\n const authoritative = this.#authoritativeByGroup.get(groupId);\n if (values === null || authoritative === undefined) {\n return false;\n }\n if (fieldValuesEqual(values, authoritative, fields)) {\n this.#draftsByGroup.delete(groupId);\n this.#rejectedGroupIds.delete(groupId);\n } else {\n this.#draftsByGroup.set(groupId, {\n surfaceId: surface.surfaceId,\n fields,\n baseValues: { ...authoritative },\n values: { ...values },\n });\n this.#rejectedGroupIds.delete(groupId);\n }\n this.#replaceSnapshot({ editing: this.#editingSnapshot() });\n return true;\n }\n\n /** Commit one complete owning group against the latest surface revision. */\n commitFieldGroup(groupId: string): boolean {\n if (this.status !== \"connected\" || this.restoring) {\n return false;\n }\n this.captureFieldGroupDraft(groupId);\n const surface = this.surfaceMetadata;\n const group = surface?.fieldInteractions.find(\n (candidate) => candidate.groupId === groupId,\n );\n const draft = this.#draftsByGroup.get(groupId);\n const authoritative = this.#authoritativeByGroup.get(groupId);\n if (\n surface === null ||\n group === undefined ||\n draft === undefined ||\n authoritative === undefined ||\n this.#pendingGroupIds(this.actionState).has(groupId) ||\n fieldValuesEqual(draft.values, authoritative, draft.fields) ||\n !this.#groupIsComplete(surface, group, draft.values)\n ) {\n return false;\n }\n return this.#actionBridge.handleFieldGroupCommit(group, draft.values);\n }\n\n getSnapshot = (): A2UISessionSnapshot => this.#sessionSnapshot;\n\n subscribe = (listener: () => void): (() => void) => {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n };\n\n /** Register the server stream before announcing exact renderer capability. */\n async start(): Promise<void> {\n if (this.#closed || this.status === \"closed\") {\n return;\n }\n if (this.#startPromise === undefined) {\n this.#startPromise = this.#startInternal();\n }\n await this.#startPromise;\n }\n\n /**\n * Detach only A2UI handlers/listeners. The shared room remains caller-owned.\n */\n stop(): void {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.#capabilityGeneration += 1;\n this.#pendingSnapshotRequestId = undefined;\n this.#clearCapabilityRetryTimers();\n this.#restoreResetsSequence = false;\n this.#actionBridge.stop();\n this.#detach();\n this.#adapter.clearSurfaces();\n this.#revisionBaseline = undefined;\n this.#clearDrafts();\n this.#replaceSnapshot({\n status: \"closed\",\n restoring: false,\n surface: null,\n actions: { pendingRequests: [], lastResult: null },\n editing: emptyEditingSnapshot(),\n });\n this.#listeners.clear();\n }\n\n async #startInternal(): Promise<void> {\n this.#replaceSnapshot({ status: \"connecting\" });\n try {\n this.#unsubscribeActions = this.#adapter.subscribeActions(\n this.#handleRendererAction,\n );\n this.#unsubscribeClientErrors = this.#adapter.subscribeClientErrors(\n this.#handleClientError,\n );\n this.#room.registerTextStreamHandler(\n A2UI_SERVER_TOPIC,\n this.#handleTextStream,\n );\n this.#handlerRegistered = true;\n this.#listenersRegistered = true;\n this.#room.on(\"reconnected\", this.#handleReconnected);\n this.#room.on(\"disconnected\", this.#handleDisconnected);\n } catch {\n this.#closeAfterStartupFailure();\n return;\n }\n\n const requestId = await this.#announceCapabilities();\n if (requestId === undefined) {\n this.#closeAfterStartupFailure();\n return;\n }\n if (!this.#closed) {\n this.#replaceSnapshot({ status: \"connected\" });\n }\n }\n\n #closeAfterStartupFailure(): void {\n this.#closed = true;\n this.#pendingSnapshotRequestId = undefined;\n this.#clearCapabilityRetryTimers();\n this.#actionBridge.stop();\n this.#detach();\n this.#adapter.clearSurfaces();\n this.#revisionBaseline = undefined;\n this.#clearDrafts();\n this.#replaceSnapshot({\n status: \"closed\",\n restoring: false,\n surface: null,\n actions: { pendingRequests: [], lastResult: null },\n editing: emptyEditingSnapshot(),\n });\n }\n\n #detach(): void {\n this.#clearCapabilityRetryTimers();\n this.#unsubscribeActions?.();\n this.#unsubscribeActions = undefined;\n this.#unsubscribeClientErrors?.();\n this.#unsubscribeClientErrors = undefined;\n if (this.#handlerRegistered) {\n try {\n this.#room.unregisterTextStreamHandler(A2UI_SERVER_TOPIC);\n } catch {\n // Cleanup remains best-effort and body-free.\n }\n this.#handlerRegistered = false;\n }\n if (this.#listenersRegistered) {\n try {\n this.#room.off(\"reconnected\", this.#handleReconnected);\n } catch {\n // Cleanup remains best-effort and body-free.\n }\n try {\n this.#room.off(\"disconnected\", this.#handleDisconnected);\n } catch {\n // Cleanup remains best-effort and body-free.\n }\n this.#listenersRegistered = false;\n }\n }\n\n #handleTextStream: A2UITextStreamHandler = (reader, participant) => {\n if (this.#closed || !this.#handlerRegistered) {\n return;\n }\n let trusted = false;\n try {\n trusted =\n isNonEmptyString(participant?.identity) &&\n this.#isTrustedServerParticipant(participant);\n } catch {\n trusted = false;\n }\n if (!trusted) {\n return;\n }\n\n this.#deliveryQueue = this.#deliveryQueue\n .then(async () => this.#readAndProcess(reader))\n .catch(() => {\n this.#reportInboundError(\"message_malformed\", \"delivery_failed\");\n });\n };\n\n #handleRendererAction = (event: A2UIRendererActionEvent): void => {\n this.#actionBridge.handleRendererAction(event);\n };\n\n #handleClientError = (event: A2UIClientErrorEvent): void => {\n this.#actionBridge.handleClientError(event);\n };\n\n async #readAndProcess(reader: A2UITextStreamReaderLike): Promise<void> {\n if (this.#closed) {\n return;\n }\n if (\n typeof reader.info?.size === \"number\" &&\n reader.info.size > MAX_ENVELOPE_BYTES\n ) {\n this.#reportInboundError(\"message_malformed\", \"envelope_too_large\");\n return;\n }\n\n let text: string;\n try {\n text = await reader.readAll();\n } catch {\n this.#reportInboundError(\"message_malformed\", \"stream_read_failed\");\n return;\n }\n if (this.#closed || typeof text !== \"string\") {\n return;\n }\n if (new TextEncoder().encode(text).byteLength > MAX_ENVELOPE_BYTES) {\n this.#reportInboundError(\"message_malformed\", \"envelope_too_large\");\n return;\n }\n\n const decoded = decodeServerEnvelope(text);\n if (!decoded.ok) {\n this.#reportInboundError(decoded.errorCode, decoded.detail);\n return;\n }\n await this.#processEnvelope(decoded.envelope);\n }\n\n async #processEnvelope(envelope: A2UIServerEnvelope): Promise<void> {\n if (this.#closed) {\n return;\n }\n\n const correlated =\n this.#pendingSnapshotRequestId !== undefined &&\n \"inResponseTo\" in envelope &&\n envelope.inResponseTo === this.#pendingSnapshotRequestId;\n\n if (correlated && envelope.kind === \"snapshot\") {\n await this.#applyAuthoritativeSnapshot(envelope);\n return;\n }\n if (correlated && envelope.kind === \"ack\") {\n if (await this.#handleCapabilityAck(envelope)) {\n return;\n }\n }\n\n if (this.status === \"unsupported\") {\n return;\n }\n\n if (this.restoring && envelope.kind !== \"ack\") {\n // Ordinary surface traffic cannot cross the restore barrier.\n if (this.#pendingSnapshotRequestId === undefined) {\n await this.#announceCapabilities();\n }\n return;\n }\n if (envelope.seq <= this.#adapter.lastSeq) {\n return;\n }\n if (envelope.kind === \"ack\") {\n if (this.#adapter.applyServerEnvelope(envelope) && !this.restoring) {\n this.#actionBridge.handleAck(envelope);\n }\n return;\n }\n if (envelope.kind === \"snapshot\") {\n await this.#applyAuthoritativeSnapshot(envelope);\n return;\n }\n\n await this.#applyContiguousUpdate(envelope);\n }\n\n async #applyContiguousUpdate(\n envelope: SurfaceUpdateEnvelope,\n ): Promise<void> {\n const baseline = this.#revisionBaseline;\n if (baseline !== undefined) {\n if (baseline.surfaceId !== envelope.surfaceId) {\n await this.#enterRestoreBarrier();\n return;\n }\n if (envelope.revision <= baseline.revision) {\n return;\n }\n if (envelope.revision !== baseline.revision + 1) {\n await this.#enterRestoreBarrier();\n return;\n }\n }\n\n if (!this.#adapter.applyServerEnvelope(envelope)) {\n await this.#enterRestoreBarrier();\n return;\n }\n this.#revisionBaseline = {\n surfaceId: envelope.surfaceId,\n revision: envelope.revision,\n };\n const surface = this.#metadataAfterApply(envelope);\n this.#reconcileDrafts(envelope, surface);\n this.#replaceSnapshot({\n surface,\n editing: this.#editingSnapshot(surface),\n });\n }\n\n async #applyAuthoritativeSnapshot(\n envelope: SnapshotEnvelope,\n ): Promise<void> {\n const correlated =\n this.#pendingSnapshotRequestId !== undefined &&\n envelope.inResponseTo === this.#pendingSnapshotRequestId;\n if (this.restoring && !correlated) {\n return;\n }\n\n if (correlated && this.#restoreResetsSequence) {\n this.#adapter.resetSequence();\n this.#restoreResetsSequence = false;\n } else if (envelope.seq <= this.#adapter.lastSeq) {\n return;\n }\n\n if (!this.#adapter.applyServerEnvelope(envelope)) {\n if (correlated) {\n this.#pendingSnapshotRequestId = undefined;\n }\n await this.#enterRestoreBarrier();\n return;\n }\n\n this.#revisionBaseline = {\n surfaceId: envelope.surfaceId,\n revision: envelope.revision,\n };\n this.#clearCapabilityRetryTimers();\n if (correlated) {\n this.#pendingSnapshotRequestId = undefined;\n }\n const surface = this.#metadataAfterApply(envelope);\n this.#reconcileDrafts(envelope, surface);\n this.#replaceSnapshot({\n status: \"connected\",\n restoring: false,\n surface,\n editing: this.#editingSnapshot(surface),\n });\n this.#actionBridge.retryAfterRestore();\n }\n\n async #handleCapabilityAck(envelope: AckEnvelope): Promise<boolean> {\n if (\n envelope.status === \"rejected\" &&\n (envelope.reasonCode === \"a2ui_version_unsupported\" ||\n envelope.reasonCode === \"catalog_unsupported\")\n ) {\n if (this.#restoreResetsSequence) {\n this.#adapter.resetSequence();\n this.#restoreResetsSequence = false;\n }\n this.#adapter.applyServerEnvelope(envelope);\n this.#adapter.clearSurfaces();\n this.#actionBridge.discardPending();\n this.#pendingSnapshotRequestId = undefined;\n this.#clearCapabilityRetryTimers();\n this.#revisionBaseline = undefined;\n this.#clearDrafts();\n this.#replaceSnapshot({\n status: \"unsupported\",\n restoring: false,\n surface: null,\n });\n return true;\n }\n\n if (envelope.status === \"accepted\" && envelope.noSurface === true) {\n if (this.#restoreResetsSequence) {\n this.#adapter.resetSequence();\n this.#restoreResetsSequence = false;\n }\n this.#adapter.applyServerEnvelope(envelope);\n this.#adapter.clearSurfaces();\n this.#pendingSnapshotRequestId = undefined;\n this.#clearCapabilityRetryTimers();\n this.#revisionBaseline = undefined;\n this.#clearDrafts();\n this.#replaceSnapshot({\n status: \"connected\",\n restoring: false,\n surface: null,\n });\n this.#actionBridge.retryAfterRestore();\n return true;\n }\n\n return false;\n }\n\n async #enterRestoreBarrier(): Promise<void> {\n if (this.#closed) {\n return;\n }\n if (!this.restoring) {\n this.#actionBridge.markReconnect();\n this.#replaceSnapshot({ restoring: true });\n }\n if (this.#pendingSnapshotRequestId === undefined) {\n await this.#announceCapabilities();\n }\n }\n\n #metadataAfterApply(\n envelope: SurfaceUpdateEnvelope | SnapshotEnvelope,\n ): A2UISurfaceMetadata | null {\n if (this.#adapter.getSurface(envelope.surfaceId) === undefined) {\n return null;\n }\n return {\n surfaceId: envelope.surfaceId,\n activeStateId: envelope.activeStateId ?? null,\n revision: envelope.revision,\n sectionNavigation: cloneSectionNavigation(\n envelope.sectionNavigation ?? null,\n ),\n fieldInteractions: cloneFieldInteractions(\n envelope.fieldInteractions ?? [],\n ),\n };\n }\n\n #handleActionStateChange(actions: A2UIActionState): void {\n const result = actions.lastResult;\n let acceptedGroup = false;\n let rejectedGroupId: string | undefined;\n if (\n result?.groupId !== undefined &&\n result.requestId !== this.#handledActionResultRequestId\n ) {\n this.#handledActionResultRequestId = result.requestId;\n if (result.status === \"accepted\") {\n acceptedGroup = true;\n const acceptedDraft = this.#draftsByGroup.get(result.groupId);\n if (acceptedDraft !== undefined) {\n this.#authoritativeByGroup.set(result.groupId, {\n ...acceptedDraft.values,\n });\n }\n this.#draftsByGroup.delete(result.groupId);\n this.#rejectedGroupIds.delete(result.groupId);\n } else if (this.#draftsByGroup.has(result.groupId)) {\n this.#rejectedGroupIds.add(result.groupId);\n rejectedGroupId = result.groupId;\n }\n }\n let editing = this.#editingSnapshot(undefined, actions);\n if (rejectedGroupId !== undefined) {\n const rejectedSection = this.surfaceMetadata?.fieldInteractions.find(\n (group) => group.groupId === rejectedGroupId,\n )?.sectionId;\n if (rejectedSection !== undefined) {\n editing = { ...editing, viewedSectionId: rejectedSection };\n }\n }\n if (\n acceptedGroup &&\n editing.dirtyGroupIds.length === 0 &&\n editing.pendingGroupIds.length === 0 &&\n editing.rejectedGroupIds.length === 0\n ) {\n editing = {\n ...editing,\n viewedSectionId: editing.authoritativeSectionId,\n };\n }\n this.#replaceSnapshot({\n actions,\n editing,\n });\n }\n\n #pendingGroupIds(actions: A2UIActionState): Set<string> {\n return new Set(\n actions.pendingRequests.flatMap((pending) =>\n pending.groupId === undefined ? [] : [pending.groupId],\n ),\n );\n }\n\n #editingSnapshot(\n surface: A2UISurfaceMetadata | null | undefined = undefined,\n actions: A2UIActionState = this.#sessionSnapshot.actions,\n ): A2UIEditingSnapshot {\n const resolvedSurface =\n surface === undefined ? this.#sessionSnapshot.surface : surface;\n if (resolvedSurface === null) {\n return emptyEditingSnapshot();\n }\n const pending = this.#pendingGroupIds(actions);\n const order = resolvedSurface.fieldInteractions.map(\n (group) => group.groupId,\n );\n const ordered = (ids: Iterable<string>): string[] => {\n const values = new Set(ids);\n return [\n ...order.filter((groupId) => values.delete(groupId)),\n ...[...values].sort(),\n ];\n };\n const rejected = new Set(\n [...this.#rejectedGroupIds].filter((groupId) =>\n this.#draftsByGroup.has(groupId),\n ),\n );\n const dirty = [...this.#draftsByGroup.keys()].filter(\n (groupId) => !pending.has(groupId) && !rejected.has(groupId),\n );\n const authoritative =\n resolvedSurface.sectionNavigation?.activeSectionId ?? null;\n const authoritativeChanged =\n authoritative !== this.#sessionSnapshot.editing.authoritativeSectionId;\n const viewed = this.#sessionSnapshot.editing.viewedSectionId;\n const viewedStillAvailable =\n viewed !== null &&\n (viewed === authoritative ||\n (resolvedSurface.sectionNavigation?.completedSectionIds.includes(\n viewed,\n ) ?? false));\n const preserveView =\n dirty.length > 0 || pending.size > 0 || rejected.size > 0;\n return {\n authoritativeSectionId: authoritative,\n viewedSectionId:\n preserveView || (!authoritativeChanged && viewedStillAvailable)\n ? (viewed ?? authoritative)\n : authoritative,\n dirtyGroupIds: ordered(dirty),\n pendingGroupIds: ordered(pending),\n rejectedGroupIds: ordered(rejected),\n };\n }\n\n #groupIsComplete(\n surface: A2UISurfaceMetadata,\n group: A2UIFieldInteractionGroup,\n values: Readonly<Record<string, A2UIFieldValue>>,\n ): boolean {\n const descriptors = new Map(\n this.#adapter\n .getSurfaceStructure(surface.surfaceId)\n .fields.map((field) => [field.componentId, field]),\n );\n return group.fields.every((binding) => {\n const descriptor = descriptors.get(binding.componentId);\n const value = values[binding.field];\n return (\n descriptor?.field === binding.field &&\n isFieldValue(value) &&\n (!descriptor.required || !isIncompleteRequiredValue(value))\n );\n });\n }\n\n #reconcileDrafts(\n envelope: SurfaceUpdateEnvelope | SnapshotEnvelope,\n surface: A2UISurfaceMetadata | null,\n ): void {\n if (surface === null) {\n this.#clearDrafts();\n return;\n }\n const incoming = envelopeRootFieldValues(envelope);\n const presentGroups = new Set(\n surface.fieldInteractions.map((group) => group.groupId),\n );\n const pending = this.#pendingGroupIds(this.actionState);\n for (const group of surface.fieldInteractions) {\n const fields = group.fields.map((binding) => binding.field);\n const incomingValues = selectFieldValues(incoming, fields);\n const authoritative =\n incomingValues ??\n this.#authoritativeByGroup.get(group.groupId) ??\n this.#adapter.getFieldValues(surface.surfaceId, fields);\n if (authoritative !== null && authoritative !== undefined) {\n this.#authoritativeByGroup.set(group.groupId, {\n ...authoritative,\n });\n }\n\n const draft = this.#draftsByGroup.get(group.groupId);\n if (draft === undefined) {\n continue;\n }\n if (\n draft.surfaceId !== surface.surfaceId ||\n !arraysEqual(draft.fields, fields)\n ) {\n this.#draftsByGroup.delete(group.groupId);\n this.#rejectedGroupIds.delete(group.groupId);\n continue;\n }\n if (\n authoritative !== null &&\n authoritative !== undefined &&\n fieldValuesEqual(draft.values, authoritative, fields) &&\n !pending.has(group.groupId)\n ) {\n this.#draftsByGroup.delete(group.groupId);\n this.#rejectedGroupIds.delete(group.groupId);\n continue;\n }\n if (\n authoritative !== null &&\n authoritative !== undefined &&\n !pending.has(group.groupId) &&\n !fieldValuesEqual(draft.baseValues, authoritative, fields)\n ) {\n this.#draftsByGroup.delete(group.groupId);\n this.#rejectedGroupIds.delete(group.groupId);\n continue;\n }\n this.#adapter.applyFieldValues(surface.surfaceId, draft.values);\n }\n\n for (const groupId of [...this.#authoritativeByGroup.keys()]) {\n if (!presentGroups.has(groupId)) {\n this.#authoritativeByGroup.delete(groupId);\n }\n }\n for (const groupId of [...this.#draftsByGroup.keys()]) {\n if (!presentGroups.has(groupId) && !pending.has(groupId)) {\n this.#draftsByGroup.delete(groupId);\n this.#rejectedGroupIds.delete(groupId);\n }\n }\n }\n\n #clearDrafts(): void {\n this.#draftsByGroup.clear();\n this.#authoritativeByGroup.clear();\n this.#rejectedGroupIds.clear();\n this.#handledActionResultRequestId = undefined;\n }\n\n #handleReconnected = (): void => {\n if (this.#closed) {\n return;\n }\n void this.#beginReconnectRestore();\n };\n\n async #beginReconnectRestore(): Promise<void> {\n if (this.#closed) {\n return;\n }\n if (\n this.#restoreResetsSequence &&\n this.restoring &&\n this.#pendingSnapshotRequestId !== undefined\n ) {\n return;\n }\n this.#pendingSnapshotRequestId = undefined;\n this.#restoreResetsSequence = true;\n this.#actionBridge.markReconnect();\n this.#replaceSnapshot({ restoring: true });\n await this.#announceCapabilities();\n }\n\n #handleDisconnected = (): void => {\n this.stop();\n };\n\n async #announceCapabilities(): Promise<string | undefined> {\n if (this.#closed) {\n return undefined;\n }\n let requestId: string;\n try {\n requestId = createCapabilityRequestId();\n } catch {\n return undefined;\n }\n const envelope: A2UICapabilityEnvelope = {\n envelopeVersion: ENVELOPE_VERSION,\n kind: \"capabilities\",\n requestId,\n role: this.#participantRole,\n supportedA2uiVersions: [A2UI_PROTOCOL_VERSION],\n supportedCatalogIds: this.#adapter.supportedCatalogIds,\n renderer: {\n name: this.#adapter.rendererName,\n version: this.#adapter.rendererVersion,\n },\n requestSnapshot: true,\n };\n this.#pendingSnapshotRequestId = requestId;\n const generation = ++this.#capabilityGeneration;\n try {\n const encoded = JSON.stringify(envelope);\n await this.#room.localParticipant.sendText(encoded, {\n topic: A2UI_CAPABILITIES_TOPIC,\n });\n this.#scheduleCapabilityRetries(encoded, requestId, generation);\n } catch {\n if (this.#pendingSnapshotRequestId === requestId) {\n this.#pendingSnapshotRequestId = undefined;\n }\n return undefined;\n }\n return requestId;\n }\n\n #scheduleCapabilityRetries(\n encoded: string,\n requestId: string,\n generation: number,\n ): void {\n this.#clearCapabilityRetryTimers();\n for (const retryAfterMs of this.#capabilityRetryScheduleMs) {\n const timer = globalThis.setTimeout(() => {\n if (\n this.#closed ||\n generation !== this.#capabilityGeneration ||\n this.#pendingSnapshotRequestId !== requestId ||\n !this.#handlerRegistered\n ) {\n return;\n }\n void this.#room.localParticipant\n .sendText(encoded, { topic: A2UI_CAPABILITIES_TOPIC })\n .catch(() => undefined);\n }, retryAfterMs);\n this.#capabilityRetryTimers.push(timer);\n }\n }\n\n #clearCapabilityRetryTimers(): void {\n for (const timer of this.#capabilityRetryTimers) {\n globalThis.clearTimeout(timer);\n }\n this.#capabilityRetryTimers = [];\n }\n\n #reportInboundError(errorCode: ClientErrorCode, detail: string): void {\n if (!this.#closed) {\n this.#adapter.reportClientError(errorCode, undefined, detail);\n }\n }\n\n #replaceSnapshot(\n patch: Partial<\n Pick<\n A2UISessionSnapshot,\n \"status\" | \"restoring\" | \"surface\" | \"actions\" | \"editing\"\n >\n >,\n ): void {\n const nextSurface =\n patch.surface === undefined ? this.#sessionSnapshot.surface : patch.surface;\n const nextEditing =\n patch.editing ??\n editingAfterSurface(this.#sessionSnapshot.editing, patch.surface);\n this.#sessionSnapshot = {\n status: patch.status ?? this.#sessionSnapshot.status,\n restoring: patch.restoring ?? this.#sessionSnapshot.restoring,\n surface:\n patch.surface === undefined\n ? this.#sessionSnapshot.surface\n : patch.surface,\n actions: patch.actions ?? this.#sessionSnapshot.actions,\n editing: nextSurface === null ? emptyEditingSnapshot() : nextEditing,\n };\n for (const listener of this.#listeners) {\n listener();\n }\n }\n}\n\nfunction createCapabilityRequestId(): string {\n return `cap-${globalThis.crypto.randomUUID()}`;\n}\n\nfunction cloneSectionNavigation(\n navigation: SectionNavigation | null,\n): SectionNavigation | null {\n if (navigation === null) {\n return null;\n }\n return {\n orderedSectionIds: [...navigation.orderedSectionIds],\n activeSectionId: navigation.activeSectionId,\n completedSectionIds: [...navigation.completedSectionIds],\n futureSectionIds: [...navigation.futureSectionIds],\n };\n}\n\nfunction cloneFieldInteractions(\n groups: readonly A2UIFieldInteractionGroup[],\n): A2UIFieldInteractionGroup[] {\n return groups.map((group) => ({\n groupId: group.groupId,\n ownerStateId: group.ownerStateId,\n ...(group.sectionId === undefined ? {} : { sectionId: group.sectionId }),\n mode: group.mode,\n fields: group.fields.map((field) => ({ ...field })),\n }));\n}\n\nfunction emptyEditingSnapshot(): A2UIEditingSnapshot {\n return {\n authoritativeSectionId: null,\n viewedSectionId: null,\n dirtyGroupIds: [],\n pendingGroupIds: [],\n rejectedGroupIds: [],\n };\n}\n\nfunction editingAfterSurface(\n editing: A2UIEditingSnapshot,\n surface: A2UISurfaceMetadata | null | undefined,\n): A2UIEditingSnapshot {\n if (surface === undefined) {\n return editing;\n }\n if (surface === null) {\n return emptyEditingSnapshot();\n }\n const authoritative = surface.sectionNavigation?.activeSectionId ?? null;\n const viewedStillAvailable =\n editing.viewedSectionId !== null &&\n (editing.viewedSectionId === authoritative ||\n (surface.sectionNavigation?.completedSectionIds.includes(\n editing.viewedSectionId,\n ) ?? false));\n const preserveView =\n editing.dirtyGroupIds.length > 0 ||\n editing.pendingGroupIds.length > 0 ||\n editing.rejectedGroupIds.length > 0 ||\n (editing.authoritativeSectionId === authoritative && viewedStillAvailable);\n return {\n ...editing,\n authoritativeSectionId: authoritative,\n viewedSectionId: preserveView\n ? editing.viewedSectionId\n : authoritative,\n };\n}\n\ntype DecodeResult =\n | { ok: true; envelope: A2UIServerEnvelope }\n | { ok: false; errorCode: ClientErrorCode; detail: string };\n\nexport function decodeServerEnvelope(text: string): DecodeResult {\n let value: unknown;\n try {\n value = JSON.parse(text) as unknown;\n } catch {\n return invalid(\"message_malformed\", \"json_invalid\");\n }\n if (!isRecord(value)) {\n return invalid(\"message_malformed\", \"envelope_invalid\");\n }\n if (value.envelopeVersion !== ENVELOPE_VERSION) {\n return invalid(\"envelope_unsupported\", \"envelope_version_unsupported\");\n }\n if (\n value.a2uiVersion !== A2UI_PROTOCOL_VERSION ||\n !isPositiveInteger(value.seq)\n ) {\n return invalid(\"envelope_unsupported\", \"protocol_unsupported\");\n }\n if (value.kind === \"surfaceUpdate\" || value.kind === \"snapshot\") {\n return decodeSurfaceEnvelope(value, value.kind);\n }\n if (value.kind === \"ack\") {\n return decodeAckEnvelope(value);\n }\n return invalid(\"envelope_unsupported\", \"kind_unsupported\");\n}\n\nfunction decodeSurfaceEnvelope(\n value: Record<string, unknown>,\n kind: \"surfaceUpdate\" | \"snapshot\",\n): DecodeResult {\n const allowed = [\n \"envelopeVersion\",\n \"a2uiVersion\",\n \"kind\",\n \"seq\",\n \"surfaceId\",\n \"revision\",\n \"activeStateId\",\n \"sectionNavigation\",\n \"fieldInteractions\",\n \"messages\",\n ...(kind === \"snapshot\" ? [\"inResponseTo\"] : []),\n ];\n const required = [\n \"envelopeVersion\",\n \"a2uiVersion\",\n \"kind\",\n \"seq\",\n \"surfaceId\",\n \"revision\",\n \"messages\",\n ];\n if (!hasExactKeys(value, allowed, required)) {\n return invalid(\"envelope_unsupported\", \"envelope_properties_invalid\");\n }\n if (\n !isNonEmptyString(value.surfaceId) ||\n !isPositiveInteger(value.revision) ||\n (\"activeStateId\" in value &&\n value.activeStateId !== null &&\n !isNonEmptyString(value.activeStateId)) ||\n (\"inResponseTo\" in value && !isNonEmptyString(value.inResponseTo)) ||\n (\"sectionNavigation\" in value &&\n !isSectionNavigation(value.sectionNavigation)) ||\n (\"fieldInteractions\" in value &&\n !isFieldInteractions(\n value.fieldInteractions,\n value.activeStateId,\n value.sectionNavigation,\n ))\n ) {\n return invalid(\"message_malformed\", \"surface_metadata_invalid\");\n }\n const parsedMessages = A2uiMessageListSchema.safeParse(value.messages);\n if (!parsedMessages.success || parsedMessages.data.length === 0) {\n return invalid(\"message_malformed\", \"messages_invalid\");\n }\n if (\n parsedMessages.data.some((message) => {\n const lifecycle = [\n \"createSurface\",\n \"updateComponents\",\n \"updateDataModel\",\n \"deleteSurface\",\n ].find((key) => key in message);\n if (lifecycle === undefined) {\n return true;\n }\n const body = message[lifecycle as keyof typeof message] as {\n surfaceId?: unknown;\n };\n return body.surfaceId !== value.surfaceId;\n })\n ) {\n return invalid(\"message_malformed\", \"message_surface_mismatch\");\n }\n return {\n ok: true,\n envelope: value as unknown as A2UIServerEnvelope,\n };\n}\n\nconst SERVER_REASON_CODES = new Set([\n \"envelope_version_unsupported\",\n \"a2ui_version_unsupported\",\n \"catalog_unsupported\",\n \"role_unauthorized\",\n \"surface_unknown\",\n \"state_mismatch\",\n \"revision_stale\",\n \"request_duplicate\",\n \"action_disallowed\",\n \"field_unknown\",\n \"value_invalid\",\n \"payload_malformed\",\n \"envelope_too_large\",\n]);\n\nfunction decodeAckEnvelope(value: Record<string, unknown>): DecodeResult {\n const allowed = [\n \"envelopeVersion\",\n \"a2uiVersion\",\n \"kind\",\n \"seq\",\n \"inResponseTo\",\n \"status\",\n \"reasonCode\",\n \"fieldErrors\",\n \"noSurface\",\n ];\n const required = [\n \"envelopeVersion\",\n \"a2uiVersion\",\n \"kind\",\n \"seq\",\n \"inResponseTo\",\n \"status\",\n ];\n if (!hasExactKeys(value, allowed, required)) {\n return invalid(\"envelope_unsupported\", \"envelope_properties_invalid\");\n }\n if (\n !isNonEmptyString(value.inResponseTo) ||\n (value.status !== \"accepted\" && value.status !== \"rejected\") ||\n (value.status === \"accepted\" && \"reasonCode\" in value) ||\n (value.status === \"rejected\" &&\n (!isNonEmptyString(value.reasonCode) ||\n !SERVER_REASON_CODES.has(value.reasonCode))) ||\n (\"noSurface\" in value && typeof value.noSurface !== \"boolean\") ||\n (\"fieldErrors\" in value && !isFieldErrors(value.fieldErrors))\n ) {\n return invalid(\"message_malformed\", \"ack_invalid\");\n }\n return {\n ok: true,\n envelope: value as unknown as A2UIServerEnvelope,\n };\n}\n\nfunction isFieldErrors(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.every(\n (entry) =>\n isRecord(entry) &&\n hasExactKeys(entry, [\"field\", \"reasonCode\"], [\"field\", \"reasonCode\"]) &&\n isNonEmptyString(entry.field) &&\n isNonEmptyString(entry.reasonCode) &&\n SERVER_REASON_CODES.has(entry.reasonCode),\n )\n );\n}\n\nfunction isSectionNavigation(value: unknown): value is SectionNavigation {\n if (\n !isRecord(value) ||\n !hasExactKeys(\n value,\n [\n \"orderedSectionIds\",\n \"activeSectionId\",\n \"completedSectionIds\",\n \"futureSectionIds\",\n ],\n [\n \"orderedSectionIds\",\n \"activeSectionId\",\n \"completedSectionIds\",\n \"futureSectionIds\",\n ],\n ) ||\n !isNonEmptyStringArray(value.orderedSectionIds) ||\n value.orderedSectionIds.length === 0 ||\n new Set(value.orderedSectionIds).size !== value.orderedSectionIds.length ||\n (value.activeSectionId !== null &&\n !isNonEmptyString(value.activeSectionId)) ||\n !isNonEmptyStringArray(value.completedSectionIds) ||\n !isNonEmptyStringArray(value.futureSectionIds) ||\n new Set(value.completedSectionIds).size !==\n value.completedSectionIds.length ||\n new Set(value.futureSectionIds).size !== value.futureSectionIds.length\n ) {\n return false;\n }\n const orderedSectionIds = value.orderedSectionIds as string[];\n const completedSectionIds = value.completedSectionIds as string[];\n const futureSectionIds = value.futureSectionIds as string[];\n const activeSectionId = value.activeSectionId as string | null;\n const classified = [\n ...completedSectionIds,\n ...futureSectionIds,\n ...(activeSectionId === null ? [] : [activeSectionId]),\n ];\n return (\n new Set(classified).size === classified.length &&\n classified.length === orderedSectionIds.length &&\n classified.every((sectionId) =>\n orderedSectionIds.includes(sectionId),\n ) &&\n arraysEqual(\n completedSectionIds,\n orderedSectionIds.filter((sectionId) =>\n completedSectionIds.includes(sectionId),\n ),\n ) &&\n arraysEqual(\n futureSectionIds,\n orderedSectionIds.filter((sectionId) =>\n futureSectionIds.includes(sectionId),\n ),\n )\n );\n}\n\nfunction isFieldInteractions(\n value: unknown,\n activeStateId: unknown,\n navigationValue: unknown,\n): value is A2UIFieldInteractionGroup[] {\n if (!Array.isArray(value) || value.length === 0) {\n return false;\n }\n const navigation = isSectionNavigation(navigationValue)\n ? navigationValue\n : null;\n const groupIds = new Set<string>();\n const fields = new Set<string>();\n const componentIds = new Set<string>();\n let currentCount = 0;\n for (const group of value) {\n if (\n !isRecord(group) ||\n !hasExactKeys(\n group,\n [\"groupId\", \"ownerStateId\", \"sectionId\", \"mode\", \"fields\"],\n [\"groupId\", \"ownerStateId\", \"mode\", \"fields\"],\n ) ||\n !isNonEmptyString(group.groupId) ||\n !isNonEmptyString(group.ownerStateId) ||\n (group.mode !== \"current\" && group.mode !== \"revision\") ||\n !Array.isArray(group.fields) ||\n group.fields.length === 0 ||\n groupIds.has(group.groupId)\n ) {\n return false;\n }\n groupIds.add(group.groupId);\n if (group.mode === \"current\") {\n currentCount += 1;\n if (group.ownerStateId !== activeStateId) {\n return false;\n }\n } else if (group.ownerStateId === activeStateId) {\n return false;\n }\n if (\"sectionId\" in group) {\n if (\n !isNonEmptyString(group.sectionId) ||\n navigation === null ||\n !navigation.orderedSectionIds.includes(group.sectionId) ||\n (group.mode === \"current\" &&\n group.sectionId !== navigation.activeSectionId) ||\n (group.mode === \"revision\" &&\n group.sectionId !== navigation.activeSectionId &&\n !navigation.completedSectionIds.includes(group.sectionId))\n ) {\n return false;\n }\n }\n for (const binding of group.fields) {\n if (\n !isRecord(binding) ||\n !hasExactKeys(\n binding,\n [\"field\", \"componentId\"],\n [\"field\", \"componentId\"],\n ) ||\n !isNonEmptyString(binding.field) ||\n !isNonEmptyString(binding.componentId) ||\n fields.has(binding.field) ||\n componentIds.has(binding.componentId)\n ) {\n return false;\n }\n fields.add(binding.field);\n componentIds.add(binding.componentId);\n }\n }\n return currentCount <= 1;\n}\n\nfunction isNonEmptyStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(isNonEmptyString);\n}\n\nfunction arraysEqual(left: readonly string[], right: readonly string[]): boolean {\n return (\n left.length === right.length &&\n left.every((value, index) => value === right[index])\n );\n}\n\nfunction fieldValuesEqual(\n left: Readonly<Record<string, A2UIFieldValue>>,\n right: Readonly<Record<string, A2UIFieldValue>>,\n fields: readonly string[],\n): boolean {\n return fields.every(\n (field) =>\n Object.hasOwn(left, field) &&\n Object.hasOwn(right, field) &&\n Object.is(left[field], right[field]),\n );\n}\n\nfunction isFieldValue(value: unknown): value is A2UIFieldValue {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction isIncompleteRequiredValue(value: A2UIFieldValue): boolean {\n return value === null || (typeof value === \"string\" && value.trim() === \"\");\n}\n\nfunction envelopeRootFieldValues(\n envelope: SurfaceUpdateEnvelope | SnapshotEnvelope,\n): Readonly<Record<string, A2UIFieldValue>> | null {\n let values: Record<string, A2UIFieldValue> | null = null;\n for (const message of envelope.messages as readonly unknown[]) {\n if (!isRecord(message) || !isRecord(message.updateDataModel)) {\n continue;\n }\n const update = message.updateDataModel;\n if (\n update.surfaceId !== envelope.surfaceId ||\n (update.path !== undefined && update.path !== \"/\") ||\n !isRecord(update.value)\n ) {\n continue;\n }\n const candidate: Record<string, A2UIFieldValue> = {};\n for (const [field, value] of Object.entries(update.value)) {\n if (isFieldValue(value)) {\n candidate[field] = value;\n }\n }\n values = candidate;\n }\n return values;\n}\n\nfunction selectFieldValues(\n source: Readonly<Record<string, A2UIFieldValue>> | null,\n fields: readonly string[],\n): Readonly<Record<string, A2UIFieldValue>> | null {\n if (source === null) {\n return null;\n }\n const selected: Record<string, A2UIFieldValue> = {};\n for (const field of fields) {\n if (!Object.hasOwn(source, field)) {\n return null;\n }\n selected[field] = source[field] ?? null;\n }\n return selected;\n}\n\nfunction hasExactKeys(\n value: Record<string, unknown>,\n allowed: readonly string[],\n required: readonly string[],\n): boolean {\n const keys = Object.keys(value);\n return (\n keys.every((key) => allowed.includes(key)) &&\n required.every((key) => Object.hasOwn(value, key))\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 isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isPositiveInteger(value: unknown): value is number {\n return Number.isInteger(value) && typeof value === \"number\" && value > 0;\n}\n\nfunction invalid(\n errorCode: ClientErrorCode,\n detail: string,\n): DecodeResult {\n return { ok: false, errorCode, detail };\n}\n","/**\n * MedAid v0.9.1 action/correlation bridge.\n *\n * The official renderer emits protocol actions; this bridge binds them to the\n * authoritative session metadata and the MedAid v1 envelope. It deliberately\n * separates LiveKit delivery from application acknowledgement so a successful\n * `sendText` call can never be mistaken for a workflow transition.\n */\n\nimport type {\n A2UIClientErrorEvent,\n A2UIFieldValue,\n A2UIRendererActionEvent,\n} from \"./adapter.js\";\nimport {\n A2UI_PROTOCOL_VERSION,\n CLIENT_ACTIONS,\n ENVELOPE_VERSION,\n MAX_ENVELOPE_BYTES,\n} from \"./envelope.js\";\nimport type {\n A2UIClientActionEnvelope,\n A2UIClientErrorEnvelope,\n A2UIFieldInteractionGroup,\n AckEnvelope,\n AckFieldError,\n ClientAction,\n ClientErrorCode,\n ParticipantRole,\n} from \"./envelope.js\";\n\nconst DEFAULT_ACK_TIMEOUT_MS = 10_000;\nconst SAFE_DETAIL = /^[A-Za-z0-9_.:-]{1,96}$/;\nconst MAX_IDENTIFIER_LENGTH = 256;\n\nexport type A2UIActionDeliveryStatus =\n | \"publishing\"\n | \"awaiting_ack\"\n | \"retryable\";\n\nexport interface A2UIPendingAction {\n readonly requestId: string;\n readonly action: ClientAction;\n readonly surfaceId: string;\n readonly stateId: string;\n readonly revision: number;\n readonly deliveryStatus: A2UIActionDeliveryStatus;\n readonly attemptCount: number;\n readonly groupId?: string;\n}\n\nexport interface A2UIActionResult {\n readonly requestId: string;\n readonly action: ClientAction;\n readonly surfaceId: string;\n readonly stateId: string;\n readonly revision: number;\n readonly status: \"accepted\" | \"rejected\";\n readonly reasonCode?: string;\n readonly fieldErrors: readonly AckFieldError[];\n readonly groupId?: string;\n}\n\nexport interface A2UIActionState {\n readonly pendingRequests: readonly A2UIPendingAction[];\n readonly lastResult: A2UIActionResult | null;\n}\n\nexport interface ActionSurfaceMetadata {\n readonly surfaceId: string;\n readonly activeStateId: string | null;\n readonly revision: number;\n}\n\ninterface ActionBridgeOptions {\n publish(text: string): Promise<unknown>;\n canPublish(): boolean;\n getSurfaceMetadata(): ActionSurfaceMetadata | null;\n reportClientError(\n errorCode: ClientErrorCode,\n surfaceId?: string,\n detail?: string,\n ): void;\n onStateChange(state: A2UIActionState): void;\n participantRole?: ParticipantRole;\n ackTimeoutMs?: number;\n}\n\ninterface InternalPendingAction extends A2UIPendingAction {\n envelope: A2UIClientActionEnvelope;\n encoded: string;\n key: string;\n deliveryStatus: A2UIActionDeliveryStatus;\n attemptCount: number;\n generation: number;\n timeoutId?: number;\n}\n\ntype DecodedAction = Pick<A2UIClientActionEnvelope, \"action\" | \"payload\">;\n\nconst EMPTY_ACTION_STATE: A2UIActionState = {\n pendingRequests: [],\n lastResult: null,\n};\n\n/** Internal replaceable compatibility bridge; hosts use A2UISessionController. */\nexport class A2UIClientActionBridge {\n readonly #options: ActionBridgeOptions;\n readonly #pendingByKey = new Map<string, InternalPendingAction>();\n readonly #pendingByRequestId = new Map<string, InternalPendingAction>();\n #lastResult: A2UIActionResult | null = null;\n #publishQueue: Promise<void> = Promise.resolve();\n #closed = false;\n\n constructor(options: ActionBridgeOptions) {\n this.#options = options;\n }\n\n getSnapshot(): A2UIActionState {\n if (this.#pendingByKey.size === 0 && this.#lastResult === null) {\n return EMPTY_ACTION_STATE;\n }\n return {\n pendingRequests: [...this.#pendingByKey.values()].map((pending) => ({\n requestId: pending.requestId,\n action: pending.action,\n surfaceId: pending.surfaceId,\n stateId: pending.stateId,\n revision: pending.revision,\n deliveryStatus: pending.deliveryStatus,\n attemptCount: pending.attemptCount,\n ...(pending.groupId === undefined ? {} : { groupId: pending.groupId }),\n })),\n lastResult:\n this.#lastResult === null\n ? null\n : {\n ...this.#lastResult,\n fieldErrors: this.#lastResult.fieldErrors.map((entry) => ({\n ...entry,\n })),\n ...(this.#lastResult.groupId === undefined\n ? {}\n : { groupId: this.#lastResult.groupId }),\n },\n };\n }\n\n handleRendererAction(event: A2UIRendererActionEvent): void {\n if (this.#closed || !this.#options.canPublish()) {\n return;\n }\n const metadata = this.#options.getSurfaceMetadata();\n if (\n metadata === null ||\n metadata.activeStateId === null ||\n event.surfaceId !== metadata.surfaceId\n ) {\n this.#rejectRendererAction(event.surfaceId, \"action_metadata_stale\");\n return;\n }\n const decoded = decodeRendererAction(event);\n if (decoded === null) {\n this.#rejectRendererAction(event.surfaceId, \"action_context_invalid\");\n return;\n }\n\n const key = pendingKey(metadata.surfaceId, metadata.activeStateId);\n const existing = this.#pendingByKey.get(key);\n if (existing !== undefined) {\n if (\n existing.deliveryStatus === \"retryable\" &&\n isSameLogicalAction(existing.envelope, decoded)\n ) {\n this.#queueAttempt(existing);\n }\n return;\n }\n\n this.#startLogicalAction(decoded, key);\n }\n\n /** Publish one strict server-issued owning-group commit. */\n handleFieldGroupCommit(\n group: A2UIFieldInteractionGroup,\n fields: Readonly<Record<string, A2UIFieldValue>>,\n ): boolean {\n if (this.#closed || !this.#options.canPublish()) {\n return false;\n }\n const metadata = this.#options.getSurfaceMetadata();\n if (metadata === null || metadata.activeStateId === null) {\n return false;\n }\n const expected = group.fields.map((binding) => binding.field);\n if (\n expected.length === 0 ||\n Object.keys(fields).length !== expected.length ||\n expected.some((field) => !Object.hasOwn(fields, field)) ||\n (group.mode === \"current\" &&\n group.ownerStateId !== metadata.activeStateId) ||\n (group.mode === \"revision\" &&\n group.ownerStateId === metadata.activeStateId)\n ) {\n return false;\n }\n const orderedFields: Record<string, A2UIFieldValue> = {};\n for (const field of expected) {\n const value = normalizeFieldValue(fields[field]);\n if (value === undefined) {\n return false;\n }\n orderedFields[field] = value;\n }\n const key = groupPendingKey(metadata.surfaceId, group.groupId);\n if (this.#pendingByKey.has(key)) {\n return false;\n }\n const decoded: DecodedAction =\n group.mode === \"current\"\n ? { action: \"flow.submit\", payload: { fields: orderedFields } }\n : {\n action: \"flow.revise\",\n payload: {\n targetStateId: group.ownerStateId,\n fields: orderedFields,\n },\n };\n return this.#startLogicalAction(decoded, key, group.groupId);\n }\n\n #startLogicalAction(\n decoded: DecodedAction,\n key: string,\n groupId?: string,\n ): boolean {\n const metadata = this.#options.getSurfaceMetadata();\n if (metadata === null || metadata.activeStateId === null) {\n return false;\n }\n let requestId: string;\n try {\n requestId = createRequestId(\"req\");\n } catch {\n return false;\n }\n const envelope: A2UIClientActionEnvelope = {\n envelopeVersion: ENVELOPE_VERSION,\n a2uiVersion: A2UI_PROTOCOL_VERSION,\n kind: \"action\",\n requestId,\n role: this.#options.participantRole ?? \"member\",\n surfaceId: metadata.surfaceId,\n stateId: metadata.activeStateId,\n revision: metadata.revision,\n action: decoded.action,\n ...(decoded.payload === undefined ? {} : { payload: decoded.payload }),\n };\n const encoded = encodeEnvelope(envelope);\n if (encoded === null) {\n this.#options.reportClientError(\n \"message_malformed\",\n envelope.surfaceId,\n \"action_envelope_too_large\",\n );\n return false;\n }\n const pending: InternalPendingAction = {\n requestId,\n action: envelope.action,\n surfaceId: envelope.surfaceId,\n stateId: envelope.stateId,\n revision: envelope.revision,\n deliveryStatus: \"publishing\",\n attemptCount: 0,\n generation: 0,\n envelope,\n encoded,\n key,\n ...(groupId === undefined ? {} : { groupId }),\n };\n this.#pendingByKey.set(key, pending);\n this.#pendingByRequestId.set(requestId, pending);\n this.#queueAttempt(pending);\n return true;\n }\n\n handleClientError(event: A2UIClientErrorEvent): void {\n if (this.#closed || !this.#options.canPublish()) {\n return;\n }\n let requestId: string;\n try {\n requestId = createRequestId(\"err\");\n } catch {\n return;\n }\n const surfaceId = safeIdentifier(event.surfaceId);\n const detail = safeDetail(event.detail);\n const envelope: A2UIClientErrorEnvelope = {\n envelopeVersion: ENVELOPE_VERSION,\n a2uiVersion: A2UI_PROTOCOL_VERSION,\n kind: \"clientError\",\n requestId,\n role: this.#options.participantRole ?? \"member\",\n errorCode: event.errorCode,\n ...(surfaceId === undefined ? {} : { surfaceId }),\n ...(detail === undefined ? {} : { detail }),\n };\n const encoded = encodeEnvelope(envelope);\n if (encoded !== null) {\n this.#enqueue(async () => {\n await this.#options.publish(encoded);\n });\n }\n }\n\n handleAck(envelope: AckEnvelope): boolean {\n if (this.#closed) {\n return false;\n }\n const pending = this.#pendingByRequestId.get(envelope.inResponseTo);\n if (pending === undefined) {\n return false;\n }\n this.#removePending(pending);\n this.#lastResult = {\n requestId: pending.requestId,\n action: pending.action,\n surfaceId: pending.surfaceId,\n stateId: pending.stateId,\n revision: pending.revision,\n status: envelope.status,\n ...(envelope.reasonCode === undefined\n ? {}\n : { reasonCode: envelope.reasonCode }),\n fieldErrors: (envelope.fieldErrors ?? []).map((entry) => ({ ...entry })),\n ...(pending.groupId === undefined ? {} : { groupId: pending.groupId }),\n };\n this.#notify();\n return true;\n }\n\n markReconnect(): void {\n if (this.#closed) {\n return;\n }\n let changed = false;\n for (const pending of this.#pendingByKey.values()) {\n this.#clearTimer(pending);\n pending.generation += 1;\n if (pending.deliveryStatus !== \"retryable\") {\n pending.deliveryStatus = \"retryable\";\n changed = true;\n }\n }\n if (changed) {\n this.#notify();\n }\n }\n\n retryAfterRestore(): void {\n if (this.#closed || !this.#options.canPublish()) {\n return;\n }\n for (const pending of this.#pendingByKey.values()) {\n if (pending.deliveryStatus === \"retryable\") {\n this.#queueAttempt(pending);\n }\n }\n }\n\n retryPendingAction(requestId?: string): boolean {\n if (this.#closed || !this.#options.canPublish()) {\n return false;\n }\n const candidates =\n requestId === undefined\n ? [...this.#pendingByKey.values()]\n : [this.#pendingByRequestId.get(requestId)].filter(\n (entry): entry is InternalPendingAction => entry !== undefined,\n );\n let retried = false;\n for (const pending of candidates) {\n if (pending.deliveryStatus === \"retryable\") {\n this.#queueAttempt(pending);\n retried = true;\n }\n }\n return retried;\n }\n\n discardPending(): void {\n if (this.#pendingByKey.size === 0) {\n return;\n }\n for (const pending of this.#pendingByKey.values()) {\n this.#clearTimer(pending);\n pending.generation += 1;\n }\n this.#pendingByKey.clear();\n this.#pendingByRequestId.clear();\n this.#notify();\n }\n\n stop(): void {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.discardPending();\n this.#lastResult = null;\n }\n\n #rejectRendererAction(surfaceId: string, detail: string): void {\n this.#options.reportClientError(\n \"message_malformed\",\n safeIdentifier(surfaceId),\n detail,\n );\n }\n\n #queueAttempt(pending: InternalPendingAction): void {\n if (this.#closed || !this.#options.canPublish()) {\n return;\n }\n this.#clearTimer(pending);\n pending.deliveryStatus = \"publishing\";\n pending.attemptCount += 1;\n pending.generation += 1;\n const generation = pending.generation;\n this.#notify();\n this.#enqueue(async () => {\n if (!this.#isCurrent(pending, generation)) {\n return;\n }\n try {\n await this.#options.publish(pending.encoded);\n } catch {\n if (this.#isCurrent(pending, generation)) {\n pending.deliveryStatus = \"retryable\";\n this.#notify();\n }\n return;\n }\n if (!this.#isCurrent(pending, generation)) {\n return;\n }\n pending.deliveryStatus = \"awaiting_ack\";\n pending.timeoutId = globalThis.setTimeout(() => {\n if (this.#isCurrent(pending, generation)) {\n pending.timeoutId = undefined;\n pending.deliveryStatus = \"retryable\";\n this.#notify();\n }\n }, this.#ackTimeoutMs());\n this.#notify();\n });\n }\n\n #enqueue(operation: () => Promise<void>): void {\n this.#publishQueue = this.#publishQueue\n .then(operation)\n .catch(() => undefined);\n }\n\n #ackTimeoutMs(): number {\n const configured = this.#options.ackTimeoutMs;\n return typeof configured === \"number\" &&\n Number.isFinite(configured) &&\n configured > 0\n ? configured\n : DEFAULT_ACK_TIMEOUT_MS;\n }\n\n #isCurrent(pending: InternalPendingAction, generation: number): boolean {\n return (\n !this.#closed &&\n pending.generation === generation &&\n this.#pendingByRequestId.get(pending.requestId) === pending\n );\n }\n\n #removePending(pending: InternalPendingAction): void {\n this.#clearTimer(pending);\n pending.generation += 1;\n this.#pendingByKey.delete(pending.key);\n this.#pendingByRequestId.delete(pending.requestId);\n }\n\n #clearTimer(pending: InternalPendingAction): void {\n if (pending.timeoutId !== undefined) {\n globalThis.clearTimeout(pending.timeoutId);\n pending.timeoutId = undefined;\n }\n }\n\n #notify(): void {\n this.#options.onStateChange(this.getSnapshot());\n }\n}\n\nfunction decodeRendererAction(event: A2UIRendererActionEvent): DecodedAction | null {\n if (!CLIENT_ACTIONS.includes(event.actionName as ClientAction)) {\n return null;\n }\n const action = event.actionName as ClientAction;\n const entries = Object.entries(event.context).sort(([left], [right]) =>\n left.localeCompare(right),\n );\n if (entries.some(([key]) => key.length === 0)) {\n return null;\n }\n\n if (action === \"flow.skip\") {\n return entries.length === 0 ? { action } : null;\n }\n if (action === \"flow.submit\") {\n const listPath = event.context.listPath;\n if (typeof listPath === \"string\" && listPath.length > 0) {\n const fieldEntries = entries.filter(([key]) => key !== \"listPath\");\n const fields = scalarFields(fieldEntries, listPath);\n if (fields === null) {\n return null;\n }\n return {\n action,\n payload: {\n listPath,\n ...(Object.keys(fields).length > 0 ? { fields } : {}),\n },\n };\n }\n const fields = scalarFields(entries);\n if (fields === null) {\n return null;\n }\n return Object.keys(fields).length === 0\n ? { action, payload: {} }\n : { action, payload: { fields } };\n }\n\n if (\n action === \"flow.list.add\" ||\n action === \"flow.list.update\" ||\n action === \"flow.list.delete\"\n ) {\n const listPath = event.context.listPath;\n if (typeof listPath !== \"string\" || listPath.length === 0) {\n return null;\n }\n const itemId = event.context.itemId;\n if (\n (action === \"flow.list.update\" || action === \"flow.list.delete\") &&\n (typeof itemId !== \"string\" || itemId.length === 0)\n ) {\n return null;\n }\n const fieldEntries = entries.filter(\n ([key]) => key !== \"listPath\" && key !== \"itemId\",\n );\n const fields = scalarFields(fieldEntries, listPath);\n const targetStateId = listActionTargetStateId(event.sourceComponentId);\n if (action !== \"flow.list.delete\" &&\n (fields === null || Object.keys(fields).length === 0)) {\n return null;\n }\n return {\n action,\n payload: {\n listPath,\n ...(targetStateId === undefined ? {} : { targetStateId }),\n ...(typeof itemId === \"string\" ? { itemId } : {}),\n ...(fields !== null && Object.keys(fields).length > 0 ? { fields } : {}),\n },\n };\n }\n\n const targetStateId = event.context.targetStateId;\n if (typeof targetStateId !== \"string\" || targetStateId.length === 0) {\n return null;\n }\n const fieldEntries = entries.filter(([key]) => key !== \"targetStateId\");\n const fields = scalarFields(fieldEntries);\n if (fields === null) {\n return null;\n }\n return {\n action,\n payload: {\n targetStateId,\n ...(Object.keys(fields).length === 0 ? {} : { fields }),\n },\n };\n}\n\nfunction listActionTargetStateId(\n sourceComponentId: string,\n): string | undefined {\n const markerIndex = sourceComponentId.indexOf(\":list\");\n if (markerIndex <= 0) {\n return undefined;\n }\n const stateId = sourceComponentId.slice(0, markerIndex);\n return stateId.length > 0 ? stateId : undefined;\n}\n\nfunction scalarFields(\n entries: [string, unknown][],\n listPath?: string,\n): Record<string, string | number | boolean | null> | null {\n const fields: Record<string, string | number | boolean | null> = {};\n for (const [key, value] of entries) {\n const normalized = normalizeFieldValue(value);\n if (normalized === undefined) {\n return null;\n }\n fields[canonicalListFieldKey(listPath, key)] = normalized;\n }\n return fields;\n}\n\nfunction canonicalListFieldKey(listPath: string | undefined, key: string): string {\n if (listPath !== \"needs.providers\") {\n return key;\n }\n switch (normalizeFieldKey(key)) {\n case \"primary_care_provider\":\n case \"primarycareprovider\":\n case \"primarycare\":\n case \"primary_care\":\n case \"primary_care_doctor\":\n case \"primary_doctor\":\n case \"primarydoctor\":\n case \"primary_provider\":\n case \"primaryprovider\":\n case \"pcp\":\n case \"provider_name\":\n case \"providername\":\n case \"display_name\":\n case \"displayname\":\n return \"primary_care_provider\";\n case \"primary_care_provider_location\":\n case \"primarycareproviderlocation\":\n case \"primarycarelocation\":\n case \"primary_care_location\":\n case \"provider_location\":\n case \"providerlocation\":\n case \"location_details\":\n case \"locationdetails\":\n case \"provider_address\":\n case \"provideraddress\":\n case \"office_location\":\n case \"officelocation\":\n case \"practice_location\":\n case \"practicelocation\":\n case \"city\":\n case \"city_state\":\n case \"cityandstate\":\n case \"city_and_state\":\n case \"location\":\n case \"address\":\n return \"primary_care_provider_location\";\n default:\n return key;\n }\n}\n\nfunction normalizeFieldKey(key: string): string {\n return key\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"_\")\n .replaceAll(/^_+|_+$/g, \"\");\n}\n\nfunction isSameLogicalAction(\n envelope: A2UIClientActionEnvelope,\n candidate: DecodedAction,\n): boolean {\n return (\n envelope.action === candidate.action &&\n JSON.stringify(envelope.payload) === JSON.stringify(candidate.payload)\n );\n}\n\nfunction pendingKey(surfaceId: string, stateId: string): string {\n return JSON.stringify([surfaceId, stateId]);\n}\n\nfunction groupPendingKey(surfaceId: string, groupId: string): string {\n return JSON.stringify([\"group\", surfaceId, groupId]);\n}\n\nfunction isFieldValue(value: unknown): value is A2UIFieldValue {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n );\n}\n\nfunction normalizeFieldValue(value: unknown): A2UIFieldValue | undefined {\n if (isFieldValue(value)) {\n return value;\n }\n if (!Array.isArray(value)) {\n return undefined;\n }\n if (value.length === 0) {\n return null;\n }\n if (value.length !== 1) {\n return undefined;\n }\n return normalizeFieldValue(value[0]);\n}\n\nfunction encodeEnvelope(\n envelope: A2UIClientActionEnvelope | A2UIClientErrorEnvelope,\n): string | null {\n let encoded: string;\n try {\n encoded = JSON.stringify(envelope);\n } catch {\n return null;\n }\n return new TextEncoder().encode(encoded).byteLength <= MAX_ENVELOPE_BYTES\n ? encoded\n : null;\n}\n\nfunction createRequestId(prefix: \"req\" | \"err\"): string {\n return `${prefix}-${globalThis.crypto.randomUUID()}`;\n}\n\nfunction safeIdentifier(value: string | undefined): string | undefined {\n return value !== undefined &&\n value.length > 0 &&\n value.length <= MAX_IDENTIFIER_LENGTH\n ? value\n : undefined;\n}\n\nfunction safeDetail(value: string | undefined): string | undefined {\n return value !== undefined && SAFE_DETAIL.test(value) ? value : undefined;\n}\n","/** Explicit room-ownership helper backed by backend-issued runtime material. */\n\nimport type { A2UIRoomLike } from \"./session.js\";\n\nexport interface A2UIRuntimeMaterial {\n readonly serverUrl: string;\n readonly token: string;\n}\n\nexport type A2UITokenProvider = () => Promise<A2UIRuntimeMaterial>;\n\nexport interface A2UIJoinedRoom {\n readonly room: A2UIRoomLike;\n close(): Promise<void>;\n}\n\ninterface A2UIOwnedRoom extends A2UIRoomLike {\n connect(serverUrl: string, token: string): Promise<void>;\n disconnect(): Promise<void>;\n}\n\n/**\n * Create and connect a room owned by this helper.\n *\n * Runtime material is requested exactly once and remains local to the join\n * operation. The returned handle retains the room and idempotent cleanup,\n * never the token or material object.\n */\nexport async function joinA2UIRoom(\n tokenProvider: A2UITokenProvider,\n): Promise<A2UIJoinedRoom> {\n let material: A2UIRuntimeMaterial;\n try {\n material = await tokenProvider();\n } catch {\n throw new Error(\"A2UI room runtime material is unavailable.\");\n }\n if (!isValidRuntimeMaterial(material)) {\n throw new Error(\"A2UI room runtime material is invalid.\");\n }\n\n let room: A2UIOwnedRoom;\n try {\n const { Room } = await import(\"livekit-client\");\n room = new Room();\n } catch {\n throw new Error(\"Unable to initialize the A2UI room.\");\n }\n try {\n await room.connect(material.serverUrl, material.token);\n } catch {\n try {\n await room.disconnect();\n } catch {\n // The sanitized join error below remains the only exposed failure.\n }\n throw new Error(\"Unable to join the A2UI room.\");\n }\n\n let closePromise: Promise<void> | undefined;\n return {\n room,\n close() {\n closePromise ??= disconnectWithoutLeaking(room);\n return closePromise;\n },\n };\n}\n\nfunction isValidRuntimeMaterial(\n material: A2UIRuntimeMaterial,\n): material is A2UIRuntimeMaterial {\n if (\n typeof material !== \"object\" ||\n material === null ||\n typeof material.serverUrl !== \"string\" ||\n material.serverUrl.length === 0 ||\n typeof material.token !== \"string\" ||\n material.token.length === 0\n ) {\n return false;\n }\n try {\n const protocol = new URL(material.serverUrl).protocol;\n return [\"wss:\", \"ws:\", \"https:\", \"http:\"].includes(protocol);\n } catch {\n return false;\n }\n}\n\nasync function disconnectWithoutLeaking(room: {\n disconnect(): Promise<void>;\n}): Promise<void> {\n try {\n await room.disconnect();\n } catch {\n // Cleanup is idempotent and safe for navigation/unload paths.\n }\n}\n"],"mappings":"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","names":["basicCatalog","useId","createComponentImplementation","jsx","jsxs","basicCatalog","nextMessages","value","field","useId","useLayoutEffect","useRef","jsx","invalid","values","label","A2uiMessageListSchema","fieldEntries","fields","targetStateId","normalizeFieldKey","isFieldValue","isNonEmptyString","isFieldValue","isRecord","A2uiMessageListSchema"]}
|