State and events
Your handle’s Allowed websites list controls custom apps. In your Ada dashboard, go to Channels > Chat and add your app’s origin. Until the list allows your origin, a configured appUrl is dropped with a console warning and Ada’s default app mounts. Local development needs no entry when both your app and the embedding page run on loopback hosts. See Local development.
The bridge contract has two halves. Core publishes a display state object (AppDisplayState) that your app renders from. Your app sends typed events (AppEvents) back. The full typed contract ships in the npm package, so treat the package’s TypeScript declarations as the shape reference.
This page documents when each customer-relevant key updates, which events are supported, and which surfaces are reserved. Prefer the operations helpers over raw events; nearly every supported event has one.
Update cadence
Core coalesces state publication:
- At most one state update per microtask. A synchronous batch of internal changes produces one update, not one per change.
- The update is skipped entirely when the derived state is unchanged.
- Unchanged keys keep their reference identity across updates. State crosses the frame boundary by structured clone, so the bridge client restores the previous reference for each structurally unchanged key before it notifies.
Object.isper key is therefore a sound change detector, which is whatsubscribeKeyuses. - An object key’s identity changes exactly when its content does. For
chat.messages, that is every streaming delta: the growing message body changes the array’s content each time.
One consequence: a key that flips on and off inside one synchronous batch is invisible. chat.isSending behaves this way; see below.
Display state
The tables below list the documented keys and the condition that updates each one. Keys not listed here are reserved.
Conversation keys
Agent and typing keys
Survey and End Chat keys
The survey keys implement two correlation patterns. Success and failure each carry a triple (a signal plus a survey type plus a conversation id), and eligibility carries a latched sequence. The operations helpers implement both patterns; the raw keys are documented for completeness.
Transcript and file keys
Configuration and preference keys
config.* keys carry the AI Agent’s resolved configuration and theming: name, avatar, colors, languages, and feature toggles. They change rarely after startup. Three preference keys respond to the settings helpers:
The host page’s Web Notification permission is mirrored into the state under a legacy-named prefix. It updates when the SDK host reports the permission, and after requestNotificationPermission resolves the prompt. Permission is per-origin, so your frame’s own value is not the governing one:
Connectivity
outage.connectivityLost is the sanctioned connectivity signal. It is core’s own verdict, and it updates when core decides connectivity was lost or restored. Use it to disable send UI or to warn before End Chat. The isConnectivityLost helper reads it.
Do not substitute other signals:
navigator.onLinereports false positives on VPN and virtual-adapter transitions. Ada’s reference app explicitly refuses it for this reason.- Other
outage.*keys are dismissible banner state and backoff internals, and they are reserved. A dismissed banner can read as recovered while the outage continues.
Events
Nearly every supported event has an operations helper that carries its guards and correlation logic. Send raw events only for the ones marked “send directly”, or when you need something a helper does not expose.
Lifecycle events
Conversation events
Survey and End Chat events
Preference, file, and chrome events
Reserved surfaces
Any key or event this page does not list is reserved: it exists for Ada’s own app, native SDKs, or internal integrations, and it can change or disappear without notice. Do not build on reserved surfaces. This includes:
security.*keys and events (challenge state and control).voice.*keys and events. These are annotated as reserved in the package types.zendesk.*andzendeskMessaging.*keys and events (handoff SDK control).liveAgent.*events (liveAgent.handoff.request,liveAgent.message.send, and the rest). Ada’s own app never sends them; handoffs are driven by core. To leave a queue, sendui.queueCancel.request. The documentedliveAgent.*state keys above are read-only signals.saml.*keys.outage.*keys other thanoutage.connectivityLost, and any backoff internals.image.print.request.
The reserved surfaces still appear in the package’s TypeScript declarations, because the types mirror the full wire contract. Presence in the types is not a support commitment; this page is.