@syntrologie/runtime-sdk 2.4.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-VQHPYHLL.js → chunk-QGWATS3Z.js} +7 -5
- package/dist/chunk-QGWATS3Z.js.map +7 -0
- package/dist/hooks/useShadowCanvasConfig.d.ts +3 -1
- package/dist/index.js +1 -1
- package/dist/react.js +1 -1
- package/dist/smart-canvas.esm.js +3 -3
- package/dist/smart-canvas.esm.js.map +3 -3
- package/dist/smart-canvas.js +7 -5
- package/dist/smart-canvas.js.map +2 -2
- package/dist/smart-canvas.min.js +3 -3
- package/dist/smart-canvas.min.js.map +3 -3
- package/dist/version.d.ts +1 -1
- package/package.json +7 -7
- package/dist/chunk-VQHPYHLL.js.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../adaptives/adaptive-content/dist/reconciliation-guard.js", "../../adaptives/adaptive-content/dist/sanitizer.js", "../../adaptives/adaptive-content/dist/runtime.js", "../../design-system/src/tokens/colors.ts", "../../adaptives/adaptive-overlays/dist/highlight.js", "../../adaptives/adaptive-overlays/dist/sanitizer.js", "../../adaptives/adaptive-overlays/dist/modal.js", "../../adaptives/adaptive-overlays/dist/tooltip.js", "../../adaptives/adaptive-overlays/dist/runtime.js", "../src/apps/AppContext.ts", "../src/apps/AppLoader.ts", "../src/apps/AppRegistry.ts", "../src/antiFlicker.ts", "../src/version.ts", "../src/types.ts", "../src/fetchers/mergeConfigs.ts", "../src/logger.ts", "../src/configFetcher.ts", "../src/events/registerConfigPredicates.ts", "../src/controller.ts", "../src/ShadowRootContext.tsx", "../src/events/types.ts", "../src/events/normalizers/canvas.ts", "../src/theme/defaultTheme.ts", "../src/theme/ThemeProvider.tsx", "../src/notifications/NotificationToastStack.tsx", "../src/notifications/types.ts", "../src/notifications/matcher.ts", "../src/notifications/useNotifications.ts", "../src/notifications/useNotifyWatcher.ts", "../src/RuntimeProvider.tsx", "../src/components/TileCard.tsx", "../src/components/ShadowCanvasOverlay.tsx", "../src/hooks/useShadowCanvasConfig.ts", "../src/SmartCanvasApp.tsx", "../src/SmartCanvasElement.tsx", "../src/editorLoader.ts", "../src/overlays/runtime/overlay/root.ts", "../src/api.tsx", "../src/experiments/adapters/growthbook.ts", "../src/metrics/sessionMetrics.ts", "../src/telemetry/adapters/noop.ts", "../src/telemetry/adapters/posthog.ts", "../src/actions/executors/core-flow.ts", "../src/actions/executors/tour.ts", "../src/actions/executors/index.ts", "../src/actions/validation.ts", "../src/actions/ActionEngine.ts", "../src/context/ContextManager.ts", "../src/decisions/strategies/rules.ts", "../src/decisions/strategies/score.ts", "../src/decisions/engine.ts", "../src/events/EventAccumulator.ts", "../src/events/EventBus.ts", "../src/events/normalizers/posthog.ts", "../src/navigation/NavigationMonitor.ts", "../src/state/helpers/cooldowns.ts", "../src/state/helpers/dismissals.ts", "../src/state/helpers/frequency.ts", "../src/state/StateStore.ts", "../src/surfaces/types.ts", "../src/surfaces/positioning.ts", "../src/hostPatcher/core/sanitizer.ts", "../src/surfaces/Surfaces.ts", "../src/widgets/WidgetRegistry.ts", "../src/runtime.ts", "../src/token.ts", "../src/experiments/registry.ts", "../src/fetchers/cdnFetcher.ts", "../src/fetchers/experimentsFetcher.ts", "../src/fetchers/registry.ts", "../src/telemetry/registry.ts", "../src/bootstrap.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Reconciliation Guard - MutationObserver defense against React DOM removal.\n *\n * When the Syntrologie SDK inserts DOM nodes into a React-managed subtree\n * (via content:insertHtml), React's reconciliation will silently remove them\n * on the next render because they don't exist in React's virtual DOM.\n *\n * This guard watches for the removal of our inserted container and re-inserts\n * it using a debounced retry mechanism with a maximum retry count to prevent\n * infinite loops (e.g., in React StrictMode which double-invokes effects).\n */\n/**\n * Watch for a container element being removed from the DOM by an external\n * framework (React, Vue, etc.) and call `reinsertFn` to re-insert it.\n *\n * @param container The element we inserted (has data-syntro-action-id)\n * @param anchor The anchor element our container is positioned relative to\n * @param reinsertFn Called when the container is removed \u2014 should re-insert it\n * @param opts Configuration for retry limits and debounce timing\n * @returns Cleanup function that disconnects the observer\n */\nexport function guardAgainstReconciliation(container, anchor, reinsertFn, opts) {\n const maxRetries = opts?.maxRetries ?? 3;\n const debounceMs = opts?.debounceMs ?? 50;\n // Find the nearest parent to observe. Prefer container's parent, then anchor's.\n const observeTarget = container.parentElement ?? anchor.parentElement;\n if (!observeTarget)\n return () => { };\n let retries = 0;\n let debounceTimer = null;\n let disconnected = false;\n const observer = new MutationObserver((mutations) => {\n if (disconnected)\n return;\n for (const mutation of mutations) {\n for (const removed of mutation.removedNodes) {\n // Check if the removed node is our container\n if (removed !== container)\n continue;\n if (retries >= maxRetries) {\n observer.disconnect();\n disconnected = true;\n return;\n }\n // Debounce to coalesce rapid React re-renders\n if (debounceTimer)\n clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n if (disconnected)\n return;\n retries++;\n try {\n reinsertFn();\n }\n catch {\n // Re-insertion failed \u2014 stop trying\n observer.disconnect();\n disconnected = true;\n }\n }, debounceMs);\n return; // Found our container, no need to check further\n }\n }\n });\n observer.observe(observeTarget, { childList: true, subtree: true });\n return () => {\n disconnected = true;\n observer.disconnect();\n if (debounceTimer)\n clearTimeout(debounceTimer);\n };\n}\n", "/**\n * HTML Sanitizer\n *\n * Sanitizes HTML to prevent XSS attacks.\n * Uses native Sanitizer API when available, falls back to whitelist approach.\n */\nconst ALLOWED_TAGS = new Set([\n 'b',\n 'strong',\n 'i',\n 'em',\n 'u',\n 'span',\n 'div',\n 'p',\n 'br',\n 'ul',\n 'ol',\n 'li',\n 'code',\n 'pre',\n 'small',\n 'sup',\n 'sub',\n 'a',\n 'button',\n]);\nexport function sanitizeHtml(html) {\n // Try native Sanitizer API first\n const hasNative = typeof window.Sanitizer === 'function';\n if (hasNative) {\n try {\n const s = new window.Sanitizer({});\n const frag = s.sanitizeToFragment(html);\n const div = document.createElement('div');\n div.append(frag);\n return div.innerHTML;\n }\n catch {\n // Fall through to manual sanitizer\n }\n }\n // Conservative fallback sanitizer\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n const root = tpl.content;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null);\n const toRemove = [];\n while (walker.nextNode()) {\n const el = walker.currentNode;\n const tag = el.tagName.toLowerCase();\n if (!ALLOWED_TAGS.has(tag)) {\n toRemove.push(el);\n continue;\n }\n // Remove dangerous attributes\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const value = attr.value.trim().toLowerCase();\n const isEvent = name.startsWith('on');\n const isUrlAttr = name === 'href' || name === 'src' || name === 'formaction';\n const isDangerousUrl = isUrlAttr &&\n (value.startsWith('javascript:') ||\n value.startsWith('vbscript:') ||\n value.startsWith('data:text/html'));\n if (isEvent || isDangerousUrl) {\n el.removeAttribute(attr.name);\n }\n }\n }\n // Remove disallowed elements but keep their children\n for (const el of toRemove) {\n while (el.firstChild) {\n el.parentNode?.insertBefore(el.firstChild, el);\n }\n el.remove();\n }\n return tpl.innerHTML;\n}\n", "/**\n * Adaptive Content - Runtime Module\n *\n * DOM manipulation actions: insertHtml, setText, setAttr, addClass, removeClass, setStyle.\n * These follow the hostPatcher snapshot pattern for safe reversibility.\n */\nimport { guardAgainstReconciliation } from './reconciliation-guard';\nimport { sanitizeHtml } from './sanitizer';\n// ============================================================================\n// Executors\n// ============================================================================\n/**\n * Execute an insertHtml action\n */\nexport const executeInsertHtml = async (action, context) => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n // Sanitize HTML content using context utility\n const sanitizedHtml = sanitizeHtml(action.html);\n // Create container for inserted content\n const container = document.createElement('div');\n container.setAttribute('data-syntro-action-id', context.generateId());\n container.innerHTML = sanitizedHtml;\n // Keep track of original state for replace position\n let originalContent = null;\n switch (action.position) {\n case 'before':\n anchorEl.insertAdjacentElement('beforebegin', container);\n break;\n case 'after':\n anchorEl.insertAdjacentElement('afterend', container);\n break;\n case 'prepend':\n anchorEl.insertBefore(container, anchorEl.firstChild);\n break;\n case 'append':\n anchorEl.appendChild(container);\n break;\n case 'replace':\n originalContent = anchorEl.innerHTML;\n anchorEl.replaceWith(container);\n break;\n }\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:insertHtml',\n anchorId: action.anchorId,\n position: action.position,\n });\n // Guard against React reconciliation removing our container.\n // The reinsert function re-applies the same insertion strategy.\n const reinsertFn = () => {\n switch (action.position) {\n case 'before':\n anchorEl.insertAdjacentElement('beforebegin', container);\n break;\n case 'after':\n anchorEl.insertAdjacentElement('afterend', container);\n break;\n case 'prepend':\n anchorEl.insertBefore(container, anchorEl.firstChild);\n break;\n case 'append':\n anchorEl.appendChild(container);\n break;\n case 'replace':\n // Cannot re-insert for replace \u2014 anchor was already replaced\n break;\n }\n };\n const guardCleanup = guardAgainstReconciliation(container, anchorEl, reinsertFn);\n return {\n cleanup: () => {\n guardCleanup();\n if (action.position === 'replace' && originalContent !== null) {\n // Restore original element\n const restoredEl = document.createElement(anchorEl.tagName);\n restoredEl.innerHTML = originalContent;\n // Copy attributes\n Array.from(anchorEl.attributes).forEach((attr) => {\n restoredEl.setAttribute(attr.name, attr.value);\n });\n container.replaceWith(restoredEl);\n }\n else {\n container.remove();\n }\n },\n updateFn: (changes) => {\n if ('html' in changes && typeof changes.html === 'string') {\n container.innerHTML = sanitizeHtml(changes.html);\n }\n },\n };\n};\n/**\n * Execute a setText action\n */\nexport const executeSetText = async (action, context) => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n // Snapshot original text\n const originalText = anchorEl.textContent ?? '';\n // Set new text\n anchorEl.textContent = action.text;\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:setText',\n anchorId: action.anchorId,\n });\n return {\n cleanup: () => {\n anchorEl.textContent = originalText;\n },\n updateFn: (changes) => {\n if ('text' in changes && typeof changes.text === 'string') {\n anchorEl.textContent = changes.text;\n }\n },\n };\n};\n/**\n * Execute a setAttr action\n */\nexport const executeSetAttr = async (action, context) => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n // Block dangerous attributes (case-insensitive)\n const lowerAttr = action.attr.toLowerCase();\n if (lowerAttr.startsWith('on')) {\n throw new Error(`Dangerous attribute not allowed: ${action.attr}`);\n }\n // Block dangerous URIs in URL-bearing attributes\n const isUrlAttr = lowerAttr === 'href' || lowerAttr === 'src' || lowerAttr === 'formaction';\n if (isUrlAttr) {\n const lowerValue = action.value.trim().toLowerCase();\n if (lowerValue.startsWith('javascript:') ||\n lowerValue.startsWith('vbscript:') ||\n lowerValue.startsWith('data:text/html')) {\n throw new Error(`Dangerous URL not allowed in ${action.attr}: ${action.value}`);\n }\n }\n // Snapshot original attribute value\n const originalValue = anchorEl.getAttribute(action.attr);\n const hadAttribute = anchorEl.hasAttribute(action.attr);\n // Set new attribute\n anchorEl.setAttribute(action.attr, action.value);\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:setAttr',\n anchorId: action.anchorId,\n attr: action.attr,\n });\n return {\n cleanup: () => {\n if (hadAttribute && originalValue !== null) {\n anchorEl.setAttribute(action.attr, originalValue);\n }\n else {\n anchorEl.removeAttribute(action.attr);\n }\n },\n updateFn: (changes) => {\n if ('value' in changes && typeof changes.value === 'string') {\n anchorEl.setAttribute(action.attr, changes.value);\n }\n },\n };\n};\n/**\n * Execute an addClass action\n */\nexport const executeAddClass = async (action, context) => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n // Check if class was already present\n const hadClass = anchorEl.classList.contains(action.className);\n // Add class\n anchorEl.classList.add(action.className);\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:addClass',\n anchorId: action.anchorId,\n className: action.className,\n });\n return {\n cleanup: () => {\n // Only remove if we added it\n if (!hadClass) {\n anchorEl.classList.remove(action.className);\n }\n },\n };\n};\n/**\n * Execute a removeClass action\n */\nexport const executeRemoveClass = async (action, context) => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n // Check if class was present\n const hadClass = anchorEl.classList.contains(action.className);\n // Remove class\n anchorEl.classList.remove(action.className);\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:removeClass',\n anchorId: action.anchorId,\n className: action.className,\n });\n return {\n cleanup: () => {\n // Only re-add if we removed it\n if (hadClass) {\n anchorEl.classList.add(action.className);\n }\n },\n };\n};\n/**\n * Execute a setStyle action\n */\nexport const executeSetStyle = async (action, context) => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n // Snapshot original styles\n const originalStyles = new Map();\n for (const prop of Object.keys(action.styles)) {\n const current = anchorEl.style.getPropertyValue(prop);\n originalStyles.set(prop, current);\n }\n // Apply new styles\n for (const [prop, value] of Object.entries(action.styles)) {\n anchorEl.style.setProperty(prop, value);\n }\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:setStyle',\n anchorId: action.anchorId,\n styles: Object.keys(action.styles),\n });\n return {\n cleanup: () => {\n // Restore original styles\n for (const [prop, originalValue] of originalStyles) {\n if (originalValue) {\n anchorEl.style.setProperty(prop, originalValue);\n }\n else {\n anchorEl.style.removeProperty(prop);\n }\n }\n },\n updateFn: (changes) => {\n if ('styles' in changes && typeof changes.styles === 'object' && changes.styles) {\n for (const [prop, value] of Object.entries(changes.styles)) {\n anchorEl.style.setProperty(prop, value);\n }\n }\n },\n };\n};\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\n/**\n * All executors provided by this app.\n * These are registered with the runtime's ExecutorRegistry.\n */\nexport const executors = [\n { kind: 'content:insertHtml', executor: executeInsertHtml },\n { kind: 'content:setText', executor: executeSetText },\n { kind: 'content:setAttr', executor: executeSetAttr },\n { kind: 'content:addClass', executor: executeAddClass },\n { kind: 'content:removeClass', executor: executeRemoveClass },\n { kind: 'content:setStyle', executor: executeSetStyle },\n];\n/**\n * App runtime manifest.\n */\nexport const runtime = {\n id: 'adaptive-content',\n version: '1.0.0',\n name: 'Content',\n description: 'DOM manipulation for text, attributes, and styles',\n executors,\n};\n", "/**\n * Syntro Design System - Color Tokens\n *\n * This file contains all color tokens from the Figma design system.\n * Colors are organized by scale and semantic meaning.\n *\n * @see https://www.figma.com/design/U0Ol5vM7FQvgPfIgCAgxgb/Design-System\n */\n\n// ============================================================================\n// BASE COLORS\n// ============================================================================\n\nexport const base = {\n white: '#ffffff',\n black: '#000000',\n} as const;\n\n// ============================================================================\n// BRAND COLORS\n// ============================================================================\n\nexport const brand = {\n 0: '#2c0b0a',\n 1: '#5b1715',\n 2: '#89221f',\n 3: '#b72e2a',\n 4: '#d44844',\n 5: '#dd6d69',\n 6: '#e5918f',\n 7: '#eeb6b4',\n 8: '#f6dada',\n 9: '#faebea',\n} as const;\n\n// ============================================================================\n// NEUTRAL COLORS\n// ============================================================================\n\nexport const slateGrey = {\n 0: '#07080a',\n 1: '#0f1318',\n 2: '#0e1114',\n 3: '#1c222a',\n 4: '#2b333f',\n 5: '#394454',\n 6: '#475569',\n 7: '#677384',\n 8: '#87919f',\n 9: '#a8afba',\n 10: '#cbd0d7',\n 11: '#e8eaee',\n 12: '#f6f7f9',\n} as const;\n\n// ============================================================================\n// SEMANTIC COLOR SCALES\n// ============================================================================\n\nexport const green = {\n 0: '#07230a',\n 1: '#0e4514',\n 2: '#16681e',\n 3: '#1d8a28',\n 4: '#24ad32',\n 5: '#4fbd5a',\n 6: '#7acd82',\n 7: '#a5deab',\n 8: '#d0eed3',\n 9: '#e5f6e7',\n} as const;\n\nexport const yellow = {\n 0: '#301f09',\n 1: '#5f3e12',\n 2: '#8f5e1b',\n 3: '#be7d24',\n 4: '#ee9c2d',\n 5: '#f1b057',\n 6: '#f5c481',\n 7: '#f8d7ab',\n 8: '#fcebd5',\n 9: '#fdf5ea',\n} as const;\n\nexport const red = {\n 0: '#330707',\n 1: '#660f0e',\n 2: '#991616',\n 3: '#cc1e1d',\n 4: '#ff2524',\n 5: '#ff5150',\n 6: '#ff7c7c',\n 7: '#ffa8a7',\n 8: '#ffd3d3',\n 9: '#ffe9e9',\n} as const;\n\nexport const blue = {\n 0: '#051533',\n 1: '#0a2a66',\n 2: '#0f3f98',\n 3: '#1454cb',\n 4: '#1969fe',\n 5: '#4787fe',\n 6: '#75a5fe',\n 7: '#a3c3ff',\n 8: '#d1e1ff',\n 9: '#e8f0ff',\n} as const;\n\nexport const orange = {\n 0: '#662500',\n 1: '#993d00',\n 2: '#cc5800',\n 3: '#ff7700',\n 4: '#fea85d',\n 5: '#fec58f',\n 6: '#ffd6ae',\n 7: '#fee6cd',\n 8: '#fff1e1',\n 9: '#fff8f0',\n} as const;\n\nexport const purple = {\n 0: '#151229',\n 1: '#2a2452',\n 2: '#40357c',\n 3: '#5547a5',\n 4: '#6a59ce',\n 5: '#887ad8',\n 6: '#a69be2',\n 7: '#c3bdeb',\n 8: '#e1def5',\n 9: '#f0eefa',\n} as const;\n\nexport const pink = {\n 0: '#37091f',\n 1: '#69123c',\n 2: '#9b1c58',\n 3: '#cd2575',\n 4: '#ff2e92',\n 5: '#ff58a8',\n 6: '#ff82be',\n 7: '#ffabd3',\n 8: '#ffd5e9',\n 9: '#ffeaf4',\n} as const;\n\n// ============================================================================\n// LEGACY COLORS (Being phased out)\n// ============================================================================\n\nexport const legacy = {\n aqua: {\n 0: '#0c5f8d',\n 1: '#146b99',\n 2: '#1d78a6',\n 3: '#2e89b6',\n 4: '#4a9fc4',\n 5: '#6bb4d1',\n 6: '#93cce0',\n 7: '#bddff0',\n 8: '#dceef8',\n 9: '#f2f8fc',\n },\n violet: {\n 0: '#6927da',\n 1: '#7839ee',\n 2: '#875bf7',\n 3: '#a48afb',\n 4: '#c3b4fd',\n 5: '#ddd6fe',\n 6: '#ece9fe',\n 7: '#f5f3ff',\n 8: '#fbfaff',\n },\n fuchsia: {\n 0: '#9f1ab1',\n 1: '#ba24d5',\n 2: '#d444f1',\n 3: '#e478fa',\n 4: '#eeaafd',\n 5: '#f6d0fe',\n 6: '#fbe8ff',\n 7: '#fdf4ff',\n 8: '#fefaff',\n },\n pink: {\n 0: '#a10f5f',\n 1: '#dd2590',\n 2: '#ee46bc',\n 3: '#f670c7',\n 4: '#faa7e0',\n 5: '#fcceee',\n 6: '#fce7f6',\n 7: '#fdf2fa',\n 8: '#fef6fb',\n },\n} as const;\n\n// ============================================================================\n// TEXT TOKENS\n// ============================================================================\n\nexport const text = {\n primary: slateGrey[10],\n secondary: slateGrey[9],\n tertiary: slateGrey[8],\n} as const;\n\n// ============================================================================\n// BACKGROUND TOKENS\n// ============================================================================\n\nexport const background = {\n primary: slateGrey[2],\n secondary: slateGrey[0],\n} as const;\n\n// ============================================================================\n// BORDER TOKENS\n// ============================================================================\n\nexport const border = {\n primary: slateGrey[4],\n secondary: slateGrey[3],\n} as const;\n\n// ============================================================================\n// BUTTON TOKENS\n// ============================================================================\n\nexport const button = {\n primary: {\n text: base.white,\n icon: base.white,\n border: brand[3],\n backgroundDefault: brand[3],\n backgroundHover: brand[2],\n },\n neutral: {\n text: slateGrey[10],\n textHover: base.white,\n icon: slateGrey[10],\n iconHover: base.white,\n border: slateGrey[4],\n background: slateGrey[2],\n },\n link: {\n text: base.white,\n icon: base.white,\n hover: brand[5],\n },\n error: {\n text: red[5],\n hover: red[6],\n },\n success: {\n text: green[5],\n hover: green[6],\n },\n} as const;\n\n// ============================================================================\n// BADGE TOKENS\n// ============================================================================\n\nexport const badge = {\n slateGrey: {\n content: slateGrey[10],\n pillOutline: slateGrey[10],\n borderPrimary: slateGrey[5],\n borderSecondary: slateGrey[5],\n background: slateGrey[3],\n },\n brand: {\n content: brand[9],\n pillOutline: brand[9],\n borderPrimary: brand[6],\n borderSecondary: brand[6],\n background: brand[0],\n },\n red: {\n content: red[8],\n pillOutline: red[4],\n borderPrimary: red[2],\n borderSecondary: red[2],\n background: red[0],\n },\n yellow: {\n content: yellow[8],\n pillOutline: yellow[4],\n borderPrimary: yellow[2],\n borderSecondary: yellow[2],\n background: yellow[0],\n },\n green: {\n content: green[8],\n pillOutline: green[4],\n borderPrimary: green[2],\n borderSecondary: green[2],\n background: green[0],\n },\n purple: {\n content: purple[8],\n pillOutline: purple[4],\n borderPrimary: purple[2],\n borderSecondary: purple[2],\n background: purple[0],\n },\n blue: {\n content: blue[8],\n pillOutline: blue[4],\n borderPrimary: blue[2],\n borderSecondary: blue[2],\n background: blue[0],\n },\n orange: {\n content: orange[8],\n pillOutline: orange[4],\n borderPrimary: orange[2],\n borderSecondary: orange[2],\n background: orange[0],\n },\n pink: {\n content: pink[8],\n pillOutline: pink[4],\n borderPrimary: pink[2],\n borderSecondary: pink[2],\n background: pink[0],\n },\n} as const;\n\n// ============================================================================\n// BADGE BANNER TOKENS\n// ============================================================================\n\nexport const badgeBanner = {\n green: {\n content: green[8],\n border: green[2],\n background: green[0],\n },\n yellow: {\n content: yellow[8],\n border: yellow[2],\n background: yellow[0],\n },\n red: {\n content: red[8],\n border: red[2],\n background: red[0],\n },\n} as const;\n\n// ============================================================================\n// ALERT TOKENS\n// ============================================================================\n\nexport const alert = {\n green: {\n content: green[1],\n background: green[9],\n },\n yellow: {\n content: yellow[1],\n background: yellow[9],\n },\n red: {\n content: red[1],\n background: red[9],\n },\n} as const;\n\n// ============================================================================\n// TAG TOKENS\n// ============================================================================\n\nexport const tag = {\n content: slateGrey[10],\n border: slateGrey[4],\n background: '#1c2124',\n} as const;\n\n// ============================================================================\n// MENU TOKENS\n// ============================================================================\n\nexport const menu = {\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n selected: slateGrey[3],\n} as const;\n\n// ============================================================================\n// INPUT/DROPDOWN TOKENS\n// ============================================================================\n\nexport const inputDropdown = {\n background: slateGrey[2],\n icon: slateGrey[10],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n} as const;\n\nexport const inputField = {\n backgroundDefault: slateGrey[2],\n backgroundDisabled: slateGrey[0],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n textError: red[5],\n iconDefault: slateGrey[9],\n iconPlaceholder: slateGrey[10],\n iconError: red[5],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n borderError: red[5],\n} as const;\n\n// ============================================================================\n// TOGGLE TOKENS\n// ============================================================================\n\nexport const toggle = {\n handleDefault: base.white,\n handleDisabled: slateGrey[10],\n off: {\n backgroundDefault: slateGrey[4],\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[4],\n },\n on: {\n backgroundDefault: green[3],\n backgroundHover: green[2],\n backgroundDisabled: slateGrey[4],\n },\n} as const;\n\n// ============================================================================\n// CHECKBOX TOKENS\n// ============================================================================\n\nexport const checkbox = {\n off: {\n backgroundDefault: '#00000000',\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[2],\n border: slateGrey[6],\n },\n on: {\n backgroundDefault: green[0],\n backgroundHover: green[1],\n backgroundDisabled: slateGrey[2],\n border: green[3],\n },\n} as const;\n\n// ============================================================================\n// AVATAR TOKENS\n// ============================================================================\n\nexport const avatar = {\n content: slateGrey[10],\n background: slateGrey[4],\n} as const;\n\n// ============================================================================\n// PROGRESS BAR & SLIDER TOKENS\n// ============================================================================\n\nexport const progressBarSlider = {\n background: slateGrey[4],\n active: green[3],\n} as const;\n\n// ============================================================================\n// CARD TOKENS\n// ============================================================================\n\nexport const card = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n} as const;\n\n// ============================================================================\n// SIDEBAR TOKENS\n// ============================================================================\n\nexport const sidebar = {\n backgroundDefault: slateGrey[1],\n backgroundHover: slateGrey[3],\n backgroundActive: slateGrey[4],\n border: slateGrey[4],\n contentPrimary: slateGrey[10],\n contentSecondary: slateGrey[9],\n contentTertiary: slateGrey[8],\n} as const;\n\n// ============================================================================\n// MODAL TOKENS\n// ============================================================================\n\nexport const modal = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n} as const;\n\n// ============================================================================\n// TAB TOKENS\n// ============================================================================\n\nexport const tab = {\n activeBackground: slateGrey[3],\n activeContent: brand[5],\n inactiveContent: slateGrey[9],\n border: slateGrey[4],\n} as const;\n\n// ============================================================================\n// TABLE TOKENS\n// ============================================================================\n\nexport const table = {\n header: {\n textDefault: slateGrey[9],\n textHover: slateGrey[8],\n backgroundDefault: slateGrey[1],\n },\n border: slateGrey[4],\n cell: {\n textPrimary: slateGrey[10],\n textSecondary: slateGrey[9],\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n },\n} as const;\n\n// ============================================================================\n// BREADCRUMBS TOKENS\n// ============================================================================\n\nexport const breadcrumbs = {\n textPrimaryDefault: slateGrey[10],\n textPrimaryHover: slateGrey[10],\n textSecondaryDefault: slateGrey[8],\n textSecondaryHover: slateGrey[9],\n iconPrimary: slateGrey[10],\n iconSecondary: slateGrey[8],\n} as const;\n\n// ============================================================================\n// LOADING INDICATOR TOKENS\n// ============================================================================\n\nexport const loadingIndicator = {\n background: green[1],\n active: green[5],\n} as const;\n\n// ============================================================================\n// DATE PICKER TOKENS\n// ============================================================================\n\nexport const datePicker = {\n textDefault: slateGrey[10],\n textSelected: base.white,\n textDisabled: slateGrey[7],\n backgroundDefault: slateGrey[2],\n backgroundMiddle: slateGrey[3],\n backgroundSelected: brand[3],\n border: slateGrey[4],\n} as const;\n\n// ============================================================================\n// MISC TOKENS\n// ============================================================================\n\nexport const scroll = slateGrey[9];\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport const colors = {\n base,\n brand,\n slateGrey,\n green,\n yellow,\n red,\n blue,\n orange,\n purple,\n pink,\n legacy,\n text,\n background,\n border,\n button,\n badge,\n badgeBanner,\n alert,\n tag,\n menu,\n inputDropdown,\n inputField,\n toggle,\n checkbox,\n avatar,\n progressBarSlider,\n card,\n sidebar,\n modal,\n tab,\n table,\n breadcrumbs,\n loadingIndicator,\n datePicker,\n scroll,\n} as const;\n\nexport default colors;\n", "/**\n * Highlight Overlay\n *\n * Creates a spotlight effect around an element with a scrim backdrop.\n */\nimport { blue } from '@syntro/design-system/tokens';\nconst supportsPathClip = typeof CSS !== 'undefined' && CSS.supports?.('clip-path', \"path('M0 0 H1 V1 Z')\");\nexport function showHighlight(anchorEl, overlayRoot, opts) {\n const padding = opts?.paddingPx ?? 12;\n const radius = opts?.radiusPx ?? 12;\n const opacity = Math.min(Math.max(opts?.scrimOpacity ?? 0.55, 0), 1);\n const ringColor = opts?.ringColor ?? `var(--syntro-ring, ${blue[5]})`;\n const blocking = opts?.blocking ?? false;\n const onClickOutside = opts?.onClickOutside ?? true;\n const onEsc = opts?.onEsc ?? true;\n const rootStyles = getComputedStyle(document.documentElement);\n const tokenScrim = rootStyles.getPropertyValue('--syntro-spotlight-backdrop').trim();\n const tokenRing = rootStyles.getPropertyValue('--syntro-ring').trim();\n const scrim = document.createElement('div');\n scrim.className = 'syntro-spotlight-scrim';\n const needsPointerEvents = blocking || onClickOutside;\n Object.assign(scrim.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483646',\n pointerEvents: needsPointerEvents ? 'auto' : 'none',\n background: tokenScrim || `rgba(2, 6, 23, ${opacity})`,\n transition: 'opacity 220ms ease',\n opacity: '0',\n });\n overlayRoot.appendChild(scrim);\n requestAnimationFrame(() => (scrim.style.opacity = '1'));\n const ring = document.createElement('div');\n ring.className = 'syntro-spotlight-ring';\n Object.assign(ring.style, {\n position: 'fixed',\n pointerEvents: 'none',\n borderRadius: `${radius}px`,\n border: `2px solid ${ringColor || tokenRing || blue[5]}`,\n boxShadow: `0 0 0 4px rgba(255,255,255,0.35)`,\n zIndex: '2147483647',\n transition: 'all 220ms cubic-bezier(0.16,1,0.3,1)',\n });\n overlayRoot.appendChild(ring);\n const fallbackSlices = [];\n if (!supportsPathClip) {\n for (let i = 0; i < 4; i++) {\n const slice = document.createElement('div');\n slice.style.position = 'fixed';\n slice.style.background = 'inherit';\n fallbackSlices.push(slice);\n scrim.appendChild(slice);\n }\n }\n const setClipPath = (path) => {\n scrim.style.clipPath = path;\n scrim.style.webkitClipPath = path;\n };\n const update = () => {\n // Guard: if anchor was removed from DOM (e.g. React Router navigation),\n // destroy the overlay gracefully instead of positioning at (0,0).\n if (!anchorEl.isConnected) {\n handle.destroy();\n return;\n }\n const rect = anchorEl.getBoundingClientRect();\n const x = Math.max(0, rect.left - padding);\n const y = Math.max(0, rect.top - padding);\n const w = Math.min(window.innerWidth, rect.width + padding * 2);\n const h = Math.min(window.innerHeight, rect.height + padding * 2);\n Object.assign(ring.style, {\n left: `${x}px`,\n top: `${y}px`,\n width: `${w}px`,\n height: `${h}px`,\n });\n if (supportsPathClip) {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const r = Math.min(radius, w / 2, h / 2);\n const outer = `M 0 0 L ${vw} 0 L ${vw} ${vh} L 0 ${vh} Z`;\n const inner = `M ${x + r} ${y} ` +\n `A ${r} ${r} 0 0 0 ${x} ${y + r} ` +\n `L ${x} ${y + h - r} ` +\n `A ${r} ${r} 0 0 0 ${x + r} ${y + h} ` +\n `L ${x + w - r} ${y + h} ` +\n `A ${r} ${r} 0 0 0 ${x + w} ${y + h - r} ` +\n `L ${x + w} ${y + r} ` +\n `A ${r} ${r} 0 0 0 ${x + w - r} ${y} ` +\n `L ${x + r} ${y} ` +\n `Z`;\n setClipPath(`path('${outer} ${inner}')`);\n }\n else {\n const [top, right, bottom, left] = fallbackSlices;\n Object.assign(top.style, {\n left: '0px',\n top: '0px',\n width: '100vw',\n height: `${y}px`,\n });\n Object.assign(bottom.style, {\n left: '0px',\n top: `${y + h}px`,\n width: '100vw',\n height: `${Math.max(0, window.innerHeight - (y + h))}px`,\n });\n Object.assign(left.style, {\n left: '0px',\n top: `${y}px`,\n width: `${x}px`,\n height: `${h}px`,\n });\n Object.assign(right.style, {\n left: `${x + w}px`,\n top: `${y}px`,\n width: `${Math.max(0, window.innerWidth - (x + w))}px`,\n height: `${h}px`,\n });\n }\n };\n const ro = new ResizeObserver(() => requestAnimationFrame(update));\n ro.observe(anchorEl);\n const onScroll = () => requestAnimationFrame(update);\n const onResize = () => requestAnimationFrame(update);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n const onKey = (e) => {\n if (e.key === 'Escape' && onEsc)\n handle.destroy();\n };\n if (onEsc) {\n window.addEventListener('keydown', onKey);\n }\n const onClick = (event) => {\n if (blocking) {\n event.preventDefault();\n event.stopPropagation();\n }\n else if (onClickOutside) {\n handle.destroy();\n }\n };\n scrim.addEventListener('click', onClick);\n const handle = {\n destroy() {\n ro.disconnect();\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n if (onEsc) {\n window.removeEventListener('keydown', onKey);\n }\n scrim.removeEventListener('click', onClick);\n scrim.style.pointerEvents = 'none';\n scrim.style.opacity = '0';\n setTimeout(() => {\n scrim.remove();\n ring.remove();\n }, 220);\n },\n };\n update();\n return handle;\n}\n", "/**\n * HTML Sanitizer\n *\n * Sanitizes HTML to prevent XSS attacks.\n * Uses native Sanitizer API when available, falls back to whitelist approach.\n */\nconst ALLOWED_TAGS = new Set([\n 'b',\n 'strong',\n 'i',\n 'em',\n 'u',\n 'span',\n 'div',\n 'p',\n 'br',\n 'ul',\n 'ol',\n 'li',\n 'code',\n 'pre',\n 'small',\n 'sup',\n 'sub',\n 'a',\n 'button',\n]);\nexport function sanitizeHtml(html) {\n // Try native Sanitizer API first\n const hasNative = typeof window.Sanitizer === 'function';\n if (hasNative) {\n try {\n const s = new window.Sanitizer({});\n const frag = s.sanitizeToFragment(html);\n const div = document.createElement('div');\n div.append(frag);\n return div.innerHTML;\n }\n catch {\n // Fall through to manual sanitizer\n }\n }\n // Conservative fallback sanitizer\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n const root = tpl.content;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null);\n const toRemove = [];\n while (walker.nextNode()) {\n const el = walker.currentNode;\n const tag = el.tagName.toLowerCase();\n if (!ALLOWED_TAGS.has(tag)) {\n toRemove.push(el);\n continue;\n }\n // Remove dangerous attributes\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const value = attr.value.trim().toLowerCase();\n const isEvent = name.startsWith('on');\n const isJsUrl = (name === 'href' || name === 'src') && value.startsWith('javascript:');\n if (isEvent || isJsUrl) {\n el.removeAttribute(attr.name);\n }\n }\n }\n // Remove disallowed elements but keep their children\n for (const el of toRemove) {\n while (el.firstChild) {\n el.parentNode?.insertBefore(el.firstChild, el);\n }\n el.remove();\n }\n return tpl.innerHTML;\n}\n", "/**\n * Modal Executor\n *\n * Displays a centered modal dialog with optional CTA buttons.\n */\nimport { base } from '@syntro/design-system/tokens';\nimport { sanitizeHtml } from './sanitizer';\n/**\n * Execute a modal action\n */\nexport const executeModal = async (action, context) => {\n const { content, size = 'md', blocking = false, scrim, dismiss, ctaButtons } = action;\n // Create scrim backdrop\n const scrimEl = document.createElement('div');\n scrimEl.className = 'syntro-modal-scrim';\n scrimEl.style.cssText = `\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, ${scrim?.opacity ?? 0.6});\n z-index: 2147483645;\n opacity: 0;\n transition: opacity 200ms ease-out;\n `;\n context.overlayRoot.appendChild(scrimEl);\n // Create modal container\n const modal = document.createElement('div');\n modal.className = `syntro-modal syntro-modal-${size}`;\n modal.setAttribute('role', 'dialog');\n modal.setAttribute('aria-modal', 'true');\n // Size-based max-widths\n const sizeMap = { sm: '360px', md: '480px', lg: '640px' };\n modal.style.cssText = `\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n max-width: ${sizeMap[size]};\n width: 90%;\n background: ${base.white};\n border-radius: 12px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n z-index: 2147483646;\n opacity: 0;\n transition: opacity 200ms ease-out, transform 200ms ease-out;\n padding: 24px;\n `;\n // Build modal HTML content\n let html = '';\n if (content.title) {\n html += `<h2 class=\"syntro-modal-title\" style=\"margin: 0 0 12px 0; font-size: 18px; font-weight: 600; color: #111827;\">${sanitizeHtml(content.title)}</h2>`;\n }\n html += `<div class=\"syntro-modal-body\" style=\"color: #4b5563; line-height: 1.5;\">${sanitizeHtml(content.body)}</div>`;\n // Add close button if enabled\n if (dismiss?.closeButton !== false) {\n html += `\n <button class=\"syntro-modal-close\" data-syntro-action=\"dismiss\" style=\"\n position: absolute;\n top: 16px;\n right: 16px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: #6b7280;\n \" aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clip-rule=\"evenodd\"/>\n </svg>\n </button>\n `;\n }\n // Add CTA buttons\n if (ctaButtons && ctaButtons.length > 0) {\n html += `<div class=\"syntro-modal-actions\" style=\"display: flex; gap: 12px; margin-top: 24px; justify-content: flex-end;\">`;\n for (const btn of ctaButtons) {\n const isPrimary = btn.primary ?? false;\n html += `\n <button\n class=\"syntro-modal-btn ${isPrimary ? 'syntro-modal-btn-primary' : ''}\"\n data-syntro-action=\"${sanitizeHtml(btn.actionId)}\"\n style=\"\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n ${isPrimary\n ? 'background: #4f46e5; color: white; border: none;'\n : 'background: white; color: #374151; border: 1px solid #d1d5db;'}\n \"\n >\n ${sanitizeHtml(btn.label)}\n </button>\n `;\n }\n html += `</div>`;\n }\n modal.innerHTML = html;\n context.overlayRoot.appendChild(modal);\n // Track state for waitFor\n let actionClicked = null;\n // Handle action button clicks\n const actionBtns = modal.querySelectorAll('[data-syntro-action]');\n const actionHandler = (e) => {\n const btn = e.currentTarget;\n const actionId = btn.getAttribute('data-syntro-action');\n if (actionId) {\n actionClicked = actionId;\n context.publishEvent('action.modal_cta_clicked', {\n actionId,\n });\n handle.destroy();\n }\n };\n actionBtns.forEach((btn) => btn.addEventListener('click', actionHandler));\n // Handle escape key\n const onKey = (e) => {\n if (e.key === 'Escape' && dismiss?.onEsc !== false) {\n handle.destroy();\n }\n };\n window.addEventListener('keydown', onKey);\n // Handle click outside (on scrim)\n const onScrimClick = () => {\n if (!blocking) {\n handle.destroy();\n }\n };\n scrimEl.addEventListener('click', onScrimClick);\n // Blocking mode - make siblings inert (except editor panel)\n const originalInert = [];\n if (blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (el !== context.overlayRoot &&\n el.getAttribute('inert') === null &&\n !el.querySelector('[data-syntro-editor-panel]') &&\n !el.hasAttribute('data-syntro-editor-panel')) {\n el.setAttribute('inert', '');\n originalInert.push(el);\n }\n });\n }\n // Set up timeout if specified\n let timeoutId;\n if (dismiss?.timeoutMs) {\n timeoutId = setTimeout(() => {\n handle.destroy();\n }, dismiss.timeoutMs);\n }\n // Focus first focusable element\n const focusableEls = modal.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])');\n if (focusableEls.length > 0) {\n requestAnimationFrame(() => focusableEls[0].focus());\n }\n // Fade in\n requestAnimationFrame(() => {\n scrimEl.style.opacity = '1';\n modal.style.opacity = '1';\n modal.style.transform = 'translate(-50%, -50%) scale(1)';\n });\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:modal',\n size,\n blocking,\n });\n const handle = {\n destroy() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n window.removeEventListener('keydown', onKey);\n scrimEl.removeEventListener('click', onScrimClick);\n actionBtns.forEach((btn) => btn.removeEventListener('click', actionHandler));\n // Restore inert state\n originalInert.forEach((el) => el.removeAttribute('inert'));\n // Fade out then remove\n modal.style.pointerEvents = 'none';\n scrimEl.style.pointerEvents = 'none';\n modal.style.opacity = '0';\n modal.style.transform = 'translate(-50%, -50%) scale(0.95)';\n scrimEl.style.opacity = '0';\n setTimeout(() => {\n modal.remove();\n scrimEl.remove();\n }, 200);\n context.publishEvent('action.modal_dismissed', {\n actionClicked,\n });\n },\n };\n return {\n cleanup: () => {\n handle.destroy();\n },\n };\n};\n", "/**\n * Tooltip Overlay\n *\n * Creates a positioned tooltip near an element using Floating UI.\n */\nimport { arrow as arrowMiddleware, autoUpdate, computePosition, flip, hide, offset, shift, } from '@floating-ui/dom';\nimport { sanitizeHtml } from './sanitizer';\n/**\n * For large elements (larger than viewport), create a virtual anchor\n * at the center of the visible portion.\n */\nfunction getAnchorReference(anchorEl) {\n const rect = anchorEl.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const isLargeElement = rect.width > viewportWidth * 0.8 || rect.height > viewportHeight * 0.8;\n if (!isLargeElement) {\n return anchorEl;\n }\n const visibleLeft = Math.max(rect.left, 0);\n const visibleTop = Math.max(rect.top, 0);\n const visibleRight = Math.min(rect.right, viewportWidth);\n const visibleBottom = Math.min(rect.bottom, viewportHeight);\n const centerX = (visibleLeft + visibleRight) / 2;\n const centerY = (visibleTop + visibleBottom) / 2;\n return {\n getBoundingClientRect() {\n return {\n width: 0,\n height: 0,\n x: centerX,\n y: centerY,\n top: centerY,\n left: centerX,\n right: centerX,\n bottom: centerY,\n };\n },\n };\n}\nexport function showTooltip(anchorEl, overlayRoot, opts) {\n // Scroll anchor into view for non-large elements\n const rect = anchorEl.getBoundingClientRect();\n const isLargeElement = rect.width > window.innerWidth * 0.8 || rect.height > window.innerHeight * 0.8;\n if (!isLargeElement) {\n anchorEl.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });\n }\n const div = document.createElement('div');\n div.className = 'syntro-tooltip';\n div.setAttribute('role', 'tooltip');\n div.innerHTML = sanitizeHtml(opts.html);\n // Add close button for immediate tooltips so users can dismiss them\n if (!opts.trigger || opts.trigger === 'immediate') {\n const closeBtn = document.createElement('button');\n closeBtn.className = 'syntro-tooltip-close';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.textContent = '\\u00d7';\n Object.assign(closeBtn.style, {\n position: 'absolute',\n top: '4px',\n right: '4px',\n background: 'none',\n border: 'none',\n color: 'inherit',\n fontSize: '16px',\n lineHeight: '1',\n cursor: 'pointer',\n opacity: '0.6',\n padding: '2px 4px',\n });\n closeBtn.addEventListener('mouseenter', () => {\n closeBtn.style.opacity = '1';\n });\n closeBtn.addEventListener('mouseleave', () => {\n closeBtn.style.opacity = '0.6';\n });\n closeBtn.addEventListener('click', () => handle.destroy());\n div.style.position = 'relative';\n div.appendChild(closeBtn);\n }\n // Handle action button clicks\n const actionBtns = div.querySelectorAll('[data-syntro-action]');\n const actionHandler = (e) => {\n const btn = e.currentTarget;\n const actionId = btn.getAttribute('data-syntro-action');\n if (actionId && opts.onAction) {\n opts.onAction(actionId);\n }\n };\n actionBtns.forEach((btn) => btn.addEventListener('click', actionHandler));\n // Create arrow element\n const arrowEl = document.createElement('div');\n arrowEl.className = 'syntro-tooltip-arrow';\n div.appendChild(arrowEl);\n overlayRoot.appendChild(div);\n const middleware = [\n offset(opts.offsetPx ?? 8),\n flip(),\n shift({ padding: 8 }),\n hide(),\n arrowMiddleware({ element: arrowEl }),\n ];\n const placement = opts.placement && opts.placement !== 'auto' ? opts.placement : 'top';\n const cleanup = autoUpdate(anchorEl, div, async () => {\n // Guard: if anchor was removed from DOM (e.g. React Router navigation),\n // destroy the overlay gracefully instead of positioning at stale coords.\n if (!anchorEl.isConnected) {\n handle.destroy();\n return;\n }\n const currentAnchorRef = getAnchorReference(anchorEl);\n const result = await computePosition(currentAnchorRef, div, {\n placement,\n strategy: 'fixed',\n middleware,\n });\n const { x, y, strategy, middlewareData, placement: finalPlacement } = result;\n Object.assign(div.style, {\n left: `${x}px`,\n top: `${y}px`,\n position: strategy,\n });\n // Position arrow\n if (middlewareData.arrow) {\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n const side = finalPlacement.split('-')[0];\n const staticSide = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n };\n Object.assign(arrowEl.style, {\n left: arrowX != null ? `${arrowX}px` : '',\n top: arrowY != null ? `${arrowY}px` : '',\n right: '',\n bottom: '',\n [staticSide[side]]: '-4px',\n });\n const rotation = {\n top: '0deg',\n right: '90deg',\n bottom: '180deg',\n left: '270deg',\n };\n arrowEl.style.transform = `rotate(${rotation[side] || '0deg'})`;\n }\n });\n const onKey = (e) => {\n if (e.key === 'Escape')\n handle.destroy();\n };\n window.addEventListener('keydown', onKey);\n // Handle blocking mode\n const originalInert = [];\n if (opts.blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (el !== overlayRoot && el.getAttribute('inert') === null) {\n el.setAttribute('inert', '');\n originalInert.push(el.id || el.tagName);\n }\n });\n const focusableEls = Array.from(div.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'));\n if (focusableEls.length > 0) {\n const firstFocusable = focusableEls[0];\n const lastFocusable = focusableEls[focusableEls.length - 1];\n const trapFocus = (e) => {\n if (e.key !== 'Tab')\n return;\n if (e.shiftKey) {\n if (document.activeElement === firstFocusable) {\n lastFocusable.focus();\n e.preventDefault();\n }\n }\n else if (document.activeElement === lastFocusable) {\n firstFocusable.focus();\n e.preventDefault();\n }\n };\n div.addEventListener('keydown', trapFocus);\n requestAnimationFrame(() => firstFocusable.focus());\n }\n }\n const attachTrigger = () => {\n if (opts.trigger === 'hover') {\n const enter = () => {\n div.style.visibility = 'visible';\n div.style.opacity = '1';\n };\n const leave = () => {\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n };\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease, visibility 200ms';\n anchorEl.addEventListener('mouseenter', enter);\n anchorEl.addEventListener('mouseleave', leave);\n anchorEl.addEventListener('focus', enter);\n anchorEl.addEventListener('blur', leave);\n return () => {\n anchorEl.removeEventListener('mouseenter', enter);\n anchorEl.removeEventListener('mouseleave', leave);\n anchorEl.removeEventListener('focus', enter);\n anchorEl.removeEventListener('blur', leave);\n };\n }\n if (opts.trigger === 'click') {\n const toggle = () => {\n const isVisible = div.style.visibility === 'visible';\n if (isVisible) {\n handle.destroy();\n }\n else {\n div.style.visibility = 'visible';\n div.style.opacity = '1';\n }\n };\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease, visibility 200ms';\n anchorEl.addEventListener('click', toggle);\n return () => anchorEl.removeEventListener('click', toggle);\n }\n // Immediate - fade in on mount\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease';\n requestAnimationFrame(() => {\n div.style.opacity = '1';\n });\n return () => { };\n };\n const removeTrigger = attachTrigger();\n const handle = {\n el: div,\n destroy() {\n cleanup();\n removeTrigger();\n window.removeEventListener('keydown', onKey);\n actionBtns.forEach((btn) => btn.removeEventListener('click', actionHandler));\n if (opts.blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (el !== overlayRoot) {\n el.removeAttribute('inert');\n }\n });\n }\n div.style.pointerEvents = 'none';\n div.style.opacity = '0';\n setTimeout(() => div.remove(), 200);\n },\n };\n return handle;\n}\n", "/**\n * Adaptive Overlays - Runtime Module\n *\n * Visual overlay actions: highlight, pulse, badge, tooltip.\n */\nimport { showHighlight } from './highlight';\nimport { executeModal } from './modal';\nimport { sanitizeHtml } from './sanitizer';\nimport { showTooltip } from './tooltip';\n// Re-export executeModal for use by other packages\nexport { executeModal };\n// ============================================================================\n// Executors\n// ============================================================================\n/**\n * Execute a highlight action\n */\nexport const executeHighlight = async (action, context) => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n const handle = showHighlight(anchorEl, context.overlayRoot, {\n paddingPx: action.style?.paddingPx ?? 12,\n radiusPx: action.style?.radiusPx ?? 12,\n scrimOpacity: action.style?.scrimOpacity ?? 0.55,\n ringColor: action.style?.color,\n blocking: action.blocking ?? false,\n onClickOutside: action.onClickOutside ?? true,\n onEsc: action.onEsc ?? true,\n });\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:highlight',\n anchorId: action.anchorId,\n });\n return {\n cleanup: () => {\n handle.destroy();\n },\n };\n};\n/**\n * Execute a pulse action\n */\nexport const executePulse = async (action, context) => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n const duration = action.duration ?? 2000;\n // Inject scoped pulse animation (no global styles)\n if (!document.querySelector('[data-syntro-pulse-styles]')) {\n const style = document.createElement('style');\n style.setAttribute('data-syntro-pulse-styles', '');\n style.textContent = `\n @keyframes syntro-pulse-anim {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(79, 70, 229, 0.4);\n }\n 50% {\n box-shadow: 0 0 0 8px rgba(79, 70, 229, 0);\n }\n }\n `;\n document.head.appendChild(style);\n }\n // Apply pulse animation via inline style (scoped to this element)\n const originalAnimation = anchorEl.style.animation;\n anchorEl.style.animation = 'syntro-pulse-anim 1s cubic-bezier(0.4, 0, 0.6, 1) infinite';\n anchorEl.setAttribute('data-syntro-pulse', 'true');\n // Set up auto-remove timeout\n const timeoutId = setTimeout(() => {\n anchorEl.style.animation = originalAnimation;\n anchorEl.removeAttribute('data-syntro-pulse');\n }, duration);\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:pulse',\n anchorId: action.anchorId,\n duration,\n });\n return {\n cleanup: () => {\n clearTimeout(timeoutId);\n anchorEl.style.animation = originalAnimation;\n anchorEl.removeAttribute('data-syntro-pulse');\n },\n };\n};\n/**\n * Execute a badge action\n */\nexport const executeBadge = async (action, context) => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n // Create badge element with inline styles (no global style injection)\n const badge = document.createElement('div');\n badge.textContent = action.content;\n badge.setAttribute('data-syntro-badge', action.anchorId);\n // Apply styles directly to element\n Object.assign(badge.style, {\n position: 'absolute',\n padding: '2px 6px',\n fontSize: '12px',\n fontWeight: '600',\n lineHeight: '1',\n color: 'white',\n background: 'var(--syntro-accent, #4f46e5)',\n borderRadius: '9999px',\n pointerEvents: 'none',\n zIndex: '2147483646',\n whiteSpace: 'nowrap',\n });\n // Position badge relative to anchor\n const position = action.position ?? 'top-right';\n // Ensure anchor has relative positioning for badge\n const originalPosition = anchorEl.style.position;\n if (getComputedStyle(anchorEl).position === 'static') {\n anchorEl.style.position = 'relative';\n }\n // Append to anchor for relative positioning\n anchorEl.appendChild(badge);\n // Position based on config\n switch (position) {\n case 'top-left':\n Object.assign(badge.style, { top: '-8px', left: '-8px' });\n break;\n case 'top-right':\n Object.assign(badge.style, { top: '-8px', right: '-8px' });\n break;\n case 'bottom-left':\n Object.assign(badge.style, { bottom: '-8px', left: '-8px' });\n break;\n case 'bottom-right':\n Object.assign(badge.style, { bottom: '-8px', right: '-8px' });\n break;\n }\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:badge',\n anchorId: action.anchorId,\n content: action.content,\n position,\n });\n return {\n cleanup: () => {\n badge.remove();\n if (originalPosition !== undefined) {\n anchorEl.style.position = originalPosition;\n }\n },\n updateFn: (changes) => {\n if ('content' in changes && typeof changes.content === 'string') {\n badge.textContent = changes.content;\n }\n },\n };\n};\n/**\n * Execute a tooltip action\n */\nexport const executeTooltip = async (action, context) => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n // Build tooltip HTML\n const { content } = action;\n let html = '';\n if (content.title) {\n html += `<div class=\"syntro-tt-title\">${sanitizeHtml(content.title)}</div>`;\n }\n html += `<div class=\"syntro-tt-body\">${sanitizeHtml(content.body)}</div>`;\n // Add CTA buttons if provided (new multi-button support)\n if (content.ctaButtons && content.ctaButtons.length > 0) {\n html += `<div class=\"syntro-tt-actions\">`;\n for (const btn of content.ctaButtons) {\n const isPrimary = btn.primary ?? false;\n html += `\n <button\n class=\"syntro-tt-btn ${isPrimary ? 'syntro-tt-btn-primary' : ''}\"\n data-syntro-action=\"${sanitizeHtml(btn.actionId)}\"\n >\n ${sanitizeHtml(btn.label)}\n </button>\n `;\n }\n html += `</div>`;\n }\n else if (content.cta) {\n // Legacy single CTA support\n html += `<div class=\"syntro-tt-actions\">\n <button class=\"syntro-tt-btn syntro-tt-btn-primary\" data-syntro-action=\"cta\">\n ${sanitizeHtml(content.cta.label)}\n </button>\n </div>`;\n }\n const handle = showTooltip(anchorEl, context.overlayRoot, {\n html,\n placement: action.placement ?? 'top',\n trigger: action.trigger ?? 'immediate',\n onAction: (actionId) => {\n // Handle dismiss CTA \u2014 destroy the tooltip\n if (actionId === 'dismiss') {\n handle.destroy();\n return;\n }\n if (actionId === 'cta' && content.cta) {\n context.publishEvent('action.cta_clicked', {\n anchorId: action.anchorId,\n ctaLabel: content.cta.label,\n });\n }\n else if (content.ctaButtons) {\n const clickedBtn = content.ctaButtons.find((b) => b.actionId === actionId);\n if (clickedBtn) {\n context.publishEvent('action.tooltip_cta_clicked', {\n anchorId: action.anchorId,\n actionId,\n label: clickedBtn.label,\n });\n }\n }\n handle.destroy();\n },\n });\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:tooltip',\n anchorId: action.anchorId,\n trigger: action.trigger ?? 'immediate',\n });\n return {\n cleanup: () => {\n handle.destroy();\n },\n };\n};\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\n/**\n * All executors provided by this app.\n * These are registered with the runtime's ExecutorRegistry.\n */\nexport const executors = [\n { kind: 'overlays:highlight', executor: executeHighlight },\n { kind: 'overlays:pulse', executor: executePulse },\n { kind: 'overlays:badge', executor: executeBadge },\n { kind: 'overlays:tooltip', executor: executeTooltip },\n { kind: 'overlays:modal', executor: executeModal },\n];\n/**\n * App runtime manifest.\n */\nexport const runtime = {\n id: 'adaptive-overlays',\n version: '1.0.0',\n name: 'Overlays',\n description: 'Tooltips, highlights, badges, modals, and visual overlays',\n executors,\n};\n", "/**\n * App Context\n *\n * Provides a sandboxed runtime context for apps.\n * Apps receive an AppContext when they activate, giving them controlled\n * access to runtime functionality.\n */\n\nimport type { SmartCanvasRuntime } from '../runtime';\n\nimport type { AppActionDefinition, AppContext, AppWidgetDefinition } from './types';\n\n/**\n * Options for creating an AppContext.\n */\nexport interface CreateAppContextOptions {\n /** The app ID */\n appId: string;\n /** The runtime instance */\n runtime: SmartCanvasRuntime;\n /** Whether this is a built-in app (prevents executor override) */\n isBuiltIn?: boolean;\n}\n\n/**\n * Create a sandboxed AppContext for an app.\n *\n * The context provides controlled access to runtime functionality,\n * with state namespaced to the app.\n */\nexport function createAppContext(options: CreateAppContextOptions): AppContext {\n const { appId, runtime, isBuiltIn = false } = options;\n const _statePrefix = `app:${appId}:`;\n\n // Track registered actions and widgets for cleanup\n const registeredActions: string[] = [];\n const registeredWidgets: string[] = [];\n\n // Get or create namespaced storage for this app\n const appStorage = runtime.state.ns(`app:${appId}`);\n\n const context: AppContext = {\n appId,\n\n // Namespaced state access (using session storage scoped to this app)\n state: {\n get: (key: string) => appStorage.get(key),\n set: (key: string, value: unknown) => appStorage.set(key, value),\n remove: (key: string) => appStorage.remove(key),\n },\n\n // Telemetry access (if available) - using EventBus for custom events\n telemetry: runtime.telemetry\n ? {\n emit: (eventName: string, props?: Record<string, unknown>) => {\n // Use EventBus to emit custom events since TelemetryClient doesn't have generic emit\n runtime.events.publish(eventName, {\n ...props,\n _appId: appId,\n });\n },\n getSessionId: () => runtime.telemetry?.getSessionId?.(),\n }\n : undefined,\n\n // Surfaces access\n surfaces: {\n mount: (slot, content, opts) => {\n const handle = runtime.surfaces.mount(slot as any, content as any, {\n ...(opts as any),\n adaptiveId: appId,\n });\n return {\n unmount: () => handle.unmount(),\n update: (newContent) => handle.update(newContent as any),\n };\n },\n canMount: (slot, priority) => runtime.surfaces.canMount(slot as any, priority),\n },\n\n // Events access\n events: {\n subscribe: (callback) =>\n runtime.events.subscribe((event) => {\n callback(event);\n }),\n publish: (name, props) => {\n runtime.events.publish(name, {\n ...props,\n _appId: appId,\n });\n },\n },\n\n // Action registration\n registerAction: (definition: AppActionDefinition) => {\n runtime.executors.register(\n definition.kind,\n definition.executor,\n definition.schema,\n appId,\n isBuiltIn\n );\n registeredActions.push(definition.kind);\n },\n\n // Widget registration\n registerWidget: (definition: AppWidgetDefinition) => {\n runtime.widgets.register(definition.id, definition.component, appId, definition.metadata);\n registeredWidgets.push(definition.id);\n },\n };\n\n return context;\n}\n\n/**\n * Clean up all resources registered by an app context.\n */\nexport function cleanupAppContext(appId: string, runtime: SmartCanvasRuntime): void {\n // Unregister all executors from this app\n runtime.executors.unregisterBySource(appId);\n\n // Unregister all widgets from this app\n runtime.widgets.unregisterBySource(appId);\n}\n", "/**\n * App Loader\n *\n * Handles loading apps from CDN based on canvas config requirements.\n *\n * Loading Strategy:\n * 1. Core apps (built-in actions) are bundled with runtime - no loading needed\n * 2. External apps are loaded from CDN when config references them\n *\n * The loader determines which apps are needed by scanning the canvas config for:\n * - Action kinds with namespaces (e.g., \"gamification:awardBadge\")\n * - Widget IDs with namespaces (e.g., \"gamification:leaderboard\")\n * - Explicit app references in config\n */\n\nimport type { AppRegistry } from './AppRegistry';\nimport type { AppManifest } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * App loading options.\n */\nexport interface AppLoaderOptions {\n /** Base URL for CDN app bundles */\n cdnBase: string;\n /** App registry to register loaded apps */\n registry: AppRegistry;\n /** Timeout for loading apps (ms) */\n timeout?: number;\n /** Callback when an app starts loading */\n onLoadStart?: (appId: string) => void;\n /** Callback when an app finishes loading */\n onLoadEnd?: (appId: string, success: boolean, error?: string) => void;\n}\n\n/**\n * App load result.\n */\nexport interface AppLoadResult {\n appId: string;\n success: boolean;\n error?: string;\n manifest?: AppManifest;\n}\n\n/**\n * Canvas config for determining which apps to load.\n */\nexport interface CanvasConfigForLoader {\n /** Actions in the config */\n actions?: Array<{ kind: string; [key: string]: unknown }>;\n /** Explicit app IDs to load */\n apps?: string[];\n /** Widgets referenced in actions */\n widgets?: Array<{ widgetId?: string; widget?: { widgetId: string } }>;\n /** Tiles in the config (each may reference a widget) */\n tiles?: Array<{ widget?: string; [key: string]: unknown }>;\n}\n\n// ============================================================================\n// Core Apps (bundled with runtime)\n// ============================================================================\n\n/**\n * Core action kinds that are bundled with the runtime.\n * These don't require loading external apps.\n */\nconst CORE_ACTION_KINDS = new Set([\n // Overlay actions (bundled via @syntrologie/adapt-overlays)\n 'overlays:highlight',\n 'overlays:pulse',\n 'overlays:badge',\n 'overlays:tooltip',\n 'overlays:modal',\n // Content actions (bundled via @syntrologie/adapt-content)\n 'content:insertHtml',\n 'content:setText',\n 'content:setAttr',\n 'content:addClass',\n 'content:removeClass',\n 'content:setStyle',\n // Core actions (bundled with runtime)\n 'core:mountWidget',\n 'core:wait',\n 'core:sequence',\n 'core:parallel',\n 'core:tour',\n]);\n\n/**\n * Map action/widget namespace prefixes to CDN app IDs.\n * Needed when the action kind prefix doesn't match the CDN bundle directory name.\n * e.g., action \"faq:update\" has namespace \"faq\" but the CDN bundle is \"adaptive-faq\".\n */\nconst NAMESPACE_TO_APP_ID: Record<string, string> = {\n faq: 'adaptive-faq',\n nav: 'adaptive-nav',\n gamification: 'adaptive-gamification',\n chatbot: 'adaptive-chatbot',\n};\n\n/**\n * Resolve a namespace prefix to its CDN app ID.\n */\nfunction resolveAppId(namespace: string): string {\n return NAMESPACE_TO_APP_ID[namespace] ?? namespace;\n}\n\n/**\n * Check if an action kind is a core action.\n */\nexport function isCoreActionKind(kind: string): boolean {\n return CORE_ACTION_KINDS.has(kind);\n}\n\n/**\n * Extract app ID from a namespaced action kind.\n * e.g., \"gamification:awardBadge\" \u2192 \"gamification\"\n * e.g., \"navigation:scrollTo\" \u2192 \"nav\" (via namespace mapping)\n */\nexport function getAppIdFromActionKind(kind: string): string | null {\n if (isCoreActionKind(kind)) return null;\n const colonIndex = kind.indexOf(':');\n if (colonIndex === -1) return null;\n return resolveAppId(kind.slice(0, colonIndex));\n}\n\n/**\n * Extract app ID from a namespaced widget ID.\n * e.g., \"gamification:leaderboard\" \u2192 \"gamification\"\n */\nexport function getAppIdFromWidgetId(widgetId: string): string | null {\n const colonIndex = widgetId.indexOf(':');\n if (colonIndex === -1) return null;\n return resolveAppId(widgetId.slice(0, colonIndex));\n}\n\n// ============================================================================\n// App Loader\n// ============================================================================\n\n/**\n * Create an app loader instance.\n */\nexport function createAppLoader(options: AppLoaderOptions) {\n const { cdnBase, registry, timeout = 10000, onLoadStart, onLoadEnd } = options;\n\n /** Cache of loading promises to avoid duplicate loads */\n const loadingPromises = new Map<string, Promise<AppLoadResult>>();\n\n /** Cache of loaded app URLs */\n const loadedUrls = new Set<string>();\n\n /** Cache of failed CDN loads to avoid repeated attempts in the same session */\n const failedApps = new Map<string, AppLoadResult>();\n\n /**\n * Get the CDN URL for an app.\n */\n function getAppUrl(appId: string): string {\n // Convention: adaptives are at {cdnBase}/adaptives/{appId}/index.js\n return `${cdnBase}/adaptives/${appId}/index.js`;\n }\n\n /**\n * Load a single app from CDN.\n */\n async function loadApp(appId: string): Promise<AppLoadResult> {\n // Check if already registered (covers locally-injected bundles)\n if (registry.has(appId)) {\n return { appId, success: true, manifest: registry.get(appId)?.manifest };\n }\n\n // Check if previously failed \u2014 don't retry CDN in the same session.\n // If the app gets loaded by other means (e.g., local script tag),\n // the registry.has() check above will catch it on the next call.\n if (failedApps.has(appId)) {\n return failedApps.get(appId)!;\n }\n\n // Check if already loading\n if (loadingPromises.has(appId)) {\n return loadingPromises.get(appId)!;\n }\n\n // Start loading\n const loadPromise = (async (): Promise<AppLoadResult> => {\n onLoadStart?.(appId);\n\n try {\n const url = getAppUrl(appId);\n\n // Skip if already loaded this URL\n if (loadedUrls.has(url)) {\n const registration = registry.get(appId);\n if (registration) {\n onLoadEnd?.(appId, true);\n return { appId, success: true, manifest: registration.manifest };\n }\n }\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Timeout loading app: ${appId}`)), timeout);\n });\n\n // Fetch and execute the app bundle\n const loadPromise = loadAppBundle(url, appId);\n await Promise.race([loadPromise, timeoutPromise]);\n\n loadedUrls.add(url);\n\n // Get the registered manifest\n const registration = registry.get(appId);\n if (!registration) {\n throw new Error(`App ${appId} did not register after loading`);\n }\n\n onLoadEnd?.(appId, true);\n return { appId, success: true, manifest: registration.manifest };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n onLoadEnd?.(appId, false, errorMessage);\n const result: AppLoadResult = { appId, success: false, error: errorMessage };\n failedApps.set(appId, result);\n return result;\n } finally {\n loadingPromises.delete(appId);\n }\n })();\n\n loadingPromises.set(appId, loadPromise);\n return loadPromise;\n }\n\n /**\n * Load an app bundle from a URL.\n */\n async function loadAppBundle(url: string, appId: string): Promise<void> {\n // For browser environments, we use dynamic import or script loading\n if (typeof window !== 'undefined') {\n // Try dynamic import first (for ES modules)\n try {\n const module = await import(/* webpackIgnore: true */ url);\n\n // The module should export a manifest and optionally auto-register\n if (module.manifest) {\n registry.register(module.manifest);\n } else if (module.default?.manifest) {\n registry.register(module.default.manifest);\n } else if (module.default) {\n // If module.default is the manifest itself\n registry.register(module.default);\n }\n return;\n } catch {\n // Fall back to script tag loading for UMD bundles\n }\n\n // Script tag loading for UMD bundles\n return new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = url;\n script.async = true;\n\n script.onload = () => {\n // UMD bundles should register themselves via global\n const registered = registry.get(appId);\n if (registered) {\n resolve();\n } else {\n reject(new Error(`App ${appId} did not self-register`));\n }\n };\n\n script.onerror = () => {\n reject(new Error(`Failed to load app script: ${url}`));\n };\n\n document.head.appendChild(script);\n });\n }\n\n // For SSR/Node environments, we can't dynamically load apps\n throw new Error('Dynamic app loading not supported in SSR');\n }\n\n /**\n * Analyze config to determine which apps need to be loaded.\n */\n function getRequiredApps(config: CanvasConfigForLoader): string[] {\n const appIds = new Set<string>();\n\n // Check explicit app references\n if (config.apps) {\n for (const appId of config.apps) {\n appIds.add(appId);\n }\n }\n\n // Check action kinds for namespaced actions\n if (config.actions) {\n for (const action of config.actions) {\n const appId = getAppIdFromActionKind(action.kind);\n if (appId) {\n appIds.add(appId);\n }\n\n // Also check core:mountWidget actions for widget namespaces\n if (action.kind === 'core:mountWidget') {\n const widgetId = (action as any).widget?.widgetId;\n if (widgetId) {\n const widgetAppId = getAppIdFromWidgetId(widgetId);\n if (widgetAppId) {\n appIds.add(widgetAppId);\n }\n }\n }\n }\n }\n\n // Check tiles for widget references\n if (config.tiles) {\n for (const tile of config.tiles) {\n if (tile.widget) {\n const widgetAppId = getAppIdFromWidgetId(tile.widget);\n if (widgetAppId) {\n appIds.add(widgetAppId);\n }\n }\n }\n }\n\n return Array.from(appIds);\n }\n\n /**\n * Load all apps required by a config.\n */\n async function loadAppsForConfig(config: CanvasConfigForLoader): Promise<AppLoadResult[]> {\n const requiredApps = getRequiredApps(config);\n\n if (requiredApps.length === 0) {\n return [];\n }\n\n // Load all apps in parallel\n const results = await Promise.all(requiredApps.map((appId) => loadApp(appId)));\n\n return results;\n }\n\n /**\n * Preload apps without activating them.\n */\n async function preloadApps(appIds: string[]): Promise<AppLoadResult[]> {\n return Promise.all(appIds.map((appId) => loadApp(appId)));\n }\n\n return {\n loadApp,\n loadAppsForConfig,\n preloadApps,\n getRequiredApps,\n getAppUrl,\n };\n}\n\nexport type AppLoader = ReturnType<typeof createAppLoader>;\n", "/**\n * App Registry\n *\n * Central registry for managing SynOS apps.\n * Handles app registration, activation, deactivation, and lifecycle management.\n */\n\nimport type { SmartCanvasRuntime } from '../runtime';\n\nimport { cleanupAppContext, createAppContext } from './AppContext';\nimport type { AppManifest, AppRegistration, AppRegistryEvent } from './types';\n\n/**\n * Callback for app registry events.\n */\nexport type AppRegistryEventCallback = (event: AppRegistryEvent) => void;\n\n/**\n * App registry for managing SynOS apps.\n */\nexport class AppRegistry {\n private apps = new Map<string, AppRegistration>();\n private eventListeners = new Set<AppRegistryEventCallback>();\n private runtime: SmartCanvasRuntime | null = null;\n\n /**\n * Bind the registry to a runtime instance.\n * Must be called before apps can be activated.\n */\n bind(runtime: SmartCanvasRuntime): void {\n this.runtime = runtime;\n }\n\n /**\n * Unbind from the current runtime.\n * Deactivates all active apps first.\n */\n async unbind(): Promise<void> {\n // Deactivate all active apps\n for (const [appId, registration] of this.apps) {\n if (registration.state === 'active') {\n await this.deactivate(appId);\n }\n }\n this.runtime = null;\n }\n\n /**\n * Register an app.\n *\n * Registration makes the app available but does not activate it.\n * Call activate() to start the app's runtime extensions.\n */\n register(manifest: AppManifest): AppRegistration {\n // Validate manifest\n if (!manifest.id || typeof manifest.id !== 'string') {\n throw new Error(\"App manifest must have an 'id' property\");\n }\n if (!manifest.version || typeof manifest.version !== 'string') {\n throw new Error(\"App manifest must have a 'version' property\");\n }\n if (!manifest.name || typeof manifest.name !== 'string') {\n throw new Error(\"App manifest must have a 'name' property\");\n }\n\n // Check for existing registration\n if (this.apps.has(manifest.id)) {\n const existing = this.apps.get(manifest.id)!;\n if (existing.state === 'active') {\n throw new Error(`Cannot re-register active app: ${manifest.id}`);\n }\n console.warn(`[AppRegistry] Overriding existing app registration: ${manifest.id}`);\n }\n\n // Create registration\n const registration: AppRegistration = {\n manifest,\n state: 'registered',\n registeredAt: Date.now(),\n };\n\n this.apps.set(manifest.id, registration);\n\n // Emit event\n this.emit({\n type: 'app:registered',\n appId: manifest.id,\n manifest,\n });\n\n return registration;\n }\n\n /**\n * Activate an app.\n *\n * Activating an app:\n * 1. Creates an AppContext for sandboxed runtime access\n * 2. Registers the app's actions with ExecutorRegistry\n * 3. Registers the app's widgets with WidgetRegistry\n * 4. Sets up the app's event handlers\n */\n async activate(appId: string): Promise<void> {\n const registration = this.apps.get(appId);\n if (!registration) {\n throw new Error(`App not registered: ${appId}`);\n }\n\n if (registration.state === 'active' || registration.state === 'activating') {\n console.warn(`[AppRegistry] App already ${registration.state}: ${appId}`);\n return;\n }\n\n if (!this.runtime) {\n throw new Error('AppRegistry not bound to a runtime. Call bind() first.');\n }\n\n // Check dependencies\n if (registration.manifest.dependencies) {\n for (const depId of registration.manifest.dependencies) {\n const dep = this.apps.get(depId);\n if (!dep || dep.state !== 'active') {\n throw new Error(`App ${appId} depends on ${depId}, which is not active`);\n }\n }\n }\n\n // Update state\n registration.state = 'activating';\n\n try {\n // Create app context\n const isBuiltIn = registration.manifest.metadata?.isBuiltIn === true;\n const context = createAppContext({\n appId,\n runtime: this.runtime,\n isBuiltIn,\n });\n\n // Register runtime extensions\n const { runtime: runtimeExtensions } = registration.manifest;\n const cleanupFns: (() => void | Promise<void>)[] = [];\n\n if (runtimeExtensions) {\n // Register actions\n if (runtimeExtensions.actions) {\n for (const actionDef of runtimeExtensions.actions) {\n context.registerAction(actionDef);\n }\n }\n\n // Register widgets\n if (runtimeExtensions.widgets) {\n for (const widgetDef of runtimeExtensions.widgets) {\n context.registerWidget(widgetDef);\n }\n }\n\n // Set up event handlers\n if (runtimeExtensions.events) {\n for (const handler of runtimeExtensions.events) {\n const unsubscribe = this.runtime.events.subscribe((event) => {\n if (handler.names.includes(event.name)) {\n const eventContext = {\n appId,\n state: context.state,\n telemetry: context.telemetry,\n surfaces: context.surfaces,\n };\n try {\n handler.handler(event, eventContext);\n } catch (error) {\n console.error(`[AppRegistry] Event handler error in ${appId}:`, error);\n }\n }\n });\n cleanupFns.push(unsubscribe);\n }\n }\n }\n\n // Store cleanup function\n registration.cleanup = async () => {\n // Run cleanup functions\n for (const fn of cleanupFns) {\n try {\n await fn();\n } catch (error) {\n console.error(`[AppRegistry] Cleanup error in ${appId}:`, error);\n }\n }\n // Clean up app context resources\n cleanupAppContext(appId, this.runtime!);\n };\n\n // Update state\n registration.state = 'active';\n registration.activatedAt = Date.now();\n\n // Emit event\n this.emit({ type: 'app:activated', appId });\n } catch (error) {\n registration.state = 'error';\n registration.error = String(error);\n this.emit({ type: 'app:error', appId, error: String(error) });\n throw error;\n }\n }\n\n /**\n * Deactivate an app.\n *\n * Deactivating an app:\n * 1. Runs the cleanup function\n * 2. Unregisters all actions and widgets\n * 3. Removes event handlers\n */\n async deactivate(appId: string): Promise<void> {\n const registration = this.apps.get(appId);\n if (!registration) {\n throw new Error(`App not registered: ${appId}`);\n }\n\n if (registration.state !== 'active') {\n console.warn(`[AppRegistry] App not active: ${appId}`);\n return;\n }\n\n // Check if any active apps depend on this one\n for (const [otherId, other] of this.apps) {\n if (other.state === 'active' && other.manifest.dependencies?.includes(appId)) {\n throw new Error(`Cannot deactivate ${appId}: app ${otherId} depends on it`);\n }\n }\n\n // Update state\n registration.state = 'deactivating';\n\n try {\n // Run cleanup\n if (registration.cleanup) {\n await registration.cleanup();\n registration.cleanup = undefined;\n }\n\n // Update state\n registration.state = 'inactive';\n\n // Emit event\n this.emit({ type: 'app:deactivated', appId });\n } catch (error) {\n registration.state = 'error';\n registration.error = String(error);\n this.emit({ type: 'app:error', appId, error: String(error) });\n throw error;\n }\n }\n\n /**\n * Unregister an app.\n *\n * The app must be inactive before it can be unregistered.\n */\n async unregister(appId: string): Promise<void> {\n const registration = this.apps.get(appId);\n if (!registration) {\n return;\n }\n\n if (registration.state === 'active') {\n await this.deactivate(appId);\n }\n\n this.apps.delete(appId);\n\n // Emit event\n this.emit({ type: 'app:unregistered', appId });\n }\n\n /**\n * Get an app registration.\n */\n get(appId: string): AppRegistration | undefined {\n return this.apps.get(appId);\n }\n\n /**\n * Check if an app is registered.\n */\n has(appId: string): boolean {\n return this.apps.has(appId);\n }\n\n /**\n * Check if an app is active.\n */\n isActive(appId: string): boolean {\n const registration = this.apps.get(appId);\n return registration?.state === 'active';\n }\n\n /**\n * List all registered apps.\n */\n list(): AppRegistration[] {\n return Array.from(this.apps.values());\n }\n\n /**\n * List all active apps.\n */\n listActive(): AppRegistration[] {\n return Array.from(this.apps.values()).filter((r) => r.state === 'active');\n }\n\n /**\n * List all apps with editor modules.\n */\n listEditable(): AppRegistration[] {\n return Array.from(this.apps.values()).filter((r) => r.manifest.editor !== undefined);\n }\n\n /**\n * Subscribe to registry events.\n */\n subscribe(callback: AppRegistryEventCallback): () => void {\n this.eventListeners.add(callback);\n return () => {\n this.eventListeners.delete(callback);\n };\n }\n\n /**\n * Emit an event to all listeners.\n */\n private emit(event: AppRegistryEvent): void {\n for (const listener of this.eventListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('[AppRegistry] Event listener error:', error);\n }\n }\n }\n\n /**\n * Clean up all apps.\n */\n async destroy(): Promise<void> {\n await this.unbind();\n this.apps.clear();\n this.eventListeners.clear();\n }\n}\n\n/**\n * Default singleton instance of AppRegistry.\n */\nexport const appRegistry = new AppRegistry();\n", "/**\n * Anti-flicker functionality to prevent content flash during patch application\n */\n\nexport interface AntiFlickerConfig {\n timeout?: number; // Max time to hide content (default: 300ms)\n className?: string; // Class to add for hiding (default: 'sc-anti-flicker')\n style?: string; // CSS to inject (default: opacity: 0)\n hostLoadingSelector?: string; // If a matching element exists, skip anti-flicker entirely\n waitForHostReady?: string; // Defer anti-flicker removal until this custom event fires on document\n}\n\nconst DEFAULT_CONFIG: Required<AntiFlickerConfig> = {\n timeout: 300,\n className: 'sc-anti-flicker',\n style: 'opacity: 0 !important',\n hostLoadingSelector: '',\n waitForHostReady: '',\n};\n\nexport function initAntiFlicker(config: AntiFlickerConfig = {}): () => void {\n const { timeout, className, style, hostLoadingSelector, waitForHostReady } = {\n ...DEFAULT_CONFIG,\n ...config,\n };\n\n // If host is already showing its own loading UI, skip anti-flicker entirely\n if (hostLoadingSelector && document.querySelector(hostLoadingSelector)) {\n return () => {};\n }\n\n // Inject style\n const styleEl = document.createElement('style');\n styleEl.textContent = `.${className} { ${style} }`;\n document.head.appendChild(styleEl);\n\n // Add class to hide content\n document.documentElement.classList.add(className);\n\n // Shared removal logic (idempotent \u2014 safe to call multiple times)\n let removed = false;\n const remove = () => {\n if (removed) return;\n removed = true;\n clearTimeout(timeoutId);\n document.documentElement.classList.remove(className);\n styleEl.remove();\n if (waitForHostReady && hostReadyHandler) {\n document.removeEventListener(waitForHostReady, hostReadyHandler);\n }\n };\n\n // Listen for host-ready custom event if configured\n let hostReadyHandler: (() => void) | undefined;\n if (waitForHostReady) {\n hostReadyHandler = () => remove();\n document.addEventListener(waitForHostReady, hostReadyHandler);\n }\n\n // Set timeout to remove class (failsafe)\n const timeoutId = setTimeout(() => {\n remove();\n }, timeout);\n\n // Return function to remove anti-flicker\n return () => {\n remove();\n };\n}\n\n// For inline script usage\nexport function getAntiFlickerSnippet(config: AntiFlickerConfig = {}): string {\n const { className, style } = { ...DEFAULT_CONFIG, ...config };\n return `\n(function() {\n var s = document.createElement('style');\n s.textContent = '.${className} { ${style} }';\n document.head.appendChild(s);\n document.documentElement.className += ' ${className}';\n})();`;\n}\n", "/**\n * SDK package version.\n *\n * This file is auto-generated at release time by `scripts/prepare-release.mjs`.\n * The sentinel value below is overwritten with the real semver version\n * during the semantic-release prepare phase.\n *\n * DO NOT import version from package.json \u2014 this constant is the single\n * source of truth for the runtime bundle.\n *\n * @since 2.0.0\n */\nexport const SDK_VERSION = '2.4.1';\n", "// =============================================================================\n// SDK VERSION CONSTANTS\n// =============================================================================\n\n// Re-export SDK_VERSION from the auto-generated version file\n// =============================================================================\n// CANVAS CONFIG RESPONSE\n// =============================================================================\n\nimport type { z } from 'zod';\nimport type { ActionStep } from './actions/types';\nimport type {\n CanvasConfigResponseZ,\n CanvasThemeConfigZ,\n LauncherConfigZ,\n TileZ,\n} from './config/schema';\nimport type { ActivationConfig } from './decisions/types';\n\nexport { SDK_VERSION } from './version';\n\n/**\n * SDK schema version in Major.Minor format (e.g., \"2.0\", \"2.1\").\n * Used for compatibility checking between SDK and backend configs.\n * Sent in X-SDK-Schema-Version header.\n *\n * Bump rules:\n * - Major: Breaking changes (field removal, type changes)\n * - Minor: Backwards-compatible additions (new optional fields)\n *\n * @since 2.0.0\n */\nexport const SDK_SCHEMA_VERSION = '2.0';\n\n// =============================================================================\n// RE-EXPORT ACTION TYPES\n// =============================================================================\n\n// Re-export ActionStep from actions module for convenience\nexport type { ActionStep } from './actions/types';\n\n// =============================================================================\n// BLOCK TYPE DEFINITIONS\n// =============================================================================\n\n/**\n * All available block types organized by category\n */\nexport type NotificationBlockType = 'alert' | 'success' | 'warning' | 'info' | 'error';\nexport type MediaBlockType = 'video' | 'gallery' | 'code';\nexport type InteractiveBlockType = 'form' | 'rating' | 'progress' | 'survey' | 'checklist';\nexport type DataBlockType = 'stats' | 'comparison' | 'chart' | 'table';\nexport type LegacyBlockType = 'text' | 'metric' | 'chatbot' | 'embed';\n\n/**\n * Union of all block types\n */\nexport type BlockType =\n | NotificationBlockType\n | MediaBlockType\n | InteractiveBlockType\n | DataBlockType\n | LegacyBlockType\n | 'custom';\n\n// =============================================================================\n// NOTIFICATION BLOCK CONTENT\n// =============================================================================\n\nexport interface NotificationContentBase {\n title: string;\n body?: string;\n dismissible?: boolean;\n icon?: string;\n timestamp?: string;\n}\n\nexport interface AlertContent extends NotificationContentBase {\n type: 'alert';\n severity?: 'low' | 'medium' | 'high' | 'critical';\n}\n\nexport interface SuccessContent extends NotificationContentBase {\n type: 'success';\n confetti?: boolean;\n}\n\nexport interface WarningContent extends NotificationContentBase {\n type: 'warning';\n countdown?: number; // seconds until action required\n}\n\nexport interface InfoContent extends NotificationContentBase {\n type: 'info';\n learnMoreUrl?: string;\n}\n\nexport interface ErrorContent extends NotificationContentBase {\n type: 'error';\n errorCode?: string;\n retryable?: boolean;\n}\n\nexport type NotificationContent =\n | AlertContent\n | SuccessContent\n | WarningContent\n | InfoContent\n | ErrorContent;\n\n// =============================================================================\n// MEDIA BLOCK CONTENT\n// =============================================================================\n\nexport interface VideoContent {\n type: 'video';\n src: string;\n provider?: 'youtube' | 'vimeo' | 'custom';\n poster?: string;\n autoplay?: boolean;\n muted?: boolean;\n loop?: boolean;\n aspectRatio?: '16:9' | '4:3' | '1:1' | '9:16';\n}\n\nexport interface GalleryContent {\n type: 'gallery';\n images: Array<{\n src: string;\n alt?: string;\n caption?: string;\n }>;\n layout?: 'carousel' | 'grid' | 'masonry';\n columns?: 2 | 3 | 4;\n}\n\nexport interface CodeContent {\n type: 'code';\n code: string;\n language?: string;\n lineNumbers?: boolean;\n highlightLines?: number[];\n copyable?: boolean;\n filename?: string;\n}\n\nexport type MediaContent = VideoContent | GalleryContent | CodeContent;\n\n// =============================================================================\n// INTERACTIVE BLOCK CONTENT\n// =============================================================================\n\nexport interface FormField {\n id: string;\n type: 'text' | 'email' | 'select' | 'checkbox' | 'radio' | 'textarea';\n label: string;\n placeholder?: string;\n required?: boolean;\n options?: Array<{ value: string; label: string }>;\n defaultValue?: string | boolean;\n}\n\nexport interface FormContent {\n type: 'form';\n fields: FormField[];\n submitLabel?: string;\n submitActionId?: string;\n}\n\nexport interface RatingContent {\n type: 'rating';\n variant: 'stars' | 'thumbs' | 'nps' | 'emoji';\n question?: string;\n maxValue?: number; // for stars (default 5), nps (default 10)\n submitActionId?: string;\n}\n\nexport interface ProgressContent {\n type: 'progress';\n variant: 'bar' | 'steps' | 'circular';\n value: number; // 0-100 for bar/circular, current step for steps\n max?: number; // total steps for steps variant\n steps?: Array<{ label: string; completed?: boolean }>;\n showPercentage?: boolean;\n}\n\nexport interface SurveyChoice {\n id: string;\n label: string;\n icon?: string;\n}\n\nexport interface SurveyContent {\n type: 'survey';\n question: string;\n choices: SurveyChoice[];\n multiSelect?: boolean;\n showResults?: boolean;\n results?: Record<string, number>; // choice id -> vote count\n submitActionId?: string;\n}\n\nexport interface ChecklistItem {\n id: string;\n title: string;\n description?: string;\n href?: string;\n linkLabel?: string;\n completed?: boolean;\n}\n\nexport interface ChecklistContent {\n type: 'checklist';\n items: ChecklistItem[];\n title?: string;\n showProgress?: boolean;\n}\n\nexport type InteractiveContent =\n | FormContent\n | RatingContent\n | ProgressContent\n | SurveyContent\n | ChecklistContent;\n\n// =============================================================================\n// DATA BLOCK CONTENT\n// =============================================================================\n\nexport interface TrendIndicator {\n direction: 'up' | 'down' | 'neutral';\n value: string; // e.g., \"+12%\", \"-5\"\n timeframe?: string; // e.g., \"vs last week\"\n}\n\nexport interface StatsContent {\n type: 'stats';\n value: string;\n label: string;\n trend?: TrendIndicator;\n sparkline?: number[]; // array of values for mini chart\n prefix?: string; // e.g., \"$\"\n suffix?: string; // e.g., \"users\"\n}\n\nexport interface ComparisonItem {\n label: string;\n value: string | number;\n highlight?: boolean;\n icon?: string;\n}\n\nexport interface ComparisonContent {\n type: 'comparison';\n items: ComparisonItem[];\n layout?: 'grid' | 'list' | 'table';\n columns?: 2 | 3 | 4;\n highlightBest?: boolean;\n}\n\nexport interface ChartContent {\n type: 'chart';\n chartType: 'bar' | 'line' | 'pie' | 'donut';\n data: Array<{ label: string; value: number; color?: string }>;\n showLegend?: boolean;\n showLabels?: boolean;\n animated?: boolean;\n}\n\nexport interface TableColumn {\n key: string;\n label: string;\n sortable?: boolean;\n width?: string;\n}\n\nexport interface TableContent {\n type: 'table';\n columns: TableColumn[];\n rows: Array<Record<string, string | number>>;\n sortable?: boolean;\n scrollable?: boolean;\n maxHeight?: string;\n}\n\nexport type DataContent = StatsContent | ComparisonContent | ChartContent | TableContent;\n\n// =============================================================================\n// CANVAS ORCHESTRATION CONFIG \u2014 inferred from Zod schemas (single source of truth)\n// =============================================================================\n\nexport type { ActivationConfig, DecisionStrategy, RouteFilter } from './decisions/types';\n\n/**\n * Full tile configuration. Inferred from TileZ in config/schema.ts.\n * The `activation` field is overridden with the generic-typed ActivationConfig\n * from decisions/types.ts since Zod can't express TypeScript generics.\n */\nexport type TileConfig = Omit<z.infer<typeof TileZ>, 'activation'> & {\n activation?: ActivationConfig;\n};\n\n/** Theme configuration. Inferred from CanvasThemeConfigZ in config/schema.ts. */\nexport type CanvasThemeConfig = z.infer<typeof CanvasThemeConfigZ>;\n\n/** Launcher button configuration. Inferred from LauncherConfigZ in config/schema.ts. */\nexport type LauncherConfig = z.infer<typeof LauncherConfigZ>;\n\n/**\n * Canvas configuration response.\n * Inferred from CanvasConfigResponseZ, with actions narrowed to ActionStep[].\n * (Zod uses z.any() for actions since the union is resolved at schema generation time.)\n */\nexport type CanvasConfigResponse = Omit<\n z.infer<typeof CanvasConfigResponseZ>,\n 'actions' | 'tiles'\n> & {\n tiles: TileConfig[];\n actions: ActionStep[];\n};\n\nexport type CanvasConfigFetcher = () => Promise<CanvasConfigResponse>;\n", "import type { ExperimentClient } from '../experiments/types';\nimport type { CanvasConfigResponse } from '../types';\n\n/**\n * Partial config as returned by a single variant feature flag.\n * Variant flags may only contain a subset of CanvasConfigResponse fields.\n */\nexport type VariantFlagValue = Partial<CanvasConfigResponse> & {\n overlays?: unknown[];\n};\n\n/**\n * Strategy for resolving multiple active variant configs into one.\n *\n * Currently: \"first-match\" \u2014 returns the first non-empty variant config.\n * Future: \"merge\" \u2014 concatenate tiles/actions/overlays from all variants.\n */\nexport type MergeStrategy = 'first-match';\n\n/**\n * Resolve multiple variant feature flags into a single CanvasConfigResponse.\n *\n * Evaluates each flag key against the experiment client and applies the\n * configured strategy. Currently uses \"first-match\": the first flag that\n * returns a non-empty config wins.\n *\n * @param client - Experiment client to evaluate feature flags\n * @param keys - Ordered list of variant flag keys to evaluate\n * @param _strategy - Resolution strategy (reserved for future use)\n * @returns Resolved config, or null if no flags are active\n */\nexport function resolveVariantConfigs(\n client: ExperimentClient,\n keys: string[],\n _strategy: MergeStrategy = 'first-match'\n): CanvasConfigResponse | null {\n for (const key of keys) {\n const value = client.getFeatureValue?.(key, null);\n if (!value || typeof value !== 'object') continue;\n\n const variant = value as VariantFlagValue;\n const hasTiles = variant.tiles && variant.tiles.length > 0;\n const hasActions = variant.actions && variant.actions.length > 0;\n\n if (hasTiles || hasActions) {\n return {\n tiles: variant.tiles ?? [],\n actions: variant.actions ?? [],\n fetchedAt: variant.fetchedAt ?? new Date().toISOString(),\n ...(variant.schemaVersion && { schemaVersion: variant.schemaVersion }),\n ...(variant.configVersion && { configVersion: variant.configVersion }),\n ...(variant.canvasTitle && { canvasTitle: variant.canvasTitle }),\n ...(variant.theme && { theme: variant.theme }),\n ...(variant.launcher && { launcher: variant.launcher }),\n };\n }\n }\n\n return null;\n}\n", "/**\n * Debug logger for Syntro SDK.\n *\n * Debug mode is enabled by:\n * 1. URL param: ?syntro_debug=true (highest priority)\n * 2. Token field: d: true\n * 3. Default: false\n */\n\nlet debugEnabled = false;\n\n/**\n * Check if debug mode is enabled via URL param.\n */\nfunction checkUrlParam(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const params = new URLSearchParams(window.location.search);\n return params.get('syntro_debug') === 'true';\n } catch {\n return false;\n }\n}\n\n/**\n * Initialize the logger with token debug flag.\n * URL param always overrides token setting.\n */\nexport function initLogger(tokenDebug?: boolean): void {\n // URL param takes priority\n if (checkUrlParam()) {\n debugEnabled = true;\n return;\n }\n // Otherwise use token setting (default false)\n debugEnabled = tokenDebug ?? false;\n}\n\n/**\n * Check if debug mode is currently enabled.\n */\nexport function isDebugEnabled(): boolean {\n // Always check URL param first (allows runtime override)\n if (checkUrlParam()) return true;\n return debugEnabled;\n}\n\n/**\n * Log a debug message (only if debug mode enabled).\n */\nexport function debug(prefix: string, message: string, data?: any): void {\n if (!isDebugEnabled()) return;\n if (data !== undefined) {\n console.log(`[${prefix}]`, message, data);\n } else {\n console.log(`[${prefix}]`, message);\n }\n}\n\n/**\n * Log a warning (always shown).\n */\nexport function warn(prefix: string, message: string, data?: any): void {\n if (data !== undefined) {\n console.warn(`[${prefix}]`, message, data);\n } else {\n console.warn(`[${prefix}]`, message);\n }\n}\n\n/**\n * Log an error (always shown).\n */\nexport function error(prefix: string, message: string, data?: any): void {\n if (data !== undefined) {\n console.error(`[${prefix}]`, message, data);\n } else {\n console.error(`[${prefix}]`, message);\n }\n}\n", "import type { ExperimentClient } from './experiments/types';\nimport { resolveVariantConfigs } from './fetchers/mergeConfigs';\nimport { debug } from './logger';\nimport type { CanvasConfigFetcher, CanvasConfigResponse } from './types';\nimport { SDK_SCHEMA_VERSION } from './types';\nimport { SDK_VERSION } from './version';\n\n/**\n * Allowed hosts for fetching config.\n * Only config from these hosts will be fetched.\n */\nconst ALLOWED_CONFIG_HOSTS = [\n 'api.syntrologie.com',\n 'cdn.syntrologie.com',\n 'localhost',\n '127.0.0.1',\n];\n\n/**\n * Validates that a config URI is from an allowed host.\n * Requires HTTPS for non-localhost URLs.\n */\nfunction validateConfigUri(uri: string): boolean {\n try {\n const parsed = new URL(uri);\n const isLocalhost = /^(localhost|127\\.0\\.0\\.1)$/.test(parsed.hostname);\n\n // Require HTTPS for non-localhost\n if (parsed.protocol !== 'https:' && !isLocalhost) {\n console.warn('[SmartCanvas] Config URI must use HTTPS:', uri);\n return false;\n }\n\n // Check against allowlist\n const isAllowed = ALLOWED_CONFIG_HOSTS.some((host) => parsed.hostname === host);\n if (!isAllowed) {\n console.warn('[SmartCanvas] Config URI host not in allowlist:', parsed.hostname);\n return false;\n }\n\n return true;\n } catch {\n console.warn('[SmartCanvas] Invalid config URI:', uri);\n return false;\n }\n}\n\n/**\n * Checks if a URI is same-origin with the current page.\n */\nfunction isSameOrigin(uri: string): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const parsed = new URL(uri);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n}\n\nexport interface CanvasFetcherOptions {\n configUri?: string;\n experiments?: ExperimentClient;\n featureKey?: string;\n credentials?: RequestCredentials;\n // New: support for config feature key (direct config instead of URI)\n configFeatureKey?: string;\n /** Manifest feature key for multi-flag mode */\n manifestKey?: string;\n /** Prefix for variant flag discovery */\n variantFlagPrefix?: string;\n /** SDK version for offline config caching. When set, enables localStorage caching. */\n sdkVersion?: string;\n}\n\n// =============================================================================\n// OFFLINE CONFIG CACHING\n// =============================================================================\n\nconst CONFIG_CACHE_KEY = 'syntro_config_cache';\nconst CACHE_MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface CachedConfig {\n config: CanvasConfigResponse;\n timestamp: number;\n sdkVersion: string;\n}\n\n/**\n * Returns true if localStorage is available (false in SSR or restricted contexts).\n */\nfunction hasLocalStorage(): boolean {\n try {\n return typeof localStorage !== 'undefined' && localStorage !== null;\n } catch {\n return false;\n }\n}\n\n/**\n * Writes a config to localStorage for offline fallback.\n */\nfunction cacheConfig(config: CanvasConfigResponse, sdkVersion: string): void {\n if (!hasLocalStorage()) return;\n try {\n const entry: CachedConfig = {\n config,\n timestamp: Date.now(),\n sdkVersion,\n };\n localStorage.setItem(CONFIG_CACHE_KEY, JSON.stringify(entry));\n } catch {\n // Silently fail \u2014 quota exceeded or other storage errors should not break the SDK\n }\n}\n\n/**\n * Reads a cached config from localStorage, validating age and SDK version.\n * Returns null if cache is missing, stale, corrupt, or version-mismatched.\n */\nfunction getCachedConfig(sdkVersion: string): CanvasConfigResponse | null {\n if (!hasLocalStorage()) return null;\n try {\n const raw = localStorage.getItem(CONFIG_CACHE_KEY);\n if (!raw) return null;\n\n const entry: CachedConfig = JSON.parse(raw);\n\n // Validate required fields\n if (!entry.config || typeof entry.timestamp !== 'number' || !entry.sdkVersion) {\n return null;\n }\n\n // Validate SDK version match\n if (entry.sdkVersion !== sdkVersion) return null;\n\n // Validate cache age (must be less than 24 hours old)\n const age = Date.now() - entry.timestamp;\n if (age > CACHE_MAX_AGE_MS) return null;\n\n return entry.config;\n } catch {\n // Corrupt JSON or other errors \u2014 treat as cache miss\n return null;\n }\n}\n\nexport const resolveConfigUri = ({\n configUri,\n experiments,\n featureKey = 'smart-canvas-config-uri',\n}: {\n configUri?: string;\n experiments?: ExperimentClient;\n featureKey?: string;\n}) => {\n if (configUri) return configUri;\n const fromFeature = experiments?.getFeatureValue?.(featureKey, null);\n if (fromFeature) return fromFeature;\n return undefined;\n};\n\n/**\n * Get variant flag keys from manifest or prefix discovery.\n */\nfunction getVariantFlagKeys(\n experiments: ExperimentClient,\n manifestKey?: string,\n variantFlagPrefix?: string\n): string[] {\n if (manifestKey) {\n const manifest = experiments.getFeatureValue?.(manifestKey, null);\n if (manifest && typeof manifest === 'object') {\n const keys = (manifest as { variant_flags?: string[] }).variant_flags;\n if (keys && keys.length > 0) return keys;\n }\n }\n if (variantFlagPrefix && experiments.getAllFeatures) {\n const all = experiments.getAllFeatures();\n return Object.keys(all).filter((k) => k.startsWith(variantFlagPrefix));\n }\n return [];\n}\n\nexport const createCanvasConfigFetcher =\n ({\n configUri,\n experiments,\n featureKey,\n credentials,\n configFeatureKey = 'smart-canvas-config',\n manifestKey,\n variantFlagPrefix,\n sdkVersion,\n }: CanvasFetcherOptions): CanvasConfigFetcher =>\n async () => {\n // First check if we have a direct config object from experiment platform\n if (experiments && configFeatureKey) {\n const directConfig = experiments.getFeatureValue?.(configFeatureKey, null);\n if (directConfig && typeof directConfig === 'object') {\n debug('SmartCanvas Config', 'Resolved config directly from feature flag', directConfig);\n return directConfig as CanvasConfigResponse;\n }\n }\n\n // Try multi-flag mode: manifest or prefix-based discovery\n if (experiments && (manifestKey || variantFlagPrefix)) {\n const variantKeys = getVariantFlagKeys(experiments, manifestKey, variantFlagPrefix);\n if (variantKeys.length > 0) {\n const resolved = resolveVariantConfigs(experiments, variantKeys);\n if (resolved) {\n debug('SmartCanvas Config', 'Resolved config from variant flags', resolved);\n return resolved;\n }\n }\n }\n\n // Fall back to URI-based fetching\n const uri = resolveConfigUri({ configUri, experiments, featureKey });\n if (!uri) {\n debug('SmartCanvas Config', 'No config available \u2014 returning empty config');\n return { tiles: [], actions: [], fetchedAt: new Date().toISOString() };\n }\n\n // Security: Validate URI against allowlist\n if (!validateConfigUri(uri)) {\n throw new Error(`SmartCanvas: config URI not allowed: ${uri}`);\n }\n\n // Security: Only send credentials to same-origin requests\n // This prevents leaking cookies to third-party servers\n const effectiveCredentials = credentials ?? (isSameOrigin(uri) ? 'include' : 'omit');\n\n try {\n const response = await fetch(uri, {\n credentials: effectiveCredentials,\n headers: {\n 'X-SDK-Version': SDK_VERSION,\n 'X-SDK-Schema-Version': SDK_SCHEMA_VERSION,\n },\n });\n if (!response.ok) {\n throw new Error(`SmartCanvas: failed to fetch config (${response.status})`);\n }\n const config = await response.json();\n debug('SmartCanvas Config', 'Fetched config from URI', config);\n\n // Cache on success when sdkVersion is provided\n if (sdkVersion) {\n cacheConfig(config, sdkVersion);\n }\n\n return config;\n } catch (error) {\n // On fetch failure, try to serve from cache if sdkVersion is provided\n if (sdkVersion) {\n const cached = getCachedConfig(sdkVersion);\n if (cached) {\n debug('SmartCanvas Config', 'Serving config from offline cache');\n return cached;\n }\n }\n // No valid cache \u2014 re-throw the original error\n throw error;\n }\n };\n", "/**\n * Register accumulator predicates from tile configs at config-load time.\n *\n * Previously, predicate registration lived inside FAQWidget's useEffect \u2014\n * meaning predicates were only active when the widget was mounted (canvas open).\n * On multi-page apps with `defaultOpen: false`, the canvas stays closed after\n * navigation, the widget never mounts, and clicks go uncounted.\n *\n * This module extracts that logic so predicates are registered as soon as the\n * config is loaded, regardless of canvas state.\n */\n\nimport type { TileConfig } from '../types';\nimport type { EventAccumulator } from './EventAccumulator';\nimport type { NormalizedEvent } from './types';\n\n/**\n * Shape of a tile's scope config (lives inside tile.props.scope).\n */\ninterface ScopeConfig {\n events: string[];\n urlContains?: string;\n props?: Record<string, unknown>;\n}\n\n/**\n * Shape of a showWhen action config (lives inside tile.props.actions[].showWhen).\n */\ninterface ShowWhenConfig {\n type: 'rules';\n rules: Array<{\n conditions: Array<{ type: string; key?: string; [k: string]: unknown }>;\n value: boolean;\n }>;\n default: boolean;\n}\n\ninterface ActionConfig {\n kind: string;\n showWhen?: ShowWhenConfig;\n}\n\n/**\n * Scan tile configs for scope + showWhen event_count conditions and register\n * accumulator predicates. Safe to call multiple times \u2014 accumulator.register()\n * is idempotent (skips if key already registered).\n */\nexport function registerConfigPredicates(tiles: TileConfig[], accumulator: EventAccumulator): void {\n for (const tile of tiles) {\n const props = tile.props;\n if (!props) continue;\n\n const scope = props.scope as ScopeConfig | undefined;\n if (!scope?.events) continue;\n\n const actions = props.actions as ActionConfig[] | undefined;\n if (!actions) continue;\n\n // Extract event_count keys from showWhen conditions\n const keys = new Set<string>();\n for (const action of actions) {\n if (action.showWhen?.type === 'rules') {\n for (const rule of action.showWhen.rules) {\n for (const cond of rule.conditions) {\n if (cond.type === 'event_count' && cond.key) {\n keys.add(cond.key);\n }\n }\n }\n }\n }\n\n if (keys.size === 0) continue;\n\n // Build predicate from scope filters\n const { events: eventNames, urlContains, props: propFilters } = scope;\n\n for (const key of keys) {\n accumulator.register(key, (event: NormalizedEvent) => {\n if (!eventNames.includes(event.name)) return false;\n if (urlContains) {\n const pathname = String(event.props?.pathname ?? '');\n if (!pathname.includes(urlContains)) return false;\n }\n if (propFilters) {\n for (const [k, v] of Object.entries(propFilters)) {\n if (event.props?.[k] !== v) return false;\n }\n }\n return true;\n });\n }\n }\n}\n", "export interface SmartCanvasState {\n open: boolean;\n}\n\nexport type SmartCanvasListener = (state: SmartCanvasState) => void;\n\nexport class SmartCanvasController {\n private state: SmartCanvasState;\n private listeners = new Set<SmartCanvasListener>();\n\n constructor(initial?: Partial<SmartCanvasState>) {\n this.state = {\n open: initial?.open ?? false,\n };\n }\n\n getState(): SmartCanvasState {\n return this.state;\n }\n\n subscribe(listener: SmartCanvasListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n setOpen(open: boolean) {\n if (this.state.open === open) return;\n this.state = { ...this.state, open };\n this.emit();\n }\n\n toggle() {\n this.setOpen(!this.state.open);\n }\n\n private emit() {\n for (const listener of this.listeners) {\n listener(this.state);\n }\n }\n}\n\nexport const createSmartCanvasController = (initial?: Partial<SmartCanvasState>) =>\n new SmartCanvasController(initial);\n", "import { createContext, type ReactNode, useContext } from 'react';\n\ninterface ShadowRootContextValue {\n shadowRoot: ShadowRoot;\n portalRoot: HTMLElement;\n overlayContainer: HTMLElement;\n}\n\nconst ShadowRootContext = createContext<ShadowRootContextValue | null>(null);\n\nexport interface ShadowRootProviderProps {\n shadowRoot: ShadowRoot;\n portalRoot: HTMLElement;\n overlayContainer: HTMLElement;\n children: ReactNode;\n}\n\nexport function ShadowRootProvider({\n shadowRoot,\n portalRoot,\n overlayContainer,\n children,\n}: ShadowRootProviderProps) {\n return (\n <ShadowRootContext.Provider value={{ shadowRoot, portalRoot, overlayContainer }}>\n {children}\n </ShadowRootContext.Provider>\n );\n}\n\n/**\n * Access the shadow root context. Always available \u2014 SmartCanvasElement\n * wraps the React tree in ShadowRootProvider, and tests use the helper.\n */\nexport function useShadowRoot(): ShadowRootContextValue {\n const ctx = useContext(ShadowRootContext);\n if (!ctx) {\n throw new Error('useShadowRoot() called outside ShadowRootProvider');\n }\n return ctx;\n}\n", "/**\n * Event Bus Types\n *\n * The EventBus provides a normalized event stream that unifies events from\n * PostHog autocapture, Canvas events, and derived behavioral signals.\n */\n\n/**\n * Event sources in the runtime.\n */\nexport type EventSource = 'posthog' | 'canvas' | 'derived';\n\n/**\n * Normalized event structure for the event bus.\n */\nexport interface NormalizedEvent {\n /** Event timestamp (milliseconds since epoch) */\n ts: number;\n /** Normalized event name (e.g., \"ui.click\", \"canvas.opened\") */\n name: string;\n /** Event source */\n source: EventSource;\n /** Event properties/payload */\n props?: Record<string, unknown>;\n /** Schema version for forward compatibility */\n schemaVersion: string;\n}\n\n/**\n * Event filter for subscriptions.\n */\nexport interface EventFilter {\n /** Filter by event names (exact match) */\n names?: string[];\n /** Filter by event name patterns (regex) */\n patterns?: string[];\n /** Filter by sources */\n sources?: EventSource[];\n}\n\n/**\n * Callback for event subscriptions.\n */\nexport type EventCallback = (event: NormalizedEvent) => void;\n\n/**\n * Unsubscribe function returned by subscribe().\n */\nexport type EventUnsubscribe = () => void;\n\n/**\n * Standard event names used by the runtime.\n */\nexport const StandardEvents = {\n // UI events (from PostHog autocapture)\n UI_CLICK: 'ui.click',\n UI_SCROLL: 'ui.scroll',\n UI_INPUT: 'ui.input',\n UI_CHANGE: 'ui.change',\n UI_SUBMIT: 'ui.submit',\n\n // Navigation events\n NAV_PAGE_VIEW: 'nav.page_view',\n NAV_PAGE_LEAVE: 'nav.page_leave',\n\n // Canvas events\n CANVAS_OPENED: 'canvas.opened',\n CANVAS_CLOSED: 'canvas.closed',\n TILE_VIEWED: 'tile.viewed',\n TILE_EXPANDED: 'tile.expanded',\n TILE_COLLAPSED: 'tile.collapsed',\n TILE_ACTION: 'tile.action',\n\n // Overlay/tour events\n OVERLAY_STARTED: 'overlay.started',\n OVERLAY_COMPLETED: 'overlay.completed',\n OVERLAY_DISMISSED: 'overlay.dismissed',\n OVERLAY_STEP_VIEWED: 'overlay.step_viewed',\n\n // Derived behavioral signals (Phase 3)\n BEHAVIOR_RAGE_CLICK: 'behavior.rage_click',\n BEHAVIOR_HESITATION: 'behavior.hesitation',\n BEHAVIOR_CONFUSION: 'behavior.confusion',\n\n // Action events\n ACTION_APPLIED: 'action.applied',\n ACTION_REVERTED: 'action.reverted',\n ACTION_FAILED: 'action.failed',\n ACTION_CTA_CLICKED: 'action.cta_clicked',\n\n // Notification events\n NOTIFICATION_SHOWN: 'notification.shown',\n NOTIFICATION_CLICKED: 'notification.clicked',\n NOTIFICATION_DISMISSED: 'notification.dismissed',\n NOTIFICATION_DEEP_LINK: 'notification.deep_link',\n\n // Surface events\n SURFACE_MOUNTED: 'surface.mounted',\n SURFACE_UNMOUNTED: 'surface.unmounted',\n} as const;\n\n/**\n * Current schema version for normalized events.\n */\nexport const EVENT_SCHEMA_VERSION = '1.0.0';\n", "/**\n * Canvas Event Normalizer\n *\n * Transforms Smart Canvas events into normalized events for the EventBus.\n */\nimport type { CanvasSurface } from '../../telemetry/types';\nimport type { EventSource, NormalizedEvent } from '../types';\nimport { EVENT_SCHEMA_VERSION, StandardEvents } from '../types';\n\n/**\n * Create a canvas event with standard metadata.\n */\nfunction createCanvasEvent(name: string, props?: Record<string, unknown>): NormalizedEvent {\n return {\n ts: Date.now(),\n name,\n source: 'canvas' as EventSource,\n props,\n schemaVersion: EVENT_SCHEMA_VERSION,\n };\n}\n\n/**\n * Canvas opened event.\n */\nexport function canvasOpened(surface: CanvasSurface): NormalizedEvent {\n return createCanvasEvent(StandardEvents.CANVAS_OPENED, { surface });\n}\n\n/**\n * Canvas closed event.\n */\nexport function canvasClosed(surface: CanvasSurface): NormalizedEvent {\n return createCanvasEvent(StandardEvents.CANVAS_CLOSED, { surface });\n}\n\n/**\n * Tile viewed event.\n */\nexport function tileViewed(tileId: string, surface: CanvasSurface): NormalizedEvent {\n return createCanvasEvent(StandardEvents.TILE_VIEWED, { tileId, surface });\n}\n\n/**\n * Tile expanded event.\n */\nexport function tileExpanded(tileId: string, surface: CanvasSurface): NormalizedEvent {\n return createCanvasEvent(StandardEvents.TILE_EXPANDED, { tileId, surface });\n}\n\n/**\n * Tile collapsed event.\n */\nexport function tileCollapsed(tileId: string, surface: CanvasSurface): NormalizedEvent {\n return createCanvasEvent(StandardEvents.TILE_COLLAPSED, { tileId, surface });\n}\n\n/**\n * Tile action event.\n */\nexport function tileAction(\n tileId: string,\n actionId: string,\n surface: CanvasSurface\n): NormalizedEvent {\n return createCanvasEvent(StandardEvents.TILE_ACTION, {\n tileId,\n actionId,\n surface,\n });\n}\n\n/**\n * Overlay/tour started event.\n */\nexport function overlayStarted(recipeId: string, recipeName?: string): NormalizedEvent {\n return createCanvasEvent(StandardEvents.OVERLAY_STARTED, {\n recipeId,\n recipeName,\n });\n}\n\n/**\n * Overlay/tour completed event.\n */\nexport function overlayCompleted(recipeId: string, recipeName?: string): NormalizedEvent {\n return createCanvasEvent(StandardEvents.OVERLAY_COMPLETED, {\n recipeId,\n recipeName,\n });\n}\n\n/**\n * Overlay/tour dismissed event.\n */\nexport function overlayDismissed(\n recipeId: string,\n recipeName?: string,\n stepIndex?: number\n): NormalizedEvent {\n return createCanvasEvent(StandardEvents.OVERLAY_DISMISSED, {\n recipeId,\n recipeName,\n stepIndex,\n });\n}\n\n/**\n * Overlay step viewed event.\n */\nexport function overlayStepViewed(\n recipeId: string,\n stepIndex: number,\n stepTitle?: string\n): NormalizedEvent {\n return createCanvasEvent(StandardEvents.OVERLAY_STEP_VIEWED, {\n recipeId,\n stepIndex,\n stepTitle,\n });\n}\n\n/**\n * Create a custom canvas event.\n */\nexport function customCanvasEvent(name: string, props?: Record<string, unknown>): NormalizedEvent {\n // Prefix custom events with \"canvas.\" if not already prefixed\n const eventName = name.startsWith('canvas.') ? name : `canvas.${name}`;\n return createCanvasEvent(eventName, props);\n}\n\n/**\n * Canvas event factory for easy event creation.\n */\nexport const CanvasEvents = {\n canvasOpened,\n canvasClosed,\n tileViewed,\n tileExpanded,\n tileCollapsed,\n tileAction,\n overlayStarted,\n overlayCompleted,\n overlayDismissed,\n overlayStepViewed,\n custom: customCanvasEvent,\n};\n", "import {\n blue,\n border,\n brand,\n green,\n red,\n slateGrey,\n text,\n yellow,\n} from '@syntro/design-system/tokens';\n\nimport type { CanvasThemeTokens } from './types';\n\n/**\n * Apply alpha transparency to a hex color.\n * Converts a 0-1 alpha value to a 2-digit hex suffix.\n */\nexport function withAlpha(hex: string, alpha: number): string {\n return `${hex}${Math.round(alpha * 255)\n .toString(16)\n .padStart(2, '0')}`;\n}\n\n/**\n * Default dark theme using Syntro Design System tokens\n */\nexport const darkTheme: CanvasThemeTokens = {\n // Brand colors\n colorPrimary: brand[3],\n colorPrimaryHover: brand[4],\n colorPrimaryMuted: brand[0],\n\n // Surface colors (with alpha for glass/vibrancy effects)\n colorBackground: withAlpha(slateGrey[1], 0.95),\n colorBackgroundElevated: withAlpha(slateGrey[3], 0.95),\n colorBackgroundSubtle: withAlpha(slateGrey[0], 0.2),\n colorSurface: withAlpha(slateGrey[4], 0.8),\n colorSurfaceHover: withAlpha(slateGrey[5], 0.8),\n\n // Text colors\n colorText: text.primary,\n colorTextSecondary: text.secondary,\n colorTextMuted: text.tertiary,\n colorTextInverse: slateGrey[1],\n\n // Border colors\n colorBorder: border.primary,\n colorBorderSubtle: border.secondary,\n\n // Semantic colors\n colorSuccess: green[4],\n colorSuccessMuted: green[0],\n colorWarning: yellow[4],\n colorWarningMuted: yellow[0],\n colorError: red[4],\n colorErrorMuted: red[0],\n colorInfo: blue[4],\n colorInfoMuted: blue[0],\n\n // Notification badge\n colorNotification: brand[4],\n colorNotificationMuted: withAlpha(brand[4], 0.4),\n\n // Glass morphism\n glassBackground: withAlpha(slateGrey[1], 0.6),\n glassBackgroundHover: withAlpha(slateGrey[1], 0.7),\n glassBorder: 'rgba(255, 255, 255, 0.08)',\n glassBlur: 'blur(24px)',\n glassSaturate: 'saturate(1.2)',\n\n // Typography (SF Pro stack)\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', Roboto, sans-serif\",\n fontFamilyMono: \"'SF Mono', 'Fira Code', Consolas, monospace\",\n fontSizeXs: '0.7rem',\n fontSizeSm: '0.8rem',\n fontSizeMd: '0.9rem',\n fontSizeLg: '1rem',\n fontSizeXl: '1.25rem',\n fontSizeXxl: '1.5rem',\n fontWeightNormal: '400',\n fontWeightMedium: '500',\n fontWeightSemibold: '600',\n fontWeightBold: '700',\n lineHeightTight: '1.25',\n lineHeightNormal: '1.5',\n lineHeightRelaxed: '1.75',\n\n // Spacing\n spacingXs: '0.25rem',\n spacingSm: '0.5rem',\n spacingMd: '0.75rem',\n spacingLg: '1rem',\n spacingXl: '1.5rem',\n\n // Border radius\n borderRadiusSm: '6px',\n borderRadiusMd: '10px',\n borderRadiusLg: '14px',\n borderRadiusXl: '20px',\n borderRadiusFull: '9999px',\n\n // Shadows\n shadowSm: '0 1px 2px rgba(0, 0, 0, 0.2)',\n shadowMd: '0 2px 12px rgba(0, 0, 0, 0.3)',\n shadowLg: '0 8px 24px rgba(0, 0, 0, 0.4)',\n shadowXl: '0 16px 48px rgba(0, 0, 0, 0.5)',\n\n // Backdrop effects\n backdropBlur: 'blur(20px)',\n backdropSaturate: 'saturate(180%)',\n\n // Animation\n transitionFast: '0.1s ease',\n transitionNormal: '0.25s ease',\n transitionSlow: '0.4s ease',\n};\n\n/**\n * Light theme variant using Syntro Design System tokens\n */\nexport const lightTheme: CanvasThemeTokens = {\n // Brand colors\n colorPrimary: brand[3],\n colorPrimaryHover: brand[2],\n colorPrimaryMuted: withAlpha(brand[5], 0.1),\n\n // Surface colors\n colorBackground: withAlpha(slateGrey[12], 0.95),\n colorBackgroundElevated: withAlpha(slateGrey[11], 0.95),\n colorBackgroundSubtle: withAlpha(slateGrey[0], 0.02),\n colorSurface: withAlpha(slateGrey[11], 0.6),\n colorSurfaceHover: withAlpha(slateGrey[10], 0.6),\n\n // Text colors\n colorText: slateGrey[1],\n colorTextSecondary: slateGrey[6],\n colorTextMuted: slateGrey[8],\n colorTextInverse: slateGrey[12],\n\n // Border colors\n colorBorder: withAlpha(slateGrey[0], 0.12),\n colorBorderSubtle: withAlpha(slateGrey[0], 0.06),\n\n // Semantic colors\n colorSuccess: green[4],\n colorSuccessMuted: withAlpha(green[4], 0.12),\n colorWarning: yellow[4],\n colorWarningMuted: withAlpha(yellow[4], 0.12),\n colorError: red[4],\n colorErrorMuted: withAlpha(red[4], 0.12),\n colorInfo: blue[4],\n colorInfoMuted: withAlpha(blue[4], 0.12),\n\n // Notification badge\n colorNotification: brand[3],\n colorNotificationMuted: withAlpha(brand[3], 0.4),\n\n // Glass morphism\n glassBackground: withAlpha(slateGrey[12], 0.7),\n glassBackgroundHover: withAlpha(slateGrey[12], 0.8),\n glassBorder: 'rgba(0, 0, 0, 0.06)',\n glassBlur: 'blur(24px)',\n glassSaturate: 'saturate(1.2)',\n\n // Typography (same as dark)\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', Roboto, sans-serif\",\n fontFamilyMono: \"'SF Mono', 'Fira Code', Consolas, monospace\",\n fontSizeXs: '0.7rem',\n fontSizeSm: '0.8rem',\n fontSizeMd: '0.9rem',\n fontSizeLg: '1rem',\n fontSizeXl: '1.25rem',\n fontSizeXxl: '1.5rem',\n fontWeightNormal: '400',\n fontWeightMedium: '500',\n fontWeightSemibold: '600',\n fontWeightBold: '700',\n lineHeightTight: '1.25',\n lineHeightNormal: '1.5',\n lineHeightRelaxed: '1.75',\n\n // Spacing (same as dark)\n spacingXs: '0.25rem',\n spacingSm: '0.5rem',\n spacingMd: '0.75rem',\n spacingLg: '1rem',\n spacingXl: '1.5rem',\n\n // Border radius (same as dark)\n borderRadiusSm: '6px',\n borderRadiusMd: '10px',\n borderRadiusLg: '14px',\n borderRadiusXl: '20px',\n borderRadiusFull: '9999px',\n\n // Shadows (lighter for light mode)\n shadowSm: '0 1px 2px rgba(0, 0, 0, 0.08)',\n shadowMd: '0 2px 12px rgba(0, 0, 0, 0.12)',\n shadowLg: '0 8px 24px rgba(0, 0, 0, 0.16)',\n shadowXl: '0 16px 48px rgba(0, 0, 0, 0.2)',\n\n // Backdrop effects\n backdropBlur: 'blur(20px)',\n backdropSaturate: 'saturate(180%)',\n\n // Animation\n transitionFast: '0.1s ease',\n transitionNormal: '0.25s ease',\n transitionSlow: '0.4s ease',\n};\n\n/**\n * Get default theme based on mode\n */\nexport function getDefaultTheme(mode: 'light' | 'dark' = 'dark'): CanvasThemeTokens {\n return mode === 'light' ? lightTheme : darkTheme;\n}\n\n/**\n * Convert theme tokens to CSS custom properties\n */\nexport function themeToCssVariables(theme: CanvasThemeTokens): Record<string, string> {\n const kebabCase = (str: string) => str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\n const variables: Record<string, string> = {};\n for (const [key, value] of Object.entries(theme)) {\n variables[`--sc-${kebabCase(key)}`] = value;\n }\n return variables;\n}\n", "import { createContext, type ReactNode, useContext, useEffect, useMemo, useState } from 'react';\n\nimport { darkTheme, lightTheme, themeToCssVariables } from './defaultTheme';\nimport { autoDetectTheme } from './extractHostTheme';\nimport type { CanvasThemeTokens, ThemeAppearance, ThemeMode } from './types';\n\ninterface ThemeContextValue {\n theme: CanvasThemeTokens;\n mode: ThemeMode;\n cssVariables: Record<string, string>;\n setMode: (mode: ThemeMode) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface ThemeProviderProps {\n children: ReactNode;\n appearance?: ThemeAppearance;\n autoDetect?: boolean;\n shadowRoot?: ShadowRoot | null;\n}\n\n/**\n * Detect system color scheme preference\n */\nfunction getSystemMode(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'dark';\n return window.matchMedia?.('(prefers-color-scheme: dark)')?.matches ? 'dark' : 'light';\n}\n\n/**\n * Theme provider component that injects CSS variables into shadow DOM\n */\nexport function ThemeProvider({\n children,\n appearance,\n autoDetect = true,\n shadowRoot,\n}: ThemeProviderProps) {\n const [mode, setMode] = useState<ThemeMode>(appearance?.mode ?? 'auto');\n const [systemMode, setSystemMode] = useState<'light' | 'dark'>(getSystemMode);\n\n // Listen for system color scheme changes\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = (e: MediaQueryListEvent) => {\n setSystemMode(e.matches ? 'dark' : 'light');\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, []);\n\n // Resolve effective mode\n const effectiveMode = mode === 'auto' ? systemMode : mode;\n\n // Build theme\n const theme = useMemo(() => {\n let baseTheme: CanvasThemeTokens;\n\n if (autoDetect) {\n // Auto-detect theme from host page\n baseTheme = autoDetectTheme(effectiveMode === 'light' ? lightTheme : darkTheme);\n } else {\n baseTheme = effectiveMode === 'light' ? lightTheme : darkTheme;\n }\n\n return baseTheme;\n }, [autoDetect, effectiveMode]);\n\n // Build CSS variables\n const cssVariables = useMemo(() => {\n const vars = themeToCssVariables(theme);\n\n // Apply user overrides from appearance.variables\n if (appearance?.variables) {\n for (const [key, value] of Object.entries(appearance.variables)) {\n if (value) {\n vars[key] = value;\n }\n }\n }\n\n return vars;\n }, [theme, appearance?.variables]);\n\n // Inject CSS variables into shadow root\n useEffect(() => {\n if (!shadowRoot) return;\n\n // Find or create the style element\n let styleEl = shadowRoot.querySelector<HTMLStyleElement>('#sc-theme-vars');\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = 'sc-theme-vars';\n shadowRoot.insertBefore(styleEl, shadowRoot.firstChild);\n }\n\n // Generate CSS\n const cssRules = Object.entries(cssVariables)\n .map(([key, value]) => ` ${key}: ${value};`)\n .join('\\n');\n\n styleEl.textContent = `:host {\\n${cssRules}\\n}`;\n }, [shadowRoot, cssVariables]);\n\n const value: ThemeContextValue = {\n theme,\n mode: effectiveMode,\n cssVariables,\n setMode,\n };\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\n/**\n * Hook to access theme context\n */\nexport function useTheme(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n}\n\n/**\n * Hook to get specific theme token with CSS variable fallback\n */\nexport function useThemeToken<K extends keyof CanvasThemeTokens>(token: K): string {\n const { theme } = useTheme();\n return theme[token];\n}\n\n/**\n * Hook to get CSS variable name for a token\n */\nexport function useThemeVar(token: keyof CanvasThemeTokens): string {\n const kebabCase = (str: string) => str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n return `var(--sc-${kebabCase(token)})`;\n}\n", "import { base, brand, slateGrey, text } from '@syntro/design-system/tokens';\n\nimport { useShadowRoot } from '../ShadowRootContext';\nimport { withAlpha } from '../theme';\n\nimport type { ActiveNotification } from './types';\n\nconst TOAST_STYLES_ID = 'syntro-toast-styles';\nconst TOAST_CSS = `\n @keyframes syntro-toast-slide-in {\n from { opacity: 0; transform: translateY(12px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes syntro-toast-progress {\n from { width: 100%; }\n to { width: 0%; }\n }\n .syntro-toast-enter {\n animation: syntro-toast-slide-in 200ms cubic-bezier(0.16, 1, 0.3, 1) forwards;\n }\n .syntro-toast-progress {\n animation: syntro-toast-progress linear forwards;\n }\n .syntro-toast-progress.paused {\n animation-play-state: paused;\n }\n`;\n\nfunction ensureToastStyles(target: ShadowRoot | DocumentOrShadowRoot) {\n if ((target as ParentNode).querySelector(`#${TOAST_STYLES_ID}`)) return;\n const style = document.createElement('style');\n style.id = TOAST_STYLES_ID;\n style.textContent = TOAST_CSS;\n (target as Node).appendChild(style);\n}\n\nexport interface NotificationToastStackProps {\n notifications: ActiveNotification[];\n onDismiss: (id: string) => void;\n onClickNotification: (notification: ActiveNotification) => void;\n position: 'left' | 'right';\n}\n\nexport function NotificationToastStack({\n notifications,\n onDismiss,\n onClickNotification,\n position,\n}: NotificationToastStackProps) {\n const { shadowRoot } = useShadowRoot();\n ensureToastStyles(shadowRoot);\n\n if (notifications.length === 0) return null;\n\n return (\n <div\n data-testid=\"notification-toast-stack\"\n style={{\n position: 'fixed',\n bottom: '6rem',\n [position === 'right' ? 'right' : 'left']: '2.5rem',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n zIndex: 2147483648,\n pointerEvents: 'auto',\n width: '280px',\n }}\n >\n {notifications.map((notif) => (\n // biome-ignore lint/a11y/noStaticElementInteractions: Hover effects for pause-on-hover UX; not interactive in the a11y sense\n <div\n key={notif.id}\n className=\"syntro-toast-enter\"\n style={{\n background: withAlpha(slateGrey[0], 0.95),\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n border: `1px solid ${slateGrey[5]}`,\n borderRadius: '12px',\n overflow: 'hidden',\n cursor: 'pointer',\n transition: 'transform 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'translateY(-1px)';\n const bar = e.currentTarget.querySelector('.syntro-toast-progress');\n if (bar) bar.classList.add('paused');\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n const bar = e.currentTarget.querySelector('.syntro-toast-progress');\n if (bar) bar.classList.remove('paused');\n }}\n >\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Notification click-to-open; dismiss button is the primary interactive element */}\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: Notification click-to-open; dismiss button is the primary interactive element */}\n <div\n onClick={() => onClickNotification(notif)}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '10px',\n padding: '10px 12px',\n }}\n >\n <div\n style={{\n width: '28px',\n height: '28px',\n borderRadius: '8px',\n background: withAlpha(brand[3], 0.15),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n fontSize: '14px',\n }}\n >\n {notif.icon ?? '\uD83D\uDD14'}\n </div>\n\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '13px',\n fontWeight: 600,\n color: text.primary,\n lineHeight: '1.3',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {notif.title}\n </div>\n {notif.body && (\n <div\n style={{\n fontSize: '12px',\n color: text.secondary,\n lineHeight: '1.3',\n marginTop: '2px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {notif.body}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onDismiss(notif.id);\n }}\n aria-label=\"Dismiss notification\"\n style={{\n background: 'none',\n border: 'none',\n color: text.tertiary,\n cursor: 'pointer',\n padding: '2px',\n fontSize: '14px',\n lineHeight: 1,\n flexShrink: 0,\n }}\n >\n \u00D7\n </button>\n </div>\n\n <div style={{ height: '2px', background: withAlpha(base.white, 0.06) }}>\n <div\n className=\"syntro-toast-progress\"\n style={{\n height: '100%',\n background: `linear-gradient(90deg, ${brand[3]}, ${brand[4]})`,\n animationDuration: `${notif.ttl}ms`,\n }}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n", "/**\n * Notification System Types\n *\n * Config-driven toast notifications that surface adaptive events\n * (FAQ triggers, nav suggestions) above the launcher button.\n */\n\n/**\n * A declarative rule on a TileConfig that maps an EventBus event\n * to a toast notification.\n */\nexport interface TileNotificationRule {\n /** EventBus event name to match (exact string or regex pattern) */\n on: string;\n /** Toast title \u2014 supports {{props.x}} template interpolation */\n title: string;\n /** Toast body text \u2014 supports {{props.x}} template interpolation */\n body?: string;\n /** Lucide icon name or emoji (falls back to tile icon if omitted) */\n icon?: string;\n /** Auto-dismiss duration in ms (default: 8000) */\n ttl?: number;\n /** Deep link target when user clicks the toast */\n deepLink?: NotificationDeepLink;\n /** Cooldown in ms before the same rule can fire again (default: 30000) */\n cooldown?: number;\n}\n\n/**\n * What happens when a user clicks a notification toast.\n */\nexport interface NotificationDeepLink {\n /** Tile ID to navigate to */\n tileId: string;\n /** Item-level target \u2014 supports {{props.x}} interpolation */\n itemId?: string;\n}\n\n/**\n * An active (visible) notification in the toast queue.\n */\nexport interface ActiveNotification {\n /** Unique ID for React key */\n id: string;\n /** Resolved title (templates already interpolated) */\n title: string;\n /** Resolved body (templates already interpolated) */\n body?: string;\n /** Icon name or emoji */\n icon?: string;\n /** Source tile ID (for dedup) */\n tileId: string;\n /** Resolved deep link item ID */\n itemId?: string;\n /** When this toast expires (Date.now() + ttl) */\n expiresAt: number;\n /** When this toast was created */\n createdAt: number;\n /** TTL for progress bar calculation */\n ttl: number;\n}\n\n/** Max number of visible toasts at once */\nexport const MAX_VISIBLE_TOASTS = 3;\n\n/** Default auto-dismiss duration in ms */\nexport const DEFAULT_TTL = 8000;\n\n/** Default cooldown between same rule firing in ms */\nexport const DEFAULT_COOLDOWN = 30000;\n", "import type { NormalizedEvent } from '../events/types';\nimport type { TileConfig } from '../types';\n\nimport type { ActiveNotification, TileNotificationRule } from './types';\nimport { DEFAULT_TTL } from './types';\n\n/**\n * Result of matching an event against tile notification rules.\n * Includes both the resolved notification and the original rule\n * so callers can access rule-level settings (e.g., cooldown).\n */\nexport interface MatchResult {\n notification: ActiveNotification;\n rule: TileNotificationRule;\n}\n\nlet notificationCounter = 0;\n\n/**\n * Replace {{props.x}} placeholders in a template string with values\n * from the event props. Leaves placeholders intact when the referenced\n * prop is missing or props is undefined.\n */\nexport function interpolateTemplate(\n template: string,\n props: Record<string, unknown> | undefined\n): string {\n return template.replace(/\\{\\{props\\.(\\w+)\\}\\}/g, (_match, key: string) => {\n if (!props || !(key in props)) return _match;\n return String(props[key]);\n });\n}\n\n/**\n * Check whether an event name matches a rule's `on` field.\n * Tries exact match first, then falls back to regex matching.\n */\nfunction matchesRule(eventName: string, ruleOn: string): boolean {\n if (eventName === ruleOn) return true;\n try {\n return new RegExp(ruleOn).test(eventName);\n } catch {\n return false;\n }\n}\n\n/**\n * Given a NormalizedEvent and a list of tile configs, find the first\n * matching notification rule and return a MatchResult containing\n * both the resolved ActiveNotification and the original rule.\n * Returns null when no rules match.\n */\nexport function matchEvent(event: NormalizedEvent, tiles: TileConfig[]): MatchResult | null {\n for (const tile of tiles) {\n const rules = tile.notifications;\n if (!rules || rules.length === 0) continue;\n\n for (const rule of rules) {\n if (!matchesRule(event.name, rule.on)) continue;\n\n const now = Date.now();\n const ttl = rule.ttl ?? DEFAULT_TTL;\n\n return {\n notification: {\n id: `notif-${++notificationCounter}-${now}`,\n title: interpolateTemplate(rule.title, event.props),\n body: rule.body ? interpolateTemplate(rule.body, event.props) : undefined,\n icon: rule.icon,\n tileId: tile.id,\n itemId: rule.deepLink?.itemId\n ? interpolateTemplate(rule.deepLink.itemId, event.props)\n : undefined,\n expiresAt: now + ttl,\n createdAt: now,\n ttl,\n },\n rule,\n };\n }\n }\n\n return null;\n}\n", "import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { EventBus } from '../events/EventBus';\nimport { StandardEvents } from '../events/types';\nimport type { TileConfig } from '../types';\n\nimport { matchEvent } from './matcher';\nimport type { ActiveNotification } from './types';\nimport { DEFAULT_COOLDOWN, MAX_VISIBLE_TOASTS } from './types';\n\nexport interface UseNotificationsReturn {\n notifications: ActiveNotification[];\n dismiss: (id: string) => void;\n}\n\n/**\n * React hook that subscribes to the EventBus, evaluates notification rules\n * from tile configs, and manages the active toast queue.\n *\n * Features:\n * - Max 3 visible toasts (FIFO eviction when exceeded)\n * - Deduplication by tileId + itemId\n * - Cooldown per rule (prevents rapid re-firing)\n * - Auto-dismiss after TTL\n * - Publishes NOTIFICATION_SHOWN / NOTIFICATION_DISMISSED telemetry events\n */\nexport function useNotifications(\n eventBus: EventBus | null,\n tiles: TileConfig[]\n): UseNotificationsReturn {\n const [notifications, setNotifications] = useState<ActiveNotification[]>([]);\n const cooldownMap = useRef<Map<string, number>>(new Map());\n const timerIds = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n const publishDismissed = useCallback(\n (notif: ActiveNotification) => {\n // biome-ignore lint: intentional field subset for telemetry event payload\n eventBus?.publish(StandardEvents.NOTIFICATION_DISMISSED, {\n notificationId: notif.id,\n tileId: notif.tileId,\n itemId: notif.itemId,\n });\n },\n [eventBus]\n );\n\n const scheduleDismiss = useCallback(\n (notif: ActiveNotification) => {\n const timerId = setTimeout(() => {\n setNotifications((prev) => prev.filter((n) => n.id !== notif.id));\n timerIds.current.delete(notif.id);\n publishDismissed(notif);\n }, notif.ttl);\n timerIds.current.set(notif.id, timerId);\n },\n [publishDismissed]\n );\n\n const dismiss = useCallback(\n (id: string) => {\n setNotifications((prev) => {\n const notif = prev.find((n) => n.id === id);\n if (notif) publishDismissed(notif);\n return prev.filter((n) => n.id !== id);\n });\n const timerId = timerIds.current.get(id);\n if (timerId) {\n clearTimeout(timerId);\n timerIds.current.delete(id);\n }\n },\n [publishDismissed]\n );\n\n useEffect(() => {\n if (!eventBus) return;\n\n const unsubscribe = eventBus.subscribe((event) => {\n const match = matchEvent(event, tiles);\n if (!match) return;\n\n const { notification: matched, rule: matchedRule } = match;\n\n // --- Cooldown check ---\n const cooldownKey = `${matched.tileId}:${event.name}`;\n const lastFired = cooldownMap.current.get(cooldownKey);\n const now = Date.now();\n const cooldown = matchedRule.cooldown ?? DEFAULT_COOLDOWN;\n\n if (lastFired !== undefined && now - lastFired < cooldown) return;\n cooldownMap.current.set(cooldownKey, now);\n\n // --- Dedup check + queue management ---\n setNotifications((prev) => {\n // Dedup: skip if a notification with the same tileId + itemId already exists\n if (matched.itemId) {\n const isDuplicate = prev.some(\n (n) => n.tileId === matched.tileId && n.itemId === matched.itemId\n );\n if (isDuplicate) return prev;\n }\n\n const next = [...prev, matched];\n\n // FIFO eviction: remove oldest when exceeding max visible\n if (next.length > MAX_VISIBLE_TOASTS) {\n const evicted = next.shift()!;\n const timerId = timerIds.current.get(evicted.id);\n if (timerId) {\n clearTimeout(timerId);\n timerIds.current.delete(evicted.id);\n }\n }\n\n return next;\n });\n\n // Publish shown event\n // biome-ignore lint: intentional field subset for telemetry event payload\n eventBus.publish(StandardEvents.NOTIFICATION_SHOWN, {\n notificationId: matched.id,\n tileId: matched.tileId,\n itemId: matched.itemId,\n title: matched.title,\n });\n\n scheduleDismiss(matched);\n });\n\n return () => {\n unsubscribe();\n for (const timerId of timerIds.current.values()) {\n clearTimeout(timerId);\n }\n timerIds.current.clear();\n };\n }, [eventBus, tiles, scheduleDismiss]);\n\n return { notifications, dismiss };\n}\n", "/**\n * useNotifyWatcher\n *\n * Runs in ShadowCanvasOverlay (always mounted). Collects NotifyWatcherEntry\n * registrations from each app's `runtime.notifyWatchers(props)` callback,\n * subscribes to EventBus, and publishes events when DecisionStrategy\n * conditions transition false \u2192 true.\n *\n * This lets adaptives fire notification events even when their widgets\n * aren't mounted (e.g., drawer is closed).\n */\n\nimport { useEffect, useRef } from 'react';\n\nimport type { AppRegistry } from '../apps/AppRegistry';\nimport type { NotifyWatcherEntry } from '../apps/types';\nimport type { SmartCanvasRuntime } from '../runtime';\nimport type { TileConfig } from '../types';\n\n/**\n * Collect NotifyWatcherEntry[] from all registered apps for the given tiles.\n */\nfunction collectEntries(tiles: TileConfig[], appRegistry: AppRegistry): NotifyWatcherEntry[] {\n const entries: NotifyWatcherEntry[] = [];\n\n for (const tile of tiles) {\n // Widget format: \"adaptive-faq:accordion\" \u2192 appId = \"adaptive-faq\"\n const appId = tile.widget.split(':')[0];\n const registration = appRegistry.get(appId);\n const watcherFn = registration?.manifest.runtime?.notifyWatchers;\n\n if (watcherFn) {\n entries.push(...watcherFn(tile.props ?? {}));\n }\n }\n\n return entries;\n}\n\nexport function useNotifyWatcher(\n runtime: SmartCanvasRuntime | null,\n tiles: TileConfig[],\n appRegistry: AppRegistry | undefined\n): void {\n const prevStateRef = useRef<Map<string, boolean>>(new Map());\n\n useEffect(() => {\n if (!runtime?.events || !appRegistry) return;\n\n const entries = collectEntries(tiles, appRegistry);\n if (entries.length === 0) return;\n\n // Persist \"already notified\" across MPA navigations (sessionStorage-backed)\n const notifiedStore = runtime.state.ns('notified');\n\n // Snapshot current state so we don't fire on conditions already true (SPA).\n // On MPA remount: if condition is already true and we haven't notified\n // this session, fire now (accumulator counts survive in sessionStorage\n // but the in-memory prevStateRef was lost on navigation).\n for (const entry of entries) {\n if (!prevStateRef.current.has(entry.id)) {\n const result = runtime.evaluateSync<boolean>(entry.strategy);\n prevStateRef.current.set(entry.id, result.value);\n\n // MPA fix: condition already true on mount, not yet notified this session\n if (result.value && !notifiedStore.has(entry.id)) {\n notifiedStore.set(entry.id, true);\n runtime.events.publish(entry.eventName, entry.eventProps);\n }\n }\n }\n\n const unsub = runtime.events.subscribe(() => {\n for (const entry of entries) {\n const result = runtime.evaluateSync<boolean>(entry.strategy);\n const wasVisible = prevStateRef.current.get(entry.id) ?? false;\n\n // Update state BEFORE publishing to prevent re-entrant loops.\n // EventBus.publish() synchronously notifies subscribers, so without\n // this guard the nested callback would see wasVisible=false again.\n prevStateRef.current.set(entry.id, result.value);\n\n if (!wasVisible && result.value) {\n notifiedStore.set(entry.id, true);\n runtime.events.publish(entry.eventName, entry.eventProps);\n } else if (wasVisible && !result.value) {\n notifiedStore.remove(entry.id);\n }\n }\n });\n\n return unsub;\n }, [runtime, tiles, appRegistry]);\n}\n", "/**\n * RuntimeProvider - React context for accessing the v2 Runtime.\n *\n * Provides access to the SmartCanvasRuntime from any component in the tree.\n */\nimport { createContext, type ReactNode, useContext, useEffect, useMemo, useState } from 'react';\n\nimport type { RuntimeContext } from './context/types';\nimport type { SmartCanvasRuntime } from './runtime';\n\n/**\n * Context value for the RuntimeProvider.\n */\ninterface RuntimeContextValue {\n /** The SmartCanvasRuntime instance */\n runtime: SmartCanvasRuntime | null;\n /** Current runtime context (reactive) */\n context: RuntimeContext | null;\n}\n\nconst RuntimeReactContext = createContext<RuntimeContextValue>({\n runtime: null,\n context: null,\n});\n\nexport interface RuntimeProviderProps {\n /** The SmartCanvasRuntime instance */\n runtime: SmartCanvasRuntime | null;\n children: ReactNode;\n}\n\n/**\n * Provider component for the SmartCanvasRuntime.\n */\nexport function RuntimeProvider({ runtime, children }: RuntimeProviderProps) {\n // Subscribe to context changes and re-render when they occur\n const [context, setContext] = useState<RuntimeContext | null>(\n runtime ? runtime.context.get() : null\n );\n\n useEffect(() => {\n if (!runtime) return;\n\n // Set initial context\n setContext(runtime.context.get());\n\n // Subscribe to changes\n const unsubscribe = runtime.context.subscribe((ctx) => {\n setContext(ctx);\n });\n\n return unsubscribe;\n }, [runtime]);\n\n const value = useMemo(() => ({ runtime, context }), [runtime, context]);\n\n return <RuntimeReactContext.Provider value={value}>{children}</RuntimeReactContext.Provider>;\n}\n\n/**\n * Hook to access the SmartCanvasRuntime.\n */\nexport function useRuntime(): SmartCanvasRuntime | null {\n const { runtime } = useContext(RuntimeReactContext);\n return runtime;\n}\n\n/**\n * Hook to access the current runtime context (reactive).\n */\nexport function useRuntimeContext(): RuntimeContext | null {\n const { context } = useContext(RuntimeReactContext);\n return context;\n}\n\n/**\n * Hook to access a specific part of the runtime context.\n */\nexport function usePageContext() {\n const context = useRuntimeContext();\n return context?.page ?? null;\n}\n\nexport function useSessionContext() {\n const context = useRuntimeContext();\n return context?.session ?? null;\n}\n\nexport function useViewportContext() {\n const context = useRuntimeContext();\n return context?.viewport ?? null;\n}\n\n/**\n * Hook to subscribe to runtime events.\n */\nexport function useRuntimeEvents(\n filter:\n | { names?: string[]; patterns?: string[]; sources?: Array<'posthog' | 'canvas' | 'derived'> }\n | undefined,\n callback: (event: import('./events/types').NormalizedEvent) => void,\n deps: React.DependencyList = []\n) {\n const runtime = useRuntime();\n\n useEffect(() => {\n if (!runtime) return;\n\n const unsubscribe = filter\n ? runtime.events.subscribe(filter, callback)\n : runtime.events.subscribe(callback);\n\n return unsubscribe;\n }, [runtime, ...deps, callback, filter]);\n}\n\n/**\n * Hook to access state helpers.\n */\nexport function useRuntimeState() {\n const runtime = useRuntime();\n return runtime?.state ?? null;\n}\n\n/**\n * Hook to evaluate a decision strategy.\n */\nexport function useDecision<T>(\n strategy: import('./decisions/types').DecisionStrategy<T> | undefined | null,\n defaultValue: T\n): { value: T; isFallback: boolean; isLoading: boolean } {\n const runtime = useRuntime();\n const [result, setResult] = useState<{ value: T; isFallback: boolean; isLoading: boolean }>({\n value: defaultValue,\n isFallback: true,\n isLoading: true,\n });\n\n useEffect(() => {\n if (!runtime || !strategy) {\n setResult({ value: defaultValue, isFallback: true, isLoading: false });\n return;\n }\n\n let cancelled = false;\n\n runtime.evaluate(strategy).then((res) => {\n if (!cancelled) {\n setResult({ value: res.value, isFallback: res.isFallback, isLoading: false });\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [runtime, strategy, defaultValue]);\n\n return result;\n}\n", "import { border, brand, slateGrey, text } from '@syntro/design-system/tokens';\nimport { type CSSProperties, useCallback, useEffect, useReducer, useRef, useState } from 'react';\n\nimport { useRuntime } from '../RuntimeProvider';\nimport type { TelemetryClient } from '../telemetry/types';\nimport { withAlpha } from '../theme';\nimport type { TileConfig } from '../types';\nimport type { MountedWidgetHandle } from '../widgets/WidgetRegistry';\n\n// ---------------------------------------------------------------------------\n// WidgetMount - mounts a registered widget into a DOM container\n// ---------------------------------------------------------------------------\n\nfunction WidgetMount({ widgetId, props }: { widgetId: string; props?: Record<string, unknown> }) {\n const runtime = useRuntime();\n const containerRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<MountedWidgetHandle | null>(null);\n\n const registry = runtime?.widgets;\n const widgetAvailable = registry?.has(widgetId) ?? false;\n\n // Re-render when the target widget registers (late activation)\n const [, forceUpdate] = useReducer((x: number) => x + 1, 0);\n useEffect(() => {\n if (!registry || widgetAvailable) return;\n return registry.subscribe((event) => {\n if (event.type === 'registered' && event.widgetId === widgetId) {\n forceUpdate();\n }\n });\n }, [registry, widgetId, widgetAvailable]);\n\n useEffect(() => {\n if (!containerRef.current || !registry || !widgetAvailable) return;\n\n // Mount the widget\n const handle = registry.mount(widgetId, containerRef.current, props);\n handleRef.current = handle;\n\n return () => {\n handle.unmount();\n handleRef.current = null;\n };\n }, [registry, widgetId, props, widgetAvailable]);\n\n if (!registry || !registry.has(widgetId)) {\n return (\n <div\n style={{\n padding: '0.75rem',\n fontSize: '0.8rem',\n color: text.tertiary,\n fontStyle: 'italic',\n }}\n >\n Widget not available: {widgetId}\n </div>\n );\n }\n\n return <div ref={containerRef} style={{ width: '100%', minHeight: '40px' }} />;\n}\n\n// ---------------------------------------------------------------------------\n// TileCard\n// ---------------------------------------------------------------------------\n\ninterface TileCardProps {\n config: TileConfig;\n surface: 'overlay' | 'wheel';\n telemetry?: TelemetryClient;\n style?: CSSProperties;\n}\n\nexport function TileCard({\n config,\n surface: _surface,\n telemetry: _telemetry,\n style,\n}: TileCardProps) {\n const { title, widget, props } = config;\n const [, setTick] = useState(0);\n\n // Force a re-render once the runtime becomes available so WidgetMount can\n // pick up the registry. This covers the case where TileCard renders before\n // the RuntimeProvider has propagated the runtime value.\n const runtime = useRuntime();\n useEffect(() => {\n if (runtime) setTick((t) => t + 1);\n }, [runtime]);\n\n const [hovered, setHovered] = useState(false);\n const onMouseEnter = useCallback(() => setHovered(true), []);\n const onMouseLeave = useCallback(() => setHovered(false), []);\n\n const cardStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n borderRadius: '14px',\n background: hovered ? withAlpha(slateGrey[1], 0.7) : withAlpha(slateGrey[1], 0.6),\n backdropFilter: 'blur(16px) saturate(1.2)',\n WebkitBackdropFilter: 'blur(16px) saturate(1.2)',\n border: '1px solid rgba(255, 255, 255, 0.08)',\n boxShadow: '0 2px 12px rgba(0, 0, 0, 0.3)',\n color: text.primary,\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'SF Pro Display', sans-serif\",\n overflow: 'hidden',\n cursor: 'default',\n transition: 'all 0.25s ease',\n transform: hovered ? 'scale(1.01)' : 'scale(1)',\n ...style,\n };\n\n const headerStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n padding: '0.875rem 1rem',\n minHeight: '72px',\n };\n\n const iconStyle: CSSProperties = {\n width: '40px',\n height: '40px',\n borderRadius: '10px',\n background: `linear-gradient(135deg, ${brand[3]} 0%, ${brand[3]}cc 100%)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '1.25rem',\n flexShrink: 0,\n boxShadow: `0 2px 8px ${brand[3]}40`,\n };\n\n return (\n <article\n data-shadow-canvas-id={`tile-${config.id}`}\n style={cardStyle}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {/* Header */}\n <div style={headerStyle}>\n <div style={iconStyle}>{'+'}</div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <h3\n style={{\n fontSize: '0.95rem',\n fontWeight: 600,\n color: text.primary,\n margin: '0.125rem 0 0',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {title ?? widget}\n </h3>\n </div>\n </div>\n\n {/* Widget Content \u2014 always rendered */}\n <div\n style={{\n padding: '0 1rem 1rem',\n borderTop: `1px solid ${border.secondary}`,\n }}\n >\n <div style={{ paddingTop: '0.875rem' }}>\n <WidgetMount widgetId={widget} props={props} />\n </div>\n </div>\n </article>\n );\n}\n", "import { base, brand, button, red, slateGrey, text } from '@syntro/design-system/tokens';\nimport { type ReactNode, useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { CanvasEvents } from '../events/normalizers/canvas';\nimport { StandardEvents } from '../events/types';\nimport { NotificationToastStack } from '../notifications/NotificationToastStack';\nimport type { ActiveNotification } from '../notifications/types';\nimport { useNotifications } from '../notifications/useNotifications';\nimport { useNotifyWatcher } from '../notifications/useNotifyWatcher';\nimport { useRuntime } from '../RuntimeProvider';\nimport { useShadowRoot } from '../ShadowRootContext';\nimport type { TelemetryClient } from '../telemetry/types';\nimport { withAlpha } from '../theme';\nimport type { TileConfig } from '../types';\n\nimport { TileCard } from './TileCard';\n\n// Launcher animation CSS (injected into shadow root or document.head as fallback)\nconst LAUNCHER_STYLES_ID = 'syntro-launcher-styles';\nconst LAUNCHER_CSS = `\n @keyframes syntro-launcher-pulse {\n 0%, 100% {\n box-shadow: 0 20px 45px ${slateGrey[0]}59, 0 0 0 0 ${brand[3]}66;\n }\n 50% {\n box-shadow: 0 20px 45px ${slateGrey[0]}59, 0 0 0 8px ${brand[3]}00;\n }\n }\n @keyframes syntro-launcher-glow {\n 0%, 100% {\n border-color: ${slateGrey[5]};\n }\n 50% {\n border-color: ${brand[4]}99;\n }\n }\n .syntro-launcher-animate {\n animation: syntro-launcher-pulse 2s ease-in-out infinite, syntro-launcher-glow 2s ease-in-out infinite;\n }\n .syntro-launcher-animate:hover {\n animation: none;\n }\n @keyframes syntro-badge-ping {\n 0% { transform: scale(1); opacity: 1; }\n 75%, 100% { transform: scale(2.2); opacity: 0; }\n }\n @keyframes syntro-badge-glow {\n 0%, 100% { box-shadow: 0 0 8px 2px ${withAlpha(brand[4], 0.3)}; }\n 50% { box-shadow: 0 0 20px 6px ${withAlpha(brand[4], 0.5)}; }\n }\n @keyframes syntro-badge-bounce {\n 0%, 100% { transform: translateY(0); }\n 25% { transform: translateY(-6px); }\n 50% { transform: translateY(-3px); }\n }\n .syntro-badge-ping { animation: syntro-badge-ping 1.5s cubic-bezier(0,0,0.2,1) infinite; }\n .syntro-badge-glow { animation: syntro-badge-glow 2s ease-in-out infinite; }\n .syntro-badge-bounce { animation: syntro-badge-bounce 2s ease-in-out infinite; }\n`;\n\nfunction ensureLauncherStyles(target: ShadowRoot | DocumentOrShadowRoot) {\n if ((target as ParentNode).querySelector(`#${LAUNCHER_STYLES_ID}`)) return;\n const style = document.createElement('style');\n style.id = LAUNCHER_STYLES_ID;\n style.textContent = LAUNCHER_CSS;\n (target as Node).appendChild(style);\n}\n\nexport interface CanvasTheme {\n position: 'left' | 'right';\n baseWidth: string;\n expandedWidth: string;\n zIndex: number;\n backdropBlur: string;\n /** Color theming from workspace settings */\n mode?: 'dark' | 'light';\n colorPrimary?: string;\n colorBackground?: string;\n colorText?: string;\n colorTextSecondary?: string;\n borderRadius?: string;\n /** Glass morphism */\n glassBackground?: string;\n glassBlur?: string;\n glassSaturate?: string;\n}\n\nconst DEFAULT_THEME: CanvasTheme = {\n position: 'right',\n baseWidth: 'clamp(320px, 16.666vw, 420px)',\n expandedWidth: '40vw',\n zIndex: 2147483600,\n backdropBlur: '18px',\n mode: 'dark',\n colorPrimary: brand[3],\n colorBackground: slateGrey[1],\n colorText: text.primary,\n colorTextSecondary: text.secondary,\n borderRadius: '12px',\n glassBackground: withAlpha(slateGrey[1], 0.6),\n glassBlur: 'blur(24px)',\n glassSaturate: 'saturate(1.2)',\n};\n\nexport interface ShadowCanvasOverlayProps {\n isOpen: boolean;\n onToggle: () => void;\n telemetry?: TelemetryClient;\n launcherLabel?: string;\n launcherAnimate?: boolean;\n launcherAnimationStyle?: 'pulse' | 'bounce' | 'glow';\n notificationCount?: number;\n footerSlot?: ReactNode;\n tiles: TileConfig[];\n isLoading: boolean;\n error?: string;\n canvasTitle?: string;\n displayMode?: 'standard' | 'focused';\n theme?: Partial<CanvasTheme>;\n}\n\nexport function ShadowCanvasOverlay({\n isOpen,\n onToggle,\n telemetry,\n launcherLabel: _launcherLabel = 'Adaptives',\n launcherAnimate = false,\n launcherAnimationStyle: _launcherAnimationStyle = 'pulse',\n notificationCount: _notificationCount,\n footerSlot,\n tiles,\n isLoading,\n error,\n canvasTitle,\n displayMode = 'standard',\n theme: themeOverride,\n}: ShadowCanvasOverlayProps) {\n const [mounted, setMounted] = useState(false);\n const [launcherPos, setLauncherPos] = useState<{ x: number; y: number } | null>(null);\n const dragRef = useRef<{\n startX: number;\n startY: number;\n startElX: number;\n startElY: number;\n dragged: boolean;\n } | null>(null);\n // Get runtime for publishing events to the EventBus\n const runtime = useRuntime();\n const { shadowRoot, portalRoot } = useShadowRoot();\n\n // Notification toast system\n const { notifications, dismiss: dismissNotification } = useNotifications(\n runtime?.events ?? null,\n tiles\n );\n\n // Watch for notify-bearing actions crossing showWhen thresholds (runs even with drawer closed)\n useNotifyWatcher(runtime, tiles, runtime?.apps);\n\n const handleNotificationClick = useCallback(\n (notif: ActiveNotification) => {\n // Publish telemetry event\n if (runtime) {\n // biome-ignore lint: intentional field subset for telemetry event payload\n runtime.events.publish(StandardEvents.NOTIFICATION_CLICKED, {\n notificationId: notif.id,\n tileId: notif.tileId,\n itemId: notif.itemId,\n });\n }\n\n // Open canvas if closed\n if (!isOpen) {\n onToggle();\n }\n\n // Publish deep link event for the target adaptive to handle\n if (runtime && notif.tileId) {\n runtime.events.publish(StandardEvents.NOTIFICATION_DEEP_LINK, {\n tileId: notif.tileId,\n itemId: notif.itemId,\n });\n }\n\n // Dismiss the clicked toast\n dismissNotification(notif.id);\n },\n [runtime, isOpen, onToggle, dismissNotification]\n );\n\n const theme: CanvasTheme = { ...DEFAULT_THEME, ...themeOverride };\n\n // Track tile viewed events\n useEffect(() => {\n if (!isOpen) return;\n\n tiles.forEach((tile) => {\n // Telemetry tracking (PostHog)\n telemetry?.trackRectangleViewed(tile.id, 'overlay');\n\n // EventBus publishing\n if (runtime) {\n const event = CanvasEvents.tileViewed(tile.id, 'overlay');\n runtime.events.publish(event.name, event.props, event.source);\n }\n });\n }, [telemetry, runtime, isOpen, tiles]);\n\n useEffect(() => {\n setMounted(true);\n ensureLauncherStyles(shadowRoot);\n }, [shadowRoot]);\n\n const toggle = useCallback(() => {\n const next = !isOpen;\n\n // Telemetry tracking (PostHog)\n if (next) {\n telemetry?.trackCanvasOpened('overlay');\n } else {\n telemetry?.trackCanvasClosed('overlay');\n }\n\n // EventBus publishing\n if (runtime) {\n const event = next\n ? CanvasEvents.canvasOpened('overlay')\n : CanvasEvents.canvasClosed('overlay');\n runtime.events.publish(event.name, event.props, event.source);\n }\n\n onToggle();\n }, [isOpen, telemetry, runtime, onToggle]);\n\n // Drag-to-reposition: pointerdown starts tracking, pointermove updates position,\n // pointerup commits. If total movement < 5px, treat as a click instead.\n const onLauncherPointerDown = useCallback((e: React.PointerEvent<HTMLButtonElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n dragRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startElX: rect.left,\n startElY: rect.top,\n dragged: false,\n };\n e.currentTarget.setPointerCapture(e.pointerId);\n }, []);\n\n const onLauncherPointerMove = useCallback((e: React.PointerEvent<HTMLButtonElement>) => {\n const drag = dragRef.current;\n if (!drag) return;\n const dx = e.clientX - drag.startX;\n const dy = e.clientY - drag.startY;\n if (Math.abs(dx) > 5 || Math.abs(dy) > 5) {\n drag.dragged = true;\n }\n if (drag.dragged) {\n setLauncherPos({ x: drag.startElX + dx, y: drag.startElY + dy });\n }\n }, []);\n\n const onLauncherPointerUp = useCallback(\n (_e: React.PointerEvent<HTMLButtonElement>) => {\n const drag = dragRef.current;\n dragRef.current = null;\n if (drag && !drag.dragged) {\n toggle();\n }\n },\n [toggle]\n );\n\n const isFocused = displayMode === 'focused';\n const isRight = theme.position === 'right';\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n width: isFocused ? theme.expandedWidth : theme.baseWidth,\n minWidth: '320px',\n height: '100%',\n maxHeight: '100%',\n pointerEvents: 'auto',\n opacity: isOpen ? 1 : 0,\n transition: isOpen\n ? 'transform 340ms cubic-bezier(0.16, 1, 0.3, 1), opacity 280ms ease-out'\n : 'transform 280ms cubic-bezier(0.4, 0, 0.2, 1), opacity 200ms ease-in',\n color: theme.colorText || text.primary,\n\n // Standard mode: no tint, just blur with a tight fade mask at the leading edge\n // Focused mode: full frosted glass\n background: isFocused ? (theme.glassBackground ?? withAlpha(slateGrey[1], 0.6)) : 'transparent',\n backdropFilter: isFocused\n ? `${theme.glassBlur ?? 'blur(24px)'} ${theme.glassSaturate ?? 'saturate(1.2)'}`\n : 'blur(6px)',\n WebkitBackdropFilter: isFocused\n ? `${theme.glassBlur ?? 'blur(24px)'} ${theme.glassSaturate ?? 'saturate(1.2)'}`\n : 'blur(6px)',\n // Tight fade mask so blur cuts off sharply at the leading edge\n ...(!isFocused\n ? {\n maskImage: isRight\n ? 'linear-gradient(to right, transparent, black 6%)'\n : 'linear-gradient(to left, transparent, black 6%)',\n WebkitMaskImage: isRight\n ? 'linear-gradient(to right, transparent, black 6%)'\n : 'linear-gradient(to left, transparent, black 6%)',\n }\n : {}),\n\n border: 'none',\n borderRadius: '0',\n boxShadow: 'none',\n\n // Transform logic\n transform: isOpen ? 'translateX(0)' : isRight ? 'translateX(120%)' : 'translateX(-120%)',\n };\n\n const wrapperStyle: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: isRight ? 'row-reverse' : 'row',\n alignItems: 'stretch',\n pointerEvents: 'none',\n padding: '0',\n };\n\n const content = (\n <div\n data-shadow-canvas-id=\"overlay-root\"\n style={{\n position: 'fixed',\n inset: 0,\n pointerEvents: isOpen ? 'auto' : 'none',\n zIndex: theme.zIndex,\n }}\n >\n <div style={wrapperStyle}>\n <div data-shadow-canvas-id=\"overlay-container\" style={containerStyle}>\n {isFocused && canvasTitle && (\n <header style={{ color: 'white', padding: '1.5rem 1.5rem 0' }}>\n <p\n style={{\n margin: 0,\n fontSize: '0.7rem',\n textTransform: 'uppercase',\n letterSpacing: '0.5em',\n color: text.tertiary,\n }}\n >\n {canvasTitle}\n </p>\n </header>\n )}\n\n <div style={{ flex: 1, overflowY: 'auto', padding: isFocused ? '0' : '1rem' }}>\n {isLoading ? (\n <div style={{ color: text.primary, padding: isFocused ? '1rem' : '0' }}>\n Loading...\n </div>\n ) : error ? (\n <div style={{ color: red[8], padding: isFocused ? '1rem' : '0' }}>\n Failed to load: {error}\n </div>\n ) : isFocused ? (\n /* Focused Mode: Render first tile full size */\n tiles.length > 0 ? (\n <TileCard\n config={tiles[0]}\n surface=\"overlay\"\n telemetry={telemetry}\n style={{ width: '100%', height: '100%' }}\n />\n ) : null\n ) : (\n /* Standard Mode: Stacked cards \u2014 widgets always visible */\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '0.75rem',\n width: '100%',\n }}\n >\n {tiles.map((tile) => (\n <TileCard\n key={tile.id}\n config={tile}\n surface=\"overlay\"\n telemetry={telemetry}\n style={{ width: '100%' }}\n />\n ))}\n </div>\n )}\n </div>\n {footerSlot}\n </div>\n\n {/* Click backdrop to close */}\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Backdrop click-to-close; keyboard users can press Escape */}\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: Backdrop click-to-close; keyboard users can press Escape */}\n <div\n onClick={toggle}\n style={{\n flex: '1 1 auto',\n pointerEvents: isOpen ? 'auto' : 'none',\n cursor: 'default',\n }}\n />\n </div>\n </div>\n );\n\n if (!mounted) return null;\n\n return (\n <>\n {createPortal(\n <div\n data-shadow-canvas-id=\"overlay-launcher\"\n style={{\n position: 'fixed',\n inset: 0,\n pointerEvents: 'none',\n zIndex: theme.zIndex + 47,\n }}\n >\n <NotificationToastStack\n notifications={notifications}\n onDismiss={dismissNotification}\n onClickNotification={handleNotificationClick}\n position={theme.position}\n />\n <button\n type=\"button\"\n aria-label=\"Toggle shadow canvas\"\n className={launcherAnimate && !isOpen ? 'syntro-launcher-animate' : undefined}\n style={{\n position: 'fixed',\n ...(launcherPos\n ? { top: launcherPos.y, left: launcherPos.x }\n : {\n bottom: '2.5rem',\n right: isRight ? '2.5rem' : undefined,\n left: !isRight ? '2.5rem' : undefined,\n }),\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '56px',\n height: '56px',\n borderRadius: '9999px',\n color: button.primary.icon,\n boxShadow: `0 8px 32px ${withAlpha(slateGrey[0], 0.6)}`,\n transition: dragRef.current\n ? 'none'\n : 'transform 0.2s ease, opacity 0.3s ease, background-color 0.2s ease',\n outline: 'none',\n padding: 0,\n border: 'none',\n backgroundColor: button.primary.backgroundDefault,\n cursor: dragRef.current?.dragged ? 'grabbing' : 'pointer',\n touchAction: 'none',\n }}\n onPointerDown={onLauncherPointerDown}\n onPointerMove={onLauncherPointerMove}\n onPointerUp={onLauncherPointerUp}\n onMouseEnter={(e) => {\n if (!dragRef.current?.dragged) {\n e.currentTarget.style.backgroundColor = button.primary.backgroundHover;\n }\n }}\n onMouseLeave={(e) => {\n if (!dragRef.current?.dragged) {\n e.currentTarget.style.backgroundColor = button.primary.backgroundDefault;\n }\n }}\n >\n {/* Sparkles when closed, X when open */}\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n style={{ transition: 'transform 200ms ease' }}\n >\n {isOpen ? (\n <>\n <path d=\"M18 6L6 18\" />\n <path d=\"M6 6l12 12\" />\n </>\n ) : (\n <>\n <path d=\"M12 3l1.912 5.813a2 2 0 0 0 1.275 1.275L21 12l-5.813 1.912a2 2 0 0 0-1.275 1.275L12 21l-1.912-5.813a2 2 0 0 0-1.275-1.275L3 12l5.813-1.912a2 2 0 0 0 1.275-1.275L12 3Z\" />\n <path d=\"M5 3v4\" />\n <path d=\"M3 5h4\" />\n <path d=\"M19 17v4\" />\n <path d=\"M17 19h4\" />\n </>\n )}\n </svg>\n\n {/* Notification Badge \u2014 driven by active toast notifications */}\n {!isOpen && notifications.length > 0 && (\n <div style={{ position: 'absolute', top: -2, right: -2, pointerEvents: 'none' }}>\n {/* Layer 1: Expanding ping ring */}\n <span\n className=\"syntro-badge-ping\"\n style={{\n position: 'absolute',\n inset: 0,\n borderRadius: '9999px',\n background: withAlpha(brand[4], 0.4),\n }}\n />\n {/* Layer 2: Glow pulse */}\n <span\n className=\"syntro-badge-glow\"\n style={{\n position: 'absolute',\n inset: -4,\n borderRadius: '9999px',\n }}\n />\n {/* Layer 3: Bouncing count badge */}\n <span\n className=\"syntro-badge-bounce\"\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '9999px',\n background: brand[4],\n color: base.white,\n fontSize: 11,\n fontWeight: 700,\n }}\n >\n {notifications.length > 99 ? '99+' : notifications.length}\n </span>\n </div>\n )}\n </button>\n </div>,\n portalRoot\n )}\n {isOpen ? createPortal(content, portalRoot) : null}\n </>\n );\n}\n", "import { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport type { ExperimentClient } from '../experiments/types';\nimport { debug } from '../logger';\nimport type { SmartCanvasRuntime } from '../runtime';\nimport type {\n ActionStep,\n CanvasConfigFetcher,\n CanvasThemeConfig,\n LauncherConfig,\n TileConfig,\n} from '../types';\n\nexport interface UseShadowCanvasConfigOptions {\n fetcher: CanvasConfigFetcher;\n pollIntervalMs?: number;\n /** @deprecated Use runtime instead */\n experiments?: ExperimentClient;\n /** v2 Runtime for activation-based filtering */\n runtime?: SmartCanvasRuntime;\n /** Current pathname \u2014 triggers re-filter when URL changes (route-based activation) */\n pathname?: string;\n}\n\nexport interface ShadowCanvasConfigState {\n tiles: TileConfig[];\n isLoading: boolean;\n error?: string;\n fetchedAt?: string;\n canvasTitle?: string;\n configVersion?: string;\n /** Actions to execute (tooltips, highlights, DOM changes, etc.) */\n actions: ActionStep[];\n displayMode?: 'standard' | 'focused';\n /** Theme configuration from the canvas config (workspace settings) */\n theme?: CanvasThemeConfig;\n /** Launcher button configuration */\n launcher?: LauncherConfig;\n}\n\nconst sortTiles = (tiles: TileConfig[]) =>\n [...tiles].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n\nexport function useShadowCanvasConfig({\n fetcher,\n pollIntervalMs = 30000,\n experiments,\n runtime,\n pathname,\n}: UseShadowCanvasConfigOptions): ShadowCanvasConfigState {\n const [state, setState] = useState<ShadowCanvasConfigState>({\n tiles: [],\n actions: [],\n isLoading: true,\n });\n\n const load = useCallback(async () => {\n try {\n setState((prev) => ({ ...prev, isLoading: true, error: undefined }));\n const response = await fetcher();\n debug('SmartCanvas Config', 'Raw config response', response);\n let tiles: TileConfig[] = response.tiles || [];\n\n // Filter tiles based on activation config (v2) or experiments (v1)\n if (runtime) {\n // v2: Use runtime's filterTiles which handles both activation.strategy and legacy experiment\n tiles = await runtime.filterTiles(tiles);\n\n // Also apply legacy experiment filter for backward compatibility\n if (experiments) {\n tiles = tiles.filter((tile) => experiments.shouldRenderRectangle(tile));\n }\n } else if (experiments) {\n // v1: Use legacy experiment filtering only\n tiles = tiles.filter((tile) => experiments.shouldRenderRectangle(tile));\n }\n\n debug('SmartCanvas Config', `Tile count after filtering: ${tiles.length}`);\n\n setState({\n tiles: sortTiles(tiles),\n actions: response.actions || [],\n isLoading: false,\n fetchedAt: response.fetchedAt,\n canvasTitle: response.canvasTitle,\n configVersion: response.configVersion,\n theme: response.theme,\n launcher: response.launcher,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n console.error('[SmartCanvas Config] Failed to fetch/filter config:', message, err);\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: message,\n }));\n }\n }, [experiments, fetcher, runtime]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: pathname triggers re-filter for route-based activation (filterTiles reads current URL internally)\n useEffect(() => {\n load();\n if (!pollIntervalMs) return;\n const id = setInterval(load, pollIntervalMs);\n return () => clearInterval(id);\n }, [load, pollIntervalMs, pathname]);\n\n return useMemo(() => state, [state]);\n}\n", "import { type ReactNode, useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { BatchActionHandle } from './actions/types';\nimport { type CanvasTheme, ShadowCanvasOverlay } from './components/ShadowCanvasOverlay';\nimport { createCanvasConfigFetcher } from './configFetcher';\nimport type { SmartCanvasController } from './controller';\nimport type { ExperimentClient } from './experiments/types';\nimport { useShadowCanvasConfig } from './hooks/useShadowCanvasConfig';\nimport { RuntimeProvider, usePageContext } from './RuntimeProvider';\nimport type { SmartCanvasRuntime } from './runtime';\nimport type { TelemetryClient } from './telemetry/types';\nimport type { CanvasConfigFetcher } from './types';\n\nexport interface SmartCanvasAppProps {\n controller: SmartCanvasController;\n fetcher?: CanvasConfigFetcher;\n configUri?: string;\n configUriFeatureKey?: string;\n configFeatureKey?: string; // New: for direct config objects\n fetchCredentials?: RequestCredentials;\n pollIntervalMs?: number;\n experiments?: ExperimentClient;\n telemetry?: TelemetryClient;\n /** v2 Runtime instance for context, events, state, and decisions */\n runtime?: SmartCanvasRuntime;\n /** @deprecated Actions replace overlay recipes. Use config.actions instead. */\n overlayFetcher?: () => Promise<unknown>;\n /** @deprecated Actions replace overlay recipes. Use config.actions instead. */\n overlayConfigUri?: string;\n /** @deprecated Actions replace overlay recipes. Use config.actions instead. */\n overlayConfigFeatureKey?: string;\n /** @deprecated Actions replace overlay recipes. Use config.actions instead. */\n overlayFetchCredentials?: RequestCredentials;\n footerSlot?: ReactNode;\n launcherLabel?: string;\n canvasHost?: HTMLElement | null;\n theme?: Partial<CanvasTheme>;\n /** Batch handle from eager action application in createSmartCanvas(). Prevents double-apply. */\n initialBatchHandle?: BatchActionHandle | null;\n}\n\nexport function SmartCanvasApp({\n controller,\n fetcher,\n configUri,\n configUriFeatureKey = 'smart-canvas-config-uri',\n configFeatureKey = 'smart-canvas-config',\n fetchCredentials = 'include',\n pollIntervalMs,\n experiments,\n telemetry,\n runtime,\n overlayFetcher,\n overlayConfigUri,\n overlayConfigFeatureKey = 'smart-canvas-overlay-uri',\n overlayFetchCredentials = 'include',\n footerSlot,\n launcherLabel,\n canvasHost,\n theme,\n initialBatchHandle,\n}: SmartCanvasAppProps) {\n // Wrap the app with RuntimeProvider if runtime is available\n if (runtime) {\n return (\n <RuntimeProvider runtime={runtime}>\n <SmartCanvasAppInner\n controller={controller}\n fetcher={fetcher}\n configUri={configUri}\n configUriFeatureKey={configUriFeatureKey}\n configFeatureKey={configFeatureKey}\n fetchCredentials={fetchCredentials}\n pollIntervalMs={pollIntervalMs}\n experiments={experiments}\n telemetry={telemetry}\n runtime={runtime}\n overlayFetcher={overlayFetcher}\n overlayConfigUri={overlayConfigUri}\n overlayConfigFeatureKey={overlayConfigFeatureKey}\n overlayFetchCredentials={overlayFetchCredentials}\n footerSlot={footerSlot}\n launcherLabel={launcherLabel}\n canvasHost={canvasHost}\n theme={theme}\n initialBatchHandle={initialBatchHandle}\n />\n </RuntimeProvider>\n );\n }\n\n // No runtime - render directly (legacy mode)\n return (\n <SmartCanvasAppInner\n controller={controller}\n fetcher={fetcher}\n configUri={configUri}\n configUriFeatureKey={configUriFeatureKey}\n configFeatureKey={configFeatureKey}\n fetchCredentials={fetchCredentials}\n pollIntervalMs={pollIntervalMs}\n experiments={experiments}\n telemetry={telemetry}\n overlayFetcher={overlayFetcher}\n overlayConfigUri={overlayConfigUri}\n overlayConfigFeatureKey={overlayConfigFeatureKey}\n overlayFetchCredentials={overlayFetchCredentials}\n footerSlot={footerSlot}\n launcherLabel={launcherLabel}\n canvasHost={canvasHost}\n theme={theme}\n initialBatchHandle={initialBatchHandle}\n />\n );\n}\n\n/**\n * Inner component that handles the actual rendering logic.\n * Separated to allow RuntimeProvider to wrap it when runtime is available.\n */\nfunction SmartCanvasAppInner({\n controller,\n fetcher,\n configUri,\n configUriFeatureKey = 'smart-canvas-config-uri',\n configFeatureKey = 'smart-canvas-config',\n fetchCredentials = 'include',\n pollIntervalMs,\n experiments,\n telemetry,\n runtime,\n overlayFetcher: _overlayFetcher,\n overlayConfigUri: _overlayConfigUri,\n overlayConfigFeatureKey: _overlayConfigFeatureKey = 'smart-canvas-overlay-uri',\n overlayFetchCredentials: _overlayFetchCredentials = 'include',\n footerSlot,\n launcherLabel,\n canvasHost: _canvasHost,\n theme,\n initialBatchHandle,\n}: SmartCanvasAppProps) {\n const [open, setOpen] = useState(controller.getState().open);\n\n // Use runtime context for pathname if available, otherwise track locally\n const pageContext = usePageContext();\n const [localPathname, setLocalPathname] = useState(() =>\n typeof window !== 'undefined' ? window.location.pathname : '/'\n );\n\n // If runtime is available, use its context for pathname (it already handles SPA navigation)\n // Otherwise, track pathname locally (legacy mode)\n const pathname = pageContext?.url ? new URL(pageContext.url).pathname : localPathname;\n\n // Track route changes locally only when runtime is not available (legacy mode)\n useEffect(() => {\n if (runtime) return; // Runtime handles this via ContextManager\n if (typeof window === 'undefined') return;\n\n const updatePathname = () => setLocalPathname(window.location.pathname);\n\n // Listen for popstate (back/forward navigation)\n window.addEventListener('popstate', updatePathname);\n\n // Intercept pushState/replaceState for SPA navigation\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = function (...args) {\n originalPushState.apply(this, args);\n queueMicrotask(updatePathname);\n };\n\n history.replaceState = function (...args) {\n originalReplaceState.apply(this, args);\n queueMicrotask(updatePathname);\n };\n\n return () => {\n window.removeEventListener('popstate', updatePathname);\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n };\n }, [runtime]);\n\n const derivedFetcher = useMemo(() => {\n if (fetcher) return fetcher;\n return createCanvasConfigFetcher({\n configUri,\n experiments,\n featureKey: configUriFeatureKey,\n configFeatureKey,\n credentials: fetchCredentials,\n });\n }, [fetcher, configUri, experiments, configUriFeatureKey, configFeatureKey, fetchCredentials]);\n\n const configState = useShadowCanvasConfig({\n fetcher: derivedFetcher,\n pollIntervalMs,\n experiments,\n runtime,\n pathname,\n });\n const hasContent = configState.tiles.length > 0 && !configState.error;\n\n useEffect(() => controller.subscribe((state) => setOpen(state.open)), [controller]);\n\n useEffect(() => {\n if (!configState.isLoading && !hasContent && controller.getState().open) {\n controller.setOpen(false);\n }\n }, [controller, hasContent, configState.isLoading]);\n\n // Apply actions when config loads, revert previous batch when actions change.\n // Without revert-then-reapply, removing an action (e.g., the editor's\n // Before/After toggle) has no visible effect because old actions stay applied.\n //\n // initialBatchHandle: adopted from createSmartCanvas()'s eager apply to\n // prevent duplicate overlays. On the first run, if a handle exists, we\n // skip re-applying and just adopt it.\n const batchHandleRef = useRef<BatchActionHandle | null>(initialBatchHandle ?? null);\n const adoptedInitialRef = useRef(!!initialBatchHandle);\n\n useEffect(() => {\n if (!runtime?.actions) return;\n\n // Skip re-applying when we've adopted the eager batch handle from\n // createSmartCanvas(). Two runs need skipping:\n // 1. Initial render (configState.actions = []) \u2014 still loading\n // 2. First fetch arrives (configState.actions = same as eagerly applied)\n // Without skipping #2 the tooltip's 200ms fade-out from revertAll() overlaps\n // with the freshly applied tooltip, causing duplicate overlays.\n if (adoptedInitialRef.current) {\n if (configState.actions.length > 0) {\n // First real actions arrived \u2014 same as the eagerly applied ones.\n // Clear the flag so future config changes are handled normally.\n adoptedInitialRef.current = false;\n }\n return;\n }\n\n let cancelled = false;\n\n const run = async () => {\n // Revert the previous batch before applying the new one\n if (batchHandleRef.current) {\n console.log('[SmartCanvasApp] Reverting previous action batch before re-apply');\n try {\n await batchHandleRef.current.revertAll();\n } catch (err) {\n console.error('[SmartCanvasApp] Failed to revert actions:', err);\n }\n batchHandleRef.current = null;\n }\n\n if (cancelled) return;\n\n // Apply the new batch (if non-empty)\n if (configState.actions.length > 0) {\n console.log(\n `[SmartCanvasApp] Applying ${configState.actions.length} action(s):`,\n configState.actions\n .map(\n (a: any, i: number) =>\n `[${i}] ${a.kind}${a.anchorId ? ` anchor=\"${a.anchorId}\"` : ''}${a.label ? ` \"${a.label}\"` : ''}`\n )\n .join(', ')\n );\n try {\n const handle = await runtime.actions.applyBatch(configState.actions);\n if (cancelled) {\n // Cleanup ran while we were applying \u2014 revert immediately\n await handle.revertAll();\n } else {\n batchHandleRef.current = handle;\n console.log('[SmartCanvasApp] Action batch applied successfully');\n }\n } catch (err) {\n if (!cancelled) {\n console.error(\n '[SmartCanvasApp] Failed to apply actions:',\n err,\n '\\nActions that failed:',\n JSON.stringify(configState.actions, null, 2)\n );\n }\n }\n }\n };\n\n run();\n\n return () => {\n cancelled = true;\n // Synchronous cleanup: revert current batch when actions change or unmount\n if (batchHandleRef.current) {\n console.log(\n '[SmartCanvasApp] Cleanup: reverting action batch (actions changed or unmount)'\n );\n batchHandleRef.current.revertAll().catch((err) => {\n console.error('[SmartCanvasApp] Failed to revert actions on cleanup:', err);\n });\n batchHandleRef.current = null;\n }\n };\n }, [runtime, configState.actions]);\n\n // Allow adaptives to programmatically open the canvas via EventBus\n useEffect(() => {\n if (!runtime) return;\n return runtime.events.subscribe({ names: ['canvas.requestOpen'] }, () =>\n controller.setOpen(true)\n );\n }, [runtime, controller]);\n\n // Merge theme from config (workspace settings) with any direct theme prop\n // Config theme takes precedence for workspace-set values, but theme prop can override\n // NOTE: This must be called BEFORE any early returns to maintain consistent hook order\n const mergedTheme = useMemo(() => {\n const configTheme = configState.theme;\n if (!configTheme) return theme;\n\n // Map CanvasThemeConfig (from config) to CanvasTheme (for overlay)\n return {\n ...configTheme, // position, mode, colors, borderRadius from config\n ...theme, // any direct overrides from theme prop\n };\n }, [configState.theme, theme]);\n\n // Only return null after loading completes with no content\n // (Don't return null while loading - that causes a flash of nothing)\n if (!configState.isLoading && !hasContent) {\n return null;\n }\n\n return (\n <ShadowCanvasOverlay\n tiles={configState.tiles}\n isLoading={configState.isLoading}\n error={configState.error}\n canvasTitle={configState.canvasTitle}\n telemetry={telemetry}\n launcherLabel={launcherLabel ?? configState.launcher?.label}\n launcherAnimate={configState.launcher?.animate}\n launcherAnimationStyle={configState.launcher?.animationStyle}\n notificationCount={configState.launcher?.notificationCount ?? configState.tiles.length}\n footerSlot={footerSlot}\n isOpen={open}\n onToggle={() => controller.toggle()}\n displayMode={configState.displayMode}\n theme={mergedTheme}\n />\n );\n}\n", "import { createRoot, type Root } from 'react-dom/client';\n\nimport { createSmartCanvasController, type SmartCanvasController } from './controller';\nimport { ShadowRootProvider } from './ShadowRootContext';\nimport { SmartCanvasApp, type SmartCanvasAppProps } from './SmartCanvasApp';\n\nconst TAG_NAME = 'smart-canvas';\nconst BASE_CSS = `\n:host {\n font: inherit;\n color: inherit;\n position: relative;\n contain: style;\n z-index: 2147483647;\n}\n:host([hidden]) {\n display: none;\n}\n*, *::before, *::after {\n box-sizing: border-box;\n}\n`;\n\nexport class SmartCanvasElement extends HTMLElement {\n #shadow: ShadowRoot;\n #mount: HTMLDivElement;\n #portalRoot: HTMLDivElement;\n #overlayContainer: HTMLDivElement;\n #controller: SmartCanvasController;\n #root: Root | null = null;\n #lastAppProps: Omit<SmartCanvasAppProps, 'controller'> | null = null;\n\n constructor() {\n super();\n this.#shadow = this.attachShadow({ mode: 'open', delegatesFocus: true });\n\n this.#mount = document.createElement('div');\n this.#mount.setAttribute('part', 'mount');\n this.#shadow.appendChild(this.#mount);\n\n // Portal root: React createPortal targets (launcher FAB, drawer, toasts)\n this.#portalRoot = document.createElement('div');\n this.#portalRoot.id = 'portalRoot';\n this.#shadow.appendChild(this.#portalRoot);\n\n // Overlay container: vanilla JS overlays (tooltips, modals, spotlights)\n this.#overlayContainer = document.createElement('div');\n this.#overlayContainer.id = 'overlayContainer';\n Object.assign(this.#overlayContainer.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483647',\n pointerEvents: 'none',\n });\n this.#shadow.appendChild(this.#overlayContainer);\n\n this.#controller = createSmartCanvasController();\n this.applyBaseStyles();\n }\n\n connectedCallback() {\n this.style.setProperty('font-family', 'inherit');\n }\n\n disconnectedCallback() {\n this.#root?.unmount();\n this.#root = null;\n }\n\n getMountNode() {\n return this.#mount;\n }\n\n getController() {\n return this.#controller;\n }\n\n /** React portal target inside shadow root (launcher, drawer, toasts) */\n getPortalRoot() {\n return this.#portalRoot;\n }\n\n /** Vanilla JS overlay container inside shadow root (tooltips, modals, spotlights) */\n getOverlayContainer() {\n return this.#overlayContainer;\n }\n\n /** Direct access to the shadow root (for style injection) */\n getShadowRoot() {\n return this.#shadow;\n }\n\n open() {\n this.#controller.setOpen(true);\n }\n\n close() {\n this.#controller.setOpen(false);\n }\n\n toggle() {\n this.#controller.toggle();\n }\n\n setOverrideFetcher(fetcher: any) {\n if (this.#lastAppProps) {\n this.#lastAppProps = { ...this.#lastAppProps, fetcher };\n this.render();\n }\n }\n\n /**\n * Used by standalone create() helper to bootstrap React into the shadow.\n */\n mountReactApp(appProps: Omit<SmartCanvasAppProps, 'controller'>) {\n this.#lastAppProps = appProps;\n this.render();\n }\n\n private render() {\n if (!this.isConnected || !this.#lastAppProps) return;\n if (!this.#root) {\n this.#root = createRoot(this.#mount);\n }\n this.#root.render(\n <ShadowRootProvider\n shadowRoot={this.#shadow}\n portalRoot={this.#portalRoot}\n overlayContainer={this.#overlayContainer}\n >\n <SmartCanvasApp {...this.#lastAppProps} controller={this.#controller} canvasHost={this} />\n </ShadowRootProvider>\n );\n }\n\n private applyBaseStyles() {\n if ((this.#shadow as any).adoptedStyleSheets !== undefined) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(BASE_CSS);\n (this.#shadow as any).adoptedStyleSheets = [sheet];\n } else {\n const style = document.createElement('style');\n style.textContent = BASE_CSS;\n this.#shadow.appendChild(style);\n }\n }\n}\n\nexport const registerSmartCanvasElement = () => {\n if (typeof window === 'undefined') return;\n if (!customElements.get(TAG_NAME)) {\n customElements.define(TAG_NAME, SmartCanvasElement);\n }\n};\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'smart-canvas': SmartCanvasElement;\n }\n}\n", "import { debug, warn } from './logger';\n\n/**\n * Allowed hosts for loading the editor SDK.\n * Only scripts from these hosts will be loaded.\n */\nconst ALLOWED_EDITOR_HOSTS = [\n 'cdn.syntrologie.com',\n 'api.syntrologie.com',\n 'dev-api.syntrologie.com',\n 'localhost',\n '127.0.0.1',\n // Allow any .syntrologie.com subdomain for dev/staging\n '.syntrologie.com',\n];\n\n// =============================================================================\n// Encoded URL params: editor_source & editor_conf\n//\n// Two opaque base64url-encoded JSON params:\n// editor_source = { api_base, token } \u2014 what runtime needs to load editor\n// editor_conf = { mode, audit_session_id } \u2014 what editor needs after load\n// =============================================================================\n\n/** Decoded editor_source payload (needed by runtime to load editor SDK). */\nexport interface EditorSource {\n api_base?: string;\n token: string;\n}\n\n/** Decoded editor_conf payload (passed through to editor SDK). */\nexport interface EditorConf {\n mode: 'editor' | 'audit' | 'review' | 'demo';\n audit_session_id?: string;\n [key: string]: unknown;\n}\n\n/**\n * Decode a base64url-encoded JSON param from the URL.\n * Returns null if param missing or malformed.\n */\nfunction decodeParam<T>(paramName: string): T | null {\n if (typeof window === 'undefined') return null;\n const params = new URLSearchParams(window.location.search);\n const raw = params.get(paramName);\n if (!raw) return null;\n try {\n const b64 = raw.replace(/-/g, '+').replace(/_/g, '/');\n return JSON.parse(atob(b64)) as T;\n } catch (e) {\n warn('Syntro Runtime', `Failed to decode ${paramName}:`, e);\n return null;\n }\n}\n\n// Cache states: undefined = never evaluated, null = evaluated but not found,\n// object = found and cached. Null results are NOT cached \u2014 the next call will\n// re-evaluate, allowing late-arriving URL params (e.g. replaceState after\n// redirect) to be picked up. Once a non-null result is found, it IS cached\n// permanently (params don't change during a page session).\nlet _cachedSource: EditorSource | null | undefined;\nlet _cachedConf: EditorConf | null | undefined;\n\n/**\n * Reset the editor params cache, forcing re-evaluation on next access.\n * Called by the Chrome extension after restoring URL params via replaceState,\n * or in tests to simulate fresh state without module reloading.\n */\nexport function resetEditorParamsCache(): void {\n _cachedSource = undefined;\n _cachedConf = undefined;\n}\n\n/** Get decoded editor_source from URL or global (re-evaluates on null). */\nexport function getEditorSource(): EditorSource | null {\n // Re-evaluate if never checked OR if previous result was null (params may\n // have appeared via replaceState since last call).\n if (_cachedSource === undefined || _cachedSource === null) {\n // Check global variable first (set by Chrome extension)\n const globalParams =\n typeof window !== 'undefined' ? (window as any).__SYNTRO_EDITOR_PARAMS__ : null;\n if (globalParams?.token) {\n _cachedSource = { token: globalParams.token, api_base: globalParams.apiBase || '' };\n console.log(\n `[DIAG] getEditorSource: from __SYNTRO_EDITOR_PARAMS__ (token=${_cachedSource.token.slice(0, 15)}...)`\n );\n } else {\n const decoded = decodeParam<EditorSource>('editor_source');\n if (decoded) {\n _cachedSource = decoded;\n }\n console.log(\n `[DIAG] getEditorSource: from URL param \u2192 ${decoded ? `token=${decoded.token?.slice(0, 15)}...` : 'NULL'}`\n );\n if (!decoded && typeof window !== 'undefined') {\n console.log(`[DIAG] getEditorSource: URL search = ${window.location.search.slice(0, 200)}`);\n }\n }\n }\n return _cachedSource ?? null;\n}\n\n/** Get decoded editor_conf from URL or global (re-evaluates on null). */\nexport function getEditorConf(): EditorConf | null {\n // Re-evaluate if never checked OR if previous result was null\n if (_cachedConf === undefined || _cachedConf === null) {\n // Check global variable first (set by Chrome extension)\n const globalParams =\n typeof window !== 'undefined' ? (window as any).__SYNTRO_EDITOR_PARAMS__ : null;\n if (globalParams?.mode) {\n // biome-ignore lint: intentional field mapping from camelCase global to snake_case conf\n _cachedConf = {\n mode: globalParams.mode,\n audit_session_id: globalParams.auditSessionId,\n syntro_token: globalParams.syntroToken,\n workspace_id: globalParams.workspaceId,\n };\n console.log(`[DIAG] getEditorConf: from __SYNTRO_EDITOR_PARAMS__ (mode=${_cachedConf.mode})`);\n } else {\n const decoded = decodeParam<EditorConf>('editor_conf');\n if (decoded) {\n _cachedConf = decoded;\n }\n console.log(\n `[DIAG] getEditorConf: from URL param \u2192 ${decoded ? `mode=${decoded.mode}` : 'NULL'}`\n );\n }\n }\n return _cachedConf ?? null;\n}\n\n// =============================================================================\n// URL validation\n// =============================================================================\n\n/**\n * Validates that an editor URL is from an allowed host.\n * Requires HTTPS for non-localhost URLs.\n * Relative URLs (starting with /) are allowed and assumed to be same-origin.\n */\nfunction validateEditorUrl(url: string): boolean {\n debug('Syntro Runtime', 'Validating editor URL:', url);\n try {\n if (url.startsWith('/')) {\n debug('Syntro Runtime', '\u2713 Relative URL allowed (same-origin):', url);\n return true;\n }\n\n const parsed = new URL(url);\n const isLocalhost = /^(localhost|127\\.0\\.0\\.1)$/.test(parsed.hostname);\n\n if (parsed.protocol !== 'https:' && !isLocalhost) {\n warn('Syntro Runtime', '\u274C Editor URL must use HTTPS:', url);\n return false;\n }\n\n const isAllowed = ALLOWED_EDITOR_HOSTS.some((host) => {\n if (host.startsWith('.')) {\n return parsed.hostname.endsWith(host) || parsed.hostname === host.slice(1);\n }\n return parsed.hostname === host;\n });\n if (!isAllowed) {\n warn('Syntro Runtime', '\u274C Editor URL host not in allowlist:', parsed.hostname);\n return false;\n }\n\n debug('Syntro Runtime', '\u2713 Editor URL validated');\n return true;\n } catch (e) {\n warn('Syntro Runtime', `\u274C Invalid editor URL: ${url}`, e);\n return false;\n }\n}\n\n// =============================================================================\n// Mode detection\n// =============================================================================\n\n/**\n * Checks if the editor should be loaded.\n * Requires editor_source + editor_conf encoded params with mode === 'editor'.\n */\nexport const shouldLoadEditor = (): boolean => {\n debug('Syntro Runtime', '====== EDITOR LOAD CHECK ======');\n if (typeof window === 'undefined') return false;\n\n const source = getEditorSource();\n const conf = getEditorConf();\n if (!source?.token || !conf) {\n debug('Syntro Runtime', 'No encoded params found');\n debug('Syntro Runtime', '================================');\n return false;\n }\n\n const should = conf.mode === 'editor';\n debug('Syntro Runtime', `mode: ${conf.mode}, shouldLoad: ${should}`);\n debug('Syntro Runtime', '================================');\n return should;\n};\n\n/**\n * Checks if audit mode should be activated.\n * Requires editor_source + editor_conf encoded params with mode === 'audit'.\n */\nexport const isAuditMode = (): boolean => {\n debug('Syntro Runtime', '====== AUDIT MODE CHECK ======');\n if (typeof window === 'undefined') return false;\n\n const source = getEditorSource();\n const conf = getEditorConf();\n if (!source?.token || !conf) {\n debug('Syntro Runtime', 'No encoded params found');\n debug('Syntro Runtime', '================================');\n return false;\n }\n\n const isAudit = conf.mode === 'audit';\n debug('Syntro Runtime', `mode: ${conf.mode}, isAudit: ${isAudit}`);\n debug('Syntro Runtime', '================================');\n return isAudit;\n};\n\n/**\n * Checks if any SDK mode (editor, audit, or review) should be loaded.\n * Returns the mode type if active, or null if none.\n */\nexport const getActiveSdkMode = (): 'editor' | 'audit' | 'review' | null => {\n const conf = getEditorConf();\n const source = getEditorSource();\n if (!source?.token || !conf) return null;\n if (conf.mode === 'editor' || conf.mode === 'audit' || conf.mode === 'review') return conf.mode;\n return null;\n};\n\nexport interface EditorLoadOptions {\n editorUrl?: string;\n integrity?: string;\n}\n\n/**\n * Gets the auth token from editor_source encoded param.\n */\nfunction getToken(): string | null {\n return getEditorSource()?.token ?? null;\n}\n\n/**\n * Gets the api_base from editor_source encoded param.\n */\nfunction getApiBase(): string | null {\n return getEditorSource()?.api_base ?? null;\n}\n\n/** Singleton promise to prevent concurrent editor SDK loads. */\nlet _editorLoadPromise: Promise<void> | null = null;\n\n/**\n * Dynamically loads the Editor SDK script.\n * Validates URL against allowlist and supports SRI integrity checking.\n */\nexport const loadEditorSdk = async (\n editorUrlOrOptions?: string | EditorLoadOptions\n): Promise<void> => {\n debug('Syntro Runtime', '====== LOAD EDITOR SDK ======');\n\n if (typeof window === 'undefined') {\n debug('Syntro Runtime', 'Not in browser - skipping editor SDK load');\n return;\n }\n\n if ((window as any).SyntroEditor) {\n debug('Syntro Runtime', 'Editor SDK already loaded (window.SyntroEditor exists)');\n return;\n }\n\n // Prevent concurrent loads (two Syntro.init() calls racing)\n if (_editorLoadPromise) {\n debug('Syntro Runtime', 'Editor SDK load already in progress, waiting...');\n return _editorLoadPromise;\n }\n\n const options: EditorLoadOptions =\n typeof editorUrlOrOptions === 'string'\n ? { editorUrl: editorUrlOrOptions }\n : (editorUrlOrOptions ?? {});\n\n // Allow callers (e.g. Chrome extension) to skip editor loading entirely.\n // The extension loads the editor SDK from its own bundle to avoid mixed content.\n if (options.editorUrl === 'skip') {\n debug('Syntro Runtime', 'editorUrl=\"skip\" \u2014 deferring to caller');\n debug('Syntro Runtime', '================================');\n return;\n }\n\n // Derive editor SDK URL from api_base in editor_source\n const apiBase = getApiBase();\n const derivedEditorSdk = apiBase ? `${apiBase}/api/editor/sdk/editor-sdk.js` : null;\n\n // Priority: api_base derived > options\n const baseEditorUrl = derivedEditorSdk || options.editorUrl;\n\n if (!baseEditorUrl) {\n warn('Syntro Runtime', '\u274C No editor SDK URL available (no api_base, no editorUrl option)');\n debug('Syntro Runtime', '================================');\n return;\n }\n\n const token = getToken();\n if (!token) {\n warn('Syntro Runtime', '\u274C No token found in editor_source.');\n debug('Syntro Runtime', '================================');\n return;\n }\n\n // Append token as query param to the SDK URL\n const editorUrl = `${baseEditorUrl}?token=${encodeURIComponent(token)}`;\n\n debug('Syntro Runtime', 'Editor URL:', editorUrl);\n debug('Syntro Runtime', 'Options:', {\n hasIntegrity: !!options.integrity,\n hasEditorUrl: !!baseEditorUrl,\n hasApiBase: !!apiBase,\n tokenPrefix: `${token.slice(0, 10)}...`,\n });\n\n // Security: Validate URL against allowlist (check base URL without token)\n if (!validateEditorUrl(baseEditorUrl)) {\n console.error('[Syntro Runtime] \u274C BLOCKED: Editor from untrusted URL:', baseEditorUrl);\n debug('Syntro Runtime', '================================');\n return;\n }\n\n debug('Syntro Runtime', '\u2713 URL validated, injecting script tag...');\n\n _editorLoadPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = editorUrl;\n script.async = true;\n\n if (options.integrity) {\n script.integrity = options.integrity;\n script.crossOrigin = 'anonymous';\n debug('Syntro Runtime', 'SRI integrity check enabled');\n }\n\n script.onload = () => {\n debug('Syntro Runtime', '\u2713 Editor SDK script loaded successfully');\n debug('Syntro Runtime', '================================');\n resolve();\n };\n script.onerror = (err) => {\n console.error('[Syntro Runtime] \u274C Failed to load Editor SDK:', err);\n console.error('[Syntro Runtime] URL attempted:', editorUrl);\n debug('Syntro Runtime', '================================');\n _editorLoadPromise = null; // Allow retry on failure\n reject(err);\n };\n document.head.appendChild(script);\n debug('Syntro Runtime', 'Script tag appended to <head>');\n });\n\n return _editorLoadPromise;\n};\n", "let overlayRootEl: HTMLElement | null = null;\n\n/**\n * Redirect overlay rendering into the shadow root's #overlayContainer.\n *\n * If `ensureOverlayRoot()` was already called (e.g. during runtime creation\n * before the canvas element exists), the temporary fallback element is\n * reparented into `container` so that existing references remain valid.\n */\nexport function setOverlayRoot(container: HTMLElement): void {\n if (overlayRootEl && overlayRootEl !== container) {\n // Reparent the stable fallback element into the shadow root container.\n // Surfaces/ActionEngine already hold a reference to overlayRootEl,\n // so moving it preserves their ability to appendChild into the shadow DOM.\n container.appendChild(overlayRootEl);\n } else {\n overlayRootEl = container;\n }\n\n // Inject base styles into the shadow root that contains the overlay container\n const shadowRoot = container.getRootNode();\n if (shadowRoot instanceof ShadowRoot) {\n injectBaseStyles(shadowRoot);\n }\n}\n\n/**\n * Return the overlay root element for appending overlays (tooltips, modals, etc).\n *\n * On first call (before `setOverlayRoot()`), creates a temporary element on\n * document.body. When `setOverlayRoot()` is called later during shadow DOM\n * bootstrap, this element is reparented into the shadow root so all existing\n * references continue to work.\n */\nexport function ensureOverlayRoot(): HTMLElement {\n if (!overlayRootEl) {\n overlayRootEl = document.createElement('div');\n overlayRootEl.id = 'syntro-overlays';\n Object.assign(overlayRootEl.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483647',\n pointerEvents: 'none',\n });\n document.body.appendChild(overlayRootEl);\n }\n return overlayRootEl;\n}\n\nlet stylesInjected = false;\nexport function injectBaseStyles(target: ShadowRoot | DocumentOrShadowRoot) {\n if (stylesInjected) return;\n const css = `\n:host {\n --syntro-surface: #0f1318;\n --syntro-fg: #cbd0d7;\n --syntro-accent: #b72e2a;\n --syntro-accent-hover: #d44844;\n --syntro-radius: 12px;\n --syntro-shadow: 0 25px 50px -12px rgba(16,24,40,0.25);\n --syntro-ring: #d44844;\n --syntro-border: #2b333f;\n --syntro-tooltip-bg: var(--syntro-surface);\n --syntro-tooltip-fg: var(--syntro-fg);\n --syntro-tooltip-radius: var(--syntro-radius);\n --syntro-tooltip-padding: 12px 16px;\n --syntro-tooltip-shadow: var(--syntro-shadow);\n --syntro-spotlight-backdrop: rgba(0,0,0,0.70);\n}\n\n/* Tooltip container */\n.syntro-tooltip {\n position: fixed;\n background: var(--syntro-tooltip-bg);\n color: var(--syntro-tooltip-fg);\n border-radius: var(--syntro-tooltip-radius);\n padding: var(--syntro-tooltip-padding);\n box-shadow: var(--syntro-tooltip-shadow);\n pointer-events: auto;\n max-width: min(320px, 90vw);\n font-family: inherit;\n font-size: 14px;\n line-height: 1.5;\n z-index: 2147483647;\n opacity: 1;\n visibility: visible;\n transition: opacity 200ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n/* Tooltip arrow */\n.syntro-tooltip-arrow {\n position: absolute;\n width: 8px;\n height: 8px;\n background: inherit;\n transform: rotate(45deg);\n z-index: -1;\n}\n\n/* Tooltip content */\n.syntro-tt-title {\n font-weight: 600;\n font-size: 15px;\n margin-bottom: 6px;\n}\n\n.syntro-tt-body {\n font-size: 14px;\n opacity: 0.9;\n}\n\n.syntro-tt-close {\n position: absolute;\n top: 8px;\n right: 8px;\n background: transparent;\n border: none;\n color: inherit;\n font-size: 20px;\n line-height: 1;\n cursor: pointer;\n opacity: 0.6;\n transition: opacity 150ms;\n padding: 4px;\n}\n\n.syntro-tt-close:hover {\n opacity: 1;\n}\n\n/* Tooltip action buttons (for tours) */\n.syntro-tt-actions {\n display: flex;\n gap: 8px;\n margin-top: 12px;\n justify-content: flex-end;\n}\n\n.syntro-tt-btn {\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms;\n border: 1px solid var(--syntro-border, #2b333f);\n background: transparent;\n color: inherit;\n}\n\n.syntro-tt-btn:hover {\n background: rgba(255, 255, 255, 0.06);\n}\n\n.syntro-tt-btn-primary {\n background: var(--syntro-accent, #b72e2a);\n border-color: transparent;\n color: #fff;\n}\n\n.syntro-tt-btn-primary:hover {\n background: var(--syntro-accent-hover, #d44844);\n}\n\n/* Buttons inside tooltips inherit font */\n.syntro-tooltip button {\n font-family: inherit;\n cursor: pointer;\n}\n\n/* Spotlight scrim with fade animation */\n.syntro-spotlight-scrim {\n position: fixed;\n inset: 0;\n background: var(--syntro-spotlight-backdrop, rgba(2,6,23,.55));\n backdrop-filter: blur(2px);\n transition: opacity 220ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n/* Spotlight ring with pulse animation */\n.syntro-spotlight-ring {\n position: fixed;\n border: 2px solid var(--syntro-ring, #d44844);\n box-shadow: 0 0 0 4px rgba(212, 72, 68, 0.25),\n 0 4px 12px rgba(0, 0, 0, 0.3);\n pointer-events: none;\n animation: syntro-ring-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n transition: all 220ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes syntro-ring-pulse {\n 0%, 100% {\n box-shadow: 0 0 0 4px rgba(212, 72, 68, 0.25),\n 0 4px 12px rgba(0, 0, 0, 0.3);\n }\n 50% {\n box-shadow: 0 0 0 8px rgba(212, 72, 68, 0.15),\n 0 4px 16px rgba(0, 0, 0, 0.4);\n }\n}\n\n/* Fade in animation for tooltip */\n@keyframes syntro-fade-in {\n from {\n opacity: 0;\n transform: scale(0.96) translateY(-4px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Modal scrim */\n.syntro-modal-scrim {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.6);\n backdrop-filter: blur(4px);\n opacity: 0;\n transition: opacity 200ms ease;\n pointer-events: auto;\n}\n\n/* Modal container */\n.syntro-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n background: var(--syntro-surface, #0f172a);\n color: var(--syntro-fg, #fff);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 24px 48px rgba(0, 0, 0, 0.4);\n pointer-events: auto;\n opacity: 0;\n transition: opacity 200ms ease, transform 200ms ease;\n z-index: 2147483647;\n}\n\n.syntro-modal-sm { max-width: 320px; width: 90vw; }\n.syntro-modal-md { max-width: 480px; width: 90vw; }\n.syntro-modal-lg { max-width: 640px; width: 90vw; }\n\n/* Modal content */\n.syntro-modal-title {\n font-size: 20px;\n font-weight: 600;\n margin-bottom: 12px;\n}\n\n.syntro-modal-body {\n font-size: 15px;\n line-height: 1.6;\n opacity: 0.9;\n margin-bottom: 20px;\n}\n\n.syntro-modal-close {\n position: absolute;\n top: 12px;\n right: 12px;\n background: transparent;\n border: none;\n color: inherit;\n font-size: 24px;\n line-height: 1;\n cursor: pointer;\n opacity: 0.6;\n transition: opacity 150ms;\n padding: 4px;\n}\n\n.syntro-modal-close:hover {\n opacity: 1;\n}\n\n/* Modal buttons */\n.syntro-modal-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.syntro-modal-btn {\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms;\n border: 1px solid var(--syntro-border, #2b333f);\n background: transparent;\n color: inherit;\n}\n\n.syntro-modal-btn:hover {\n background: rgba(255, 255, 255, 0.06);\n}\n\n.syntro-modal-btn-primary {\n background: var(--syntro-accent, #b72e2a);\n border-color: transparent;\n color: #fff;\n}\n\n.syntro-modal-btn-primary:hover {\n background: var(--syntro-accent-hover, #d44844);\n}\n`;\n const style = document.createElement('style');\n style.setAttribute('data-syntro', 'base-overlay');\n style.textContent = css;\n (target as Node).appendChild(style);\n stylesInjected = true;\n}\n\n// Inert helpers (polyfill loaded by caller if needed)\n// Must set inert on both document.body children (host page) AND shadow root\n// siblings when a blocking modal needs to trap focus.\nexport function setDocumentInertExcept(keepEl: HTMLElement) {\n // Inert host page children\n const bodyChildren = Array.from(document.body.children).filter((n) => n !== keepEl);\n bodyChildren.forEach((el) => el.setAttribute('inert', ''));\n\n // Also inert shadow root siblings if keepEl is inside a shadow root\n const root = keepEl.getRootNode();\n if (root instanceof ShadowRoot) {\n const shadowSiblings = Array.from(root.children).filter((n) => n !== keepEl);\n shadowSiblings.forEach((el) => el.setAttribute('inert', ''));\n }\n}\n\nexport function clearDocumentInert() {\n Array.from(document.body.children).forEach((el) => el.removeAttribute('inert'));\n\n // Also clear inert on shadow root children if overlay root is inside one\n if (overlayRootEl) {\n const root = overlayRootEl.getRootNode();\n if (root instanceof ShadowRoot) {\n Array.from(root.children).forEach((el) => el.removeAttribute('inert'));\n }\n }\n}\n", "/**\n * SmartCanvas API\n *\n * Entry point for the SmartCanvas SDK. Creates and manages the canvas element,\n * handles configuration, and coordinates between the ActionEngine and UI.\n */\n\nimport type { ActionStep, BatchActionHandle } from './actions/types';\nimport { initAntiFlicker } from './antiFlicker';\nimport type { CanvasTheme } from './components/ShadowCanvasOverlay';\nimport { createCanvasConfigFetcher } from './configFetcher';\nimport { getActiveSdkMode, loadEditorSdk } from './editorLoader';\nimport { registerConfigPredicates } from './events/registerConfigPredicates';\nimport type { ExperimentClient } from './experiments/types';\nimport type { OverlayRecipeFetcher } from './overlays/fetcher';\nimport { setOverlayRoot } from './overlays/runtime/overlay/root';\nimport type { ActionHandler, AppearanceConfig, RenderProps } from './render/types';\nimport type { SmartCanvasRuntime } from './runtime';\nimport type { SmartCanvasAppProps } from './SmartCanvasApp';\nimport { registerSmartCanvasElement, type SmartCanvasElement } from './SmartCanvasElement';\nimport type { TelemetryClient } from './telemetry/types';\nimport type { CanvasConfigFetcher, CanvasConfigResponse } from './types';\n\n// Theme and render system imports\n\nexport interface SmartCanvasIntegrations {\n experiments?: ExperimentClient;\n telemetry?: TelemetryClient;\n}\n\nexport interface SmartCanvasConfig {\n target?: HTMLElement;\n defaultOpen?: boolean;\n tokens?: Record<string, string>;\n fetcher?: CanvasConfigFetcher;\n configUri?: string;\n configUriFeatureKey?: string;\n fetchCredentials?: RequestCredentials;\n overlayFetcher?: OverlayRecipeFetcher;\n overlayConfigUri?: string;\n overlayConfigFeatureKey?: string;\n overlayFetchCredentials?: RequestCredentials;\n pollIntervalMs?: number;\n integrations?: SmartCanvasIntegrations;\n antiFlicker?: boolean | { timeout?: number; className?: string };\n editorUrl?: string;\n theme?: Partial<CanvasTheme>;\n\n /**\n * v2 Runtime instance.\n * Required for action execution. If not provided, actions will not be applied.\n */\n runtime?: SmartCanvasRuntime;\n\n // New block system configuration\n autoDetectTheme?: boolean;\n appearance?: AppearanceConfig;\n renderProps?: RenderProps;\n actionHandlers?: ActionHandler;\n}\n\n/**\n * Handle for interacting with a SmartCanvas instance.\n */\nexport interface SmartCanvasHandle {\n el: SmartCanvasElement;\n open(): void;\n close(): void;\n destroy(): void;\n setTokens(tokens: Record<string, string>): void;\n\n /**\n * Get the current config.\n */\n getConfig(): Promise<CanvasConfigResponse>;\n\n /**\n * Update the config and re-apply actions.\n * This is the primary way to modify what the canvas displays.\n */\n updateConfig(newConfig: CanvasConfigResponse): Promise<void>;\n\n /**\n * Enable or disable the canvas.\n * When disabled, all actions are reverted.\n */\n setEnabled(enabled: boolean): Promise<void>;\n\n setOverrideFetcher(fetcher: CanvasConfigFetcher): void;\n registerTelemetryProperties(properties: Record<string, unknown>): void;\n getSessionId(): string | undefined;\n startSessionRecording(): void;\n /** Track a custom event. Returns true if telemetry is available and event was sent. */\n track(eventName: string, properties?: Record<string, unknown>): boolean;\n\n /**\n * v2 Runtime instance for context, events, state, and decisions.\n */\n runtime?: SmartCanvasRuntime;\n}\n\nexport const createSmartCanvas = async (\n config: SmartCanvasConfig = {}\n): Promise<SmartCanvasHandle> => {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n throw new Error('SmartCanvas can only be created in a browser-like environment');\n }\n\n // Initialize anti-flicker if enabled\n let removeAntiFlicker: (() => void) | null = null;\n if (config.antiFlicker) {\n const antiFlickerConfig = typeof config.antiFlicker === 'object' ? config.antiFlicker : {};\n removeAntiFlicker = initAntiFlicker(antiFlickerConfig);\n }\n\n // State\n let currentConfig: CanvasConfigResponse | null = null;\n let currentFetcher: CanvasConfigFetcher | null = null;\n let currentBatchHandle: BatchActionHandle | null = null;\n let isEnabled = true;\n\n const { runtime } = config;\n\n /**\n * Apply actions from config via ActionEngine.\n */\n async function applyActions(actions: ActionStep[]): Promise<void> {\n if (!runtime?.actions || actions.length === 0) {\n return;\n }\n\n // Revert previous actions\n if (currentBatchHandle?.isApplied()) {\n await currentBatchHandle.revertAll();\n }\n\n // Apply new actions\n currentBatchHandle = await runtime.actions.applyBatch(actions);\n }\n\n /**\n * Revert all current actions.\n */\n async function revertActions(): Promise<void> {\n if (currentBatchHandle?.isApplied()) {\n await currentBatchHandle.revertAll();\n currentBatchHandle = null;\n }\n }\n\n // Apply initial config if fetcher provided\n if (config.fetcher) {\n try {\n currentFetcher = config.fetcher;\n console.log('[SmartCanvas] Fetching initial config...');\n const canvasConfig = await config.fetcher();\n currentConfig = canvasConfig;\n\n console.log(\n '[SmartCanvas] Config fetched:',\n `tiles=${canvasConfig.tiles?.length ?? 0},`,\n `actions=${canvasConfig.actions?.length ?? 0},`,\n `theme=${canvasConfig.theme?.name ?? 'none'}`\n );\n if (canvasConfig.actions?.length) {\n console.log(\n '[SmartCanvas] Actions to apply:',\n canvasConfig.actions\n .map(\n (a: any, i: number) =>\n `[${i}] ${a.kind}${a.anchorId ? ` anchor=\"${a.anchorId}\"` : ''}${a.label ? ` \"${a.label}\"` : ''}`\n )\n .join(', ')\n );\n }\n\n // Apply actions eagerly (before React mounts) to avoid flicker.\n // The batch handle is passed to SmartCanvasApp so the React useEffect\n // can adopt it instead of re-applying and creating duplicates.\n if (canvasConfig.actions && canvasConfig.actions.length > 0 && runtime?.actions) {\n await applyActions(canvasConfig.actions);\n console.log('[SmartCanvas] Initial actions applied successfully');\n }\n\n // Register accumulator predicates from tile configs so event counting\n // is active immediately \u2014 not deferred until widget mounts.\n if (canvasConfig.tiles && runtime?.accumulator) {\n registerConfigPredicates(canvasConfig.tiles, runtime.accumulator);\n }\n } catch (error) {\n console.error('[SmartCanvas] Error fetching/applying initial config:', error);\n }\n }\n\n // Remove anti-flicker\n if (removeAntiFlicker) {\n removeAntiFlicker();\n }\n\n // Create the canvas element (must exist before editor SDK loads)\n const sdkMode = getActiveSdkMode();\n registerSmartCanvasElement();\n\n const host = document.createElement('smart-canvas') as SmartCanvasElement;\n\n // Redirect vanilla JS overlays (tooltips, modals) into the shadow root\n setOverlayRoot(host.getOverlayContainer());\n\n if (config.tokens) {\n for (const [key, value] of Object.entries(config.tokens)) {\n host.style.setProperty(key, value);\n }\n }\n\n // Wait for body to exist if running in <head>\n const appendToTarget = () => {\n const target = config.target ?? document.body;\n if (target) {\n target.appendChild(host);\n }\n };\n\n if (document.body) {\n appendToTarget();\n } else {\n // Script running before body exists - wait for DOMContentLoaded\n document.addEventListener('DOMContentLoaded', appendToTarget, { once: true });\n }\n\n // Load editor SDK AFTER <smart-canvas> is created and appended.\n // The editor auto-inits and needs the shadow root to exist.\n if (sdkMode) {\n console.log(`[SmartCanvas] Loading editor SDK for ${sdkMode} mode`);\n loadEditorSdk(config.editorUrl).catch(console.error);\n }\n\n const experiments = config.integrations?.experiments;\n const telemetry = config.integrations?.telemetry;\n\n const fetcher =\n config.fetcher ??\n createCanvasConfigFetcher({\n configUri: config.configUri,\n experiments,\n featureKey: config.configUriFeatureKey,\n credentials: config.fetchCredentials,\n });\n\n if (!currentFetcher) {\n currentFetcher = fetcher;\n }\n\n const appProps: Omit<SmartCanvasAppProps, 'controller'> = {\n fetcher,\n pollIntervalMs: config.pollIntervalMs,\n experiments,\n telemetry,\n runtime,\n overlayFetcher: config.overlayFetcher,\n overlayConfigUri: config.overlayConfigUri,\n overlayConfigFeatureKey: config.overlayConfigFeatureKey,\n overlayFetchCredentials: config.overlayFetchCredentials,\n configUri: config.configUri,\n configUriFeatureKey: config.configUriFeatureKey,\n fetchCredentials: config.fetchCredentials,\n theme: config.theme,\n initialBatchHandle: currentBatchHandle,\n };\n\n host.mountReactApp(appProps);\n if (config.defaultOpen) {\n host.open();\n }\n\n const handle: SmartCanvasHandle = {\n el: host,\n open: () => host.open(),\n close: () => host.close(),\n destroy: () => {\n revertActions();\n host.remove();\n },\n setTokens: (tokens) => {\n for (const [key, value] of Object.entries(tokens)) {\n host.style.setProperty(key, value);\n }\n },\n getConfig: async () => {\n if (currentFetcher) {\n try {\n const freshConfig = await currentFetcher();\n currentConfig = freshConfig;\n return freshConfig;\n } catch (error) {\n console.error('[SmartCanvas] Error fetching config:', error);\n }\n }\n return currentConfig ?? ({ tiles: [], actions: [], fetchedAt: '' } as CanvasConfigResponse);\n },\n updateConfig: async (newConfig) => {\n console.log(\n '[SmartCanvas] updateConfig:',\n `tiles=${newConfig.tiles?.length ?? 0},`,\n `actions=${newConfig.actions?.length ?? 0},`,\n `enabled=${isEnabled}`\n );\n currentConfig = newConfig;\n if (newConfig.tiles && runtime?.accumulator) {\n registerConfigPredicates(newConfig.tiles, runtime.accumulator);\n }\n if (isEnabled) {\n try {\n await applyActions(newConfig.actions);\n console.log('[SmartCanvas] updateConfig actions applied successfully');\n } catch (error) {\n console.error('[SmartCanvas] updateConfig failed to apply actions:', error);\n }\n }\n // Propagate config into the React rendering pipeline so tiles mount\n // in the canvas drawer. Without this, the SmartCanvasApp never sees\n // the new tiles because it only reads from its fetcher prop.\n host.setOverrideFetcher(() => Promise.resolve(newConfig));\n },\n setEnabled: async (enabled) => {\n isEnabled = enabled;\n if (enabled) {\n if (currentConfig) {\n await applyActions(currentConfig.actions);\n }\n } else {\n await revertActions();\n }\n },\n setOverrideFetcher: (newFetcher) => {\n currentFetcher = newFetcher;\n host.setOverrideFetcher(newFetcher);\n // Register accumulator predicates from the new config so event_count\n // conditions work when config is loaded via setOverrideFetcher\n // (e.g. editor SDK draft loading).\n if (runtime?.accumulator) {\n newFetcher()\n .then((config) => {\n if (config?.tiles) {\n registerConfigPredicates(config.tiles, runtime.accumulator);\n }\n })\n .catch(() => {});\n }\n },\n registerTelemetryProperties: (properties) => {\n telemetry?.register?.(properties);\n },\n getSessionId: () => telemetry?.getSessionId?.(),\n startSessionRecording: () => {\n telemetry?.startSessionRecording?.();\n },\n track: (eventName, properties) => {\n if (!telemetry?.track) return false;\n telemetry.track(eventName, properties);\n return true;\n },\n runtime,\n };\n\n // Expose handle on SynOS \u2014 same namespace as React, appRegistry, etc.\n // Any app (editor, adaptives, tests) accesses it the same way.\n if (typeof window !== 'undefined') {\n const syn = (window as any).SynOS;\n if (syn) {\n syn.handle = handle;\n }\n }\n\n return handle;\n};\n\ndeclare global {\n interface Window {\n SmartCanvas?: {\n create(config?: SmartCanvasConfig): Promise<SmartCanvasHandle>;\n };\n }\n}\n\n// Export anti-flicker snippet for inline usage\nexport { getAntiFlickerSnippet } from './antiFlicker';\n\nif (typeof window !== 'undefined') {\n window.SmartCanvas = {\n async create(config?: SmartCanvasConfig) {\n return createSmartCanvas(config);\n },\n };\n}\n", "/**\n * GrowthBook adapter for the ExperimentClient interface.\n *\n * This file is INTERNAL - consumers should only import from experiments/types.ts\n * and use the ExperimentClient interface.\n */\n\nimport type { Experiment, Context as GrowthBookInitOptions, Result } from '@growthbook/growthbook';\nimport { GrowthBook } from '@growthbook/growthbook';\n\nimport type { TileConfig } from '../../types';\nimport type { ExperimentClient } from '../types';\n\n/**\n * Callback fired when a user is assigned to an experiment.\n */\nexport type ExperimentTrackingCallback = (\n experimentKey: string,\n variationId: number,\n variationName: string\n) => void;\n\n/**\n * Default API host for GrowthBook experiments.\n */\nexport const DEFAULT_EXPERIMENT_API_HOST = 'https://experiment.syntrologie.com';\n\nexport interface GrowthBookAdapterOptions extends GrowthBookInitOptions {\n /**\n * Existing GrowthBook instance to wrap.\n * If not provided, a new instance will be created.\n */\n client?: GrowthBook;\n\n /**\n * Auto-initialize with streaming enabled.\n */\n autoInit?: boolean;\n\n /**\n * Enable dev mode for URL parameter overrides and forced variations.\n * When true, allows ?syntro_exp=xxx&syntro_var=N to force specific variations.\n * @default true\n */\n enableDevMode?: boolean;\n\n /**\n * Callback fired when a user is assigned to an experiment.\n * Use this to send experiment data to your analytics provider.\n */\n onExperimentViewed?: ExperimentTrackingCallback;\n}\n\n/**\n * Internal adapter that implements ExperimentClient using GrowthBook.\n */\nexport class GrowthBookAdapter implements ExperimentClient {\n private readonly gb: GrowthBook;\n\n constructor(options: GrowthBookAdapterOptions = {}) {\n if (options.client) {\n this.gb = options.client;\n } else {\n // Set up tracking callback to bridge to telemetry\n const trackingCallback = options.onExperimentViewed\n ? (experiment: Experiment<unknown>, result: Result<unknown>) => {\n options.onExperimentViewed!(\n experiment.key,\n result.variationId,\n typeof result.value === 'string' ? result.value : `variation_${result.variationId}`\n );\n }\n : undefined;\n\n this.gb = new GrowthBook({\n ...options,\n apiHost: options.apiHost ?? DEFAULT_EXPERIMENT_API_HOST,\n // Enable dev mode for URL param overrides (?syntro_exp=xxx&syntro_var=N)\n // Set to false in production if you want to disable preview functionality\n enableDevMode: options.enableDevMode ?? true,\n // Wire up experiment tracking callback\n trackingCallback,\n });\n if (options.autoInit) {\n this.gb.init({ streaming: true });\n }\n }\n }\n\n /**\n * Access to the underlying GrowthBook instance.\n * Only use this internally - don't expose to consumers.\n */\n get _internal(): GrowthBook {\n return this.gb;\n }\n\n async refreshFeatures() {\n await this.gb.loadFeatures();\n }\n\n setAttributes(attrs: Record<string, unknown>) {\n this.gb.setAttributes(attrs);\n }\n\n setForcedVariations(variations: Record<string, number>) {\n this.gb.setForcedVariations(variations);\n }\n\n getFeatureValue<T>(key: string, fallback: T): T {\n return this.gb.getFeatureValue(key, fallback) as T;\n }\n\n getAllFeatures(): Record<string, unknown> {\n const features = this.gb.getFeatures();\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(features)) {\n result[key] = this.gb.getFeatureValue(key, null);\n }\n return result;\n }\n\n shouldRenderRectangle(_tile: TileConfig): boolean {\n // Legacy experiment-based filtering has been removed.\n // Tile visibility is now managed via WidgetRegistry and runtime.filterTiles().\n return true;\n }\n}\n\n/**\n * Create an ExperimentClient backed by GrowthBook.\n */\nexport function createGrowthBookClient(options: GrowthBookAdapterOptions = {}): ExperimentClient {\n return new GrowthBookAdapter(options);\n}\n", "/**\n * SessionMetricTracker - Real-time session-based metrics for segment targeting.\n *\n * This module tracks metrics during a user's session and updates GrowthBook\n * attributes in real-time, enabling instant segment targeting without waiting\n * for batch PostHog cohort computation.\n *\n * Use cases:\n * - \"Show action plan after 3+ button clicks in this session\"\n * - \"Target users who viewed 5+ products this session\"\n * - \"Trigger intervention when user hovers a CTA 2+ times\"\n */\n\nimport type { ExperimentClient } from '../experiments/types';\n\nconst STORAGE_KEY = 'syntro_session_metrics';\n\n/**\n * Session metric value stored in sessionStorage.\n */\ninterface SessionMetricValue {\n count: number;\n lastUpdated: number;\n}\n\n/**\n * Options for creating a SessionMetricTracker.\n */\nexport interface SessionMetricTrackerOptions {\n /**\n * The experiment client to update attributes on.\n * When a metric changes, the session_${metricKey} attribute is updated.\n */\n experiments?: ExperimentClient;\n\n /**\n * Prefix for attribute keys sent to GrowthBook.\n * @default \"session_\"\n */\n attributePrefix?: string;\n\n /**\n * Callback fired when any metric value changes.\n * Useful for debugging or custom integrations.\n */\n onMetricChange?: (key: string, newValue: number) => void;\n}\n\n/**\n * Tracks session-based metrics for real-time segment targeting.\n */\nexport class SessionMetricTracker {\n private metrics: Map<string, number> = new Map();\n private experiments?: ExperimentClient;\n private attributePrefix: string;\n private onMetricChange?: (key: string, newValue: number) => void;\n\n constructor(options: SessionMetricTrackerOptions = {}) {\n this.experiments = options.experiments;\n this.attributePrefix = options.attributePrefix ?? 'session_';\n this.onMetricChange = options.onMetricChange;\n\n // Restore metrics from sessionStorage\n this.loadFromStorage();\n }\n\n /**\n * Increment a metric by the specified amount.\n *\n * @param metricKey - The metric to increment (e.g., \"button_clicks\", \"page_views\")\n * @param amount - Amount to increment by (default: 1)\n * @returns The new metric value\n */\n increment(metricKey: string, amount = 1): number {\n const currentValue = this.metrics.get(metricKey) ?? 0;\n const newValue = currentValue + amount;\n\n this.metrics.set(metricKey, newValue);\n this.saveToStorage();\n\n // Update GrowthBook attributes for real-time targeting\n this.updateExperimentAttributes(metricKey, newValue);\n\n // Fire callback if configured\n this.onMetricChange?.(metricKey, newValue);\n\n return newValue;\n }\n\n /**\n * Set a metric to a specific value.\n *\n * @param metricKey - The metric to set\n * @param value - The value to set\n */\n set(metricKey: string, value: number): void {\n this.metrics.set(metricKey, value);\n this.saveToStorage();\n this.updateExperimentAttributes(metricKey, value);\n this.onMetricChange?.(metricKey, value);\n }\n\n /**\n * Get the current value of a metric.\n *\n * @param metricKey - The metric to get\n * @returns The current value (0 if not set)\n */\n get(metricKey: string): number {\n return this.metrics.get(metricKey) ?? 0;\n }\n\n /**\n * Check if a metric meets or exceeds a threshold.\n *\n * @param metricKey - The metric to check\n * @param threshold - The threshold value\n * @returns True if metric >= threshold\n */\n meetsThreshold(metricKey: string, threshold: number): boolean {\n return this.get(metricKey) >= threshold;\n }\n\n /**\n * Get all current metric values.\n *\n * @returns Record of metric keys to values\n */\n getAll(): Record<string, number> {\n return Object.fromEntries(this.metrics);\n }\n\n /**\n * Reset a specific metric to zero.\n *\n * @param metricKey - The metric to reset\n */\n reset(metricKey: string): void {\n this.metrics.delete(metricKey);\n this.saveToStorage();\n this.updateExperimentAttributes(metricKey, 0);\n this.onMetricChange?.(metricKey, 0);\n }\n\n /**\n * Reset all metrics (clear the session).\n */\n resetAll(): void {\n const keys = Array.from(this.metrics.keys());\n this.metrics.clear();\n this.saveToStorage();\n\n // Update all attributes to 0\n const attrs: Record<string, number> = {};\n for (const key of keys) {\n attrs[`${this.attributePrefix}${key}`] = 0;\n this.onMetricChange?.(key, 0);\n }\n this.experiments?.setAttributes?.(attrs);\n }\n\n /**\n * Update the experiment client (useful if experiments client changes).\n */\n setExperiments(experiments: ExperimentClient): void {\n this.experiments = experiments;\n // Sync all current metrics to the new experiment client\n this.syncAllToExperiments();\n }\n\n // ==================== Private Methods ====================\n\n private updateExperimentAttributes(metricKey: string, value: number): void {\n if (!this.experiments?.setAttributes) return;\n\n const attributeKey = `${this.attributePrefix}${metricKey}`;\n this.experiments.setAttributes({ [attributeKey]: value });\n }\n\n private syncAllToExperiments(): void {\n if (!this.experiments?.setAttributes) return;\n\n const attrs: Record<string, number> = {};\n for (const [key, value] of this.metrics) {\n attrs[`${this.attributePrefix}${key}`] = value;\n }\n this.experiments.setAttributes(attrs);\n }\n\n private loadFromStorage(): void {\n if (typeof window === 'undefined' || typeof sessionStorage === 'undefined') return;\n\n try {\n const stored = sessionStorage.getItem(STORAGE_KEY);\n if (stored) {\n const data: Record<string, SessionMetricValue> = JSON.parse(stored);\n for (const [key, value] of Object.entries(data)) {\n this.metrics.set(key, value.count);\n }\n }\n } catch (err) {\n console.warn('[SessionMetricTracker] Failed to load from sessionStorage:', err);\n }\n }\n\n private saveToStorage(): void {\n if (typeof window === 'undefined' || typeof sessionStorage === 'undefined') return;\n\n try {\n const data: Record<string, SessionMetricValue> = {};\n for (const [key, count] of this.metrics) {\n data[key] = { count, lastUpdated: Date.now() };\n }\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n } catch (err) {\n console.warn('[SessionMetricTracker] Failed to save to sessionStorage:', err);\n }\n }\n}\n\n/**\n * Create a SessionMetricTracker instance.\n */\nexport function createSessionMetricTracker(\n options: SessionMetricTrackerOptions = {}\n): SessionMetricTracker {\n return new SessionMetricTracker(options);\n}\n", "/**\n * No-op adapter for the TelemetryClient interface.\n *\n * Used when telemetry is disabled (e.g. demo mode with t=\"noop\").\n * All tracking methods silently do nothing. Session/distinct IDs\n * return stable values so downstream code that reads them still works.\n */\nimport type { CanvasSurface, TelemetryClient } from '../types';\n\nfunction randomId(): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let id = '';\n for (let i = 0; i < 16; i++) {\n id += chars[Math.floor(Math.random() * chars.length)];\n }\n return id;\n}\n\nclass NoopAdapter implements TelemetryClient {\n private readonly sessionId: string;\n\n constructor() {\n this.sessionId = randomId();\n console.log(\n `[Syntro Telemetry] Using noop adapter (no telemetry configured). sessionId=${this.sessionId}`\n );\n }\n\n trackCanvasOpened(_surface: CanvasSurface): void {}\n trackCanvasClosed(_surface: CanvasSurface): void {}\n trackRectangleViewed(_rectangleId: string, _surface: CanvasSurface): void {}\n trackAction(_action: string, _rectangleId: string, _surface: CanvasSurface): void {}\n\n register(_properties: Record<string, unknown>): void {}\n getSessionId(): string {\n return this.sessionId;\n }\n startSessionRecording(): void {}\n trackExperiment(_key: string, _variationId: number, _variationName?: string): void {}\n setPersonProperties(_properties: Record<string, unknown>): void {}\n setPersonPropertiesOnce(_properties: Record<string, unknown>): void {}\n\n getDistinctId(): string {\n return 'demo-user';\n }\n\n getAllFeatureFlags(): Record<string, boolean | string> {\n return {};\n }\n\n getSegmentFlags(): Record<string, boolean> {\n return {};\n }\n\n track(_eventName: string, _properties?: Record<string, unknown>): void {}\n}\n\n/**\n * Create a TelemetryClient that silently discards all events.\n */\nexport function createNoopClient(): TelemetryClient {\n return new NoopAdapter();\n}\n", "/**\n * PostHog adapter for the TelemetryClient interface.\n *\n * This file is INTERNAL - consumers should only import from telemetry/types.ts\n * and use the TelemetryClient interface.\n */\nimport type { PostHog, Properties } from 'posthog-js';\nimport posthog from 'posthog-js';\n\nimport type { ConsentGate } from '../consent';\nimport type { CanvasSurface, TelemetryClient } from '../types';\n\nexport interface PostHogAdapterOptions {\n /**\n * PostHog API key.\n */\n apiKey?: string;\n\n /**\n * PostHog API host.\n * @default \"https://telemetry.syntrologie.com\"\n */\n apiHost?: string;\n\n /**\n * Existing PostHog client to wrap.\n */\n client?: PostHog;\n\n /**\n * Enable full-page autocapture (clicks, form submissions, etc.)\n * @default true\n */\n autocapture?: boolean;\n\n /**\n * Enable session recording.\n * @default true\n */\n sessionRecording?: boolean;\n\n /**\n * Enable pageview capture.\n * @default true\n */\n capturePageview?: boolean;\n\n /**\n * Enable page leave capture.\n * @default true\n */\n capturePageleave?: boolean;\n\n /**\n * Enable PostHog feature flags for segment membership.\n * When true, PostHog's /decide endpoint is called to get segment flags.\n * These flags (in_segment_*) are used for segment-based targeting.\n *\n * @default true\n */\n enableFeatureFlags?: boolean;\n\n /**\n * Callback when PostHog feature flags are loaded.\n * Used to update GrowthBook attributes with segment membership.\n */\n onFeatureFlagsLoaded?: (flags: Record<string, boolean | string>) => void;\n\n /**\n * Callback when any event is captured by PostHog.\n * Used to feed events into the EventBus for runtime decisions.\n */\n onCapture?: (eventName: string, properties?: Record<string, unknown>) => void;\n\n /**\n * Consent gate for GDPR compliance.\n * When provided with requireExplicitConsent, PostHog initialization is\n * deferred until consent is granted.\n */\n consent?: ConsentGate;\n\n /**\n * Require explicit consent before initializing PostHog.\n * When true, PostHog will not init until consent.grant() is called.\n * @default false\n */\n requireExplicitConsent?: boolean;\n}\n\ninterface CanvasAnalyticsPayload extends Properties {\n rectangleId?: string;\n surface?: CanvasSurface;\n}\n\n/**\n * Internal adapter that implements TelemetryClient using PostHog.\n */\nexport class PostHogAdapter implements TelemetryClient {\n private client?: PostHog;\n private featureFlagsCallback?: (flags: Record<string, boolean | string>) => void;\n private captureCallback?: (eventName: string, properties?: Record<string, unknown>) => void;\n private consentUnsub?: () => void;\n\n constructor(readonly options: PostHogAdapterOptions = {}) {\n this.client = options.client;\n this.featureFlagsCallback = options.onFeatureFlagsLoaded;\n this.captureCallback = options.onCapture;\n\n // Consent gating: defer init until consent is granted\n if (\n !this.client &&\n options.consent &&\n options.requireExplicitConsent &&\n typeof window !== 'undefined' &&\n options.apiKey\n ) {\n const consent = options.consent;\n const currentStatus = consent.getStatus();\n\n if (currentStatus === 'granted') {\n // Already granted \u2014 init now\n this.initPostHog();\n }\n\n // Always subscribe for future consent transitions (grant\u2192deny\u2192re-grant)\n this.consentUnsub = consent.subscribe((status) => {\n if (status === 'granted') {\n if (!this.client) {\n this.initPostHog();\n } else {\n this.client.opt_in_capturing();\n }\n } else if (status === 'denied' && this.client) {\n this.client.opt_out_capturing();\n }\n });\n return;\n }\n\n if (!this.client && typeof window !== 'undefined' && options.apiKey) {\n this.initPostHog();\n }\n }\n\n /**\n * Initialize the PostHog client. Called immediately (no consent gate)\n * or deferred (when consent gate grants).\n */\n private initPostHog(): void {\n const options = this.options;\n if (!options.apiKey) return;\n\n // Determine if we should enable feature flags (for segment membership)\n // Default: true (enabled) to support segment targeting via /decide\n const enableFeatureFlags = options.enableFeatureFlags ?? true;\n\n // Use a named instance so we don't clobber the customer's global PostHog.\n // posthog.init() with a 3rd arg returns an isolated instance.\n const instanceName = `syntro_${options.apiKey.slice(-6) || 'sdk'}`;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.client = posthog.init(\n options.apiKey,\n {\n api_host: options.apiHost ?? 'https://telemetry.syntrologie.com',\n // Feature flags for segment membership (in_segment_* flags)\n // When enabled, /decide is called to get segment flags\n advanced_disable_feature_flags: !enableFeatureFlags,\n advanced_disable_feature_flags_on_first_load: !enableFeatureFlags,\n // Full-page tracking - all ON by default\n autocapture: options.autocapture ?? true,\n capture_pageview: options.capturePageview ?? true,\n capture_pageleave: options.capturePageleave ?? true,\n disable_session_recording: !(options.sessionRecording ?? true),\n // CRITICAL: Disable user agent filtering to allow headless Chrome\n // PostHog blocks \"HeadlessChrome\" user agents by default as bot detection\n // This enables session recording in Playwright/crawler sessions\n opt_out_useragent_filter: true,\n // Cross-domain iframe recording for embeds\n session_recording: {\n recordCrossDomainIFrames: true,\n },\n // Capture performance metrics\n capture_performance: true,\n // Enable web vitals\n enable_recording_console_log: true,\n // Bootstrap callback for when flags are loaded\n loaded: (ph: PostHog) => {\n if (enableFeatureFlags && this.featureFlagsCallback) {\n // Register callback for when feature flags are ready\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (ph as any).onFeatureFlags(() => {\n const allFlags = this.getAllFeatureFlags();\n if (allFlags && this.featureFlagsCallback) {\n this.featureFlagsCallback(allFlags);\n }\n });\n\n // If flags already loaded before callback was registered, fire immediately\n const existingFlags = this.getAllFeatureFlags();\n if (existingFlags && Object.keys(existingFlags).length > 0) {\n this.featureFlagsCallback(existingFlags);\n }\n }\n\n // Wire up capture callback to feed events into EventBus\n if (this.captureCallback) {\n // PostHog's eventCaptured passes a single CaptureResult object:\n // { uuid, event, properties, $set, $set_once, timestamp }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (ph as any).on('eventCaptured', (data: any) => {\n const eventName = typeof data === 'string' ? data : data?.event;\n const properties = typeof data === 'string' ? undefined : data?.properties;\n if (typeof eventName === 'string') {\n this.captureCallback?.(eventName, properties);\n }\n });\n }\n },\n } as any,\n instanceName\n ) as PostHog;\n }\n\n /**\n * Get all feature flags from PostHog.\n * Used to extract segment membership flags (in_segment_*).\n */\n getAllFeatureFlags(): Record<string, boolean | string> | undefined {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const flags = (this.client as any)?.featureFlags?.getFlagVariants?.();\n return flags;\n }\n\n /**\n * Get segment membership flags (in_segment_*) from PostHog.\n */\n getSegmentFlags(): Record<string, boolean> {\n const allFlags = this.getAllFeatureFlags();\n if (!allFlags) return {};\n\n const segmentFlags: Record<string, boolean> = {};\n for (const [key, value] of Object.entries(allFlags)) {\n if (key.startsWith('in_segment_')) {\n segmentFlags[key] = value === true;\n }\n }\n return segmentFlags;\n }\n\n identify(id: string, props?: Properties) {\n this.client?.identify(id, props);\n }\n\n alias(id: string, aliasId: string) {\n this.client?.alias(id, aliasId);\n }\n\n track(eventName: string, payload?: CanvasAnalyticsPayload) {\n this.client?.capture(eventName, payload);\n }\n\n trackCanvasOpened(surface: CanvasSurface) {\n this.track('shadow_canvas_opened', { surface });\n }\n\n trackCanvasClosed(surface: CanvasSurface) {\n this.track('shadow_canvas_closed', { surface });\n }\n\n trackRectangleViewed(rectangleId: string, surface: CanvasSurface) {\n this.track('shadow_canvas_rectangle_viewed', { rectangleId, surface });\n }\n\n trackAction(action: string, rectangleId: string, surface: CanvasSurface) {\n this.track('shadow_canvas_action', { action, rectangleId, surface });\n }\n\n register(properties: Record<string, unknown>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.client as any)?.register?.(properties);\n }\n\n getSessionId(): string | undefined {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (this.client as any)?.get_session_id?.();\n }\n\n startSessionRecording(): void {\n // Force start recording - bypasses bot detection for crawler sessions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.client as any)?.startSessionRecording?.();\n }\n\n trackExperiment(experimentKey: string, variationId: number, variationName?: string): void {\n // Register as super property so all subsequent events include experiment data\n const experimentProperty = `$experiment_${experimentKey}`;\n this.register({\n [experimentProperty]: variationName ?? `variation_${variationId}`,\n [`${experimentProperty}_id`]: variationId,\n });\n\n // Fire discrete event for experiment assignment tracking\n this.track('$experiment_started', {\n $experiment_key: experimentKey,\n $experiment_variation_id: variationId,\n $experiment_variation_name: variationName ?? `variation_${variationId}`,\n });\n }\n\n setPersonProperties(properties: Record<string, unknown>): void {\n // PostHog's $set event sets person properties\n this.client?.capture('$set', { $set: properties });\n }\n\n setPersonPropertiesOnce(properties: Record<string, unknown>): void {\n // PostHog's $set_once only sets if property doesn't exist\n this.client?.capture('$set', { $set_once: properties });\n }\n\n getDistinctId(): string | undefined {\n // PostHog's get_distinct_id returns the current user's ID\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (this.client as any)?.get_distinct_id?.();\n }\n}\n\n/**\n * Create a TelemetryClient backed by PostHog.\n */\nexport function createPostHogClient(options: PostHogAdapterOptions = {}): TelemetryClient {\n return new PostHogAdapter(options);\n}\n", "/**\n * Core Flow Executors\n *\n * Executors for core:sequence, core:parallel, and core:wait action kinds.\n * These enable composing actions into ordered/parallel flows with waits.\n */\n\nimport type {\n ActionExecutor,\n ActionHandle,\n ExecutorResult,\n ParallelAction,\n SequenceAction,\n WaitAction,\n} from '../types';\n\n/**\n * Execute actions in sequence, awaiting each one's completion.\n */\nexport const executeSequence: ActionExecutor<SequenceAction> = async (action, context) => {\n const handles: ActionHandle[] = [];\n\n if (context.applyAction) {\n for (const childAction of action.actions) {\n const handle = await context.applyAction(childAction);\n handles.push(handle);\n }\n }\n\n return {\n cleanup: async () => {\n // Revert in reverse order\n for (let i = handles.length - 1; i >= 0; i--) {\n try {\n await handles[i].revert();\n } catch {\n // Ignore cleanup errors\n }\n }\n },\n };\n};\n\n/**\n * Execute actions in parallel.\n */\nexport const executeParallel: ActionExecutor<ParallelAction> = async (action, context) => {\n const handles: ActionHandle[] = [];\n\n if (context.applyAction) {\n const promises = action.actions.map((childAction) => context.applyAction!(childAction));\n\n if (action.waitFor === 'any') {\n // Complete when the first action finishes\n const firstHandle = await Promise.race(promises);\n handles.push(firstHandle);\n // Still collect remaining handles for cleanup\n const remaining = await Promise.allSettled(promises);\n for (const result of remaining) {\n if (result.status === 'fulfilled' && result.value !== firstHandle) {\n handles.push(result.value);\n }\n }\n } else {\n // Default: wait for all\n const allHandles = await Promise.all(promises);\n handles.push(...allHandles);\n }\n }\n\n return {\n cleanup: async () => {\n for (const handle of handles) {\n try {\n await handle.revert();\n } catch {\n // Ignore cleanup errors\n }\n }\n },\n };\n};\n\n/**\n * Wait for a duration or an event on the EventBus.\n */\nexport const executeWait: ActionExecutor<WaitAction> = async (action, context) => {\n let unsubscribe: (() => void) | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let cancelled = false;\n\n const result: ExecutorResult = {\n cleanup: () => {\n cancelled = true;\n if (timeoutId) clearTimeout(timeoutId);\n if (unsubscribe) unsubscribe();\n },\n };\n\n // If waiting for an event, subscribe and return when it fires\n if (action.event && context.subscribeEvent) {\n await new Promise<void>((resolve) => {\n unsubscribe = context.subscribeEvent!(action.event!, () => {\n if (!cancelled) resolve();\n });\n\n // If also has durationMs, use as timeout\n if (action.durationMs !== undefined) {\n timeoutId = setTimeout(() => {\n if (!cancelled) resolve();\n }, action.durationMs);\n }\n });\n } else if (action.durationMs !== undefined) {\n // Simple duration wait\n await new Promise<void>((resolve) => {\n timeoutId = setTimeout(() => {\n if (!cancelled) resolve();\n }, action.durationMs);\n });\n }\n\n return result;\n};\n", "/**\n * Tour Executor\n *\n * Orchestrates sequential tour steps with cross-page state persistence.\n * Tours can span multiple pages and resume after navigation.\n *\n * Each step contains an inner action (modal, tooltip) that gets executed.\n * The tour listens for CTA click events to advance to the next step.\n */\n\nimport type { ActionExecutor, ActionHandle, ExecutorResult, TourAction, TourStep } from '../types';\n\n/** Storage key for active tour state */\nconst ACTIVE_TOUR_KEY = 'syntro_active_tour';\n\n/** Track active tour executors to prevent duplicates */\nconst activeTours = new Map<string, { cleanup: () => Promise<void> }>();\n\n/** Tour state persisted to localStorage */\ninterface TourState {\n tourId: string;\n currentStepId: string;\n startedAt: number;\n}\n\n/**\n * Get active tour state from localStorage\n */\nfunction getTourState(tourId: string): TourState | null {\n try {\n const data = localStorage.getItem(ACTIVE_TOUR_KEY);\n if (!data) return null;\n const state = JSON.parse(data) as TourState;\n // Only return if it matches the requested tour\n if (state.tourId !== tourId) return null;\n return state;\n } catch {\n return null;\n }\n}\n\n/**\n * Save tour state to localStorage\n */\nfunction saveTourState(state: TourState): void {\n try {\n localStorage.setItem(ACTIVE_TOUR_KEY, JSON.stringify(state));\n } catch {\n // Storage may be full or unavailable\n }\n}\n\n/**\n * Clear tour state from localStorage\n */\nfunction clearTourState(): void {\n try {\n localStorage.removeItem(ACTIVE_TOUR_KEY);\n } catch {\n // Ignore errors\n }\n}\n\n/**\n * Get current route/path\n */\nfunction getCurrentRoute(): string {\n return window.location.pathname;\n}\n\n/**\n * Check if a step matches the current route\n */\nfunction stepMatchesRoute(step: TourStep): boolean {\n if (!step.route) return true;\n const currentRoute = getCurrentRoute();\n // Simple pattern matching - step.route can be exact path or glob pattern\n if (step.route.includes('*')) {\n const pattern = new RegExp(`^${step.route.replace(/\\*/g, '.*')}$`);\n return pattern.test(currentRoute);\n }\n return currentRoute === step.route;\n}\n\n/**\n * Execute a tour action\n *\n * Tours orchestrate a sequence of steps, persisting state to localStorage\n * to support cross-page navigation. Each step contains an action to execute\n * and optionally defines transitions based on action events.\n */\nexport const executeTour: ActionExecutor<TourAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const { tourId, steps, startStep, autoStart = true } = action;\n\n if (steps.length === 0) {\n throw new Error(`Tour \"${tourId}\" has no steps`);\n }\n\n // Self-guard: if this tour is already running, return no-op\n // This prevents duplicate modals when applyBatch is called multiple times\n if (activeTours.has(tourId)) {\n return {\n cleanup: async () => {\n // Delegate to the original tour's cleanup\n const existing = activeTours.get(tourId);\n if (existing) {\n await existing.cleanup();\n }\n },\n };\n }\n\n // Check if we can execute inner actions\n if (!context.applyAction) {\n throw new Error('Tour executor requires applyAction in context');\n }\n\n // Get or initialize tour state\n let state = getTourState(tourId);\n const isResumingTour = !!state;\n\n // If not resuming and autoStart is false, don't start the tour\n if (!isResumingTour && !autoStart) {\n return {\n cleanup: () => {},\n };\n }\n\n if (!state) {\n state = {\n tourId,\n currentStepId: startStep || steps[0].id,\n startedAt: Date.now(),\n };\n saveTourState(state);\n }\n\n // Find the current step\n let currentStepIndex = steps.findIndex((s) => s.id === state!.currentStepId);\n if (currentStepIndex === -1) {\n // Step not found, use startStep or first step\n const initialStepId = startStep || steps[0].id;\n currentStepIndex = steps.findIndex((s) => s.id === initialStepId);\n if (currentStepIndex === -1) currentStepIndex = 0;\n state.currentStepId = steps[currentStepIndex].id;\n saveTourState(state);\n }\n\n const currentStep = steps[currentStepIndex];\n\n // Check if current step matches the route\n if (!stepMatchesRoute(currentStep)) {\n // Current page doesn't match this step's route\n // Tour is \"waiting\" for navigation to the correct page\n context.publishEvent('tour.waiting_for_route', {\n tourId,\n stepId: currentStep.id,\n expectedRoute: currentStep.route,\n currentRoute: getCurrentRoute(),\n });\n\n // Return a no-op that cleans up when tour ends\n return {\n cleanup: () => {},\n };\n }\n\n // Track state\n let isDestroyed = false;\n let currentActionHandle: ActionHandle | null = null;\n let eventUnsubscribe: (() => void) | null = null;\n let routeWatcher: (() => void) | null = null;\n\n /**\n * Clean up current step\n */\n const cleanupCurrentStep = async () => {\n if (eventUnsubscribe) {\n eventUnsubscribe();\n eventUnsubscribe = null;\n }\n if (currentActionHandle?.isApplied()) {\n await currentActionHandle.revert();\n currentActionHandle = null;\n }\n };\n\n /**\n * Advance to the next step\n */\n const advanceToStep = async (nextStepId: string | 'end') => {\n if (isDestroyed) return;\n\n // Clean up current step\n await cleanupCurrentStep();\n\n if (nextStepId === 'end') {\n // Tour complete\n clearTourState();\n context.publishEvent('tour.completed', {\n tourId,\n totalSteps: steps.length,\n });\n isDestroyed = true;\n return;\n }\n\n // Find next step\n const nextStep = steps.find((s) => s.id === nextStepId);\n if (!nextStep) {\n console.error(`[Tour] Step \"${nextStepId}\" not found`);\n return;\n }\n\n // Update state\n state!.currentStepId = nextStepId;\n saveTourState(state!);\n\n context.publishEvent('tour.step_changed', {\n tourId,\n previousStepId: currentStep.id,\n nextStepId,\n });\n\n // If the next step has a different route, let navigation happen\n if (nextStep.route && nextStep.route !== getCurrentRoute()) {\n context.publishEvent('tour.awaiting_navigation', {\n tourId,\n stepId: nextStepId,\n targetRoute: nextStep.route,\n });\n // Tour will resume when page reloads and this executor runs again\n return;\n }\n\n // Execute the next step's action\n await executeStep(nextStep);\n };\n\n /**\n * Execute a step's inner action and set up event listeners\n */\n const executeStep = async (step: TourStep) => {\n if (isDestroyed) return;\n\n context.publishEvent('tour.step_started', {\n tourId,\n stepId: step.id,\n stepIndex: steps.findIndex((s) => s.id === step.id),\n totalSteps: steps.length,\n });\n\n // Execute the inner action\n try {\n currentActionHandle = await context.applyAction!(step.action);\n } catch (error) {\n console.error(`[Tour] Failed to execute step \"${step.id}\":`, error);\n context.publishEvent('tour.step_failed', {\n tourId,\n stepId: step.id,\n error: String(error),\n });\n return;\n }\n\n // Subscribe to CTA click events if there are transitions defined\n if (step.onAction && context.subscribeEvent) {\n eventUnsubscribe = context.subscribeEvent('action.modal_cta_clicked', (props) => {\n const actionId = props?.actionId as string;\n if (actionId && step.onAction) {\n const nextStepId = step.onAction[actionId];\n if (nextStepId) {\n advanceToStep(nextStepId);\n }\n }\n });\n\n // Also listen for tooltip CTA clicks\n const tooltipUnsubscribe = context.subscribeEvent('action.tooltip_cta_clicked', (props) => {\n const actionId = props?.actionId as string;\n if (actionId && step.onAction) {\n const nextStepId = step.onAction[actionId];\n if (nextStepId) {\n advanceToStep(nextStepId);\n }\n }\n });\n\n // Combine unsubscribes\n const originalUnsubscribe = eventUnsubscribe;\n eventUnsubscribe = () => {\n originalUnsubscribe();\n tooltipUnsubscribe();\n };\n }\n };\n\n // Set up route change watcher for SPAs\n const setupRouteWatcher = () => {\n let lastPath = getCurrentRoute();\n\n const checkRoute = () => {\n const currentPath = getCurrentRoute();\n if (currentPath !== lastPath) {\n lastPath = currentPath;\n context.publishEvent('tour.route_changed', {\n tourId,\n newRoute: currentPath,\n });\n }\n };\n\n // Use NavigationMonitor if available (single patch point),\n // otherwise fall back to direct History API patching (legacy)\n if (context.subscribeNavigation) {\n return context.subscribeNavigation(() => checkRoute());\n }\n\n // Legacy: direct History API patching\n window.addEventListener('popstate', checkRoute);\n\n const origPushState = history.pushState.bind(history);\n const origReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args) => {\n origPushState(...args);\n queueMicrotask(checkRoute);\n };\n\n history.replaceState = (...args) => {\n origReplaceState(...args);\n queueMicrotask(checkRoute);\n };\n\n return () => {\n window.removeEventListener('popstate', checkRoute);\n history.pushState = origPushState;\n history.replaceState = origReplaceState;\n };\n };\n\n routeWatcher = setupRouteWatcher();\n\n // Publish tour started/resumed event\n if (!isResumingTour) {\n context.publishEvent('tour.started', {\n tourId,\n totalSteps: steps.length,\n startStepId: state.currentStepId,\n });\n } else {\n context.publishEvent('tour.resumed', {\n tourId,\n stepId: state.currentStepId,\n });\n }\n\n // Execute the current step\n await executeStep(currentStep);\n\n // Create cleanup function\n const cleanup = async () => {\n isDestroyed = true;\n\n // Remove from active tours\n activeTours.delete(tourId);\n\n await cleanupCurrentStep();\n\n if (routeWatcher) {\n routeWatcher();\n }\n\n // Don't clear tour state on cleanup - allow resume\n context.publishEvent('tour.paused', {\n tourId,\n stepId: state!.currentStepId,\n });\n };\n\n // Register this tour as active\n activeTours.set(tourId, { cleanup });\n\n return { cleanup };\n};\n", "/**\n * Action Executor Registry\n *\n * Extensible registry that maps action kinds to their executor functions.\n * Apps can register custom executors at runtime.\n *\n * Core app executors are imported from their respective app packages.\n */\n\n// Import executors from CORE app packages only (bundled with runtime)\n// Lazy apps (gamification, faq, nav) are loaded dynamically from CDN\nimport { executors as contentExecutors } from '@syntrologie/adapt-content/runtime';\nimport { executors as overlayExecutors } from '@syntrologie/adapt-overlays/runtime';\nimport type { ZodSchema } from 'zod';\n\nimport type {\n ActionExecutor,\n ActionKind,\n ActionStep,\n ValidationError,\n ValidationResult,\n} from '../types';\n\nimport { executeParallel, executeSequence, executeWait } from './core-flow';\nimport { executeTour } from './tour';\n\n/**\n * Registration entry for an executor.\n */\nexport interface ExecutorRegistration {\n kind: string;\n executor: ActionExecutor<any>;\n schema?: ZodSchema;\n source: string; // App ID that registered this executor\n isBuiltIn: boolean; // Whether this is from a built-in app (prevents override)\n}\n\n/**\n * Extensible registry for action executors.\n *\n * Core executors (setText, highlight, etc.) are registered synchronously\n * at construction time for immediate availability - no async loading.\n *\n * External app executors are registered when apps activate.\n */\nexport class ExecutorRegistry {\n private executors = new Map<string, ExecutorRegistration>();\n\n /**\n * Constructor - registers core executors synchronously.\n * These are available IMMEDIATELY when the module loads,\n * enabling instant action execution without waiting for app activation.\n */\n constructor() {\n // Register all executors from core app packages\n for (const { kind, executor } of contentExecutors) {\n this.registerCore(kind, executor as ActionExecutor<any>);\n }\n for (const { kind, executor } of overlayExecutors) {\n this.registerCore(kind, executor as ActionExecutor<any>);\n }\n // NOTE: Lazy apps (gamification, faq, nav) are NOT registered here.\n // They are loaded dynamically from CDN via AppLoader when config requires them.\n\n // core:mountWidget is handled specially in ActionEngine since it delegates to Surfaces\n this.registerCore('core:mountWidget', async () => {\n throw new Error('core:mountWidget must be handled by ActionEngine');\n });\n\n // Register core flow executors (sequence, parallel, wait)\n this.registerCore('core:sequence', executeSequence);\n this.registerCore('core:parallel', executeParallel);\n this.registerCore('core:wait', executeWait);\n\n // Register core:tour executor\n this.registerCore('core:tour', executeTour);\n }\n\n /**\n * Register a core executor (synchronous, built-in, cannot be overridden).\n */\n private registerCore(kind: string, executor: ActionExecutor<any>, schema?: ZodSchema): void {\n this.executors.set(kind, {\n kind,\n executor,\n schema,\n source: 'core',\n isBuiltIn: true,\n });\n }\n\n /**\n * Register an executor for an action kind.\n *\n * @param kind - The action kind (e.g., \"gamification:awardBadge\")\n * @param executor - The executor function\n * @param schema - Optional Zod schema for validation\n * @param source - The source app ID (for tracking)\n * @param isBuiltIn - Whether this is from a built-in app (prevents override)\n */\n register(\n kind: string,\n executor: ActionExecutor<any>,\n schema?: ZodSchema,\n source: string = 'custom',\n isBuiltIn: boolean = false\n ): void {\n if (this.executors.has(kind)) {\n const existing = this.executors.get(kind)!;\n if (existing.isBuiltIn) {\n // Silently skip \u2014 app is re-registering an executor already bundled\n // with the runtime. This happens when adaptive CDN bundles activate\n // for apps whose executors are also compiled into the core bundle.\n return;\n }\n console.warn(`[ExecutorRegistry] Overriding executor for kind: ${kind} (source: ${source})`);\n }\n\n console.log(`[ExecutorRegistry] Registered executor: ${kind} (source: ${source})`);\n this.executors.set(kind, {\n kind,\n executor,\n schema,\n source,\n isBuiltIn,\n });\n }\n\n /**\n * Unregister an executor.\n *\n * @param kind - The action kind to unregister\n * @returns true if the executor was unregistered, false if not found or built-in\n */\n unregister(kind: string): boolean {\n const existing = this.executors.get(kind);\n if (!existing) {\n return false;\n }\n\n if (existing.isBuiltIn) {\n console.warn(`[ExecutorRegistry] Cannot unregister built-in executor: ${kind}`);\n return false;\n }\n\n this.executors.delete(kind);\n return true;\n }\n\n /**\n * Unregister all executors from a specific source.\n *\n * @param source - The source app ID\n */\n unregisterBySource(source: string): void {\n for (const [kind, registration] of this.executors.entries()) {\n if (registration.source === source) {\n this.executors.delete(kind);\n }\n }\n }\n\n /**\n * Get the executor for an action kind.\n */\n get(kind: string): ActionExecutor<ActionStep> | undefined {\n return this.executors.get(kind)?.executor;\n }\n\n /**\n * Get the full registration for an action kind.\n */\n getRegistration(kind: string): ExecutorRegistration | undefined {\n return this.executors.get(kind);\n }\n\n /**\n * Check if an executor exists for a given action kind.\n */\n has(kind: string): boolean {\n return this.executors.has(kind);\n }\n\n /**\n * Validate an action using its registered schema.\n *\n * @param action - The action to validate\n * @returns Validation result\n */\n validate(action: unknown): ValidationResult {\n const errors: ValidationError[] = [];\n\n if (!action || typeof action !== 'object') {\n errors.push({\n code: 'INVALID_ACTION',\n message: 'Action must be an object',\n });\n return { valid: false, errors, warnings: [] };\n }\n\n const { kind } = action as any;\n if (!kind || typeof kind !== 'string') {\n errors.push({\n code: 'MISSING_KIND',\n message: \"Action must have a 'kind' property\",\n });\n return { valid: false, errors, warnings: [] };\n }\n\n const registration = this.executors.get(kind);\n if (!registration) {\n errors.push({\n code: 'UNKNOWN_KIND',\n message: `Unknown action kind: ${kind}`,\n field: 'kind',\n });\n return { valid: false, errors, warnings: [] };\n }\n\n // If schema is provided, validate against it\n if (registration.schema) {\n const result = registration.schema.safeParse(action);\n if (!result.success) {\n for (const issue of result.error.issues) {\n errors.push({\n code: 'SCHEMA_VALIDATION_ERROR',\n message: issue.message,\n field: issue.path.join('.'),\n });\n }\n return { valid: false, errors, warnings: [] };\n }\n }\n\n return { valid: true, errors: [], warnings: [] };\n }\n\n /**\n * List all registered action kinds.\n */\n list(): string[] {\n return Array.from(this.executors.keys());\n }\n\n /**\n * List all registrations.\n */\n listRegistrations(): ExecutorRegistration[] {\n return Array.from(this.executors.values());\n }\n\n /**\n * Get all built-in action kinds.\n */\n getBuiltInKinds(): string[] {\n return Array.from(this.executors.entries())\n .filter(([, reg]) => reg.isBuiltIn)\n .map(([kind]) => kind);\n }\n\n /**\n * Get all custom action kinds.\n */\n getCustomKinds(): string[] {\n return Array.from(this.executors.entries())\n .filter(([, reg]) => !reg.isBuiltIn)\n .map(([kind]) => kind);\n }\n}\n\n// ============================================================================\n// Singleton and backwards-compatible exports\n// ============================================================================\n\n/**\n * Default singleton instance of ExecutorRegistry.\n */\nexport const executorRegistry = new ExecutorRegistry();\n\n/**\n * Get the executor for an action kind.\n * @deprecated Use executorRegistry.get() instead\n */\nexport function getExecutor(kind: ActionKind | string): ActionExecutor<ActionStep> | undefined {\n return executorRegistry.get(kind);\n}\n\n/**\n * Check if an executor exists for a given action kind.\n * @deprecated Use executorRegistry.has() instead\n */\nexport function hasExecutor(kind: ActionKind | string): boolean {\n return executorRegistry.has(kind);\n}\n\n// Re-export individual executors from app packages for backwards compatibility\nexport {\n executeAddClass,\n executeInsertHtml,\n executeRemoveClass,\n executeSetAttr,\n executeSetStyle,\n executeSetText,\n} from '@syntrologie/adapt-content/runtime';\n\nexport {\n executeBadge,\n executeHighlight,\n executeModal,\n executePulse,\n executeTooltip,\n} from '@syntrologie/adapt-overlays/runtime';\n\n// NOTE: Lazy app executors (gamification, faq, nav) are NOT re-exported here.\n// They are loaded dynamically from CDN via AppLoader when config requires them.\n\n// Core executors\nexport { executeParallel, executeSequence, executeWait } from './core-flow';\nexport { executeTour } from './tour';\n", "/**\n * Action Validation\n *\n * Validates action steps before execution.\n */\n\nimport { executorRegistry, hasExecutor } from './executors';\nimport type { ActionStep, ValidationError, ValidationResult, ValidationWarning } from './types';\n\n/** Dangerous attribute names that should not be set */\nconst DANGEROUS_ATTRS = new Set([\n 'onclick',\n 'onerror',\n 'onload',\n 'onmouseover',\n 'onfocus',\n 'onblur',\n 'onchange',\n 'onsubmit',\n 'onkeydown',\n 'onkeyup',\n 'onkeypress',\n]);\n\n/** Maximum HTML content length */\nconst MAX_HTML_LENGTH = 50000;\n\n/** Maximum style count */\nconst MAX_STYLE_COUNT = 50;\n\n/**\n * Validate an action step.\n */\nexport function validateAction(action: ActionStep): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Check action has a kind\n if (!action || typeof action !== 'object') {\n errors.push({\n code: 'INVALID_ACTION',\n message: 'Action must be an object',\n });\n return { valid: false, errors, warnings };\n }\n\n const { kind } = action as any;\n\n // Check kind is valid\n if (!kind || typeof kind !== 'string') {\n errors.push({\n code: 'MISSING_KIND',\n message: \"Action must have a 'kind' property\",\n });\n return { valid: false, errors, warnings };\n }\n\n // The executor registry is the source of truth for valid action kinds.\n // Core executors are registered at startup; app executors are registered\n // dynamically when apps activate via AppRegistry.activate().\n // core:mountWidget is special-cased (handled by ActionEngine, not ExecutorRegistry).\n if (!hasExecutor(kind) && kind !== 'core:mountWidget') {\n const registered = executorRegistry.list();\n console.error(\n `[ActionValidation] Unknown action kind: \"${kind}\". ` +\n `Registered kinds (${registered.length}): [${registered.join(', ')}]. ` +\n `This usually means the app that provides \"${kind}\" hasn't been activated yet, ` +\n `or the executor was never registered in ExecutorRegistry.`\n );\n errors.push({\n code: 'UNKNOWN_KIND',\n message: `Unknown action kind: ${kind}`,\n field: 'kind',\n });\n return { valid: false, errors, warnings };\n }\n\n // Kind-specific validation\n switch (kind) {\n case 'overlays:highlight':\n case 'overlays:pulse':\n case 'navigation:scrollTo':\n validateAnchorAction(action as { anchorId: string }, errors, warnings);\n break;\n\n case 'overlays:badge':\n validateAnchorAction(action as { anchorId: string }, errors, warnings);\n validateBadgeAction(action as any, errors, warnings);\n break;\n\n case 'overlays:tooltip':\n validateAnchorAction(action as { anchorId: string }, errors, warnings);\n validateTooltipAction(action as any, errors, warnings);\n break;\n\n case 'overlays:modal':\n validateModalAction(action as any, errors, warnings);\n break;\n\n case 'content:insertHtml':\n validateAnchorAction(action as { anchorId: string }, errors, warnings);\n validateInsertHtmlAction(action as any, errors, warnings);\n break;\n\n case 'content:setText':\n validateAnchorAction(action as { anchorId: string }, errors, warnings);\n validateSetTextAction(action as any, errors, warnings);\n break;\n\n case 'content:setAttr':\n validateAnchorAction(action as { anchorId: string }, errors, warnings);\n validateSetAttrAction(action as any, errors, warnings);\n break;\n\n case 'content:addClass':\n case 'content:removeClass':\n validateAnchorAction(action as { anchorId: string }, errors, warnings);\n validateClassAction(action as any, errors, warnings);\n break;\n\n case 'content:setStyle':\n validateAnchorAction(action as { anchorId: string }, errors, warnings);\n validateSetStyleAction(action as any, errors, warnings);\n break;\n\n case 'core:mountWidget':\n validateMountWidgetAction(action as any, errors, warnings);\n break;\n\n case 'core:wait':\n validateWaitAction(action as any, errors, warnings);\n break;\n\n case 'core:sequence':\n validateSequenceAction(action as any, errors, warnings);\n break;\n\n case 'core:parallel':\n validateParallelAction(action as any, errors, warnings);\n break;\n\n case 'core:tour':\n validateTourAction(action as any, errors, warnings);\n break;\n\n case 'navigation:navigate':\n validateNavigateAction(action as any, errors, warnings);\n break;\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nfunction validateAnchorAction(\n action: { anchorId: string },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.anchorId || typeof action.anchorId !== 'string') {\n errors.push({\n code: 'MISSING_ANCHOR_ID',\n message: \"Action requires an 'anchorId' property\",\n field: 'anchorId',\n });\n } else if (action.anchorId.length > 200) {\n warnings.push({\n code: 'LONG_ANCHOR_ID',\n message: 'Anchor ID is unusually long',\n suggestion: 'Consider using a shorter, more descriptive ID',\n });\n }\n}\n\nfunction validateBadgeAction(\n action: { content: string },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.content || typeof action.content !== 'string') {\n errors.push({\n code: 'MISSING_CONTENT',\n message: \"Badge action requires 'content' property\",\n field: 'content',\n });\n } else if (action.content.length > 100) {\n warnings.push({\n code: 'LONG_BADGE_CONTENT',\n message: 'Badge content is quite long',\n suggestion: 'Keep badge content short (under 100 characters)',\n });\n }\n}\n\nfunction validateTooltipAction(\n action: { content: { title?: string; body: string } },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.content || typeof action.content !== 'object') {\n errors.push({\n code: 'MISSING_CONTENT',\n message: \"Tooltip action requires 'content' object\",\n field: 'content',\n });\n return;\n }\n\n if (!action.content.body || typeof action.content.body !== 'string') {\n errors.push({\n code: 'MISSING_BODY',\n message: \"Tooltip content requires 'body' property\",\n field: 'content.body',\n });\n }\n}\n\nfunction validateInsertHtmlAction(\n action: { html: string; position: string },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.html || typeof action.html !== 'string') {\n errors.push({\n code: 'MISSING_HTML',\n message: \"insertHtml action requires 'html' property\",\n field: 'html',\n });\n } else if (action.html.length > MAX_HTML_LENGTH) {\n errors.push({\n code: 'HTML_TOO_LONG',\n message: `HTML content exceeds maximum length of ${MAX_HTML_LENGTH}`,\n field: 'html',\n });\n }\n\n const validPositions = ['before', 'after', 'prepend', 'append', 'replace'];\n if (!action.position || !validPositions.includes(action.position)) {\n errors.push({\n code: 'INVALID_POSITION',\n message: `Position must be one of: ${validPositions.join(', ')}`,\n field: 'position',\n });\n }\n}\n\nfunction validateSetTextAction(\n action: { text: string },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (action.text === undefined || action.text === null) {\n errors.push({\n code: 'MISSING_TEXT',\n message: \"setText action requires 'text' property\",\n field: 'text',\n });\n }\n}\n\nfunction validateSetAttrAction(\n action: { attr: string; value: string },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.attr || typeof action.attr !== 'string') {\n errors.push({\n code: 'MISSING_ATTR',\n message: \"setAttr action requires 'attr' property\",\n field: 'attr',\n });\n } else if (\n DANGEROUS_ATTRS.has(action.attr.toLowerCase()) ||\n action.attr.toLowerCase().startsWith('on')\n ) {\n errors.push({\n code: 'DANGEROUS_ATTR',\n message: `Event handler attributes are not allowed: ${action.attr}`,\n field: 'attr',\n });\n }\n\n if (action.value === undefined || action.value === null) {\n errors.push({\n code: 'MISSING_VALUE',\n message: \"setAttr action requires 'value' property\",\n field: 'value',\n });\n }\n}\n\nfunction validateClassAction(\n action: { className: string },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.className || typeof action.className !== 'string') {\n errors.push({\n code: 'MISSING_CLASS_NAME',\n message: \"Class action requires 'className' property\",\n field: 'className',\n });\n } else if (!/^[a-zA-Z_-][a-zA-Z0-9_-]*$/.test(action.className)) {\n warnings.push({\n code: 'INVALID_CLASS_NAME',\n message: 'Class name contains unusual characters',\n suggestion: 'Use alphanumeric characters, hyphens, and underscores',\n });\n }\n}\n\nfunction validateSetStyleAction(\n action: { styles: Record<string, string> },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.styles || typeof action.styles !== 'object') {\n errors.push({\n code: 'MISSING_STYLES',\n message: \"setStyle action requires 'styles' object\",\n field: 'styles',\n });\n } else {\n const styleCount = Object.keys(action.styles).length;\n if (styleCount > MAX_STYLE_COUNT) {\n errors.push({\n code: 'TOO_MANY_STYLES',\n message: `Too many styles (${styleCount}). Maximum is ${MAX_STYLE_COUNT}`,\n field: 'styles',\n });\n }\n\n // Check for potentially dangerous style values\n for (const [prop, value] of Object.entries(action.styles)) {\n if (typeof value === 'string' && value.includes('expression(')) {\n errors.push({\n code: 'DANGEROUS_STYLE',\n message: `Style expressions are not allowed: ${prop}`,\n field: `styles.${prop}`,\n });\n }\n }\n }\n}\n\nfunction validateMountWidgetAction(\n action: { slot: string; widget: { widgetId: string } },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.slot || typeof action.slot !== 'string') {\n errors.push({\n code: 'MISSING_SLOT',\n message: \"mountWidget action requires 'slot' property\",\n field: 'slot',\n });\n }\n\n if (!action.widget || typeof action.widget !== 'object') {\n errors.push({\n code: 'MISSING_WIDGET',\n message: \"mountWidget action requires 'widget' object\",\n field: 'widget',\n });\n } else if (!action.widget.widgetId || typeof action.widget.widgetId !== 'string') {\n errors.push({\n code: 'MISSING_WIDGET_ID',\n message: \"Widget must have a 'widgetId' property\",\n field: 'widget.widgetId',\n });\n }\n}\n\nfunction validateWaitAction(\n action: { durationMs?: number; event?: string },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (action.durationMs === undefined && !action.event) {\n errors.push({\n code: 'MISSING_WAIT_CONFIG',\n message: \"wait action requires either 'durationMs' or 'event' property\",\n });\n }\n\n if (action.durationMs !== undefined && action.durationMs < 0) {\n errors.push({\n code: 'INVALID_DURATION',\n message: 'durationMs must be a positive number',\n field: 'durationMs',\n });\n }\n\n if (action.event !== undefined && typeof action.event !== 'string') {\n errors.push({\n code: 'INVALID_EVENT',\n message: 'event must be a string',\n field: 'event',\n });\n }\n}\n\nfunction validateSequenceAction(\n action: { actions: ActionStep[] },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.actions || !Array.isArray(action.actions)) {\n errors.push({\n code: 'MISSING_ACTIONS',\n message: \"sequence action requires 'actions' array\",\n field: 'actions',\n });\n return;\n }\n\n if (action.actions.length === 0) {\n warnings.push({\n code: 'EMPTY_SEQUENCE',\n message: 'sequence has no actions',\n suggestion: 'Add at least one action to the sequence',\n });\n }\n\n // Recursively validate nested actions\n for (let i = 0; i < action.actions.length; i++) {\n const result = validateAction(action.actions[i]);\n for (const error of result.errors) {\n errors.push({\n ...error,\n field: `actions[${i}]${error.field ? `.${error.field}` : ''}`,\n });\n }\n for (const warning of result.warnings) {\n warnings.push(warning);\n }\n }\n}\n\nfunction validateParallelAction(\n action: { actions: ActionStep[]; waitFor?: string },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.actions || !Array.isArray(action.actions)) {\n errors.push({\n code: 'MISSING_ACTIONS',\n message: \"parallel action requires 'actions' array\",\n field: 'actions',\n });\n return;\n }\n\n if (action.actions.length === 0) {\n warnings.push({\n code: 'EMPTY_PARALLEL',\n message: 'parallel has no actions',\n suggestion: 'Add at least one action to the parallel group',\n });\n }\n\n if (action.waitFor && !['all', 'any'].includes(action.waitFor)) {\n errors.push({\n code: 'INVALID_WAIT_FOR',\n message: \"waitFor must be 'all' or 'any'\",\n field: 'waitFor',\n });\n }\n\n // Recursively validate nested actions\n for (let i = 0; i < action.actions.length; i++) {\n const result = validateAction(action.actions[i]);\n for (const error of result.errors) {\n errors.push({\n ...error,\n field: `actions[${i}]${error.field ? `.${error.field}` : ''}`,\n });\n }\n for (const warning of result.warnings) {\n warnings.push(warning);\n }\n }\n}\n\nfunction validateNavigateAction(\n action: { url: string },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.url || typeof action.url !== 'string') {\n errors.push({\n code: 'MISSING_URL',\n message: \"navigate action requires 'url' property\",\n field: 'url',\n });\n } else {\n const url = action.url.trim().toLowerCase();\n if (url.startsWith('javascript:')) {\n errors.push({\n code: 'DANGEROUS_URL',\n message: 'javascript: URLs are not allowed',\n field: 'url',\n });\n }\n\n // Warn about data: URLs\n if (url.startsWith('data:')) {\n warnings.push({\n code: 'DATA_URL',\n message: 'data: URLs may have limited support',\n suggestion: 'Consider using a regular URL instead',\n });\n }\n }\n}\n\nfunction validateModalAction(\n action: {\n content: { title?: string; body: string };\n size?: string;\n ctaButtons?: { label: string; actionId: string }[];\n },\n errors: ValidationError[],\n _warnings: ValidationWarning[]\n): void {\n if (!action.content || typeof action.content !== 'object') {\n errors.push({\n code: 'MISSING_CONTENT',\n message: \"Modal action requires 'content' object\",\n field: 'content',\n });\n return;\n }\n\n if (!action.content.body || typeof action.content.body !== 'string') {\n errors.push({\n code: 'MISSING_BODY',\n message: \"Modal content requires 'body' property\",\n field: 'content.body',\n });\n }\n\n if (action.size && !['sm', 'md', 'lg'].includes(action.size)) {\n errors.push({\n code: 'INVALID_SIZE',\n message: \"Modal size must be 'sm', 'md', or 'lg'\",\n field: 'size',\n });\n }\n\n if (action.ctaButtons) {\n if (!Array.isArray(action.ctaButtons)) {\n errors.push({\n code: 'INVALID_CTA_BUTTONS',\n message: 'ctaButtons must be an array',\n field: 'ctaButtons',\n });\n } else {\n for (let i = 0; i < action.ctaButtons.length; i++) {\n const btn = action.ctaButtons[i];\n if (!btn.label || typeof btn.label !== 'string') {\n errors.push({\n code: 'MISSING_BUTTON_LABEL',\n message: `CTA button at index ${i} requires 'label' property`,\n field: `ctaButtons[${i}].label`,\n });\n }\n if (!btn.actionId || typeof btn.actionId !== 'string') {\n errors.push({\n code: 'MISSING_BUTTON_ACTION_ID',\n message: `CTA button at index ${i} requires 'actionId' property`,\n field: `ctaButtons[${i}].actionId`,\n });\n }\n }\n }\n }\n}\n\nfunction validateTourAction(\n action: {\n tourId: string;\n steps: { id: string; action: ActionStep; route?: string; onAction?: Record<string, string> }[];\n },\n errors: ValidationError[],\n warnings: ValidationWarning[]\n): void {\n if (!action.tourId || typeof action.tourId !== 'string') {\n errors.push({\n code: 'MISSING_TOUR_ID',\n message: \"Tour action requires 'tourId' property\",\n field: 'tourId',\n });\n }\n\n if (!action.steps || !Array.isArray(action.steps)) {\n errors.push({\n code: 'MISSING_STEPS',\n message: \"Tour action requires 'steps' array\",\n field: 'steps',\n });\n return;\n }\n\n if (action.steps.length === 0) {\n errors.push({\n code: 'EMPTY_STEPS',\n message: 'Tour must have at least one step',\n field: 'steps',\n });\n }\n\n const stepIds = new Set<string>();\n for (let i = 0; i < action.steps.length; i++) {\n const step = action.steps[i];\n\n if (!step.id || typeof step.id !== 'string') {\n errors.push({\n code: 'MISSING_STEP_ID',\n message: `Step at index ${i} requires 'id' property`,\n field: `steps[${i}].id`,\n });\n } else {\n if (stepIds.has(step.id)) {\n errors.push({\n code: 'DUPLICATE_STEP_ID',\n message: `Duplicate step ID: ${step.id}`,\n field: `steps[${i}].id`,\n });\n }\n stepIds.add(step.id);\n }\n\n if (!step.action) {\n errors.push({\n code: 'MISSING_STEP_ACTION',\n message: `Step at index ${i} requires 'action' property`,\n field: `steps[${i}].action`,\n });\n } else {\n // Recursively validate nested action\n const result = validateAction(step.action);\n for (const error of result.errors) {\n errors.push({\n ...error,\n field: `steps[${i}].action${error.field ? `.${error.field}` : ''}`,\n });\n }\n for (const warning of result.warnings) {\n warnings.push(warning);\n }\n }\n\n // Validate onAction references\n if (step.onAction) {\n for (const [_actionId, targetStepId] of Object.entries(step.onAction)) {\n if (targetStepId !== 'end' && !action.steps.some((s) => s.id === targetStepId)) {\n warnings.push({\n code: 'UNKNOWN_TARGET_STEP',\n message: `Step \"${step.id}\" references unknown target step: ${targetStepId}`,\n suggestion: `Make sure step \"${targetStepId}\" exists in the tour`,\n });\n }\n }\n }\n }\n}\n\n/**\n * Validate a batch of actions.\n */\nexport function validateActions(actions: ActionStep[]): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n if (!Array.isArray(actions)) {\n console.error('[ActionValidation] validateActions called with non-array:', typeof actions);\n errors.push({\n code: 'INVALID_ACTIONS',\n message: 'Actions must be an array',\n });\n return { valid: false, errors, warnings };\n }\n\n for (let i = 0; i < actions.length; i++) {\n const result = validateAction(actions[i]);\n if (!result.valid) {\n const action = actions[i] as any;\n console.error(\n `[ActionValidation] Action [${i}] failed validation:`,\n `kind=\"${action?.kind ?? 'undefined'}\"`,\n result.errors.map((e) => `${e.code}: ${e.message}`).join('; '),\n action\n );\n }\n for (const error of result.errors) {\n errors.push({\n ...error,\n field: error.field ? `[${i}].${error.field}` : `[${i}]`,\n });\n }\n for (const warning of result.warnings) {\n warnings.push({\n ...warning,\n suggestion: warning.suggestion ? `Action ${i}: ${warning.suggestion}` : undefined,\n });\n }\n }\n\n if (errors.length > 0) {\n console.error(\n `[ActionValidation] Batch validation failed: ${errors.length} error(s) in ${actions.length} action(s).`,\n errors.map((e) => `${e.field ?? '?'}: ${e.message}`).join(' | ')\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n", "/**\n * ActionEngine\n *\n * Unified execution layer for interventions. Provides a high-level API for\n * applying, reverting, and managing action steps.\n */\n\nimport { executorRegistry as defaultExecutorRegistry } from './executors';\nimport type {\n ActionEngine,\n ActionEngineOptions,\n ActionHandle,\n ActionState,\n ActionStep,\n ActiveAction,\n BatchActionHandle,\n ExecutorContext,\n ExecutorResult,\n MountWidgetAction,\n ValidationResult,\n} from './types';\nimport { validateAction, validateActions } from './validation';\n\n/** Counter for generating unique action IDs */\nlet actionIdCounter = 0;\n\n/**\n * Create an ActionEngine instance.\n */\nexport function createActionEngine(options: ActionEngineOptions): ActionEngine {\n const {\n overlayRoot,\n eventBus,\n surfaces,\n anchorResolver,\n adaptiveId,\n executorRegistry = defaultExecutorRegistry,\n subscribeNavigation,\n } = options;\n\n /** Map of active actions by ID */\n const activeActions = new Map<string, InternalActionEntry>();\n\n /**\n * Generate a unique action ID.\n */\n function generateId(): string {\n return `action-${++actionIdCounter}`;\n }\n\n /**\n * Publish an event to the EventBus if available.\n */\n function publishEvent(name: string, props?: Record<string, unknown>): void {\n if (eventBus) {\n eventBus.publish(name, props);\n }\n }\n\n /**\n * Create the executor context.\n */\n function createExecutorContext(): ExecutorContext {\n return {\n overlayRoot,\n resolveAnchor: anchorResolver,\n generateId,\n publishEvent,\n adaptiveId,\n // Allow composite executors (like tours) to execute nested actions\n applyAction: apply,\n // Allow composite executors to subscribe to events\n subscribeEvent: eventBus\n ? (name: string, callback: (props?: Record<string, unknown>) => void) =>\n eventBus.subscribe({ names: [name] }, (event) => callback(event.props))\n : undefined,\n // Allow composite executors to subscribe to navigation changes\n subscribeNavigation,\n };\n }\n\n /**\n * Execute a mountWidget action via Surfaces.\n */\n async function executeMountWidget(\n action: MountWidgetAction,\n context: ExecutorContext\n ): Promise<ExecutorResult> {\n if (!surfaces) {\n throw new Error('Surfaces provider required for core:mountWidget actions');\n }\n\n const handle = surfaces.mount(\n action.slot,\n {\n type: 'widget',\n widgetId: action.widget.widgetId,\n config: action.widget.props,\n },\n {\n priority: action.widget.priority,\n }\n );\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'core:mountWidget',\n slot: action.slot,\n widgetId: action.widget.widgetId,\n });\n\n return {\n cleanup: () => {\n handle.unmount();\n },\n updateFn: (changes) => {\n if ('widget' in changes && changes.widget) {\n const w = changes.widget as { props?: Record<string, unknown> };\n if (w.props) {\n handle.update({\n type: 'widget',\n widgetId: action.widget.widgetId,\n config: w.props,\n });\n }\n }\n },\n };\n }\n\n /**\n * Apply a single action.\n */\n async function apply(action: ActionStep): Promise<ActionHandle> {\n const validation = validateAction(action);\n if (!validation.valid) {\n const errorMessages = validation.errors.map((e) => e.message).join('; ');\n console.error(\n `[ActionEngine] Validation failed for action kind=\"${(action as any)?.kind}\":`,\n errorMessages,\n action\n );\n throw new Error(`Action validation failed: ${errorMessages}`);\n }\n\n const id = generateId();\n const context = createExecutorContext();\n\n let result: ExecutorResult;\n\n // Special handling for mountWidget\n if (action.kind === 'core:mountWidget') {\n result = await executeMountWidget(action as MountWidgetAction, context);\n } else {\n const executor = executorRegistry.get(action.kind);\n if (!executor) {\n const registered =\n 'list' in executorRegistry ? (executorRegistry as any).list() : '(list unavailable)';\n console.error(\n `[ActionEngine] No executor for kind=\"${action.kind}\".`,\n `Registered: [${registered}]`\n );\n throw new Error(`No executor for action kind: ${action.kind}`);\n }\n result = await executor(action, context);\n }\n\n // Track active action\n const entry: InternalActionEntry = {\n id,\n action,\n adaptiveId,\n appliedTs: Date.now(),\n state: 'applied',\n cleanup: result.cleanup,\n updateFn: result.updateFn,\n };\n activeActions.set(id, entry);\n\n // Publish applied event\n publishEvent('action.applied', {\n id,\n kind: action.kind,\n anchorId: 'anchorId' in action ? action.anchorId : undefined,\n });\n\n // Create and return handle\n const handle: ActionHandle = {\n id,\n action,\n\n async revert(): Promise<void> {\n const entry = activeActions.get(id);\n if (!entry || entry.state !== 'applied') return;\n\n try {\n await entry.cleanup();\n entry.state = 'reverted';\n publishEvent('action.reverted', { id, kind: action.kind });\n } catch (error) {\n entry.state = 'failed';\n publishEvent('action.failed', {\n id,\n kind: action.kind,\n error: String(error),\n });\n throw error;\n } finally {\n activeActions.delete(id);\n }\n },\n\n isApplied(): boolean {\n const entry = activeActions.get(id);\n return entry?.state === 'applied';\n },\n\n async update(changes: Partial<ActionStep>): Promise<void> {\n const entry = activeActions.get(id);\n if (!entry || entry.state !== 'applied') {\n throw new Error('Cannot update action that is not applied');\n }\n\n if (entry.updateFn) {\n await entry.updateFn(changes);\n } else {\n throw new Error(`Action kind ${action.kind} does not support updates`);\n }\n },\n\n getState(): ActionState {\n const entry = activeActions.get(id);\n return entry?.state ?? 'reverted';\n },\n };\n\n return handle;\n }\n\n /**\n * Apply multiple actions as a batch.\n */\n async function applyBatch(actions: ActionStep[]): Promise<BatchActionHandle> {\n console.log(\n `[ActionEngine] applyBatch: ${actions.length} action(s)`,\n actions.map((a: any) => a.kind).join(', ')\n );\n\n const validation = validateActions(actions);\n if (!validation.valid) {\n const errorMessages = validation.errors.map((e) => e.message).join('; ');\n console.error(\n `[ActionEngine] Batch validation FAILED for ${actions.length} action(s):`,\n errorMessages,\n '\\nActions:',\n actions\n .map(\n (a: any, i: number) =>\n ` [${i}] ${a.kind} ${a.anchorId ? `anchor=\"${a.anchorId}\"` : ''} ${a.label ? `label=\"${a.label}\"` : ''}`\n )\n .join('\\n')\n );\n throw new Error(`Batch validation failed: ${errorMessages}`);\n }\n\n const batchId = generateId();\n const handles: ActionHandle[] = [];\n const appliedHandles: ActionHandle[] = [];\n\n try {\n for (const action of actions) {\n const handle = await apply(action);\n handles.push(handle);\n appliedHandles.push(handle);\n }\n } catch (error) {\n console.error(\n `[ActionEngine] Batch apply FAILED at action ${appliedHandles.length + 1}/${actions.length}.`,\n `Successfully applied: ${appliedHandles.length}. Rolling back...`,\n error\n );\n // Rollback on failure\n for (const handle of appliedHandles) {\n try {\n await handle.revert();\n } catch {\n // Ignore cleanup errors during rollback\n }\n }\n throw error;\n }\n\n const batchHandle: BatchActionHandle = {\n id: batchId,\n handles,\n\n async revertAll(): Promise<void> {\n // Revert in reverse order\n for (let i = handles.length - 1; i >= 0; i--) {\n try {\n await handles[i].revert();\n } catch (error) {\n console.error(`[ActionEngine] Error reverting action ${handles[i].id}:`, error);\n }\n }\n },\n\n isApplied(): boolean {\n return handles.every((h) => h.isApplied());\n },\n };\n\n return batchHandle;\n }\n\n /**\n * Validate an action without applying it.\n */\n function validate(action: ActionStep): ValidationResult {\n return validateAction(action);\n }\n\n /**\n * Get all currently active actions.\n */\n function getActive(): ActiveAction[] {\n // biome-ignore lint: intentional field mapping to ActiveAction interface (excludes internal fields)\n return Array.from(activeActions.values()).map((entry) => ({\n id: entry.id,\n action: entry.action,\n adaptiveId: entry.adaptiveId,\n appliedTs: entry.appliedTs,\n state: entry.state,\n }));\n }\n\n /**\n * Clean up all active actions.\n */\n function destroy(): void {\n // Revert all active actions\n for (const entry of activeActions.values()) {\n if (entry.state === 'applied') {\n try {\n entry.cleanup();\n } catch (error) {\n console.error(`[ActionEngine] Error during cleanup:`, error);\n }\n }\n }\n activeActions.clear();\n }\n\n return {\n apply,\n applyBatch,\n validate,\n getActive,\n destroy,\n };\n}\n\n/**\n * Internal tracking entry for active actions.\n */\ninterface InternalActionEntry {\n id: string;\n action: ActionStep;\n adaptiveId?: string;\n appliedTs: number;\n state: ActionState;\n cleanup: () => void | Promise<void>;\n updateFn?: (changes: Partial<ActionStep>) => void | Promise<void>;\n}\n", "/**\n * ContextManager - Manages runtime context and notifies subscribers of changes.\n *\n * The ContextManager is responsible for:\n * - Collecting context from various sources (page, session, viewport)\n * - Notifying subscribers when context changes\n * - Providing the current context snapshot\n */\n\nimport type { RouteFilter } from '../decisions/types';\nimport type { NavigationMonitor } from '../navigation/NavigationMonitor';\nimport type { TelemetryClient } from '../telemetry/types';\n\nimport type {\n AnchorState,\n ContextChangeCallback,\n PageContext,\n PageHistoryEntry,\n RuntimeContext,\n Unsubscribe,\n ViewportContext,\n} from './types';\n\nexport interface ContextManagerOptions {\n /** Telemetry client for session ID */\n telemetry?: TelemetryClient;\n /** Routes config for route matching */\n routes?: RouteFilter;\n /** Initial page history (optional) */\n initialPageHistory?: PageHistoryEntry[];\n /** Centralized navigation monitor (replaces direct History API patching) */\n navigation?: NavigationMonitor;\n}\n\n/**\n * Creates a default RuntimeContext.\n */\nfunction createDefaultContext(): RuntimeContext {\n const now = Date.now();\n return {\n page: {\n url: typeof window !== 'undefined' ? window.location.href : '',\n title: typeof document !== 'undefined' ? document.title : undefined,\n },\n session: {\n sessionId: '',\n startTs: now,\n pageHistory: [],\n },\n viewport: {\n width: typeof window !== 'undefined' ? window.innerWidth : 0,\n height: typeof window !== 'undefined' ? window.innerHeight : 0,\n },\n };\n}\n\n/**\n * Match a URL against route patterns from RouteFilter.\n * Returns the matched pattern or undefined.\n */\nfunction matchRoute(url: string, routes?: RouteFilter): string | undefined {\n if (!routes) return undefined;\n\n // Extract pathname from URL\n let pathname: string;\n try {\n pathname = new URL(url).pathname;\n } catch {\n pathname = url;\n }\n\n // Check exclude patterns first\n if (routes.exclude) {\n for (const pattern of routes.exclude) {\n if (matchPattern(pathname, pattern)) {\n return undefined; // Excluded route\n }\n }\n }\n\n // Check include patterns\n if (routes.include) {\n for (const pattern of routes.include) {\n if (matchPattern(pathname, pattern)) {\n return pattern;\n }\n }\n return undefined; // No match in include list\n }\n\n return pathname; // No include list, return pathname as route\n}\n\n/**\n * Simple pattern matching for routes.\n * Supports:\n * - Exact matches: \"/products\"\n * - Wildcard segments: \"/products/*\"\n * - Parameter segments: \"/products/:id\"\n */\nfunction matchPattern(pathname: string, pattern: string): boolean {\n // Normalize paths\n const normalizedPath = pathname.replace(/\\/$/, '') || '/';\n const normalizedPattern = pattern.replace(/\\/$/, '') || '/';\n\n // Exact match\n if (normalizedPath === normalizedPattern) return true;\n\n // Convert pattern to regex\n const regexPattern = normalizedPattern\n .replace(/:[^/]+/g, '[^/]+') // :param -> [^/]+\n .replace(/\\*/g, '.*'); // * -> .*\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(normalizedPath);\n}\n\n/**\n * ContextManager class for managing runtime context.\n */\nexport class ContextManager {\n private context: RuntimeContext;\n private previousContext: RuntimeContext;\n private listeners: Set<ContextChangeCallback> = new Set();\n private telemetry?: TelemetryClient;\n private routes?: RouteFilter;\n private navigation?: NavigationMonitor;\n\n // Event listener cleanup functions\n private cleanupFns: Array<() => void> = [];\n\n constructor(options: ContextManagerOptions = {}) {\n this.telemetry = options.telemetry;\n this.routes = options.routes;\n this.navigation = options.navigation;\n\n // Initialize context\n this.context = createDefaultContext();\n this.previousContext = { ...this.context };\n\n // Set initial session ID from telemetry\n if (options.telemetry?.getSessionId) {\n const sessionId = options.telemetry.getSessionId();\n if (sessionId) {\n this.context.session.sessionId = sessionId;\n }\n }\n\n // Set initial page history\n if (options.initialPageHistory) {\n this.context.session.pageHistory = options.initialPageHistory;\n }\n\n // Set initial route ID\n this.context.page.routeId = matchRoute(this.context.page.url, this.routes);\n\n // Add current page to history\n this.addPageToHistory(this.context.page.url);\n\n // Setup browser event listeners\n if (typeof window !== 'undefined') {\n this.setupBrowserListeners();\n }\n }\n\n /**\n * Get the current runtime context.\n */\n get(): RuntimeContext {\n return { ...this.context };\n }\n\n /**\n * Subscribe to context changes.\n * Returns an unsubscribe function.\n */\n subscribe(callback: ContextChangeCallback): Unsubscribe {\n this.listeners.add(callback);\n return () => {\n this.listeners.delete(callback);\n };\n }\n\n /**\n * Update the routes config (e.g., when config is fetched).\n */\n setRoutes(routes: RouteFilter): void {\n this.routes = routes;\n // Re-evaluate current route\n const newRouteId = matchRoute(this.context.page.url, this.routes);\n if (newRouteId !== this.context.page.routeId) {\n this.updateContext({ page: { ...this.context.page, routeId: newRouteId } });\n }\n }\n\n /**\n * Update anchor states.\n */\n setAnchors(anchors: AnchorState[]): void {\n this.updateContext({ anchors });\n }\n\n /**\n * Manually update the session ID (e.g., when telemetry initializes).\n */\n setSessionId(sessionId: string): void {\n if (sessionId !== this.context.session.sessionId) {\n this.updateContext({\n session: { ...this.context.session, sessionId },\n });\n }\n }\n\n /**\n * Clean up event listeners and subscriptions.\n */\n destroy(): void {\n for (const cleanup of this.cleanupFns) {\n cleanup();\n }\n this.cleanupFns = [];\n this.listeners.clear();\n }\n\n // ==================== Private Methods ====================\n\n private setupBrowserListeners(): void {\n // Viewport resize listener (debounced)\n let resizeTimeout: ReturnType<typeof setTimeout>;\n const handleResize = () => {\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(() => {\n this.updateViewport();\n }, 100);\n };\n window.addEventListener('resize', handleResize);\n this.cleanupFns.push(() => window.removeEventListener('resize', handleResize));\n\n // Navigation: subscribe to NavigationMonitor if available (single patch point),\n // otherwise fall back to direct History API patching (legacy mode).\n if (this.navigation) {\n const unsub = this.navigation.subscribe(() => this.updatePage());\n this.cleanupFns.push(unsub);\n } else {\n // Legacy: direct History API patching\n const handlePopState = () => {\n this.updatePage();\n };\n window.addEventListener('popstate', handlePopState);\n this.cleanupFns.push(() => window.removeEventListener('popstate', handlePopState));\n\n const originalPushState = history.pushState.bind(history);\n const originalReplaceState = history.replaceState.bind(history);\n\n history.pushState = (...args) => {\n originalPushState(...args);\n queueMicrotask(() => this.updatePage());\n };\n\n history.replaceState = (...args) => {\n originalReplaceState(...args);\n queueMicrotask(() => this.updatePage());\n };\n\n this.cleanupFns.push(() => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n });\n }\n }\n\n private updateViewport(): void {\n const newViewport: ViewportContext = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n\n if (\n newViewport.width !== this.context.viewport.width ||\n newViewport.height !== this.context.viewport.height\n ) {\n this.updateContext({ viewport: newViewport });\n }\n }\n\n private updatePage(): void {\n const url = window.location.href;\n const { title } = document;\n const routeId = matchRoute(url, this.routes);\n\n const newPage: PageContext = {\n url,\n title,\n routeId,\n };\n\n // Only update if something changed\n if (\n newPage.url !== this.context.page.url ||\n newPage.title !== this.context.page.title ||\n newPage.routeId !== this.context.page.routeId\n ) {\n // Add to page history if URL changed\n if (newPage.url !== this.context.page.url) {\n this.addPageToHistory(newPage.url);\n }\n\n this.updateContext({ page: newPage });\n }\n }\n\n private addPageToHistory(url: string): void {\n const entry: PageHistoryEntry = {\n url,\n ts: Date.now(),\n };\n\n const pageHistory = [...(this.context.session.pageHistory || []), entry];\n\n // Keep last 50 pages in history\n if (pageHistory.length > 50) {\n pageHistory.shift();\n }\n\n this.context.session.pageHistory = pageHistory;\n }\n\n private updateContext(partial: Partial<RuntimeContext>): void {\n // Save previous context\n this.previousContext = { ...this.context };\n\n // Merge updates\n this.context = {\n ...this.context,\n ...partial,\n };\n\n // Notify listeners\n this.notifyListeners();\n }\n\n private notifyListeners(): void {\n for (const callback of this.listeners) {\n try {\n callback(this.context, this.previousContext);\n } catch (err) {\n console.error('[ContextManager] Listener error:', err);\n }\n }\n }\n}\n\n/**\n * Create a ContextManager instance.\n */\nexport function createContextManager(options: ContextManagerOptions = {}): ContextManager {\n return new ContextManager(options);\n}\n", "/**\n * Rule Strategy Evaluator\n *\n * Evaluates rules in order and returns the value of the first matching rule.\n */\nimport type {\n Condition,\n DecisionResult,\n EvaluationContext,\n EventCountCondition,\n Rule,\n RuleStrategy,\n} from '../types';\n\n/**\n * Evaluate a single condition against the evaluation context.\n */\nexport function evaluateCondition(condition: Condition, evalContext: EvaluationContext): boolean {\n const { context, state, events } = evalContext;\n\n switch (condition.type) {\n case 'page_url': {\n const { url } = condition;\n const currentUrl = context.page.url;\n\n // Simple pattern matching with wildcards\n const pattern = url\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex chars except * and ?\n .replace(/\\*\\*/g, '.*') // ** matches anything\n .replace(/\\*/g, '[^/]*'); // * matches within path segment\n\n const regex = new RegExp(`^${pattern}$`);\n return regex.test(currentUrl);\n }\n\n case 'route': {\n return context.page.routeId === condition.routeId;\n }\n\n case 'anchor_visible': {\n const anchor = context.anchors?.find((a) => a.anchorId === condition.anchorId);\n\n switch (condition.state) {\n case 'visible':\n return anchor?.visible === true;\n case 'present':\n return anchor?.present === true;\n case 'absent':\n return !anchor?.present;\n default:\n return false;\n }\n }\n\n case 'event_occurred': {\n if (!events) return false;\n const withinMs = condition.withinMs ?? 60000; // Default 1 minute\n return events.hasRecentEvent(condition.eventName, withinMs);\n }\n\n case 'state_equals': {\n // This checks arbitrary state values - implementation depends on\n // how the state store exposes values. For now, check session storage.\n if (!state) return false;\n // The state key format could be \"dismissals:xyz\" or just \"xyz\"\n // For simplicity, we'll do a basic comparison\n return false; // TODO: Implement when state interface is clearer\n }\n\n case 'viewport': {\n const { width, height } = context.viewport;\n if (condition.minWidth !== undefined && width < condition.minWidth) return false;\n if (condition.maxWidth !== undefined && width > condition.maxWidth) return false;\n if (condition.minHeight !== undefined && height < condition.minHeight) return false;\n if (condition.maxHeight !== undefined && height > condition.maxHeight) return false;\n return true;\n }\n\n case 'session_metric': {\n if (!state) return false;\n const metricValue = state.getSessionMetric(condition.key);\n const { operator, threshold } = condition;\n\n switch (operator) {\n case 'gte':\n return metricValue >= threshold;\n case 'lte':\n return metricValue <= threshold;\n case 'eq':\n return metricValue === threshold;\n case 'gt':\n return metricValue > threshold;\n case 'lt':\n return metricValue < threshold;\n default:\n return false;\n }\n }\n\n case 'dismissed': {\n if (!state) return condition.inverted ?? false;\n const isDismissed = state.isDismissed(condition.key);\n return condition.inverted ? !isDismissed : isDismissed;\n }\n\n case 'cooldown_active': {\n if (!state) return condition.inverted ?? false;\n const isActive = state.isCooldownActive(condition.key);\n return condition.inverted ? !isActive : isActive;\n }\n\n case 'frequency_limit': {\n if (!state) return condition.inverted ?? false;\n const count = state.getFrequencyCount(condition.key);\n const limitReached = count >= condition.limit;\n return condition.inverted ? !limitReached : limitReached;\n }\n\n case 'event_count': {\n if (!evalContext.accumulator) return false;\n const ec = condition as EventCountCondition;\n const count = evalContext.accumulator.getCount(ec.key, ec.withinMs);\n switch (ec.operator) {\n case 'gte':\n return count >= ec.count;\n case 'lte':\n return count <= ec.count;\n case 'eq':\n return count === ec.count;\n case 'gt':\n return count > ec.count;\n case 'lt':\n return count < ec.count;\n default:\n return false;\n }\n }\n\n default:\n // Unknown condition type - fail closed (return false)\n console.warn('[RuleStrategy] Unknown condition type:', (condition as any).type);\n return false;\n }\n}\n\n/**\n * Evaluate a single rule (all conditions must be true).\n */\nexport function evaluateRule(\n rule: Rule,\n evalContext: EvaluationContext\n): { matched: boolean; conditionResults: Array<{ condition: Condition; result: boolean }> } {\n const conditionResults: Array<{ condition: Condition; result: boolean }> = [];\n\n for (const condition of rule.conditions) {\n const result = evaluateCondition(condition, evalContext);\n conditionResults.push({ condition, result });\n\n // Short-circuit: if any condition fails, rule doesn't match\n if (!result) {\n return { matched: false, conditionResults };\n }\n }\n\n // All conditions passed\n return { matched: true, conditionResults };\n}\n\n/**\n * Evaluate a RuleStrategy and return the result.\n */\nexport function evaluateRuleStrategy<T>(\n strategy: RuleStrategy<T>,\n evalContext: EvaluationContext\n): DecisionResult<T> {\n // Evaluate rules in order\n for (let i = 0; i < strategy.rules.length; i++) {\n const rule = strategy.rules[i];\n const { matched, conditionResults } = evaluateRule(rule, evalContext);\n\n if (matched) {\n return {\n value: rule.value as T,\n isFallback: false,\n matchInfo: {\n strategyType: 'rules',\n matchedRuleIndex: i,\n evaluatedConditions: conditionResults,\n },\n };\n }\n }\n\n // No rules matched, return default\n return {\n value: strategy.default as T,\n isFallback: true,\n matchInfo: {\n strategyType: 'rules',\n },\n };\n}\n", "/**\n * Score Strategy Evaluator\n *\n * Compares an augmented field value against a threshold.\n */\nimport type { DecisionResult, EvaluationContext, ScoreStrategy } from '../types';\n\n/**\n * Evaluate a ScoreStrategy and return the result.\n */\nexport function evaluateScoreStrategy<T>(\n strategy: ScoreStrategy<T>,\n evalContext: EvaluationContext\n): DecisionResult<T> {\n const { context } = evalContext;\n\n // Get the score from augmented context\n const score = context.augmented?.[strategy.field];\n\n // If no score available, return below value as fallback\n if (score === undefined || typeof score !== 'number') {\n return {\n value: strategy.below as T,\n isFallback: true,\n matchInfo: {\n strategyType: 'score',\n },\n };\n }\n\n // Compare against threshold\n const isAbove = score >= strategy.threshold;\n\n return {\n value: isAbove ? (strategy.above as T) : (strategy.below as T),\n isFallback: false,\n matchInfo: {\n strategyType: 'score',\n },\n };\n}\n", "/**\n * Decision Engine\n *\n * The central evaluation engine for DecisionStrategy objects.\n * Routes strategies to their appropriate evaluators.\n */\nimport type { RuntimeContext } from '../context/types';\nimport type { EventBus } from '../events/EventBus';\nimport type { SessionMetricTracker } from '../metrics/sessionMetrics';\nimport type { StateStore } from '../state/StateStore';\n\nimport { evaluateRuleStrategy } from './strategies/rules';\nimport { evaluateScoreStrategy } from './strategies/score';\nimport type {\n DecisionResult,\n DecisionStrategy,\n EvaluationContext,\n ExternalStrategy,\n ModelStrategy,\n RuleStrategy,\n ScoreStrategy,\n} from './types';\n\n/**\n * Options for the decision engine evaluate function.\n */\nexport interface EvaluateOptions {\n /** State store for dismissal/cooldown/frequency checks */\n state?: StateStore;\n /** Event bus for event_occurred checks */\n events?: EventBus;\n /** Session metric tracker for session_metric checks */\n sessionMetrics?: SessionMetricTracker;\n /** Event accumulator for event_count conditions */\n accumulator?: { getCount(key: string, withinMs?: number): number };\n}\n\n/**\n * Create an EvaluationContext from runtime components.\n */\nfunction createEvaluationContext(\n context: RuntimeContext,\n options: EvaluateOptions\n): EvaluationContext {\n const { state, events, sessionMetrics, accumulator } = options;\n\n return {\n context,\n state: state\n ? {\n isDismissed: (key: string) => state.dismissals.isDismissed(key),\n isCooldownActive: (key: string) => state.cooldowns.isActive(key),\n getFrequencyCount: (key: string) => state.frequency.count(key),\n getSessionMetric: (key: string) => sessionMetrics?.get(key) ?? 0,\n }\n : undefined,\n events: events\n ? {\n hasRecentEvent: (eventName: string, withinMs: number) =>\n events.hasRecentEvent(eventName, withinMs),\n }\n : undefined,\n accumulator: accumulator\n ? {\n getCount: (key, withinMs) => accumulator.getCount(key, withinMs),\n }\n : undefined,\n };\n}\n\n/**\n * Evaluate a DecisionStrategy against the current context.\n *\n * @param strategy - The decision strategy to evaluate\n * @param context - The runtime context\n * @param options - Additional evaluation options\n * @returns The decision result\n */\nexport async function evaluate<T>(\n strategy: DecisionStrategy<T>,\n context: RuntimeContext,\n options: EvaluateOptions = {}\n): Promise<DecisionResult<T>> {\n const evalContext = createEvaluationContext(context, options);\n\n switch (strategy.type) {\n case 'rules':\n return evaluateRuleStrategy(strategy as RuleStrategy<T>, evalContext);\n\n case 'score':\n return evaluateScoreStrategy(strategy as ScoreStrategy<T>, evalContext);\n\n case 'model':\n // Phase 3: Model-based strategy\n // For now, return default\n return {\n value: (strategy as ModelStrategy<T>).default as T,\n isFallback: true,\n matchInfo: {\n strategyType: 'model',\n },\n };\n\n case 'external':\n // Phase 3: External strategy\n // For now, return default\n return {\n value: (strategy as ExternalStrategy<T>).default as T,\n isFallback: true,\n matchInfo: {\n strategyType: 'external',\n },\n };\n\n default:\n // Unknown strategy type\n console.warn('[DecisionEngine] Unknown strategy type:', (strategy as any).type);\n return {\n value: undefined as T,\n isFallback: true,\n matchInfo: {\n strategyType: (strategy as any).type,\n },\n };\n }\n}\n\n/**\n * Synchronous version of evaluate for simple strategies.\n * Use this when you know the strategy doesn't require async operations.\n */\nexport function evaluateSync<T>(\n strategy: DecisionStrategy<T>,\n context: RuntimeContext,\n options: EvaluateOptions = {}\n): DecisionResult<T> {\n const evalContext = createEvaluationContext(context, options);\n\n switch (strategy.type) {\n case 'rules':\n return evaluateRuleStrategy(strategy as RuleStrategy<T>, evalContext);\n\n case 'score':\n return evaluateScoreStrategy(strategy as ScoreStrategy<T>, evalContext);\n\n case 'model':\n case 'external':\n // These require async, return default\n return {\n value: (strategy as ModelStrategy<T> | ExternalStrategy<T>).default as T,\n isFallback: true,\n matchInfo: {\n strategyType: strategy.type,\n },\n };\n\n default:\n return {\n value: undefined as T,\n isFallback: true,\n matchInfo: {\n strategyType: (strategy as any).type,\n },\n };\n }\n}\n\n/**\n * Create a decision engine with pre-bound options.\n */\nexport function createDecisionEngine(options: EvaluateOptions) {\n return {\n evaluate: <T>(strategy: DecisionStrategy<T>, context: RuntimeContext) =>\n evaluate(strategy, context, options),\n evaluateSync: <T>(strategy: DecisionStrategy<T>, context: RuntimeContext) =>\n evaluateSync(strategy, context, options),\n };\n}\n", "/**\n * EventAccumulator \u2014 Shared module that bridges events to counters.\n *\n * - Adaptives call register(key, predicate) to register named counters\n * - EventBus events are run through predicates\n * - Counts stored in StateStore.session (session-scoped)\n * - Subscribers notified on every counter increment\n */\n\nimport type { StateStore } from '../state/StateStore';\nimport type { EventBus } from './EventBus';\nimport type { NormalizedEvent } from './types';\n\n/**\n * A registered pattern to accumulate.\n */\ninterface TrackedPattern {\n stateKey: string;\n needsTimestamps: boolean;\n predicate: (event: NormalizedEvent) => boolean;\n}\n\n/**\n * Stored counter data in StateStore.\n */\ninterface CounterData {\n count: number;\n /** Timestamps of individual events (only stored when withinMs is needed). Capped at 200. */\n timestamps?: number[];\n}\n\nconst MAX_TIMESTAMPS = 200;\nconst STATE_PREFIX = 'ev:';\n\nexport interface EventAccumulator {\n /** Register a named counter with a predicate callback. The adaptive provides ALL filtering logic. */\n register(\n key: string,\n predicate: (event: NormalizedEvent) => boolean,\n needsTimestamps?: boolean\n ): void;\n /** Read the accumulated count for a registered key. */\n getCount(key: string, withinMs?: number): number;\n /** Subscribe to counter changes. Returns unsubscribe function. */\n subscribe(callback: () => void): () => void;\n /** Stop accumulating and unsubscribe from EventBus. */\n destroy(): void;\n}\n\nexport interface EventAccumulatorOptions {\n eventBus: EventBus;\n stateStore: StateStore;\n}\n\n/**\n * Create an EventAccumulator instance.\n */\nexport function createEventAccumulator(options: EventAccumulatorOptions): EventAccumulator {\n const { eventBus, stateStore } = options;\n const patterns = new Map<string, TrackedPattern>();\n const subscribers = new Set<() => void>();\n let unsubscribeFromBus: (() => void) | null = null;\n\n // Get the session-scoped storage namespace for accumulator\n const storage = stateStore.ns('accumulator');\n\n /**\n * Handle an incoming event from EventBus.\n */\n function handleEvent(event: NormalizedEvent): void {\n let anyIncremented = false;\n\n for (const pattern of patterns.values()) {\n if (!pattern.predicate(event)) continue;\n\n // Increment counter in state\n const existing = storage.get<CounterData>(pattern.stateKey) || { count: 0 };\n existing.count++;\n\n // Store timestamp if needed\n if (pattern.needsTimestamps) {\n if (!existing.timestamps) existing.timestamps = [];\n existing.timestamps.push(event.ts);\n // Cap at MAX_TIMESTAMPS (keep most recent)\n if (existing.timestamps.length > MAX_TIMESTAMPS) {\n existing.timestamps = existing.timestamps.slice(-MAX_TIMESTAMPS);\n }\n }\n\n storage.set(pattern.stateKey, existing);\n anyIncremented = true;\n }\n\n // Notify subscribers if any counter changed\n if (anyIncremented) {\n for (const cb of subscribers) {\n try {\n cb();\n } catch (err) {\n console.error('[EventAccumulator] Subscriber error:', err);\n }\n }\n }\n }\n\n /**\n * Ensure the EventBus subscription is active when we have patterns.\n */\n function ensureSubscription(): void {\n if (unsubscribeFromBus || patterns.size === 0) return;\n unsubscribeFromBus = eventBus.subscribe(handleEvent);\n }\n\n return {\n register(key, predicate, needsTimestamps = false) {\n const stateKey = `${STATE_PREFIX}${key}`;\n\n // If pattern already registered, update needsTimestamps if upgrading\n const existing = patterns.get(stateKey);\n if (existing) {\n if (needsTimestamps && !existing.needsTimestamps) {\n existing.needsTimestamps = true;\n }\n return;\n }\n\n patterns.set(stateKey, { stateKey, needsTimestamps, predicate });\n ensureSubscription();\n },\n\n getCount(key, withinMs) {\n const stateKey = `${STATE_PREFIX}${key}`;\n const data = storage.get<CounterData>(stateKey);\n if (!data) return 0;\n\n // If no time window, return total count\n if (withinMs === undefined) return data.count;\n\n // Time-windowed count from timestamps\n if (!data.timestamps) return data.count; // No timestamps stored, return total as best effort\n const cutoff = Date.now() - withinMs;\n return data.timestamps.filter((ts) => ts >= cutoff).length;\n },\n\n subscribe(callback) {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n\n destroy() {\n if (unsubscribeFromBus) {\n unsubscribeFromBus();\n unsubscribeFromBus = null;\n }\n patterns.clear();\n subscribers.clear();\n },\n };\n}\n", "/**\n * EventBus - Normalized event stream for the runtime.\n *\n * The EventBus provides:\n * - Publish/subscribe for normalized events\n * - Event history for recent event lookups\n * - Filtering by name, pattern, or source\n */\nimport type { EventCallback, EventFilter, EventUnsubscribe, NormalizedEvent } from './types';\nimport { EVENT_SCHEMA_VERSION } from './types';\n\nexport interface EventBusOptions {\n /** Maximum number of events to keep in history */\n maxHistorySize?: number;\n}\n\ninterface Subscription {\n filter: EventFilter | undefined;\n callback: EventCallback;\n}\n\n/**\n * Check if an event matches a filter.\n */\nfunction matchesFilter(event: NormalizedEvent, filter?: EventFilter): boolean {\n if (!filter) return true;\n\n // Check name filter\n if (filter.names && filter.names.length > 0) {\n if (!filter.names.includes(event.name)) {\n return false;\n }\n }\n\n // Check pattern filter\n if (filter.patterns && filter.patterns.length > 0) {\n const matched = filter.patterns.some((pattern) => {\n try {\n const regex = new RegExp(pattern);\n return regex.test(event.name);\n } catch {\n return false;\n }\n });\n if (!matched) return false;\n }\n\n // Check source filter\n if (filter.sources && filter.sources.length > 0) {\n if (!filter.sources.includes(event.source)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * EventBus class for managing normalized events.\n */\nexport class EventBus {\n private subscriptions: Set<Subscription> = new Set();\n private history: NormalizedEvent[] = [];\n private maxHistorySize: number;\n\n constructor(options: EventBusOptions = {}) {\n this.maxHistorySize = options.maxHistorySize ?? 100;\n }\n\n /**\n * Subscribe to events matching an optional filter.\n * Returns an unsubscribe function.\n */\n subscribe(\n filterOrCallback: EventFilter | EventCallback,\n maybeCallback?: EventCallback\n ): EventUnsubscribe {\n let filter: EventFilter | undefined;\n let callback: EventCallback;\n\n // Handle overloaded signatures\n if (typeof filterOrCallback === 'function') {\n filter = undefined;\n callback = filterOrCallback;\n } else {\n filter = filterOrCallback;\n callback = maybeCallback!;\n }\n\n const subscription: Subscription = { filter, callback };\n this.subscriptions.add(subscription);\n\n return () => {\n this.subscriptions.delete(subscription);\n };\n }\n\n /**\n * Publish an event to all matching subscribers.\n */\n publish(\n name: string,\n props?: Record<string, unknown>,\n source: NormalizedEvent['source'] = 'canvas'\n ): void {\n const event: NormalizedEvent = {\n ts: Date.now(),\n name,\n source,\n props,\n schemaVersion: EVENT_SCHEMA_VERSION,\n };\n\n this.publishEvent(event);\n }\n\n /**\n * Publish a pre-constructed NormalizedEvent.\n */\n publishEvent(event: NormalizedEvent): void {\n // Add to history\n this.history.push(event);\n if (this.history.length > this.maxHistorySize) {\n this.history.shift();\n }\n\n // Notify matching subscribers\n for (const subscription of this.subscriptions) {\n if (matchesFilter(event, subscription.filter)) {\n try {\n subscription.callback(event);\n } catch (err) {\n console.error('[EventBus] Subscriber error:', err);\n }\n }\n }\n }\n\n /**\n * Get recent events matching an optional filter.\n */\n getRecent(filter?: EventFilter, limit?: number): NormalizedEvent[] {\n let events = this.history;\n\n if (filter) {\n events = events.filter((e) => matchesFilter(e, filter));\n }\n\n if (limit && limit > 0) {\n events = events.slice(-limit);\n }\n\n return events;\n }\n\n /**\n * Check if an event with a specific name occurred within a time window.\n */\n hasRecentEvent(eventName: string, withinMs: number, source?: NormalizedEvent['source']): boolean {\n const cutoff = Date.now() - withinMs;\n return this.history.some(\n (e) => e.name === eventName && e.ts >= cutoff && (source === undefined || e.source === source)\n );\n }\n\n /**\n * Count events matching a filter within a time window.\n */\n countRecentEvents(filter: EventFilter, withinMs?: number): number {\n let events = this.history.filter((e) => matchesFilter(e, filter));\n\n if (withinMs !== undefined) {\n const cutoff = Date.now() - withinMs;\n events = events.filter((e) => e.ts >= cutoff);\n }\n\n return events.length;\n }\n\n /**\n * Clear all event history.\n */\n clearHistory(): void {\n this.history = [];\n }\n\n /**\n * Get the number of current subscribers.\n */\n getSubscriberCount(): number {\n return this.subscriptions.size;\n }\n}\n\n/**\n * Create an EventBus instance.\n */\nexport function createEventBus(options: EventBusOptions = {}): EventBus {\n return new EventBus(options);\n}\n", "/**\n * PostHog Event Normalizer\n *\n * Transforms PostHog autocapture events into normalized events for the EventBus.\n *\n * This module is automatically wired up during `Syntro.init()` when PostHog\n * credentials are provided in the token. The flow is:\n *\n * 1. PostHog captures user interactions (clicks, scrolls, navigation, etc.)\n * 2. PostHog's `eventCaptured` callback fires\n * 3. `createPostHogNormalizer()` transforms the event to a NormalizedEvent\n * 4. The normalized event is published to the EventBus\n *\n * This allows canvas components and decision strategies to react to user\n * interactions with the main webapp, not just canvas-specific events.\n *\n * @example\n * ```typescript\n * // In bootstrap.ts (already wired up automatically)\n * const normalizer = createPostHogNormalizer((event) => {\n * eventBus.publishEvent(event);\n * });\n *\n * // PostHog adapter calls normalizer on each capture\n * posthog.on('eventCaptured', normalizer);\n * ```\n *\n * @see RUNTIME_V2_REFERENCE.md for the full event mapping table\n */\nimport type { NormalizedEvent } from '../types';\nimport { EVENT_SCHEMA_VERSION, StandardEvents } from '../types';\n\n/**\n * PostHog event structure (simplified).\n */\ninterface PostHogEvent {\n event: string;\n properties?: Record<string, unknown>;\n timestamp?: string | number;\n}\n\n/**\n * Map PostHog event names to normalized event names.\n */\nconst POSTHOG_EVENT_MAP: Record<string, string> = {\n // Autocapture events\n $autocapture: 'ui.click', // Default autocapture is usually clicks\n $click: StandardEvents.UI_CLICK,\n $scroll: StandardEvents.UI_SCROLL,\n $input: StandardEvents.UI_INPUT,\n $change: StandardEvents.UI_CHANGE,\n $submit: StandardEvents.UI_SUBMIT,\n\n // Navigation events\n $pageview: StandardEvents.NAV_PAGE_VIEW,\n $pageleave: StandardEvents.NAV_PAGE_LEAVE,\n\n // Session events\n $session_start: 'session.start',\n\n // Identify events\n $identify: 'user.identify',\n};\n\n/**\n * Extract the normalized event name from a PostHog event.\n */\nfunction getEventName(phEvent: PostHogEvent): string {\n const eventName = phEvent.event;\n\n // Defensive guard: PostHog's eventCaptured can emit non-string event names\n if (typeof eventName !== 'string') {\n return 'posthog.unknown';\n }\n\n // Check mapped events\n if (POSTHOG_EVENT_MAP[eventName]) {\n return POSTHOG_EVENT_MAP[eventName];\n }\n\n // For autocapture, check the element type to determine the action\n if (eventName === '$autocapture') {\n const tagName = phEvent.properties?.$tag_name as string | undefined;\n const eventType = phEvent.properties?.$event_type as string | undefined;\n\n if (eventType === 'submit') return StandardEvents.UI_SUBMIT;\n if (eventType === 'change') return StandardEvents.UI_CHANGE;\n if (tagName === 'input' || tagName === 'textarea') return StandardEvents.UI_INPUT;\n\n return StandardEvents.UI_CLICK;\n }\n\n // For custom events, prefix with \"posthog.\" to namespace them\n if (!eventName.startsWith('$')) {\n return `posthog.${eventName}`;\n }\n\n // Pass through other $ events as-is but normalized\n return eventName.replace('$', 'posthog.');\n}\n\n/**\n * Extract relevant properties from a PostHog event.\n */\nfunction extractProps(phEvent: PostHogEvent): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const phProps = phEvent.properties || {};\n\n // Element info \u2014 $tag_name may be a top-level property OR only inside $elements[0].\n // PostHog v1.300+ often omits the top-level $tag_name for autocapture events,\n // so fall back to $elements[0].tag_name when available.\n const elements = phProps.$elements as Array<Record<string, unknown>> | undefined;\n if (phProps.$tag_name) {\n props.tagName = phProps.$tag_name;\n } else if (elements?.[0]?.tag_name) {\n props.tagName = elements[0].tag_name;\n }\n if (phProps.$el_text) props.elementText = phProps.$el_text;\n if (elements) props.elements = elements;\n\n // URL/page info\n if (phProps.$current_url) props.url = phProps.$current_url;\n if (phProps.$pathname) props.pathname = phProps.$pathname;\n if (phProps.$host) props.host = phProps.$host;\n\n // Device/viewport info\n if (phProps.$viewport_width) props.viewportWidth = phProps.$viewport_width;\n if (phProps.$viewport_height) props.viewportHeight = phProps.$viewport_height;\n\n // Session info\n if (phProps.$session_id) props.sessionId = phProps.$session_id;\n\n // Scroll-specific properties\n if (phProps.$scroll_depth) props.scrollDepth = phProps.$scroll_depth;\n if (phProps.$scroll_percentage) props.scrollPercentage = phProps.$scroll_percentage;\n\n // Original event name\n props.originalEvent = phEvent.event;\n\n return props;\n}\n\n/**\n * Normalize a PostHog event into a NormalizedEvent.\n */\nexport function normalizePostHogEvent(phEvent: PostHogEvent): NormalizedEvent {\n // Parse timestamp\n let ts: number;\n if (typeof phEvent.timestamp === 'number') {\n ts = phEvent.timestamp;\n } else if (typeof phEvent.timestamp === 'string') {\n ts = new Date(phEvent.timestamp).getTime();\n } else {\n ts = Date.now();\n }\n\n return {\n ts,\n name: getEventName(phEvent),\n source: 'posthog',\n props: extractProps(phEvent),\n schemaVersion: EVENT_SCHEMA_VERSION,\n };\n}\n\n/**\n * Check if a PostHog event should be normalized.\n * Filters out internal/system events that aren't useful for adaptives.\n */\nexport function shouldNormalizeEvent(phEvent: PostHogEvent): boolean {\n const eventName = phEvent.event;\n if (typeof eventName !== 'string') return false;\n\n // Skip internal PostHog events\n const skipEvents = [\n '$feature_flag_called',\n '$feature_flags',\n '$groups',\n '$groupidentify',\n '$set',\n '$set_once',\n '$unset',\n '$create_alias',\n '$capture_metrics',\n '$performance_event',\n '$web_vitals',\n '$exception',\n '$dead_click',\n '$heatmap',\n ];\n\n if (skipEvents.includes(eventName)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Create a function that hooks into PostHog's onCapture callback\n * and normalizes events into the EventBus.\n */\nexport function createPostHogNormalizer(\n publishFn: (event: NormalizedEvent) => void\n): (eventName: string, properties?: Record<string, unknown>) => void {\n return (eventName: string, properties?: Record<string, unknown>) => {\n if (typeof eventName !== 'string') return;\n const phEvent: PostHogEvent = {\n event: eventName,\n properties,\n timestamp: Date.now(),\n };\n\n if (shouldNormalizeEvent(phEvent)) {\n const normalizedEvent = normalizePostHogEvent(phEvent);\n publishFn(normalizedEvent);\n }\n };\n}\n", "/**\n * NavigationMonitor - Centralized History API patching.\n *\n * This is the SINGLE point in the SDK that wraps history.pushState and\n * history.replaceState. All other modules that need to react to navigation\n * (ContextManager, overlay runner, tour executor, SmartCanvasApp) must\n * subscribe to this monitor instead of patching the History API directly.\n *\n * This prevents the \"quadruple-patching\" problem where multiple SDK modules\n * each wrap pushState/replaceState independently, creating a fragile chain\n * that can break when combined with React Router, GA4, and GTM \u2014 all of\n * which also wrap the History API.\n */\n\nexport type NavigationMethod = 'pushState' | 'replaceState' | 'popstate';\n\nexport type NavigationListener = (url: string, method: NavigationMethod) => void;\n\nexport interface NavigationDiagnostics {\n /** Whether pushState was native (not already wrapped) when we captured it */\n isNative: boolean;\n /** Number of active subscribers */\n subscriberCount: number;\n}\n\nexport class NavigationMonitor {\n private listeners = new Set<NavigationListener>();\n private capturedPushState: typeof history.pushState;\n private capturedReplaceState: typeof history.replaceState;\n private wasNative: boolean;\n private destroyed = false;\n\n constructor() {\n // Detect if pushState is already wrapped by another library\n this.wasNative = this.isNativeFunction(history.pushState);\n\n // Capture whatever is current (may already be wrapped by React Router / GA4).\n // Do NOT .bind() \u2014 preserve the exact reference so destroy() restores it cleanly.\n this.capturedPushState = history.pushState;\n this.capturedReplaceState = history.replaceState;\n\n // Apply our single wrapper\n history.pushState = (...args: Parameters<typeof history.pushState>) => {\n this.capturedPushState.call(history, ...args);\n // Defer notification to avoid conflicts with React's commit phase\n queueMicrotask(() => this.notify(window.location.href, 'pushState'));\n };\n\n history.replaceState = (...args: Parameters<typeof history.replaceState>) => {\n this.capturedReplaceState.call(history, ...args);\n queueMicrotask(() => this.notify(window.location.href, 'replaceState'));\n };\n\n // Listen for back/forward navigation\n window.addEventListener('popstate', this.onPopState);\n }\n\n /**\n * Subscribe to navigation events.\n * Returns an unsubscribe function.\n */\n subscribe(listener: NavigationListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Get diagnostics about the History API chain.\n */\n diagnose(): NavigationDiagnostics {\n return {\n isNative: this.wasNative,\n subscriberCount: this.listeners.size,\n };\n }\n\n /**\n * Restore the History API to the state we captured and remove all listeners.\n */\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n\n history.pushState = this.capturedPushState;\n history.replaceState = this.capturedReplaceState;\n window.removeEventListener('popstate', this.onPopState);\n this.listeners.clear();\n }\n\n // \u2500\u2500\u2500 Private \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private onPopState = (): void => {\n this.notify(window.location.href, 'popstate');\n };\n\n private notify(url: string, method: NavigationMethod): void {\n if (this.destroyed) return;\n for (const listener of this.listeners) {\n try {\n listener(url, method);\n } catch {\n // Subscriber errors must not crash the navigation chain\n }\n }\n }\n\n private isNativeFunction(fn: Function): boolean {\n try {\n return Function.prototype.toString.call(fn).includes('[native code]');\n } catch {\n return false;\n }\n }\n}\n", "/**\n * Cooldown Store Implementation\n *\n * Tracks time-based cooldowns to prevent items from showing too frequently.\n */\nimport type { CooldownStore, ScopedStorage } from '../types';\n\nconst COOLDOWN_PREFIX = 'cooldown:';\n\nexport function createCooldownStore(storage: ScopedStorage): CooldownStore {\n return {\n set(key: string, durationMs: number): void {\n const storageKey = COOLDOWN_PREFIX + key;\n const expiresAt = Date.now() + durationMs;\n storage.set(storageKey, expiresAt);\n },\n\n isActive(key: string): boolean {\n return this.remaining(key) > 0;\n },\n\n remaining(key: string): number {\n const storageKey = COOLDOWN_PREFIX + key;\n const expiresAt = storage.get<number>(storageKey);\n if (expiresAt === undefined) return 0;\n\n const remaining = expiresAt - Date.now();\n if (remaining <= 0) {\n // Clean up expired cooldown\n storage.remove(storageKey);\n return 0;\n }\n\n return remaining;\n },\n\n clear(key: string): void {\n const storageKey = COOLDOWN_PREFIX + key;\n storage.remove(storageKey);\n },\n };\n}\n", "/**\n * Dismissal Store Implementation\n *\n * Tracks dismissed items in session or user storage.\n */\nimport type { DismissalStore, ScopedStorage } from '../types';\n\nconst DISMISSAL_PREFIX = 'dismissed:';\n\nexport function createDismissalStore(\n sessionStorage: ScopedStorage,\n userStorage: ScopedStorage\n): DismissalStore {\n return {\n mark(key: string, permanent = false): void {\n const storageKey = DISMISSAL_PREFIX + key;\n const storage = permanent ? userStorage : sessionStorage;\n storage.set(storageKey, true);\n },\n\n isDismissed(key: string): boolean {\n const storageKey = DISMISSAL_PREFIX + key;\n // Check both session and user storage\n return sessionStorage.has(storageKey) || userStorage.has(storageKey);\n },\n\n clear(key: string): void {\n const storageKey = DISMISSAL_PREFIX + key;\n sessionStorage.remove(storageKey);\n userStorage.remove(storageKey);\n },\n\n clearAll(): void {\n // Clear all dismissal keys from both storages\n for (const key of sessionStorage.keys()) {\n if (key.startsWith(DISMISSAL_PREFIX)) {\n sessionStorage.remove(key);\n }\n }\n for (const key of userStorage.keys()) {\n if (key.startsWith(DISMISSAL_PREFIX)) {\n userStorage.remove(key);\n }\n }\n },\n };\n}\n", "/**\n * Frequency Store Implementation\n *\n * Tracks how many times items have been shown or actions taken,\n * optionally resetting after a time window.\n */\nimport type { FrequencyEntry, FrequencyStore, ScopedStorage } from '../types';\n\nconst FREQUENCY_PREFIX = 'freq:';\n\nexport function createFrequencyStore(storage: ScopedStorage): FrequencyStore {\n function getEntry(key: string): FrequencyEntry | undefined {\n const storageKey = FREQUENCY_PREFIX + key;\n const entry = storage.get<FrequencyEntry>(storageKey);\n if (!entry) return undefined;\n\n // Check if reset time has passed\n if (entry.resetAt && Date.now() >= entry.resetAt) {\n storage.remove(storageKey);\n return undefined;\n }\n\n return entry;\n }\n\n return {\n increment(key: string, resetAfterMs?: number): number {\n const storageKey = FREQUENCY_PREFIX + key;\n const existing = getEntry(key);\n\n const newCount = (existing?.count ?? 0) + 1;\n const entry: FrequencyEntry = {\n count: newCount,\n // Keep existing resetAt or set new one\n resetAt: existing?.resetAt ?? (resetAfterMs ? Date.now() + resetAfterMs : undefined),\n };\n\n storage.set(storageKey, entry);\n return newCount;\n },\n\n count(key: string): number {\n const entry = getEntry(key);\n return entry?.count ?? 0;\n },\n\n reset(key: string): void {\n const storageKey = FREQUENCY_PREFIX + key;\n storage.remove(storageKey);\n },\n\n hasReachedLimit(key: string, limit: number): boolean {\n return this.count(key) >= limit;\n },\n };\n}\n", "/**\n * StateStore - Unified state management for the runtime.\n *\n * Provides scoped storage (session and user) with built-in helpers\n * for common patterns like dismissals, cooldowns, and frequency caps.\n */\nimport { createCooldownStore } from './helpers/cooldowns';\nimport { createDismissalStore } from './helpers/dismissals';\nimport { createFrequencyStore } from './helpers/frequency';\nimport type {\n CooldownStore,\n DismissalStore,\n FrequencyStore,\n ScopedStorage,\n StoredValue,\n} from './types';\n\nexport interface StateStoreOptions {\n /** Namespace prefix for storage keys */\n namespace?: string;\n}\n\nconst DEFAULT_NAMESPACE = 'syntro';\n\n/**\n * Create a ScopedStorage backed by browser storage.\n */\nfunction createBrowserStorage(storage: Storage | undefined, namespace: string): ScopedStorage {\n const prefix = `${namespace}:`;\n\n return {\n get<T>(key: string): T | undefined {\n if (!storage) return undefined;\n\n try {\n const raw = storage.getItem(prefix + key);\n if (!raw) return undefined;\n\n const stored: StoredValue<T> = JSON.parse(raw);\n\n // Check TTL\n if (stored.expiresAt && Date.now() >= stored.expiresAt) {\n storage.removeItem(prefix + key);\n return undefined;\n }\n\n return stored.value;\n } catch {\n return undefined;\n }\n },\n\n set<T>(key: string, value: T, ttlMs?: number): void {\n if (!storage) return;\n\n try {\n const stored: StoredValue<T> = {\n value,\n expiresAt: ttlMs ? Date.now() + ttlMs : undefined,\n };\n storage.setItem(prefix + key, JSON.stringify(stored));\n } catch (err) {\n console.warn('[StateStore] Failed to save:', err);\n }\n },\n\n remove(key: string): void {\n if (!storage) return;\n storage.removeItem(prefix + key);\n },\n\n has(key: string): boolean {\n if (!storage) return false;\n return this.get(key) !== undefined;\n },\n\n keys(): string[] {\n if (!storage) return [];\n\n const keys: string[] = [];\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (key?.startsWith(prefix)) {\n keys.push(key.slice(prefix.length));\n }\n }\n return keys;\n },\n\n clear(): void {\n if (!storage) return;\n\n const keysToRemove = this.keys();\n for (const key of keysToRemove) {\n storage.removeItem(prefix + key);\n }\n },\n };\n}\n\n/**\n * Create an in-memory ScopedStorage (for SSR/testing).\n */\nfunction createMemoryStorage(namespace: string): ScopedStorage {\n const store = new Map<string, StoredValue>();\n const prefix = `${namespace}:`;\n\n return {\n get<T>(key: string): T | undefined {\n const stored = store.get(prefix + key);\n if (!stored) return undefined;\n\n if (stored.expiresAt && Date.now() >= stored.expiresAt) {\n store.delete(prefix + key);\n return undefined;\n }\n\n return stored.value as T;\n },\n\n set<T>(key: string, value: T, ttlMs?: number): void {\n store.set(prefix + key, {\n value,\n expiresAt: ttlMs ? Date.now() + ttlMs : undefined,\n });\n },\n\n remove(key: string): void {\n store.delete(prefix + key);\n },\n\n has(key: string): boolean {\n return this.get(key) !== undefined;\n },\n\n keys(): string[] {\n const keys: string[] = [];\n for (const key of store.keys()) {\n if (key.startsWith(prefix)) {\n keys.push(key.slice(prefix.length));\n }\n }\n return keys;\n },\n\n clear(): void {\n for (const key of store.keys()) {\n if (key.startsWith(prefix)) {\n store.delete(key);\n }\n }\n },\n };\n}\n\n/**\n * StateStore class for unified state management.\n */\nexport class StateStore {\n /** Session-scoped storage (cleared on browser close) */\n readonly session: ScopedStorage;\n\n /** User-scoped storage (persists across sessions) */\n readonly user: ScopedStorage;\n\n /** Dismissal tracking */\n readonly dismissals: DismissalStore;\n\n /** Cooldown tracking */\n readonly cooldowns: CooldownStore;\n\n /** Frequency tracking */\n readonly frequency: FrequencyStore;\n\n private readonly namespace: string;\n private readonly namespacedStorages: Map<string, ScopedStorage> = new Map();\n\n constructor(options: StateStoreOptions = {}) {\n this.namespace = options.namespace ?? DEFAULT_NAMESPACE;\n\n // Create scoped storages\n if (typeof window !== 'undefined') {\n this.session = createBrowserStorage(\n typeof sessionStorage !== 'undefined' ? sessionStorage : undefined,\n this.namespace\n );\n this.user = createBrowserStorage(\n typeof localStorage !== 'undefined' ? localStorage : undefined,\n this.namespace\n );\n } else {\n // SSR fallback to in-memory storage\n this.session = createMemoryStorage(this.namespace);\n this.user = createMemoryStorage(this.namespace);\n }\n\n // Create helpers\n this.dismissals = createDismissalStore(this.session, this.user);\n this.cooldowns = createCooldownStore(this.user); // Cooldowns persist\n this.frequency = createFrequencyStore(this.session); // Frequency is session-based\n }\n\n /**\n * Create a namespaced storage scope.\n * Useful for isolating state by adaptive/tile.\n *\n * @param namespace - Additional namespace segment\n * @returns A ScopedStorage with the nested namespace\n */\n ns(namespace: string): ScopedStorage {\n const fullNamespace = `${this.namespace}:${namespace}`;\n\n if (!this.namespacedStorages.has(fullNamespace)) {\n const storage =\n typeof window !== 'undefined' && typeof sessionStorage !== 'undefined'\n ? createBrowserStorage(sessionStorage, fullNamespace)\n : createMemoryStorage(fullNamespace);\n this.namespacedStorages.set(fullNamespace, storage);\n }\n\n return this.namespacedStorages.get(fullNamespace)!;\n }\n}\n\n/**\n * Create a StateStore instance.\n */\nexport function createStateStore(options: StateStoreOptions = {}): StateStore {\n return new StateStore(options);\n}\n", "/**\n * Surfaces Types\n *\n * Defines types for the managed surface system that renders UI into named slots.\n * Surfaces handles layout, stacking, animations, and priority-based arbitration.\n */\n\nimport type { Placement } from '@floating-ui/dom';\n\n// ============================================================================\n// Surface Slot Types\n// ============================================================================\n\n/** Static surface slots with fixed positioning */\nexport type StaticSurfaceSlot =\n | 'drawer_right'\n | 'drawer_left'\n | 'drawer_bottom'\n | 'overlay_center'\n | 'overlay_corner_br'\n | 'overlay_corner_bl'\n | 'toast_top'\n | 'toast_bottom';\n\n/** Dynamic inline slot (rendered inside anchor) */\nexport type InlineSurfaceSlot = `inline:${string}`;\n\n/** Dynamic adjacent slot (positioned near anchor) */\nexport type AdjacentSurfaceSlot = `adjacent:${string}`;\n\n/** All surface slot types */\nexport type SurfaceSlot = StaticSurfaceSlot | InlineSurfaceSlot | AdjacentSurfaceSlot;\n\n// ============================================================================\n// Content Types\n// ============================================================================\n\n/** React component content */\nexport interface ReactContent {\n type: 'react';\n component: unknown;\n props?: Record<string, unknown>;\n}\n\n/** HTML string content */\nexport interface HtmlContent {\n type: 'html';\n content: string;\n}\n\n/** Widget reference content */\nexport interface WidgetContent {\n type: 'widget';\n widgetId: string;\n config?: Record<string, unknown>;\n}\n\n/** Custom mount function content */\nexport interface CustomContent {\n type: 'custom';\n mount: (container: HTMLElement) => () => void;\n}\n\n/** Union of all renderable content types */\nexport type RenderableContent = ReactContent | HtmlContent | WidgetContent | CustomContent;\n\n// ============================================================================\n// Position & Layout Types\n// ============================================================================\n\n/** Position configuration for adjacent slots */\nexport interface PositionConfig {\n placement: Placement | 'auto';\n offset?: { x: number; y: number };\n flip?: boolean;\n shift?: boolean;\n}\n\n/** Size constraints for mounted content */\nexport interface MountConstraints {\n maxWidth?: string;\n maxHeight?: string;\n minWidth?: string;\n minHeight?: string;\n}\n\n/** Animation types for enter/exit */\nexport type AnimationType = 'fade' | 'slide' | 'scale' | 'none';\n\n// ============================================================================\n// Mount Options & Handle Types\n// ============================================================================\n\n/** Options when mounting content to a surface */\nexport interface MountOptions {\n /** Priority for conflict resolution (higher wins) */\n priority?: number;\n\n /** Whether to unmount other content in the same slot */\n exclusive?: boolean;\n\n /** Animation for enter/exit */\n animation?: AnimationType;\n\n /** Position configuration for adjacent slots */\n position?: PositionConfig;\n\n /** Size constraints */\n constraints?: MountConstraints;\n\n /** ID of the adaptive mounting this content */\n adaptiveId?: string;\n\n /** Whether to auto-unmount on route change */\n autoUnmountOnRouteChange?: boolean;\n}\n\n/** Handle returned when content is mounted */\nexport interface MountHandle {\n /** Unique ID for this mount */\n id: string;\n\n /** Update the content */\n update: (content: RenderableContent) => void;\n\n /** Update mount options */\n setOptions: (opts: Partial<MountOptions>) => void;\n\n /** Unmount the content */\n unmount: () => void;\n\n /** Check if still mounted */\n isMounted: () => boolean;\n\n /** Get the DOM container element */\n getContainer: () => HTMLElement | null;\n}\n\n// ============================================================================\n// Surface State Types\n// ============================================================================\n\n/** State of a surface slot */\nexport interface SurfaceState {\n /** The slot identifier */\n slot: SurfaceSlot;\n\n /** Whether the slot is currently occupied */\n occupied: boolean;\n\n /** Priority of the current content (if occupied) */\n currentPriority?: number;\n\n /** Adaptive ID that owns current content */\n currentAdaptiveId?: string;\n\n /** Total number of mounts to this slot this session */\n mountCount: number;\n\n /** ID of the current mount (if occupied) */\n currentMountId?: string;\n}\n\n/** Callback for surface state changes */\nexport type SurfaceChangeCallback = (state: SurfaceState) => void;\n\n// ============================================================================\n// Surfaces Interface\n// ============================================================================\n\n/** Widget registry interface (subset needed by Surfaces) */\nexport interface SurfacesWidgetRegistry {\n has: (id: string) => boolean;\n mount: (\n id: string,\n container: HTMLElement,\n config?: Record<string, unknown>\n ) => { unmount: () => void; update: (config?: Record<string, unknown>) => void };\n}\n\n/** Options for creating a Surfaces instance */\nexport interface SurfacesOptions {\n /** Overlay root element for rendering */\n overlayRoot: HTMLElement;\n\n /** Event bus for publishing surface events */\n eventBus?: {\n publish: (name: string, props?: Record<string, unknown>) => void;\n };\n\n /** Function to resolve anchor IDs to elements (for inline/adjacent slots) */\n anchorResolver?: (anchorId: string) => HTMLElement | null;\n\n /** Default animation type */\n defaultAnimation?: AnimationType;\n\n /** Widget registry for resolving widget content */\n widgetRegistry?: SurfacesWidgetRegistry;\n}\n\n/** The Surfaces interface */\nexport interface Surfaces {\n /** Mount content to a surface slot */\n mount: (slot: SurfaceSlot, content: RenderableContent, opts?: MountOptions) => MountHandle;\n\n /** Get the current state of a slot */\n getState: (slot: SurfaceSlot) => SurfaceState;\n\n /** Subscribe to state changes for a slot */\n onStateChange: (slot: SurfaceSlot, fn: SurfaceChangeCallback) => () => void;\n\n /** Check if content can be mounted to a slot */\n canMount: (slot: SurfaceSlot, priority?: number) => boolean;\n\n /** Clean up all mounted surfaces */\n destroy: () => void;\n}\n\n// ============================================================================\n// Internal Types\n// ============================================================================\n\n/** Resolved internal options (with defaults applied) */\nexport interface InternalMountOptions {\n priority: number;\n exclusive: boolean;\n animation: AnimationType;\n position: PositionConfig;\n constraints: MountConstraints;\n adaptiveId?: string;\n autoUnmountOnRouteChange: boolean;\n}\n\n/** Internal mount entry */\nexport interface InternalMountEntry {\n id: string;\n slot: SurfaceSlot;\n content: RenderableContent;\n options: InternalMountOptions;\n container: HTMLElement;\n cleanup?: () => void;\n mountedAt: number;\n}\n\n/** Slot type classifier */\nexport function getSlotType(slot: SurfaceSlot): 'static' | 'inline' | 'adjacent' {\n if (slot.startsWith('inline:')) return 'inline';\n if (slot.startsWith('adjacent:')) return 'adjacent';\n return 'static';\n}\n\n/** Extract anchor ID from inline/adjacent slots */\nexport function getSlotAnchorId(slot: SurfaceSlot): string | null {\n if (slot.startsWith('inline:')) return slot.slice(7);\n if (slot.startsWith('adjacent:')) return slot.slice(9);\n return null;\n}\n", "/**\n * Surfaces Positioning\n *\n * Handles positioning for different slot types using CSS for static slots\n * and Floating UI for adjacent slots.\n */\n\nimport { autoUpdate, computePosition, flip, offset, type Placement, shift } from '@floating-ui/dom';\n\nimport type {\n AnimationType,\n MountConstraints,\n PositionConfig,\n StaticSurfaceSlot,\n SurfaceSlot,\n} from './types';\nimport { getSlotType } from './types';\n\n/**\n * CSS styles for static surface slots.\n */\nexport const STATIC_SLOT_STYLES: Record<StaticSurfaceSlot, Record<string, string>> = {\n drawer_right: {\n position: 'fixed',\n top: '0',\n right: '0',\n bottom: '0',\n width: '360px',\n maxWidth: '90vw',\n },\n drawer_left: {\n position: 'fixed',\n top: '0',\n left: '0',\n bottom: '0',\n width: '360px',\n maxWidth: '90vw',\n },\n drawer_bottom: {\n position: 'fixed',\n left: '0',\n right: '0',\n bottom: '0',\n maxHeight: '50vh',\n },\n overlay_center: {\n position: 'fixed',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n maxWidth: '90vw',\n maxHeight: '90vh',\n },\n overlay_corner_br: {\n position: 'fixed',\n bottom: '16px',\n right: '16px',\n maxWidth: '400px',\n maxHeight: '80vh',\n },\n overlay_corner_bl: {\n position: 'fixed',\n bottom: '16px',\n left: '16px',\n maxWidth: '400px',\n maxHeight: '80vh',\n },\n toast_top: {\n position: 'fixed',\n top: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n maxWidth: '90vw',\n },\n toast_bottom: {\n position: 'fixed',\n bottom: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n maxWidth: '90vw',\n },\n};\n\n/**\n * Animation keyframes for different animation types.\n */\nexport const ANIMATION_KEYFRAMES: Record<AnimationType, Keyframe[]> = {\n fade: [{ opacity: 0 }, { opacity: 1 }],\n slide: [\n { opacity: 0, transform: 'translateY(10px)' },\n { opacity: 1, transform: 'translateY(0)' },\n ],\n scale: [\n { opacity: 0, transform: 'scale(0.95)' },\n { opacity: 1, transform: 'scale(1)' },\n ],\n none: [],\n};\n\n/**\n * Animation options.\n */\nexport const ANIMATION_OPTIONS: KeyframeAnimationOptions = {\n duration: 200,\n easing: 'cubic-bezier(0.16, 1, 0.3, 1)',\n fill: 'forwards',\n};\n\n/**\n * Apply static slot positioning to an element.\n */\nexport function applyStaticSlotStyles(\n element: HTMLElement,\n slot: StaticSurfaceSlot,\n constraints?: MountConstraints\n): void {\n const styles = STATIC_SLOT_STYLES[slot];\n Object.assign(element.style, styles);\n\n // Apply constraints\n if (constraints) {\n if (constraints.maxWidth) element.style.maxWidth = constraints.maxWidth;\n if (constraints.maxHeight) element.style.maxHeight = constraints.maxHeight;\n if (constraints.minWidth) element.style.minWidth = constraints.minWidth;\n if (constraints.minHeight) element.style.minHeight = constraints.minHeight;\n }\n}\n\n/**\n * Set up adjacent slot positioning using Floating UI.\n * Returns a cleanup function.\n */\nexport function setupAdjacentPositioning(\n container: HTMLElement,\n anchorEl: HTMLElement,\n config: PositionConfig\n): () => void {\n const placement: Placement = config.placement === 'auto' ? 'bottom' : config.placement;\n\n const middleware = [\n offset(config.offset ? { mainAxis: config.offset.y, crossAxis: config.offset.x } : 8),\n ];\n\n if (config.flip !== false) {\n middleware.push(flip());\n }\n\n if (config.shift !== false) {\n middleware.push(shift({ padding: 8 }));\n }\n\n // Set initial position style\n container.style.position = 'absolute';\n container.style.zIndex = '2147483646';\n\n const cleanup = autoUpdate(anchorEl, container, async () => {\n const { x, y, strategy } = await computePosition(anchorEl, container, {\n placement,\n middleware,\n });\n\n Object.assign(container.style, {\n position: strategy,\n left: `${x}px`,\n top: `${y}px`,\n });\n });\n\n return cleanup;\n}\n\n/**\n * Set up inline slot positioning.\n * Inline slots render content inside the anchor element.\n */\nexport function setupInlinePositioning(\n container: HTMLElement,\n anchorEl: HTMLElement,\n position: 'prepend' | 'append' = 'append'\n): () => void {\n // Reset container positioning (inline is flow-based)\n container.style.position = 'relative';\n container.style.display = 'inline-block';\n\n if (position === 'prepend') {\n anchorEl.insertBefore(container, anchorEl.firstChild);\n } else {\n anchorEl.appendChild(container);\n }\n\n return () => {\n container.remove();\n };\n}\n\n/**\n * Play enter animation on an element.\n */\nexport function playEnterAnimation(\n element: HTMLElement,\n animationType: AnimationType\n): Animation | null {\n if (animationType === 'none' || ANIMATION_KEYFRAMES[animationType].length === 0) {\n return null;\n }\n\n return element.animate(ANIMATION_KEYFRAMES[animationType], ANIMATION_OPTIONS);\n}\n\n/**\n * Play exit animation on an element.\n * Returns a promise that resolves when the animation completes.\n */\nexport function playExitAnimation(\n element: HTMLElement,\n animationType: AnimationType\n): Promise<void> {\n if (animationType === 'none' || ANIMATION_KEYFRAMES[animationType].length === 0) {\n return Promise.resolve();\n }\n\n const keyframes = [...ANIMATION_KEYFRAMES[animationType]].reverse();\n const animation = element.animate(keyframes, ANIMATION_OPTIONS);\n\n return new Promise((resolve) => {\n animation.onfinish = () => resolve();\n animation.oncancel = () => resolve();\n });\n}\n\n/**\n * Create and style a surface container element.\n */\nexport function createSurfaceContainer(slot: SurfaceSlot, id: string): HTMLElement {\n const container = document.createElement('div');\n container.setAttribute('data-syntro-surface', slot);\n container.setAttribute('data-syntro-mount-id', id);\n container.className = 'syntro-surface';\n\n // Base styles for all surfaces\n Object.assign(container.style, {\n pointerEvents: 'auto',\n boxSizing: 'border-box',\n overflow: 'auto',\n });\n\n return container;\n}\n\n/**\n * Get the z-index for a slot type.\n */\nexport function getSlotZIndex(slot: SurfaceSlot): number {\n const type = getSlotType(slot);\n switch (type) {\n case 'static':\n // Drawers and overlays\n if (slot.startsWith('drawer')) return 2147483640;\n if (slot.startsWith('overlay')) return 2147483642;\n if (slot.startsWith('toast')) return 2147483644;\n return 2147483640;\n case 'inline':\n // Inline content doesn't need high z-index\n return 1;\n case 'adjacent':\n // Adjacent content needs to be above page content\n return 2147483638;\n default:\n return 2147483640;\n }\n}\n", "export function sanitizeWithFallback(html: string): string {\n const hasNative = typeof (window as any).Sanitizer === 'function';\n if (hasNative) {\n try {\n const s = new (window as any).Sanitizer({});\n const frag = s.sanitizeToFragment(html);\n const div = document.createElement('div');\n div.append(frag);\n return div.innerHTML;\n } catch {\n // Fallback to conservative sanitizer below\n }\n }\n // very conservative fallback\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n const root = tpl.content;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null);\n const allowed = new Set([\n 'b',\n 'strong',\n 'i',\n 'em',\n 'u',\n 'span',\n 'div',\n 'p',\n 'br',\n 'ul',\n 'ol',\n 'li',\n 'code',\n 'pre',\n 'small',\n 'sup',\n 'sub',\n 'a',\n 'button',\n ]);\n const toRemove: Element[] = [];\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n const tag = el.tagName.toLowerCase();\n if (!allowed.has(tag)) {\n toRemove.push(el);\n continue;\n }\n for (const attr of Array.from(el.attributes)) {\n const n = attr.name.toLowerCase();\n const v = attr.value.trim().toLowerCase();\n const isEvent = n.startsWith('on');\n const isJsUrl = (n === 'href' || n === 'src') && v.startsWith('javascript:');\n if (isEvent || isJsUrl) el.removeAttribute(attr.name);\n }\n }\n for (const el of toRemove) {\n while (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\n el.remove();\n }\n return (tpl.innerHTML = root.firstChild ? tpl.innerHTML : tpl.innerHTML);\n}\n", "/**\n * Surfaces\n *\n * Managed surface system for rendering UI into named slots.\n * Handles layout, stacking, animations, and priority-based arbitration.\n */\n\nimport { sanitizeWithFallback } from '../hostPatcher/core/sanitizer';\n\nimport {\n applyStaticSlotStyles,\n createSurfaceContainer,\n getSlotZIndex,\n playEnterAnimation,\n playExitAnimation,\n setupAdjacentPositioning,\n setupInlinePositioning,\n} from './positioning';\nimport type {\n InternalMountEntry,\n MountHandle,\n MountOptions,\n RenderableContent,\n StaticSurfaceSlot,\n SurfaceChangeCallback,\n SurfaceSlot,\n SurfaceState,\n Surfaces,\n SurfacesOptions,\n} from './types';\nimport { getSlotAnchorId, getSlotType } from './types';\n\n/** Counter for generating unique mount IDs */\nlet mountIdCounter = 0;\n\n/**\n * Create a Surfaces instance.\n */\nexport function createSurfaces(options: SurfacesOptions): Surfaces {\n const {\n overlayRoot,\n eventBus,\n anchorResolver,\n defaultAnimation = 'fade',\n widgetRegistry,\n } = options;\n\n /** Map of current mounts by slot */\n const mounts = new Map<SurfaceSlot, InternalMountEntry>();\n\n /** Map of mount counts by slot (for stats) */\n const mountCounts = new Map<SurfaceSlot, number>();\n\n /** Map of state change callbacks by slot */\n const stateCallbacks = new Map<SurfaceSlot, Set<SurfaceChangeCallback>>();\n\n /**\n * Generate a unique mount ID.\n */\n function generateMountId(): string {\n return `mount-${++mountIdCounter}`;\n }\n\n /**\n * Publish an event to the EventBus if available.\n */\n function publishEvent(name: string, props?: Record<string, unknown>): void {\n if (eventBus) {\n eventBus.publish(name, props);\n }\n }\n\n /**\n * Notify state change callbacks for a slot.\n */\n function notifyStateChange(slot: SurfaceSlot): void {\n const callbacks = stateCallbacks.get(slot);\n if (callbacks) {\n const state = getState(slot);\n for (const callback of callbacks) {\n try {\n callback(state);\n } catch (error) {\n console.error('[Surfaces] State callback error:', error);\n }\n }\n }\n }\n\n /** Track mounted widget handles for cleanup */\n const widgetHandles = new Map<\n string,\n { unmount: () => void; update: (config?: Record<string, unknown>) => void }\n >();\n\n /**\n * Render content into a container.\n */\n function renderContent(\n container: HTMLElement,\n content: RenderableContent,\n mountId?: string\n ): (() => void) | undefined {\n switch (content.type) {\n case 'html':\n container.innerHTML = sanitizeWithFallback(content.content);\n return undefined;\n\n case 'widget': {\n // Use widget registry if available\n if (widgetRegistry?.has(content.widgetId)) {\n const handle = widgetRegistry.mount(content.widgetId, container, content.config);\n if (mountId) {\n widgetHandles.set(mountId, handle);\n }\n return () => {\n handle.unmount();\n if (mountId) {\n widgetHandles.delete(mountId);\n }\n };\n }\n // Fallback: create a placeholder if widget not found\n console.warn(`[Surfaces] Widget not found: ${content.widgetId}`);\n container.innerHTML = `<div data-widget-id=\"${content.widgetId}\" data-widget-missing=\"true\">Widget: ${content.widgetId}</div>`;\n return undefined;\n }\n\n case 'custom':\n return content.mount(container);\n\n case 'react':\n // React rendering would require ReactDOM\n // For now, create a placeholder\n container.innerHTML = `<div data-react-component>React Component</div>`;\n return undefined;\n\n default:\n console.warn('[Surfaces] Unknown content type');\n return undefined;\n }\n }\n\n /**\n * Mount content to a surface slot.\n */\n function mount(slot: SurfaceSlot, content: RenderableContent, opts?: MountOptions): MountHandle {\n const id = generateMountId();\n const slotType = getSlotType(slot);\n const priority = opts?.priority ?? 0;\n const animation = opts?.animation ?? defaultAnimation;\n const exclusive = opts?.exclusive ?? true;\n\n // Check for existing mount\n const existingMount = mounts.get(slot);\n if (existingMount) {\n if (exclusive) {\n // Priority-based arbitration\n if (existingMount.options.priority > priority) {\n throw new Error(\n `Slot ${slot} is occupied by higher priority content (${existingMount.options.priority} > ${priority})`\n );\n }\n // Unmount existing content\n unmountEntry(existingMount);\n }\n }\n\n // Create container\n const container = createSurfaceContainer(slot, id);\n container.style.zIndex = String(getSlotZIndex(slot));\n\n // Set up positioning based on slot type\n let positionCleanup: (() => void) | undefined;\n\n if (slotType === 'static') {\n applyStaticSlotStyles(container, slot as StaticSurfaceSlot, opts?.constraints);\n overlayRoot.appendChild(container);\n } else if (slotType === 'inline') {\n const anchorId = getSlotAnchorId(slot);\n if (!anchorId) {\n throw new Error(`Invalid inline slot: ${slot}`);\n }\n if (!anchorResolver) {\n throw new Error('Anchor resolver required for inline slots');\n }\n const anchorEl = anchorResolver(anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found for inline slot: ${anchorId}`);\n }\n positionCleanup = setupInlinePositioning(container, anchorEl);\n } else if (slotType === 'adjacent') {\n const anchorId = getSlotAnchorId(slot);\n if (!anchorId) {\n throw new Error(`Invalid adjacent slot: ${slot}`);\n }\n if (!anchorResolver) {\n throw new Error('Anchor resolver required for adjacent slots');\n }\n const anchorEl = anchorResolver(anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found for adjacent slot: ${anchorId}`);\n }\n overlayRoot.appendChild(container);\n positionCleanup = setupAdjacentPositioning(\n container,\n anchorEl,\n opts?.position ?? { placement: 'bottom' }\n );\n }\n\n // Render content\n const contentCleanup = renderContent(container, content, id);\n\n // Play enter animation\n playEnterAnimation(container, animation);\n\n // Create internal entry\n const entry: InternalMountEntry = {\n id,\n slot,\n content,\n options: {\n priority,\n exclusive,\n animation,\n position: opts?.position ?? { placement: 'auto' },\n constraints: opts?.constraints ?? {},\n adaptiveId: opts?.adaptiveId,\n autoUnmountOnRouteChange: opts?.autoUnmountOnRouteChange ?? true,\n },\n container,\n cleanup: () => {\n positionCleanup?.();\n contentCleanup?.();\n },\n mountedAt: Date.now(),\n };\n\n // Store mount\n mounts.set(slot, entry);\n\n // Update mount count\n mountCounts.set(slot, (mountCounts.get(slot) ?? 0) + 1);\n\n // Publish event\n publishEvent('surface.mounted', {\n slot,\n id,\n adaptiveId: opts?.adaptiveId,\n });\n\n // Notify state change\n notifyStateChange(slot);\n\n // Create and return handle\n const handle: MountHandle = {\n id,\n\n update(newContent: RenderableContent): void {\n const entry = mounts.get(slot);\n if (!entry || entry.id !== id) {\n throw new Error('Mount no longer active');\n }\n\n // Clean up existing widget handle if present\n const existingWidgetHandle = widgetHandles.get(id);\n if (existingWidgetHandle) {\n // If content is a widget and we have an update method, use it\n if (newContent.type === 'widget') {\n existingWidgetHandle.update(newContent.config);\n entry.content = newContent;\n return;\n }\n // Otherwise, unmount the old widget\n existingWidgetHandle.unmount();\n widgetHandles.delete(id);\n }\n\n // Clear existing content\n entry.container.innerHTML = '';\n\n // Render new content\n const newCleanup = renderContent(entry.container, newContent, id);\n entry.content = newContent;\n\n // Update cleanup if needed\n if (newCleanup) {\n const oldCleanup = entry.cleanup;\n entry.cleanup = () => {\n oldCleanup?.();\n newCleanup();\n };\n }\n },\n\n setOptions(newOpts: Partial<MountOptions>): void {\n const entry = mounts.get(slot);\n if (!entry || entry.id !== id) {\n throw new Error('Mount no longer active');\n }\n\n // Update options\n if (newOpts.priority !== undefined) {\n entry.options.priority = newOpts.priority;\n }\n if (newOpts.animation !== undefined) {\n entry.options.animation = newOpts.animation;\n }\n\n // Re-apply constraints if changed\n if (newOpts.constraints && slotType === 'static') {\n if (newOpts.constraints.maxWidth)\n entry.container.style.maxWidth = newOpts.constraints.maxWidth;\n if (newOpts.constraints.maxHeight)\n entry.container.style.maxHeight = newOpts.constraints.maxHeight;\n if (newOpts.constraints.minWidth)\n entry.container.style.minWidth = newOpts.constraints.minWidth;\n if (newOpts.constraints.minHeight)\n entry.container.style.minHeight = newOpts.constraints.minHeight;\n }\n\n notifyStateChange(slot);\n },\n\n async unmount(): Promise<void> {\n const entry = mounts.get(slot);\n if (!entry || entry.id !== id) return;\n\n await unmountEntry(entry);\n },\n\n isMounted(): boolean {\n const entry = mounts.get(slot);\n return entry?.id === id;\n },\n\n getContainer(): HTMLElement | null {\n const entry = mounts.get(slot);\n return entry?.id === id ? entry.container : null;\n },\n };\n\n return handle;\n }\n\n /**\n * Unmount an entry with animation.\n */\n async function unmountEntry(entry: InternalMountEntry): Promise<void> {\n // Play exit animation\n await playExitAnimation(entry.container, entry.options.animation);\n\n // Run cleanup\n entry.cleanup?.();\n\n // Remove container\n entry.container.remove();\n\n // Remove from mounts\n mounts.delete(entry.slot);\n\n // Publish event\n publishEvent('surface.unmounted', {\n slot: entry.slot,\n id: entry.id,\n });\n\n // Notify state change\n notifyStateChange(entry.slot);\n }\n\n /**\n * Get the current state of a slot.\n */\n function getState(slot: SurfaceSlot): SurfaceState {\n const entry = mounts.get(slot);\n return {\n slot,\n occupied: !!entry,\n currentPriority: entry?.options.priority,\n currentAdaptiveId: entry?.options.adaptiveId,\n mountCount: mountCounts.get(slot) ?? 0,\n currentMountId: entry?.id,\n };\n }\n\n /**\n * Subscribe to state changes for a slot.\n */\n function onStateChange(slot: SurfaceSlot, fn: SurfaceChangeCallback): () => void {\n let callbacks = stateCallbacks.get(slot);\n if (!callbacks) {\n callbacks = new Set();\n stateCallbacks.set(slot, callbacks);\n }\n callbacks.add(fn);\n\n return () => {\n callbacks?.delete(fn);\n if (callbacks?.size === 0) {\n stateCallbacks.delete(slot);\n }\n };\n }\n\n /**\n * Check if content can be mounted to a slot.\n */\n function canMount(slot: SurfaceSlot, priority?: number): boolean {\n const existingMount = mounts.get(slot);\n if (!existingMount) return true;\n\n // Check priority if provided\n if (priority !== undefined) {\n return priority >= existingMount.options.priority;\n }\n\n return false;\n }\n\n /**\n * Clean up all mounted surfaces.\n */\n function destroy(): void {\n // Unmount all surfaces\n for (const entry of mounts.values()) {\n try {\n entry.cleanup?.();\n entry.container.remove();\n } catch (error) {\n console.error('[Surfaces] Error during cleanup:', error);\n }\n }\n\n mounts.clear();\n stateCallbacks.clear();\n }\n\n return {\n mount,\n getState,\n onStateChange,\n canMount,\n destroy,\n };\n}\n", "/**\n * Widget Registry\n *\n * Extensible registry for mountable widget components.\n * Apps can register custom widgets that can be rendered via mountWidget actions.\n */\n\n/**\n * Cleanup function returned when unmounting a widget.\n */\nexport type WidgetCleanup = () => void;\n\n/**\n * Mountable widget component interface.\n *\n * Widgets must implement this interface to be registered and mounted\n * via the Surfaces system or mountWidget actions.\n */\nexport interface MountableWidget {\n /**\n * Mount the widget into a container element.\n *\n * @param container - The DOM element to mount into\n * @param config - Configuration/props for the widget\n * @returns A cleanup function to unmount the widget, or void\n */\n mount(container: HTMLElement, config?: Record<string, unknown>): WidgetCleanup | void;\n\n /**\n * Optional: Update the widget with new config.\n * If not provided, the widget will be unmounted and remounted on updates.\n *\n * @param container - The DOM element containing the widget\n * @param config - New configuration/props\n */\n update?(container: HTMLElement, config?: Record<string, unknown>): void;\n}\n\n/**\n * Widget registration entry.\n */\nexport interface WidgetRegistration {\n /** Widget ID (e.g., \"gamification:leaderboard\") */\n id: string;\n /** The widget component */\n widget: MountableWidget;\n /** Source app ID or \"built-in\" */\n source: 'built-in' | string;\n /** Optional metadata */\n metadata?: {\n name?: string;\n description?: string;\n icon?: string;\n };\n}\n\n/**\n * Mounted widget handle.\n */\nexport interface MountedWidgetHandle {\n /** The widget ID */\n widgetId: string;\n /** The container element */\n container: HTMLElement;\n /** Unmount the widget */\n unmount: () => void;\n /** Update the widget config */\n update: (config?: Record<string, unknown>) => void;\n}\n\n/**\n * Extensible registry for widget components.\n *\n * Allows apps to register custom widgets that can be rendered via\n * mountWidget actions or directly through the Surfaces system.\n */\nexport type WidgetRegistryListener = (event: {\n type: 'registered' | 'unregistered';\n widgetId: string;\n}) => void;\n\nexport class WidgetRegistry {\n private widgets = new Map<string, WidgetRegistration>();\n private mountedWidgets = new Map<string, { cleanup?: WidgetCleanup; container: HTMLElement }>();\n private mountIdCounter = 0;\n private runtimeRef?: unknown;\n private listeners = new Set<WidgetRegistryListener>();\n\n /**\n * Bind a runtime reference so it can be injected into widget mount() calls.\n * Uses `unknown` to avoid circular imports (WidgetRegistry \u2190 runtime.ts).\n */\n bindRuntime(runtime: unknown): void {\n this.runtimeRef = runtime;\n }\n\n /**\n * Register a widget.\n *\n * @param id - The widget ID (e.g., \"gamification:leaderboard\")\n * @param widget - The widget component\n * @param source - The source app ID (for tracking)\n * @param metadata - Optional metadata about the widget\n */\n register(\n id: string,\n widget: MountableWidget,\n source: string = 'custom',\n metadata?: WidgetRegistration['metadata']\n ): void {\n if (this.widgets.has(id)) {\n const existing = this.widgets.get(id)!;\n if (existing.source === 'built-in') {\n throw new Error(`Cannot override built-in widget: ${id}`);\n }\n console.warn(`[WidgetRegistry] Overriding widget: ${id}`);\n }\n\n this.widgets.set(id, {\n id,\n widget,\n source,\n metadata,\n });\n\n this.notify({ type: 'registered', widgetId: id });\n }\n\n /**\n * Unregister a widget.\n *\n * @param id - The widget ID to unregister\n * @returns true if the widget was unregistered, false if not found or built-in\n */\n unregister(id: string): boolean {\n const existing = this.widgets.get(id);\n if (!existing) {\n return false;\n }\n\n if (existing.source === 'built-in') {\n console.warn(`[WidgetRegistry] Cannot unregister built-in widget: ${id}`);\n return false;\n }\n\n this.widgets.delete(id);\n this.notify({ type: 'unregistered', widgetId: id });\n return true;\n }\n\n /**\n * Unregister all widgets from a specific source.\n *\n * @param source - The source app ID\n */\n unregisterBySource(source: string): void {\n for (const [id, registration] of this.widgets.entries()) {\n if (registration.source === source) {\n this.widgets.delete(id);\n }\n }\n }\n\n /**\n * Get a widget by ID.\n */\n get(id: string): MountableWidget | undefined {\n return this.widgets.get(id)?.widget;\n }\n\n /**\n * Get the full registration for a widget.\n */\n getRegistration(id: string): WidgetRegistration | undefined {\n return this.widgets.get(id);\n }\n\n /**\n * Check if a widget exists.\n */\n has(id: string): boolean {\n return this.widgets.has(id);\n }\n\n /**\n * Mount a widget into a container.\n *\n * @param id - The widget ID\n * @param container - The DOM element to mount into\n * @param config - Configuration/props for the widget\n * @returns A handle for managing the mounted widget\n */\n mount(id: string, container: HTMLElement, config?: Record<string, unknown>): MountedWidgetHandle {\n const registration = this.widgets.get(id);\n if (!registration) {\n throw new Error(`Widget not found: ${id}`);\n }\n\n const mountId = `widget-mount-${++this.mountIdCounter}`;\n container.setAttribute('data-widget-mount-id', mountId);\n container.setAttribute('data-widget-id', id);\n\n // Mount the widget \u2014 inject runtime so widgets can render as React components\n const enrichedConfig = { ...config, runtime: this.runtimeRef };\n const cleanup = registration.widget.mount(container, enrichedConfig);\n\n // Track the mounted widget\n this.mountedWidgets.set(mountId, {\n cleanup: cleanup ?? undefined,\n container,\n });\n\n const handle: MountedWidgetHandle = {\n widgetId: id,\n container,\n\n unmount: () => {\n const mounted = this.mountedWidgets.get(mountId);\n if (mounted) {\n mounted.cleanup?.();\n this.mountedWidgets.delete(mountId);\n container.removeAttribute('data-widget-mount-id');\n container.removeAttribute('data-widget-id');\n container.innerHTML = '';\n }\n },\n\n update: (newConfig?: Record<string, unknown>) => {\n if (registration.widget.update) {\n registration.widget.update(container, newConfig);\n } else {\n // Unmount and remount with new config\n const mounted = this.mountedWidgets.get(mountId);\n if (mounted) {\n mounted.cleanup?.();\n container.innerHTML = '';\n const enrichedNewConfig = { ...newConfig, runtime: this.runtimeRef };\n const newCleanup = registration.widget.mount(container, enrichedNewConfig);\n mounted.cleanup = newCleanup ?? undefined;\n }\n }\n },\n };\n\n return handle;\n }\n\n /**\n * List all registered widget IDs.\n */\n list(): string[] {\n return Array.from(this.widgets.keys());\n }\n\n /**\n * List all registrations.\n */\n listRegistrations(): WidgetRegistration[] {\n return Array.from(this.widgets.values());\n }\n\n /**\n * Get all widgets from a specific source.\n */\n getBySource(source: string): WidgetRegistration[] {\n return Array.from(this.widgets.values()).filter(\n (registration) => registration.source === source\n );\n }\n\n /**\n * Subscribe to widget registration changes.\n */\n subscribe(callback: WidgetRegistryListener): () => void {\n this.listeners.add(callback);\n return () => {\n this.listeners.delete(callback);\n };\n }\n\n private notify(event: { type: 'registered' | 'unregistered'; widgetId: string }): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('[WidgetRegistry] Listener error:', error);\n }\n }\n }\n\n /**\n * Clean up all mounted widgets.\n */\n destroy(): void {\n for (const [_mountId, mounted] of this.mountedWidgets.entries()) {\n mounted.cleanup?.();\n mounted.container.innerHTML = '';\n }\n this.mountedWidgets.clear();\n }\n}\n\n/**\n * Default singleton instance of WidgetRegistry.\n */\nexport const widgetRegistry = new WidgetRegistry();\n", "/**\n * SmartCanvasRuntime - Unified runtime for v2 adaptives.\n *\n * The runtime provides access to all core providers:\n * - telemetry: Event tracking (PostHog)\n * - context: Page/session/viewport state\n * - events: Normalized event stream\n * - state: Persistent state storage\n * - actions: ActionEngine for interventions\n * - surfaces: Surfaces for UI rendering\n *\n * Note: ExperimentClient (GrowthBook) is NOT part of the runtime.\n * GrowthBook's job is done at page load when it selects which config to deliver.\n * The runtime receives the config and makes decisions using DecisionStrategy.\n */\nimport {\n type ActionEngine,\n createActionEngine,\n type ExecutorRegistry,\n executorRegistry,\n} from './actions';\nimport { type AppRegistry, appRegistry as defaultAppRegistry } from './apps';\nimport { type ContextManager, createContextManager } from './context/ContextManager';\nimport { createDecisionEngine } from './decisions/engine';\nimport type {\n ActivationConfig,\n DecisionResult,\n DecisionStrategy,\n RouteFilter,\n} from './decisions/types';\nimport { createEventAccumulator, type EventAccumulator } from './events/EventAccumulator';\nimport { createEventBus, type EventBus } from './events/EventBus';\nimport type { SessionMetricTracker } from './metrics/sessionMetrics';\nimport { NavigationMonitor } from './navigation/NavigationMonitor';\nimport { ensureOverlayRoot } from './overlays/runtime/overlay/root';\nimport { createStateStore, type StateStore } from './state/StateStore';\nimport { createSurfaces, type Surfaces } from './surfaces';\nimport type { TelemetryClient } from './telemetry/types';\nimport type { TileConfig } from './types';\nimport { widgetRegistry as defaultWidgetRegistry, type WidgetRegistry } from './widgets';\n\n/**\n * Runtime version.\n */\nexport const RUNTIME_VERSION = '2.0.0';\n\n/**\n * Runtime mode.\n */\nexport type RuntimeMode = 'production' | 'development' | 'editor' | 'audit' | 'review';\n\n/**\n * SmartCanvasRuntime interface.\n */\nexport interface SmartCanvasRuntime {\n /** Telemetry client for event tracking */\n telemetry?: TelemetryClient;\n\n /** Context manager for page/session/viewport state */\n context: ContextManager;\n\n /** Event bus for normalized event stream */\n events: EventBus;\n\n /** State store for persistent state */\n state: StateStore;\n\n /** Session metric tracker (optional) */\n sessionMetrics?: SessionMetricTracker;\n\n /** ActionEngine for applying interventions */\n actions: ActionEngine;\n\n /** Surfaces for rendering UI into named slots */\n surfaces: Surfaces;\n\n /** Widget registry for mountable components */\n widgets: WidgetRegistry;\n\n /** Executor registry for action executors */\n executors: ExecutorRegistry;\n\n /** App registry for SynOS apps */\n apps: AppRegistry;\n\n /** Event accumulator for event_count conditions */\n accumulator: EventAccumulator;\n\n /** Centralized navigation monitor for History API interception */\n navigation: NavigationMonitor;\n\n /** Runtime version */\n version: string;\n\n /** Runtime mode */\n mode: RuntimeMode;\n\n /**\n * Evaluate a decision strategy against the current context.\n */\n evaluate<T>(strategy: DecisionStrategy<T>): Promise<DecisionResult<T>>;\n\n /**\n * Synchronously evaluate a decision strategy (for simple strategies).\n */\n evaluateSync<T>(strategy: DecisionStrategy<T>): DecisionResult<T>;\n\n /**\n * Filter tiles based on their activation configs.\n */\n filterTiles(tiles: TileConfig[]): Promise<TileConfig[]>;\n\n /**\n * Update the routes config (e.g., when config is fetched).\n */\n setRoutes(routes: RouteFilter): void;\n\n /**\n * Clean up runtime resources.\n */\n destroy(): void;\n}\n\n/**\n * Options for creating a SmartCanvasRuntime.\n */\nexport interface SmartCanvasRuntimeOptions {\n /** Telemetry client */\n telemetry?: TelemetryClient;\n\n /** Session metric tracker */\n sessionMetrics?: SessionMetricTracker;\n\n /** Initial routes config */\n routes?: RouteFilter;\n\n /** Runtime mode */\n mode?: RuntimeMode;\n\n /** State namespace */\n namespace?: string;\n\n /** External EventBus (if not provided, one will be created) */\n events?: EventBus;\n\n /** Custom widget registry (if not provided, default singleton is used) */\n widgets?: WidgetRegistry;\n\n /** Custom executor registry (if not provided, default singleton is used) */\n executors?: ExecutorRegistry;\n\n /** Custom app registry (if not provided, default singleton is used) */\n apps?: AppRegistry;\n}\n\n/**\n * Check if a URL matches a route filter.\n */\nfunction matchesRouteFilter(url: string, filter?: RouteFilter): boolean {\n if (!filter) return true;\n\n // Extract pathname\n let pathname: string;\n try {\n pathname = new URL(url).pathname;\n } catch {\n pathname = url;\n }\n\n // Normalize pathname\n const normalizedPath = pathname.replace(/\\/$/, '') || '/';\n\n // Check exclude patterns first\n if (filter.exclude) {\n for (const pattern of filter.exclude) {\n if (matchRoutePattern(normalizedPath, pattern)) {\n return false; // Explicitly excluded\n }\n }\n }\n\n // If include list exists, must match at least one\n if (filter.include && filter.include.length > 0) {\n for (const pattern of filter.include) {\n if (matchRoutePattern(normalizedPath, pattern)) {\n return true; // Matches include list\n }\n }\n return false; // Didn't match any include pattern\n }\n\n // No include list, not excluded = pass\n return true;\n}\n\n/**\n * Match a pathname against a route pattern.\n */\nfunction matchRoutePattern(pathname: string, pattern: string): boolean {\n const normalizedPattern = pattern.replace(/\\/$/, '') || '/';\n\n // Exact match\n if (pathname === normalizedPattern) return true;\n\n // Convert pattern to regex\n const regexPattern = normalizedPattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex chars\n .replace(/\\*\\*/g, '.*') // ** matches anything\n .replace(/\\*/g, '[^/]*') // * matches within path segment\n .replace(/:[^/]+/g, '[^/]+'); // :param matches any segment\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(pathname);\n}\n\n/**\n * Resolve an anchor ID to an element.\n *\n * The anchorId is treated as a CSS selector \u2014 no magic resolution chain.\n * Config authors write exactly the selector they mean:\n * - `[data-hero=\"title\"]` for attribute selectors\n * - `#my-id` for IDs\n * - `.my-class` for classes\n * - `body` for tag names\n */\nfunction resolveAnchorById(anchorId: string): HTMLElement | null {\n try {\n return document.querySelector(anchorId) as HTMLElement | null;\n } catch {\n return null;\n }\n}\n\n/**\n * Create a SmartCanvasRuntime instance.\n */\nexport function createSmartCanvasRuntime(\n options: SmartCanvasRuntimeOptions = {}\n): SmartCanvasRuntime {\n const { telemetry, sessionMetrics, routes, mode = 'production', namespace } = options;\n\n // Use provided registries or defaults\n const widgets = options.widgets ?? defaultWidgetRegistry;\n const executors = options.executors ?? executorRegistry;\n const apps = options.apps ?? defaultAppRegistry;\n\n // Create centralized navigation monitor (single History API patch point)\n const navigation = new NavigationMonitor();\n\n // Create core providers\n const context = createContextManager({\n telemetry,\n routes,\n navigation,\n });\n\n // Use external EventBus if provided, otherwise create one\n const events = options.events ?? createEventBus();\n\n const state = createStateStore({\n namespace,\n });\n\n // Create event accumulator for event_count conditions\n const accumulator = createEventAccumulator({\n eventBus: events,\n stateStore: state,\n });\n\n // Create decision engine with bound options\n const decisionEngine = createDecisionEngine({\n state,\n events,\n sessionMetrics,\n accumulator,\n });\n\n // Create overlay root for Surfaces and ActionEngine\n const overlayRoot = ensureOverlayRoot();\n\n // Anchor resolver bound to context\n const anchorResolver = (anchorId: string) => resolveAnchorById(anchorId);\n\n // Create Surfaces provider with widget registry\n const surfaces = createSurfaces({\n overlayRoot,\n eventBus: events,\n anchorResolver,\n widgetRegistry: widgets,\n });\n\n // Create ActionEngine provider with executor registry\n const actions = createActionEngine({\n overlayRoot,\n eventBus: events,\n surfaces,\n anchorResolver,\n executorRegistry: executors,\n subscribeNavigation: (callback) => navigation.subscribe(callback),\n });\n\n const runtime: SmartCanvasRuntime = {\n telemetry,\n context,\n events,\n state,\n sessionMetrics,\n actions,\n surfaces,\n widgets,\n executors,\n apps,\n accumulator,\n navigation,\n version: RUNTIME_VERSION,\n mode,\n\n async evaluate<T>(strategy: DecisionStrategy<T>): Promise<DecisionResult<T>> {\n return decisionEngine.evaluate(strategy, context.get());\n },\n\n evaluateSync<T>(strategy: DecisionStrategy<T>): DecisionResult<T> {\n return decisionEngine.evaluateSync(strategy, context.get());\n },\n\n async filterTiles(tiles: TileConfig[]): Promise<TileConfig[]> {\n const currentUrl = context.get().page.url;\n const results: TileConfig[] = [];\n\n for (const tile of tiles) {\n const activation = tile.activation;\n\n // If no activation config, tile always renders\n if (!activation) {\n results.push(tile);\n continue;\n }\n\n // Check route filter first\n if (!matchesRouteFilter(currentUrl, activation.routes)) {\n continue; // Doesn't match route filter\n }\n\n // If no strategy, tile renders (route filter passed)\n if (!activation.strategy) {\n results.push(tile);\n continue;\n }\n\n // Evaluate strategy\n const result = await this.evaluate<boolean>(activation.strategy);\n if (result.value) {\n results.push(tile);\n }\n }\n\n return results;\n },\n\n setRoutes(routes: RouteFilter): void {\n context.setRoutes(routes);\n },\n\n destroy(): void {\n // Unbind and clean up apps registry\n apps.unbind().catch((err) => {\n console.error('[Runtime] Error unbinding apps registry:', err);\n });\n\n accumulator.destroy();\n navigation.destroy();\n context.destroy();\n actions.destroy();\n surfaces.destroy();\n },\n };\n\n // Bind apps registry to runtime\n apps.bind(runtime);\n widgets.bindRuntime(runtime);\n\n return runtime;\n}\n", "/**\n * Token encoding/decoding utilities for Syntro client keys.\n *\n * A Syntro token is a base64url-encoded JSON payload prefixed with \"syn_\".\n * It bundles all necessary credentials (experiments, telemetry, config) into\n * a single string that clients can use to initialize the SDK.\n */\n\nconst TOKEN_PREFIX = 'syn_';\n\nexport interface SyntroTokenPayload {\n /** Token version for future compatibility */\n v: 1;\n\n /** Experiments key (assumes growthbook provider by default) */\n e?: string;\n\n /** Experiments host URL (e.g., \"http://localhost:8110\" for dev) */\n eh?: string;\n\n /** Telemetry key (assumes posthog provider by default) */\n t?: string;\n\n /** Telemetry host URL (e.g., \"https://us.i.posthog.com\") */\n th?: string;\n\n /** Config fetcher type (e.g., \"cdn\", \"experiments\") */\n f?: string;\n\n /** Fetcher-specific options (e.g., configId for cdn fetcher) */\n o?: Record<string, string>;\n\n /** Debug mode - enables console logging (default: false) */\n d?: boolean;\n}\n\n/**\n * Decode a Syntro token into its payload.\n *\n * @param token - The token string (e.g., \"syn_eyJ2IjoxfQ\")\n * @returns The decoded payload\n * @throws Error if the token is invalid or unsupported version\n */\nexport function decodeToken(token: string): SyntroTokenPayload {\n if (!token.startsWith(TOKEN_PREFIX)) {\n throw new Error(\"Invalid Syntro token: must start with 'syn_'\");\n }\n\n const base64 = token.slice(TOKEN_PREFIX.length);\n // Convert base64url to standard base64\n const standardBase64 = base64.replace(/-/g, '+').replace(/_/g, '/');\n const json = atob(standardBase64);\n const payload = JSON.parse(json) as SyntroTokenPayload;\n\n if (payload.v !== 1) {\n throw new Error(`Unsupported token version: ${payload.v}`);\n }\n\n return payload;\n}\n\n/**\n * Encode a payload into a Syntro token.\n *\n * This is primarily for admin/dashboard use, but exported for testing.\n *\n * @param payload - The payload to encode\n * @returns The encoded token string\n */\nexport function encodeToken(payload: SyntroTokenPayload): string {\n const json = JSON.stringify(payload);\n // Convert to base64url (URL-safe, no padding)\n const base64 = btoa(json).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n return TOKEN_PREFIX + base64;\n}\n", "/**\n * Experiment provider registry.\n *\n * Maps provider names to their adapter factories.\n * This allows the bootstrap module to dynamically create\n * experiment clients based on token configuration.\n */\nimport {\n createGrowthBookClient,\n type ExperimentTrackingCallback,\n type GrowthBookAdapterOptions,\n} from './adapters/growthbook';\nimport type { ExperimentClient } from './types';\n\ntype AdapterFactory = (config: any) => ExperimentClient;\n\nconst adapters: Record<string, AdapterFactory> = {\n growthbook: (config: GrowthBookAdapterOptions) =>\n createGrowthBookClient({\n ...config,\n autoInit: true,\n }),\n};\n\nexport interface CreateExperimentClientConfig {\n clientKey: string;\n apiHost?: string;\n /**\n * Initial user attributes for targeting.\n * Used for segment-based targeting.\n */\n attributes?: Record<string, unknown>;\n /**\n * Callback fired when a user is assigned to an experiment.\n * Use this to send experiment data to your analytics provider.\n */\n onExperimentViewed?: ExperimentTrackingCallback;\n}\n\n/**\n * Create an experiment client for the specified provider.\n *\n * @param provider - Provider name (e.g., \"growthbook\")\n * @param config - Provider-specific configuration\n * @returns An ExperimentClient instance\n * @throws Error if the provider is not supported\n */\nexport function createExperimentClient(\n provider: string,\n config: CreateExperimentClientConfig\n): ExperimentClient {\n const factory = adapters[provider];\n if (!factory) {\n throw new Error(\n `Unknown experiment provider: ${provider}. Supported: ${Object.keys(adapters).join(', ')}`\n );\n }\n return factory(config);\n}\n", "import type { CanvasConfigResponse } from '../types';\n\nimport type { ConfigFetcher, FetchResult } from './types';\n\n/**\n * Allowed CDN hosts for config fetching.\n */\nconst ALLOWED_CDN_HOSTS = ['cdn.syntrologie.com', 'localhost', '127.0.0.1'];\n\nexport interface CdnFetcherOptions {\n /**\n * Base CDN URL (e.g., \"https://cdn.syntrologie.com/configs\")\n */\n baseUrl: string;\n\n /**\n * Unique config identifier (UUID).\n * This should be unguessable to prevent unauthorized access.\n */\n configId: string;\n\n /**\n * Optional SRI hash for integrity verification.\n */\n integrity?: string;\n}\n\n/**\n * Validates that a CDN URL is from an allowed host.\n */\nfunction validateCdnUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n const isLocalhost = /^(localhost|127\\.0\\.0\\.1)$/.test(parsed.hostname);\n\n if (parsed.protocol !== 'https:' && !isLocalhost) {\n console.warn('[SmartCanvas] CDN URL must use HTTPS:', url);\n return false;\n }\n\n const isAllowed = ALLOWED_CDN_HOSTS.some((host) => parsed.hostname === host);\n if (!isAllowed) {\n console.warn('[SmartCanvas] CDN host not in allowlist:', parsed.hostname);\n return false;\n }\n\n return true;\n } catch {\n console.warn('[SmartCanvas] Invalid CDN URL:', url);\n return false;\n }\n}\n\n/**\n * Fetches config from CDN using UUID-based paths.\n *\n * Security: Config paths use UUIDs which are unguessable.\n * Each client has a unique config path that cannot be enumerated.\n *\n * Performance: CDN-cached with long TTL for versioned configs.\n */\nexport class CdnFetcher implements ConfigFetcher {\n readonly name = 'cdn';\n\n private url: string;\n private integrity?: string;\n\n constructor(options: CdnFetcherOptions) {\n this.url = `${options.baseUrl}/${options.configId}.json`;\n this.integrity = options.integrity;\n\n if (!validateCdnUrl(this.url)) {\n throw new Error(`[SmartCanvas] CDN URL not allowed: ${this.url}`);\n }\n }\n\n async fetch(): Promise<FetchResult> {\n const start = performance.now();\n\n const response = await fetch(this.url, {\n credentials: 'omit', // Never send cookies to CDN\n cache: 'default',\n });\n\n if (!response.ok) {\n throw new Error(`[SmartCanvas] Failed to fetch config from CDN (${response.status})`);\n }\n\n const text = await response.text();\n\n // Verify integrity if provided\n if (this.integrity) {\n const hash = await computeSha384(text);\n const expected = this.integrity.replace('sha384-', '');\n if (hash !== expected) {\n throw new Error(\n `[SmartCanvas] Config integrity check failed. Expected ${expected}, got ${hash}`\n );\n }\n }\n\n const config = JSON.parse(text) as CanvasConfigResponse;\n const fetchTimeMs = performance.now() - start;\n\n // Check cache headers\n const cacheControl = response.headers.get('cache-control');\n const age = response.headers.get('age');\n\n return {\n config,\n meta: {\n source: 'cdn',\n fetchTimeMs,\n cached: cacheControl?.includes('public') ?? false,\n cacheAge: age ? parseInt(age, 10) : undefined,\n },\n };\n }\n}\n\n/**\n * Compute SHA-384 hash in base64 format (for SRI).\n */\nasync function computeSha384(content: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest('SHA-384', data);\n const hashArray = new Uint8Array(hashBuffer);\n return btoa(String.fromCharCode(...hashArray));\n}\n\n/**\n * Factory function for creating a CDN fetcher.\n */\nexport function createCdnFetcher(options: CdnFetcherOptions): ConfigFetcher {\n return new CdnFetcher(options);\n}\n", "import type { ExperimentClient } from '../experiments/types';\nimport type { CanvasConfigResponse } from '../types';\n\nimport { resolveVariantConfigs } from './mergeConfigs';\nimport type { ConfigFetcher, FetchResult } from './types';\n\n/**\n * URL parameters for forcing experiment variations in preview mode.\n * Usage: ?syntro_exp=experiment_tracking_key&syntro_var=1\n */\nconst PREVIEW_EXP_PARAM = 'syntro_exp';\nconst PREVIEW_VAR_PARAM = 'syntro_var';\n\nexport interface ExperimentsFetcherOptions {\n /**\n * Experiment client instance (e.g., from createGrowthBookClient).\n */\n client: ExperimentClient;\n\n /**\n * Single feature key for the monolithic config (legacy mode).\n * @default \"smart-canvas-config\"\n */\n featureKey?: string;\n\n /**\n * Feature key for the variant manifest (lists active variant flag keys).\n * When set, enables multi-flag mode.\n */\n manifestKey?: string;\n\n /**\n * Prefix for convention-based variant flag discovery.\n * All GrowthBook features matching this prefix will be evaluated.\n * Used as fallback when manifestKey is not set or returns empty.\n */\n variantFlagPrefix?: string;\n}\n\n/**\n * Fetches config from an experiment/feature flag system.\n *\n * Security: Config is scoped to the experiment client's environment/SDK key.\n * Each client only sees their own config.\n *\n * Performance: No network request needed if features are already cached.\n * Config is delivered with the feature flag payload.\n */\nexport class ExperimentsFetcher implements ConfigFetcher {\n readonly name = 'experiments';\n\n private client: ExperimentClient;\n private featureKey: string;\n private manifestKey?: string;\n private variantFlagPrefix?: string;\n\n constructor(options: ExperimentsFetcherOptions) {\n this.client = options.client;\n this.featureKey = options.featureKey ?? 'smart-canvas-config';\n this.manifestKey = options.manifestKey;\n this.variantFlagPrefix = options.variantFlagPrefix;\n }\n\n async fetch(): Promise<FetchResult> {\n const start = performance.now();\n\n // Check for preview URL params to force a specific variation\n if (typeof window !== 'undefined') {\n const params = new URLSearchParams(window.location.search);\n const expName = params.get(PREVIEW_EXP_PARAM);\n const varIndex = params.get(PREVIEW_VAR_PARAM);\n\n if (expName && varIndex !== null && this.client.setForcedVariations) {\n const index = parseInt(varIndex, 10);\n if (!Number.isNaN(index)) {\n console.log(`[SmartCanvas] Preview mode: forcing \"${expName}\" to variation ${index}`);\n this.client.setForcedVariations({ [expName]: index });\n }\n }\n }\n\n // Multi-flag mode: evaluate multiple feature flags and merge configs\n if (this.manifestKey || this.variantFlagPrefix) {\n const config = this.fetchMultiFlag();\n if (config) {\n const fetchTimeMs = performance.now() - start;\n return {\n config,\n meta: { source: 'experiments', fetchTimeMs, cached: true },\n };\n }\n }\n\n // Legacy single-flag mode\n const config = this.client.getFeatureValue?.(this.featureKey, null);\n\n if (!config || typeof config !== 'object') {\n throw new Error(\n `[SmartCanvas] Feature \"${this.featureKey}\" not found or invalid. ` +\n `Ensure the feature is configured in your experiment platform.`\n );\n }\n\n const fetchTimeMs = performance.now() - start;\n\n return {\n config: config as CanvasConfigResponse,\n meta: {\n source: 'experiments',\n fetchTimeMs,\n cached: true,\n },\n };\n }\n\n /**\n * Resolve config from multiple variant feature flags.\n * Returns the first active variant config, or null if none match.\n */\n private fetchMultiFlag(): CanvasConfigResponse | null {\n const variantKeys = this.getVariantFlagKeys();\n\n if (!variantKeys || variantKeys.length === 0) {\n return null;\n }\n\n return resolveVariantConfigs(this.client, variantKeys);\n }\n\n /**\n * Get variant flag keys from manifest or prefix discovery.\n */\n private getVariantFlagKeys(): string[] {\n // Try manifest first\n if (this.manifestKey) {\n const manifest = this.client.getFeatureValue?.(this.manifestKey, null);\n if (manifest && typeof manifest === 'object') {\n const keys = (manifest as { variant_flags?: string[] }).variant_flags;\n if (keys && keys.length > 0) {\n return keys;\n }\n }\n }\n\n // Fall back to prefix-based discovery using getAllFeatures\n if (this.variantFlagPrefix && this.client.getAllFeatures) {\n const allFeatures = this.client.getAllFeatures();\n return Object.keys(allFeatures).filter((key) => key.startsWith(this.variantFlagPrefix!));\n }\n\n return [];\n }\n}\n\n/**\n * Factory function for creating an experiments-based fetcher.\n */\nexport function createExperimentsFetcher(options: ExperimentsFetcherOptions): ConfigFetcher {\n return new ExperimentsFetcher(options);\n}\n", "/**\n * Config fetcher registry.\n *\n * Maps fetcher type names to their factory functions.\n * This allows the bootstrap module to dynamically create\n * fetchers based on token configuration.\n */\nimport { type CdnFetcherOptions, createCdnFetcher } from './cdnFetcher';\nimport { createExperimentsFetcher, type ExperimentsFetcherOptions } from './experimentsFetcher';\nimport type { ConfigFetcher } from './types';\n\n/**\n * Default CDN base URL for config fetching.\n */\nexport const DEFAULT_CDN_BASE_URL = 'https://cdn.syntrologie.com/configs';\n\ntype FetcherFactory = (options: Record<string, string>) => ConfigFetcher;\n\nconst fetchers: Record<string, FetcherFactory> = {\n /**\n * CDN fetcher - fetches config from Syntrologie CDN.\n * Options: configId (required), integrity (optional)\n */\n cdn: (options) => {\n if (!options.configId) {\n throw new Error(\"CDN fetcher requires 'configId' option\");\n }\n return createCdnFetcher({\n baseUrl: options.baseUrl ?? DEFAULT_CDN_BASE_URL,\n configId: options.configId,\n integrity: options.integrity,\n } as CdnFetcherOptions);\n },\n\n /**\n * Experiments fetcher - fetches config based on experiment variations.\n * Options: featureKey (required)\n */\n experiments: (options) => {\n if (!options.featureKey) {\n throw new Error(\"Experiments fetcher requires 'featureKey' option\");\n }\n return createExperimentsFetcher({\n featureKey: options.featureKey,\n } as ExperimentsFetcherOptions);\n },\n};\n\n/**\n * Create a config fetcher for the specified type.\n *\n * @param type - Fetcher type (e.g., \"cdn\", \"experiments\")\n * @param options - Fetcher-specific options\n * @returns A ConfigFetcher instance\n * @throws Error if the fetcher type is not supported\n */\nexport function createConfigFetcher(\n type: string,\n options: Record<string, string> = {}\n): ConfigFetcher {\n const factory = fetchers[type];\n if (!factory) {\n throw new Error(\n `Unknown config fetcher type: ${type}. Supported: ${Object.keys(fetchers).join(', ')}`\n );\n }\n return factory(options);\n}\n", "/**\n * Telemetry provider registry.\n *\n * Maps provider names to their adapter factories.\n * This allows the bootstrap module to dynamically create\n * telemetry clients based on token configuration.\n */\nimport { createNoopClient } from './adapters/noop';\nimport { createPostHogClient, type PostHogAdapterOptions } from './adapters/posthog';\nimport type { TelemetryClient } from './types';\n\ntype AdapterFactory = (config: any) => TelemetryClient;\n\nconst adapters: Record<string, AdapterFactory> = {\n posthog: (config: PostHogAdapterOptions) => createPostHogClient(config),\n noop: () => createNoopClient(),\n};\n\n/**\n * Create a telemetry client for the specified provider.\n *\n * @param provider - Provider name (e.g., \"posthog\")\n * @param config - Provider-specific configuration\n * @returns A TelemetryClient instance\n * @throws Error if the provider is not supported\n */\nexport function createTelemetryClient(\n provider: string,\n config: PostHogAdapterOptions\n): TelemetryClient {\n const factory = adapters[provider];\n if (!factory) {\n throw new Error(\n `Unknown telemetry provider: ${provider}. Supported: ${Object.keys(adapters).join(', ')}`\n );\n }\n return factory(config);\n}\n", "/**\n * Bootstrap module for single-token SDK initialization.\n *\n * Usage:\n * ```typescript\n * import { Syntro } from '@syntrologie/runtime-sdk';\n *\n * const { canvas, runtime } = await Syntro.init({\n * token: \"syn_eyJ2IjoxLCJleHAiOnsiayI6InNkay14eHgiLCJwIjoiZ3Jvd3RoYm9vayJ9fQ\"\n * });\n *\n * // Access runtime providers\n * runtime.telemetry?.trackAction(...);\n * runtime.context.subscribe((ctx, prev) => { ... });\n * runtime.events.subscribe({ names: ['ui.click'] }, (event) => { ... });\n * runtime.state.dismissals.mark('my-tile');\n * ```\n */\nimport { createSmartCanvas, type SmartCanvasConfig, type SmartCanvasHandle } from './api';\nimport type { appRegistry } from './apps';\nimport { type AppLoader, type CanvasConfigForLoader, createAppLoader } from './apps/AppLoader';\nimport { createCanvasConfigFetcher } from './configFetcher';\nimport { getEditorConf, getEditorSource } from './editorLoader';\nimport { createEventBus } from './events/EventBus';\nimport { createPostHogNormalizer } from './events/normalizers/posthog';\nimport { createExperimentClient } from './experiments/registry';\nimport type { ExperimentClient } from './experiments/types';\nimport { createConfigFetcher } from './fetchers/registry';\nimport { debug, initLogger, error as logError, warn } from './logger';\nimport { createSessionMetricTracker, type SessionMetricTracker } from './metrics';\nimport { createSmartCanvasRuntime, type RuntimeMode, type SmartCanvasRuntime } from './runtime';\nimport { createTelemetryClient } from './telemetry/registry';\nimport type { TelemetryClient } from './telemetry/types';\nimport { decodeToken, encodeToken, type SyntroTokenPayload } from './token';\nimport type { CanvasConfigFetcher } from './types';\n\nexport interface SyntroInitOptions {\n /**\n * The Syntro token containing all credentials.\n * Generated from your admin dashboard.\n *\n * Optional in editor mode (when editor_token is present in URL params).\n */\n token?: string;\n\n /**\n * Optional canvas configuration overrides.\n */\n canvas?: Partial<Omit<SmartCanvasConfig, 'integrations' | 'fetcher'>>;\n\n /**\n * Custom config fetcher to override the default experiment-based fetcher.\n * Use this for local development or when bypassing the experiment server.\n *\n * When provided, this fetcher is used instead of the experiments-based config lookup.\n * The token's telemetry credentials (t field) are still used if present.\n */\n fetcher?: CanvasConfigFetcher;\n\n /**\n * Enable session-based metric tracking.\n * When true, a SessionMetricTracker is created that tracks metrics during\n * the user's session and updates GrowthBook attributes in real-time.\n *\n * @default false\n */\n enableSessionMetrics?: boolean;\n\n /**\n * CDN base URL for loading adaptive bundles.\n * Adaptives are loaded from: {cdnBase}/adaptives/{appId}/index.js\n *\n * @default \"https://cdn.syntrologie.com\"\n */\n cdnBase?: string;\n\n /**\n * @deprecated Core app executors are now registered synchronously.\n * This option has no effect and will be removed in a future version.\n */\n registerBuiltInApps?: boolean;\n}\n\nexport interface SyntroInitResult {\n /**\n * The SmartCanvas handle for controlling the canvas.\n */\n canvas: SmartCanvasHandle;\n\n /**\n * The unified v2 runtime with all providers.\n * Use this to access telemetry, context, events, and state.\n */\n runtime: SmartCanvasRuntime;\n\n /**\n * The experiment client, if experiments are configured in the token.\n * @deprecated Access via runtime.telemetry or use DecisionStrategy instead\n */\n experiments?: ExperimentClient;\n\n /**\n * The telemetry client, if telemetry is configured in the token.\n * @deprecated Access via runtime.telemetry instead\n */\n telemetry?: TelemetryClient;\n\n /**\n * The session metric tracker, if enableSessionMetrics is true.\n * @deprecated Access via runtime.sessionMetrics instead\n */\n sessionMetrics?: SessionMetricTracker;\n\n /**\n * App loader for loading external apps from CDN.\n * Exposed for manual app loading if needed.\n */\n appLoader: AppLoader;\n}\n\n/**\n * Get environment variable, supporting both Vite and Next.js patterns.\n */\nfunction getEnvVar(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n // Next.js / Node.js\n return process.env[name];\n }\n // Vite uses import.meta.env - use try/catch to avoid esbuild IIFE warning\n try {\n // biome-ignore lint/security/noGlobalEval: Required for Vite compatibility; import.meta cannot be accessed statically in IIFE bundles\n const meta = (0, eval)('import.meta');\n if (meta?.env) {\n return meta.env[name];\n }\n } catch {\n // import.meta not available (IIFE bundle)\n }\n return undefined;\n}\n\n/**\n * Check if we're in editor mode (editor_conf.mode === 'editor').\n */\nfunction isEditorMode(): boolean {\n if (typeof window === 'undefined') {\n debug('Syntro Bootstrap', 'isEditorMode: not in browser');\n return false;\n }\n const conf = getEditorConf();\n const source = getEditorSource();\n const isEditor = !!(source?.token && conf?.mode === 'editor');\n debug('Syntro Bootstrap', 'isEditorMode:', isEditor);\n return isEditor;\n}\n\n/**\n * Check if we're in audit mode (editor_conf.mode === 'audit').\n */\nfunction isAuditMode(): boolean {\n if (typeof window === 'undefined') {\n debug('Syntro Bootstrap', 'isAuditMode: not in browser');\n return false;\n }\n const conf = getEditorConf();\n const source = getEditorSource();\n const isAudit = !!(source?.token && conf?.mode === 'audit');\n debug('Syntro Bootstrap', 'isAuditMode:', isAudit);\n return isAudit;\n}\n\n/**\n * Check if we're in review mode (editor_conf.mode === 'review').\n */\nfunction isReviewMode(): boolean {\n if (typeof window === 'undefined') {\n debug('Syntro Bootstrap', 'isReviewMode: not in browser');\n return false;\n }\n const conf = getEditorConf();\n const source = getEditorSource();\n const isReview = !!(source?.token && conf?.mode === 'review');\n debug('Syntro Bootstrap', 'isReviewMode:', isReview);\n return isReview;\n}\n\n// ============================================================================\n// Segment Attribute Caching (localStorage)\n// ============================================================================\n\nconst SEGMENT_CACHE_KEY = 'syntro_segment_attributes';\n\n/**\n * Load cached segment attributes from localStorage.\n * Returns cached values for instant Phase 1 evaluation.\n */\nfunction loadCachedSegmentAttributes(): Record<string, boolean> {\n if (typeof window === 'undefined') return {};\n try {\n const cached = localStorage.getItem(SEGMENT_CACHE_KEY);\n if (cached) {\n const attrs = JSON.parse(cached);\n debug('Syntro Bootstrap', 'Loaded cached segment attributes:', attrs);\n return attrs;\n }\n } catch (err) {\n warn('Syntro Bootstrap', 'Failed to load cached segment attributes:', err);\n }\n return {};\n}\n\n/**\n * Save segment attributes to localStorage for faster future loads.\n */\nfunction cacheSegmentAttributes(attrs: Record<string, boolean>): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(SEGMENT_CACHE_KEY, JSON.stringify(attrs));\n debug('Syntro Bootstrap', 'Cached segment attributes:', attrs);\n } catch (err) {\n warn('Syntro Bootstrap', 'Failed to cache segment attributes:', err);\n }\n}\n\n/**\n * Extract segment flags (in_segment_*) from PostHog feature flags.\n */\nfunction extractSegmentFlags(\n allFlags: Record<string, boolean | string> | undefined\n): Record<string, boolean> {\n if (!allFlags) return {};\n\n const segmentFlags: Record<string, boolean> = {};\n for (const [key, value] of Object.entries(allFlags)) {\n if (key.startsWith('in_segment_')) {\n segmentFlags[key] = value === true;\n }\n }\n return segmentFlags;\n}\n\n/**\n * Initialize the Syntro SDK with a single token.\n *\n * Environment variable overrides (for dev):\n * SYNTRO_EXPERIMENT_HOST - Override experiment server URL\n * SYNTRO_TELEMETRY_HOST - Override telemetry server URL\n *\n * In editor mode (when editor_token is in URL), the token is optional.\n * The editor SDK handles its own authentication.\n *\n * @param options - Initialization options\n * @returns The initialized SDK components\n */\nasync function init(options: SyntroInitOptions): Promise<SyntroInitResult> {\n // Initialize logger early (URL param works without token)\n initLogger();\n\n debug('Syntro Bootstrap', '====== INIT ======');\n debug('Syntro Bootstrap', 'Options:', {\n hasToken: !!options.token,\n tokenPrefix: `${options.token?.slice(0, 15)}...`,\n hasCanvasOptions: !!options.canvas,\n });\n\n // In editor, audit, or review mode, token is optional - SDK handles auth differently\n const editorMode = isEditorMode();\n const auditMode = isAuditMode();\n const reviewMode = isReviewMode();\n const sdkMode = editorMode ? 'editor' : auditMode ? 'audit' : reviewMode ? 'review' : null;\n console.log(\n `[DIAG] Mode detection: editor=${editorMode}, audit=${auditMode}, review=${reviewMode}, sdkMode=${sdkMode}`\n );\n console.log(`[DIAG] editorSource:`, getEditorSource());\n console.log(`[DIAG] editorConf:`, getEditorConf());\n debug('Syntro Bootstrap', 'SDK mode:', sdkMode ?? 'normal');\n\n // Defensive warning: if mode detection failed but mode-specific globals exist,\n // something went wrong (redirect stripped params, race condition, etc.).\n if (!sdkMode && typeof window !== 'undefined') {\n const hasEditorGlobal = !!(window as any).__SYNTRO_EDITOR_PARAMS__;\n const hasAuditLegend = !!(window as any).__SYNTRO_AUDIT_LEGEND__;\n const hasReviewData = !!(window as any).__SYNTRO_REVIEW_DATA__;\n if (hasEditorGlobal || hasAuditLegend || hasReviewData) {\n const globals = [\n hasEditorGlobal && '__SYNTRO_EDITOR_PARAMS__',\n hasAuditLegend && '__SYNTRO_AUDIT_LEGEND__',\n hasReviewData && '__SYNTRO_REVIEW_DATA__',\n ].filter(Boolean);\n console.warn(\n `[Syntro Bootstrap] \u26A0 Mode detection returned null but mode-specific globals found: ${globals.join(', ')}. ` +\n 'This suggests URL params were lost (redirect?) but the service worker injected mode data. ' +\n 'Check if replaceState failed or if page JS changed the URL before init().'\n );\n }\n }\n\n // Resolve token: options.token > editor_conf.syntro_token (embedded by backend)\n console.log(\n `[DIAG] Token resolution: options.token=${options.token ? options.token.slice(0, 15) + '...' : 'null'}`\n );\n let resolvedToken = options.token;\n if (!resolvedToken && sdkMode) {\n const conf = getEditorConf();\n const embeddedToken = conf?.syntro_token as string | undefined;\n if (embeddedToken?.startsWith('syn_')) {\n resolvedToken = embeddedToken;\n debug('Syntro Bootstrap', `\u2713 Using syntro_token from editor_conf (${sdkMode} mode)`);\n }\n }\n\n let payload: SyntroTokenPayload | undefined;\n if (resolvedToken) {\n // If token is provided and starts with syn_, decode it\n if (resolvedToken.startsWith('syn_')) {\n debug('Syntro Bootstrap', 'Token starts with syn_, decoding...');\n payload = decodeToken(resolvedToken);\n // Re-init logger with token's debug flag\n initLogger(payload.d);\n } else if (!sdkMode) {\n // Not a syn_ token and not in special mode - error\n logError(\n 'Syntro Bootstrap',\n '\u274C Token does not start with syn_ and NOT in editor/audit/review mode!'\n );\n logError('Syntro Bootstrap', 'Token received:', resolvedToken);\n throw new Error(\"Invalid Syntro token: must start with 'syn_'\");\n } else {\n debug('Syntro Bootstrap', `\u2713 Non-syn_ token allowed (${sdkMode} mode)`);\n }\n // If in editor/audit/review mode with non-syn_ token, skip token decoding\n } else if (!sdkMode) {\n // No token and not in special mode - error\n logError('Syntro Bootstrap', '\u274C No token provided and NOT in editor/audit/review mode!');\n throw new Error('Syntro token is required (unless in editor, audit, or review mode)');\n } else {\n debug('Syntro Bootstrap', `\u2713 No token, but ${sdkMode} mode - proceeding`);\n }\n\n // Host resolution priority: env var > token > default\n // Env vars are checked at build time by bundlers (Next.js/Vite)\n const experimentHost =\n getEnvVar('NEXT_PUBLIC_SYNTRO_EXPERIMENT_HOST') ||\n getEnvVar('VITE_SYNTRO_EXPERIMENT_HOST') ||\n payload?.eh; // from token\n\n const telemetryHost =\n getEnvVar('NEXT_PUBLIC_SYNTRO_TELEMETRY_HOST') ||\n getEnvVar('VITE_SYNTRO_TELEMETRY_HOST') ||\n payload?.th; // from token\n\n // Editor SDK URL (for loading editor in edit mode)\n const editorUrl =\n getEnvVar('NEXT_PUBLIC_SYNTRO_EDITOR_URL') ||\n getEnvVar('VITE_SYNTRO_EDITOR_URL') ||\n options.canvas?.editorUrl;\n\n // ============================================================================\n // PHASE 1: Load cached segment attributes for instant evaluation\n // ============================================================================\n const cachedSegmentAttrs = loadCachedSegmentAttributes();\n debug('Syntro Bootstrap', 'Phase 1: Using cached segment attributes:', cachedSegmentAttrs);\n\n // Will be set when experiments client is created\n let experiments: ExperimentClient | undefined;\n\n // ============================================================================\n // Create EventBus early so we can wire PostHog events into it\n // ============================================================================\n const events = createEventBus();\n console.log('[Syntro Bootstrap] EventBus created');\n\n // Create PostHog normalizer that feeds events into the EventBus\n const postHogNormalizer = createPostHogNormalizer((event) => {\n events.publishEvent(event);\n });\n\n // Callback for when PostHog feature flags are loaded (Phase 2)\n const onFeatureFlagsLoaded = (allFlags: Record<string, boolean | string>) => {\n debug('Syntro Bootstrap', 'Phase 2: PostHog feature flags loaded');\n\n // Extract segment flags (in_segment_*)\n const segmentFlags = extractSegmentFlags(allFlags);\n debug('Syntro Bootstrap', 'Segment flags from PostHog:', segmentFlags);\n\n // Cache for next page load\n cacheSegmentAttributes(segmentFlags);\n\n // Update GrowthBook with fresh segment attributes\n if (experiments) {\n // Get current session metrics if available\n const sessionAttrs = sessionMetrics?.getAll?.() ?? {};\n\n // Merge session metrics + segment flags and update GrowthBook\n const updatedAttrs = { ...sessionAttrs, ...segmentFlags };\n debug('Syntro Bootstrap', 'Updating GrowthBook with attributes:', updatedAttrs);\n\n experiments.setAttributes?.(updatedAttrs);\n }\n };\n\n // Initialize telemetry client with feature flags callback and event capture\n let telemetry: TelemetryClient | undefined;\n if (payload?.t) {\n const provider = payload.t === 'noop' ? 'noop' : 'posthog';\n telemetry = createTelemetryClient(provider, {\n apiKey: payload.t,\n apiHost: telemetryHost, // undefined falls back to adapter default\n // Enable PostHog feature flags for segment membership\n enableFeatureFlags: true,\n // Wire up callback for when flags are loaded (Phase 2)\n onFeatureFlagsLoaded,\n // Wire up event capture to feed into EventBus\n onCapture: postHogNormalizer,\n });\n console.log(`[Syntro Bootstrap] Telemetry client created (${provider}) with EventBus wiring`);\n }\n\n // ============================================================================\n // Initialize experiment client with CACHED attributes (Phase 1)\n // PostHog will update these when /decide returns (Phase 2)\n // ============================================================================\n let sessionMetrics: SessionMetricTracker | undefined;\n\n if (payload?.e) {\n experiments = createExperimentClient('growthbook', {\n clientKey: payload.e,\n apiHost: experimentHost, // undefined falls back to adapter default\n // Phase 1: Use cached segment attributes for instant evaluation\n attributes: cachedSegmentAttrs,\n // Wire experiment tracking to telemetry provider\n onExperimentViewed: telemetry?.trackExperiment\n ? (key, variationId, variationName) => {\n telemetry!.trackExperiment!(key, variationId, variationName);\n }\n : undefined,\n });\n }\n\n // Create session metric tracker if enabled\n if (options.enableSessionMetrics) {\n sessionMetrics = createSessionMetricTracker({\n experiments,\n onMetricChange: (key, value) => {\n debug('Syntro Bootstrap', `Session metric changed: ${key} = ${value}`);\n },\n });\n debug('Syntro Bootstrap', 'SessionMetricTracker created');\n }\n\n // Determine runtime mode\n let runtimeMode: RuntimeMode = 'production';\n if (editorMode) runtimeMode = 'editor';\n else if (auditMode) runtimeMode = 'audit';\n else if (getEnvVar('NODE_ENV') === 'development') runtimeMode = 'development';\n\n // ============================================================================\n // Create runtime FIRST (before canvas, so we can wire up app loading)\n // ============================================================================\n const runtime = createSmartCanvasRuntime({\n telemetry,\n sessionMetrics,\n mode: runtimeMode,\n events, // Use the EventBus we created earlier (already wired to PostHog)\n });\n\n debug('Syntro Bootstrap', 'Runtime created:', {\n version: runtime.version,\n mode: runtime.mode,\n hasContext: !!runtime.context,\n hasEvents: !!runtime.events,\n hasState: !!runtime.state,\n });\n\n // ============================================================================\n // Core app executors are registered synchronously in ExecutorRegistry\n // No async registration needed - they're available immediately\n // ============================================================================\n debug('Syntro Bootstrap', 'Core app executors already registered');\n\n // ============================================================================\n // Create app loader for external apps from CDN\n // ============================================================================\n const cdnBase =\n options.cdnBase ||\n getEnvVar('NEXT_PUBLIC_SYNTRO_CDN_BASE') ||\n getEnvVar('VITE_SYNTRO_CDN_BASE') ||\n 'https://cdn.syntrologie.com';\n\n const appLoader = createAppLoader({\n cdnBase,\n registry: runtime.apps,\n onLoadStart: (appId) => {\n debug('Syntro Bootstrap', `Loading app from CDN: ${appId}`);\n },\n onLoadEnd: (appId, success, error) => {\n if (success) {\n debug('Syntro Bootstrap', `App loaded successfully: ${appId}`);\n } else {\n warn('Syntro Bootstrap', `Failed to load app: ${appId}`, error);\n }\n },\n });\n\n // ============================================================================\n // Expose global SynOS object for UMD app self-registration\n // ============================================================================\n if (typeof window !== 'undefined') {\n (window as any).SynOS = {\n ...(window as any).SynOS,\n appRegistry: runtime.apps,\n runtime,\n version: runtime.version,\n };\n debug('Syntro Bootstrap', 'Global SynOS object exposed');\n }\n\n // Auto-activate built-in apps (registered at module load by builtinRuntimeModules).\n // This ensures widgets and event handlers are wired up before config fetching begins.\n const registeredApps = runtime.apps.list?.() ?? [];\n console.log(\n `[DIAG] Activation loop: ${registeredApps.length} apps in registry:`,\n registeredApps.map((a) => `${a.manifest.id}(${a.state})`).join(', ')\n );\n for (const app of registeredApps) {\n if (app.state === 'registered') {\n try {\n await runtime.apps.activate(app.manifest.id);\n console.log(\n `[DIAG] Activated: ${app.manifest.id} \u2192 widgets: [${runtime.widgets.list().join(', ')}]`\n );\n } catch (err) {\n console.error(`[DIAG] FAILED to activate: ${app.manifest.id}`, err);\n warn('Syntro Bootstrap', `Failed to auto-activate built-in app: ${app.manifest.id}`, err);\n }\n }\n }\n console.log(`[DIAG] Activation complete. Total widgets: [${runtime.widgets.list().join(', ')}]`);\n\n // ============================================================================\n // Ensure experiment features are loaded before config resolution\n // gb.init({ streaming: true }) is fire-and-forget in the adapter constructor,\n // so features may not be ready yet. Await them now.\n // ============================================================================\n if (experiments?.refreshFeatures) {\n try {\n await experiments.refreshFeatures();\n debug('Syntro Bootstrap', 'GrowthBook features loaded');\n } catch (err) {\n warn('Syntro Bootstrap', 'Failed to load GrowthBook features:', err);\n }\n }\n\n // ============================================================================\n // Create base config fetcher\n // Priority: custom fetcher > token-specified fetcher > experiments-based\n // ============================================================================\n let baseFetcher: CanvasConfigFetcher | undefined;\n if (options.fetcher) {\n // Custom fetcher provided - use it directly (for local dev / bypassing experiments)\n baseFetcher = options.fetcher;\n } else if (payload?.f) {\n // Explicit fetcher type specified in token\n const configFetcher = createConfigFetcher(payload.f, payload.o ?? {});\n baseFetcher = async () => {\n const result = await configFetcher.fetch();\n return {\n ...result.config,\n tiles: result.config.tiles ?? [],\n };\n };\n } else if (experiments) {\n // Default: use experiments-based fetcher (GrowthBook config or URI)\n baseFetcher = createCanvasConfigFetcher({ experiments });\n }\n\n // ============================================================================\n // Wrap fetcher to automatically load required apps when config is fetched\n // ============================================================================\n // Track which app load failures we've already warned about\n const warnedAppFailures = new Set<string>();\n\n const appLoadingFetcher: CanvasConfigFetcher | undefined = baseFetcher\n ? async () => {\n const config = await baseFetcher!();\n\n console.log(\n '[Syntro Bootstrap] Config fetched:',\n `tiles=${config.tiles?.length ?? 0},`,\n `actions=${(config as any).actions?.length ?? 0},`,\n `theme=${(config as any).theme?.name ?? 'none'}`\n );\n\n if ((config as any).actions?.length > 0) {\n console.log(\n '[Syntro Bootstrap] Actions in config:',\n (config as any).actions\n .map(\n (a: any, i: number) =>\n `[${i}] ${a.kind}${a.anchorId ? ` anchor=\"${a.anchorId}\"` : ''}${a.label ? ` \"${a.label}\"` : ''}`\n )\n .join(', ')\n );\n }\n\n // Analyze config for required apps\n // Cast to CanvasConfigForLoader - the loader only looks at action kinds\n const configForLoader = config as unknown as CanvasConfigForLoader;\n const requiredApps = appLoader.getRequiredApps(configForLoader);\n if (requiredApps.length > 0) {\n console.log('[Syntro Bootstrap] Required external apps:', requiredApps.join(', '));\n } else {\n debug('Syntro Bootstrap', 'No external apps required (all executors are built-in)');\n }\n\n if (requiredApps.length > 0) {\n // Load external apps from CDN (built-in apps are already registered)\n // This runs in parallel - we don't block on it\n const loadPromise = appLoader.loadAppsForConfig(configForLoader).then(async (results) => {\n const successes = results.filter((r) => r.success);\n const failures = results.filter((r) => !r.success);\n\n if (successes.length > 0) {\n console.log(\n `[Syntro Bootstrap] Apps loaded from CDN: ${successes.map((r) => r.appId).join(', ')}`\n );\n }\n\n // Only warn about new failures (not previously warned)\n const newFailures = failures.filter((r) => !warnedAppFailures.has(r.appId));\n if (newFailures.length > 0) {\n console.error(\n `[Syntro Bootstrap] Apps FAILED to load from CDN:`,\n newFailures.map((r) => `${r.appId} (${r.error})`).join(', ')\n );\n newFailures.forEach((r) => warnedAppFailures.add(r.appId));\n }\n\n // Activate required apps after loading\n for (const appId of requiredApps) {\n if (runtime.apps.has(appId)) {\n try {\n await runtime.apps.activate(appId);\n console.log(`[Syntro Bootstrap] App activated: ${appId}`);\n } catch (err) {\n console.error(`[Syntro Bootstrap] Failed to activate app: ${appId}`, err);\n }\n } else {\n console.error(\n `[Syntro Bootstrap] App \"${appId}\" required by config but NOT registered.`,\n `Available apps: [${Array.from(runtime.apps.list?.() ?? []).join(', ')}]`\n );\n }\n }\n });\n\n // For actions that need external apps, we need to wait\n // But for core app actions, they can execute immediately\n await loadPromise;\n }\n\n return config;\n }\n : undefined;\n\n // ============================================================================\n // Create canvas with runtime and app-loading fetcher\n // ============================================================================\n const canvas = await createSmartCanvas({\n ...options.canvas,\n fetcher: appLoadingFetcher,\n integrations: { experiments, telemetry },\n editorUrl,\n runtime, // Pass runtime so actions can be applied\n });\n\n return { canvas, runtime, experiments, telemetry, sessionMetrics, appLoader };\n}\n\n/**\n * The Syntro namespace for single-token initialization.\n */\nexport const Syntro = {\n init,\n encodeToken,\n decodeToken,\n};\n\n// Also set up global for script tag usage\ndeclare global {\n interface Window {\n Syntro?: typeof Syntro;\n SynOS?: {\n appRegistry: typeof appRegistry;\n runtime: SmartCanvasRuntime;\n version: string;\n };\n }\n}\n\nif (typeof window !== 'undefined') {\n window.Syntro = Syntro;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["_a", "_a", "tag", "_a", "_a", "ALLOWED_TAGS", "sanitizeHtml", "_a", "tag", "_a", "modal", "sanitizeHtml", "_a", "sanitizeHtml", "toggle", "_a", "badge", "sanitizeHtml", "executors", "runtime", "runtime", "_a", "_a", "registration", "loadPromise", "error", "runtime", "_a", "error", "_a", "_a", "error", "_a", "_a", "createContext", "useContext", "jsx", "createContext", "jsx", "_a", "_a", "useEffect", "useState", "useState", "useEffect", "_a", "useEffect", "useRef", "appRegistry", "_a", "runtime", "createContext", "useContext", "useEffect", "useMemo", "useState", "jsx", "runtime", "_a", "useCallback", "useEffect", "useRef", "useState", "jsx", "jsxs", "_a", "runtime", "useRef", "useEffect", "useState", "useCallback", "useCallback", "useEffect", "useRef", "useState", "jsx", "jsxs", "error", "_a", "useState", "useRef", "runtime", "useCallback", "useEffect", "toggle", "_e", "useCallback", "useEffect", "useMemo", "useState", "_a", "runtime", "useState", "useCallback", "useEffect", "useMemo", "useEffect", "useMemo", "useRef", "useState", "jsx", "runtime", "_a", "useState", "useEffect", "useMemo", "useRef", "jsx", "_a", "_a", "_a", "_a", "runtime", "error", "_b", "_c", "_d", "config", "_a", "_a", "_a", "error", "executors", "_a", "error", "_a", "executorRegistry", "entry", "error", "_a", "_a", "_a", "_a", "_a", "_a", "_a", "sessionStorage", "_a", "_a", "autoUpdate", "computePosition", "flip", "offset", "shift", "offset", "flip", "shift", "autoUpdate", "computePosition", "_a", "tag", "widgetRegistry", "error", "_a", "entry", "runtime", "_a", "error", "_a", "executors", "runtime", "routes", "_a", "text", "_a", "config", "fetchTimeMs", "_a", "adapters", "_a", "_b", "_c", "runtime", "error", "_d", "_e", "_f"]
|
|
7
|
+
}
|