{"version":3,"sources":["../src/config.ts","../src/frame-attributes.ts","../src/loading-puck.ts","../src/call-frame.ts","../src/logger.ts","../src/logo.ts","../src/loading-placeholder.ts","../src/protocol.ts","../src/pip-window.ts","../src/orchestrator.ts","../src/index.ts"],"names":["FADE_MS"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { LogLevel, OpenOptions, QuarterzipConfig } from './types';\n\n/** The dedicated SDK origin the dynamic iframe documents are served from in production. */\nconst DEFAULT_FRAME_ORIGIN = 'https://sdk.quarterzip.ai';\nconst DEFAULT_LOG_LEVEL: LogLevel = 'warn';\n\nlet globalConfig: QuarterzipConfig = {};\nexport const setConfig = (config: QuarterzipConfig): void => {\n\tglobalConfig = { ...globalConfig, ...config };\n};\n\nlet activeLogLevel: LogLevel = DEFAULT_LOG_LEVEL;\nexport const logLevel = (): LogLevel => activeLogLevel;\n\nexport interface ResolvedFrames {\n\tcallUrl: string;\n\tpipUrl: string;\n\torigin: string;\n}\n\n/**\n * Resolve the frame origin and log level (per-call override > global config > built-in default) into\n * concrete frame URLs and the shared origin. Throws if the resolved origin is not a valid absolute\n * URL.\n */\nexport const resolveFrames = (agentId: string, options: OpenOptions = {}): ResolvedFrames => {\n\tconst configured = options.frameOrigin ?? globalConfig.frameOrigin ?? DEFAULT_FRAME_ORIGIN;\n\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(configured);\n\t} catch {\n\t\tthrow new Error(`[Quarterzip] Invalid frameOrigin: ${configured}`);\n\t}\n\n\tconst hostOrigin = typeof location !== 'undefined' ? location.origin : '';\n\n\tif (url.origin === hostOrigin && !globalConfig.allowSameOrigin) {\n\t\t// Same-origin framing defeats the sandbox: `allow-scripts` + `allow-same-origin` on a\n\t\t// same-origin document lets the framed code remove its own sandbox and reach the host DOM.\n\t\t// eslint-disable-next-line no-restricted-properties\n\t\tconsole.warn(\n\t\t\t'[Quarterzip] frameOrigin is on your own origin. This disables the iframe sandbox isolation. ' +\n\t\t\t\t'Serve the SDK from a distinct origin.'\n\t\t);\n\t}\n\n\tactiveLogLevel = options.logLevel ?? globalConfig.logLevel ?? DEFAULT_LOG_LEVEL;\n\n\tconst deploymentPath = `${url.origin}/sdk/d/${encodeURIComponent(agentId)}`;\n\t// The frames validate every inbound control message against `host` and use it as the target\n\t// origin for everything they post back. `referrerpolicy=no-referrer` on the iframes means this\n\t// param is their only way to learn it.\n\tconst query = new URLSearchParams({ host: hostOrigin, log: activeLogLevel });\n\treturn {\n\t\tcallUrl: `${deploymentPath}/call?${query}`,\n\t\tpipUrl: `${deploymentPath}/pip?${query}`,\n\t\torigin: url.origin\n\t};\n};\n","/**\n * The single source of truth for the iframe security attributes.\n *\n * `allow` is resolved per role. The call frame owns the media, the transport and the auth session;\n * the pip frame is a view/controls terminal fed over a MessagePort, so one shared set would hand it\n * capabilities it has no way to use.\n */\nimport type { FrameRole } from './protocol';\n\n/**\n * `sandbox` restricts the framed document to the minimum it needs. Identical for both frames:\n *   allow-scripts        — run the SDK bundle\n *   allow-same-origin    — keep the frame on the Quarterzip origin, which auth-session\n *                          persistence, storage and WebRTC all require. Also required for the\n *                          frame to post messages under its real origin: without it the document\n *                          gets an opaque origin, which arrives as `\"null\"` and fails the origin\n *                          checks on both sides. Safe ONLY while the frame is cross-origin to the\n *                          host page — same-origin framing lets the frame remove its own sandbox.\n *   allow-popups         — `target=\"_blank\"` links\n *   allow-modals         — alert/confirm surfaces\n *   allow-forms          — in-frame form submission\n */\nexport const SANDBOX = 'allow-scripts allow-same-origin allow-popups allow-modals allow-forms';\n\n/**\n * `allow` (Permissions Policy) delegates features to the frame's origin. Delegation only works if\n * the TOP-LEVEL integrator page is itself permitted to use each feature; see {@link https://docs.quarterzip.ai}.\n *\n * `call` — the frame that captures and authenticates:\n *   microphone          — the call audio\n *   display-capture     — screen share (getDisplayMedia)\n *   autoplay            — agent audio that starts without a user gesture: a reconnect, or an agent\n *                         that greets on load. The in-frame \"Join\" click covers the ordinary path.\n *   speaker-selection   — output device picker, included only when the browser supports selectAudioOutput.\n *   storage-access      — lets the frame call the Storage Access API on browsers that block,\n *                         rather than partition, third-party storage, so the auth session persists\n */\n\n// speaker-selection is only recognised by browsers that implement selectAudioOutput(). Including it\n// elsewhere (Chrome today) logs \"Unrecognized feature\".\nconst supportsSpeakerSelection = (): boolean =>\n\ttypeof MediaDevices !== 'undefined' && 'selectAudioOutput' in MediaDevices.prototype;\n\n// `speaker-selection` is added to both sets only if browser supports permission\nconst ALLOW: Record<FrameRole, string> = {\n\tcall: 'microphone; display-capture; autoplay; storage-access;',\n\tpip: ''\n};\n\nconst buildAllow = (role: FrameRole): string => {\n\tlet permissions = ALLOW[role];\n\tif (supportsSpeakerSelection()) permissions += ' speaker-selection;';\n\treturn permissions;\n};\n\n/** Apply the standard security attributes and load URL to a freshly created iframe element. */\nexport const configureFrame = (iframe: HTMLIFrameElement, src: string, role: FrameRole): void => {\n\tiframe.setAttribute('sandbox', SANDBOX);\n\tiframe.setAttribute('allow', buildAllow(role));\n\tiframe.setAttribute('title', 'Quarterzip');\n\tiframe.setAttribute('referrerpolicy', 'no-referrer');\n\tiframe.src = src;\n};\n","// Equals PANEL_BG today by coincidence, not contract — don't DRY them together.\nexport const PUCK_BG = '#262626';\nconst SPINNER_COLOUR = '#fafafa';\n\nexport const PUCK_SIZE_PX = 48;\nconst SPINNER_SIZE_PX = 22;\n\nconst FADE_MS = 250;\n\nconst SEGMENTS = 8;\nconst SPIN_MS = 800;\n\nconst SPINNER_SVG = `<svg viewBox=\"0 0 22 22\" width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\">${Array.from(\n\t{ length: SEGMENTS },\n\t(_, i) =>\n\t\t`<rect x=\"10\" y=\"1\" width=\"2\" height=\"6\" rx=\"1\" fill=\"currentColor\" opacity=\"${(0.25 + (0.75 * i) / (SEGMENTS - 1)).toFixed(2)}\" transform=\"rotate(${(360 / SEGMENTS) * i} 11 11)\"/>`\n).join('')}</svg>`;\n\nconst SPIN_KEYFRAMES: Keyframe[] = [{ transform: 'rotate(0deg)' }, { transform: 'rotate(360deg)' }];\nconst SPIN_OPTIONS: KeyframeAnimationOptions = {\n\tduration: SPIN_MS,\n\teasing: `steps(${SEGMENTS}, end)`,\n\titerations: Infinity\n};\n\nexport class LoadingPuck {\n\treadonly element: HTMLDivElement;\n\n\tprivate animation: Animation | null = null;\n\tprivate fadeTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate dismissed = false;\n\n\tconstructor(doc: Document) {\n\t\tconst root = doc.createElement('div');\n\t\tObject.assign(root.style, {\n\t\t\tposition: 'absolute',\n\t\t\tbottom: '0',\n\t\t\tright: '0',\n\t\t\twidth: `${PUCK_SIZE_PX}px`,\n\t\t\theight: `${PUCK_SIZE_PX}px`,\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t\tbackground: PUCK_BG,\n\t\t\tborderRadius: '50%',\n\t\t\tpointerEvents: 'none',\n\t\t\topacity: '1',\n\t\t\ttransition: `opacity ${FADE_MS}ms ease-out`\n\t\t} satisfies Partial<CSSStyleDeclaration>);\n\n\t\tconst spinner = doc.createElement('div');\n\t\tObject.assign(spinner.style, {\n\t\t\t// Not a block: an inline svg sits on a baseline the host page's line-height can shift.\n\t\t\tdisplay: 'flex',\n\t\t\twidth: `${SPINNER_SIZE_PX}px`,\n\t\t\theight: `${SPINNER_SIZE_PX}px`,\n\t\t\tcolor: SPINNER_COLOUR\n\t\t} satisfies Partial<CSSStyleDeclaration>);\n\t\tspinner.innerHTML = SPINNER_SVG;\n\t\troot.appendChild(spinner);\n\n\t\tthis.element = root;\n\t\t// Can't use a <style> tag: it breaks with strict `style-src` CSPs.\n\t\tthis.animation = spinner.animate(SPIN_KEYFRAMES, SPIN_OPTIONS);\n\t}\n\n\tdismiss(): void {\n\t\tif (this.dismissed) return;\n\t\tthis.dismissed = true;\n\t\tthis.element.style.opacity = '0';\n\t\tthis.fadeTimer = setTimeout(() => this.destroy(), FADE_MS);\n\t}\n\n\tdestroy(): void {\n\t\tif (this.fadeTimer) {\n\t\t\tclearTimeout(this.fadeTimer);\n\t\t\tthis.fadeTimer = null;\n\t\t}\n\t\tthis.animation?.cancel();\n\t\tthis.animation = null;\n\t\tthis.element.remove();\n\t}\n}\n","/** The on-page cross-origin sandboxed call iframe. */\nimport { configureFrame } from './frame-attributes';\nimport { LoadingPuck, PUCK_SIZE_PX } from './loading-puck';\nimport type { ToFrameMessage } from './protocol';\n\nconst CONTAINER_ID = 'quarterzip-sdk-root';\n\n/** Gap between the panel and the corner of the viewport. */\nconst VIEWPORT_MARGIN = 20;\n\nconst TRANSITION_MS_VAR = '--qz-transition-ms';\n\nconst TRANSITION_PROPERTIES = ['width', 'height', 'border-radius'] as const;\n\n/** The iframe's size until the frame reports its own; the document must lay out against a real width. */\nconst INITIAL_SIZE = { width: 265, height: 276, radius: 14, durationMs: 0 };\n\n/** Above the host page's own fixed UI, leaving 646 free for an integrator to stack over us. */\nconst PANEL_Z_INDEX = 2147483001;\n\n/** Drawn on the container, which an exactly-sized iframe would clip. */\nconst PANEL_SHADOW = [\n\t'0.5px 0.5px 0.8px hsl(220deg 50% 30% / 0.12)',\n\t'2px 1.9px 3.1px -0.4px hsl(220deg 50% 30% / 0.12)',\n\t'3.5px 3.3px 5.4px -0.7px hsl(220deg 50% 30% / 0.12)',\n\t'5.6px 5.4px 8.8px -1.1px hsl(220deg 50% 30% / 0.12)',\n\t'8.9px 8.4px 13.8px -1.4px hsl(220deg 50% 30% / 0.12)',\n\t'13.8px 13.1px 21.4px -1.8px hsl(220deg 50% 30% / 0.12)',\n\t'20.9px 19.8px 32.4px -2.1px hsl(220deg 50% 30% / 0.12)',\n\t'30.7px 29.2px 47.7px -2.5px hsl(220deg 50% 30% / 0.12)'\n].join(', ');\n\n/**\n * Matches shadow to keep the transition soft\n */\nconst PANEL_SHADOW_FILL = 'hsl(220deg 50% 30% / 0.4)';\n\nexport class CallFrame {\n\treadonly container: HTMLDivElement;\n\treadonly iframe: HTMLIFrameElement;\n\tprivate readonly origin: string;\n\n\tprivate placeholder: LoadingPuck | null;\n\n\t/** Applied to the window only once revealed. */\n\tprivate geometry = { ...INITIAL_SIZE };\n\n\tprivate revealed = false;\n\n\t/** Viewport position of the box when the current drag began; null when not dragging. */\n\tprivate dragOrigin: { x: number; y: number } | null = null;\n\n\t/** Tears down the missed-release watch. Null whenever no drag is live. */\n\tprivate stopDragWatch: (() => void) | null = null;\n\n\t/** Tears down the viewport watch. Lives for as long as the panel does. */\n\tprivate stopViewportWatch: (() => void) | null = null;\n\n\tconstructor(callUrl: string, origin: string) {\n\t\tthis.origin = origin;\n\n\t\tconst container = document.createElement('div');\n\t\tcontainer.id = CONTAINER_ID;\n\t\tObject.assign(container.style, {\n\t\t\tposition: 'fixed',\n\t\t\tbottom: `${VIEWPORT_MARGIN}px`,\n\t\t\tright: `${VIEWPORT_MARGIN}px`,\n\t\t\t// This is the window the panel is revealed through, not the panel.\n\t\t\twidth: `${PUCK_SIZE_PX}px`,\n\t\t\theight: `${PUCK_SIZE_PX}px`,\n\t\t\tmaxWidth: '100vw',\n\t\t\tmaxHeight: '100vh',\n\t\t\tzIndex: `${PANEL_Z_INDEX}`,\n\t\t\tborder: 'none',\n\t\t\tbackground: 'transparent',\n\t\t\tborderRadius: `${PUCK_SIZE_PX / 2}px`,\n\t\t\toverflow: 'hidden',\n\t\t\tboxShadow: 'none',\n\t\t\ttransition: TRANSITION_PROPERTIES.map(\n\t\t\t\t(prop) => `${prop} var(${TRANSITION_MS_VAR}) ease`\n\t\t\t).join(', ')\n\t\t} satisfies Partial<CSSStyleDeclaration>);\n\t\t// Only the variable is ever rewritten: changing transition-property and a transitioned value\n\t\t// together is what makes a transition silently not fire.\n\t\tcontainer.style.setProperty(TRANSITION_MS_VAR, '0ms');\n\n\t\tconst iframe = document.createElement('iframe');\n\t\tObject.assign(iframe.style, {\n\t\t\t// Full size, not 100%: clipping is paint-only, so the document never lays out against 48px.\n\t\t\tposition: 'absolute',\n\t\t\tbottom: '0',\n\t\t\tright: '0',\n\t\t\twidth: `${INITIAL_SIZE.width}px`,\n\t\t\theight: `${INITIAL_SIZE.height}px`,\n\t\t\tborder: 'none',\n\t\t\tbackground: 'transparent',\n\t\t\tcolorScheme: 'normal',\n\t\t\t// Same variable as the window: without this a minimise snaps while the window eases, and the\n\t\t\t// gap above the bottom-pinned iframe shows PUCK_BG as a bar sliding over the panel.\n\t\t\ttransition: `width var(${TRANSITION_MS_VAR}) ease, height var(${TRANSITION_MS_VAR}) ease`,\n\t\t\tpointerEvents: 'none'\n\t\t} satisfies Partial<CSSStyleDeclaration>);\n\t\tconfigureFrame(iframe, callUrl, 'call');\n\n\t\tconst placeholder = new LoadingPuck(document);\n\t\tcontainer.appendChild(iframe);\n\t\tcontainer.appendChild(placeholder.element);\n\t\tdocument.body.appendChild(container);\n\n\t\tthis.container = container;\n\t\tthis.iframe = iframe;\n\t\tthis.placeholder = placeholder;\n\t\tthis.watchViewport();\n\t}\n\n\t/** Re-place the box when the viewport changes size, so it stays inside it. */\n\tprivate watchViewport(): void {\n\t\tconst onResize = (): void => {\n\t\t\tconst { left, top } = this.container.getBoundingClientRect();\n\t\t\tthis.applyPosition(left, top);\n\t\t};\n\t\twindow.addEventListener('resize', onResize);\n\t\tthis.stopViewportWatch = () => window.removeEventListener('resize', onResize);\n\t}\n\n\t/** Whether a message event genuinely originates from this frame. */\n\tisFromFrame(event: MessageEvent): boolean {\n\t\treturn event.origin === this.origin && event.source === this.iframe.contentWindow;\n\t}\n\n\t/** Post a control-plane message to the frame with an exact target origin (never '*'). */\n\tpost(message: ToFrameMessage, transfer?: Transferable[]): void {\n\t\tthis.iframe.contentWindow?.postMessage(message, this.origin, transfer ?? []);\n\t}\n\n\tresize(width: number, height: number, radius: number, durationMs: number): void {\n\t\tthis.geometry = { width, height, radius, durationMs };\n\t\tthis.iframe.style.width = `${width}px`;\n\t\tthis.iframe.style.height = `${height}px`;\n\t\tif (this.revealed) this.applyGeometry();\n\t}\n\n\treveal(): void {\n\t\tif (this.revealed) return;\n\t\tthis.revealed = true;\n\t\tthis.placeholder?.dismiss();\n\t\tthis.container.style.boxShadow = PANEL_SHADOW;\n\t\tthis.container.style.backgroundColor = PANEL_SHADOW_FILL;\n\t\tthis.iframe.style.pointerEvents = 'auto';\n\t\tthis.applyGeometry();\n\t}\n\n\tprivate applyGeometry(): void {\n\t\tconst { width, height, radius, durationMs } = this.geometry;\n\t\tthis.container.style.setProperty(TRANSITION_MS_VAR, `${durationMs}ms`);\n\t\tthis.container.style.width = `${width}px`;\n\t\tthis.container.style.height = `${height}px`;\n\t\tthis.container.style.borderRadius = `${radius}px`;\n\t}\n\n\t/** Pin the box to explicit `left`/`top`, so the relayed deltas have a fixed reference. */\n\tbeginDrag(): void {\n\t\tconst rect = this.container.getBoundingClientRect();\n\t\tthis.dragOrigin = { x: rect.left, y: rect.top };\n\t\tthis.applyPosition(rect.left, rect.top);\n\t\tthis.watchForMissedRelease();\n\t}\n\n\t/** Move the box by a delta from where the drag started. */\n\tdragBy(dx: number, dy: number): void {\n\t\tif (!this.dragOrigin) return;\n\t\tthis.applyPosition(this.dragOrigin.x + dx, this.dragOrigin.y + dy);\n\t}\n\n\t/** Ends the drag when the frame does not report the end itself: pointer events reach this document\n\t * once a gesture is over, so a release seen here is the signal. */\n\tprivate watchForMissedRelease(): void {\n\t\tthis.stopDragWatch?.();\n\n\t\t// A move with no button held is the release, observed late.\n\t\tconst onMove = (event: PointerEvent): void => {\n\t\t\tif (event.buttons === 0) this.endDrag();\n\t\t};\n\t\tconst onRelease = (): void => this.endDrag();\n\t\t// A hidden tab never delivers the release.\n\t\tconst onHidden = (): void => {\n\t\t\tif (document.visibilityState === 'hidden') this.endDrag();\n\t\t};\n\n\t\twindow.addEventListener('pointermove', onMove, true);\n\t\twindow.addEventListener('pointerup', onRelease, true);\n\t\twindow.addEventListener('pointercancel', onRelease, true);\n\t\tdocument.addEventListener('visibilitychange', onHidden);\n\n\t\tthis.stopDragWatch = () => {\n\t\t\twindow.removeEventListener('pointermove', onMove, true);\n\t\t\twindow.removeEventListener('pointerup', onRelease, true);\n\t\t\twindow.removeEventListener('pointercancel', onRelease, true);\n\t\t\tdocument.removeEventListener('visibilitychange', onHidden);\n\t\t};\n\t}\n\n\tendDrag(): void {\n\t\tthis.dragOrigin = null;\n\t\tthis.stopDragWatch?.();\n\t\tthis.stopDragWatch = null;\n\t}\n\n\tprivate get boxSize(): { width: number; height: number } {\n\t\treturn this.revealed ? this.geometry : { width: PUCK_SIZE_PX, height: PUCK_SIZE_PX };\n\t}\n\n\t/** Place the box at a viewport position, clamped inside it and held by its nearer edges. */\n\tprivate applyPosition(x: number, y: number): void {\n\t\tconst { width, height } = this.boxSize;\n\t\tconst style = this.container.style;\n\t\t[style.left, style.right] = holdNearerEdge(x, width, viewportWidth());\n\t\t[style.top, style.bottom] = holdNearerEdge(y, height, viewportHeight());\n\t}\n\n\tdestroy(): void {\n\t\t// Before anything else: a torn-down session must not leave its window listeners behind.\n\t\tthis.endDrag();\n\t\tthis.stopViewportWatch?.();\n\t\tthis.stopViewportWatch = null;\n\t\tthis.placeholder?.destroy();\n\t\tthis.placeholder = null;\n\t\tthis.container.remove();\n\t}\n}\n\nconst clamp = (value: number, min: number, max: number): number =>\n\tMath.max(min, Math.min(value, Math.max(min, max)));\n\nconst viewportWidth = (): number => document.documentElement.clientWidth;\nconst viewportHeight = (): number => document.documentElement.clientHeight;\n\n/** Snapped to a whole device pixel: a fractional offset antialiases the box's edges. */\nconst snapToDevicePixel = (value: number): number => {\n\tconst dpr = window.devicePixelRatio || 1;\n\treturn Math.round(value * dpr) / dpr;\n};\n\n/** One axis, clamped into the viewport, as its `[left, right]` or `[top, bottom]` pair. The nearer\n * edge holds it, so the box stays against that edge when either size changes. */\nconst holdNearerEdge = (\n\toffset: number,\n\textent: number,\n\tviewport: number\n): [start: string, end: string] => {\n\tconst start = snapToDevicePixel(clamp(offset, 0, viewport - extent));\n\treturn start + extent / 2 < viewport / 2\n\t\t? [`${start}px`, 'auto']\n\t\t: ['auto', `${viewport - start - extent}px`];\n};\n","import { logLevel } from './config';\nimport type { LogLevel } from './types';\n\nconst VERBOSITY: Record<LogLevel, number> = { silent: 0, error: 1, warn: 2, log: 3, debug: 4 };\n\nconst LABEL = '[Quarterzip]';\n\nconst DEBUG_STYLE = 'color: #8b9bb0'; // Debug is dimmed to let others stand out\n\ntype LogMethod = (...args: unknown[]) => void;\n\nconst noop: LogMethod = () => {};\n\nconst enabled = (of: LogLevel): boolean => VERBOSITY[logLevel()] >= VERBOSITY[of];\n\n/** Each method is the bound console method itself, resolved on access. */\nexport const logger = {\n\tget debug(): LogMethod {\n\t\treturn enabled('debug') ? console.debug.bind(console, `%c${LABEL}`, DEBUG_STYLE) : noop;\n\t},\n\tget log(): LogMethod {\n\t\treturn enabled('log') ? console.log.bind(console, LABEL) : noop;\n\t},\n\tget warn(): LogMethod {\n\t\treturn enabled('warn') ? console.warn.bind(console, LABEL) : noop;\n\t},\n\tget error(): LogMethod {\n\t\treturn enabled('error') ? console.error.bind(console, LABEL) : noop;\n\t}\n};\n","/**\n * The Quarterzip mark for the loading placeholder.\n *\n * Sized with `width`/`height` ATTRIBUTES, not an inline style, such to avoid a strict `style-src-attr` CSP.\n */\nexport const QUARTERZIP_LOGO_SVG = `<svg viewBox=\"0 0 26 22\" width=\"100%\" height=\"100%\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M25.408 9.59025C25.3846 9.56685 25.3597 9.54346 25.3333 9.52153L21.1283 6.06953L21.0902 6.03882L20.1075 5.23175L18.9489 4.27993L16.3448 2.14235C16.3272 2.12919 16.3097 2.11457 16.2921 2.10287C14.2372 0.611542 11.4559 0.611542 9.40099 2.10287C9.38195 2.11457 9.36437 2.12919 9.34826 2.14235L6.75 4.27408L6.74414 4.27993L5.58561 5.23175L4.60284 6.03882L4.56476 6.06953L0.359795 9.52153C0.333432 9.54346 0.308533 9.56685 0.285099 9.59025C0.0243935 9.85781 -0.0473736 10.2628 0.125453 10.5991C0.186968 10.7204 0.255806 10.8374 0.329038 10.95C0.551662 11.2921 0.986659 11.4281 1.37039 11.2892C1.83029 11.143 2.28579 11.0743 2.73397 11.0743C2.94195 11.0743 3.147 11.0889 3.35058 11.1181C3.48533 11.1371 3.61861 11.162 3.75043 11.1927C4.47835 11.3652 5.1638 11.7161 5.77162 12.2045C5.9342 12.3361 6.09238 12.4764 6.24323 12.6285C6.2945 12.6782 6.34429 12.7294 6.39409 12.782C6.59035 12.9911 6.77636 13.2162 6.94772 13.4546C6.99313 13.5174 7.03707 13.5803 7.07954 13.6461L12.197 21.4156C12.216 21.4449 12.2365 21.4727 12.2585 21.4975C12.2819 21.5238 12.3054 21.5472 12.3288 21.5692C12.3771 21.613 12.4299 21.6496 12.487 21.6788C12.5148 21.692 12.5441 21.7051 12.5734 21.7168C12.8385 21.8148 13.1461 21.7651 13.3643 21.5692C13.3892 21.5472 13.4112 21.5238 13.4346 21.499C13.4566 21.4727 13.4771 21.4449 13.4961 21.4156L18.6135 13.6461C18.656 13.5803 18.7 13.5174 18.7454 13.4546C18.9182 13.2162 19.1027 12.9911 19.299 12.782C19.3488 12.7294 19.3986 12.6782 19.4499 12.6285C19.6007 12.4779 19.7589 12.3361 19.9229 12.2045C20.0328 12.1153 20.1455 12.0319 20.2613 11.9515C20.3755 11.8726 20.4927 11.798 20.6128 11.7278C21.0331 11.4851 21.4784 11.3024 21.9427 11.1927C22.0745 11.162 22.2078 11.1371 22.3425 11.1181C22.9825 11.0275 23.6504 11.0757 24.3227 11.2892C24.4223 11.3257 24.5263 11.3433 24.6288 11.3433C24.9203 11.3433 25.2 11.2029 25.364 10.95C25.4373 10.8374 25.5061 10.7219 25.5676 10.6005C25.7405 10.2643 25.6672 9.85781 25.408 9.59025ZM20.9174 8.32992L20.9145 8.33577C20.9042 8.35332 20.8925 8.37086 20.8808 8.38694C20.7929 8.50099 20.6509 8.56239 20.5073 8.54631C20.5015 8.54631 20.4971 8.54631 20.4912 8.54485L17.9032 8.17202C17.8783 8.17055 17.8519 8.16909 17.827 8.16617C17.7816 8.16763 17.7362 8.17055 17.6908 8.17494C17.6469 8.17933 17.6044 8.18517 17.5634 8.19102C17.5165 8.1998 17.4697 8.21003 17.4243 8.22027C17.3847 8.2305 17.3466 8.2422 17.3086 8.25389C17.2998 8.25682 17.291 8.25974 17.2837 8.26267C17.2456 8.27582 17.2075 8.28898 17.1709 8.30507C17.1357 8.31969 17.1035 8.33431 17.0698 8.35039C17.0347 8.36794 16.9995 8.38694 16.9658 8.40741C16.9468 8.41619 16.9292 8.42788 16.9116 8.43958C16.8823 8.45712 16.8531 8.47613 16.8238 8.4966C16.7974 8.51561 16.771 8.53462 16.7447 8.55655C16.7198 8.57702 16.6949 8.59748 16.6714 8.61795C16.6465 8.63989 16.6231 8.66182 16.6011 8.68375C16.5543 8.72907 16.5118 8.77732 16.4708 8.82703C16.4591 8.84165 16.4473 8.85627 16.4356 8.8709C16.4137 8.89721 16.3946 8.92353 16.377 8.94985C16.3697 8.96008 16.3624 8.97032 16.3565 8.98055C16.3346 9.01272 16.3141 9.04635 16.2936 9.08144C16.2921 9.08436 16.2906 9.08729 16.2892 9.09021C16.2657 9.13261 16.2423 9.17647 16.2218 9.22034C16.2218 9.2218 16.2218 9.22326 16.2218 9.22472C16.2013 9.27151 16.1822 9.3183 16.1647 9.36654L15.5305 11.1488L13.2896 17.4534C13.1695 17.7897 12.7594 17.854 12.5309 17.6434C12.4958 17.6113 12.465 17.5718 12.4386 17.5265C12.4269 17.5031 12.4152 17.4797 12.4064 17.4534L10.1655 11.1488L9.53134 9.36654C9.51377 9.3183 9.49473 9.27151 9.47422 9.22472C9.47422 9.22326 9.47276 9.2218 9.47276 9.22034C9.45225 9.17647 9.42882 9.13261 9.40538 9.09021C9.40392 9.08729 9.40245 9.08436 9.40099 9.08144C9.37755 9.0405 9.35265 9.00102 9.32629 8.96301C9.32483 8.95862 9.3219 8.95424 9.3175 8.94985C9.29846 8.92207 9.27796 8.89429 9.25452 8.86651C9.24574 8.85335 9.23402 8.84019 9.22377 8.82703C9.18276 8.77732 9.13882 8.72907 9.09341 8.68375C9.06998 8.66182 9.04655 8.63989 9.02311 8.61795C8.99968 8.59748 8.97478 8.57702 8.94988 8.55655C8.89569 8.51415 8.84003 8.47467 8.78291 8.43958C8.76534 8.42788 8.74776 8.41619 8.72872 8.40741C8.69503 8.38694 8.65988 8.36794 8.62473 8.35039C8.59104 8.33431 8.55882 8.31969 8.52367 8.30507C8.48705 8.28898 8.44897 8.27582 8.41089 8.26267C8.40211 8.25974 8.39478 8.25682 8.386 8.25389C8.34791 8.2422 8.30983 8.2305 8.27029 8.22027C8.26736 8.2188 8.26443 8.2188 8.26004 8.21734C8.22049 8.20857 8.18095 8.1998 8.13994 8.19249H8.13701C8.09307 8.18517 8.04913 8.17933 8.00373 8.17494C7.95832 8.17055 7.91292 8.16763 7.86751 8.16617C7.84262 8.16909 7.81625 8.17055 7.79135 8.17202L5.20334 8.54485C5.20334 8.54485 5.19309 8.54631 5.18723 8.54631C5.0437 8.56239 4.90163 8.50099 4.81375 8.38694C4.80203 8.37086 4.79032 8.35332 4.78006 8.33577L4.77713 8.32992C4.67168 8.14131 4.72148 7.90445 4.89284 7.77433L5.05395 7.65151L8.81074 4.78727L10.5053 3.49479C10.5053 3.49479 10.52 3.48455 10.5258 3.4787C11.844 2.28856 13.8505 2.28856 15.1687 3.47724C15.176 3.48309 15.1819 3.48894 15.1892 3.49332L16.8721 4.77704L20.6421 7.65151L20.8032 7.77433C20.9745 7.90445 21.0243 8.14131 20.9189 8.32992H20.9174Z\" /></svg>`;\n","import { QUARTERZIP_LOGO_SVG } from './logo';\n\nexport const PANEL_BG = '#262626'; // --color-gray-800: rgba(38, 38, 38, 1)\nconst LOGO_COLOUR = '#fafafa'; // .dark --foreground: oklch(0.985 0 0)\n\nconst LOGO_SIZE_PX = 35;\nconst CAPTION_GAP_PX = 8;\nconst CAPTION_HEIGHT_PX = 20;\n\nconst FADE_MS = 250;\n\nconst PULSE_KEYFRAMES: Keyframe[] = [\n\t{ transform: 'scale(0.9)', opacity: 0.6 },\n\t{ transform: 'scale(1.1)', opacity: 1 },\n\t{ transform: 'scale(0.9)', opacity: 0.6 }\n];\nconst PULSE_OPTIONS: KeyframeAnimationOptions = {\n\tduration: 2000,\n\teasing: 'cubic-bezier(0.4, 0, 0.6, 1)',\n\titerations: Infinity\n};\n\n/** Styles are set through CSSOM, not a `style` attribute, so a strict `style-src-attr` CSP allows them. */\nconst div = (doc: Document, styles: Partial<CSSStyleDeclaration>): HTMLDivElement => {\n\tconst el = doc.createElement('div');\n\tObject.assign(el.style, styles);\n\treturn el;\n};\n\nconst spacer = (doc: Document, heightPx: number): HTMLDivElement =>\n\tdiv(doc, { flex: '0 0 auto', height: `${heightPx}px` });\n\n/** The PiP window's placeholder only — the call frame uses `LoadingPuck`. */\nexport class LoadingPlaceholder {\n\treadonly element: HTMLDivElement;\n\n\tprivate animation: Animation | null = null;\n\tprivate fadeTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate dismissed = false;\n\n\tconstructor(doc: Document) {\n\t\tconst root = div(doc, {\n\t\t\tposition: 'fixed',\n\t\t\tinset: '0',\n\t\t\tboxSizing: 'border-box',\n\t\t\tdisplay: 'flex',\n\t\t\tflexDirection: 'column',\n\t\t\tbackground: PANEL_BG,\n\t\t\t// Never intercept a click meant for the host page or the frame above.\n\t\t\tpointerEvents: 'none',\n\t\t\topacity: '1',\n\t\t\ttransition: `opacity ${FADE_MS}ms ease-out`\n\t\t});\n\n\t\t// Mirrors LoadingPanel's own centring classes, so the browser does the arithmetic.\n\t\tconst body = div(doc, {\n\t\t\tflex: '1 1 auto',\n\t\t\tdisplay: 'flex',\n\t\t\tflexDirection: 'column',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t\tgap: `${CAPTION_GAP_PX}px`,\n\t\t\t// The user can shrink the PiP window below the content's natural size.\n\t\t\toverflow: 'hidden'\n\t\t});\n\n\t\tconst mark = div(doc, {\n\t\t\tflex: '0 0 auto',\n\t\t\tdisplay: 'flex',\n\t\t\twidth: `${LOGO_SIZE_PX}px`,\n\t\t\theight: `${LOGO_SIZE_PX}px`,\n\t\t\tcolor: LOGO_COLOUR\n\t\t});\n\t\tmark.innerHTML = QUARTERZIP_LOGO_SVG;\n\n\t\tbody.appendChild(mark);\n\t\tbody.appendChild(spacer(doc, CAPTION_HEIGHT_PX));\n\t\troot.appendChild(body);\n\n\t\tthis.element = root;\n\t\t// Web Animations rather than a keyframes stylesheet: injecting a <style> into the host page\n\t\t// would be blocked by a strict `style-src` CSP, and would leak a global @keyframes name.\n\t\tthis.animation = mark.animate(PULSE_KEYFRAMES, PULSE_OPTIONS);\n\t}\n\n\tdismiss(): void {\n\t\tif (this.dismissed) return;\n\t\tthis.dismissed = true;\n\t\tthis.element.style.opacity = '0';\n\t\tthis.fadeTimer = setTimeout(() => this.destroy(), FADE_MS);\n\t}\n\n\tdestroy(): void {\n\t\tif (this.fadeTimer) {\n\t\t\tclearTimeout(this.fadeTimer);\n\t\t\tthis.fadeTimer = null;\n\t\t}\n\t\tthis.animation?.cancel();\n\t\tthis.animation = null;\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * The control-plane wire contract between the loader and the Quarterzip frames.\n */\n\nexport const PROTOCOL_VERSION = 1;\n\nexport const SUPPORTED_PROTOCOL_VERSIONS = [1] as const;\n\nexport type ProtocolVersion = (typeof SUPPORTED_PROTOCOL_VERSIONS)[number];\n\nexport const oldestVersion = (versions: readonly number[]): number => Math.min(...versions);\n\n/**\n * The version `qz:ready` is sent in. It precedes any loader message, so nothing has been negotiated\n * yet and only the oldest supported version is guaranteed parseable by the receiving loader.\n */\nexport const HANDSHAKE_PROTOCOL_VERSION: ProtocolVersion = oldestVersion(\n\tSUPPORTED_PROTOCOL_VERSIONS\n) as ProtocolVersion;\n\nexport type FrameRole = 'call' | 'pip';\n\nexport interface CallUser {\n\tid: string;\n\temail?: string;\n\tdisplayName?: string;\n}\n\nexport interface CallOpenPayload {\n\tagentId: string;\n\tworkspaceToken: string;\n\tuser: CallUser;\n\tcontext?: string;\n\tlocale?: string;\n}\n\n/** Reason for call end. Possible values are available on {@link https://docs.quarterzip.ai}. */\nexport type CallEndReason = string;\n/** Code for call error. Possible values are available on {@link https://docs.quarterzip.ai}. */\nexport type CallErrorCode = string;\n\nexport type ControlMessage =\n\t// frame -> loader: mounted and listening. Nothing may be sent to a frame before this arrives.\n\t| { v: ProtocolVersion; kind: 'qz:ready'; role: FrameRole }\n\t// frame -> loader: the panel's own geometry and easing. The loader keeps no copy of any of it.\n\t| {\n\t\t\tv: ProtocolVersion;\n\t\t\tkind: 'qz:resize';\n\t\t\twidth: number;\n\t\t\theight: number;\n\t\t\tradius: number;\n\t\t\tdurationMs: number;\n\t  }\n\t// frame -> loader: themed and safe to show. Not qz:ready — the theme needs a config fetch that\n\t// qz:ready is what triggers. The loader holds its puck until this arrives.\n\t| { v: ProtocolVersion; kind: 'qz:reveal' }\n\t// frame -> loader: a drag began on the handle; the loader pins the box to anchor the deltas. The\n\t// engine keeps the gesture in the frame that received the pointerdown, so the frame owns it.\n\t| { v: ProtocolVersion; kind: 'qz:drag'; phase: 'start' }\n\t// frame -> loader: displacement since the grab in CSS pixels, measured INSIDE the frame. Absolute,\n\t// not incremental, so a dropped message costs nothing.\n\t| { v: ProtocolVersion; kind: 'qz:drag'; phase: 'move'; dx: number; dy: number }\n\t// frame -> loader: the gesture ended.\n\t| { v: ProtocolVersion; kind: 'qz:drag'; phase: 'end' }\n\t// frame -> loader: open or close the Document PiP window. Only a top-level traversable may call\n\t// requestWindow(), and only the frame receives the gesture-free enterpictureinpicture action. The\n\t// loader cannot substitute a visibilitychange listener: that is not user activation, so\n\t// requestWindow() would be refused.\n\t| { v: ProtocolVersion; kind: 'qz:pip'; open: boolean }\n\t// frame -> loader: the call is live — transport connected, bot joined.\n\t| { v: ProtocolVersion; kind: 'qz:call-started' }\n\t// frame -> loader: the call conversation ended. The session may still be alive (feedback screen).\n\t| { v: ProtocolVersion; kind: 'qz:call-ended' }\n\t// frame -> loader: the session is over and will not restart. Terminal.\n\t| { v: ProtocolVersion; kind: 'qz:end'; reason: CallEndReason }\n\t// frame -> loader: a call-level failure. `fatal` states whether the call can continue and is read\n\t// off the wire, never inferred by the loader.\n\t| { v: ProtocolVersion; kind: 'qz:error'; code: CallErrorCode; fatal: boolean }\n\t// loader -> call: relays the integrator's open() arguments.\n\t| { v: ProtocolVersion; kind: 'qz:open'; args: CallOpenPayload }\n\t// loader -> call: relays the integrator's close(). The frame winds down and answers with qz:end.\n\t| { v: ProtocolVersion; kind: 'qz:close' }\n\t// loader -> both: one end of a fresh MessageChannel. Sent to a frame only AFTER that frame's qz:ready.\n\t| { v: ProtocolVersion; kind: 'qz:port' }\n\t// loader -> call: the PiP window closed.\n\t| { v: ProtocolVersion; kind: 'qz:pip-closed'; userInitiated: boolean };\n\n/**\n * The subset the loader is allowed to send. Narrows the loader's post() so a frame->loader message\n * cannot be posted in the wrong direction by mistake.\n */\nexport type ToFrameMessage = Extract<\n\tControlMessage,\n\t{ kind: 'qz:open' | 'qz:close' | 'qz:port' | 'qz:pip-closed' }\n>;\n\nconst hasKind = (data: unknown): data is { v: unknown; kind: unknown } =>\n\ttypeof data === 'object' && data !== null && 'kind' in data && 'v' in data;\n\n/**\n * Whether a version is one this side still accepts. Takes the supported SET, not the current\n * version: accepting a range is what lets a frame and a loader of different ages talk to each other,\n * so the membership test has to survive the set growing past one entry.\n */\nexport const isSupportedVersion = (\n\tv: unknown,\n\tsupported: readonly number[] = SUPPORTED_PROTOCOL_VERSIONS\n): v is ProtocolVersion => typeof v === 'number' && supported.includes(v);\n\n/** Validates control message. Accepts any version this frame still speaks, not just the newest. */\nexport const isControlMessage = (\n\tdata: unknown,\n\tsupported: readonly number[] = SUPPORTED_PROTOCOL_VERSIONS\n): data is ControlMessage =>\n\thasKind(data) &&\n\tisSupportedVersion(data.v, supported) &&\n\ttypeof data.kind === 'string' &&\n\tdata.kind.startsWith('qz:');\n\n/**\n * Validates frame message. `qz:ready` is checked against the handshake version rather than the spoken\n * one, because it arrives before anything is negotiated.\n *\n * Both versions are parameters so the two can diverge without touching this logic.\n */\nexport const isFromFrameMessage = (\n\tdata: unknown,\n\tspoken: number = PROTOCOL_VERSION,\n\thandshake: number = HANDSHAKE_PROTOCOL_VERSION\n): data is ControlMessage =>\n\thasKind(data) &&\n\ttypeof data.kind === 'string' &&\n\tdata.kind.startsWith('qz:') &&\n\t(data.v === spoken || (data.kind === 'qz:ready' && data.v === handshake));\n","/**\n * The Document Picture-in-Picture window and the iframe inside it. The loader owns this because\n * `documentPictureInPicture` requires a top-level document with transient activation, which a\n * sandboxed iframe has no way to supply.\n *\n * The PiP window is same-origin with the integrator's page, so nothing sensitive runs in its own\n * document — it is a shell hosting the cross-origin sandboxed iframe.\n */\nimport { configureFrame } from './frame-attributes';\nimport { LoadingPlaceholder, PANEL_BG } from './loading-placeholder';\nimport { logger } from './logger';\nimport { isFromFrameMessage, type ControlMessage, type ToFrameMessage } from './protocol';\n\n/** Minimal typing for the Document Picture-in-Picture API (absent from the standard TS DOM lib). */\ninterface DocumentPictureInPicture {\n\trequestWindow(options?: { width?: number; height?: number }): Promise<Window>;\n}\ndeclare global {\n\tinterface Window {\n\t\tdocumentPictureInPicture?: DocumentPictureInPicture;\n\t}\n}\n\nconst DEFAULT_PIP_WIDTH = 265;\nconst DEFAULT_PIP_HEIGHT = 241;\n\nexport class PipController {\n\tprivate readonly pipWindow: Window;\n\tprivate readonly iframe: HTMLIFrameElement;\n\tprivate readonly origin: string;\n\n\t/** Placeholder component shown until the iframe reports ready. */\n\tprivate placeholder: LoadingPlaceholder | null;\n\n\tprivate constructor(\n\t\tpipWindow: Window,\n\t\tiframe: HTMLIFrameElement,\n\t\torigin: string,\n\t\tplaceholder: LoadingPlaceholder\n\t) {\n\t\tthis.pipWindow = pipWindow;\n\t\tthis.iframe = iframe;\n\t\tthis.origin = origin;\n\t\tthis.placeholder = placeholder;\n\t}\n\n\t/** True on browsers that expose Document PiP. */\n\tstatic isSupported(): boolean {\n\t\treturn typeof window !== 'undefined' && 'documentPictureInPicture' in window;\n\t}\n\n\t/**\n\t * Open the PiP window and inject the pip iframe. Returns null if PiP is unsupported or the\n\t * request fails (e.g. the gesture was already consumed). MUST be called synchronously within a\n\t * user gesture.\n\t */\n\tstatic async open(pipUrl: string, origin: string): Promise<PipController | null> {\n\t\tif (!PipController.isSupported()) return null;\n\t\tlet pipWindow: Window;\n\t\ttry {\n\t\t\tpipWindow = await window.documentPictureInPicture!.requestWindow({\n\t\t\t\twidth: DEFAULT_PIP_WIDTH,\n\t\t\t\theight: DEFAULT_PIP_HEIGHT\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tlogger.warn('Document PiP unavailable; using in-frame controls.', err);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst style = pipWindow.document.createElement('style');\n\t\tstyle.textContent = `html,body{margin:0;height:100%;overflow:hidden;background:${PANEL_BG}}iframe{border:0}`;\n\t\tpipWindow.document.head.appendChild(style);\n\n\t\tconst placeholder = new LoadingPlaceholder(pipWindow.document);\n\t\tpipWindow.document.body.appendChild(placeholder.element);\n\n\t\tconst iframe = pipWindow.document.createElement('iframe');\n\t\tObject.assign(iframe.style, {\n\t\t\tposition: 'relative',\n\t\t\twidth: '100%',\n\t\t\theight: '100%',\n\t\t\tdisplay: 'block'\n\t\t} satisfies Partial<CSSStyleDeclaration>);\n\t\tconfigureFrame(iframe, pipUrl, 'pip');\n\t\tpipWindow.document.body.appendChild(iframe);\n\n\t\treturn new PipController(pipWindow, iframe, origin, placeholder);\n\t}\n\n\t/** Fade out the loading stand-in. Called once the pip frame says it is up. */\n\tdismissPlaceholder(): void {\n\t\tthis.placeholder?.dismiss();\n\t}\n\n\t/** Whether a message event genuinely originates from this frame. */\n\tisFromFrame(event: MessageEvent): boolean {\n\t\treturn event.origin === this.origin && event.source === this.iframe.contentWindow;\n\t}\n\n\t/** Post a control-plane message to the frame with an exact target origin (never '*'). */\n\tpost(message: ToFrameMessage, transfer?: Transferable[]): void {\n\t\tthis.iframe.contentWindow?.postMessage(message, this.origin, transfer ?? []);\n\t}\n\n\t/** Subscribe to control-plane messages from the pip's iframe. Returns an unsubscribe fn. */\n\tonControlMessage(handler: (message: ControlMessage) => void): () => void {\n\t\tconst listener = (event: MessageEvent) => {\n\t\t\tif (!this.isFromFrame(event)) return;\n\t\t\tif (isFromFrameMessage(event.data)) handler(event.data);\n\t\t};\n\t\tthis.pipWindow.addEventListener('message', listener);\n\t\treturn () => this.pipWindow.removeEventListener('message', listener);\n\t}\n\n\t/** Fires when the user (or the OS) closes the PiP window. Returns an unsubscribe fn. */\n\tonClose(handler: () => void): () => void {\n\t\tconst listener = () => handler();\n\t\tthis.pipWindow.addEventListener('pagehide', listener);\n\t\treturn () => this.pipWindow.removeEventListener('pagehide', listener);\n\t}\n\n\tdestroy(): void {\n\t\tthis.placeholder?.destroy();\n\t\tthis.placeholder = null;\n\t\ttry {\n\t\t\tthis.pipWindow.close();\n\t\t} catch {\n\t\t\t// Window may already be gone; ignore.\n\t\t}\n\t}\n}\n","/**\n * Orchestrates frame lifecycles: it stands up the call iframe, opens the PiP window and pip\n * iframe on request, brokers a private MessageChannel between them, and tears everything down.\n */\nimport { CallFrame } from './call-frame';\nimport { resolveFrames, type ResolvedFrames } from './config';\nimport { logger } from './logger';\nimport { PipController } from './pip-window';\nimport {\n\tisFromFrameMessage,\n\tPROTOCOL_VERSION,\n\ttype CallEndReason,\n\ttype CallOpenPayload,\n\ttype ControlMessage\n} from './protocol';\nimport type { CallErrorEvent, EventHandlers, OpenArgs, OpenOptions } from './types';\n\nconst CLOSE_TEARDOWN_TIMEOUT_MS = 1500;\nconst FRAME_LOAD_TIMEOUT_MS = 15_000;\nconst REVEAL_FALLBACK_MS = 10_000;\n\ntype PackageEndReason = 'integrator' | 'detached' | 'error' | 'user';\n\nconst UNTRANSFERABLE_ARGS_ERROR = 'open-args-not-transferable';\n\nexport class Orchestrator {\n\tprivate handlers: Partial<EventHandlers> = {};\n\n\tprivate frameEndReason: CallEndReason | null = null;\n\tprivate errored = false;\n\tprivate integratorClosed = false;\n\tprivate detached = false;\n\n\tprivate callFrame: CallFrame | null = null;\n\tprivate pip: PipController | null = null;\n\tprivate frames: ResolvedFrames | null = null;\n\tprivate currentAgentId: string | null = null;\n\tprivate pendingOpen: OpenArgs | null = null;\n\n\tprivate callReady = false;\n\tprivate pipReady = false;\n\tprivate pipEnabled = true;\n\tprivate pipOpening = false; // is a `requestWindow()` is in flight.\n\tprivate expectedPipClose = false;\n\tprivate windowListener: ((event: MessageEvent) => void) | null = null;\n\tprivate pipUnsubscribers: Array<() => void> = [];\n\tprivate teardownWatchers: Array<() => void> = [];\n\tprivate closeTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate frameLoadListener: (() => void) | null = null;\n\tprivate frameLoaded = false;\n\tprivate loadTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate revealTimer: ReturnType<typeof setTimeout> | null = null;\n\n\t/** Decides restart / refresh / fresh session. Standing a session up lives in `startSession`. */\n\topen(args: OpenArgs, options: OpenOptions = {}): void {\n\t\tif (this.closeTimer) this.teardown();\n\n\t\tif (this.callFrame) {\n\t\t\t// Same agent while already live: no new session, but adopt the callbacks just passed.\n\t\t\tif (this.currentAgentId === args.agentId) {\n\t\t\t\tthis.handlers = { ...args.on };\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.integratorClosed = true;\n\t\t\tthis.teardown();\n\t\t}\n\n\t\tthis.startSession(args, options);\n\t}\n\n\tprivate startSession(args: OpenArgs, options: OpenOptions): void {\n\t\tconst frames = resolveFrames(args.agentId, options);\n\t\tthis.frames = frames;\n\t\tthis.currentAgentId = args.agentId;\n\t\tthis.pendingOpen = args;\n\t\tthis.handlers = { ...args.on };\n\t\tthis.callReady = false;\n\t\tthis.frameLoaded = false;\n\t\tthis.pipEnabled = options.pip !== false;\n\n\t\tthis.callFrame = new CallFrame(frames.callUrl, frames.origin);\n\n\t\tthis.windowListener = (event: MessageEvent) => {\n\t\t\tif (!this.callFrame?.isFromFrame(event)) return;\n\t\t\tif (isFromFrameMessage(event.data)) this.handleCallMessage(event.data);\n\t\t};\n\t\twindow.addEventListener('message', this.windowListener);\n\n\t\tthis.watchForAbruptTeardown();\n\t\tthis.armFrameLoadDeadline(this.callFrame.iframe);\n\t}\n\n\tprivate armFrameLoadDeadline(iframe: HTMLIFrameElement): void {\n\t\tthis.loadTimer = setTimeout(() => this.abandonFrame(), FRAME_LOAD_TIMEOUT_MS);\n\n\t\tconst onLoad = (): void => {\n\t\t\tthis.frameLoadListener = null;\n\t\t\tthis.frameLoaded = true;\n\t\t};\n\t\t// `once`, or a later navigation would fire this again.\n\t\tiframe.addEventListener('load', onLoad, { once: true });\n\t\tthis.frameLoadListener = () => iframe.removeEventListener('load', onLoad);\n\t}\n\n\tprivate clearLoadTimer(): void {\n\t\tthis.frameLoadListener?.();\n\t\tthis.frameLoadListener = null;\n\t\tif (!this.loadTimer) return;\n\t\tclearTimeout(this.loadTimer);\n\t\tthis.loadTimer = null;\n\t}\n\n\tprivate clearRevealTimer(): void {\n\t\tif (!this.revealTimer) return;\n\t\tclearTimeout(this.revealTimer);\n\t\tthis.revealTimer = null;\n\t}\n\n\tprivate abandonFrame(): void {\n\t\tthis.loadTimer = null;\n\t\tthis.frameLoadListener?.();\n\t\tthis.frameLoadListener = null;\n\t\t// Raced by a teardown, or a late qz:ready already cleared it.\n\t\tif (!this.callFrame || this.callReady) return;\n\t\tthis.errored = true;\n\t\tthis.reportError({\n\t\t\tcode: this.frameLoaded ? 'frame-not-ready' : 'frame-unreachable',\n\t\t\tfatal: true\n\t\t});\n\t\tthis.teardown();\n\t}\n\n\t/**\n\t * Add listeners to handle the two ways a session ends without the frame saying so:\n\t * an SPA unmounting our container, and a full page navigation.\n\t */\n\tprivate watchForAbruptTeardown(): void {\n\t\tconst container = this.callFrame?.container;\n\t\tconst parent = container?.parentNode;\n\t\tif (container && parent) {\n\t\t\tconst observer = new MutationObserver(() => {\n\t\t\t\tif (container.isConnected) return;\n\t\t\t\tthis.detached = true;\n\t\t\t\tthis.teardown();\n\t\t\t});\n\t\t\tobserver.observe(parent, { childList: true });\n\t\t\tthis.teardownWatchers.push(() => observer.disconnect());\n\t\t}\n\n\t\tconst onPageHide = () => {\n\t\t\tthis.detached = true;\n\t\t\tthis.teardown();\n\t\t};\n\t\twindow.addEventListener('pagehide', onPageHide);\n\t\tthis.teardownWatchers.push(() => window.removeEventListener('pagehide', onPageHide));\n\t}\n\n\tclose(): void {\n\t\tif (!this.callFrame) return;\n\t\tthis.integratorClosed = true;\n\t\tthis.callFrame.post({ v: PROTOCOL_VERSION, kind: 'qz:close' });\n\t\tthis.closeTimer ??= setTimeout(() => this.teardown(), CLOSE_TEARDOWN_TIMEOUT_MS);\n\t}\n\n\t/** Must be called synchronously inside a real user gesture: `requestWindow()` needs transient activation. */\n\topenPip(): void {\n\t\tvoid this.openPipWindow();\n\t}\n\n\t/** Close the floating window, leaving the call running in the on-page frame. No-op if none. */\n\tclosePip(): void {\n\t\tthis.closePipWindow();\n\t}\n\n\t// --- message handlers -----------------------------------------------------------------------\n\n\tprivate handleCallMessage(message: ControlMessage): void {\n\t\tswitch (message.kind) {\n\t\t\tcase 'qz:ready':\n\t\t\t\tif (message.role !== 'call') return;\n\t\t\t\tthis.callReady = true;\n\t\t\t\tthis.clearLoadTimer();\n\t\t\t\tif (this.closeTimer) {\n\t\t\t\t\tthis.callFrame?.post({ v: PROTOCOL_VERSION, kind: 'qz:close' });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthis.revealTimer = setTimeout(() => {\n\t\t\t\t\tlogger.warn('Frame did not report itself presentable; opening the panel anyway.');\n\t\t\t\t\tthis.callFrame?.reveal();\n\t\t\t\t}, REVEAL_FALLBACK_MS);\n\t\t\t\tif (this.pendingOpen) this.postOpen(this.pendingOpen);\n\t\t\t\tthis.wireChannel();\n\t\t\t\tbreak;\n\t\t\tcase 'qz:resize':\n\t\t\t\tthis.callFrame?.resize(message.width, message.height, message.radius, message.durationMs);\n\t\t\t\tbreak;\n\t\t\tcase 'qz:reveal':\n\t\t\t\tthis.clearRevealTimer();\n\t\t\t\tthis.callFrame?.reveal();\n\t\t\t\tbreak;\n\t\t\tcase 'qz:drag':\n\t\t\t\t// The frame owns the gesture, so its relayed displacement is what moves the panel.\n\t\t\t\tif (message.phase === 'start') this.callFrame?.beginDrag();\n\t\t\t\telse if (message.phase === 'end') this.callFrame?.endDrag();\n\t\t\t\telse this.callFrame?.dragBy(message.dx, message.dy);\n\t\t\t\tbreak;\n\t\t\tcase 'qz:call-started':\n\t\t\t\tthis.emit('callStarted');\n\t\t\t\tbreak;\n\t\t\tcase 'qz:call-ended':\n\t\t\t\tthis.emit('callEnded');\n\t\t\t\tbreak;\n\t\t\tcase 'qz:error':\n\t\t\t\tif (message.fatal) this.errored = true;\n\t\t\t\tthis.reportError({ code: message.code, fatal: message.fatal });\n\t\t\t\tbreak;\n\t\t\tcase 'qz:end':\n\t\t\t\tthis.frameEndReason ??= message.reason;\n\t\t\t\tthis.teardown();\n\t\t\t\tbreak;\n\t\t\tcase 'qz:pip':\n\t\t\t\tif (message.open) void this.openPipWindow();\n\t\t\t\telse this.closePipWindow();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate handlePipMessage(message: ControlMessage): void {\n\t\tif (message.kind === 'qz:ready' && message.role === 'pip') {\n\t\t\tthis.pipReady = true;\n\t\t\tthis.pip?.dismissPlaceholder();\n\t\t\tthis.wireChannel();\n\t\t}\n\t}\n\n\tprivate handlePipClosed(): void {\n\t\tconst userInitiated = !this.expectedPipClose;\n\t\tthis.tearDownPip();\n\t\tthis.callFrame?.post({ v: PROTOCOL_VERSION, kind: 'qz:pip-closed', userInitiated });\n\t}\n\n\tprivate emit<K extends keyof EventHandlers>(\n\t\t...args: Parameters<EventHandlers[K]> extends []\n\t\t\t? [event: K]\n\t\t\t: [event: K, payload: Parameters<EventHandlers[K]>[0]]\n\t): void {\n\t\tconst [event, payload] = args as [K, unknown];\n\t\tconst handler = this.handlers[event];\n\t\tif (!handler) return;\n\t\ttry {\n\t\t\t(handler as (payload: unknown) => void)(payload);\n\t\t} catch (err) {\n\t\t\tlogger.error('callback threw:', event, err);\n\t\t}\n\t}\n\n\tprivate reportError(event: CallErrorEvent): void {\n\t\tthis.emit('error', event);\n\t}\n\n\tprivate postOpen(args: OpenArgs): void {\n\t\tconst { agentId, workspaceToken, user, context, locale } = args;\n\t\tconst payload: CallOpenPayload = { agentId, workspaceToken, user, context, locale };\n\n\t\ttry {\n\t\t\tthis.callFrame?.post({ v: PROTOCOL_VERSION, kind: 'qz:open', args: payload });\n\t\t} catch (err) {\n\t\t\tlogger.error('open() arguments could not be transferred to the frame', err);\n\t\t\tthis.errored = true;\n\t\t\tthis.reportError({ code: UNTRANSFERABLE_ARGS_ERROR, fatal: true });\n\t\t\tthis.teardown();\n\t\t}\n\t}\n\n\t// --- PiP ------------------------------------------------------------------------------------\n\n\tprivate async openPipWindow(): Promise<void> {\n\t\tif (!this.pipEnabled || this.pip || this.pipOpening || !this.callFrame || !this.frames) return;\n\t\tconst agentId = this.currentAgentId;\n\n\t\tthis.pipOpening = true;\n\t\tlet pip: PipController | null;\n\t\ttry {\n\t\t\tpip = await PipController.open(this.frames.pipUrl, this.frames.origin);\n\t\t} finally {\n\t\t\tthis.pipOpening = false;\n\t\t}\n\t\tif (!pip) return; // unsupported / denied\n\n\t\t// A close(), agent switch or a race winner may have landed while this was resolving.\n\t\tif (this.pip || !this.callFrame || this.currentAgentId !== agentId) {\n\t\t\tpip.destroy();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pip = pip;\n\t\tthis.pipReady = false;\n\t\tthis.expectedPipClose = false;\n\t\tthis.pipUnsubscribers.push(\n\t\t\tpip.onControlMessage((message) => this.handlePipMessage(message)),\n\t\t\tpip.onClose(() => this.handlePipClosed()),\n\t\t\tthis.closePipOnHostRefocus()\n\t\t);\n\t}\n\n\t/**\n\t * Returning to the host tab closes the PiP & the on-page frame becomes visible again.\n\t * Returns an unsubscribe fn.\n\t */\n\tprivate closePipOnHostRefocus(): () => void {\n\t\tconst onVisibilityChange = () => {\n\t\t\tif (document.visibilityState === 'visible') this.closePipWindow();\n\t\t};\n\t\tdocument.addEventListener('visibilitychange', onVisibilityChange);\n\t\treturn () => document.removeEventListener('visibilitychange', onVisibilityChange);\n\t}\n\n\tprivate closePipWindow(): void {\n\t\tif (!this.pip) return;\n\t\tthis.expectedPipClose = true;\n\t\tthis.pip.destroy();\n\t}\n\n\t// --- channel --------------------------------------------------------------------------------\n\n\t/**\n\t * Broker a fresh private channel between the two iframes. Gated on both handshakes: a `qz:port`\n\t * posted before a frame attached its listener is dropped, since postMessage does not buffer. Ports\n\t * are single-use, so each pip session gets its own channel.\n\t */\n\tprivate wireChannel(): void {\n\t\tif (!this.callReady || !this.pipReady || !this.callFrame || !this.pip) return;\n\t\tconst channel = new MessageChannel();\n\t\tthis.callFrame.post({ v: PROTOCOL_VERSION, kind: 'qz:port' }, [channel.port1]);\n\t\tthis.pip.post({ v: PROTOCOL_VERSION, kind: 'qz:port' }, [channel.port2]);\n\t}\n\n\t// --- teardown -------------------------------------------------------------------------------\n\n\tprivate tearDownPip(): void {\n\t\tfor (const unsub of this.pipUnsubscribers) unsub();\n\t\tthis.pipUnsubscribers = [];\n\t\tthis.pip?.destroy();\n\t\tthis.pip = null;\n\t\tthis.pipReady = false;\n\t\tthis.expectedPipClose = false;\n\t}\n\n\tprivate teardown(): void {\n\t\tconst hadSession = this.callFrame !== null;\n\t\tconst fallback: PackageEndReason = this.errored\n\t\t\t? 'error'\n\t\t\t: this.integratorClosed\n\t\t\t\t? 'integrator'\n\t\t\t\t: this.detached\n\t\t\t\t\t? 'detached'\n\t\t\t\t\t: 'user';\n\t\tconst reason: CallEndReason = this.frameEndReason ?? fallback;\n\t\tconst handlers = this.handlers;\n\t\tthis.frameEndReason = null;\n\t\tthis.errored = false;\n\t\tthis.integratorClosed = false;\n\t\tthis.detached = false;\n\n\t\tif (this.closeTimer) {\n\t\t\tclearTimeout(this.closeTimer);\n\t\t\tthis.closeTimer = null;\n\t\t}\n\t\tthis.clearLoadTimer();\n\t\tthis.clearRevealTimer();\n\t\tif (this.windowListener) {\n\t\t\twindow.removeEventListener('message', this.windowListener);\n\t\t\tthis.windowListener = null;\n\t\t}\n\t\tfor (const detach of this.teardownWatchers) detach();\n\t\tthis.teardownWatchers = [];\n\t\tthis.tearDownPip();\n\t\tthis.callFrame?.destroy();\n\t\tthis.callFrame = null;\n\t\tthis.callReady = false;\n\t\tthis.pendingOpen = null;\n\t\tthis.currentAgentId = null;\n\t\tthis.frames = null;\n\t\tthis.handlers = {};\n\n\t\tif (hadSession && handlers.close) {\n\t\t\ttry {\n\t\t\t\thandlers.close({ reason });\n\t\t\t} catch (err) {\n\t\t\t\tlogger.error('callback threw:', 'close', err);\n\t\t\t}\n\t\t}\n\t}\n}\n","import { setConfig } from './config';\nimport { Orchestrator } from './orchestrator';\nimport type { OpenArgs, OpenOptions, QuarterzipAPI, QuarterzipConfig } from './types';\n\nconst orchestrator = new Orchestrator();\n\n/**\n * Start (or switch) a call. Call this from a user gesture.\n * @param args   Agent, workspace token, end-user identity, and lifecycle callbacks via `on`.\n * @param options Optional per-call overrides (frame URL, PiP on/off).\n */\nexport const open = (args: OpenArgs, options?: OpenOptions): void =>\n\torchestrator.open(args, options);\n\n/** Close the active call and remove all iframes / PiP windows. Safe to call when nothing is open. */\nexport const close = (): void => orchestrator.close();\n\n/** Set global defaults merged into every subsequent `open()`. */\nexport const configure = (config: QuarterzipConfig): void => setConfig(config);\n\n/**\n * Open the floating PiP window. Optional — it appears on its own when the user switches tabs.\n * Call synchronously from a click handler on your page; see {@link QuarterzipAPI.openPip}.\n */\nexport const openPip = (): void => orchestrator.openPip();\n\n/** Close the floating PiP window; the call continues in the on-page frame. */\nexport const closePip = (): void => orchestrator.closePip();\n\nexport const Quarterzip: QuarterzipAPI = {\n\topen,\n\tclose,\n\tconfigure,\n\topenPip,\n\tclosePip\n};\n\nexport type {\n\tCallCloseEvent,\n\tCallErrorEvent,\n\tEventHandlers,\n\tLogLevel,\n\tOpenArgs,\n\tOpenOptions,\n\tQuarterzipAPI,\n\tQuarterzipConfig,\n\tQuarterzipUser\n} from './types';\n\nexport type { CallEndReason, CallErrorCode } from './protocol';\n"]}