@syntrologie/runtime-sdk 0.2.21 → 1.0.0

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.
Files changed (324) hide show
  1. package/CAPABILITIES.md +944 -440
  2. package/README.md +395 -66
  3. package/dist/RuntimeProvider.d.ts +51 -0
  4. package/dist/RuntimeProvider.js +113 -0
  5. package/dist/RuntimeProvider.js.map +1 -0
  6. package/dist/SmartCanvasApp.d.ts +16 -10
  7. package/dist/SmartCanvasApp.js +47 -51
  8. package/dist/SmartCanvasApp.js.map +1 -1
  9. package/dist/SmartCanvasElement.d.ts +5 -5
  10. package/dist/SmartCanvasElement.js +24 -14
  11. package/dist/SmartCanvasElement.js.map +1 -1
  12. package/dist/SmartCanvasPortal.d.ts +2 -2
  13. package/dist/SmartCanvasPortal.js +2 -2
  14. package/dist/SmartCanvasPortal.js.map +1 -1
  15. package/dist/actions/ActionEngine.d.ts +11 -0
  16. package/dist/actions/ActionEngine.js +272 -0
  17. package/dist/actions/ActionEngine.js.map +1 -0
  18. package/dist/actions/executors/index.d.ts +116 -0
  19. package/dist/actions/executors/index.js +240 -0
  20. package/dist/actions/executors/index.js.map +1 -0
  21. package/dist/actions/executors/tour.d.ts +18 -0
  22. package/dist/actions/executors/tour.js +332 -0
  23. package/dist/actions/executors/tour.js.map +1 -0
  24. package/dist/actions/index.d.ts +10 -0
  25. package/dist/actions/index.js +12 -0
  26. package/dist/actions/index.js.map +1 -0
  27. package/dist/actions/types.d.ts +399 -0
  28. package/dist/actions/types.js +8 -0
  29. package/dist/actions/types.js.map +1 -0
  30. package/dist/actions/validation.d.ts +14 -0
  31. package/dist/actions/validation.js +577 -0
  32. package/dist/actions/validation.js.map +1 -0
  33. package/dist/adaptives/adaptive-chatbot/index.js +9 -0
  34. package/dist/adaptives/adaptive-chatbot/index.js.map +7 -0
  35. package/dist/adaptives/adaptive-content/index.js +2 -0
  36. package/dist/adaptives/adaptive-content/index.js.map +7 -0
  37. package/dist/adaptives/adaptive-faq/index.js +11 -0
  38. package/dist/adaptives/adaptive-faq/index.js.map +7 -0
  39. package/dist/adaptives/adaptive-gamification/index.js +2 -0
  40. package/dist/adaptives/adaptive-gamification/index.js.map +7 -0
  41. package/dist/adaptives/adaptive-nav/index.js +11 -0
  42. package/dist/adaptives/adaptive-nav/index.js.map +7 -0
  43. package/dist/adaptives/adaptive-overlays/index.js +91 -0
  44. package/dist/adaptives/adaptive-overlays/index.js.map +7 -0
  45. package/dist/antiFlicker.js +1 -1
  46. package/dist/api.d.ts +40 -26
  47. package/dist/api.js +87 -60
  48. package/dist/api.js.map +1 -1
  49. package/dist/apps/AppContext.d.ts +31 -0
  50. package/dist/apps/AppContext.js +91 -0
  51. package/dist/apps/AppContext.js.map +1 -0
  52. package/dist/apps/AppLoader.d.ts +85 -0
  53. package/dist/apps/AppLoader.js +282 -0
  54. package/dist/apps/AppLoader.js.map +1 -0
  55. package/dist/apps/AppRegistry.d.ts +102 -0
  56. package/dist/apps/AppRegistry.js +317 -0
  57. package/dist/apps/AppRegistry.js.map +1 -0
  58. package/dist/apps/examples/gamification-app.example.d.ts +305 -0
  59. package/dist/apps/examples/gamification-app.example.js +329 -0
  60. package/dist/apps/examples/gamification-app.example.js.map +1 -0
  61. package/dist/apps/index.d.ts +14 -0
  62. package/dist/apps/index.js +16 -0
  63. package/dist/apps/index.js.map +1 -0
  64. package/dist/apps/types.d.ts +231 -0
  65. package/dist/apps/types.js +8 -0
  66. package/dist/apps/types.js.map +1 -0
  67. package/dist/blocks/data/ComparisonBlock.d.ts +1 -1
  68. package/dist/blocks/data/ComparisonBlock.js +40 -40
  69. package/dist/blocks/data/ComparisonBlock.js.map +1 -1
  70. package/dist/blocks/data/StatsBlock.d.ts +1 -1
  71. package/dist/blocks/data/StatsBlock.js +42 -44
  72. package/dist/blocks/data/StatsBlock.js.map +1 -1
  73. package/dist/blocks/data/index.d.ts +2 -2
  74. package/dist/blocks/data/index.js +2 -2
  75. package/dist/blocks/index.d.ts +5 -5
  76. package/dist/blocks/index.js +29 -30
  77. package/dist/blocks/index.js.map +1 -1
  78. package/dist/blocks/interactive/ChecklistBlock.d.ts +1 -1
  79. package/dist/blocks/interactive/ChecklistBlock.js +60 -60
  80. package/dist/blocks/interactive/ChecklistBlock.js.map +1 -1
  81. package/dist/blocks/interactive/RatingBlock.d.ts +1 -1
  82. package/dist/blocks/interactive/RatingBlock.js +73 -65
  83. package/dist/blocks/interactive/RatingBlock.js.map +1 -1
  84. package/dist/blocks/interactive/index.d.ts +2 -2
  85. package/dist/blocks/interactive/index.js +2 -2
  86. package/dist/blocks/notification/NotificationBlock.d.ts +2 -2
  87. package/dist/blocks/notification/NotificationBlock.js +68 -64
  88. package/dist/blocks/notification/NotificationBlock.js.map +1 -1
  89. package/dist/blocks/notification/index.d.ts +1 -1
  90. package/dist/blocks/notification/index.js +1 -1
  91. package/dist/bootstrap.d.ts +32 -8
  92. package/dist/bootstrap.js +218 -102
  93. package/dist/bootstrap.js.map +1 -1
  94. package/dist/components/ShadowCanvasOverlay.d.ts +6 -6
  95. package/dist/components/ShadowCanvasOverlay.js +156 -118
  96. package/dist/components/ShadowCanvasOverlay.js.map +1 -1
  97. package/dist/components/TileCard.d.ts +5 -5
  98. package/dist/components/TileCard.js +205 -154
  99. package/dist/components/TileCard.js.map +1 -1
  100. package/dist/components/TileWheel.d.ts +3 -3
  101. package/dist/components/TileWheel.js +29 -7
  102. package/dist/components/TileWheel.js.map +1 -1
  103. package/dist/config-validator.d.ts +49 -0
  104. package/dist/config-validator.js +173 -0
  105. package/dist/config-validator.js.map +1 -0
  106. package/dist/configFetcher.d.ts +7 -3
  107. package/dist/configFetcher.js +70 -29
  108. package/dist/configFetcher.js.map +1 -1
  109. package/dist/context/ContextManager.d.ts +3 -3
  110. package/dist/context/ContextManager.js +19 -18
  111. package/dist/context/ContextManager.js.map +1 -1
  112. package/dist/context/index.d.ts +4 -4
  113. package/dist/context/index.js +3 -3
  114. package/dist/context/schema.d.ts +9 -9
  115. package/dist/context/schema.js +2 -2
  116. package/dist/context/schema.js.map +1 -1
  117. package/dist/decisions/engine.d.ts +5 -5
  118. package/dist/decisions/engine.js +13 -13
  119. package/dist/decisions/engine.js.map +1 -1
  120. package/dist/decisions/index.d.ts +6 -6
  121. package/dist/decisions/index.js +5 -5
  122. package/dist/decisions/schema.d.ts +131 -131
  123. package/dist/decisions/schema.js +21 -21
  124. package/dist/decisions/schema.js.map +1 -1
  125. package/dist/decisions/strategies/rules.d.ts +1 -1
  126. package/dist/decisions/strategies/rules.js +24 -24
  127. package/dist/decisions/strategies/rules.js.map +1 -1
  128. package/dist/decisions/strategies/score.d.ts +1 -1
  129. package/dist/decisions/strategies/score.js +3 -3
  130. package/dist/decisions/types.d.ts +19 -19
  131. package/dist/earlyPatcher.d.ts +8 -20
  132. package/dist/earlyPatcher.js +13 -62
  133. package/dist/earlyPatcher.js.map +1 -1
  134. package/dist/editorLoader.d.ts +19 -7
  135. package/dist/editorLoader.js +154 -97
  136. package/dist/editorLoader.js.map +1 -1
  137. package/dist/events/EventBus.d.ts +3 -3
  138. package/dist/events/EventBus.js +5 -7
  139. package/dist/events/EventBus.js.map +1 -1
  140. package/dist/events/index.d.ts +6 -6
  141. package/dist/events/index.js +5 -5
  142. package/dist/events/normalizers/canvas.d.ts +2 -2
  143. package/dist/events/normalizers/canvas.js +3 -3
  144. package/dist/events/normalizers/canvas.js.map +1 -1
  145. package/dist/events/normalizers/posthog.d.ts +25 -1
  146. package/dist/events/normalizers/posthog.js +35 -27
  147. package/dist/events/normalizers/posthog.js.map +1 -1
  148. package/dist/events/schema.d.ts +13 -13
  149. package/dist/events/schema.js +3 -3
  150. package/dist/events/schema.js.map +1 -1
  151. package/dist/events/types.d.ts +7 -1
  152. package/dist/events/types.js +29 -21
  153. package/dist/events/types.js.map +1 -1
  154. package/dist/experiments/adapters/growthbook.d.ts +5 -4
  155. package/dist/experiments/adapters/growthbook.js +14 -6
  156. package/dist/experiments/adapters/growthbook.js.map +1 -1
  157. package/dist/experiments/index.d.ts +3 -3
  158. package/dist/experiments/index.js +1 -1
  159. package/dist/experiments/registry.d.ts +2 -2
  160. package/dist/experiments/registry.js +2 -2
  161. package/dist/experiments/types.d.ts +10 -1
  162. package/dist/fetchers/cdnFetcher.d.ts +1 -1
  163. package/dist/fetchers/cdnFetcher.js +4 -8
  164. package/dist/fetchers/cdnFetcher.js.map +1 -1
  165. package/dist/fetchers/experimentsFetcher.d.ts +25 -3
  166. package/dist/fetchers/experimentsFetcher.js +55 -8
  167. package/dist/fetchers/experimentsFetcher.js.map +1 -1
  168. package/dist/fetchers/index.d.ts +3 -3
  169. package/dist/fetchers/index.js +2 -2
  170. package/dist/fetchers/index.js.map +1 -1
  171. package/dist/fetchers/mergeConfigs.d.ts +29 -0
  172. package/dist/fetchers/mergeConfigs.js +38 -0
  173. package/dist/fetchers/mergeConfigs.js.map +1 -0
  174. package/dist/fetchers/registry.d.ts +1 -1
  175. package/dist/fetchers/registry.js +4 -4
  176. package/dist/fetchers/types.d.ts +1 -1
  177. package/dist/hooks/useCanvasOverlays.d.ts +8 -5
  178. package/dist/hooks/useCanvasOverlays.js +66 -17
  179. package/dist/hooks/useCanvasOverlays.js.map +1 -1
  180. package/dist/hooks/useHostPatches.d.ts +2 -2
  181. package/dist/hooks/useHostPatches.js +8 -8
  182. package/dist/hooks/useHostPatches.js.map +1 -1
  183. package/dist/hooks/useShadowCanvasConfig.d.ts +5 -9
  184. package/dist/hooks/useShadowCanvasConfig.js +7 -5
  185. package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
  186. package/dist/hostPatcher/core/patcher.d.ts +1 -1
  187. package/dist/hostPatcher/core/patcher.js +18 -9
  188. package/dist/hostPatcher/core/patcher.js.map +1 -1
  189. package/dist/hostPatcher/core/sanitizer.js +24 -3
  190. package/dist/hostPatcher/core/sanitizer.js.map +1 -1
  191. package/dist/hostPatcher/policy/defaultPolicy.js +15 -5
  192. package/dist/hostPatcher/policy/defaultPolicy.js.map +1 -1
  193. package/dist/hostPatcher/utils/anchors.js +4 -6
  194. package/dist/hostPatcher/utils/anchors.js.map +1 -1
  195. package/dist/index.d.ts +34 -27
  196. package/dist/index.js +51 -24
  197. package/dist/index.js.map +1 -1
  198. package/dist/logger.d.ts +29 -0
  199. package/dist/logger.js +81 -0
  200. package/dist/logger.js.map +1 -0
  201. package/dist/metrics/index.d.ts +1 -1
  202. package/dist/metrics/index.js +1 -1
  203. package/dist/metrics/sessionMetrics.d.ts +1 -1
  204. package/dist/metrics/sessionMetrics.js +6 -6
  205. package/dist/overlays/fetcher.d.ts +2 -2
  206. package/dist/overlays/fetcher.js +13 -15
  207. package/dist/overlays/fetcher.js.map +1 -1
  208. package/dist/overlays/recipeRegistry.js +2 -2
  209. package/dist/overlays/recipeRegistry.js.map +1 -1
  210. package/dist/overlays/runtime/anchor/resolve.js +1 -1
  211. package/dist/overlays/runtime/anchor/resolve.js.map +1 -1
  212. package/dist/overlays/runtime/index.d.ts +7 -7
  213. package/dist/overlays/runtime/index.js +7 -7
  214. package/dist/overlays/runtime/overlay/highlight.js +39 -39
  215. package/dist/overlays/runtime/overlay/highlight.js.map +1 -1
  216. package/dist/overlays/runtime/overlay/modal.js +5 -5
  217. package/dist/overlays/runtime/overlay/modal.js.map +1 -1
  218. package/dist/overlays/runtime/overlay/root.js +1 -1
  219. package/dist/overlays/runtime/overlay/runner.js +88 -28
  220. package/dist/overlays/runtime/overlay/runner.js.map +1 -1
  221. package/dist/overlays/runtime/overlay/tooltip.d.ts +1 -1
  222. package/dist/overlays/runtime/overlay/tooltip.js +13 -15
  223. package/dist/overlays/runtime/overlay/tooltip.js.map +1 -1
  224. package/dist/overlays/runtime/utils/dom.js +4 -1
  225. package/dist/overlays/runtime/utils/dom.js.map +1 -1
  226. package/dist/overlays/schema.d.ts +146 -146
  227. package/dist/overlays/schema.js +12 -8
  228. package/dist/overlays/schema.js.map +1 -1
  229. package/dist/react.d.ts +7 -7
  230. package/dist/react.js +4 -4
  231. package/dist/react.js.map +1 -1
  232. package/dist/render/RenderContext.d.ts +2 -2
  233. package/dist/render/RenderContext.js +5 -5
  234. package/dist/render/RenderContext.js.map +1 -1
  235. package/dist/render/index.d.ts +3 -3
  236. package/dist/render/index.js +1 -1
  237. package/dist/render/types.d.ts +4 -4
  238. package/dist/runtime.d.ts +32 -8
  239. package/dist/runtime.js +109 -13
  240. package/dist/runtime.js.map +1 -1
  241. package/dist/smart-canvas.esm.js +144 -55
  242. package/dist/smart-canvas.esm.js.map +4 -4
  243. package/dist/smart-canvas.js +14688 -11455
  244. package/dist/smart-canvas.js.map +4 -4
  245. package/dist/smart-canvas.min.js +145 -55
  246. package/dist/smart-canvas.min.js.map +4 -4
  247. package/dist/state/StateStore.d.ts +1 -7
  248. package/dist/state/StateStore.js +15 -9
  249. package/dist/state/StateStore.js.map +1 -1
  250. package/dist/state/helpers/cooldowns.d.ts +1 -1
  251. package/dist/state/helpers/cooldowns.js +1 -1
  252. package/dist/state/helpers/dismissals.d.ts +1 -1
  253. package/dist/state/helpers/dismissals.js +1 -1
  254. package/dist/state/helpers/frequency.d.ts +1 -1
  255. package/dist/state/helpers/frequency.js +1 -1
  256. package/dist/state/index.d.ts +4 -4
  257. package/dist/state/index.js +3 -3
  258. package/dist/state/schema.d.ts +1 -1
  259. package/dist/state/schema.js +1 -1
  260. package/dist/store/example.d.ts +1 -0
  261. package/dist/store/example.js +43 -0
  262. package/dist/store/example.js.map +1 -0
  263. package/dist/store/mini-effector.d.ts +46 -0
  264. package/dist/store/mini-effector.js +88 -0
  265. package/dist/store/mini-effector.js.map +1 -0
  266. package/dist/surfaces/Surfaces.d.ts +11 -0
  267. package/dist/surfaces/Surfaces.js +361 -0
  268. package/dist/surfaces/Surfaces.js.map +1 -0
  269. package/dist/surfaces/index.d.ts +9 -0
  270. package/dist/surfaces/index.js +12 -0
  271. package/dist/surfaces/index.js.map +1 -0
  272. package/dist/surfaces/positioning.d.ts +50 -0
  273. package/dist/surfaces/positioning.js +228 -0
  274. package/dist/surfaces/positioning.js.map +1 -0
  275. package/dist/surfaces/types.d.ts +167 -0
  276. package/dist/surfaces/types.js +23 -0
  277. package/dist/surfaces/types.js.map +1 -0
  278. package/dist/telemetry/adapters/noop.d.ts +12 -0
  279. package/dist/telemetry/adapters/noop.js +42 -0
  280. package/dist/telemetry/adapters/noop.js.map +1 -0
  281. package/dist/telemetry/adapters/posthog.d.ts +8 -2
  282. package/dist/telemetry/adapters/posthog.js +36 -14
  283. package/dist/telemetry/adapters/posthog.js.map +1 -1
  284. package/dist/telemetry/index.d.ts +4 -3
  285. package/dist/telemetry/index.js +3 -2
  286. package/dist/telemetry/index.js.map +1 -1
  287. package/dist/telemetry/registry.d.ts +2 -9
  288. package/dist/telemetry/registry.js +4 -2
  289. package/dist/telemetry/registry.js.map +1 -1
  290. package/dist/telemetry/types.d.ts +1 -1
  291. package/dist/theme/ThemeProvider.d.ts +2 -2
  292. package/dist/theme/ThemeProvider.js +21 -21
  293. package/dist/theme/ThemeProvider.js.map +1 -1
  294. package/dist/theme/defaultTheme.d.ts +4 -5
  295. package/dist/theme/defaultTheme.js +127 -118
  296. package/dist/theme/defaultTheme.js.map +1 -1
  297. package/dist/theme/extractHostTheme.d.ts +1 -1
  298. package/dist/theme/extractHostTheme.js +43 -45
  299. package/dist/theme/extractHostTheme.js.map +1 -1
  300. package/dist/theme/index.d.ts +5 -5
  301. package/dist/theme/index.js +3 -3
  302. package/dist/theme/index.js.map +1 -1
  303. package/dist/theme/types.d.ts +2 -2
  304. package/dist/token.d.ts +2 -0
  305. package/dist/token.js +3 -6
  306. package/dist/token.js.map +1 -1
  307. package/dist/types-only.d.ts +32 -0
  308. package/dist/types-only.js +11 -0
  309. package/dist/types-only.js.map +1 -0
  310. package/dist/types.d.ts +89 -56
  311. package/dist/types.js +14 -2
  312. package/dist/types.js.map +1 -1
  313. package/dist/version.d.ts +13 -0
  314. package/dist/version.js +14 -0
  315. package/dist/version.js.map +1 -0
  316. package/dist/widgets/WidgetRegistry.d.ts +145 -0
  317. package/dist/widgets/WidgetRegistry.js +191 -0
  318. package/dist/widgets/WidgetRegistry.js.map +1 -0
  319. package/dist/widgets/index.d.ts +7 -0
  320. package/dist/widgets/index.js +7 -0
  321. package/dist/widgets/index.js.map +1 -0
  322. package/package.json +35 -15
  323. package/schema/canvas-config.schema.json +488 -254
  324. package/schema/runtime-context.schema.json +1 -5
