@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
@@ -0,0 +1,272 @@
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 { executorRegistry as defaultExecutorRegistry } from './executors';
8
+ import { validateAction, validateActions } from './validation';
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) => eventBus.subscribe({ names: [name] }, (event) => callback(event.props))
47
+ : undefined,
48
+ };
49
+ }
50
+ /**
51
+ * Execute a mountWidget action via Surfaces.
52
+ */
53
+ async function executeMountWidget(action, context) {
54
+ if (!surfaces) {
55
+ throw new Error('Surfaces provider required for core:mountWidget actions');
56
+ }
57
+ const handle = surfaces.mount(action.slot, {
58
+ type: 'widget',
59
+ widgetId: action.widget.widgetId,
60
+ config: action.widget.props,
61
+ }, {
62
+ priority: action.widget.priority,
63
+ });
64
+ context.publishEvent('action.applied', {
65
+ id: context.generateId(),
66
+ kind: 'core:mountWidget',
67
+ slot: action.slot,
68
+ widgetId: action.widget.widgetId,
69
+ });
70
+ return {
71
+ cleanup: () => {
72
+ handle.unmount();
73
+ },
74
+ updateFn: (changes) => {
75
+ if ('widget' in changes && changes.widget) {
76
+ const w = changes.widget;
77
+ if (w.props) {
78
+ handle.update({
79
+ type: 'widget',
80
+ widgetId: action.widget.widgetId,
81
+ config: w.props,
82
+ });
83
+ }
84
+ }
85
+ },
86
+ };
87
+ }
88
+ /**
89
+ * Apply a single action.
90
+ */
91
+ async function apply(action) {
92
+ const validation = validateAction(action);
93
+ if (!validation.valid) {
94
+ const errorMessages = validation.errors.map((e) => e.message).join('; ');
95
+ throw new Error(`Action validation failed: ${errorMessages}`);
96
+ }
97
+ const id = generateId();
98
+ const context = createExecutorContext();
99
+ let result;
100
+ // Special handling for mountWidget
101
+ if (action.kind === 'core:mountWidget') {
102
+ result = await executeMountWidget(action, context);
103
+ }
104
+ else {
105
+ const executor = executorRegistry.get(action.kind);
106
+ if (!executor) {
107
+ throw new Error(`No executor for action kind: ${action.kind}`);
108
+ }
109
+ result = await executor(action, context);
110
+ }
111
+ // Track active action
112
+ const entry = {
113
+ id,
114
+ action,
115
+ adaptiveId,
116
+ appliedTs: Date.now(),
117
+ state: 'applied',
118
+ cleanup: result.cleanup,
119
+ updateFn: result.updateFn,
120
+ };
121
+ activeActions.set(id, entry);
122
+ // Publish applied event
123
+ publishEvent('action.applied', {
124
+ id,
125
+ kind: action.kind,
126
+ anchorId: 'anchorId' in action ? action.anchorId : undefined,
127
+ });
128
+ // Create and return handle
129
+ const handle = {
130
+ id,
131
+ action,
132
+ async revert() {
133
+ const entry = activeActions.get(id);
134
+ if (!entry || entry.state !== 'applied')
135
+ return;
136
+ try {
137
+ await entry.cleanup();
138
+ entry.state = 'reverted';
139
+ publishEvent('action.reverted', { id, kind: action.kind });
140
+ }
141
+ catch (error) {
142
+ entry.state = 'failed';
143
+ publishEvent('action.failed', {
144
+ id,
145
+ kind: action.kind,
146
+ error: String(error),
147
+ });
148
+ throw error;
149
+ }
150
+ finally {
151
+ activeActions.delete(id);
152
+ }
153
+ },
154
+ isApplied() {
155
+ const entry = activeActions.get(id);
156
+ return (entry === null || entry === void 0 ? void 0 : entry.state) === 'applied';
157
+ },
158
+ async update(changes) {
159
+ const entry = activeActions.get(id);
160
+ if (!entry || entry.state !== 'applied') {
161
+ throw new Error('Cannot update action that is not applied');
162
+ }
163
+ if (entry.updateFn) {
164
+ await entry.updateFn(changes);
165
+ }
166
+ else {
167
+ throw new Error(`Action kind ${action.kind} does not support updates`);
168
+ }
169
+ },
170
+ getState() {
171
+ var _a;
172
+ const entry = activeActions.get(id);
173
+ return (_a = entry === null || entry === void 0 ? void 0 : entry.state) !== null && _a !== void 0 ? _a : 'reverted';
174
+ },
175
+ };
176
+ return handle;
177
+ }
178
+ /**
179
+ * Apply multiple actions as a batch.
180
+ */
181
+ async function applyBatch(actions) {
182
+ const validation = validateActions(actions);
183
+ if (!validation.valid) {
184
+ const errorMessages = validation.errors.map((e) => e.message).join('; ');
185
+ throw new Error(`Batch validation failed: ${errorMessages}`);
186
+ }
187
+ const batchId = generateId();
188
+ const handles = [];
189
+ const appliedHandles = [];
190
+ try {
191
+ for (const action of actions) {
192
+ const handle = await apply(action);
193
+ handles.push(handle);
194
+ appliedHandles.push(handle);
195
+ }
196
+ }
197
+ catch (error) {
198
+ // Rollback on failure
199
+ for (const handle of appliedHandles) {
200
+ try {
201
+ await handle.revert();
202
+ }
203
+ catch {
204
+ // Ignore cleanup errors during rollback
205
+ }
206
+ }
207
+ throw error;
208
+ }
209
+ const batchHandle = {
210
+ id: batchId,
211
+ handles,
212
+ async revertAll() {
213
+ // Revert in reverse order
214
+ for (let i = handles.length - 1; i >= 0; i--) {
215
+ try {
216
+ await handles[i].revert();
217
+ }
218
+ catch (error) {
219
+ console.error(`[ActionEngine] Error reverting action ${handles[i].id}:`, error);
220
+ }
221
+ }
222
+ },
223
+ isApplied() {
224
+ return handles.every((h) => h.isApplied());
225
+ },
226
+ };
227
+ return batchHandle;
228
+ }
229
+ /**
230
+ * Validate an action without applying it.
231
+ */
232
+ function validate(action) {
233
+ return validateAction(action);
234
+ }
235
+ /**
236
+ * Get all currently active actions.
237
+ */
238
+ function getActive() {
239
+ return Array.from(activeActions.values()).map((entry) => ({
240
+ id: entry.id,
241
+ action: entry.action,
242
+ adaptiveId: entry.adaptiveId,
243
+ appliedTs: entry.appliedTs,
244
+ state: entry.state,
245
+ }));
246
+ }
247
+ /**
248
+ * Clean up all active actions.
249
+ */
250
+ function destroy() {
251
+ // Revert all active actions
252
+ for (const entry of activeActions.values()) {
253
+ if (entry.state === 'applied') {
254
+ try {
255
+ entry.cleanup();
256
+ }
257
+ catch (error) {
258
+ console.error(`[ActionEngine] Error during cleanup:`, error);
259
+ }
260
+ }
261
+ }
262
+ activeActions.clear();
263
+ }
264
+ return {
265
+ apply,
266
+ applyBatch,
267
+ validate,
268
+ getActive,
269
+ destroy,
270
+ };
271
+ }
272
+ //# 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,116 @@
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 { ZodSchema } from 'zod';
10
+ import type { ActionStep, ActionKind, ActionExecutor, ValidationResult } from '../types';
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/adapt-content/runtime';
115
+ export { executeHighlight, executePulse, executeBadge, executeTooltip, executeModal, } from '@syntrologie/adapt-overlays/runtime';
116
+ export { executeTour } from './tour';
@@ -0,0 +1,240 @@
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 executors from CORE app packages only (bundled with runtime)
10
+ // Lazy apps (gamification, faq, nav) are loaded dynamically from CDN
11
+ import { executors as contentExecutors } from '@syntrologie/adapt-content/runtime';
12
+ import { executors as overlayExecutors } from '@syntrologie/adapt-overlays/runtime';
13
+ import { executeTour } from './tour';
14
+ /**
15
+ * Extensible registry for action executors.
16
+ *
17
+ * Core executors (setText, highlight, etc.) are registered synchronously
18
+ * at construction time for immediate availability - no async loading.
19
+ *
20
+ * External app executors are registered when apps activate.
21
+ */
22
+ export class ExecutorRegistry {
23
+ /**
24
+ * Constructor - registers core executors synchronously.
25
+ * These are available IMMEDIATELY when the module loads,
26
+ * enabling instant action execution without waiting for app activation.
27
+ */
28
+ constructor() {
29
+ this.executors = new Map();
30
+ // Register all executors from core app packages
31
+ for (const { kind, executor } of contentExecutors) {
32
+ this.registerCore(kind, executor);
33
+ }
34
+ for (const { kind, executor } of overlayExecutors) {
35
+ this.registerCore(kind, executor);
36
+ }
37
+ // NOTE: Lazy apps (gamification, faq, nav) are NOT registered here.
38
+ // They are loaded dynamically from CDN via AppLoader when config requires them.
39
+ // core:mountWidget is handled specially in ActionEngine since it delegates to Surfaces
40
+ this.registerCore('core:mountWidget', async () => {
41
+ throw new Error('core:mountWidget must be handled by ActionEngine');
42
+ });
43
+ // Register core:tour executor
44
+ this.registerCore('core:tour', executeTour);
45
+ }
46
+ /**
47
+ * Register a core executor (synchronous, built-in, cannot be overridden).
48
+ */
49
+ registerCore(kind, executor, schema) {
50
+ this.executors.set(kind, {
51
+ kind,
52
+ executor,
53
+ schema,
54
+ source: 'core',
55
+ isBuiltIn: true,
56
+ });
57
+ }
58
+ /**
59
+ * Register an executor for an action kind.
60
+ *
61
+ * @param kind - The action kind (e.g., "gamification:awardBadge")
62
+ * @param executor - The executor function
63
+ * @param schema - Optional Zod schema for validation
64
+ * @param source - The source app ID (for tracking)
65
+ * @param isBuiltIn - Whether this is from a built-in app (prevents override)
66
+ */
67
+ register(kind, executor, schema, source = 'custom', isBuiltIn = false) {
68
+ if (this.executors.has(kind)) {
69
+ const existing = this.executors.get(kind);
70
+ if (existing.isBuiltIn) {
71
+ // Silently skip — app is re-registering an executor already bundled
72
+ // with the runtime. This happens when adaptive CDN bundles activate
73
+ // for apps whose executors are also compiled into the core bundle.
74
+ return;
75
+ }
76
+ console.warn(`[ExecutorRegistry] Overriding executor for kind: ${kind}`);
77
+ }
78
+ this.executors.set(kind, {
79
+ kind,
80
+ executor,
81
+ schema,
82
+ source,
83
+ isBuiltIn,
84
+ });
85
+ }
86
+ /**
87
+ * Unregister an executor.
88
+ *
89
+ * @param kind - The action kind to unregister
90
+ * @returns true if the executor was unregistered, false if not found or built-in
91
+ */
92
+ unregister(kind) {
93
+ const existing = this.executors.get(kind);
94
+ if (!existing) {
95
+ return false;
96
+ }
97
+ if (existing.isBuiltIn) {
98
+ console.warn(`[ExecutorRegistry] Cannot unregister built-in executor: ${kind}`);
99
+ return false;
100
+ }
101
+ this.executors.delete(kind);
102
+ return true;
103
+ }
104
+ /**
105
+ * Unregister all executors from a specific source.
106
+ *
107
+ * @param source - The source app ID
108
+ */
109
+ unregisterBySource(source) {
110
+ for (const [kind, registration] of this.executors.entries()) {
111
+ if (registration.source === source) {
112
+ this.executors.delete(kind);
113
+ }
114
+ }
115
+ }
116
+ /**
117
+ * Get the executor for an action kind.
118
+ */
119
+ get(kind) {
120
+ var _a;
121
+ return (_a = this.executors.get(kind)) === null || _a === void 0 ? void 0 : _a.executor;
122
+ }
123
+ /**
124
+ * Get the full registration for an action kind.
125
+ */
126
+ getRegistration(kind) {
127
+ return this.executors.get(kind);
128
+ }
129
+ /**
130
+ * Check if an executor exists for a given action kind.
131
+ */
132
+ has(kind) {
133
+ return this.executors.has(kind);
134
+ }
135
+ /**
136
+ * Validate an action using its registered schema.
137
+ *
138
+ * @param action - The action to validate
139
+ * @returns Validation result
140
+ */
141
+ validate(action) {
142
+ const errors = [];
143
+ if (!action || typeof action !== 'object') {
144
+ errors.push({
145
+ code: 'INVALID_ACTION',
146
+ message: 'Action must be an object',
147
+ });
148
+ return { valid: false, errors, warnings: [] };
149
+ }
150
+ const { kind } = action;
151
+ if (!kind || typeof kind !== 'string') {
152
+ errors.push({
153
+ code: 'MISSING_KIND',
154
+ message: "Action must have a 'kind' property",
155
+ });
156
+ return { valid: false, errors, warnings: [] };
157
+ }
158
+ const registration = this.executors.get(kind);
159
+ if (!registration) {
160
+ errors.push({
161
+ code: 'UNKNOWN_KIND',
162
+ message: `Unknown action kind: ${kind}`,
163
+ field: 'kind',
164
+ });
165
+ return { valid: false, errors, warnings: [] };
166
+ }
167
+ // If schema is provided, validate against it
168
+ if (registration.schema) {
169
+ const result = registration.schema.safeParse(action);
170
+ if (!result.success) {
171
+ for (const issue of result.error.issues) {
172
+ errors.push({
173
+ code: 'SCHEMA_VALIDATION_ERROR',
174
+ message: issue.message,
175
+ field: issue.path.join('.'),
176
+ });
177
+ }
178
+ return { valid: false, errors, warnings: [] };
179
+ }
180
+ }
181
+ return { valid: true, errors: [], warnings: [] };
182
+ }
183
+ /**
184
+ * List all registered action kinds.
185
+ */
186
+ list() {
187
+ return Array.from(this.executors.keys());
188
+ }
189
+ /**
190
+ * List all registrations.
191
+ */
192
+ listRegistrations() {
193
+ return Array.from(this.executors.values());
194
+ }
195
+ /**
196
+ * Get all built-in action kinds.
197
+ */
198
+ getBuiltInKinds() {
199
+ return Array.from(this.executors.entries())
200
+ .filter(([, reg]) => reg.isBuiltIn)
201
+ .map(([kind]) => kind);
202
+ }
203
+ /**
204
+ * Get all custom action kinds.
205
+ */
206
+ getCustomKinds() {
207
+ return Array.from(this.executors.entries())
208
+ .filter(([, reg]) => !reg.isBuiltIn)
209
+ .map(([kind]) => kind);
210
+ }
211
+ }
212
+ // ============================================================================
213
+ // Singleton and backwards-compatible exports
214
+ // ============================================================================
215
+ /**
216
+ * Default singleton instance of ExecutorRegistry.
217
+ */
218
+ export const executorRegistry = new ExecutorRegistry();
219
+ /**
220
+ * Get the executor for an action kind.
221
+ * @deprecated Use executorRegistry.get() instead
222
+ */
223
+ export function getExecutor(kind) {
224
+ return executorRegistry.get(kind);
225
+ }
226
+ /**
227
+ * Check if an executor exists for a given action kind.
228
+ * @deprecated Use executorRegistry.has() instead
229
+ */
230
+ export function hasExecutor(kind) {
231
+ return executorRegistry.has(kind);
232
+ }
233
+ // Re-export individual executors from app packages for backwards compatibility
234
+ export { executeInsertHtml, executeSetText, executeSetAttr, executeAddClass, executeRemoveClass, executeSetStyle, } from '@syntrologie/adapt-content/runtime';
235
+ export { executeHighlight, executePulse, executeBadge, executeTooltip, executeModal, } from '@syntrologie/adapt-overlays/runtime';
236
+ // NOTE: Lazy app executors (gamification, faq, nav) are NOT re-exported here.
237
+ // They are loaded dynamically from CDN via AppLoader when config requires them.
238
+ // Core executors
239
+ export { executeTour } from './tour';
240
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/executors/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Tour Executor
3
+ *
4
+ * Orchestrates sequential tour steps with cross-page state persistence.
5
+ * Tours can span multiple pages and resume after navigation.
6
+ *
7
+ * Each step contains an inner action (modal, tooltip) that gets executed.
8
+ * The tour listens for CTA click events to advance to the next step.
9
+ */
10
+ import type { TourAction, ActionExecutor } from '../types';
11
+ /**
12
+ * Execute a tour action
13
+ *
14
+ * Tours orchestrate a sequence of steps, persisting state to localStorage
15
+ * to support cross-page navigation. Each step contains an action to execute
16
+ * and optionally defines transitions based on action events.
17
+ */
18
+ export declare const executeTour: ActionExecutor<TourAction>;