import { PRODUCTION_WIDGET_RUNTIME_ENDPOINTS } from "../production-runtime-endpoints.js"; import type { PublicCommandPayload } from "./sdk-types.js"; export { PRODUCTION_WIDGET_RUNTIME_ENDPOINTS }; export const TELEMETRY_EVENTS = { INSTANCE_READY: "instance_ready", VIEW_DISPLAYED: "view_displayed", VIEW_CLOSED: "view_closed", FLOW_DISPLAYED: "flow_displayed", FLOW_CLOSED: "flow_closed", } as const; export type TelemetryEventName = (typeof TELEMETRY_EVENTS)[keyof typeof TELEMETRY_EVENTS]; // Data attribute used to anchor widget styles & root element. Shared so build // scripts, runtime code and tests stay in sync. export const WIDGET_SELECTOR = "[data-gx-widget]" as const; export const PARENT_ORIGIN_PARAM = "gx_parent_origin" as const; export const PRODUCTION_WIDGET_CORE_URL = PRODUCTION_WIDGET_RUNTIME_ENDPOINTS.coreUrl; /** @internal Version for the trusted host-realm open-url action event. */ export const OPEN_URL_ACTION_VERSION = 2; /** @internal Init capability proving that this SDK instance handles open-url actions. */ export const OPEN_URL_ACTION_CAPABILITY = "gx.action.open-url.v2" as const; /** @internal Rollout capability used with the version 1 `_blank` host event. */ export const OPEN_URL_ACTION_V1_CAPABILITY = "gx.action.open-url.v1" as const; /** * @internal Capability for synchronous navigation outcome settlement by the * internal SDK adapter. The browser host remains client-reported and does not * provide trusted execution attestation. */ export const NAVIGATION_OUTCOME_SETTLEMENT_CAPABILITY = "gx.navigation.outcome-settlement.v1" as const; // Host event names (DOM events emitted by widget for external consumption) // Uses prefix "getuserfeedback:" for namespacing export const HOST_EVENT_PREFIX = "getuserfeedback:" as const; export const HOST_EVENT_KEYS = { INSTANCE_FLOW_LAYOUT_UPDATED: "instance:flow:layout-updated", INSTANCE_FLOW_STATE_CHANGED: "instance:flow:state-changed", INSTANCE_FLOW_STATE_CHANGED_INSTANCE: "instance:flow:state-changed:instance", INSTANCE_VIEW_HOST_SNAPSHOTS_CHANGED: "instance:view-host:snapshots-changed", INSTANCE_COMMAND_SETTLED: "instance:command:settled", INSTANCE_HANDLE_INVALIDATED: "instance:handle:invalidated", INSTANCE_OPEN_REQUESTED: "instance:open:requested", INSTANCE_NAVIGATION_REQUESTED: "instance:navigation:requested", INSTANCE_HOST_ACTION_REQUESTED: "instance:host-action:requested", INSTANCE_COMMAND_UNSUPPORTED: "instance:command:unsupported", INSTANCE_READY: "instance:ready", INSTANCE_BRIDGE_MOUNTED: "instance:bridge:mounted", INSTANCE_BRIDGE_UNMOUNTED: "instance:bridge:unmounted", INSTANCE_IFRAME_READY: "instance:iframe:ready", INSTANCE_ERROR: "instance:error", INSTANCE_APP_EVENT: "instance:app-event", } as const; type NonSdkCapabilityCommandKind = | "updateHostContext" | "emitHostSignal" | "instanceFeedback.capture" | "instanceFeedback.listMine"; type SdkCapabilityCommandKind = Exclude< PublicCommandPayload["kind"], "init" | NonSdkCapabilityCommandKind >; const SDK_COMMAND_CAPABILITY_BY_KIND = { configure: "gx.command.configure.v1", open: "gx.command.open.v1", prefetch: "gx.command.prefetch.v1", prerender: "gx.command.prerender.v1", identify: "gx.command.identify.v1", setContainer: "gx.command.setContainer.v1", close: "gx.command.close.v1", reset: "gx.command.reset.v1", setDefaultContainerPolicy: "gx.command.setDefaultContainerPolicy.v1", track: "gx.command.track.v1", } as const satisfies Record< SdkCapabilityCommandKind, `gx.command.${string}.v${number}` >; const SDK_COMMAND_CAPABILITIES = [ SDK_COMMAND_CAPABILITY_BY_KIND.configure, SDK_COMMAND_CAPABILITY_BY_KIND.open, SDK_COMMAND_CAPABILITY_BY_KIND.prefetch, SDK_COMMAND_CAPABILITY_BY_KIND.prerender, SDK_COMMAND_CAPABILITY_BY_KIND.identify, SDK_COMMAND_CAPABILITY_BY_KIND.setContainer, SDK_COMMAND_CAPABILITY_BY_KIND.close, SDK_COMMAND_CAPABILITY_BY_KIND.reset, SDK_COMMAND_CAPABILITY_BY_KIND.setDefaultContainerPolicy, SDK_COMMAND_CAPABILITY_BY_KIND.track, ] as const; type SdkCommandCapability = (typeof SDK_COMMAND_CAPABILITY_BY_KIND)[keyof typeof SDK_COMMAND_CAPABILITY_BY_KIND]; type _AssertAllCommandCapabilitiesAreAnnounced = Exclude< SdkCommandCapability, (typeof SDK_COMMAND_CAPABILITIES)[number] > extends never ? true : never; type _AssertNoUnknownCommandCapabilities = Exclude< (typeof SDK_COMMAND_CAPABILITIES)[number], SdkCommandCapability > extends never ? true : never; /** * Stable capability tokens announced by the browser SDK during init. * These are versioned and namespaced to support forward-compatible negotiation. */ export const FLOW_LAYOUT_UPDATES_CAPABILITY = "gx.host.flow-layout-updates.v1" as const; export const SDK_PROTOCOL_CAPABILITIES = [ "gx.protocol.public.v1", ...SDK_COMMAND_CAPABILITIES, NAVIGATION_OUTCOME_SETTLEMENT_CAPABILITY, ] as const; export type SdkProtocolCapability = (typeof SDK_PROTOCOL_CAPABILITIES)[number]; export const REACT_NATIVE_WEBVIEW_TRANSPORT_CAPABILITIES = { LAYOUT_TRANSITION_POLICY: "gx.react-native.webview.layout-transition-policy.v1", LAYOUT_TRANSITION_SCHEDULE: "gx.react-native.webview.layout-transition-schedule.v1", } as const; export type ReactNativeWebViewTransportCapability = (typeof REACT_NATIVE_WEBVIEW_TRANSPORT_CAPABILITIES)[keyof typeof REACT_NATIVE_WEBVIEW_TRANSPORT_CAPABILITIES]; export const LOADER_RUNTIME_GLOBAL_KEY = "__getuserfeedback_runtime" as const; export const LOADER_RUNTIME_PROTOCOL_VERSION = "v5" as const; // Helper to construct full event name with prefix export const toHostEventName = (key: string): string => `${HOST_EVENT_PREFIX}${key}`;