@@ -1,15 +1,26 @@
1
- import type { ConfigFetcher, FetchResult } from "./types";
2
- import type { ExperimentClient } from "../experiments/types";
1
+ import type { ExperimentClient } from '../experiments/types';
2
+ import type { ConfigFetcher, FetchResult } from './types';
3
3
  export interface ExperimentsFetcherOptions {
4
4
  /**
5
5
  * Experiment client instance (e.g., from createGrowthBookClient).
6
6
  */
7
7
  client: ExperimentClient;
8
8
  /**
9
- * Feature key that contains the config object.
9
+ * Single feature key for the monolithic config (legacy mode).
10
10
  * @default "smart-canvas-config"
11
11
  */
12
12
  featureKey?: string;
13
+ /**
14
+ * Feature key for the variant manifest (lists active variant flag keys).
15
+ * When set, enables multi-flag mode.
16
+ */
17
+ manifestKey?: string;
18
+ /**
19
+ * Prefix for convention-based variant flag discovery.
20
+ * All GrowthBook features matching this prefix will be evaluated.
21
+ * Used as fallback when manifestKey is not set or returns empty.
22
+ */
23
+ variantFlagPrefix?: string;
13
24
  }
14
25
  /**
15
26
  * Fetches config from an experiment/feature flag system.
@@ -24,8 +35,19 @@ export declare class ExperimentsFetcher implements ConfigFetcher {
24
35
  readonly name = "experiments";
25
36
  private client;
26
37
  private featureKey;
38
+ private manifestKey?;
39
+ private variantFlagPrefix?;
27
40
  constructor(options: ExperimentsFetcherOptions);
28
41
  fetch(): Promise<FetchResult>;
42
+ /**
43
+ * Resolve config from multiple variant feature flags.
44
+ * Returns the first active variant config, or null if none match.
45
+ */
46
+ private fetchMultiFlag;
47
+ /**
48
+ * Get variant flag keys from manifest or prefix discovery.
49
+ */
50
+ private getVariantFlagKeys;
29
51
  }
