@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,282 @@
1
+ /**
2
+ * App Loader
3
+ *
4
+ * Handles loading apps from CDN based on canvas config requirements.
5
+ *
6
+ * Loading Strategy:
7
+ * 1. Core apps (built-in actions) are bundled with runtime - no loading needed
8
+ * 2. External apps are loaded from CDN when config references them
9
+ *
10
+ * The loader determines which apps are needed by scanning the canvas config for:
11
+ * - Action kinds with namespaces (e.g., "gamification:awardBadge")
12
+ * - Widget IDs with namespaces (e.g., "gamification:leaderboard")
13
+ * - Explicit app references in config
14
+ */
15
+ // ============================================================================
16
+ // Core Apps (bundled with runtime)
17
+ // ============================================================================
18
+ /**
19
+ * Core action kinds that are bundled with the runtime.
20
+ * These don't require loading external apps.
21
+ */
22
+ const CORE_ACTION_KINDS = new Set([
23
+ // Overlay actions (bundled via @syntrologie/adapt-overlays)
24
+ 'overlays:highlight',
25
+ 'overlays:pulse',
26
+ 'overlays:badge',
27
+ 'overlays:tooltip',
28
+ 'overlays:modal',
29
+ // Content actions (bundled via @syntrologie/adapt-content)
30
+ 'content:insertHtml',
31
+ 'content:setText',
32
+ 'content:setAttr',
33
+ 'content:addClass',
34
+ 'content:removeClass',
35
+ 'content:setStyle',
36
+ // Core actions (bundled with runtime)
37
+ 'core:mountWidget',
38
+ 'core:wait',
39
+ 'core:sequence',
40
+ 'core:parallel',
41
+ 'core:tour',
42
+ ]);
43
+ /**
44
+ * Map action/widget namespace prefixes to CDN app IDs.
45
+ * Needed when the action kind prefix doesn't match the CDN bundle directory name.
46
+ * e.g., action "faq:update" has namespace "faq" but the CDN bundle is "adaptive-faq".
47
+ */
48
+ const NAMESPACE_TO_APP_ID = {
49
+ faq: 'adaptive-faq',
50
+ nav: 'adaptive-nav',
51
+ gamification: 'adaptive-gamification',
52
+ chatbot: 'adaptive-chatbot',
53
+ };
54
+ /**
55
+ * Resolve a namespace prefix to its CDN app ID.
56
+ */
57
+ function resolveAppId(namespace) {
58
+ var _a;
59
+ return (_a = NAMESPACE_TO_APP_ID[namespace]) !== null && _a !== void 0 ? _a : namespace;
60
+ }
61
+ /**
62
+ * Check if an action kind is a core action.
63
+ */
64
+ export function isCoreActionKind(kind) {
65
+ return CORE_ACTION_KINDS.has(kind);
66
+ }
67
+ /**
68
+ * Extract app ID from a namespaced action kind.
69
+ * e.g., "gamification:awardBadge" → "gamification"
70
+ * e.g., "navigation:scrollTo" → "nav" (via namespace mapping)
71
+ */
72
+ export function getAppIdFromActionKind(kind) {
73
+ if (isCoreActionKind(kind))
74
+ return null;
75
+ const colonIndex = kind.indexOf(':');
76
+ if (colonIndex === -1)
77
+ return null;
78
+ return resolveAppId(kind.slice(0, colonIndex));
79
+ }
80
+ /**
81
+ * Extract app ID from a namespaced widget ID.
82
+ * e.g., "gamification:leaderboard" → "gamification"
83
+ */
84
+ export function getAppIdFromWidgetId(widgetId) {
85
+ const colonIndex = widgetId.indexOf(':');
86
+ if (colonIndex === -1)
87
+ return null;
88
+ return resolveAppId(widgetId.slice(0, colonIndex));
89
+ }
90
+ // ============================================================================
91
+ // App Loader
92
+ // ============================================================================
93
+ /**
94
+ * Create an app loader instance.
95
+ */
96
+ export function createAppLoader(options) {
97
+ const { cdnBase, registry, timeout = 10000, onLoadStart, onLoadEnd } = options;
98
+ /** Cache of loading promises to avoid duplicate loads */
99
+ const loadingPromises = new Map();
100
+ /** Cache of loaded app URLs */
101
+ const loadedUrls = new Set();
102
+ /** Cache of failed CDN loads to avoid repeated attempts in the same session */
103
+ const failedApps = new Map();
104
+ /**
105
+ * Get the CDN URL for an app.
106
+ */
107
+ function getAppUrl(appId) {
108
+ // Convention: adaptives are at {cdnBase}/adaptives/{appId}/index.js
109
+ return `${cdnBase}/adaptives/${appId}/index.js`;
110
+ }
111
+ /**
112
+ * Load a single app from CDN.
113
+ */
114
+ async function loadApp(appId) {
115
+ var _a;
116
+ // Check if already registered (covers locally-injected bundles)
117
+ if (registry.has(appId)) {
118
+ return { appId, success: true, manifest: (_a = registry.get(appId)) === null || _a === void 0 ? void 0 : _a.manifest };
119
+ }
120
+ // Check if previously failed — don't retry CDN in the same session.
121
+ // If the app gets loaded by other means (e.g., local script tag),
122
+ // the registry.has() check above will catch it on the next call.
123
+ if (failedApps.has(appId)) {
124
+ return failedApps.get(appId);
125
+ }
126
+ // Check if already loading
127
+ if (loadingPromises.has(appId)) {
128
+ return loadingPromises.get(appId);
129
+ }
130
+ // Start loading
131
+ const loadPromise = (async () => {
132
+ onLoadStart === null || onLoadStart === void 0 ? void 0 : onLoadStart(appId);
133
+ try {
134
+ const url = getAppUrl(appId);
135
+ // Skip if already loaded this URL
136
+ if (loadedUrls.has(url)) {
137
+ const registration = registry.get(appId);
138
+ if (registration) {
139
+ onLoadEnd === null || onLoadEnd === void 0 ? void 0 : onLoadEnd(appId, true);
140
+ return { appId, success: true, manifest: registration.manifest };
141
+ }
142
+ }
143
+ // Create timeout promise
144
+ const timeoutPromise = new Promise((_, reject) => {
145
+ setTimeout(() => reject(new Error(`Timeout loading app: ${appId}`)), timeout);
146
+ });
147
+ // Fetch and execute the app bundle
148
+ const loadPromise = loadAppBundle(url, appId);
149
+ await Promise.race([loadPromise, timeoutPromise]);
150
+ loadedUrls.add(url);
151
+ // Get the registered manifest
152
+ const registration = registry.get(appId);
153
+ if (!registration) {
154
+ throw new Error(`App ${appId} did not register after loading`);
155
+ }
156
+ onLoadEnd === null || onLoadEnd === void 0 ? void 0 : onLoadEnd(appId, true);
157
+ return { appId, success: true, manifest: registration.manifest };
158
+ }
159
+ catch (error) {
160
+ const errorMessage = error instanceof Error ? error.message : String(error);
161
+ onLoadEnd === null || onLoadEnd === void 0 ? void 0 : onLoadEnd(appId, false, errorMessage);
162
+ const result = { appId, success: false, error: errorMessage };
163
+ failedApps.set(appId, result);
164
+ return result;
165
+ }
166
+ finally {
167
+ loadingPromises.delete(appId);
168
+ }
169
+ })();
170
+ loadingPromises.set(appId, loadPromise);
171
+ return loadPromise;
172
+ }
173
+ /**
174
+ * Load an app bundle from a URL.
175
+ */
176
+ async function loadAppBundle(url, appId) {
177
+ var _a;
178
+ // For browser environments, we use dynamic import or script loading
179
+ if (typeof window !== 'undefined') {
180
+ // Try dynamic import first (for ES modules)
181
+ try {
182
+ const module = await import(/* webpackIgnore: true */ url);
183
+ // The module should export a manifest and optionally auto-register
184
+ if (module.manifest) {
185
+ registry.register(module.manifest);
186
+ }
187
+ else if ((_a = module.default) === null || _a === void 0 ? void 0 : _a.manifest) {
188
+ registry.register(module.default.manifest);
189
+ }
190
+ else if (module.default) {
191
+ // If module.default is the manifest itself
192
+ registry.register(module.default);
193
+ }
194
+ return;
195
+ }
196
+ catch {
197
+ // Fall back to script tag loading for UMD bundles
198
+ }
199
+ // Script tag loading for UMD bundles
200
+ return new Promise((resolve, reject) => {
201
+ const script = document.createElement('script');
202
+ script.src = url;
203
+ script.async = true;
204
+ script.onload = () => {
205
+ // UMD bundles should register themselves via global
206
+ const registered = registry.get(appId);
207
+ if (registered) {
208
+ resolve();
209
+ }
210
+ else {
211
+ reject(new Error(`App ${appId} did not self-register`));
212
+ }
213
+ };
214
+ script.onerror = () => {
215
+ reject(new Error(`Failed to load app script: ${url}`));
216
+ };
217
+ document.head.appendChild(script);
218
+ });
219
+ }
220
+ // For SSR/Node environments, we can't dynamically load apps
221
+ throw new Error('Dynamic app loading not supported in SSR');
222
+ }
223
+ /**
224
+ * Analyze config to determine which apps need to be loaded.
225
+ */
226
+ function getRequiredApps(config) {
227
+ var _a;
228
+ const appIds = new Set();
229
+ // Check explicit app references
230
+ if (config.apps) {
231
+ for (const appId of config.apps) {
232
+ appIds.add(appId);
233
+ }
234
+ }
235
+ // Check action kinds for namespaced actions
236
+ if (config.actions) {
237
+ for (const action of config.actions) {
238
+ const appId = getAppIdFromActionKind(action.kind);
239
+ if (appId) {
240
+ appIds.add(appId);
241
+ }
242
+ // Also check core:mountWidget actions for widget namespaces
243
+ if (action.kind === 'core:mountWidget') {
244
+ const widgetId = (_a = action.widget) === null || _a === void 0 ? void 0 : _a.widgetId;
245
+ if (widgetId) {
246
+ const widgetAppId = getAppIdFromWidgetId(widgetId);
247
+ if (widgetAppId) {
248
+ appIds.add(widgetAppId);
249
+ }
250
+ }
251
+ }
252
+ }
253
+ }
254
+ return Array.from(appIds);
255
+ }
256
+ /**
257
+ * Load all apps required by a config.
258
+ */
259
+ async function loadAppsForConfig(config) {
260
+ const requiredApps = getRequiredApps(config);
261
+ if (requiredApps.length === 0) {
262
+ return [];
263
+ }
264
+ // Load all apps in parallel
265
+ const results = await Promise.all(requiredApps.map((appId) => loadApp(appId)));
266
+ return results;
267
+ }
268
+ /**
269
+ * Preload apps without activating them.
270
+ */
271
+ async function preloadApps(appIds) {
272
+ return Promise.all(appIds.map((appId) => loadApp(appId)));
273
+ }
274
+ return {
275
+ loadApp,
276
+ loadAppsForConfig,
277
+ preloadApps,
278
+ getRequiredApps,
279
+ getAppUrl,
280
+ };
281
+ }
282
+ //# sourceMappingURL=AppLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppLoader.js","sourceRoot":"","sources":["../../src/apps/AppLoader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * App Registry
3
+ *
4
+ * Central registry for managing SynOS apps.
5
+ * Handles app registration, activation, deactivation, and lifecycle management.
6
+ */
7
+ import type { SmartCanvasRuntime } from '../runtime';
8
+ import type { AppManifest, AppRegistration, AppRegistryEvent } from './types';
9
+ /**
10
+ * Callback for app registry events.
11
+ */
12
+ export type AppRegistryEventCallback = (event: AppRegistryEvent) => void;
13
+ /**
14
+ * App registry for managing SynOS apps.
15
+ */
16
+ export declare class AppRegistry {
17
+ private apps;
18
+ private eventListeners;
19
+ private runtime;
20
+ /**
21
+ * Bind the registry to a runtime instance.
22
+ * Must be called before apps can be activated.
23
+ */
24
+ bind(runtime: SmartCanvasRuntime): void;
25
+ /**
26
+ * Unbind from the current runtime.
27
+ * Deactivates all active apps first.
28
+ */
29
+ unbind(): Promise<void>;
30
+ /**
31
+ * Register an app.
32
+ *
33
+ * Registration makes the app available but does not activate it.
34
+ * Call activate() to start the app's runtime extensions.
35
+ */
36
+ register(manifest: AppManifest): AppRegistration;
37
+ /**
38
+ * Activate an app.
39
+ *
40
+ * Activating an app:
41
+ * 1. Creates an AppContext for sandboxed runtime access
42
+ * 2. Registers the app's actions with ExecutorRegistry
43
+ * 3. Registers the app's widgets with WidgetRegistry
44
+ * 4. Sets up the app's event handlers
45
+ */
46
+ activate(appId: string): Promise<void>;
47
+ /**
48
+ * Deactivate an app.
49
+ *
50
+ * Deactivating an app:
51
+ * 1. Runs the cleanup function
52
+ * 2. Unregisters all actions and widgets
53
+ * 3. Removes event handlers
54
+ */
55
+ deactivate(appId: string): Promise<void>;
56
+ /**
57
+ * Unregister an app.
58
+ *
59
+ * The app must be inactive before it can be unregistered.
60
+ */
61
+ unregister(appId: string): Promise<void>;
62
+ /**
63
+ * Get an app registration.
64
+ */
65
+ get(appId: string): AppRegistration | undefined;
66
+ /**
67
+ * Check if an app is registered.
68
+ */
69
+ has(appId: string): boolean;
70
+ /**
71
+ * Check if an app is active.
72
+ */
73
+ isActive(appId: string): boolean;
74
+ /**
75
+ * List all registered apps.
76
+ */
77
+ list(): AppRegistration[];
78
+ /**
79
+ * List all active apps.
80
+ */
81
+ listActive(): AppRegistration[];
82
+ /**
83
+ * List all apps with editor modules.
84
+ */
85
+ listEditable(): AppRegistration[];
86
+ /**
87
+ * Subscribe to registry events.
88
+ */
89
+ subscribe(callback: AppRegistryEventCallback): () => void;
90
+ /**
91
+ * Emit an event to all listeners.
92
+ */
93
+ private emit;
94
+ /**
95
+ * Clean up all apps.
96
+ */
97
+ destroy(): Promise<void>;
98
+ }
99
+ /**
100
+ * Default singleton instance of AppRegistry.
101
+ */
102
+ export declare const appRegistry: AppRegistry;