@syntrologie/runtime-sdk 1.0.1 → 2.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 (128) hide show
  1. package/CAPABILITIES.md +630 -463
  2. package/README.md +285 -62
  3. package/dist/RuntimeProvider.d.ts +51 -0
  4. package/dist/RuntimeProvider.js +114 -0
  5. package/dist/RuntimeProvider.js.map +1 -0
  6. package/dist/SmartCanvasApp.d.ts +9 -3
  7. package/dist/SmartCanvasApp.js +36 -38
  8. package/dist/SmartCanvasApp.js.map +1 -1
  9. package/dist/actions/ActionEngine.d.ts +11 -0
  10. package/dist/actions/ActionEngine.js +274 -0
  11. package/dist/actions/ActionEngine.js.map +1 -0
  12. package/dist/actions/executors/index.d.ts +117 -0
  13. package/dist/actions/executors/index.js +242 -0
  14. package/dist/actions/executors/index.js.map +1 -0
  15. package/dist/actions/executors/tour.d.ts +18 -0
  16. package/dist/actions/executors/tour.js +332 -0
  17. package/dist/actions/executors/tour.js.map +1 -0
  18. package/dist/actions/index.d.ts +10 -0
  19. package/dist/actions/index.js +12 -0
  20. package/dist/actions/index.js.map +1 -0
  21. package/dist/actions/types.d.ts +399 -0
  22. package/dist/actions/types.js +8 -0
  23. package/dist/actions/types.js.map +1 -0
  24. package/dist/actions/validation.d.ts +14 -0
  25. package/dist/actions/validation.js +603 -0
  26. package/dist/actions/validation.js.map +1 -0
  27. package/dist/api.d.ts +32 -18
  28. package/dist/api.js +56 -39
  29. package/dist/api.js.map +1 -1
  30. package/dist/apps/AppContext.d.ts +31 -0
  31. package/dist/apps/AppContext.js +93 -0
  32. package/dist/apps/AppContext.js.map +1 -0
  33. package/dist/apps/AppLoader.d.ts +84 -0
  34. package/dist/apps/AppLoader.js +256 -0
  35. package/dist/apps/AppLoader.js.map +1 -0
  36. package/dist/apps/AppRegistry.d.ts +102 -0
  37. package/dist/apps/AppRegistry.js +317 -0
  38. package/dist/apps/AppRegistry.js.map +1 -0
  39. package/dist/apps/examples/gamification-app.example.d.ts +305 -0
  40. package/dist/apps/examples/gamification-app.example.js +329 -0
  41. package/dist/apps/examples/gamification-app.example.js.map +1 -0
  42. package/dist/apps/faq/index.js +11 -0
  43. package/dist/apps/faq/index.js.map +7 -0
  44. package/dist/apps/gamification/index.js +2 -0
  45. package/dist/apps/gamification/index.js.map +7 -0
  46. package/dist/apps/index.d.ts +15 -0
  47. package/dist/apps/index.js +17 -0
  48. package/dist/apps/index.js.map +1 -0
  49. package/dist/apps/nav/index.js +11 -0
  50. package/dist/apps/nav/index.js.map +7 -0
  51. package/dist/apps/types.d.ts +231 -0
  52. package/dist/apps/types.js +8 -0
  53. package/dist/apps/types.js.map +1 -0
  54. package/dist/bootstrap.d.ts +24 -0
  55. package/dist/bootstrap.js +133 -33
  56. package/dist/bootstrap.js.map +1 -1
  57. package/dist/components/ShadowCanvasOverlay.js +36 -9
  58. package/dist/components/ShadowCanvasOverlay.js.map +1 -1
  59. package/dist/components/TileCard.js +37 -18
  60. package/dist/components/TileCard.js.map +1 -1
  61. package/dist/context/schema.d.ts +16 -16
  62. package/dist/decisions/schema.d.ts +96 -96
  63. package/dist/earlyPatcher.d.ts +8 -20
  64. package/dist/earlyPatcher.js +13 -62
  65. package/dist/earlyPatcher.js.map +1 -1
  66. package/dist/editorLoader.d.ts +2 -0
  67. package/dist/editorLoader.js +52 -7
  68. package/dist/editorLoader.js.map +1 -1
  69. package/dist/events/normalizers/posthog.d.ts +24 -0
  70. package/dist/events/normalizers/posthog.js.map +1 -1
  71. package/dist/events/schema.d.ts +8 -8
  72. package/dist/events/types.d.ts +6 -0
  73. package/dist/events/types.js +8 -0
  74. package/dist/events/types.js.map +1 -1
  75. package/dist/hooks/useCanvasOverlays.d.ts +4 -1
  76. package/dist/hooks/useCanvasOverlays.js +53 -6
  77. package/dist/hooks/useCanvasOverlays.js.map +1 -1
  78. package/dist/hooks/useShadowCanvasConfig.d.ts +3 -7
  79. package/dist/hooks/useShadowCanvasConfig.js +2 -3
  80. package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
  81. package/dist/index.d.ts +5 -0
  82. package/dist/index.js +10 -0
  83. package/dist/index.js.map +1 -1
  84. package/dist/overlays/schema.d.ts +153 -153
  85. package/dist/runtime.d.ts +24 -0
  86. package/dist/runtime.js +75 -1
  87. package/dist/runtime.js.map +1 -1
  88. package/dist/smart-canvas.esm.js +155 -78
  89. package/dist/smart-canvas.esm.js.map +4 -4
  90. package/dist/smart-canvas.js +41155 -35362
  91. package/dist/smart-canvas.js.map +4 -4
  92. package/dist/smart-canvas.min.js +155 -78
  93. package/dist/smart-canvas.min.js.map +4 -4
  94. package/dist/store/example.d.ts +1 -0
  95. package/dist/store/example.js +43 -0
  96. package/dist/store/example.js.map +1 -0
  97. package/dist/store/mini-effector.d.ts +46 -0
  98. package/dist/store/mini-effector.js +90 -0
  99. package/dist/store/mini-effector.js.map +1 -0
  100. package/dist/surfaces/Surfaces.d.ts +11 -0
  101. package/dist/surfaces/Surfaces.js +361 -0
  102. package/dist/surfaces/Surfaces.js.map +1 -0
  103. package/dist/surfaces/index.d.ts +9 -0
  104. package/dist/surfaces/index.js +12 -0
  105. package/dist/surfaces/index.js.map +1 -0
  106. package/dist/surfaces/positioning.d.ts +50 -0
  107. package/dist/surfaces/positioning.js +231 -0
  108. package/dist/surfaces/positioning.js.map +1 -0
  109. package/dist/surfaces/types.d.ts +167 -0
  110. package/dist/surfaces/types.js +23 -0
  111. package/dist/surfaces/types.js.map +1 -0
  112. package/dist/telemetry/adapters/posthog.d.ts +6 -0
  113. package/dist/telemetry/adapters/posthog.js +9 -0
  114. package/dist/telemetry/adapters/posthog.js.map +1 -1
  115. package/dist/types-only.d.ts +32 -0
  116. package/dist/types-only.js +11 -0
  117. package/dist/types-only.js.map +1 -0
  118. package/dist/types.d.ts +26 -14
  119. package/dist/types.js +1 -1
  120. package/dist/types.js.map +1 -1
  121. package/dist/widgets/WidgetRegistry.d.ts +139 -0
  122. package/dist/widgets/WidgetRegistry.js +182 -0
  123. package/dist/widgets/WidgetRegistry.js.map +1 -0
  124. package/dist/widgets/index.d.ts +7 -0
  125. package/dist/widgets/index.js +7 -0
  126. package/dist/widgets/index.js.map +1 -0
  127. package/package.json +14 -7
  128. package/schema/canvas-config.schema.json +444 -254