30
52
  /**
31
53
  * Factory function for creating an experiments-based fetcher.
@@ -1,9 +1,10 @@
1
+ import { resolveVariantConfigs } from './mergeConfigs';
1
2
  /**
2
3
  * URL parameters for forcing experiment variations in preview mode.
3
4
  * Usage: ?syntro_exp=experiment_tracking_key&syntro_var=1
4
5
  */
5
- const PREVIEW_EXP_PARAM = "syntro_exp";
6
- const PREVIEW_VAR_PARAM = "syntro_var";
6
+ const PREVIEW_EXP_PARAM = 'syntro_exp';
7
+ const PREVIEW_VAR_PARAM = 'syntro_var';
7
8
  /**
8
9
  * Fetches config from an experiment/feature flag system.
9
10
  *
@@ -16,15 +17,17 @@ const PREVIEW_VAR_PARAM = "syntro_var";
16
17
  export class ExperimentsFetcher {
17
18
  constructor(options) {
18
19
  var _a;
19
- this.name = "experiments";
20
+ this.name = 'experiments';
20
21
  this.client = options.client;
21
- this.featureKey = (_a = options.featureKey) !== null && _a !== void 0 ? _a : "smart-canvas-config";
22
+ this.featureKey = (_a = options.featureKey) !== null && _a !== void 0 ? _a : 'smart-canvas-config';
23
+ this.manifestKey = options.manifestKey;
24
+ this.variantFlagPrefix = options.variantFlagPrefix;
22
25
  }
23
26
  async fetch() {
24
27
  var _a, _b;
25
28
  const start = performance.now();
26
29
  // Check for preview URL params to force a specific variation
27
- if (typeof window !== "undefined") {
30
+ if (typeof window !== 'undefined') {
28
31
  const params = new URLSearchParams(window.location.search);
29
32
  const expName = params.get(PREVIEW_EXP_PARAM);
30
33
  const varIndex = params.get(PREVIEW_VAR_PARAM);
@@ -36,9 +39,20 @@ export class ExperimentsFetcher {
36
39
  }
37
40
  }
38
41
  }
39
- // Get config from experiment client (GrowthBook feature flag)
42
+ // Multi-flag mode: evaluate multiple feature flags and merge configs
43
+ if (this.manifestKey || this.variantFlagPrefix) {
44
+ const config = this.fetchMultiFlag();
45
+ if (config) {
46
+ const fetchTimeMs = performance.now() - start;
47
+ return {
48
+ config,
49
+ meta: { source: 'experiments', fetchTimeMs, cached: true },
50
+ };
51
+ }
52
+ }
53
+ // Legacy single-flag mode
40
54
  const config = (_b = (_a = this.client).getFeatureValue) === null || _b === void 0 ? void 0 : _b.call(_a, this.featureKey, null);
41
- if (!config || typeof config !== "object") {
55
+ if (!config || typeof config !== 'object') {
42
56
  throw new Error(`[SmartCanvas] Feature "${this.featureKey}" not found or invalid. ` +
43
57
  `Ensure the feature is configured in your experiment platform.`);
44
58
  }
@@ -46,12 +60,45 @@ export class ExperimentsFetcher {
46
60
  return {
47
61
  config: config,
48
62
  meta: {
49
- source: "experiments",
63
+ source: 'experiments',
50
64
  fetchTimeMs,
51
65
  cached: true,
52
66
  },
53
67
  };
54
68
  }
69
+ /**
70
+ * Resolve config from multiple variant feature flags.
71
+ * Returns the first active variant config, or null if none match.
72
+ */
73
+ fetchMultiFlag() {
74
+ const variantKeys = this.getVariantFlagKeys();
75
+ if (!variantKeys || variantKeys.length === 0) {
76
+ return null;
77
+ }
78
+ return resolveVariantConfigs(this.client, variantKeys);
79
+ }
80
+ /**
81
+ * Get variant flag keys from manifest or prefix discovery.
82
+ */
83
+ getVariantFlagKeys() {
84
+ var _a, _b;
85
+ // Try manifest first
86
+ if (this.manifestKey) {
87
+ const manifest = (_b = (_a = this.client).getFeatureValue) === null || _b === void 0 ? void 0 : _b.call(_a, this.manifestKey, null);
88
+ if (manifest && typeof manifest === 'object') {
89
+ const keys = manifest.variant_flags;
90
+ if (keys && keys.length > 0) {
91
+ return keys;
92
+ }
93
+ }
94
+ }
95
+ // Fall back to prefix-based discovery using getAllFeatures
96
+ if (this.variantFlagPrefix && this.client.getAllFeatures) {
97
+ const allFeatures = this.client.getAllFeatures();
98
+ return Object.keys(allFeatures).filter((key) => key.startsWith(this.variantFlagPrefix));
99
+ }
100
+ return [];
101
+ }
55
102
  }
56
103
  /**
57
104
  * Factory function for creating an experiments-based fetcher.
@@ -1 +1 @@
1
- {"version":3,"file":"experimentsFetcher.js","sourceRoot":"","sources":["../../src/fetchers/experimentsFetcher.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,iBAAiB,GAAG,YAAY,CAAC;AACvC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAevC;;;;;;;;GAQG;AACH,MAAM,OAAO,kBAAkB;IAM7B,YAAY,OAAkC;;QALrC,SAAI,GAAG,aAAa,CAAC;QAM5B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,MAAA,OAAO,CAAC,UAAU,mCAAI,qBAAqB,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,KAAK;;QACT,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEhC,6DAA6D;QAC7D,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAE/C,IAAI,OAAO,IAAI,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBACpE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,wCAAwC,OAAO,kBAAkB,KAAK,EAAE,CAAC,CAAC;oBACtF,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,MAAM,MAAM,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,EAAC,eAAe,mDAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEpE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,CAAC,UAAU,0BAA0B;gBACnE,+DAA+D,CAChE,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAE9C,OAAO;YACL,MAAM,EAAE,MAA8B;YACtC,IAAI,EAAE;gBACJ,MAAM,EAAE,aAAa;gBACrB,WAAW;gBACX,MAAM,EAAE,IAAI;aACb;SACF,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAkC;IAElC,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"experimentsFetcher.js","sourceRoot":"","sources":["../../src/fetchers/experimentsFetcher.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- export type { ConfigFetcher, FetchResult } from "./types";
2
- export { ExperimentsFetcher, createExperimentsFetcher, type ExperimentsFetcherOptions, } from "./experimentsFetcher";
3
- export { CdnFetcher, createCdnFetcher, type CdnFetcherOptions, } from "./cdnFetcher";
1
+ export type { ConfigFetcher, FetchResult } from './types';
2
+ export { ExperimentsFetcher, createExperimentsFetcher, type ExperimentsFetcherOptions, } from './experimentsFetcher';
3
+ export { CdnFetcher, createCdnFetcher, type CdnFetcherOptions } from './cdnFetcher';
@@ -1,5 +1,5 @@
1
1
  // Experiments-based fetcher (GrowthBook, LaunchDarkly, etc.)
2
- export { ExperimentsFetcher, createExperimentsFetcher, } from "./experimentsFetcher";
2
+ export { ExperimentsFetcher, createExperimentsFetcher, } from './experimentsFetcher';
3
3
  // CDN fetcher with UUID-based paths
4
- export { CdnFetcher, createCdnFetcher, } from "./cdnFetcher";
4
+ export { CdnFetcher, createCdnFetcher } from './cdnFetcher';
5
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fetchers/index.ts"],"names":[],"mappings":"AAGA,6DAA6D;AAC7D,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAEzB,MAAM,sBAAsB,CAAC;AAE9B,oCAAoC;AACpC,OAAO,EACL,UAAU,EACV,gBAAgB,GAEjB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fetchers/index.ts"],"names":[],"mappings":"AAGA,6DAA6D;AAC7D,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAEzB,MAAM,sBAAsB,CAAC;AAE9B,oCAAoC;AACpC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAA0B,MAAM,cAAc,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { ExperimentClient } from '../experiments/types';
2
+ import type { CanvasConfigResponse } from '../types';
3
+ /**
4
+ * Partial config as returned by a single variant feature flag.
5
+ * Variant flags may only contain a subset of CanvasConfigResponse fields.
6
+ */
7
+ export type VariantFlagValue = Partial<CanvasConfigResponse> & {
8
+ overlays?: unknown[];
9
+ };
10
+ /**
11
+ * Strategy for resolving multiple active variant configs into one.
12
+ *
13
+ * Currently: "first-match" — returns the first non-empty variant config.
14
+ * Future: "merge" — concatenate tiles/actions/overlays from all variants.
15
+ */
16
+ export type MergeStrategy = 'first-match';
17
+ /**
18
+ * Resolve multiple variant feature flags into a single CanvasConfigResponse.
19
+ *
20
+ * Evaluates each flag key against the experiment client and applies the
21
+ * configured strategy. Currently uses "first-match": the first flag that
22
+ * returns a non-empty config wins.
23
+ *
24
+ * @param client - Experiment client to evaluate feature flags
25
+ * @param keys - Ordered list of variant flag keys to evaluate
26
+ * @param _strategy - Resolution strategy (reserved for future use)
27
+ * @returns Resolved config, or null if no flags are active
28
+ */
29
+ export declare function resolveVariantConfigs(client: ExperimentClient, keys: string[], _strategy?: MergeStrategy): CanvasConfigResponse | null;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Resolve multiple variant feature flags into a single CanvasConfigResponse.
3
+ *
4
+ * Evaluates each flag key against the experiment client and applies the
5
+ * configured strategy. Currently uses "first-match": the first flag that
6
+ * returns a non-empty config wins.
7
+ *
8
+ * @param client - Experiment client to evaluate feature flags
9
+ * @param keys - Ordered list of variant flag keys to evaluate
10
+ * @param _strategy - Resolution strategy (reserved for future use)
11
+ * @returns Resolved config, or null if no flags are active
12
+ */
13
+ export function resolveVariantConfigs(client, keys, _strategy = 'first-match') {
14
+ var _a, _b, _c, _d;
15
+ for (const key of keys) {
16
+ const value = (_a = client.getFeatureValue) === null || _a === void 0 ? void 0 : _a.call(client, key, null);
17
+ if (!value || typeof value !== 'object')
18
+ continue;
19
+ const variant = value;
20
+ const hasTiles = variant.tiles && variant.tiles.length > 0;
21
+ const hasActions = variant.actions && variant.actions.length > 0;
22
+ if (hasTiles || hasActions) {
23
+ return {
24
+ tiles: (_b = variant.tiles) !== null && _b !== void 0 ? _b : [],
25
+ actions: (_c = variant.actions) !== null && _c !== void 0 ? _c : [],
26
+ fetchedAt: (_d = variant.fetchedAt) !== null && _d !== void 0 ? _d : new Date().toISOString(),
27
+ ...(variant.schemaVersion && { schemaVersion: variant.schemaVersion }),
28
+ ...(variant.configVersion && { configVersion: variant.configVersion }),
29
+ ...(variant.canvasTitle && { canvasTitle: variant.canvasTitle }),
30
+ ...(variant.theme && { theme: variant.theme }),
31
+ ...(variant.launcher && { launcher: variant.launcher }),
32
+ ...(variant.routes && { routes: variant.routes }),
33
+ };
34
+ }
35
+ }
36
+ return null;
37
+ }
38
+ //# sourceMappingURL=mergeConfigs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeConfigs.js","sourceRoot":"","sources":["../../src/fetchers/mergeConfigs.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAwB,EACxB,IAAc,EACd,YAA2B,aAAa;;IAExC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAA,MAAM,CAAC,eAAe,uDAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAElD,MAAM,OAAO,GAAG,KAAyB,CAAC;QAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAEjE,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,OAAO;gBACL,KAAK,EAAE,MAAA,OAAO,CAAC,KAAK,mCAAI,EAAE;gBAC1B,OAAO,EAAE,MAAA,OAAO,CAAC,OAAO,mCAAI,EAAE;gBAC9B,SAAS,EAAE,MAAA,OAAO,CAAC,SAAS,mCAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACxD,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;gBACtE,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;gBACtE,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;gBAChE,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC9C,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACvD,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { ConfigFetcher } from "./types";
1
+ import type { ConfigFetcher } from './types';
2
2
  /**
3
3
  * Default CDN base URL for config fetching.
4
4
  */