@@ -3,8 +3,7 @@ import { useEffect, useMemo, useState } from "react";
3
3
  import { ShadowCanvasOverlay } from "./components/ShadowCanvasOverlay";
4
4
  import { useShadowCanvasConfig } from "./hooks/useShadowCanvasConfig";
5
5
  import { createCanvasConfigFetcher } from "./configFetcher";
6
- import { useCanvasOverlays } from "./hooks/useCanvasOverlays";
7
- import { useHostPatches } from "./hooks/useHostPatches";
6
+ import { RuntimeProvider, usePageContext } from "./RuntimeProvider";
8
7
  /**
9
8
  * Check if current route is allowed based on routes config
10
9
  */
@@ -33,15 +32,36 @@ function matchRoute(pattern, pathname) {
33
32
  }
34
33
  return pathname === pattern;
35
34
  }
36
- export function SmartCanvasApp({ controller, fetcher, configUri, configUriFeatureKey = "smart-canvas-config-uri", configFeatureKey = "smart-canvas-config", fetchCredentials = "include", pollIntervalMs, experiments, telemetry, overlayFetcher, overlayConfigUri, overlayConfigFeatureKey = "smart-canvas-overlay-uri", overlayFetchCredentials = "include", footerSlot, launcherLabel, canvasHost, customRenderers, theme, }) {
35
+ export function SmartCanvasApp({ controller, fetcher, configUri, configUriFeatureKey = "smart-canvas-config-uri", configFeatureKey = "smart-canvas-config", fetchCredentials = "include", pollIntervalMs, experiments, telemetry, runtime, overlayFetcher, overlayConfigUri, overlayConfigFeatureKey = "smart-canvas-overlay-uri", overlayFetchCredentials = "include", footerSlot, launcherLabel, canvasHost, customRenderers, theme, }) {
36
+ // Wrap the app with RuntimeProvider if runtime is available
37
+ if (runtime) {
38
+ return (_jsx(RuntimeProvider, { runtime: runtime, children: _jsx(SmartCanvasAppInner, { controller: controller, fetcher: fetcher, configUri: configUri, configUriFeatureKey: configUriFeatureKey, configFeatureKey: configFeatureKey, fetchCredentials: fetchCredentials, pollIntervalMs: pollIntervalMs, experiments: experiments, telemetry: telemetry, runtime: runtime, overlayFetcher: overlayFetcher, overlayConfigUri: overlayConfigUri, overlayConfigFeatureKey: overlayConfigFeatureKey, overlayFetchCredentials: overlayFetchCredentials, footerSlot: footerSlot, launcherLabel: launcherLabel, canvasHost: canvasHost, customRenderers: customRenderers, theme: theme }) }));
39
+ }
40
+ // No runtime - render directly (legacy mode)
41
+ return (_jsx(SmartCanvasAppInner, { controller: controller, fetcher: fetcher, configUri: configUri, configUriFeatureKey: configUriFeatureKey, configFeatureKey: configFeatureKey, fetchCredentials: fetchCredentials, pollIntervalMs: pollIntervalMs, experiments: experiments, telemetry: telemetry, overlayFetcher: overlayFetcher, overlayConfigUri: overlayConfigUri, overlayConfigFeatureKey: overlayConfigFeatureKey, overlayFetchCredentials: overlayFetchCredentials, footerSlot: footerSlot, launcherLabel: launcherLabel, canvasHost: canvasHost, customRenderers: customRenderers, theme: theme }));
42
+ }
43
+ /**
44
+ * Inner component that handles the actual rendering logic.
45
+ * Separated to allow RuntimeProvider to wrap it when runtime is available.
46
+ */
47
+ function SmartCanvasAppInner({ controller, fetcher, configUri, configUriFeatureKey = "smart-canvas-config-uri", configFeatureKey = "smart-canvas-config", fetchCredentials = "include", pollIntervalMs, experiments, telemetry, runtime, overlayFetcher, overlayConfigUri, overlayConfigFeatureKey = "smart-canvas-overlay-uri", overlayFetchCredentials = "include", footerSlot, launcherLabel, canvasHost, customRenderers, theme, }) {
37
48
  var _a, _b, _c;
38
49
  const [open, setOpen] = useState(controller.getState().open);
39
- const [pathname, setPathname] = useState(() => typeof window !== "undefined" ? window.location.pathname : "/");
40
- // Track route changes (for SPAs)
50
+ // Use runtime context for pathname if available, otherwise track locally
51
+ const pageContext = usePageContext();
52
+ const [localPathname, setLocalPathname] = useState(() => typeof window !== "undefined" ? window.location.pathname : "/");
53
+ // If runtime is available, use its context for pathname (it already handles SPA navigation)
54
+ // Otherwise, track pathname locally (legacy mode)
55
+ const pathname = (pageContext === null || pageContext === void 0 ? void 0 : pageContext.url)
56
+ ? new URL(pageContext.url).pathname
57
+ : localPathname;
58
+ // Track route changes locally only when runtime is not available (legacy mode)
41
59
  useEffect(() => {
60
+ if (runtime)
61
+ return; // Runtime handles this via ContextManager
42
62
  if (typeof window === "undefined")
43
63
  return;
44
- const updatePathname = () => setPathname(window.location.pathname);
64
+ const updatePathname = () => setLocalPathname(window.location.pathname);
45
65
  // Listen for popstate (back/forward navigation)
46
66
  window.addEventListener("popstate", updatePathname);
47
67
  // Intercept pushState/replaceState for SPA navigation
@@ -60,7 +80,7 @@ export function SmartCanvasApp({ controller, fetcher, configUri, configUriFeatur
60
80
  history.pushState = originalPushState;
61
81
  history.replaceState = originalReplaceState;
62
82
  };
63
- }, []);
83
+ }, [runtime]);
64
84
  const derivedFetcher = useMemo(() => {
65
85
  if (fetcher)
66
86
  return fetcher;
@@ -76,6 +96,7 @@ export function SmartCanvasApp({ controller, fetcher, configUri, configUriFeatur
76
96
  fetcher: derivedFetcher,
77
97
  pollIntervalMs,
78
98
  experiments,
99
+ runtime,
79
100
  });
80
101
  const hasContent = configState.tiles.length > 0 && !configState.error;
81
102
  useEffect(() => controller.subscribe((state) => setOpen(state.open)), [controller]);
@@ -84,38 +105,15 @@ export function SmartCanvasApp({ controller, fetcher, configUri, configUriFeatur
84
105
  controller.setOpen(false);
85
106
  }
86
107
  }, [controller, hasContent]);
87
- // Use inline overlay recipes from main config if present, otherwise use separate fetcher/URI
88
- const derivedOverlayRecipesFetcher = useMemo(() => {
89
- var _a;
90
- if (overlayFetcher)
91
- return overlayFetcher;
92
- // Support multiple recipes (new) or single recipe (legacy)
93
- if ((_a = configState.overlayRecipes) === null || _a === void 0 ? void 0 : _a.length) {
94
- return async () => configState.overlayRecipes;
95
- }
96
- if (configState.overlayRecipe) {
97
- return async () => configState.overlayRecipe;
98
- }
99
- // Don't create a fetcher if there's no URI and we're still loading config
100
- if (!overlayConfigUri && configState.isLoading) {
101
- return undefined;
108
+ // Apply actions when config loads
109
+ // Actions are processed by ActionEngine through the runtime
110
+ useEffect(() => {
111
+ if ((runtime === null || runtime === void 0 ? void 0 : runtime.actions) && configState.actions.length > 0) {
112
+ runtime.actions.applyBatch(configState.actions).catch((err) => {
113
+ console.error('[SmartCanvas] Failed to apply actions:', err);
114
+ });
102
115
  }
103
- return undefined;
104
- }, [overlayFetcher, configState.overlayRecipes, configState.overlayRecipe, configState.isLoading, overlayConfigUri]);
105
- useCanvasOverlays({
106
- recipesFetcher: derivedOverlayRecipesFetcher,
107
- configUri: !derivedOverlayRecipesFetcher && !configState.isLoading ? overlayConfigUri : undefined,
108
- featureKey: overlayConfigFeatureKey,
109
- credentials: overlayFetchCredentials,
110
- experiments,
111
- telemetry,
112
- canvasHost,
113
- });
114
- useHostPatches({
115
- patches: configState.patches,
116
- telemetry,
117
- canvasHost,
118
- });
116
+ }, [runtime, configState.actions]);
119
117
  // Merge theme from config (workspace settings) with any direct theme prop
120
118
  // Config theme takes precedence for workspace-set values, but theme prop can override
121
119
  // NOTE: This must be called BEFORE any early returns to maintain consistent hook order
@@ -1 +1 @@
1
- {"version":3,"file":"SmartCanvasApp.js","sourceRoot":"","sources":["../src/SmartCanvasApp.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAa,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAGvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAKxD;;GAEG;AACH,SAAS,cAAc,CAAC,MAAgC,EAAE,QAAgB;;IACxE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,gEAAgE;IAChE,IAAI,MAAA,MAAM,CAAC,OAAO,0CAAE,MAAM,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,6DAA6D;IAC7D,IAAI,MAAA,MAAM,CAAC,OAAO,0CAAE,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,OAAe,EAAE,QAAgB;IACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,QAAQ,KAAK,OAAO,CAAC;AAC9B,CAAC;AAuBD,MAAM,UAAU,cAAc,CAAC,EAC7B,UAAU,EACV,OAAO,EACP,SAAS,EACT,mBAAmB,GAAG,yBAAyB,EAC/C,gBAAgB,GAAG,qBAAqB,EACxC,gBAAgB,GAAG,SAAS,EAC5B,cAAc,EACd,WAAW,EACX,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,uBAAuB,GAAG,0BAA0B,EACpD,uBAAuB,GAAG,SAAS,EACnC,UAAU,EACV,aAAa,EACb,UAAU,EACV,eAAe,EACf,KAAK,GACe;;IACpB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAC5C,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAC/D,CAAC;IAEF,iCAAiC;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAE1C,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEnE,gDAAgD;QAChD,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAEpD,sDAAsD;QACtD,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;QAC5C,MAAM,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC;QAElD,OAAO,CAAC,SAAS,GAAG,UAAU,GAAG,IAAI;YACnC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACpC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;QAEF,OAAO,CAAC,YAAY,GAAG,UAAU,GAAG,IAAI;YACtC,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACvC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YACvD,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;YACtC,OAAO,CAAC,YAAY,GAAG,oBAAoB,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,OAAO,yBAAyB,CAAC;YAC/B,SAAS;YACT,WAAW;YACX,UAAU,EAAE,mBAAmB;YAC/B,gBAAgB;YAChB,WAAW,EAAE,gBAAgB;SAC9B,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE/F,MAAM,WAAW,GAAG,qBAAqB,CAAC;QACxC,OAAO,EAAE,cAAc;QACvB,cAAc;QACd,WAAW;KACZ,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEpF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YAC9C,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAE7B,6FAA6F;IAC7F,MAAM,4BAA4B,GAAG,OAAO,CAAC,GAAG,EAAE;;QAChD,IAAI,cAAc;YAAE,OAAO,cAAc,CAAC;QAC1C,2DAA2D;QAC3D,IAAI,MAAA,WAAW,CAAC,cAAc,0CAAE,MAAM,EAAE,CAAC;YACvC,OAAO,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,cAAe,CAAC;QACjD,CAAC;QACD,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;YAC9B,OAAO,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,aAAc,CAAC;QAChD,CAAC;QACD,0EAA0E;QAC1E,IAAI,CAAC,gBAAgB,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;YAC/C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAErH,iBAAiB,CAAC;QAChB,cAAc,EAAE,4BAA4B;QAC5C,SAAS,EAAE,CAAC,4BAA4B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;QACjG,UAAU,EAAE,uBAAuB;QACnC,WAAW,EAAE,uBAAuB;QACpC,WAAW;QACX,SAAS;QACT,UAAU;KACX,CAAC,CAAC;IAEH,cAAc,CAAC;QACb,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,SAAS;QACT,UAAU;KACX,CAAC,CAAC;IAEH,0EAA0E;IAC1E,sFAAsF;IACtF,uFAAuF;IACvF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC;QACtC,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QAE/B,mEAAmE;QACnE,OAAO;YACL,GAAG,WAAW,EAAG,mDAAmD;YACpE,GAAG,KAAK,EAAS,uCAAuC;SACzD,CAAC;IACJ,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAE/B,oCAAoC;IACpC,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAElE,6EAA6E;IAC7E,qEAAqE;IACrE,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,KAAC,mBAAmB,IAClB,KAAK,EAAE,WAAW,CAAC,KAAK,EACxB,SAAS,EAAE,WAAW,CAAC,SAAS,EAChC,KAAK,EAAE,WAAW,CAAC,KAAK,EACxB,WAAW,EAAE,WAAW,CAAC,WAAW,EACpC,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,MAAA,WAAW,CAAC,QAAQ,0CAAE,KAAK,EAC3D,eAAe,EAAE,MAAA,WAAW,CAAC,QAAQ,0CAAE,OAAO,EAC9C,sBAAsB,EAAE,MAAA,WAAW,CAAC,QAAQ,0CAAE,cAAc,EAC5D,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,EACnC,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,WAAW,CAAC,WAAW,EACpC,KAAK,EAAE,WAAW,GAClB,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"SmartCanvasApp.js","sourceRoot":"","sources":["../src/SmartCanvasApp.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * ActionEngine
3
+ *
4
+ * Unified execution layer for interventions. Provides a high-level API for
5
+ * applying, reverting, and managing action steps.
6
+ */
7
+ import type { ActionEngine, ActionEngineOptions } from "./types";
8
+ /**
9
+ * Create an ActionEngine instance.
10
+ */
11
+ export declare function createActionEngine(options: ActionEngineOptions): ActionEngine;
@@ -0,0 +1,274 @@
1
+ /**
2
+ * ActionEngine
3
+ *
4
+ * Unified execution layer for interventions. Provides a high-level API for
5
+ * applying, reverting, and managing action steps.
6
+ */
7
+ import { validateAction, validateActions } from "./validation";
8
+ import { executorRegistry as defaultExecutorRegistry } from "./executors";
9
+ /** Counter for generating unique action IDs */
10
+ let actionIdCounter = 0;
11
+ /**
12
+ * Create an ActionEngine instance.
13
+ */
14
+ export function createActionEngine(options) {
15
+ const { overlayRoot, eventBus, surfaces, anchorResolver, adaptiveId, executorRegistry = defaultExecutorRegistry, } = options;
16
+ /** Map of active actions by ID */
17
+ const activeActions = new Map();
18
+ /**
19
+ * Generate a unique action ID.
20
+ */
21
+ function generateId() {
22
+ return `action-${++actionIdCounter}`;
23
+ }
24
+ /**
25
+ * Publish an event to the EventBus if available.
26
+ */
27
+ function publishEvent(name, props) {
28
+ if (eventBus) {
29
+ eventBus.publish(name, props);
30
+ }
31
+ }
32
+ /**
33
+ * Create the executor context.
34
+ */
35
+ function createExecutorContext() {
36
+ return {
37
+ overlayRoot,
38
+ resolveAnchor: anchorResolver,
39
+ generateId,
40
+ publishEvent,
41
+ adaptiveId,
42
+ // Allow composite executors (like tours) to execute nested actions
43
+ applyAction: apply,
44
+ // Allow composite executors to subscribe to events
45
+ subscribeEvent: eventBus
46
+ ? (name, callback) => {
47
+ return eventBus.subscribe({ names: [name] }, (event) => callback(event.props));
48
+ }
49
+ : undefined,
50
+ };
51
+ }
52
+ /**
53
+ * Execute a mountWidget action via Surfaces.
54
+ */
55
+ async function executeMountWidget(action, context) {
56
+ if (!surfaces) {
57
+ throw new Error("Surfaces provider required for core:mountWidget actions");
58
+ }
59
+ const handle = surfaces.mount(action.slot, {
60
+ type: "widget",
61
+ widgetId: action.widget.widgetId,
62
+ config: action.widget.props,
63
+ }, {
64
+ priority: action.widget.priority,
65
+ });
66
+ context.publishEvent("action.applied", {
67
+ id: context.generateId(),
68
+ kind: "core:mountWidget",
69
+ slot: action.slot,
70
+ widgetId: action.widget.widgetId,
71
+ });
72
+ return {
73
+ cleanup: () => {
74
+ handle.unmount();
75
+ },
76
+ updateFn: (changes) => {
77
+ if ("widget" in changes && changes.widget) {
78
+ const w = changes.widget;
79
+ if (w.props) {
80
+ handle.update({
81
+ type: "widget",
82
+ widgetId: action.widget.widgetId,
83
+ config: w.props,
84
+ });
85
+ }
86
+ }
87
+ },
88
+ };
89
+ }
90
+ /**
91
+ * Apply a single action.
92
+ */
93
+ async function apply(action) {
94
+ const validation = validateAction(action);
95
+ if (!validation.valid) {
96
+ const errorMessages = validation.errors.map((e) => e.message).join("; ");
97
+ throw new Error(`Action validation failed: ${errorMessages}`);
98
+ }
99
+ const id = generateId();
100
+ const context = createExecutorContext();
101
+ let result;
102
+ // Special handling for mountWidget
103
+ if (action.kind === "core:mountWidget") {
104
+ result = await executeMountWidget(action, context);
105
+ }
106
+ else {
107
+ const executor = executorRegistry.get(action.kind);
108
+ if (!executor) {
109
+ throw new Error(`No executor for action kind: ${action.kind}`);
110
+ }
111
+ result = await executor(action, context);
112
+ }
113
+ // Track active action
114
+ const entry = {
115
+ id,
116
+ action,
117
+ adaptiveId,
118
+ appliedTs: Date.now(),
119
+ state: "applied",
120
+ cleanup: result.cleanup,
121
+ updateFn: result.updateFn,
122
+ };
123
+ activeActions.set(id, entry);
124
+ // Publish applied event
125
+ publishEvent("action.applied", {
126
+ id,
127
+ kind: action.kind,
128
+ anchorId: "anchorId" in action ? action.anchorId : undefined,
129
+ });
130
+ // Create and return handle
131
+ const handle = {
132
+ id,
133
+ action,
134
+ async revert() {
135
+ const entry = activeActions.get(id);
136
+ if (!entry || entry.state !== "applied")
137
+ return;
138
+ try {
139
+ await entry.cleanup();
140
+ entry.state = "reverted";
141
+ publishEvent("action.reverted", { id, kind: action.kind });
142
+ }
143
+ catch (error) {
144
+ entry.state = "failed";
145
+ publishEvent("action.failed", {
146
+ id,
147
+ kind: action.kind,
148
+ error: String(error),
149
+ });
150
+ throw error;
151
+ }
152
+ finally {
153
+ activeActions.delete(id);
154
+ }
155
+ },
156
+ isApplied() {
157
+ const entry = activeActions.get(id);
158
+ return (entry === null || entry === void 0 ? void 0 : entry.state) === "applied";
159
+ },
160
+ async update(changes) {
161
+ const entry = activeActions.get(id);
162
+ if (!entry || entry.state !== "applied") {
163
+ throw new Error("Cannot update action that is not applied");
164
+ }
165
+ if (entry.updateFn) {
166
+ await entry.updateFn(changes);
167
+ }
168
+ else {
169
+ throw new Error(`Action kind ${action.kind} does not support updates`);
170
+ }
171
+ },
172
+ getState() {
173
+ var _a;
174
+ const entry = activeActions.get(id);
175
+ return (_a = entry === null || entry === void 0 ? void 0 : entry.state) !== null && _a !== void 0 ? _a : "reverted";
176
+ },
177
+ };
178
+ return handle;
179
+ }
180
+ /**
181
+ * Apply multiple actions as a batch.
182
+ */
183
+ async function applyBatch(actions) {
184
+ const validation = validateActions(actions);
185
+ if (!validation.valid) {
186
+ const errorMessages = validation.errors.map((e) => e.message).join("; ");
187
+ throw new Error(`Batch validation failed: ${errorMessages}`);
188
+ }
189
+ const batchId = generateId();
190
+ const handles = [];
191
+ const appliedHandles = [];
192
+ try {
193
+ for (const action of actions) {
194
+ const handle = await apply(action);
195
+ handles.push(handle);
196
+ appliedHandles.push(handle);
197
+ }
198
+ }
199
+ catch (error) {
200
+ // Rollback on failure
201
+ for (const handle of appliedHandles) {
202
+ try {
203
+ await handle.revert();
204
+ }
205
+ catch {
206
+ // Ignore cleanup errors during rollback
207
+ }
208
+ }
209
+ throw error;
210
+ }
211
+ const batchHandle = {
212
+ id: batchId,
213
+ handles,
214
+ async revertAll() {
215
+ // Revert in reverse order
216
+ for (let i = handles.length - 1; i >= 0; i--) {
217
+ try {
218
+ await handles[i].revert();
219
+ }
220
+ catch (error) {
221
+ console.error(`[ActionEngine] Error reverting action ${handles[i].id}:`, error);
222
+ }
223
+ }
224
+ },
225
+ isApplied() {
226
+ return handles.every((h) => h.isApplied());
227
+ },
228
+ };
229
+ return batchHandle;
230
+ }
231
+ /**
232
+ * Validate an action without applying it.
233
+ */
234
+ function validate(action) {
235
+ return validateAction(action);
236
+ }
237
+ /**
238
+ * Get all currently active actions.
239
+ */
240
+ function getActive() {
241
+ return Array.from(activeActions.values()).map((entry) => ({
242
+ id: entry.id,
243
+ action: entry.action,
244
+ adaptiveId: entry.adaptiveId,
245
+ appliedTs: entry.appliedTs,
246
+ state: entry.state,
247
+ }));
248
+ }
249
+ /**
250
+ * Clean up all active actions.
251
+ */
252
+ function destroy() {
253
+ // Revert all active actions
254
+ for (const entry of activeActions.values()) {
255
+ if (entry.state === "applied") {
256
+ try {
257
+ entry.cleanup();
258
+ }
259
+ catch (error) {
260
+ console.error(`[ActionEngine] Error during cleanup:`, error);
261
+ }
262
+ }
263
+ }
264
+ activeActions.clear();
265
+ }
266
+ return {
267
+ apply,
268
+ applyBatch,
269
+ validate,
270
+ getActive,
271
+ destroy,
272
+ };
273
+ }
274
+ //# sourceMappingURL=ActionEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionEngine.js","sourceRoot":"","sources":["../../src/actions/ActionEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Action Executor Registry
3
+ *
4
+ * Extensible registry that maps action kinds to their executor functions.
5
+ * Apps can register custom executors at runtime.
6
+ *
7
+ * Core app executors are imported from their respective app packages.
8
+ */
9
+ import type { ActionStep, ActionKind, ActionExecutor, ValidationResult } from "../types";
10
+ import type { ZodSchema } from "zod";
11
+ /**
12
+ * Registration entry for an executor.
13
+ */
14
+ export interface ExecutorRegistration {
15
+ kind: string;
16
+ executor: ActionExecutor<any>;
17
+ schema?: ZodSchema;
18
+ source: string;
19
+ isBuiltIn: boolean;
20
+ }
21
+ /**
22
+ * Extensible registry for action executors.
23
+ *
24
+ * Core executors (setText, highlight, etc.) are registered synchronously
25
+ * at construction time for immediate availability - no async loading.
26
+ *
27
+ * External app executors are registered when apps activate.
28
+ */
29
+ export declare class ExecutorRegistry {
30
+ private executors;
31
+ /**
32
+ * Constructor - registers core executors synchronously.
33
+ * These are available IMMEDIATELY when the module loads,
34
+ * enabling instant action execution without waiting for app activation.
35
+ */
36
+ constructor();
37
+ /**
38
+ * Register a core executor (synchronous, built-in, cannot be overridden).
39
+ */
40
+ private registerCore;
41
+ /**
42
+ * Register an executor for an action kind.
43
+ *
44
+ * @param kind - The action kind (e.g., "gamification:awardBadge")
45
+ * @param executor - The executor function
46
+ * @param schema - Optional Zod schema for validation
47
+ * @param source - The source app ID (for tracking)
48
+ * @param isBuiltIn - Whether this is from a built-in app (prevents override)
49
+ */
50
+ register(kind: string, executor: ActionExecutor<any>, schema?: ZodSchema, source?: string, isBuiltIn?: boolean): void;
51
+ /**
52
+ * Unregister an executor.
53
+ *
54
+ * @param kind - The action kind to unregister
55
+ * @returns true if the executor was unregistered, false if not found or built-in
56
+ */
57
+ unregister(kind: string): boolean;
58
+ /**
59
+ * Unregister all executors from a specific source.
60
+ *
61
+ * @param source - The source app ID
62
+ */
63
+ unregisterBySource(source: string): void;
64
+ /**
65
+ * Get the executor for an action kind.
66
+ */
67
+ get(kind: string): ActionExecutor<ActionStep> | undefined;
68
+ /**
69
+ * Get the full registration for an action kind.
70
+ */
71
+ getRegistration(kind: string): ExecutorRegistration | undefined;
72
+ /**
73
+ * Check if an executor exists for a given action kind.
74
+ */
75
+ has(kind: string): boolean;
76
+ /**
77
+ * Validate an action using its registered schema.
78
+ *
79
+ * @param action - The action to validate
80
+ * @returns Validation result
81
+ */
82
+ validate(action: unknown): ValidationResult;
83
+ /**
84
+ * List all registered action kinds.
85
+ */
86
+ list(): string[];
87
+ /**
88
+ * List all registrations.
89
+ */
90
+ listRegistrations(): ExecutorRegistration[];
91
+ /**
92
+ * Get all built-in action kinds.
93
+ */
94
+ getBuiltInKinds(): string[];
95
+ /**
96
+ * Get all custom action kinds.
97
+ */
98
+ getCustomKinds(): string[];
99
+ }
100
+ /**
101
+ * Default singleton instance of ExecutorRegistry.
102
+ */
103
+ export declare const executorRegistry: ExecutorRegistry;
104
+ /**
105
+ * Get the executor for an action kind.
106
+ * @deprecated Use executorRegistry.get() instead
107
+ */
108
+ export declare function getExecutor(kind: ActionKind | string): ActionExecutor<ActionStep> | undefined;
109
+ /**
110
+ * Check if an executor exists for a given action kind.
111
+ * @deprecated Use executorRegistry.has() instead
112
+ */
113
+ export declare function hasExecutor(kind: ActionKind | string): boolean;
114
+ export { executeInsertHtml, executeSetText, executeSetAttr, executeAddClass, executeRemoveClass, executeSetStyle, } from "@syntrologie/app-content/runtime";
115
+ export { executeHighlight, executePulse, executeBadge, executeTooltip, executeModal, } from "@syntrologie/app-overlays/runtime";
116
+ export { executeScrollTo, executeNavigate, } from "@syntrologie/app-navigation/runtime";
117
+ export { executeTour } from "./tour";