@@ -5,12 +5,12 @@
5
5
  * This allows the bootstrap module to dynamically create
6
6
  * fetchers based on token configuration.
7
7
  */
8
- import { createCdnFetcher } from "./cdnFetcher";
9
- import { createExperimentsFetcher } from "./experimentsFetcher";
8
+ import { createCdnFetcher } from './cdnFetcher';
9
+ import { createExperimentsFetcher } from './experimentsFetcher';
10
10
  /**
11
11
  * Default CDN base URL for config fetching.
12
12
  */
13
- export const DEFAULT_CDN_BASE_URL = "https://cdn.syntrologie.com/configs";
13
+ export const DEFAULT_CDN_BASE_URL = 'https://cdn.syntrologie.com/configs';
14
14
  const fetchers = {
15
15
  /**
16
16
  * CDN fetcher - fetches config from Syntrologie CDN.
@@ -51,7 +51,7 @@ const fetchers = {
51
51
  export function createConfigFetcher(type, options = {}) {
52
52
  const factory = fetchers[type];
53
53
  if (!factory) {
54
- throw new Error(`Unknown config fetcher type: ${type}. Supported: ${Object.keys(fetchers).join(", ")}`);
54
+ throw new Error(`Unknown config fetcher type: ${type}. Supported: ${Object.keys(fetchers).join(', ')}`);
55
55
  }
56
56
  return factory(options);
57
57
  }
@@ -1,4 +1,4 @@
1
- import type { CanvasConfigResponse } from "../types";
1
+ import type { CanvasConfigResponse } from '../types';
2
2
  /**
3
3
  * Result from a config fetch, including timing metadata.
4
4
  */
@@ -1,7 +1,8 @@
1
- import type { ExperimentClient } from "../experiments/types";
2
- import type { TelemetryClient } from "../telemetry/types";
3
- import { type OverlayRecipeFetcher } from "../overlays/fetcher";
4
- import type { CanvasRecipe } from "../overlays/types";
1
+ import type { ExperimentClient } from '../experiments/types';
2
+ import { type OverlayRecipeFetcher } from '../overlays/fetcher';
3
+ import type { CanvasRecipe } from '../overlays/types';
4
+ import type { SmartCanvasRuntime } from '../runtime';
5
+ import type { TelemetryClient } from '../telemetry/types';
5
6
  export type OverlayRecipesFetcher = () => Promise<CanvasRecipe[] | CanvasRecipe | undefined>;
6
7
  export interface UseCanvasOverlaysOptions {
7
8
  fetcher?: OverlayRecipeFetcher;
@@ -12,6 +13,8 @@ export interface UseCanvasOverlaysOptions {
12
13
  credentials?: RequestCredentials;
13
14
  experiments?: ExperimentClient;
14
15
  telemetry?: TelemetryClient;
16
+ /** v2 Runtime for EventBus publishing */
17
+ runtime?: SmartCanvasRuntime;
15
18
  canvasHost?: HTMLElement | null;
16
19
  }
17
- export declare function useCanvasOverlays({ fetcher, recipesFetcher, configUri, featureKey, credentials, experiments, telemetry, canvasHost, }: UseCanvasOverlaysOptions): void;
20
+ export declare function useCanvasOverlays({ fetcher, recipesFetcher, configUri, featureKey, credentials, experiments, telemetry, runtime, canvasHost, }: UseCanvasOverlaysOptions): void;
@@ -1,8 +1,9 @@
1
- import { useEffect, useMemo } from "react";
2
- import { createOverlayRecipeFetcher } from "../overlays/fetcher";
3
- import { CanvasRecipeZ } from "../overlays/schema";
4
- import { registerRecipes, clearRecipes } from "../overlays/recipeRegistry";
5
- export function useCanvasOverlays({ fetcher, recipesFetcher, configUri, featureKey, credentials, experiments, telemetry, canvasHost, }) {
1
+ import { useEffect, useMemo } from 'react';
2
+ import { CanvasEvents } from '../events/normalizers/canvas';
3
+ import { createOverlayRecipeFetcher } from '../overlays/fetcher';
4
+ import { registerRecipes, clearRecipes } from '../overlays/recipeRegistry';
5
+ import { CanvasRecipeZ } from '../overlays/schema';
6
+ export function useCanvasOverlays({ fetcher, recipesFetcher, configUri, featureKey, credentials, experiments, telemetry, runtime, canvasHost, }) {
6
7
  const derivedFetcher = useMemo(() => {
7
8
  // Priority 1: Use explicit recipes fetcher if provided (for multiple recipes)
8
9
  if (recipesFetcher)
@@ -27,7 +28,7 @@ export function useCanvasOverlays({ fetcher, recipesFetcher, configUri, featureK
27
28
  if (!derivedFetcher)
28
29
  return;
29
30
  let cancelled = false;
30
- let cleanups = [];
31
+ const cleanups = [];
31
32
  (async () => {
32
33
  var _a, _b;
33
34
  try {
@@ -40,40 +41,88 @@ export function useCanvasOverlays({ fetcher, recipesFetcher, configUri, featureK
40
41
  return;
41
42
  // Register recipes so TileCard can look them up for navigation
42
43
  registerRecipes(recipes);
43
- const mod = await import("../overlays/runtime");
44
+ const mod = await import('../overlays/runtime');
44
45
  const overlayRoot = mod.ensureOverlayRoot();
45
46
  const resolve = mod.createAnchorResolver({ canvasHost });
46
47
  const ctx = {
47
48
  overlayRoot,
48
49
  resolve,
49
50
  canvasHost,
50
- telemetry: telemetry ? {
51
- setPersonPropertiesOnce: (_a = telemetry.setPersonPropertiesOnce) === null || _a === void 0 ? void 0 : _a.bind(telemetry),
52
- } : undefined,
51
+ telemetry: telemetry
52
+ ? {
53
+ setPersonPropertiesOnce: (_a = telemetry.setPersonPropertiesOnce) === null || _a === void 0 ? void 0 : _a.bind(telemetry),
54
+ }
55
+ : undefined,
53
56
  onEvent: (name, payload) => {
54
- var _a, _b;
55
- if (!telemetry)
56
- return;
57
- (_a = telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, name, (_b = payload === null || payload === void 0 ? void 0 : payload.stepId) !== null && _b !== void 0 ? _b : "", "overlay");
57
+ var _a, _b, _c, _d;
58
+ // Telemetry tracking (PostHog)
59
+ (_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, name, (_b = payload === null || payload === void 0 ? void 0 : payload.stepId) !== null && _b !== void 0 ? _b : '', 'overlay');
60
+ // EventBus publishing (v2 runtime)
61
+ if (runtime) {
62
+ const recipeId = payload === null || payload === void 0 ? void 0 : payload.recipeId;
63
+ const stepId = payload === null || payload === void 0 ? void 0 : payload.stepId;
64
+ // Map overlay event names to normalized events
65
+ let event;
66
+ switch (name) {
67
+ case 'syntro_overlay_exposed':
68
+ event = CanvasEvents.overlayStepViewed(recipeId, 0, stepId);
69
+ break;
70
+ case 'syntro_overlay_dismissed':
71
+ event = CanvasEvents.overlayDismissed(recipeId, undefined, undefined);
72
+ break;
73
+ case 'syntro_overlay_action':
74
+ event = CanvasEvents.tileAction(stepId, (_c = payload === null || payload === void 0 ? void 0 : payload.actionId) !== null && _c !== void 0 ? _c : '', 'overlay');
75
+ break;
76
+ case 'syntro_tour_step':
77
+ event = CanvasEvents.overlayStepViewed(recipeId, 0, stepId);
78
+ break;
79
+ case 'syntro_tour_action':
80
+ event = CanvasEvents.tileAction(stepId, (_d = payload === null || payload === void 0 ? void 0 : payload.actionId) !== null && _d !== void 0 ? _d : '', 'overlay');
81
+ break;
82
+ case 'syntro_tour_end':
83
+ if ((payload === null || payload === void 0 ? void 0 : payload.reason) === 'completed') {
84
+ event = CanvasEvents.overlayCompleted(recipeId);
85
+ }
86
+ else {
87
+ event = CanvasEvents.overlayDismissed(recipeId, undefined, undefined);
88
+ }
89
+ break;
90
+ case 'syntro_anchor_missing':
91
+ // Custom event for anchor missing
92
+ event = CanvasEvents.custom('anchor_missing', payload);
93
+ break;
94
+ default:
95
+ // Pass through as custom canvas event
96
+ event = CanvasEvents.custom(name, payload);
97
+ }
98
+ if (event) {
99
+ runtime.events.publish(event.name, event.props, event.source);
100
+ }
101
+ }
58
102
  },
59
103
  };
60
104
  // Run all recipes
61
105
  for (const recipe of recipes) {
62
106
  if (!((_b = recipe === null || recipe === void 0 ? void 0 : recipe.steps) === null || _b === void 0 ? void 0 : _b.length) || cancelled)
63
107
  continue;
108
+ // Publish overlay started event
109
+ if (runtime) {
110
+ const event = CanvasEvents.overlayStarted(recipe.id, recipe.title);
111
+ runtime.events.publish(event.name, event.props, event.source);
112
+ }
64
113
  const cleanup = await mod.runOverlays(recipe, ctx);
65
114
  cleanups.push(cleanup);
66
115
  }
67
116
  }
68
117
  catch (err) {
69
- console.warn("[SmartCanvas] overlays failed", err);
118
+ console.warn('[SmartCanvas] overlays failed', err);
70
119
  }
71
120
  })();
72
121
  return () => {
73
122
  cancelled = true;
74
- cleanups.forEach(fn => fn === null || fn === void 0 ? void 0 : fn());
123
+ cleanups.forEach((fn) => fn === null || fn === void 0 ? void 0 : fn());
75
124
  clearRecipes();
76
125
  };
77
- }, [derivedFetcher, telemetry, canvasHost]);
126
+ }, [derivedFetcher, telemetry, runtime, canvasHost]);
78
127
  }
79
128
  //# sourceMappingURL=useCanvasOverlays.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCanvasOverlays.js","sourceRoot":"","sources":["../../src/hooks/useCanvasOverlays.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useCanvasOverlays.js","sourceRoot":"","sources":["../../src/hooks/useCanvasOverlays.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import type { Patch, Policy } from "../hostPatcher/core/types";
2
- import type { TelemetryClient } from "../telemetry/types";
1
+ import type { Patch, Policy } from '../hostPatcher/core/types';
2
+ import type { TelemetryClient } from '../telemetry/types';
3
3
  export interface UseHostPatchesOptions {
4
4
  patches?: Patch[];
5
5
  telemetry?: TelemetryClient;
@@ -1,6 +1,6 @@
1
- import { useEffect } from "react";
2
- import { applyPatch, revertPatch } from "../hostPatcher/core/patcher";
3
- import { defaultPolicy } from "../hostPatcher/policy/defaultPolicy";
1
+ import { useEffect } from 'react';
2
+ import { applyPatch, revertPatch } from '../hostPatcher/core/patcher';
3
+ import { defaultPolicy } from '../hostPatcher/policy/defaultPolicy';
4
4
  export function useHostPatches({ patches, telemetry, policy = defaultPolicy, canvasHost, }) {
5
5
  useEffect(() => {
6
6
  if (!patches || patches.length === 0)
@@ -12,15 +12,15 @@ export function useHostPatches({ patches, telemetry, policy = defaultPolicy, can
12
12
  shadowHost: canvasHost,
13
13
  policy,
14
14
  onLog: telemetry
15
- ? (level, msg, data) => { var _a; return (_a = telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, `syntro_patch_${level}`, patch.id, "overlay"); }
15
+ ? (level, _msg, _data) => { var _a; return (_a = telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, `syntro_patch_${level}`, patch.id, 'overlay'); }
16
16
  : undefined,
17
17
  });
18
18
  if (result.ok) {
19
19
  applied.push(patch.id);
20
- (_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, "syntro_patch_applied", patch.id, "overlay");
20
+ (_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, 'syntro_patch_applied', patch.id, 'overlay');
21
21
  }
22
22
  else {
23
- (_b = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _b === void 0 ? void 0 : _b.call(telemetry, "syntro_patch_failed", patch.id, "overlay");
23
+ (_b = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _b === void 0 ? void 0 : _b.call(telemetry, 'syntro_patch_failed', patch.id, 'overlay');
24
24
  }
25
25
  });
26
26
  return () => {
@@ -28,10 +28,10 @@ export function useHostPatches({ patches, telemetry, policy = defaultPolicy, can
28
28
  var _a;
29
29
  try {
30
30
  revertPatch(id);
31
- (_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, "syntro_patch_reverted", id, "overlay");
31
+ (_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.trackAction) === null || _a === void 0 ? void 0 : _a.call(telemetry, 'syntro_patch_reverted', id, 'overlay');
32
32
  }
33
33
  catch (err) {
34
- console.warn("[SmartCanvas] failed to revert patch", id, err);
34
+ console.warn('[SmartCanvas] failed to revert patch', id, err);
35
35
  }
36
36
  });
37
37
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useHostPatches.js","sourceRoot":"","sources":["../../src/hooks/useHostPatches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAUpE,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,EACT,MAAM,GAAG,aAAa,EACtB,UAAU,GACY;IACtB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;;YACxB,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE;gBAC/B,UAAU,EAAE,UAAU;gBACtB,MAAM;gBACN,KAAK,EAAE,SAAS;oBACd,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,WAAC,OAAA,MAAA,SAAS,CAAC,WAAW,0DAAG,gBAAgB,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA,EAAA;oBAC7F,CAAC,CAAC,SAAS;aACd,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvB,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0DAAG,sBAAsB,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0DAAG,qBAAqB,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;;gBACrB,IAAI,CAAC;oBACH,WAAW,CAAC,EAAE,CAAC,CAAC;oBAChB,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0DAAG,uBAAuB,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;gBACnE,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"useHostPatches.js","sourceRoot":"","sources":["../../src/hooks/useHostPatches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAUpE,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,EACT,MAAM,GAAG,aAAa,EACtB,UAAU,GACY;IACtB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;;YACxB,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE;gBAC/B,UAAU,EAAE,UAAU;gBACtB,MAAM;gBACN,KAAK,EAAE,SAAS;oBACd,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WACrB,OAAA,MAAA,SAAS,CAAC,WAAW,0DAAG,gBAAgB,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA,EAAA;oBACzE,CAAC,CAAC,SAAS;aACd,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACvB,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0DAAG,sBAAsB,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0DAAG,qBAAqB,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;;gBACrB,IAAI,CAAC;oBACH,WAAW,CAAC,EAAE,CAAC,CAAC;oBAChB,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0DAAG,uBAAuB,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;gBACnE,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -1,7 +1,6 @@
1
- import type { CanvasConfigFetcher, TileConfig, CanvasThemeConfig, LauncherConfig, RoutesConfig } from "../types";
2
- import type { Patch } from "../hostPatcher/core/types";
3
- import type { ExperimentClient } from "../experiments/types";
4
- import type { SmartCanvasRuntime } from "../runtime";
1
+ import type { ExperimentClient } from '../experiments/types';
2
+ import type { SmartCanvasRuntime } from '../runtime';
3
+ import type { CanvasConfigFetcher, TileConfig, CanvasThemeConfig, LauncherConfig, RoutesConfig, ActionStep } from '../types';
5
4
  export interface UseShadowCanvasConfigOptions {
6
5
  fetcher: CanvasConfigFetcher;
7
6
  pollIntervalMs?: number;
@@ -17,11 +16,8 @@ export interface ShadowCanvasConfigState {
17
16
  fetchedAt?: string;
18
17
  canvasTitle?: string;
19
18
  configVersion?: string;
20
- patches?: Patch[];
21
- /** @deprecated Use overlayRecipes instead */
22
- overlayRecipe?: import('../overlays/types').CanvasRecipe;
23
- /** Multiple overlay recipes (tours) */
24
- overlayRecipes?: import('../overlays/types').CanvasRecipe[];
19
+ /** Actions to execute (tooltips, highlights, DOM changes, etc.) */
20
+ actions: ActionStep[];
25
21
  displayMode?: 'standard' | 'focused';
26
22
  /** Theme configuration from the canvas config (workspace settings) */
27
23
  theme?: CanvasThemeConfig;
@@ -1,14 +1,17 @@
1
- import { useCallback, useEffect, useMemo, useState } from "react";
1
+ import { useCallback, useEffect, useMemo, useState } from 'react';
2
+ import { debug } from '../logger';
2
3
  const sortTiles = (tiles) => [...tiles].sort((a, b) => { var _a, _b; return ((_a = a.order) !== null && _a !== void 0 ? _a : 0) - ((_b = b.order) !== null && _b !== void 0 ? _b : 0); });
3
4
  export function useShadowCanvasConfig({ fetcher, pollIntervalMs = 30000, experiments, runtime, }) {
4
5
  const [state, setState] = useState({
5
6
  tiles: [],
7
+ actions: [],
6
8
  isLoading: true,
7
9
  });
8
10
  const load = useCallback(async () => {
9
11
  try {
10
12
  setState((prev) => ({ ...prev, isLoading: true, error: undefined }));
11
13
  const response = await fetcher();
14
+ debug('SmartCanvas Config', 'Raw config response', response);
12
15
  let tiles = response.tiles || [];
13
16
  // Update runtime routes config if provided
14
17
  if (runtime && response.routes) {
@@ -27,15 +30,14 @@ export function useShadowCanvasConfig({ fetcher, pollIntervalMs = 30000, experim
27
30
  // v1: Use legacy experiment filtering only
28
31
  tiles = tiles.filter((tile) => experiments.shouldRenderRectangle(tile));
29
32
  }
33
+ debug('SmartCanvas Config', `Tile count after filtering: ${tiles.length}`);
30
34
  setState({
31
35
  tiles: sortTiles(tiles),
36
+ actions: response.actions || [],
32
37
  isLoading: false,
33
38
  fetchedAt: response.fetchedAt,
34
39
  canvasTitle: response.canvasTitle,
35
40
  configVersion: response.configVersion,
36
- patches: response.patches,
37
- overlayRecipe: response.overlayRecipe,
38
- overlayRecipes: response.overlayRecipes,
39
41
  theme: response.theme,
40
42
  launcher: response.launcher,
41
43
  routes: response.routes,
@@ -45,7 +47,7 @@ export function useShadowCanvasConfig({ fetcher, pollIntervalMs = 30000, experim
45
47
  setState((prev) => ({
46
48
  ...prev,
47
49
  isLoading: false,
48
- error: err instanceof Error ? err.message : "Unknown error",
50
+ error: err instanceof Error ? err.message : 'Unknown error',
49
51
  }));
50
52
  }
51
53
  }, [experiments, fetcher, runtime]);
@@ -1 +1 @@
1
- {"version":3,"file":"useShadowCanvasConfig.js","sourceRoot":"","sources":["../../src/hooks/useShadowCanvasConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useShadowCanvasConfig.js","sourceRoot":"","sources":["../../src/hooks/useShadowCanvasConfig.ts"],"names":[],"mappings":"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"}