@dxos/app-framework 0.8.4-main.406dc2a → 0.8.4-main.422d1c7879

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 (552) hide show
  1. package/.storybook/main.mts +2 -4
  2. package/.storybook/preview.mts +2 -2
  3. package/dist/lib/browser/capability-DOMNPRJP.mjs +35 -0
  4. package/dist/lib/browser/capability-DOMNPRJP.mjs.map +7 -0
  5. package/dist/lib/browser/capability-KSNT34SN.mjs +38 -0
  6. package/dist/lib/browser/capability-KSNT34SN.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2CKCJ6PN.mjs +79 -0
  8. package/dist/lib/browser/chunk-2CKCJ6PN.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-7B6AJK4D.mjs +964 -0
  10. package/dist/lib/browser/chunk-7B6AJK4D.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-BMIAYUWT.mjs +397 -0
  12. package/dist/lib/browser/chunk-BMIAYUWT.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-F7FW2RK2.mjs +167 -0
  14. package/dist/lib/browser/chunk-F7FW2RK2.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-GDWTW4ZW.mjs +148 -0
  16. package/dist/lib/browser/chunk-GDWTW4ZW.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-I34GF4NG.mjs +34 -0
  18. package/dist/lib/browser/chunk-I34GF4NG.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  20. package/dist/lib/browser/chunk-JKWMHZP6.mjs +80 -0
  21. package/dist/lib/browser/chunk-JKWMHZP6.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-QRTB4Q3U.mjs +594 -0
  23. package/dist/lib/browser/chunk-QRTB4Q3U.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-QSXYHXCE.mjs +48 -0
  25. package/dist/lib/browser/chunk-QSXYHXCE.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-RFSO3JRG.mjs +1 -0
  27. package/dist/lib/browser/chunk-T3Y4AEKX.mjs +42 -0
  28. package/dist/lib/browser/chunk-T3Y4AEKX.mjs.map +7 -0
  29. package/dist/lib/browser/chunk-TGX63LTL.mjs +8 -0
  30. package/dist/lib/browser/chunk-TGX63LTL.mjs.map +7 -0
  31. package/dist/lib/browser/chunk-Y543KCO7.mjs +174 -0
  32. package/dist/lib/browser/chunk-Y543KCO7.mjs.map +7 -0
  33. package/dist/lib/browser/cli/index.mjs +90 -0
  34. package/dist/lib/browser/cli/index.mjs.map +7 -0
  35. package/dist/lib/browser/common/activation-events.mjs +24 -0
  36. package/dist/lib/browser/common/capabilities.mjs +46 -0
  37. package/dist/lib/browser/core/activation-event.mjs +20 -0
  38. package/dist/lib/browser/core/activation-event.mjs.map +7 -0
  39. package/dist/lib/browser/core/capability.mjs +30 -0
  40. package/dist/lib/browser/core/capability.mjs.map +7 -0
  41. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  42. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  43. package/dist/lib/browser/core/plugin.mjs +29 -0
  44. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  45. package/dist/lib/browser/core/url-loader.mjs +16 -0
  46. package/dist/lib/browser/core/url-loader.mjs.map +7 -0
  47. package/dist/lib/browser/index.mjs +91 -148
  48. package/dist/lib/browser/index.mjs.map +4 -4
  49. package/dist/lib/browser/invoker-capability-VCMPQOIA.mjs +43 -0
  50. package/dist/lib/browser/invoker-capability-VCMPQOIA.mjs.map +7 -0
  51. package/dist/lib/browser/meta.json +1 -1
  52. package/dist/lib/browser/testing/index.mjs +243 -41
  53. package/dist/lib/browser/testing/index.mjs.map +4 -4
  54. package/dist/lib/browser/testing/react.mjs +78 -0
  55. package/dist/lib/browser/testing/react.mjs.map +7 -0
  56. package/dist/lib/browser/ui/index.mjs +46 -0
  57. package/dist/lib/browser/ui/index.mjs.map +7 -0
  58. package/dist/lib/node-esm/capability-EOQTORML.mjs +39 -0
  59. package/dist/lib/node-esm/capability-EOQTORML.mjs.map +7 -0
  60. package/dist/lib/node-esm/capability-KJTQIWDK.mjs +36 -0
  61. package/dist/lib/node-esm/capability-KJTQIWDK.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-42KBWDE4.mjs +80 -0
  63. package/dist/lib/node-esm/chunk-42KBWDE4.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-7PJ5OKRB.mjs +965 -0
  65. package/dist/lib/node-esm/chunk-7PJ5OKRB.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-DXVXOGJ7.mjs +175 -0
  67. package/dist/lib/node-esm/chunk-DXVXOGJ7.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-EL3R25OQ.mjs +2 -0
  69. package/dist/lib/node-esm/chunk-EL3R25OQ.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs +10 -0
  71. package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-G3RTFSNG.mjs +81 -0
  73. package/dist/lib/node-esm/chunk-G3RTFSNG.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-HI3YBICQ.mjs +149 -0
  75. package/dist/lib/node-esm/chunk-HI3YBICQ.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  77. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-JPWVIQ5I.mjs +595 -0
  79. package/dist/lib/node-esm/chunk-JPWVIQ5I.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-URWHJQT2.mjs +168 -0
  81. package/dist/lib/node-esm/chunk-URWHJQT2.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-VKHGNEDB.mjs +43 -0
  83. package/dist/lib/node-esm/chunk-VKHGNEDB.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-WZ6DHQER.mjs +398 -0
  85. package/dist/lib/node-esm/chunk-WZ6DHQER.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs +35 -0
  87. package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs.map +7 -0
  88. package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs +49 -0
  89. package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs.map +7 -0
  90. package/dist/lib/node-esm/cli/index.mjs +91 -0
  91. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  92. package/dist/lib/node-esm/common/activation-events.mjs +25 -0
  93. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  94. package/dist/lib/node-esm/common/capabilities.mjs +47 -0
  95. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  96. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  97. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  98. package/dist/lib/node-esm/core/capability.mjs +31 -0
  99. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  100. package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
  101. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  102. package/dist/lib/node-esm/core/plugin.mjs +30 -0
  103. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  104. package/dist/lib/node-esm/core/url-loader.mjs +17 -0
  105. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  106. package/dist/lib/node-esm/index.mjs +91 -148
  107. package/dist/lib/node-esm/index.mjs.map +4 -4
  108. package/dist/lib/node-esm/invoker-capability-EGA3XW6J.mjs +44 -0
  109. package/dist/lib/node-esm/invoker-capability-EGA3XW6J.mjs.map +7 -0
  110. package/dist/lib/node-esm/meta.json +1 -1
  111. package/dist/lib/node-esm/testing/index.mjs +243 -41
  112. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  113. package/dist/lib/node-esm/testing/react.mjs +79 -0
  114. package/dist/lib/node-esm/testing/react.mjs.map +7 -0
  115. package/dist/lib/node-esm/ui/index.mjs +47 -0
  116. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  117. package/dist/plugin/node-esm/index.mjs +794 -0
  118. package/dist/plugin/node-esm/index.mjs.map +7 -0
  119. package/dist/plugin/node-esm/meta.json +1 -0
  120. package/dist/types/src/cli/cli.d.ts +39 -0
  121. package/dist/types/src/cli/cli.d.ts.map +1 -0
  122. package/dist/types/src/cli/index.d.ts +2 -0
  123. package/dist/types/src/cli/index.d.ts.map +1 -0
  124. package/dist/types/src/common/activation-events.d.ts +27 -0
  125. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  126. package/dist/types/src/common/capabilities.d.ts +109 -200
  127. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  128. package/dist/types/src/common/index.d.ts +4 -8
  129. package/dist/types/src/common/index.d.ts.map +1 -1
  130. package/dist/types/src/common/operations.d.ts +19 -0
  131. package/dist/types/src/common/operations.d.ts.map +1 -0
  132. package/dist/types/src/common/translations.d.ts +7 -7
  133. package/dist/types/src/common/translations.d.ts.map +1 -1
  134. package/dist/types/src/context.d.ts +5 -0
  135. package/dist/types/src/context.d.ts.map +1 -0
  136. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +7 -7
  137. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  138. package/dist/types/src/core/capability-manager.d.ts +48 -0
  139. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  140. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  141. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  142. package/dist/types/src/core/capability.d.ts +156 -0
  143. package/dist/types/src/core/capability.d.ts.map +1 -0
  144. package/dist/types/src/core/index.d.ts +6 -4
  145. package/dist/types/src/core/index.d.ts.map +1 -1
  146. package/dist/types/src/core/plugin-manager.d.ts +78 -0
  147. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  148. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  149. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  150. package/dist/types/src/core/plugin.d.ts +127 -39
  151. package/dist/types/src/core/plugin.d.ts.map +1 -1
  152. package/dist/types/src/core/url-loader.d.ts +42 -0
  153. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  154. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  155. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  156. package/dist/types/src/index.d.ts +3 -4
  157. package/dist/types/src/index.d.ts.map +1 -1
  158. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  159. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  160. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  161. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  162. package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
  163. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  164. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  165. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  166. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  167. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  168. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  169. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  170. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  171. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  172. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
  173. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  174. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  175. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  176. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  177. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  178. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  179. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  180. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  181. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  182. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  183. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  184. package/dist/types/src/plugin-operation/testing.d.ts +58 -0
  185. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  186. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  187. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  188. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  189. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  190. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  191. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  192. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  193. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  194. package/dist/types/src/testing/harness.d.ts +67 -0
  195. package/dist/types/src/testing/harness.d.ts.map +1 -0
  196. package/dist/types/src/testing/index.d.ts +2 -0
  197. package/dist/types/src/testing/index.d.ts.map +1 -1
  198. package/dist/types/src/testing/react.d.ts +27 -0
  199. package/dist/types/src/testing/react.d.ts.map +1 -0
  200. package/dist/types/src/testing/react.test.d.ts +2 -0
  201. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  202. package/dist/types/src/testing/service.d.ts +8 -0
  203. package/dist/types/src/testing/service.d.ts.map +1 -0
  204. package/dist/types/src/testing/withPluginManager.d.ts +7 -6
  205. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  206. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  207. package/dist/types/src/ui/components/App/App.d.ts +9 -0
  208. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  209. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  210. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  211. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  212. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  213. package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +5 -3
  214. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  215. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  216. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  217. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  218. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  219. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  220. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  221. package/dist/types/src/{components/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  222. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  223. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  224. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  225. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  226. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  227. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  228. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  229. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  230. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  231. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  232. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  233. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  234. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  235. package/dist/types/src/ui/components/index.d.ts +4 -0
  236. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  237. package/dist/types/src/ui/hooks/index.d.ts +6 -0
  238. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  239. package/dist/types/src/ui/hooks/useApp.d.ts +62 -0
  240. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  241. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  242. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  243. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  244. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  245. package/dist/types/src/{components → ui/hooks}/useLoading.d.ts +1 -2
  246. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  247. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  248. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  249. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  250. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  251. package/dist/types/src/ui/index.d.ts +3 -0
  252. package/dist/types/src/ui/index.d.ts.map +1 -0
  253. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +50 -0
  254. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
  255. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +51 -0
  256. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  257. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  258. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  259. package/dist/types/src/vite-plugin/import-map/index.d.ts +16 -0
  260. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  261. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  262. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  263. package/dist/types/src/vite-plugin/manifest.d.ts +16 -0
  264. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  265. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  266. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  267. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  268. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  269. package/dist/types/tsconfig.tsbuildinfo +1 -1
  270. package/moon.yml +25 -6
  271. package/package.json +110 -55
  272. package/src/cli/cli.ts +107 -0
  273. package/src/{components → cli}/index.ts +1 -1
  274. package/src/common/activation-events.ts +44 -0
  275. package/src/common/capabilities.ts +168 -213
  276. package/src/common/index.ts +4 -8
  277. package/src/common/operations.ts +35 -0
  278. package/src/common/translations.ts +17 -9
  279. package/src/context.ts +9 -0
  280. package/src/core/{events.ts → activation-event.ts} +10 -7
  281. package/src/core/capability-manager.test.ts +151 -0
  282. package/src/core/capability-manager.ts +192 -0
  283. package/src/core/capability.ts +247 -0
  284. package/src/core/index.ts +6 -4
  285. package/src/core/plugin-manager.test.ts +1142 -0
  286. package/src/core/plugin-manager.ts +893 -0
  287. package/src/core/plugin.ts +263 -46
  288. package/src/core/url-loader.test.ts +112 -0
  289. package/src/core/url-loader.ts +178 -0
  290. package/src/index.ts +3 -4
  291. package/src/plugin-operation/OperationPlugin.ts +24 -0
  292. package/src/plugin-operation/history/capability.ts +36 -0
  293. package/src/plugin-operation/history/errors.ts +7 -0
  294. package/src/plugin-operation/history/history-tracker.test.ts +373 -0
  295. package/src/plugin-operation/history/history-tracker.ts +128 -0
  296. package/src/plugin-operation/history/index.ts +9 -0
  297. package/src/plugin-operation/history/types.ts +17 -0
  298. package/src/plugin-operation/history/undo-mapping.ts +135 -0
  299. package/src/plugin-operation/history/undo-registry.test.ts +72 -0
  300. package/src/plugin-operation/history/undo-registry.ts +54 -0
  301. package/src/plugin-operation/index.ts +6 -0
  302. package/src/plugin-operation/invoker-capability.ts +54 -0
  303. package/src/plugin-operation/meta.ts +11 -0
  304. package/src/plugin-operation/testing.ts +154 -0
  305. package/src/plugin-runtime/RuntimePlugin.ts +19 -0
  306. package/src/plugin-runtime/capability.ts +53 -0
  307. package/src/{playground/logger → plugin-runtime}/index.ts +1 -1
  308. package/src/plugin-runtime/meta.ts +11 -0
  309. package/src/testing/harness.ts +229 -0
  310. package/src/testing/index.ts +2 -0
  311. package/src/testing/react.test.tsx +48 -0
  312. package/src/testing/react.tsx +113 -0
  313. package/src/testing/service.ts +52 -0
  314. package/src/testing/withPluginManager.stories.tsx +7 -8
  315. package/src/testing/withPluginManager.tsx +68 -40
  316. package/src/ui/components/App/App.stories.tsx +92 -0
  317. package/src/ui/components/App/App.tsx +70 -0
  318. package/src/{playground/debug → ui/components/App}/index.ts +1 -1
  319. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +183 -0
  320. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  321. package/src/ui/components/PluginManager/index.ts +5 -0
  322. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  323. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  324. package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
  325. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  326. package/src/ui/components/Surface/context.ts +12 -0
  327. package/src/ui/components/Surface/index.ts +54 -0
  328. package/src/ui/components/Surface/types.test.ts +126 -0
  329. package/src/ui/components/Surface/types.ts +269 -0
  330. package/src/ui/components/index.ts +7 -0
  331. package/src/ui/hooks/index.ts +9 -0
  332. package/src/ui/hooks/useApp.test.tsx +159 -0
  333. package/src/ui/hooks/useApp.tsx +289 -0
  334. package/src/ui/hooks/useCapabilities.ts +67 -0
  335. package/src/{components → ui/hooks}/useLoading.tsx +4 -6
  336. package/src/ui/hooks/useSettingsState.ts +26 -0
  337. package/src/ui/hooks/useSurface.ts +13 -0
  338. package/src/ui/index.ts +6 -0
  339. package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +162 -0
  340. package/src/vite-plugin/boot-loader/boot-loader.css +117 -0
  341. package/src/vite-plugin/boot-loader/boot-loader.js +55 -0
  342. package/src/vite-plugin/boot-loader/index.ts +99 -0
  343. package/src/vite-plugin/composer/index.ts +284 -0
  344. package/src/vite-plugin/import-map/index.ts +490 -0
  345. package/src/vite-plugin/index.ts +10 -0
  346. package/src/vite-plugin/manifest.test.ts +23 -0
  347. package/src/vite-plugin/manifest.ts +20 -0
  348. package/src/vite-plugin/packages.ts +181 -0
  349. package/tsconfig.json +13 -19
  350. package/tsconfig.node.json +2 -4
  351. package/typedoc.json +2 -4
  352. package/vitest.config.ts +1 -1
  353. package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
  354. package/dist/lib/browser/app-graph-builder-LG4RG2LM.mjs +0 -138
  355. package/dist/lib/browser/app-graph-builder-LG4RG2LM.mjs.map +0 -7
  356. package/dist/lib/browser/chunk-2GRQ4QXA.mjs +0 -1646
  357. package/dist/lib/browser/chunk-2GRQ4QXA.mjs.map +0 -7
  358. package/dist/lib/browser/chunk-FRUTKCPG.mjs +0 -467
  359. package/dist/lib/browser/chunk-FRUTKCPG.mjs.map +0 -7
  360. package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
  361. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
  362. package/dist/lib/browser/intent-dispatcher-6SHA5B3N.mjs +0 -11
  363. package/dist/lib/browser/intent-resolver-UZZ4OANZ.mjs +0 -39
  364. package/dist/lib/browser/intent-resolver-UZZ4OANZ.mjs.map +0 -7
  365. package/dist/lib/browser/store-ACBEYK4B.mjs +0 -30
  366. package/dist/lib/browser/store-ACBEYK4B.mjs.map +0 -7
  367. package/dist/lib/browser/worker.mjs +0 -77
  368. package/dist/lib/node-esm/app-graph-builder-FMHVHPWA.mjs +0 -139
  369. package/dist/lib/node-esm/app-graph-builder-FMHVHPWA.mjs.map +0 -7
  370. package/dist/lib/node-esm/chunk-CXT6CYPE.mjs +0 -468
  371. package/dist/lib/node-esm/chunk-CXT6CYPE.mjs.map +0 -7
  372. package/dist/lib/node-esm/chunk-KSPOOYT3.mjs +0 -1648
  373. package/dist/lib/node-esm/chunk-KSPOOYT3.mjs.map +0 -7
  374. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
  375. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
  376. package/dist/lib/node-esm/intent-dispatcher-SIYQ5ZIU.mjs +0 -12
  377. package/dist/lib/node-esm/intent-resolver-7FYJMXAG.mjs +0 -40
  378. package/dist/lib/node-esm/intent-resolver-7FYJMXAG.mjs.map +0 -7
  379. package/dist/lib/node-esm/store-6OBLTVXC.mjs +0 -31
  380. package/dist/lib/node-esm/store-6OBLTVXC.mjs.map +0 -7
  381. package/dist/lib/node-esm/worker.mjs +0 -78
  382. package/dist/types/src/common/collaboration.d.ts +0 -20
  383. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  384. package/dist/types/src/common/events.d.ts +0 -52
  385. package/dist/types/src/common/events.d.ts.map +0 -1
  386. package/dist/types/src/common/file.d.ts +0 -14
  387. package/dist/types/src/common/file.d.ts.map +0 -1
  388. package/dist/types/src/common/graph.d.ts +0 -21
  389. package/dist/types/src/common/graph.d.ts.map +0 -1
  390. package/dist/types/src/common/layout.d.ts +0 -279
  391. package/dist/types/src/common/layout.d.ts.map +0 -1
  392. package/dist/types/src/common/surface.d.ts +0 -59
  393. package/dist/types/src/common/surface.d.ts.map +0 -1
  394. package/dist/types/src/components/App.d.ts +0 -10
  395. package/dist/types/src/components/App.d.ts.map +0 -1
  396. package/dist/types/src/components/App.stories.d.ts.map +0 -1
  397. package/dist/types/src/components/DefaultFallback.d.ts +0 -8
  398. package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
  399. package/dist/types/src/components/index.d.ts +0 -2
  400. package/dist/types/src/components/index.d.ts.map +0 -1
  401. package/dist/types/src/components/useApp.d.ts +0 -44
  402. package/dist/types/src/components/useApp.d.ts.map +0 -1
  403. package/dist/types/src/components/useLoading.d.ts.map +0 -1
  404. package/dist/types/src/core/capabilities.d.ts +0 -117
  405. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  406. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  407. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  408. package/dist/types/src/core/events.d.ts.map +0 -1
  409. package/dist/types/src/core/manager.d.ts +0 -126
  410. package/dist/types/src/core/manager.d.ts.map +0 -1
  411. package/dist/types/src/core/manager.test.d.ts +0 -2
  412. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  413. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  414. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  415. package/dist/types/src/playground/debug/index.d.ts +0 -2
  416. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  417. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  418. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  419. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  420. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  421. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  422. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  423. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  424. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  425. package/dist/types/src/playground/generator/index.d.ts +0 -3
  426. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  427. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  428. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  429. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  430. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  431. package/dist/types/src/playground/layout/index.d.ts +0 -2
  432. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  433. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  434. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  435. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  436. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  437. package/dist/types/src/playground/logger/index.d.ts +0 -2
  438. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  439. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  440. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  441. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  442. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  443. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  444. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  445. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  446. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  447. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  448. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  449. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  450. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  451. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  452. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  453. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  454. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  455. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  456. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  457. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  458. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  459. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  460. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  461. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  462. package/dist/types/src/plugin-settings/actions.d.ts +0 -25
  463. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  464. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  465. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  466. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  467. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  468. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  469. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  470. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  471. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  472. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  473. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  474. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  475. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  476. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  477. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  478. package/dist/types/src/react/IntentContext.d.ts +0 -8
  479. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  480. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  481. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  482. package/dist/types/src/react/Surface.d.ts +0 -12
  483. package/dist/types/src/react/Surface.d.ts.map +0 -1
  484. package/dist/types/src/react/Surface.stories.d.ts +0 -17
  485. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  486. package/dist/types/src/react/common.d.ts +0 -13
  487. package/dist/types/src/react/common.d.ts.map +0 -1
  488. package/dist/types/src/react/index.d.ts +0 -7
  489. package/dist/types/src/react/index.d.ts.map +0 -1
  490. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  491. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  492. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  493. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  494. package/dist/types/src/worker.d.ts +0 -4
  495. package/dist/types/src/worker.d.ts.map +0 -1
  496. package/src/common/collaboration.ts +0 -18
  497. package/src/common/events.ts +0 -79
  498. package/src/common/file.ts +0 -22
  499. package/src/common/graph.ts +0 -30
  500. package/src/common/layout.ts +0 -277
  501. package/src/common/surface.ts +0 -83
  502. package/src/components/App.stories.tsx +0 -33
  503. package/src/components/App.tsx +0 -59
  504. package/src/components/DefaultFallback.tsx +0 -26
  505. package/src/components/useApp.tsx +0 -164
  506. package/src/core/capabilities.test.ts +0 -136
  507. package/src/core/capabilities.ts +0 -259
  508. package/src/core/manager.test.ts +0 -516
  509. package/src/core/manager.ts +0 -604
  510. package/src/playground/debug/Debug.tsx +0 -39
  511. package/src/playground/debug/plugin.ts +0 -16
  512. package/src/playground/generator/Main.tsx +0 -71
  513. package/src/playground/generator/Toolbar.tsx +0 -47
  514. package/src/playground/generator/generator.ts +0 -48
  515. package/src/playground/generator/index.ts +0 -6
  516. package/src/playground/generator/plugin.ts +0 -22
  517. package/src/playground/layout/Layout.tsx +0 -33
  518. package/src/playground/layout/index.ts +0 -5
  519. package/src/playground/layout/plugin.ts +0 -18
  520. package/src/playground/logger/Toolbar.tsx +0 -30
  521. package/src/playground/logger/plugin.ts +0 -41
  522. package/src/playground/logger/schema.ts +0 -12
  523. package/src/playground/playground.stories.tsx +0 -46
  524. package/src/plugin-intent/IntentPlugin.ts +0 -20
  525. package/src/plugin-intent/actions.ts +0 -31
  526. package/src/plugin-intent/errors.ts +0 -40
  527. package/src/plugin-intent/index.ts +0 -9
  528. package/src/plugin-intent/intent-dispatcher.test.ts +0 -286
  529. package/src/plugin-intent/intent-dispatcher.ts +0 -337
  530. package/src/plugin-intent/intent.ts +0 -154
  531. package/src/plugin-intent/meta.ts +0 -10
  532. package/src/plugin-settings/SettingsPlugin.ts +0 -34
  533. package/src/plugin-settings/actions.ts +0 -25
  534. package/src/plugin-settings/app-graph-builder.ts +0 -160
  535. package/src/plugin-settings/index.ts +0 -6
  536. package/src/plugin-settings/intent-resolver.ts +0 -35
  537. package/src/plugin-settings/meta.ts +0 -10
  538. package/src/plugin-settings/store.ts +0 -33
  539. package/src/plugin-settings/translations.ts +0 -19
  540. package/src/react/ErrorBoundary.tsx +0 -56
  541. package/src/react/IntentContext.tsx +0 -35
  542. package/src/react/Surface.stories.tsx +0 -101
  543. package/src/react/Surface.tsx +0 -86
  544. package/src/react/common.ts +0 -13
  545. package/src/react/index.ts +0 -10
  546. package/src/react/useCapabilities.ts +0 -31
  547. package/src/react/useIntentResolver.ts +0 -22
  548. package/src/worker.ts +0 -11
  549. /package/dist/lib/browser/{intent-dispatcher-6SHA5B3N.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  550. /package/dist/lib/browser/{worker.mjs.map → chunk-RFSO3JRG.mjs.map} +0 -0
  551. /package/dist/lib/{node-esm/intent-dispatcher-SIYQ5ZIU.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  552. /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/core/plugin-manager.ts", "../../../src/core/capability-manager.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, Registry } from '@effect-atom/atom-react';\nimport * as Array from 'effect/Array';\nimport * as Cause from 'effect/Cause';\nimport * as Deferred from 'effect/Deferred';\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as Fiber from 'effect/Fiber';\nimport * as Function from 'effect/Function';\nimport * as HashSet from 'effect/HashSet';\nimport * as PubSub from 'effect/PubSub';\nimport * as Ref from 'effect/Ref';\n\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { Performance } from '@dxos/effect';\nimport { log } from '@dxos/log';\n\nimport * as ActivationEvent from './activation-event';\nimport * as Capability from './capability';\nimport * as CapabilityManager from './capability-manager';\nimport * as Plugin from './plugin';\n\n/**\n * Identifier denoting a Manager.\n */\nexport const ManagerTypeId: unique symbol = Symbol.for('@dxos/app-framework/Manager');\nexport type ManagerTypeId = typeof ManagerTypeId;\n\nexport type ManagerOptions = {\n pluginLoader: (id: string) => Effect.Effect<Plugin.Plugin, Error>;\n plugins?: Plugin.Plugin[];\n core?: string[];\n enabled?: string[];\n registry?: Registry.Registry;\n};\n\nexport type ActivationMessage = {\n event: string;\n state: 'activating' | 'activated' | 'error';\n /** Module ID when the message pertains to a specific module activation. */\n module?: string;\n error?: Error;\n};\n\n/**\n * Interface for the Plugin Manager.\n */\nexport interface PluginManager {\n readonly [ManagerTypeId]: ManagerTypeId;\n readonly activation: PubSub.PubSub<ActivationMessage>;\n readonly capabilities: CapabilityManager.CapabilityManager;\n readonly registry: Registry.Registry;\n\n readonly plugins: Atom.Atom<readonly Plugin.Plugin[]>;\n readonly core: Atom.Atom<readonly string[]>;\n readonly enabled: Atom.Atom<readonly string[]>;\n readonly modules: Atom.Atom<readonly Plugin.PluginModule[]>;\n readonly active: Atom.Atom<readonly string[]>;\n readonly eventsFired: Atom.Atom<readonly string[]>;\n readonly pendingReset: Atom.Atom<readonly string[]>;\n\n getPlugins(): readonly Plugin.Plugin[];\n getCore(): readonly string[];\n getEnabled(): readonly string[];\n getModules(): readonly Plugin.PluginModule[];\n getActive(): readonly string[];\n getEventsFired(): readonly string[];\n getPendingReset(): readonly string[];\n\n /**\n * Loads a plugin via the plugin loader and registers it without enabling it.\n * Returns the loaded plugin so callers can enable it by its canonical id\n * (which may differ from the locator used to load it, e.g. URL loaders).\n */\n add(id: string): Effect.Effect<Plugin.Plugin, Error>;\n enable(id: string): Effect.Effect<boolean, Error>;\n remove(id: string): boolean;\n disable(id: string): Effect.Effect<boolean, Error>;\n // TODO(wittjosiah): Improve error typing.\n activate(\n event: ActivationEvent.ActivationEvent | string,\n params?: { before?: string; after?: string },\n ): Effect.Effect<boolean, Error>;\n deactivate(id: string): Effect.Effect<boolean, Error>;\n reset(event: ActivationEvent.ActivationEvent | string): Effect.Effect<boolean, Error>;\n\n /**\n * Shuts down the manager by deactivating all active modules in reverse activation order,\n * clearing all capabilities, and resetting lifecycle bookkeeping.\n * Plugins, core, enabled, and modules remain intact so the manager can be reused.\n */\n shutdown(): Effect.Effect<boolean, Error>;\n}\n\n/**\n * Type guard to check if a value is a PluginManager.\n */\nexport const isManager = (value: unknown): value is PluginManager => {\n return typeof value === 'object' && value !== null && ManagerTypeId in value;\n};\n\n/**\n * Internal implementation of PluginManager.\n */\nclass ManagerImpl implements PluginManager {\n readonly [ManagerTypeId]: ManagerTypeId = ManagerTypeId;\n readonly activation = Effect.runSync(PubSub.unbounded<ActivationMessage>());\n readonly capabilities: CapabilityManager.CapabilityManager;\n readonly registry: Registry.Registry;\n\n private readonly _pluginsAtom: Atom.Writable<Plugin.Plugin[]>;\n private readonly _coreAtom: Atom.Writable<string[]>;\n private readonly _enabledAtom: Atom.Writable<string[]>;\n private readonly _modulesAtom: Atom.Writable<Plugin.PluginModule[]>;\n private readonly _activeAtom: Atom.Writable<string[]>;\n private readonly _eventsFiredAtom: Atom.Writable<string[]>;\n private readonly _pendingResetAtom: Atom.Writable<string[]>;\n private readonly _pluginLoader: ManagerOptions['pluginLoader'];\n private readonly _capabilities = new Map<string, Capability.Any[]>();\n private readonly _moduleMemoMap = new Map<Plugin.PluginModule['id'], Deferred.Deferred<Capability.Any[], Error>>();\n private readonly _moduleSemaphores = new Map<Plugin.PluginModule['id'], Effect.Semaphore>();\n private readonly _activatingEvents = Effect.runSync(Ref.make<string[]>([]));\n private readonly _activatingModules = Effect.runSync(Ref.make<string[]>([]));\n private readonly _inFlightFibers = Effect.runSync(Ref.make<Array<Fiber.Fiber<unknown, unknown>>>([]));\n private readonly _shutdownSemaphore = Effect.runSync(Effect.makeSemaphore(1));\n private readonly _shuttingDown = Effect.runSync(Ref.make(false));\n\n constructor({\n pluginLoader,\n plugins = [],\n core = plugins.map(({ meta }) => meta.id),\n enabled = [],\n registry,\n }: ManagerOptions) {\n this.registry = registry ?? Registry.make();\n this.capabilities = CapabilityManager.make({\n registry: this.registry,\n });\n\n this._pluginLoader = pluginLoader;\n this._pluginsAtom = Atom.make(plugins).pipe(Atom.keepAlive);\n this._coreAtom = Atom.make(core).pipe(Atom.keepAlive);\n this._enabledAtom = Atom.make(enabled).pipe(Atom.keepAlive);\n this._modulesAtom = Atom.make<Plugin.PluginModule[]>([]).pipe(Atom.keepAlive);\n this._activeAtom = Atom.make<string[]>([]).pipe(Atom.keepAlive);\n this._eventsFiredAtom = Atom.make<string[]>([]).pipe(Atom.keepAlive);\n this._pendingResetAtom = Atom.make<string[]>([]).pipe(Atom.keepAlive);\n plugins.forEach((plugin) => this._addPlugin(plugin));\n void Effect.all([...core, ...enabled].map((id) => this.enable(id))).pipe(runAndForwardErrors);\n }\n\n get plugins(): Atom.Atom<readonly Plugin.Plugin[]> {\n return this._pluginsAtom;\n }\n\n get core(): Atom.Atom<readonly string[]> {\n return this._coreAtom;\n }\n\n /**\n * Ids of plugins that are currently enabled.\n */\n get enabled(): Atom.Atom<readonly string[]> {\n return this._enabledAtom;\n }\n\n /**\n * Modules of plugins which are currently enabled.\n */\n get modules(): Atom.Atom<readonly Plugin.PluginModule[]> {\n return this._modulesAtom;\n }\n\n /**\n * Ids of modules which are currently active.\n */\n get active(): Atom.Atom<readonly string[]> {\n return this._activeAtom;\n }\n\n /**\n * Ids of events which have been fired.\n */\n get eventsFired(): Atom.Atom<readonly string[]> {\n return this._eventsFiredAtom;\n }\n\n /**\n * Ids of modules which are pending reset.\n */\n get pendingReset(): Atom.Atom<readonly string[]> {\n return this._pendingResetAtom;\n }\n\n getPlugins(): readonly Plugin.Plugin[] {\n return this._get(this._pluginsAtom);\n }\n\n getCore(): readonly string[] {\n return this._get(this._coreAtom);\n }\n\n getEnabled(): readonly string[] {\n return this._get(this._enabledAtom);\n }\n\n getModules(): readonly Plugin.PluginModule[] {\n return this._get(this._modulesAtom);\n }\n\n getActive(): readonly string[] {\n return this._get(this._activeAtom);\n }\n\n getEventsFired(): readonly string[] {\n return this._get(this._eventsFiredAtom);\n }\n\n getPendingReset(): readonly string[] {\n return this._get(this._pendingResetAtom);\n }\n\n /**\n * Adds a plugin to the manager via the plugin loader.\n * The plugin is registered but not enabled; call `enable` separately to activate it.\n * @param id The id of the plugin.\n */\n add(id: string): Effect.Effect<Plugin.Plugin, Error> {\n return Effect.gen(this, function* () {\n log('add plugin', { id });\n const plugin = yield* this._pluginLoader(id);\n this._addPlugin(plugin);\n return plugin;\n });\n }\n\n /**\n * Enables a plugin.\n * @param id The id of the plugin.\n */\n enable(id: string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n log('enable plugin', { id });\n const plugin = this._getPlugin(id);\n if (!plugin) {\n return false;\n }\n\n this._update(this._enabledAtom, (enabled) => (enabled.includes(id) ? enabled : [...enabled, id]));\n\n plugin.modules.forEach((module) => {\n this._addModule(module);\n this._setPendingResetByModule(module);\n });\n\n log('pending reset', { events: [...this.getPendingReset()] });\n yield* Effect.all(\n this.getPendingReset().map((event) => this.activate(event)),\n { concurrency: 'unbounded' },\n );\n\n return true;\n });\n }\n\n /**\n * Removes a plugin from the manager.\n * @param id The id of the plugin.\n */\n remove(id: string): boolean {\n log('remove plugin', { id });\n const result = this.disable(id);\n if (!result) {\n return false;\n }\n\n this._removePlugin(id);\n return true;\n }\n\n /**\n * Disables a plugin.\n * @param id The id of the plugin.\n */\n disable(id: string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n log('disable plugin', { id });\n if (this._get(this._coreAtom).includes(id)) {\n return false;\n }\n\n const plugin = this._getPlugin(id);\n if (!plugin) {\n return false;\n }\n\n const enabledIndex = this._get(this._enabledAtom).findIndex((enabled) => enabled === id);\n if (enabledIndex !== -1) {\n this._update(this._enabledAtom, (enabled) => enabled.filter((item) => item !== id));\n yield* this.deactivate(id);\n\n plugin.modules.forEach((module) => {\n this._removeModule(module.id);\n });\n }\n\n return true;\n });\n }\n\n /**\n * Activates plugins based on the activation event.\n * @param event The activation event.\n * @returns Whether the activation was successful.\n */\n activate(\n event: ActivationEvent.ActivationEvent | string,\n params?: { before?: string; after?: string },\n ): Effect.Effect<boolean, Error> {\n const key = typeof event === 'string' ? event : ActivationEvent.eventKey(event);\n return Effect.gen(this, function* () {\n if (yield* this._isShuttingDown()) {\n log('skipping activation during shutdown', { key, ...params });\n return false;\n }\n\n return yield* Effect.withFiberRuntime<boolean, Error>((fiber) =>\n this._activateEvent(key, params, fiber).pipe(\n together(\n Effect.sleep(Duration.seconds(15)).pipe(\n Effect.andThen(Effect.sync(() => log.warn('event activation is taking a long time', { event: key }))),\n ),\n ),\n Performance.addTrackEntry({\n name: typeof event === 'string' ? event : ActivationEvent.eventKey(event),\n devtools: {\n dataType: 'track-entry',\n track: 'Event Activation',\n trackGroup: 'Composer',\n color: 'primary',\n },\n }),\n ),\n );\n });\n }\n\n /**\n * Deactivates all of the modules for a plugin.\n * @param id The id of the plugin.\n * @returns Whether the deactivation was successful.\n */\n deactivate(id: string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n const plugin = this._getPlugin(id);\n if (!plugin) {\n return false;\n }\n\n const modules = plugin.modules;\n const results = yield* Effect.all(\n modules.map((module) => this._deactivateModule(module)),\n { concurrency: 'unbounded' },\n );\n return results.every((result) => result);\n });\n }\n\n /**\n * Re-activates the modules that were activated by the event.\n * @param event The activation event.\n * @returns Whether the reset was successful.\n */\n reset(event: ActivationEvent.ActivationEvent | string): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n const key = typeof event === 'string' ? event : ActivationEvent.eventKey(event);\n log('reset', { key });\n const modules = this._getActiveModulesByEvent(key);\n const results = yield* Effect.all(\n modules.map((module) => this._deactivateModule(module)),\n { concurrency: 'unbounded' },\n );\n\n if (results.every((result) => result)) {\n return yield* this.activate(key);\n } else {\n return false;\n }\n });\n }\n\n shutdown(): Effect.Effect<boolean, Error> {\n return this._shutdownSemaphore.withPermits(1)(\n Effect.gen(this, function* () {\n yield* Ref.set(this._shuttingDown, true);\n log('shutdown');\n\n yield* this._interruptInFlightActivations();\n\n const activeIds = [...this._get(this._activeAtom)].reverse();\n const allModules = this._get(this._modulesAtom);\n const modulesToDeactivate = activeIds\n .map((id) => allModules.find((module) => module.id === id))\n .filter((module): module is Plugin.PluginModule => module != null);\n\n for (const module of modulesToDeactivate) {\n yield* this._deactivateModule(module);\n }\n\n this._set(this._eventsFiredAtom, []);\n this._set(this._pendingResetAtom, []);\n this._moduleMemoMap.clear();\n yield* Ref.set(this._activatingEvents, []);\n yield* Ref.set(this._activatingModules, []);\n\n log('shutdown complete');\n return true;\n }).pipe(Effect.ensuring(Ref.set(this._shuttingDown, false))),\n );\n }\n\n //\n // State helpers\n //\n\n private _get<T>(atom: Atom.Atom<T>): T {\n return this.registry.get(atom);\n }\n\n private _set<T>(atom: Atom.Writable<T>, value: T): void {\n this.registry.set(atom, value);\n }\n\n private _update<T>(atom: Atom.Writable<T>, updater: (current: T) => T): void {\n this._set(atom, updater(this._get(atom)));\n }\n\n private _isShuttingDown(): Effect.Effect<boolean> {\n return Ref.get(this._shuttingDown);\n }\n\n private _getPlugin(id: string): Plugin.Plugin | undefined {\n return this._get(this._pluginsAtom).find((plugin) => plugin.meta.id === id);\n }\n\n private _getActiveModules(): Plugin.PluginModule[] {\n const active = this._get(this._activeAtom);\n return this._get(this._modulesAtom).filter((module) => active.includes(module.id));\n }\n\n private _getInactiveModules(): Plugin.PluginModule[] {\n const active = this._get(this._activeAtom);\n return this._get(this._modulesAtom).filter((module) => !active.includes(module.id));\n }\n\n private _getActiveModulesByEvent(key: string): Plugin.PluginModule[] {\n return this._getActiveModules().filter((module) =>\n ActivationEvent.getEvents(module.activatesOn).map(ActivationEvent.eventKey).includes(key),\n );\n }\n\n private _getInactiveModulesByEvent(key: string): Plugin.PluginModule[] {\n return this._getInactiveModules().filter((module) =>\n ActivationEvent.getEvents(module.activatesOn).map(ActivationEvent.eventKey).includes(key),\n );\n }\n\n private _setPendingResetByModule(module: Plugin.PluginModule): void {\n const activationEvents = ActivationEvent.getEvents(module.activatesOn)\n .map(ActivationEvent.eventKey)\n .filter((key) => this._get(this._eventsFiredAtom).includes(key));\n\n const pendingReset = Array.fromIterable(new Set(activationEvents)).filter((event) => {\n const pending = this._get(this._pendingResetAtom);\n return !pending.includes(event);\n });\n if (pendingReset.length > 0) {\n log('pending reset', { events: pendingReset });\n this._update(this._pendingResetAtom, (current) => [...current, ...pendingReset]);\n }\n }\n\n private _clearPendingReset(key: string): void {\n const pendingIndex = this._get(this._pendingResetAtom).findIndex((event) => event === key);\n if (pendingIndex !== -1) {\n this._update(this._pendingResetAtom, (pending) => pending.filter((event) => event !== key));\n }\n }\n\n //\n // Fiber helpers\n //\n\n private _interruptInFlightActivations(): Effect.Effect<void> {\n return Effect.gen(this, function* () {\n const inFlightFibers = yield* Ref.get(this._inFlightFibers);\n yield* Effect.forEach(inFlightFibers, (fiber) => Fiber.interrupt(fiber), {\n concurrency: 'unbounded',\n });\n });\n }\n\n private _trackFiber(\n ref: Ref.Ref<Array<Fiber.Fiber<unknown, unknown>>>,\n fiber: Fiber.Fiber<unknown, unknown>,\n ): Effect.Effect<void> {\n return Ref.update(ref, (fibers) => [...fibers, fiber]);\n }\n\n private _untrackFiber(\n ref: Ref.Ref<Array<Fiber.Fiber<unknown, unknown>>>,\n fiber: Fiber.Fiber<unknown, unknown>,\n ): Effect.Effect<void> {\n return Ref.update(ref, (fibers) => fibers.filter((trackedFiber) => trackedFiber !== fiber));\n }\n\n //\n // Registration helpers\n //\n\n private _addPlugin(plugin: Plugin.Plugin): void {\n log('add plugin', { id: plugin.meta.id });\n // TODO(wittjosiah): Find a way to add a warning for duplicate plugins that doesn't cause log spam.\n this._update(this._pluginsAtom, (plugins) => (plugins.includes(plugin) ? plugins : [...plugins, plugin]));\n }\n\n private _removePlugin(id: string): void {\n log('remove plugin', { id });\n this._update(this._pluginsAtom, (plugins) => plugins.filter((plugin) => plugin.meta.id !== id));\n }\n\n private _addModule(module: Plugin.PluginModule): void {\n log('add module', { id: module.id });\n // TODO(wittjosiah): Find a way to add a warning for duplicate modules that doesn't cause log spam.\n this._update(this._modulesAtom, (modules) => (modules.includes(module) ? modules : [...modules, module]));\n }\n\n private _removeModule(id: string): void {\n log('remove module', { id });\n this._update(this._modulesAtom, (modules) => modules.filter((module) => module.id !== id));\n }\n\n //\n // Activation helpers\n //\n\n private _activateEvent(\n key: string,\n params: { before?: string; after?: string } | undefined,\n fiber: Fiber.Fiber<unknown, unknown>,\n ): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n yield* this._trackFiber(this._inFlightFibers, fiber);\n log('activating', { key, ...params });\n yield* Ref.update(this._activatingEvents, (activating) => Array.append(activating, key));\n this._clearPendingReset(key);\n\n const activatingEvents = yield* this._activatingEvents;\n const activatingModules = yield* this._activatingModules;\n const modules = this._getModulesForActivation(key, activatingEvents, activatingModules);\n if (modules.length === 0) {\n log('no modules to activate', { key });\n if (!this._get(this._eventsFiredAtom).includes(key)) {\n this._update(this._eventsFiredAtom, (events) => [...events, key]);\n }\n return false;\n }\n\n return yield* this._activateModulesForEvent(key, modules, activatingEvents);\n }).pipe(\n Effect.ensuring(\n Effect.all([\n this._untrackFiber(this._inFlightFibers, fiber),\n Ref.update(this._activatingEvents, (activating) => Array.filter(activating, (event) => event !== key)),\n ]),\n ),\n );\n }\n\n private _activateModulesForEvent(\n key: string,\n modules: Plugin.PluginModule[],\n activatingEvents: string[],\n ): Effect.Effect<boolean, Error> {\n const activatingModuleIds = modules.map((module) => module.id);\n return Effect.gen(this, function* () {\n yield* Ref.update(this._activatingModules, (activating) => Array.appendAll(activating, activatingModuleIds));\n\n log('activating modules', { key, modules: activatingModuleIds });\n performance.mark(`event:${key}:start`);\n yield* PubSub.publish(this.activation, { event: key, state: 'activating' });\n\n yield* this._activateRelatedEvents(key, this._getBeforeEvents(modules, activatingEvents), 'before');\n\n const capabilities = yield* this._loadCapabilitiesForModules(key, modules);\n yield* this._contributeCapabilitiesForModules(modules, capabilities);\n\n yield* this._activateRelatedEvents(key, this._getAfterEvents(modules, activatingEvents), 'after');\n\n if (!this._get(this._eventsFiredAtom).includes(key)) {\n this._update(this._eventsFiredAtom, (events) => [...events, key]);\n }\n\n performance.mark(`event:${key}:end`);\n performance.measure(`event:${key}`, `event:${key}:start`, `event:${key}:end`);\n yield* PubSub.publish(this.activation, { event: key, state: 'activated' });\n log('activated', { key });\n\n return true;\n }).pipe(\n Effect.ensuring(\n Ref.update(this._activatingModules, (activating) =>\n Array.filter(activating, (module) => !activatingModuleIds.includes(module)),\n ),\n ),\n );\n }\n\n private _getModulesForActivation(\n key: string,\n activatingEvents: string[],\n activatingModules: string[],\n ): Plugin.PluginModule[] {\n return this._getInactiveModulesByEvent(key).filter((module) => {\n const allOf = ActivationEvent.isAllOf(module.activatesOn);\n if (!allOf) {\n return true;\n }\n\n // Check to see if all of the events in the `allOf` have been fired.\n // An event can be considered \"fired\" if it is in the `eventsFired` list or if it is currently being activated.\n const events = ActivationEvent.getEvents(module.activatesOn).filter(\n (event) => ActivationEvent.eventKey(event) !== key,\n );\n return (\n events.every(\n (event) =>\n this._get(this._eventsFiredAtom).includes(ActivationEvent.eventKey(event)) ||\n activatingEvents.includes(ActivationEvent.eventKey(event)),\n ) && !activatingModules.includes(module.id)\n );\n });\n }\n\n private _getBeforeEvents(\n modules: Plugin.PluginModule[],\n activatingEvents: string[],\n ): ActivationEvent.ActivationEvent[] {\n return Function.pipe(\n modules,\n Array.flatMap((module) => module.firesBeforeActivation ?? []),\n HashSet.fromIterable,\n HashSet.toValues,\n Array.filter((event) => !activatingEvents.includes(ActivationEvent.eventKey(event))),\n );\n }\n\n private _getAfterEvents(\n modules: Plugin.PluginModule[],\n activatingEvents: string[],\n ): ActivationEvent.ActivationEvent[] {\n return Function.pipe(\n modules,\n Array.flatMap((module) => module.firesAfterActivation ?? []),\n HashSet.fromIterable,\n HashSet.toValues,\n Array.filter((event) => !activatingEvents.includes(ActivationEvent.eventKey(event))),\n );\n }\n\n private _activateRelatedEvents(\n key: string,\n events: ActivationEvent.ActivationEvent[],\n phase: 'before' | 'after',\n ): Effect.Effect<void, Error> {\n const logLabel = phase === 'before' ? 'firesBeforeActivation' : 'firesAfterActivation';\n const eventKey = phase === 'before' ? 'beforeEvents' : 'afterEvents';\n return Function.pipe(\n events,\n Array.map((event) => this.activate(event, phase === 'before' ? { before: key } : { after: key })),\n Effect.allWith({ concurrency: 'unbounded' }),\n together(\n Effect.sleep(Duration.seconds(10)).pipe(\n Effect.andThen(\n Effect.sync(() =>\n log.warn(`${logLabel} is taking a long time`, {\n event: key,\n [eventKey]: events.map(ActivationEvent.eventKey),\n }),\n ),\n ),\n ),\n ),\n Effect.asVoid,\n );\n }\n\n //\n // Module lifecycle helpers\n //\n\n private _loadCapabilitiesForModules(\n key: string,\n modules: Plugin.PluginModule[],\n ): Effect.Effect<Capability.Any[][], Error> {\n return Function.pipe(\n modules,\n Array.map((mod) => this._loadModule(mod)),\n Effect.allWith({ concurrency: 'unbounded' }),\n Effect.catchAll((error) => {\n return Effect.gen(this, function* () {\n yield* PubSub.publish(this.activation, { event: key, state: 'error', error });\n return yield* Effect.fail(error);\n });\n }),\n );\n }\n\n private _contributeCapabilitiesForModules(\n modules: Plugin.PluginModule[],\n capabilities: Capability.Any[][],\n ): Effect.Effect<void, Error> {\n return Function.pipe(\n modules,\n Array.zip(capabilities),\n Array.map(([module, capabilitySet]) => this._contributeCapabilities(module, capabilitySet)),\n // TODO(wittjosiah): This currently can't be run in parallel, and inserting\n // any yield between contributions (`Effect.yieldNow()`, `Effect.sleep(0)`)\n // races the `allOf` activation-event resolver — observed as a System\n // Error dialog on warm reloads. Contributions must stay strictly\n // synchronous within an event; React paint slots have to be found at\n // event boundaries higher up the call chain.\n Effect.all,\n Effect.asVoid,\n );\n }\n\n private _getModuleSemaphore(moduleId: Plugin.PluginModule['id']): Effect.Semaphore {\n let semaphore = this._moduleSemaphores.get(moduleId);\n if (!semaphore) {\n semaphore = Effect.runSync(Effect.makeSemaphore(1));\n this._moduleSemaphores.set(moduleId, semaphore);\n }\n return semaphore;\n }\n\n private _loadModule = (module: Plugin.PluginModule): Effect.Effect<Capability.Any[], Error> =>\n Effect.gen(this, function* () {\n const semaphore = this._getModuleSemaphore(module.id);\n\n // Atomically check-and-set under per-module semaphore to prevent race conditions.\n const deferredToAwait = yield* Effect.gen(this, function* () {\n const existing = this._moduleMemoMap.get(module.id);\n if (existing) {\n return existing;\n }\n\n // First caller - create deferred, store it, and start loading in background.\n const deferred = yield* Deferred.make<Capability.Any[], Error>();\n this._moduleMemoMap.set(module.id, deferred);\n\n const loadEffect = Effect.gen(this, function* () {\n log('loading module', { module: module.id });\n performance.mark(`module:${module.id}:start`);\n yield* PubSub.publish(this.activation, { event: '', state: 'activating', module: module.id });\n const [duration, capabilities] = yield* module\n .activate()\n .pipe(\n Effect.provideService(Capability.Service, this.capabilities),\n Effect.provideService(Plugin.Service, this),\n Effect.timed,\n );\n const normalized = capabilities == null ? [] : Array.isArray(capabilities) ? capabilities : [capabilities];\n const elapsed = Duration.toMillis(duration);\n performance.mark(`module:${module.id}:end`);\n performance.measure(`module:${module.id}`, `module:${module.id}:start`, `module:${module.id}:end`);\n yield* PubSub.publish(this.activation, { event: '', state: 'activated', module: module.id });\n log('loaded module', {\n module: module.id,\n elapsed,\n failed: false,\n });\n return normalized as Capability.Any[];\n }).pipe(\n Effect.withSpan('PluginManager._loadModule'),\n together(\n Effect.sleep(Duration.seconds(10)).pipe(\n Effect.andThen(\n Effect.sync(() => log.warn(`module is taking a long time to activate`, { module: module.id })),\n ),\n ),\n ),\n Performance.addTrackEntry({\n name: module.id,\n devtools: {\n dataType: 'track-entry',\n track: 'Module Activation',\n trackGroup: 'Composer',\n color: 'primary',\n },\n }),\n );\n\n // Fork the load to run in background, completing the deferred when done.\n const fiber = yield* Effect.forkDaemon(\n loadEffect.pipe(\n Effect.tap((result) => Deferred.succeed(deferred, result)),\n Effect.catchAllCause((cause) => {\n const error = Cause.squash(cause);\n log.error('module failed to activate', {\n module: module.id,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n isDefect: !Cause.isFailure(cause),\n });\n return Deferred.fail(deferred, error instanceof Error ? error : new Error(String(error)));\n }),\n ),\n );\n yield* this._trackFiber(this._inFlightFibers, fiber);\n yield* Effect.forkDaemon(\n Fiber.await(fiber).pipe(Effect.andThen(() => this._untrackFiber(this._inFlightFibers, fiber))),\n );\n\n return deferred;\n }).pipe(semaphore.withPermits(1));\n\n // Wait for result outside the semaphore so multiple waiters can proceed concurrently.\n return yield* Deferred.await(deferredToAwait);\n });\n\n private _contributeCapabilities(\n module: Plugin.PluginModule,\n capabilities: Capability.Any[],\n ): Effect.Effect<void, Error> {\n return Effect.gen(this, function* () {\n capabilities.forEach((capability) => {\n this.capabilities.contribute({ module: module.id, ...capability });\n });\n this._update(this._activeAtom, (active) => [...active, module.id]);\n this._capabilities.set(module.id, capabilities);\n });\n }\n\n private _deactivateModule(module: Plugin.PluginModule): Effect.Effect<boolean, Error> {\n return Effect.gen(this, function* () {\n const id = module.id;\n log('deactivating', { id });\n this._moduleMemoMap.delete(id);\n\n const capabilities = this._capabilities.get(id);\n if (capabilities) {\n for (const capability of capabilities) {\n this.capabilities.remove(capability.interface, capability.implementation);\n const program = capability.deactivate?.() ?? Effect.succeed(undefined);\n yield* program;\n }\n this._capabilities.delete(id);\n }\n\n const activeIndex = this._get(this._activeAtom).findIndex((event) => event === id);\n if (activeIndex !== -1) {\n this._update(this._activeAtom, (active) => active.filter((event) => event !== id));\n }\n\n log('deactivated', { id });\n return true;\n });\n }\n}\n\n/**\n * Creates a new Plugin Manager instance.\n */\nexport const make = (options: ManagerOptions): PluginManager => new ManagerImpl(options);\n\n/**\n * Runs an effect concurrently with another effect.\n * If the first effect completes, the second effect is interrupted.\n */\n// TODO(dmaretskyi): Effect.race > Effect.asVoid\nconst together =\n <R1>(togetherEffect: Effect.Effect<void, never, R1>) =>\n <A, E, R2>(effect: Effect.Effect<A, E, R2>): Effect.Effect<A, E, R1 | R2> =>\n Effect.gen(function* () {\n const togetherFiber = yield* Effect.fork(togetherEffect);\n const result = yield* effect;\n yield* Fiber.interrupt(togetherFiber);\n return result;\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\nimport * as Deferred from 'effect/Deferred';\nimport * as Effect from 'effect/Effect';\n\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport type * as Capability from './capability';\n\ntype CapabilityEntry<T> = {\n moduleId: string;\n implementation: T;\n};\n\n/**\n * Options for creating a capability manager.\n * @internal\n */\nexport type CapabilityManagerOptions = {\n registry: Registry.Registry;\n};\n\n/**\n * Interface for the Capability Manager.\n * Provides methods for contributing, removing, and accessing capabilities.\n */\nexport interface CapabilityManager {\n contribute<T>(args: { module: string; interface: Capability.InterfaceDef<T>; implementation: T }): void;\n\n remove<T>(interfaceDef: Capability.InterfaceDef<T>, implementation: T): void;\n\n /**\n * Get the Atom reference to the available capabilities for a given interface.\n * Primarily useful for deriving other Atom values based on the capabilities or\n * for subscribing to changes in the capabilities.\n * @returns An atom reference to the available capabilities.\n */\n atom<T>(interfaceDef: Capability.InterfaceDef<T>): Atom.Atom<T[]>;\n\n /**\n * Get capabilities from the capability manager.\n * @returns An array of capabilities.\n */\n getAll<T>(interfaceDef: Capability.InterfaceDef<T>): T[];\n\n /**\n * Requests a single capability from the capability manager.\n * @returns The capability.\n * @throws If no capability is found.\n */\n get<T>(interfaceDef: Capability.InterfaceDef<T>): T;\n\n /**\n * Waits for a capability to be available.\n * @returns The capability.\n */\n waitFor<T>(interfaceDef: Capability.InterfaceDef<T>): Effect.Effect<T, Error>;\n\n /**\n * Get capabilities grouped by the module that contributed them.\n * @returns An atom containing a record from module ID to capability implementations.\n */\n atomByModule<T>(interfaceDef: Capability.InterfaceDef<T>): Atom.Atom<Record<string, T[]>>;\n}\n\n/**\n * Internal implementation of CapabilityManager.\n */\nclass CapabilityManagerImpl implements CapabilityManager {\n private readonly _registry: Registry.Registry;\n\n private readonly _capabilityEntries = Atom.family<string, Atom.Writable<CapabilityEntry<unknown>[]>>(() => {\n return Atom.make<CapabilityEntry<unknown>[]>([]).pipe(Atom.keepAlive);\n });\n\n readonly _capabilities = Atom.family<string, Atom.Atom<unknown[]>>((id: string) => {\n return Atom.make((get) => {\n const current = get(this._capabilityEntries(id));\n return current.map((c) => c.implementation);\n }).pipe(Atom.keepAlive);\n });\n\n readonly _capabilitiesByModule = Atom.family<string, Atom.Atom<Record<string, unknown[]>>>((id: string) => {\n return Atom.make((get) => {\n const entries = get(this._capabilityEntries(id));\n const result: Record<string, unknown[]> = {};\n for (const entry of entries) {\n (result[entry.moduleId] ??= []).push(entry.implementation);\n }\n return result;\n }).pipe(Atom.keepAlive);\n });\n\n readonly _capability = Atom.family<string, Atom.Atom<unknown>>((id: string) => {\n return Atom.make((get) => {\n const current = get(this._capabilities(id));\n invariant(current.length > 0, `No capability found for ${id}`);\n return current[0];\n });\n });\n\n constructor({ registry }: CapabilityManagerOptions) {\n this._registry = registry;\n }\n\n contribute<T>({\n module: moduleId,\n interface: interfaceDef,\n implementation,\n }: {\n module: string;\n interface: Capability.InterfaceDef<T>;\n implementation: T;\n }): void {\n const current = this._registry.get(this._capabilityEntries(interfaceDef.identifier));\n const isDuplicate = current.some((c) => c.moduleId === moduleId && c.implementation === implementation);\n if (isDuplicate) {\n log('capability already contributed, skipping', { id: interfaceDef.identifier, moduleId });\n return;\n }\n\n const entry: CapabilityEntry<T> = { moduleId, implementation };\n this._registry.set(this._capabilityEntries(interfaceDef.identifier), [...current, entry]);\n log('capability contributed', {\n id: interfaceDef.identifier,\n moduleId,\n count: current.length,\n });\n }\n\n remove<T>(interfaceDef: Capability.InterfaceDef<T>, implementation: T): void {\n const current = this._registry.get(this._capabilityEntries(interfaceDef.identifier));\n if (current.length === 0) {\n return;\n }\n\n const next = current.filter((c) => c.implementation !== implementation);\n if (next.length !== current.length) {\n this._registry.set(this._capabilityEntries(interfaceDef.identifier), next);\n log('capability removed', { id: interfaceDef.identifier, count: current.length });\n } else {\n log.warn('capability not removed', { id: interfaceDef.identifier });\n }\n }\n\n atom<T>(interfaceDef: Capability.InterfaceDef<T>): Atom.Atom<T[]> {\n // NOTE: This the type-checking for capabilities is done at the time of contribution.\n return this._capabilities(interfaceDef.identifier) as Atom.Atom<T[]>;\n }\n\n getAll<T>(interfaceDef: Capability.InterfaceDef<T>): T[] {\n return this._registry.get(this.atom(interfaceDef));\n }\n\n get<T>(interfaceDef: Capability.InterfaceDef<T>): T {\n const capabilities = this.getAll(interfaceDef);\n invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`);\n return capabilities[0];\n }\n\n waitFor<T>(interfaceDef: Capability.InterfaceDef<T>): Effect.Effect<T, Error> {\n return Effect.gen(this, function* () {\n const [capability] = this.getAll(interfaceDef);\n if (capability) {\n return capability;\n }\n\n const deferred = yield* Deferred.make<T, Error>();\n const cancel = this._registry.subscribe(this.atom(interfaceDef), (capabilities) => {\n if (capabilities.length > 0) {\n Effect.runSync(Deferred.succeed(deferred, capabilities[0]));\n }\n });\n const result = yield* Deferred.await(deferred);\n cancel();\n return result;\n });\n }\n\n atomByModule<T>(interfaceDef: Capability.InterfaceDef<T>): Atom.Atom<Record<string, T[]>> {\n return this._capabilitiesByModule(interfaceDef.identifier) as Atom.Atom<Record<string, T[]>>;\n }\n}\n\n/**\n * Creates a new Capability Manager instance.\n */\nexport const make = (options: CapabilityManagerOptions): CapabilityManager => new CapabilityManagerImpl(options);\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;AAAA;;;;cAAAA;;AAIA,SAASC,QAAAA,OAAMC,gBAAgB;AAC/B,YAAYC,WAAW;AACvB,YAAYC,WAAW;AACvB,YAAYC,eAAc;AAC1B,YAAYC,cAAc;AAC1B,YAAYC,aAAY;AACxB,YAAYC,WAAW;AACvB,YAAYC,cAAc;AAC1B,YAAYC,aAAa;AACzB,YAAYC,YAAY;AACxB,YAAYC,SAAS;AAErB,SAASC,2BAA2B;AACpC,SAASC,mBAAmB;AAC5B,SAASC,OAAAA,YAAW;;;AClBpB;;cAAAC;;AAIA,SAASC,YAA2B;AACpC,YAAYC,cAAc;AAC1B,YAAYC,YAAY;AAExB,SAASC,iBAAiB;AAC1B,SAASC,WAAW;;AA+DpB,IAAMC,wBAAN,MAAMA;EACaC;EAEAC,qBAAqBP,KAAKQ,OAA0D,MAAA;AACnG,WAAOR,KAAKD,KAAiC,CAAA,CAAE,EAAEU,KAAKT,KAAKU,SAAS;EACtE,CAAA;EAESC,gBAAgBX,KAAKQ,OAAqC,CAACI,OAAAA;AAClE,WAAOZ,KAAKD,KAAK,CAACc,SAAAA;AAChB,YAAMC,UAAUD,KAAI,KAAKN,mBAAmBK,EAAAA,CAAAA;AAC5C,aAAOE,QAAQC,IAAI,CAACC,MAAMA,EAAEC,cAAc;IAC5C,CAAA,EAAGR,KAAKT,KAAKU,SAAS;EACxB,CAAA;EAESQ,wBAAwBlB,KAAKQ,OAAqD,CAACI,OAAAA;AAC1F,WAAOZ,KAAKD,KAAK,CAACc,SAAAA;AAChB,YAAMM,UAAUN,KAAI,KAAKN,mBAAmBK,EAAAA,CAAAA;AAC5C,YAAMQ,SAAoC,CAAC;AAC3C,iBAAWC,SAASF,SAAS;AAC1BC,SAAAA,OAAOC,MAAMC,QAAQ,MAAM,CAAA,GAAIC,KAAKF,MAAMJ,cAAc;MAC3D;AACA,aAAOG;IACT,CAAA,EAAGX,KAAKT,KAAKU,SAAS;EACxB,CAAA;EAESc,cAAcxB,KAAKQ,OAAmC,CAACI,OAAAA;AAC9D,WAAOZ,KAAKD,KAAK,CAACc,SAAAA;AAChB,YAAMC,UAAUD,KAAI,KAAKF,cAAcC,EAAAA,CAAAA;AACvCT,gBAAUW,QAAQW,SAAS,GAAG,2BAA2Bb,EAAAA,IAAI;;;;;;;;;AAC7D,aAAOE,QAAQ,CAAA;IACjB,CAAA;EACF,CAAA;EAEA,YAAY,EAAEY,SAAQ,GAA8B;AAClD,SAAKpB,YAAYoB;EACnB;EAEAC,WAAc,EACZC,QAAQN,UACRO,WAAWC,cACXb,eAAc,GAKP;AACP,UAAMH,UAAU,KAAKR,UAAUO,IAAI,KAAKN,mBAAmBuB,aAAaC,UAAU,CAAA;AAClF,UAAMC,cAAclB,QAAQmB,KAAK,CAACjB,MAAMA,EAAEM,aAAaA,YAAYN,EAAEC,mBAAmBA,cAAAA;AACxF,QAAIe,aAAa;AACf5B,UAAI,4CAA4C;QAAEQ,IAAIkB,aAAaC;QAAYT;MAAS,GAAA;;;;;;AACxF;IACF;AAEA,UAAMD,QAA4B;MAAEC;MAAUL;IAAe;AAC7D,SAAKX,UAAU4B,IAAI,KAAK3B,mBAAmBuB,aAAaC,UAAU,GAAG;SAAIjB;MAASO;KAAM;AACxFjB,QAAI,0BAA0B;MAC5BQ,IAAIkB,aAAaC;MACjBT;MACAa,OAAOrB,QAAQW;IACjB,GAAA;;;;;;EACF;EAEAW,OAAUN,cAA0Cb,gBAAyB;AAC3E,UAAMH,UAAU,KAAKR,UAAUO,IAAI,KAAKN,mBAAmBuB,aAAaC,UAAU,CAAA;AAClF,QAAIjB,QAAQW,WAAW,GAAG;AACxB;IACF;AAEA,UAAMY,OAAOvB,QAAQwB,OAAO,CAACtB,MAAMA,EAAEC,mBAAmBA,cAAAA;AACxD,QAAIoB,KAAKZ,WAAWX,QAAQW,QAAQ;AAClC,WAAKnB,UAAU4B,IAAI,KAAK3B,mBAAmBuB,aAAaC,UAAU,GAAGM,IAAAA;AACrEjC,UAAI,sBAAsB;QAAEQ,IAAIkB,aAAaC;QAAYI,OAAOrB,QAAQW;MAAO,GAAA;;;;;;IACjF,OAAO;AACLrB,UAAImC,KAAK,0BAA0B;QAAE3B,IAAIkB,aAAaC;MAAW,GAAA;;;;;;IACnE;EACF;EAEAS,KAAQV,cAA0D;AAEhE,WAAO,KAAKnB,cAAcmB,aAAaC,UAAU;EACnD;EAEAU,OAAUX,cAA+C;AACvD,WAAO,KAAKxB,UAAUO,IAAI,KAAK2B,KAAKV,YAAAA,CAAAA;EACtC;EAEAjB,IAAOiB,cAA6C;AAClD,UAAMY,eAAe,KAAKD,OAAOX,YAAAA;AACjC3B,cAAUuC,aAAajB,SAAS,GAAG,2BAA2BK,aAAaC,UAAU,IAAE;;;;;;;;;AACvF,WAAOW,aAAa,CAAA;EACtB;EAEAC,QAAWb,cAAmE;AAC5E,WAAcc,WAAI,MAAM,aAAA;AACtB,YAAM,CAACC,UAAAA,IAAc,KAAKJ,OAAOX,YAAAA;AACjC,UAAIe,YAAY;AACd,eAAOA;MACT;AAEA,YAAMC,WAAW,OAAgB/C,cAAI;AACrC,YAAMgD,SAAS,KAAKzC,UAAU0C,UAAU,KAAKR,KAAKV,YAAAA,GAAe,CAACY,iBAAAA;AAChE,YAAIA,aAAajB,SAAS,GAAG;AAC3BvB,UAAO+C,eAAiBC,iBAAQJ,UAAUJ,aAAa,CAAA,CAAE,CAAA;QAC3D;MACF,CAAA;AACA,YAAMtB,SAAS,OAAgB+B,eAAML,QAAAA;AACrCC,aAAAA;AACA,aAAO3B;IACT,CAAA;EACF;EAEAgC,aAAgBtB,cAA0E;AACxF,WAAO,KAAKZ,sBAAsBY,aAAaC,UAAU;EAC3D;AACF;AAKO,IAAMhC,QAAO,CAACsD,YAAyD,IAAIhD,sBAAsBgD,OAAAA;;;;ADnKjG,IAAMC,gBAA+BC,uBAAOC,IAAI,6BAAA;AAwEhD,IAAMC,YAAY,CAACC,UAAAA;AACxB,SAAO,OAAOA,UAAU,YAAYA,UAAU,QAAQJ,iBAAiBI;AACzE;AAKA,IAAMC,cAAN,MAAMA;EACK,CAACL,aAAAA,IAAgCA;EACjCM,aAAoBC,gBAAeC,iBAAS,CAAA;EAC5CC;EACAC;EAEQC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC,gBAAgB,oBAAIC,IAAAA;EACpBC,iBAAiB,oBAAID,IAAAA;EACrBE,oBAAoB,oBAAIF,IAAAA;EACxBG,oBAA2BhB,gBAAYiB,SAAe,CAAA,CAAE,CAAA;EACxDC,qBAA4BlB,gBAAYiB,SAAe,CAAA,CAAE,CAAA;EACzDE,kBAAyBnB,gBAAYiB,SAA2C,CAAA,CAAE,CAAA;EAClFG,qBAA4BpB,gBAAeqB,sBAAc,CAAA,CAAA;EACzDC,gBAAuBtB,gBAAYiB,SAAK,KAAA,CAAA;EAEzD,YAAY,EACVM,cACAC,UAAU,CAAA,GACVC,OAAOD,QAAQE,IAAI,CAAC,EAAEC,KAAI,MAAOA,KAAKC,EAAE,GACxCC,UAAU,CAAA,GACV1B,SAAQ,GACS;AACjB,SAAKA,WAAWA,YAAY2B,SAASb,KAAI;AACzC,SAAKf,eAAiCe,MAAK;MACzCd,UAAU,KAAKA;IACjB,CAAA;AAEA,SAAKQ,gBAAgBY;AACrB,SAAKnB,eAAe2B,MAAKd,KAAKO,OAAAA,EAASQ,KAAKD,MAAKE,SAAS;AAC1D,SAAK5B,YAAY0B,MAAKd,KAAKQ,IAAAA,EAAMO,KAAKD,MAAKE,SAAS;AACpD,SAAK3B,eAAeyB,MAAKd,KAAKY,OAAAA,EAASG,KAAKD,MAAKE,SAAS;AAC1D,SAAK1B,eAAewB,MAAKd,KAA4B,CAAA,CAAE,EAAEe,KAAKD,MAAKE,SAAS;AAC5E,SAAKzB,cAAcuB,MAAKd,KAAe,CAAA,CAAE,EAAEe,KAAKD,MAAKE,SAAS;AAC9D,SAAKxB,mBAAmBsB,MAAKd,KAAe,CAAA,CAAE,EAAEe,KAAKD,MAAKE,SAAS;AACnE,SAAKvB,oBAAoBqB,MAAKd,KAAe,CAAA,CAAE,EAAEe,KAAKD,MAAKE,SAAS;AACpET,YAAQU,QAAQ,CAACC,WAAW,KAAKC,WAAWD,MAAAA,CAAAA;AAC5C,SAAYE,YAAI;SAAIZ;SAASI;MAASH,IAAI,CAACE,OAAO,KAAKU,OAAOV,EAAAA,CAAAA,CAAAA,EAAMI,KAAKO,mBAAAA;EAC3E;EAEA,IAAIf,UAA+C;AACjD,WAAO,KAAKpB;EACd;EAEA,IAAIqB,OAAqC;AACvC,WAAO,KAAKpB;EACd;;;;EAKA,IAAIwB,UAAwC;AAC1C,WAAO,KAAKvB;EACd;;;;EAKA,IAAIkC,UAAqD;AACvD,WAAO,KAAKjC;EACd;;;;EAKA,IAAIkC,SAAuC;AACzC,WAAO,KAAKjC;EACd;;;;EAKA,IAAIkC,cAA4C;AAC9C,WAAO,KAAKjC;EACd;;;;EAKA,IAAIkC,eAA6C;AAC/C,WAAO,KAAKjC;EACd;EAEAkC,aAAuC;AACrC,WAAO,KAAKC,KAAK,KAAKzC,YAAY;EACpC;EAEA0C,UAA6B;AAC3B,WAAO,KAAKD,KAAK,KAAKxC,SAAS;EACjC;EAEA0C,aAAgC;AAC9B,WAAO,KAAKF,KAAK,KAAKvC,YAAY;EACpC;EAEA0C,aAA6C;AAC3C,WAAO,KAAKH,KAAK,KAAKtC,YAAY;EACpC;EAEA0C,YAA+B;AAC7B,WAAO,KAAKJ,KAAK,KAAKrC,WAAW;EACnC;EAEA0C,iBAAoC;AAClC,WAAO,KAAKL,KAAK,KAAKpC,gBAAgB;EACxC;EAEA0C,kBAAqC;AACnC,WAAO,KAAKN,KAAK,KAAKnC,iBAAiB;EACzC;;;;;;EAOA0C,IAAIxB,IAAiD;AACnD,WAAcyB,YAAI,MAAM,aAAA;AACtBC,MAAAA,KAAI,cAAc;QAAE1B;MAAG,GAAA;;;;;;AACvB,YAAMO,SAAS,OAAO,KAAKxB,cAAciB,EAAAA;AACzC,WAAKQ,WAAWD,MAAAA;AAChB,aAAOA;IACT,CAAA;EACF;;;;;EAMAG,OAAOV,IAA2C;AAChD,WAAcyB,YAAI,MAAM,aAAA;AACtBC,MAAAA,KAAI,iBAAiB;QAAE1B;MAAG,GAAA;;;;;;AAC1B,YAAMO,SAAS,KAAKoB,WAAW3B,EAAAA;AAC/B,UAAI,CAACO,QAAQ;AACX,eAAO;MACT;AAEA,WAAKqB,QAAQ,KAAKlD,cAAc,CAACuB,YAAaA,QAAQ4B,SAAS7B,EAAAA,IAAMC,UAAU;WAAIA;QAASD;OAAG;AAE/FO,aAAOK,QAAQN,QAAQ,CAACwB,WAAAA;AACtB,aAAKC,WAAWD,MAAAA;AAChB,aAAKE,yBAAyBF,MAAAA;MAChC,CAAA;AAEAJ,MAAAA,KAAI,iBAAiB;QAAEO,QAAQ;aAAI,KAAKV,gBAAe;;MAAI,GAAA;;;;;;AAC3D,aAAcd,YACZ,KAAKc,gBAAe,EAAGzB,IAAI,CAACoC,UAAU,KAAKC,SAASD,KAAAA,CAAAA,GACpD;QAAEE,aAAa;MAAY,CAAA;AAG7B,aAAO;IACT,CAAA;EACF;;;;;EAMAC,OAAOrC,IAAqB;AAC1B0B,IAAAA,KAAI,iBAAiB;MAAE1B;IAAG,GAAA;;;;;;AAC1B,UAAMsC,SAAS,KAAKC,QAAQvC,EAAAA;AAC5B,QAAI,CAACsC,QAAQ;AACX,aAAO;IACT;AAEA,SAAKE,cAAcxC,EAAAA;AACnB,WAAO;EACT;;;;;EAMAuC,QAAQvC,IAA2C;AACjD,WAAcyB,YAAI,MAAM,aAAA;AACtBC,MAAAA,KAAI,kBAAkB;QAAE1B;MAAG,GAAA;;;;;;AAC3B,UAAI,KAAKiB,KAAK,KAAKxC,SAAS,EAAEoD,SAAS7B,EAAAA,GAAK;AAC1C,eAAO;MACT;AAEA,YAAMO,SAAS,KAAKoB,WAAW3B,EAAAA;AAC/B,UAAI,CAACO,QAAQ;AACX,eAAO;MACT;AAEA,YAAMkC,eAAe,KAAKxB,KAAK,KAAKvC,YAAY,EAAEgE,UAAU,CAACzC,YAAYA,YAAYD,EAAAA;AACrF,UAAIyC,iBAAiB,IAAI;AACvB,aAAKb,QAAQ,KAAKlD,cAAc,CAACuB,YAAYA,QAAQ0C,OAAO,CAACC,SAASA,SAAS5C,EAAAA,CAAAA;AAC/E,eAAO,KAAK6C,WAAW7C,EAAAA;AAEvBO,eAAOK,QAAQN,QAAQ,CAACwB,WAAAA;AACtB,eAAKgB,cAAchB,OAAO9B,EAAE;QAC9B,CAAA;MACF;AAEA,aAAO;IACT,CAAA;EACF;;;;;;EAOAmC,SACED,OACAa,QAC+B;AAC/B,UAAMC,MAAM,OAAOd,UAAU,WAAWA,QAAwBe,SAASf,KAAAA;AACzE,WAAcT,YAAI,MAAM,aAAA;AACtB,UAAI,OAAO,KAAKyB,gBAAe,GAAI;AACjCxB,QAAAA,KAAI,uCAAuC;UAAEsB;UAAK,GAAGD;QAAO,GAAA;;;;;;AAC5D,eAAO;MACT;AAEA,aAAO,OAAcI,yBAAiC,CAACC,UACrD,KAAKC,eAAeL,KAAKD,QAAQK,KAAAA,EAAOhD,KACtCkD,SACSC,cAAeC,iBAAQ,EAAA,CAAA,EAAKpD,KAC1BqD,gBAAeC,aAAK,MAAMhC,KAAIiC,KAAK,0CAA0C;QAAEzB,OAAOc;MAAI,GAAA;;;;;cAGrGY,YAAYC,cAAc;QACxBC,MAAM,OAAO5B,UAAU,WAAWA,QAAwBe,SAASf,KAAAA;QACnE6B,UAAU;UACRC,UAAU;UACVC,OAAO;UACPC,YAAY;UACZC,OAAO;QACT;MACF,CAAA,CAAA,CAAA;IAGN,CAAA;EACF;;;;;;EAOAtB,WAAW7C,IAA2C;AACpD,WAAcyB,YAAI,MAAM,aAAA;AACtB,YAAMlB,SAAS,KAAKoB,WAAW3B,EAAAA;AAC/B,UAAI,CAACO,QAAQ;AACX,eAAO;MACT;AAEA,YAAMK,UAAUL,OAAOK;AACvB,YAAMwD,UAAU,OAAc3D,YAC5BG,QAAQd,IAAI,CAACgC,WAAW,KAAKuC,kBAAkBvC,MAAAA,CAAAA,GAC/C;QAAEM,aAAa;MAAY,CAAA;AAE7B,aAAOgC,QAAQE,MAAM,CAAChC,WAAWA,MAAAA;IACnC,CAAA;EACF;;;;;;EAOAiC,MAAMrC,OAAgF;AACpF,WAAcT,YAAI,MAAM,aAAA;AACtB,YAAMuB,MAAM,OAAOd,UAAU,WAAWA,QAAwBe,SAASf,KAAAA;AACzER,MAAAA,KAAI,SAAS;QAAEsB;MAAI,GAAA;;;;;;AACnB,YAAMpC,UAAU,KAAK4D,yBAAyBxB,GAAAA;AAC9C,YAAMoB,UAAU,OAAc3D,YAC5BG,QAAQd,IAAI,CAACgC,WAAW,KAAKuC,kBAAkBvC,MAAAA,CAAAA,GAC/C;QAAEM,aAAa;MAAY,CAAA;AAG7B,UAAIgC,QAAQE,MAAM,CAAChC,WAAWA,MAAAA,GAAS;AACrC,eAAO,OAAO,KAAKH,SAASa,GAAAA;MAC9B,OAAO;AACL,eAAO;MACT;IACF,CAAA;EACF;EAEAyB,WAA0C;AACxC,WAAO,KAAKjF,mBAAmBkF,YAAY,CAAA,EAClCjD,YAAI,MAAM,aAAA;AACf,aAAWkD,QAAI,KAAKjF,eAAe,IAAA;AACnCgC,MAAAA,KAAI,YAAA,QAAA;;;;;;AAEJ,aAAO,KAAKkD,8BAA6B;AAEzC,YAAMC,YAAY;WAAI,KAAK5D,KAAK,KAAKrC,WAAW;QAAGkG,QAAO;AAC1D,YAAMC,aAAa,KAAK9D,KAAK,KAAKtC,YAAY;AAC9C,YAAMqG,sBAAsBH,UACzB/E,IAAI,CAACE,OAAO+E,WAAWE,KAAK,CAACnD,WAAWA,OAAO9B,OAAOA,EAAAA,CAAAA,EACtD2C,OAAO,CAACb,WAA0CA,UAAU,IAAA;AAE/D,iBAAWA,UAAUkD,qBAAqB;AACxC,eAAO,KAAKX,kBAAkBvC,MAAAA;MAChC;AAEA,WAAKoD,KAAK,KAAKrG,kBAAkB,CAAA,CAAE;AACnC,WAAKqG,KAAK,KAAKpG,mBAAmB,CAAA,CAAE;AACpC,WAAKI,eAAeiG,MAAK;AACzB,aAAWR,QAAI,KAAKvF,mBAAmB,CAAA,CAAE;AACzC,aAAWuF,QAAI,KAAKrF,oBAAoB,CAAA,CAAE;AAE1CoC,MAAAA,KAAI,qBAAA,QAAA;;;;;;AACJ,aAAO;IACT,CAAA,EAAGtB,KAAYgF,iBAAaT,QAAI,KAAKjF,eAAe,KAAA,CAAA,CAAA,CAAA;EAExD;;;;EAMQuB,KAAQoE,MAAuB;AACrC,WAAO,KAAK9G,SAAS+G,IAAID,IAAAA;EAC3B;EAEQH,KAAQG,MAAwBpH,OAAgB;AACtD,SAAKM,SAASoG,IAAIU,MAAMpH,KAAAA;EAC1B;EAEQ2D,QAAWyD,MAAwBE,SAAkC;AAC3E,SAAKL,KAAKG,MAAME,QAAQ,KAAKtE,KAAKoE,IAAAA,CAAAA,CAAAA;EACpC;EAEQnC,kBAA0C;AAChD,WAAWoC,QAAI,KAAK5F,aAAa;EACnC;EAEQiC,WAAW3B,IAAuC;AACxD,WAAO,KAAKiB,KAAK,KAAKzC,YAAY,EAAEyG,KAAK,CAAC1E,WAAWA,OAAOR,KAAKC,OAAOA,EAAAA;EAC1E;EAEQwF,oBAA2C;AACjD,UAAM3E,SAAS,KAAKI,KAAK,KAAKrC,WAAW;AACzC,WAAO,KAAKqC,KAAK,KAAKtC,YAAY,EAAEgE,OAAO,CAACb,WAAWjB,OAAOgB,SAASC,OAAO9B,EAAE,CAAA;EAClF;EAEQyF,sBAA6C;AACnD,UAAM5E,SAAS,KAAKI,KAAK,KAAKrC,WAAW;AACzC,WAAO,KAAKqC,KAAK,KAAKtC,YAAY,EAAEgE,OAAO,CAACb,WAAW,CAACjB,OAAOgB,SAASC,OAAO9B,EAAE,CAAA;EACnF;EAEQwE,yBAAyBxB,KAAoC;AACnE,WAAO,KAAKwC,kBAAiB,EAAG7C,OAAO,CAACb,WACtB4D,UAAU5D,OAAO6D,WAAW,EAAE7F,IAAoBmD,QAAQ,EAAEpB,SAASmB,GAAAA,CAAAA;EAEzF;EAEQ4C,2BAA2B5C,KAAoC;AACrE,WAAO,KAAKyC,oBAAmB,EAAG9C,OAAO,CAACb,WACxB4D,UAAU5D,OAAO6D,WAAW,EAAE7F,IAAoBmD,QAAQ,EAAEpB,SAASmB,GAAAA,CAAAA;EAEzF;EAEQhB,yBAAyBF,QAAmC;AAClE,UAAM+D,mBAAmCH,UAAU5D,OAAO6D,WAAW,EAClE7F,IAAoBmD,QAAQ,EAC5BN,OAAO,CAACK,QAAQ,KAAK/B,KAAK,KAAKpC,gBAAgB,EAAEgD,SAASmB,GAAAA,CAAAA;AAE7D,UAAMjC,eAAqB+E,mBAAa,IAAIC,IAAIF,gBAAAA,CAAAA,EAAmBlD,OAAO,CAACT,UAAAA;AACzE,YAAM8D,UAAU,KAAK/E,KAAK,KAAKnC,iBAAiB;AAChD,aAAO,CAACkH,QAAQnE,SAASK,KAAAA;IAC3B,CAAA;AACA,QAAInB,aAAakF,SAAS,GAAG;AAC3BvE,MAAAA,KAAI,iBAAiB;QAAEO,QAAQlB;MAAa,GAAA;;;;;;AAC5C,WAAKa,QAAQ,KAAK9C,mBAAmB,CAACoH,YAAY;WAAIA;WAAYnF;OAAa;IACjF;EACF;EAEQoF,mBAAmBnD,KAAmB;AAC5C,UAAMoD,eAAe,KAAKnF,KAAK,KAAKnC,iBAAiB,EAAE4D,UAAU,CAACR,UAAUA,UAAUc,GAAAA;AACtF,QAAIoD,iBAAiB,IAAI;AACvB,WAAKxE,QAAQ,KAAK9C,mBAAmB,CAACkH,YAAYA,QAAQrD,OAAO,CAACT,UAAUA,UAAUc,GAAAA,CAAAA;IACxF;EACF;;;;EAMQ4B,gCAAqD;AAC3D,WAAcnD,YAAI,MAAM,aAAA;AACtB,YAAM4E,iBAAiB,OAAWf,QAAI,KAAK/F,eAAe;AAC1D,aAAce,gBAAQ+F,gBAAgB,CAACjD,UAAgBkD,gBAAUlD,KAAAA,GAAQ;QACvEhB,aAAa;MACf,CAAA;IACF,CAAA;EACF;EAEQmE,YACNC,KACApD,OACqB;AACrB,WAAWqD,WAAOD,KAAK,CAACE,WAAW;SAAIA;MAAQtD;KAAM;EACvD;EAEQuD,cACNH,KACApD,OACqB;AACrB,WAAWqD,WAAOD,KAAK,CAACE,WAAWA,OAAO/D,OAAO,CAACiE,iBAAiBA,iBAAiBxD,KAAAA,CAAAA;EACtF;;;;EAMQ5C,WAAWD,QAA6B;AAC9CmB,IAAAA,KAAI,cAAc;MAAE1B,IAAIO,OAAOR,KAAKC;IAAG,GAAA;;;;;;AAEvC,SAAK4B,QAAQ,KAAKpD,cAAc,CAACoB,YAAaA,QAAQiC,SAAStB,MAAAA,IAAUX,UAAU;SAAIA;MAASW;KAAO;EACzG;EAEQiC,cAAcxC,IAAkB;AACtC0B,IAAAA,KAAI,iBAAiB;MAAE1B;IAAG,GAAA;;;;;;AAC1B,SAAK4B,QAAQ,KAAKpD,cAAc,CAACoB,YAAYA,QAAQ+C,OAAO,CAACpC,WAAWA,OAAOR,KAAKC,OAAOA,EAAAA,CAAAA;EAC7F;EAEQ+B,WAAWD,QAAmC;AACpDJ,IAAAA,KAAI,cAAc;MAAE1B,IAAI8B,OAAO9B;IAAG,GAAA;;;;;;AAElC,SAAK4B,QAAQ,KAAKjD,cAAc,CAACiC,YAAaA,QAAQiB,SAASC,MAAAA,IAAUlB,UAAU;SAAIA;MAASkB;KAAO;EACzG;EAEQgB,cAAc9C,IAAkB;AACtC0B,IAAAA,KAAI,iBAAiB;MAAE1B;IAAG,GAAA;;;;;;AAC1B,SAAK4B,QAAQ,KAAKjD,cAAc,CAACiC,YAAYA,QAAQ+B,OAAO,CAACb,WAAWA,OAAO9B,OAAOA,EAAAA,CAAAA;EACxF;;;;EAMQqD,eACNL,KACAD,QACAK,OAC+B;AAC/B,WAAc3B,YAAI,MAAM,aAAA;AACtB,aAAO,KAAK8E,YAAY,KAAKhH,iBAAiB6D,KAAAA;AAC9C1B,MAAAA,KAAI,cAAc;QAAEsB;QAAK,GAAGD;MAAO,GAAA;;;;;;AACnC,aAAW0D,WAAO,KAAKrH,mBAAmB,CAACyH,eAAqBC,aAAOD,YAAY7D,GAAAA,CAAAA;AACnF,WAAKmD,mBAAmBnD,GAAAA;AAExB,YAAM+D,mBAAmB,OAAO,KAAK3H;AACrC,YAAM4H,oBAAoB,OAAO,KAAK1H;AACtC,YAAMsB,UAAU,KAAKqG,yBAAyBjE,KAAK+D,kBAAkBC,iBAAAA;AACrE,UAAIpG,QAAQqF,WAAW,GAAG;AACxBvE,QAAAA,KAAI,0BAA0B;UAAEsB;QAAI,GAAA;;;;;;AACpC,YAAI,CAAC,KAAK/B,KAAK,KAAKpC,gBAAgB,EAAEgD,SAASmB,GAAAA,GAAM;AACnD,eAAKpB,QAAQ,KAAK/C,kBAAkB,CAACoD,WAAW;eAAIA;YAAQe;WAAI;QAClE;AACA,eAAO;MACT;AAEA,aAAO,OAAO,KAAKkE,yBAAyBlE,KAAKpC,SAASmG,gBAAAA;IAC5D,CAAA,EAAG3G,KACMgF,iBACE3E,YAAI;MACT,KAAKkG,cAAc,KAAKpH,iBAAiB6D,KAAAA;MACrCqD,WAAO,KAAKrH,mBAAmB,CAACyH,eAAqBlE,aAAOkE,YAAY,CAAC3E,UAAUA,UAAUc,GAAAA,CAAAA;KAClG,CAAA,CAAA;EAGP;EAEQkE,yBACNlE,KACApC,SACAmG,kBAC+B;AAC/B,UAAMI,sBAAsBvG,QAAQd,IAAI,CAACgC,WAAWA,OAAO9B,EAAE;AAC7D,WAAcyB,YAAI,MAAM,aAAA;AACtB,aAAWgF,WAAO,KAAKnH,oBAAoB,CAACuH,eAAqBO,gBAAUP,YAAYM,mBAAAA,CAAAA;AAEvFzF,MAAAA,KAAI,sBAAsB;QAAEsB;QAAKpC,SAASuG;MAAoB,GAAA;;;;;;AAC9DE,kBAAYC,KAAK,SAAStE,GAAAA,QAAW;AACrC,aAAcuE,eAAQ,KAAKpJ,YAAY;QAAE+D,OAAOc;QAAKwE,OAAO;MAAa,CAAA;AAEzE,aAAO,KAAKC,uBAAuBzE,KAAK,KAAK0E,iBAAiB9G,SAASmG,gBAAAA,GAAmB,QAAA;AAE1F,YAAMzI,eAAe,OAAO,KAAKqJ,4BAA4B3E,KAAKpC,OAAAA;AAClE,aAAO,KAAKgH,kCAAkChH,SAAStC,YAAAA;AAEvD,aAAO,KAAKmJ,uBAAuBzE,KAAK,KAAK6E,gBAAgBjH,SAASmG,gBAAAA,GAAmB,OAAA;AAEzF,UAAI,CAAC,KAAK9F,KAAK,KAAKpC,gBAAgB,EAAEgD,SAASmB,GAAAA,GAAM;AACnD,aAAKpB,QAAQ,KAAK/C,kBAAkB,CAACoD,WAAW;aAAIA;UAAQe;SAAI;MAClE;AAEAqE,kBAAYC,KAAK,SAAStE,GAAAA,MAAS;AACnCqE,kBAAYS,QAAQ,SAAS9E,GAAAA,IAAO,SAASA,GAAAA,UAAa,SAASA,GAAAA,MAAS;AAC5E,aAAcuE,eAAQ,KAAKpJ,YAAY;QAAE+D,OAAOc;QAAKwE,OAAO;MAAY,CAAA;AACxE9F,MAAAA,KAAI,aAAa;QAAEsB;MAAI,GAAA;;;;;;AAEvB,aAAO;IACT,CAAA,EAAG5C,KACMgF,iBACDqB,WAAO,KAAKnH,oBAAoB,CAACuH,eAC7BlE,aAAOkE,YAAY,CAAC/E,WAAW,CAACqF,oBAAoBtF,SAASC,MAAAA,CAAAA,CAAAA,CAAAA,CAAAA;EAI3E;EAEQmF,yBACNjE,KACA+D,kBACAC,mBACuB;AACvB,WAAO,KAAKpB,2BAA2B5C,GAAAA,EAAKL,OAAO,CAACb,WAAAA;AAClD,YAAMiG,QAAwBC,QAAQlG,OAAO6D,WAAW;AACxD,UAAI,CAACoC,OAAO;AACV,eAAO;MACT;AAIA,YAAM9F,SAAyByD,UAAU5D,OAAO6D,WAAW,EAAEhD,OAC3D,CAACT,UAA0Be,SAASf,KAAAA,MAAWc,GAAAA;AAEjD,aACEf,OAAOqC,MACL,CAACpC,UACC,KAAKjB,KAAK,KAAKpC,gBAAgB,EAAEgD,SAAyBoB,SAASf,KAAAA,CAAAA,KACnE6E,iBAAiBlF,SAAyBoB,SAASf,KAAAA,CAAAA,CAAAA,KAClD,CAAC8E,kBAAkBnF,SAASC,OAAO9B,EAAE;IAE9C,CAAA;EACF;EAEQ0H,iBACN9G,SACAmG,kBACmC;AACnC,WAAgB3G,cACdQ,SACMqH,cAAQ,CAACnG,WAAWA,OAAOoG,yBAAyB,CAAA,CAAE,GACpDpC,sBACAqC,kBACFxF,aAAO,CAACT,UAAU,CAAC6E,iBAAiBlF,SAAyBoB,SAASf,KAAAA,CAAAA,CAAAA,CAAAA;EAEhF;EAEQ2F,gBACNjH,SACAmG,kBACmC;AACnC,WAAgB3G,cACdQ,SACMqH,cAAQ,CAACnG,WAAWA,OAAOsG,wBAAwB,CAAA,CAAE,GACnDtC,sBACAqC,kBACFxF,aAAO,CAACT,UAAU,CAAC6E,iBAAiBlF,SAAyBoB,SAASf,KAAAA,CAAAA,CAAAA,CAAAA;EAEhF;EAEQuF,uBACNzE,KACAf,QACAoG,OAC4B;AAC5B,UAAMC,WAAWD,UAAU,WAAW,0BAA0B;AAChE,UAAMpF,YAAWoF,UAAU,WAAW,iBAAiB;AACvD,WAAgBjI,cACd6B,QACMnC,UAAI,CAACoC,UAAU,KAAKC,SAASD,OAAOmG,UAAU,WAAW;MAAEE,QAAQvF;IAAI,IAAI;MAAEwF,OAAOxF;IAAI,CAAA,CAAA,GACvFyF,gBAAQ;MAAErG,aAAa;IAAY,CAAA,GAC1CkB,SACSC,cAAeC,iBAAQ,EAAA,CAAA,EAAKpD,KAC1BqD,gBACEC,aAAK,MACVhC,KAAIiC,KAAK,GAAG2E,QAAAA,0BAAkC;MAC5CpG,OAAOc;MACP,CAACC,SAAAA,GAAWhB,OAAOnC,IAAoBmD,QAAQ;IACjD,GAAA;;;;;YAKDyF,cAAM;EAEjB;;;;EAMQf,4BACN3E,KACApC,SAC0C;AAC1C,WAAgBR,cACdQ,SACMd,UAAI,CAAC6I,QAAQ,KAAKC,YAAYD,GAAAA,CAAAA,GAC7BF,gBAAQ;MAAErG,aAAa;IAAY,CAAA,GACnCyG,iBAAS,CAACC,UAAAA;AACf,aAAcrH,YAAI,MAAM,aAAA;AACtB,eAAc8F,eAAQ,KAAKpJ,YAAY;UAAE+D,OAAOc;UAAKwE,OAAO;UAASsB;QAAM,CAAA;AAC3E,eAAO,OAAcC,aAAKD,KAAAA;MAC5B,CAAA;IACF,CAAA,CAAA;EAEJ;EAEQlB,kCACNhH,SACAtC,cAC4B;AAC5B,WAAgB8B;MACdQ;MACMoI,UAAI1K,YAAAA;MACJwB,UAAI,CAAC,CAACgC,QAAQmH,aAAAA,MAAmB,KAAKC,wBAAwBpH,QAAQmH,aAAAA,CAAAA;MAOrExI;MACAiI;IAAM;EAEjB;EAEQS,oBAAoBC,UAAuD;AACjF,QAAIC,YAAY,KAAKlK,kBAAkBmG,IAAI8D,QAAAA;AAC3C,QAAI,CAACC,WAAW;AACdA,kBAAmBjL,gBAAeqB,sBAAc,CAAA,CAAA;AAChD,WAAKN,kBAAkBwF,IAAIyE,UAAUC,SAAAA;IACvC;AACA,WAAOA;EACT;EAEQT,cAAc,CAAC9G,WACdL,YAAI,MAAM,aAAA;AACf,UAAM4H,YAAY,KAAKF,oBAAoBrH,OAAO9B,EAAE;AAGpD,UAAMsJ,kBAAkB,OAAc7H,YAAI,MAAM,aAAA;AAC9C,YAAM8H,WAAW,KAAKrK,eAAeoG,IAAIxD,OAAO9B,EAAE;AAClD,UAAIuJ,UAAU;AACZ,eAAOA;MACT;AAGA,YAAMC,WAAW,OAAgBnK,eAAI;AACrC,WAAKH,eAAeyF,IAAI7C,OAAO9B,IAAIwJ,QAAAA;AAEnC,YAAMC,aAAoBhI,YAAI,MAAM,aAAA;AAClCC,QAAAA,KAAI,kBAAkB;UAAEI,QAAQA,OAAO9B;QAAG,GAAA;;;;;;AAC1CqH,oBAAYC,KAAK,UAAUxF,OAAO9B,EAAE,QAAQ;AAC5C,eAAcuH,eAAQ,KAAKpJ,YAAY;UAAE+D,OAAO;UAAIsF,OAAO;UAAc1F,QAAQA,OAAO9B;QAAG,CAAA;AAC3F,cAAM,CAAC0J,UAAUpL,YAAAA,IAAgB,OAAOwD,OACrCK,SAAQ,EACR/B,KACQuJ,uBAA0BC,SAAS,KAAKtL,YAAY,GACpDqL,uBAAsBC,UAAS,IAAI,GACnCC,aAAK;AAEhB,cAAMC,aAAaxL,gBAAgB,OAAO,CAAA,IAAWyL,cAAQzL,YAAAA,IAAgBA,eAAe;UAACA;;AAC7F,cAAM0L,UAAmBC,kBAASP,QAAAA;AAClCrC,oBAAYC,KAAK,UAAUxF,OAAO9B,EAAE,MAAM;AAC1CqH,oBAAYS,QAAQ,UAAUhG,OAAO9B,EAAE,IAAI,UAAU8B,OAAO9B,EAAE,UAAU,UAAU8B,OAAO9B,EAAE,MAAM;AACjG,eAAcuH,eAAQ,KAAKpJ,YAAY;UAAE+D,OAAO;UAAIsF,OAAO;UAAa1F,QAAQA,OAAO9B;QAAG,CAAA;AAC1F0B,QAAAA,KAAI,iBAAiB;UACnBI,QAAQA,OAAO9B;UACfgK;UACAE,QAAQ;QACV,GAAA;;;;;;AACA,eAAOJ;MACT,CAAA,EAAG1J,KACM+J,iBAAS,2BAAA,GAChB7G,SACSC,cAAeC,iBAAQ,EAAA,CAAA,EAAKpD,KAC1BqD,gBACEC,aAAK,MAAMhC,KAAIiC,KAAK,4CAA4C;QAAE7B,QAAQA,OAAO9B;MAAG,GAAA;;;;;cAIjG4D,YAAYC,cAAc;QACxBC,MAAMhC,OAAO9B;QACb+D,UAAU;UACRC,UAAU;UACVC,OAAO;UACPC,YAAY;UACZC,OAAO;QACT;MACF,CAAA,CAAA;AAIF,YAAMf,QAAQ,OAAcgH,mBAC1BX,WAAWrJ,KACFiK,YAAI,CAAC/H,WAAoBgI,kBAAQd,UAAUlH,MAAAA,CAAAA,GAC3CiI,sBAAc,CAACC,UAAAA;AACpB,cAAM1B,QAAc2B,aAAOD,KAAAA;AAC3B9I,QAAAA,KAAIoH,MAAM,6BAA6B;UACrChH,QAAQA,OAAO9B;UACf8I,OAAOA,iBAAiB4B,QAAQ5B,MAAM6B,UAAUC,OAAO9B,KAAAA;UACvD+B,OAAO/B,iBAAiB4B,QAAQ5B,MAAM+B,QAAQC;UAC9CC,UAAU,CAAOC,gBAAUR,KAAAA;QAC7B,GAAA;;;;;;AACA,eAAgBzB,eAAKS,UAAUV,iBAAiB4B,QAAQ5B,QAAQ,IAAI4B,MAAME,OAAO9B,KAAAA,CAAAA,CAAAA;MACnF,CAAA,CAAA,CAAA;AAGJ,aAAO,KAAKvC,YAAY,KAAKhH,iBAAiB6D,KAAAA;AAC9C,aAAcgH,mBACNa,YAAM7H,KAAAA,EAAOhD,KAAYqD,gBAAQ,MAAM,KAAKkD,cAAc,KAAKpH,iBAAiB6D,KAAAA,CAAAA,CAAAA,CAAAA;AAGxF,aAAOoG;IACT,CAAA,EAAGpJ,KAAKiJ,UAAU3E,YAAY,CAAA,CAAA;AAG9B,WAAO,OAAgBuG,gBAAM3B,eAAAA;EAC/B,CAAA;EAEMJ,wBACNpH,QACAxD,cAC4B;AAC5B,WAAcmD,YAAI,MAAM,aAAA;AACtBnD,mBAAagC,QAAQ,CAAC4K,eAAAA;AACpB,aAAK5M,aAAa6M,WAAW;UAAErJ,QAAQA,OAAO9B;UAAI,GAAGkL;QAAW,CAAA;MAClE,CAAA;AACA,WAAKtJ,QAAQ,KAAKhD,aAAa,CAACiC,WAAW;WAAIA;QAAQiB,OAAO9B;OAAG;AACjE,WAAKhB,cAAc2F,IAAI7C,OAAO9B,IAAI1B,YAAAA;IACpC,CAAA;EACF;EAEQ+F,kBAAkBvC,QAA4D;AACpF,WAAcL,YAAI,MAAM,aAAA;AACtB,YAAMzB,KAAK8B,OAAO9B;AAClB0B,MAAAA,KAAI,gBAAgB;QAAE1B;MAAG,GAAA;;;;;;AACzB,WAAKd,eAAekM,OAAOpL,EAAAA;AAE3B,YAAM1B,eAAe,KAAKU,cAAcsG,IAAItF,EAAAA;AAC5C,UAAI1B,cAAc;AAChB,mBAAW4M,cAAc5M,cAAc;AACrC,eAAKA,aAAa+D,OAAO6I,WAAWG,WAAWH,WAAWI,cAAc;AACxE,gBAAMC,UAAUL,WAAWrI,aAAU,KAAeyH,gBAAQQ,MAAAA;AAC5D,iBAAOS;QACT;AACA,aAAKvM,cAAcoM,OAAOpL,EAAAA;MAC5B;AAEA,YAAMwL,cAAc,KAAKvK,KAAK,KAAKrC,WAAW,EAAE8D,UAAU,CAACR,UAAUA,UAAUlC,EAAAA;AAC/E,UAAIwL,gBAAgB,IAAI;AACtB,aAAK5J,QAAQ,KAAKhD,aAAa,CAACiC,WAAWA,OAAO8B,OAAO,CAACT,UAAUA,UAAUlC,EAAAA,CAAAA;MAChF;AAEA0B,MAAAA,KAAI,eAAe;QAAE1B;MAAG,GAAA;;;;;;AACxB,aAAO;IACT,CAAA;EACF;AACF;AAKO,IAAMX,QAAO,CAACoM,YAA2C,IAAIvN,YAAYuN,OAAAA;AAOhF,IAAMnI,WACJ,CAAKoI,mBACL,CAAWC,WACFlK,YAAI,aAAA;AACT,QAAMmK,gBAAgB,OAAcC,aAAKH,cAAAA;AACzC,QAAMpJ,SAAS,OAAOqJ;AACtB,SAAarF,gBAAUsF,aAAAA;AACvB,SAAOtJ;AACT,CAAA;",
6
+ "names": ["make", "Atom", "Registry", "Array", "Cause", "Deferred", "Duration", "Effect", "Fiber", "Function", "HashSet", "PubSub", "Ref", "runAndForwardErrors", "Performance", "log", "make", "Atom", "Deferred", "Effect", "invariant", "log", "CapabilityManagerImpl", "_registry", "_capabilityEntries", "family", "pipe", "keepAlive", "_capabilities", "id", "get", "current", "map", "c", "implementation", "_capabilitiesByModule", "entries", "result", "entry", "moduleId", "push", "_capability", "length", "registry", "contribute", "module", "interface", "interfaceDef", "identifier", "isDuplicate", "some", "set", "count", "remove", "next", "filter", "warn", "atom", "getAll", "capabilities", "waitFor", "gen", "capability", "deferred", "cancel", "subscribe", "runSync", "succeed", "await", "atomByModule", "options", "ManagerTypeId", "Symbol", "for", "isManager", "value", "ManagerImpl", "activation", "runSync", "unbounded", "capabilities", "registry", "_pluginsAtom", "_coreAtom", "_enabledAtom", "_modulesAtom", "_activeAtom", "_eventsFiredAtom", "_pendingResetAtom", "_pluginLoader", "_capabilities", "Map", "_moduleMemoMap", "_moduleSemaphores", "_activatingEvents", "make", "_activatingModules", "_inFlightFibers", "_shutdownSemaphore", "makeSemaphore", "_shuttingDown", "pluginLoader", "plugins", "core", "map", "meta", "id", "enabled", "Registry", "Atom", "pipe", "keepAlive", "forEach", "plugin", "_addPlugin", "all", "enable", "runAndForwardErrors", "modules", "active", "eventsFired", "pendingReset", "getPlugins", "_get", "getCore", "getEnabled", "getModules", "getActive", "getEventsFired", "getPendingReset", "add", "gen", "log", "_getPlugin", "_update", "includes", "module", "_addModule", "_setPendingResetByModule", "events", "event", "activate", "concurrency", "remove", "result", "disable", "_removePlugin", "enabledIndex", "findIndex", "filter", "item", "deactivate", "_removeModule", "params", "key", "eventKey", "_isShuttingDown", "withFiberRuntime", "fiber", "_activateEvent", "together", "sleep", "seconds", "andThen", "sync", "warn", "Performance", "addTrackEntry", "name", "devtools", "dataType", "track", "trackGroup", "color", "results", "_deactivateModule", "every", "reset", "_getActiveModulesByEvent", "shutdown", "withPermits", "set", "_interruptInFlightActivations", "activeIds", "reverse", "allModules", "modulesToDeactivate", "find", "_set", "clear", "ensuring", "atom", "get", "updater", "_getActiveModules", "_getInactiveModules", "getEvents", "activatesOn", "_getInactiveModulesByEvent", "activationEvents", "fromIterable", "Set", "pending", "length", "current", "_clearPendingReset", "pendingIndex", "inFlightFibers", "interrupt", "_trackFiber", "ref", "update", "fibers", "_untrackFiber", "trackedFiber", "activating", "append", "activatingEvents", "activatingModules", "_getModulesForActivation", "_activateModulesForEvent", "activatingModuleIds", "appendAll", "performance", "mark", "publish", "state", "_activateRelatedEvents", "_getBeforeEvents", "_loadCapabilitiesForModules", "_contributeCapabilitiesForModules", "_getAfterEvents", "measure", "allOf", "isAllOf", "flatMap", "firesBeforeActivation", "toValues", "firesAfterActivation", "phase", "logLabel", "before", "after", "allWith", "asVoid", "mod", "_loadModule", "catchAll", "error", "fail", "zip", "capabilitySet", "_contributeCapabilities", "_getModuleSemaphore", "moduleId", "semaphore", "deferredToAwait", "existing", "deferred", "loadEffect", "duration", "provideService", "Service", "timed", "normalized", "isArray", "elapsed", "toMillis", "failed", "withSpan", "forkDaemon", "tap", "succeed", "catchAllCause", "cause", "squash", "Error", "message", "String", "stack", "undefined", "isDefect", "isFailure", "await", "capability", "contribute", "delete", "interface", "implementation", "program", "activeIndex", "options", "togetherEffect", "effect", "togetherFiber", "fork"]
7
+ }
@@ -0,0 +1,397 @@
1
+ import {
2
+ PluginManagerProvider,
3
+ topologicalSort,
4
+ usePluginManager
5
+ } from "./chunk-QRTB4Q3U.mjs";
6
+ import {
7
+ PluginManagerContext
8
+ } from "./chunk-TGX63LTL.mjs";
9
+ import {
10
+ capabilities_exports
11
+ } from "./chunk-JKWMHZP6.mjs";
12
+ import {
13
+ activation_events_exports
14
+ } from "./chunk-I34GF4NG.mjs";
15
+ import {
16
+ plugin_manager_exports
17
+ } from "./chunk-7B6AJK4D.mjs";
18
+
19
+ // src/ui/components/App/App.tsx
20
+ import React2, { useEffect as useEffect3 } from "react";
21
+
22
+ // src/ui/hooks/useApp.tsx
23
+ import { RegistryContext } from "@effect-atom/atom-react";
24
+ import * as Effect from "effect/Effect";
25
+ import * as Fiber from "effect/Fiber";
26
+ import * as PubSub from "effect/PubSub";
27
+ import * as Queue from "effect/Queue";
28
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
29
+ import { runAndForwardErrors } from "@dxos/effect";
30
+ import { invariant } from "@dxos/invariant";
31
+ import { log } from "@dxos/log";
32
+ import { ErrorBoundary, ErrorFallback } from "@dxos/react-error-boundary";
33
+ import { useAsyncEffect, useDefaultValue } from "@dxos/react-hooks";
34
+ import { ContextProtocolProvider } from "@dxos/web-context-react";
35
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/ui/hooks/useApp.tsx";
36
+ var ENABLED_KEY = "org.dxos.app-framework.enabled";
37
+ var useApp = ({ pluginManager, pluginLoader: pluginLoaderProp, plugins: pluginsProp, core: coreProp, defaults: defaultsProp, setupEvents: setupEventsProp, placeholder, fallback = ErrorFallback, cacheEnabled = false, safeMode = false, debounce = 0, timeout = 3e4 }) => {
38
+ const plugins = useDefaultValue(pluginsProp, () => []);
39
+ const core = useDefaultValue(coreProp, () => plugins.map(({ meta }) => meta.id));
40
+ const defaults = useDefaultValue(defaultsProp, () => []);
41
+ const setupEvents = useDefaultValue(setupEventsProp, () => []);
42
+ const pluginLoader = useMemo(() => pluginLoaderProp ?? ((id) => Effect.sync(() => {
43
+ const plugin = plugins.find((plugin2) => plugin2.meta.id === id);
44
+ invariant(plugin, `Plugin not found: ${id}`, {
45
+ F: __dxlog_file,
46
+ L: 111,
47
+ S: void 0,
48
+ A: [
49
+ "plugin",
50
+ "`Plugin not found: ${id}`"
51
+ ]
52
+ });
53
+ return plugin;
54
+ })), [
55
+ pluginLoaderProp,
56
+ plugins
57
+ ]);
58
+ const readyRef = useRef(false);
59
+ const [ready, setReady] = useState(false);
60
+ const errorRef = useRef(null);
61
+ const [error, setError] = useState(null);
62
+ const [startupProgress, setStartupProgress] = useState({
63
+ activated: 0,
64
+ total: 0,
65
+ progress: 0
66
+ });
67
+ const cached = useMemo(() => JSON.parse(localStorage.getItem(ENABLED_KEY) ?? "[]"), []);
68
+ const enabled = useMemo(() => safeMode ? [] : cacheEnabled && cached.length > 0 ? cached : defaults, [
69
+ safeMode,
70
+ cacheEnabled,
71
+ cached,
72
+ defaults
73
+ ]);
74
+ const isExternalManager = !!pluginManager;
75
+ const manager = useMemo(() => {
76
+ const mgr = pluginManager ?? plugin_manager_exports.make({
77
+ pluginLoader,
78
+ plugins,
79
+ core,
80
+ enabled
81
+ });
82
+ log("useApp: useMemo created/reused manager", {
83
+ provided: !!pluginManager
84
+ }, {
85
+ F: __dxlog_file,
86
+ L: 135,
87
+ S: void 0,
88
+ C: (f, a) => f(...a)
89
+ });
90
+ return mgr;
91
+ }, [
92
+ pluginManager,
93
+ pluginLoader,
94
+ plugins,
95
+ core,
96
+ enabled
97
+ ]);
98
+ useEffect(() => {
99
+ if (!cacheEnabled) {
100
+ return;
101
+ }
102
+ return manager.registry.subscribe(manager.enabled, (value) => {
103
+ localStorage.setItem(ENABLED_KEY, JSON.stringify(value));
104
+ });
105
+ }, [
106
+ cacheEnabled,
107
+ manager
108
+ ]);
109
+ useEffect(() => {
110
+ setupDevtools(manager);
111
+ }, [
112
+ manager
113
+ ]);
114
+ useAsyncEffect(async () => {
115
+ log("useApp: effect mount", void 0, {
116
+ F: __dxlog_file,
117
+ L: 153,
118
+ S: void 0,
119
+ C: (f, a) => f(...a)
120
+ });
121
+ manager.capabilities.contribute({
122
+ interface: capabilities_exports.PluginManager,
123
+ implementation: manager,
124
+ module: "org.dxos.app-framework.plugin-manager"
125
+ });
126
+ manager.capabilities.contribute({
127
+ interface: capabilities_exports.AtomRegistry,
128
+ implementation: manager.registry,
129
+ module: "org.dxos.app-framework.atom-registry"
130
+ });
131
+ const fiber = Effect.gen(function* () {
132
+ const queue = yield* PubSub.subscribe(manager.activation);
133
+ const listener = yield* Effect.forkDaemon(Queue.take(queue).pipe(Effect.tap(({ event, state, module, error: error$ }) => Effect.sync(() => {
134
+ if (event === activation_events_exports.Startup.id && state === "activated") {
135
+ clearTimeout(timeoutId);
136
+ setReady(true);
137
+ readyRef.current = true;
138
+ globalThis.composer?.profiler?.dump();
139
+ if (typeof window !== "undefined") {
140
+ window.dispatchEvent(new CustomEvent("app-framework:startup-activated"));
141
+ }
142
+ return;
143
+ }
144
+ if (module && state === "activated" && !readyRef.current) {
145
+ const active = manager.getActive();
146
+ const total = manager.getModules().length;
147
+ setStartupProgress({
148
+ activated: active.length,
149
+ total,
150
+ progress: total > 0 ? active.length / total : 0,
151
+ status: humanizeModuleId(module)
152
+ });
153
+ }
154
+ if (error$ && !readyRef.current) {
155
+ setError(error$);
156
+ errorRef.current = error$;
157
+ }
158
+ })), Effect.forever));
159
+ yield* Effect.all([
160
+ ...setupEvents.map((event) => manager.activate(event)),
161
+ manager.activate(activation_events_exports.SetupReactSurface),
162
+ manager.activate(activation_events_exports.Startup)
163
+ ]);
164
+ return yield* Fiber.join(listener);
165
+ }).pipe(Effect.scoped, Effect.runFork);
166
+ const timeoutId = setTimeout(() => {
167
+ if (!readyRef.current && !errorRef.current) {
168
+ log.warn("startup timeout diagnostic", {
169
+ eventsFired: manager.getEventsFired(),
170
+ activeModules: manager.getActive(),
171
+ pendingReset: manager.getPendingReset()
172
+ }, {
173
+ F: __dxlog_file,
174
+ L: 223,
175
+ S: void 0,
176
+ C: (f, a) => f(...a)
177
+ });
178
+ void runAndForwardErrors(Fiber.interrupt(fiber));
179
+ setError(new Error(`Startup timed out after ${timeout}ms`));
180
+ }
181
+ }, timeout);
182
+ return () => {
183
+ log("useApp: effect cleanup", void 0, {
184
+ F: __dxlog_file,
185
+ L: 234,
186
+ S: void 0,
187
+ C: (f, a) => f(...a)
188
+ });
189
+ clearTimeout(timeoutId);
190
+ void runAndForwardErrors(Fiber.interrupt(fiber));
191
+ if (!isExternalManager) {
192
+ void runAndForwardErrors(manager.shutdown());
193
+ }
194
+ };
195
+ }, [
196
+ manager
197
+ ]);
198
+ return useCallback(() => /* @__PURE__ */ React.createElement(ErrorBoundary, {
199
+ name: "app",
200
+ FallbackComponent: fallback
201
+ }, /* @__PURE__ */ React.createElement(PluginManagerProvider, {
202
+ value: manager
203
+ }, /* @__PURE__ */ React.createElement(ContextProtocolProvider, {
204
+ value: manager,
205
+ context: PluginManagerContext
206
+ }, /* @__PURE__ */ React.createElement(RegistryContext.Provider, {
207
+ value: manager.registry
208
+ }, /* @__PURE__ */ React.createElement(App, {
209
+ placeholder,
210
+ ready,
211
+ error,
212
+ debounce,
213
+ progress: startupProgress
214
+ }))))), [
215
+ fallback,
216
+ manager,
217
+ placeholder,
218
+ ready,
219
+ error
220
+ ]);
221
+ };
222
+ var setupDevtools = (manager) => {
223
+ globalThis.composer ??= {};
224
+ globalThis.composer.manager = manager;
225
+ };
226
+ var humanizeModuleId = (moduleId) => {
227
+ const pluginMatch = moduleId.match(/\.plugin\.([^.]+)\./);
228
+ if (pluginMatch) {
229
+ const name = pluginMatch[1];
230
+ return name.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
231
+ }
232
+ const parts = moduleId.split(".");
233
+ return parts[parts.length - 1];
234
+ };
235
+
236
+ // src/ui/hooks/useCapabilities.ts
237
+ import { useAtomValue } from "@effect-atom/atom-react";
238
+ import { useCallback as useCallback2 } from "react";
239
+ import { invariant as invariant2 } from "@dxos/invariant";
240
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/app-framework/src/ui/hooks/useCapabilities.ts";
241
+ var useCapabilities = (interfaceDef) => {
242
+ const manager = usePluginManager();
243
+ return useAtomValue(manager.capabilities.atom(interfaceDef));
244
+ };
245
+ var useCapability = (interfaceDef) => {
246
+ const capabilities = useCapabilities(interfaceDef);
247
+ invariant2(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`, {
248
+ F: __dxlog_file2,
249
+ L: 30,
250
+ S: void 0,
251
+ A: [
252
+ "capabilities.length > 0",
253
+ "`No capability found for ${interfaceDef.identifier}`"
254
+ ]
255
+ });
256
+ return capabilities[0];
257
+ };
258
+ var useAtomCapability = (atomCapability) => {
259
+ const atom = useCapability(atomCapability);
260
+ return useAtomValue(atom);
261
+ };
262
+ var useAtomCapabilityState = (atomCapability) => {
263
+ const registry = useCapability(capabilities_exports.AtomRegistry);
264
+ const atom = useCapability(atomCapability);
265
+ const value = useAtomValue(atom);
266
+ const update = useCallback2((fn) => {
267
+ registry.set(atom, fn(registry.get(atom)));
268
+ }, [
269
+ registry,
270
+ atom
271
+ ]);
272
+ return [
273
+ value,
274
+ update
275
+ ];
276
+ };
277
+ var useOperationInvoker = () => useCapability(capabilities_exports.OperationInvoker);
278
+
279
+ // src/ui/hooks/useLoading.tsx
280
+ import { useEffect as useEffect2, useState as useState2 } from "react";
281
+ var LoadingState = /* @__PURE__ */ (function(LoadingState2) {
282
+ LoadingState2[LoadingState2["Loading"] = 0] = "Loading";
283
+ LoadingState2[LoadingState2["FadeIn"] = 1] = "FadeIn";
284
+ LoadingState2[LoadingState2["FadeOut"] = 2] = "FadeOut";
285
+ LoadingState2[LoadingState2["Done"] = 3] = "Done";
286
+ return LoadingState2;
287
+ })({});
288
+ var useLoading = (ready, debounce = 0) => {
289
+ const [stage, setStage] = useState2(0);
290
+ useEffect2(() => {
291
+ if (!debounce) {
292
+ return;
293
+ }
294
+ const i = setInterval(() => {
295
+ setStage((stage2) => {
296
+ switch (stage2) {
297
+ case 0: {
298
+ if (!ready) {
299
+ return 1;
300
+ } else {
301
+ clearInterval(i);
302
+ return 3;
303
+ }
304
+ }
305
+ case 1: {
306
+ if (ready) {
307
+ return 2;
308
+ }
309
+ break;
310
+ }
311
+ case 2: {
312
+ clearInterval(i);
313
+ return 3;
314
+ }
315
+ }
316
+ return stage2;
317
+ });
318
+ }, debounce);
319
+ return () => clearInterval(i);
320
+ }, [
321
+ debounce
322
+ ]);
323
+ if (!debounce) {
324
+ return ready ? 3 : 0;
325
+ }
326
+ return stage;
327
+ };
328
+
329
+ // src/ui/hooks/useSettingsState.ts
330
+ import { RegistryContext as RegistryContext2, useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
331
+ import { useCallback as useCallback3, useContext } from "react";
332
+ var useSettingsState = (atom) => {
333
+ const registry = useContext(RegistryContext2);
334
+ const settings = useAtomValue2(atom);
335
+ const updateSettings = useCallback3((fn) => {
336
+ registry.set(atom, fn(registry.get(atom)));
337
+ }, [
338
+ registry,
339
+ atom
340
+ ]);
341
+ return {
342
+ settings,
343
+ updateSettings
344
+ };
345
+ };
346
+
347
+ // src/ui/components/App/App.tsx
348
+ var FIRST_INTERACTIVE_MARK = "app-framework:first-interactive";
349
+ var App = ({ placeholder: Placeholder, ready, error, debounce, progress }) => {
350
+ const reactContexts = useCapabilities(capabilities_exports.ReactContext);
351
+ const reactRoots = useCapabilities(capabilities_exports.ReactRoot);
352
+ const stage = useLoading(ready, debounce);
353
+ const placeholderDismissed = stage >= LoadingState.Done;
354
+ useEffect3(() => {
355
+ if (placeholderDismissed && performance.getEntriesByName(FIRST_INTERACTIVE_MARK).length === 0) {
356
+ performance.mark(FIRST_INTERACTIVE_MARK);
357
+ }
358
+ }, [
359
+ placeholderDismissed
360
+ ]);
361
+ if (error) {
362
+ throw error;
363
+ }
364
+ if (!placeholderDismissed) {
365
+ if (!Placeholder) {
366
+ return null;
367
+ }
368
+ return /* @__PURE__ */ React2.createElement(Placeholder, {
369
+ stage,
370
+ progress
371
+ });
372
+ }
373
+ const ComposedContext = composeContexts(reactContexts);
374
+ return /* @__PURE__ */ React2.createElement(ComposedContext, null, reactRoots.map(({ id, root: Component }) => /* @__PURE__ */ React2.createElement(Component, {
375
+ key: id
376
+ })));
377
+ };
378
+ var composeContexts = (contexts) => {
379
+ if (contexts.length === 0) {
380
+ return ({ children }) => /* @__PURE__ */ React2.createElement(React2.Fragment, null, children);
381
+ }
382
+ return topologicalSort(contexts).map(({ context }) => context).reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React2.createElement(Acc, null, /* @__PURE__ */ React2.createElement(Next, null, children)));
383
+ };
384
+
385
+ export {
386
+ useApp,
387
+ useCapabilities,
388
+ useCapability,
389
+ useAtomCapability,
390
+ useAtomCapabilityState,
391
+ useOperationInvoker,
392
+ LoadingState,
393
+ useLoading,
394
+ useSettingsState,
395
+ App
396
+ };
397
+ //# sourceMappingURL=chunk-BMIAYUWT.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ui/components/App/App.tsx", "../../../src/ui/hooks/useApp.tsx", "../../../src/ui/hooks/useCapabilities.ts", "../../../src/ui/hooks/useLoading.tsx", "../../../src/ui/hooks/useSettingsState.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren, useEffect } from 'react';\n\nimport { Capabilities } from '../../../common';\nimport { topologicalSort } from '../../../helpers';\nimport { LoadingState, type StartupProgress, type UseAppOptions, useCapabilities, useLoading } from '../../hooks';\n\nexport type AppProps = Pick<UseAppOptions, 'placeholder' | 'debounce'> & {\n ready: boolean;\n error: unknown;\n progress?: StartupProgress;\n};\n\nconst FIRST_INTERACTIVE_MARK = 'app-framework:first-interactive';\n\nexport const App = ({ placeholder: Placeholder, ready, error, debounce, progress }: AppProps) => {\n const reactContexts = useCapabilities(Capabilities.ReactContext);\n const reactRoots = useCapabilities(Capabilities.ReactRoot);\n const stage = useLoading(ready, debounce);\n const placeholderDismissed = stage >= LoadingState.Done;\n\n // Emit a once-per-app `app-framework:first-interactive` mark the first time\n // the placeholder is dismissed and the real app shell renders. Closes the\n // gap between `Startup` activated and the first interactive paint.\n useEffect(() => {\n if (placeholderDismissed && performance.getEntriesByName(FIRST_INTERACTIVE_MARK).length === 0) {\n performance.mark(FIRST_INTERACTIVE_MARK);\n }\n }, [placeholderDismissed]);\n\n if (error) {\n // This triggers the error boundary to provide UI feedback for the startup error.\n throw error;\n }\n\n // TODO(wittjosiah): Consider using Suspense instead.\n if (!placeholderDismissed) {\n if (!Placeholder) {\n return null;\n }\n\n return <Placeholder stage={stage} progress={progress} />;\n }\n\n const ComposedContext = composeContexts(reactContexts);\n return (\n <ComposedContext>\n {reactRoots.map(({ id, root: Component }) => (\n <Component key={id} />\n ))}\n </ComposedContext>\n );\n};\n\nconst composeContexts = (contexts: Capabilities.ReactContext[]) => {\n if (contexts.length === 0) {\n return ({ children }: PropsWithChildren) => <>{children}</>;\n }\n\n return topologicalSort(contexts)\n .map(({ context }) => context)\n .reduce((Acc, Next) => ({ children }) => (\n <Acc>\n <Next>{children}</Next>\n </Acc>\n ));\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\nimport * as Fiber from 'effect/Fiber';\nimport * as PubSub from 'effect/PubSub';\nimport * as Queue from 'effect/Queue';\nimport React, { type FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { ErrorBoundary, ErrorFallback, type FallbackProps } from '@dxos/react-error-boundary';\nimport { useAsyncEffect, useDefaultValue } from '@dxos/react-hooks';\nimport { ContextProtocolProvider } from '@dxos/web-context-react';\n\nimport { ActivationEvents, Capabilities } from '../../common';\nimport { PluginManagerContext } from '../../context';\nimport { type ActivationEvent, type Plugin, PluginManager } from '../../core';\nimport { App, PluginManagerProvider } from '../components';\n\nconst ENABLED_KEY = 'org.dxos.app-framework.enabled';\n\nexport type StartupProgress = {\n /** Number of modules that have been activated. */\n activated: number;\n /** Total number of modules registered. */\n total: number;\n /** Fractional progress (0-1). */\n progress: number;\n /** Human-readable label for the currently activating module. */\n status?: string;\n};\n\nexport type PlaceholderProps = {\n stage?: number;\n progress?: StartupProgress;\n};\n\nexport type UseAppOptions = {\n pluginManager?: PluginManager.PluginManager;\n pluginLoader?: PluginManager.ManagerOptions['pluginLoader'];\n plugins?: Plugin.Plugin[];\n core?: string[];\n defaults?: string[];\n /**\n * Additional activation events to fire before startup.\n * These are fired alongside SetupReactSurface before the Startup event.\n */\n setupEvents?: ActivationEvent.ActivationEvent[];\n cacheEnabled?: boolean;\n safeMode?: boolean;\n debounce?: number;\n timeout?: number;\n fallback?: FC<FallbackProps>;\n placeholder?: FC<PlaceholderProps>;\n};\n\n/**\n * Expected usage is for this to be the entrypoint of the application.\n * Initializes plugins and renders the root components.\n *\n * @example\n * const plugins = [LayoutPlugin(), MyPlugin()];\n * const core = [LayoutPluginId];\n * const default = [MyPluginId];\n * const fallback = <div>Initializing Plugins...</div>;\n * const App = useApp({ plugins, core, default, fallback });\n * createRoot(document.getElementById('root')!).render(\n * <StrictMode>\n * <App />\n * </StrictMode>,\n * );\n *\n * @param params.pluginLoader A function which loads new plugins.\n * @param params.plugins All plugins available to the application.\n * @param params.core Core plugins which will always be enabled.\n * @param params.defaults Default plugins are enabled by default but can be disabled by the user.\n * @param params.cacheEnabled Whether to cache enabled plugins in localStorage.\n * @param params.safeMode Whether to enable safe mode, which disables optional plugins.\n * @param params.fallback Fallback component to render if an error occurs during startup.\n * @param params.placeholder Placeholder component to render during startup.\n */\nexport const useApp = ({\n pluginManager,\n pluginLoader: pluginLoaderProp,\n plugins: pluginsProp,\n core: coreProp,\n defaults: defaultsProp,\n setupEvents: setupEventsProp,\n placeholder,\n fallback = ErrorFallback,\n cacheEnabled = false,\n safeMode = false,\n debounce = 0,\n timeout = 30_000,\n}: UseAppOptions) => {\n const plugins = useDefaultValue(pluginsProp, () => []);\n const core = useDefaultValue(coreProp, () => plugins.map(({ meta }) => meta.id));\n const defaults = useDefaultValue(defaultsProp, () => []);\n const setupEvents = useDefaultValue(setupEventsProp, () => []);\n\n const pluginLoader = useMemo(\n () =>\n pluginLoaderProp ??\n ((id: string) =>\n Effect.sync(() => {\n const plugin = plugins.find((plugin) => plugin.meta.id === id);\n invariant(plugin, `Plugin not found: ${id}`);\n return plugin;\n })),\n [pluginLoaderProp, plugins],\n );\n\n const readyRef = useRef(false);\n const [ready, setReady] = useState(false);\n const errorRef = useRef<unknown>(null);\n const [error, setError] = useState<unknown>(null);\n const [startupProgress, setStartupProgress] = useState<StartupProgress>({\n activated: 0,\n total: 0,\n progress: 0,\n });\n // TODO(wittjosiah): Migrate to Atom.kvs for isomorphic storage.\n const cached: string[] = useMemo(() => JSON.parse(localStorage.getItem(ENABLED_KEY) ?? '[]'), []);\n const enabled = useMemo(\n () => (safeMode ? [] : cacheEnabled && cached.length > 0 ? cached : defaults),\n [safeMode, cacheEnabled, cached, defaults],\n );\n const isExternalManager = !!pluginManager;\n const manager = useMemo(() => {\n const mgr = pluginManager ?? PluginManager.make({ pluginLoader, plugins, core, enabled });\n log('useApp: useMemo created/reused manager', { provided: !!pluginManager });\n return mgr;\n }, [pluginManager, pluginLoader, plugins, core, enabled]);\n\n useEffect(() => {\n if (!cacheEnabled) {\n return;\n }\n return manager.registry.subscribe(manager.enabled, (value) => {\n localStorage.setItem(ENABLED_KEY, JSON.stringify(value));\n });\n }, [cacheEnabled, manager]);\n\n useEffect(() => {\n setupDevtools(manager);\n }, [manager]);\n\n useAsyncEffect(async () => {\n log('useApp: effect mount');\n\n manager.capabilities.contribute({\n interface: Capabilities.PluginManager,\n implementation: manager,\n module: 'org.dxos.app-framework.plugin-manager',\n });\n\n manager.capabilities.contribute({\n interface: Capabilities.AtomRegistry,\n implementation: manager.registry,\n module: 'org.dxos.app-framework.atom-registry',\n });\n\n const fiber = Effect.gen(function* () {\n const queue = yield* PubSub.subscribe(manager.activation);\n const listener = yield* Effect.forkDaemon(\n Queue.take(queue).pipe(\n Effect.tap(({ event, state, module, error: error$ }) =>\n Effect.sync(() => {\n if (event === ActivationEvents.Startup.id && state === 'activated') {\n clearTimeout(timeoutId);\n setReady(true);\n readyRef.current = true;\n // Trigger startup profiler dump if available.\n (globalThis as any).composer?.profiler?.dump();\n // Notify any host observability layer that startup completed.\n // A `CustomEvent` keeps this generic — app-framework doesn't\n // import a provider, and consumers can capture the startup\n // summary without us picking one.\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('app-framework:startup-activated'));\n }\n return;\n }\n // Update progress on every module-level `activated` message.\n // Driven by the activation event itself rather than a poll, so\n // the placeholder UI updates as soon as a module commits.\n if (module && state === 'activated' && !readyRef.current) {\n const active = manager.getActive();\n const total = manager.getModules().length;\n setStartupProgress({\n activated: active.length,\n total,\n progress: total > 0 ? active.length / total : 0,\n status: humanizeModuleId(module),\n });\n }\n if (error$ && !readyRef.current) {\n setError(error$);\n errorRef.current = error$;\n }\n }),\n ),\n Effect.forever,\n ),\n );\n\n yield* Effect.all([\n ...setupEvents.map((event) => manager.activate(event)),\n manager.activate(ActivationEvents.SetupReactSurface),\n manager.activate(ActivationEvents.Startup),\n ]);\n\n return yield* Fiber.join(listener);\n }).pipe(Effect.scoped, Effect.runFork);\n\n // Set up a timeout for startup.\n const timeoutId = setTimeout(() => {\n if (!readyRef.current && !errorRef.current) {\n log.warn('startup timeout diagnostic', {\n eventsFired: manager.getEventsFired(),\n activeModules: manager.getActive(),\n pendingReset: manager.getPendingReset(),\n });\n void runAndForwardErrors(Fiber.interrupt(fiber));\n setError(new Error(`Startup timed out after ${timeout}ms`));\n }\n }, timeout);\n\n return () => {\n log('useApp: effect cleanup');\n clearTimeout(timeoutId);\n void runAndForwardErrors(Fiber.interrupt(fiber));\n if (!isExternalManager) {\n void runAndForwardErrors(manager.shutdown());\n }\n };\n }, [manager]);\n\n return useCallback(\n () => (\n <ErrorBoundary name='app' FallbackComponent={fallback}>\n <PluginManagerProvider value={manager}>\n <ContextProtocolProvider value={manager} context={PluginManagerContext}>\n <RegistryContext.Provider value={manager.registry}>\n <App\n placeholder={placeholder}\n ready={ready}\n error={error}\n debounce={debounce}\n progress={startupProgress}\n />\n </RegistryContext.Provider>\n </ContextProtocolProvider>\n </PluginManagerProvider>\n </ErrorBoundary>\n ),\n [fallback, manager, placeholder, ready, error],\n );\n};\n\nconst setupDevtools = (manager: PluginManager.PluginManager) => {\n (globalThis as any).composer ??= {};\n (globalThis as any).composer.manager = manager;\n};\n\n/**\n * Extracts a human-readable label from a module ID.\n * E.g., \"org.dxos.plugin.markdown.module.ReactSurface\" → \"Markdown\".\n */\nconst humanizeModuleId = (moduleId: string): string => {\n // Extract plugin name from pattern: org.dxos.plugin.<name>.module.<capability>\n const pluginMatch = moduleId.match(/\\.plugin\\.([^.]+)\\./);\n if (pluginMatch) {\n const name = pluginMatch[1];\n // Convert kebab-case to title case.\n return name\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n }\n\n // Fallback: use the last segment.\n const parts = moduleId.split('.');\n return parts[parts.length - 1];\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom, useAtomValue } from '@effect-atom/atom-react';\nimport { useCallback } from 'react';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { Capabilities } from '../../common';\nimport { type Capability } from '../../core';\nimport { usePluginManager } from '../components';\n\n/**\n * Hook to request capabilities from the plugin context.\n * @returns An array of capabilities.\n */\nexport const useCapabilities = <T>(interfaceDef: Capability.InterfaceDef<T>) => {\n const manager = usePluginManager();\n return useAtomValue(manager.capabilities.atom(interfaceDef));\n};\n\n/**\n * Hook to request a capability from the plugin context.\n * @returns The capability.\n * @throws If no capability is found.\n */\nexport const useCapability = <T>(interfaceDef: Capability.InterfaceDef<T>) => {\n const capabilities = useCapabilities(interfaceDef);\n invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`);\n return capabilities[0];\n};\n\n/**\n * Hook to get the current value of an atom capability.\n * Automatically subscribes to changes.\n * @example const settings = useAtomCapability(ThreadCapabilities.Settings);\n */\nexport const useAtomCapability = <T>(atomCapability: Capability.InterfaceDef<Atom.Atom<T>>): T => {\n const atom = useCapability(atomCapability);\n return useAtomValue(atom);\n};\n\n/**\n * Hook to get value and updater for an atom capability.\n * Returns [currentValue, updateFn] similar to useState.\n * @example const [settings, updateSettings] = useAtomCapabilityState(ThreadCapabilities.Settings);\n */\nexport const useAtomCapabilityState = <T>(\n atomCapability: Capability.InterfaceDef<Atom.Writable<T>>,\n): [T, (fn: (current: T) => T) => void] => {\n const registry = useCapability(Capabilities.AtomRegistry);\n const atom = useCapability(atomCapability);\n const value = useAtomValue(atom);\n const update = useCallback(\n (fn: (current: T) => T) => {\n registry.set(atom, fn(registry.get(atom)));\n },\n [registry, atom],\n );\n return [value, update];\n};\n\n/**\n * Hook to get the operation invoker capability.\n */\nexport const useOperationInvoker = (): Capabilities.OperationInvoker => useCapability(Capabilities.OperationInvoker);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nexport enum LoadingState {\n Loading = 0,\n FadeIn = 1,\n FadeOut = 2,\n Done = 3,\n}\n\n/**\n * To avoid \"flashing\" the placeholder, we wait a period of time before starting the loading animation.\n * If loading completes during this time the placehoder is not shown, otherwise is it displayed for a minimum period of time.\n *\n * States:\n * 0: Loading - Wait for a period of time before starting the loading animation.\n * 1: Fade-in - Display a loading animation.\n * 2: Fade-out - Fade out the loading animation.\n * 3: Done - Remove the placeholder.\n */\nexport const useLoading = (ready: boolean, debounce = 0) => {\n const [stage, setStage] = useState<LoadingState>(LoadingState.Loading);\n useEffect(() => {\n if (!debounce) {\n return;\n }\n\n const i = setInterval(() => {\n setStage((stage) => {\n switch (stage) {\n case LoadingState.Loading: {\n if (!ready) {\n return LoadingState.FadeIn;\n } else {\n clearInterval(i);\n return LoadingState.Done;\n }\n }\n\n case LoadingState.FadeIn: {\n if (ready) {\n return LoadingState.FadeOut;\n }\n break;\n }\n\n case LoadingState.FadeOut: {\n clearInterval(i);\n return LoadingState.Done;\n }\n }\n\n return stage;\n });\n }, debounce);\n\n return () => clearInterval(i);\n }, [debounce]);\n\n if (!debounce) {\n return ready ? LoadingState.Done : LoadingState.Loading;\n }\n\n return stage;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom, RegistryContext, useAtomValue } from '@effect-atom/atom-react';\nimport { useCallback, useContext } from 'react';\n\n/**\n * Hook to read and update a settings atom.\n * Returns the current value and an update function.\n */\nexport const useSettingsState = <T>(\n atom: Atom.Writable<T>,\n): { settings: T; updateSettings: (fn: (current: T) => T) => void } => {\n const registry = useContext(RegistryContext);\n const settings = useAtomValue(atom);\n\n const updateSettings = useCallback(\n (fn: (current: T) => T) => {\n registry.set(atom, fn(registry.get(atom)));\n },\n [registry, atom],\n );\n\n return { settings, updateSettings };\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAIA,OAAOA,UAAiCC,aAAAA,kBAAiB;;;ACAzD,SAASC,uBAAuB;AAChC,YAAYC,YAAY;AACxB,YAAYC,WAAW;AACvB,YAAYC,YAAY;AACxB,YAAYC,WAAW;AACvB,OAAOC,SAAkBC,aAAaC,WAAWC,SAASC,QAAQC,gBAAgB;AAElF,SAASC,2BAA2B;AACpC,SAASC,iBAAiB;AAC1B,SAASC,WAAW;AACpB,SAASC,eAAeC,qBAAyC;AACjE,SAASC,gBAAgBC,uBAAuB;AAChD,SAASC,+BAA+B;;AAOxC,IAAMC,cAAc;AA8Db,IAAMC,SAAS,CAAC,EACrBC,eACAC,cAAcC,kBACdC,SAASC,aACTC,MAAMC,UACNC,UAAUC,cACVC,aAAaC,iBACbC,aACAC,WAAWC,eACXC,eAAe,OACfC,WAAW,OACXC,WAAW,GACXC,UAAU,IAAM,MACF;AACd,QAAMd,UAAUe,gBAAgBd,aAAa,MAAM,CAAA,CAAE;AACrD,QAAMC,OAAOa,gBAAgBZ,UAAU,MAAMH,QAAQgB,IAAI,CAAC,EAAEC,KAAI,MAAOA,KAAKC,EAAE,CAAA;AAC9E,QAAMd,WAAWW,gBAAgBV,cAAc,MAAM,CAAA,CAAE;AACvD,QAAMC,cAAcS,gBAAgBR,iBAAiB,MAAM,CAAA,CAAE;AAE7D,QAAMT,eAAeqB,QACnB,MACEpB,qBACC,CAACmB,OACOE,YAAK,MAAA;AACV,UAAMC,SAASrB,QAAQsB,KAAK,CAACD,YAAWA,QAAOJ,KAAKC,OAAOA,EAAAA;AAC3DK,cAAUF,QAAQ,qBAAqBH,EAAAA,IAAI;;;;;;;;;AAC3C,WAAOG;EACT,CAAA,IACJ;IAACtB;IAAkBC;GAAQ;AAG7B,QAAMwB,WAAWC,OAAO,KAAA;AACxB,QAAM,CAACC,OAAOC,QAAAA,IAAYC,SAAS,KAAA;AACnC,QAAMC,WAAWJ,OAAgB,IAAA;AACjC,QAAM,CAACK,OAAOC,QAAAA,IAAYH,SAAkB,IAAA;AAC5C,QAAM,CAACI,iBAAiBC,kBAAAA,IAAsBL,SAA0B;IACtEM,WAAW;IACXC,OAAO;IACPC,UAAU;EACZ,CAAA;AAEA,QAAMC,SAAmBlB,QAAQ,MAAMmB,KAAKC,MAAMC,aAAaC,QAAQ9C,WAAAA,KAAgB,IAAA,GAAO,CAAA,CAAE;AAChG,QAAM+C,UAAUvB,QACd,MAAOP,WAAW,CAAA,IAAKD,gBAAgB0B,OAAOM,SAAS,IAAIN,SAASjC,UACpE;IAACQ;IAAUD;IAAc0B;IAAQjC;GAAS;AAE5C,QAAMwC,oBAAoB,CAAC,CAAC/C;AAC5B,QAAMgD,UAAU1B,QAAQ,MAAA;AACtB,UAAM2B,MAAMjD,iBAAiBkD,uBAAcC,KAAK;MAAElD;MAAcE;MAASE;MAAMwC;IAAQ,CAAA;AACvFO,QAAI,0CAA0C;MAAEC,UAAU,CAAC,CAACrD;IAAc,GAAA;;;;;;AAC1E,WAAOiD;EACT,GAAG;IAACjD;IAAeC;IAAcE;IAASE;IAAMwC;GAAQ;AAExDS,YAAU,MAAA;AACR,QAAI,CAACxC,cAAc;AACjB;IACF;AACA,WAAOkC,QAAQO,SAASC,UAAUR,QAAQH,SAAS,CAACY,UAAAA;AAClDd,mBAAae,QAAQ5D,aAAa2C,KAAKkB,UAAUF,KAAAA,CAAAA;IACnD,CAAA;EACF,GAAG;IAAC3C;IAAckC;GAAQ;AAE1BM,YAAU,MAAA;AACRM,kBAAcZ,OAAAA;EAChB,GAAG;IAACA;GAAQ;AAEZa,iBAAe,YAAA;AACbT,QAAI,wBAAA,QAAA;;;;;;AAEJJ,YAAQc,aAAaC,WAAW;MAC9BC,WAAWC,qBAAaf;MACxBgB,gBAAgBlB;MAChBmB,QAAQ;IACV,CAAA;AAEAnB,YAAQc,aAAaC,WAAW;MAC9BC,WAAWC,qBAAaG;MACxBF,gBAAgBlB,QAAQO;MACxBY,QAAQ;IACV,CAAA;AAEA,UAAME,QAAeC,WAAI,aAAA;AACvB,YAAMC,QAAQ,OAAcf,iBAAUR,QAAQwB,UAAU;AACxD,YAAMC,WAAW,OAAcC,kBACvBC,WAAKJ,KAAAA,EAAOK,KACTC,WAAI,CAAC,EAAEC,OAAOC,OAAOZ,QAAQlC,OAAO+C,OAAM,MACxCzD,YAAK,MAAA;AACV,YAAIuD,UAAUG,0BAAiBC,QAAQ7D,MAAM0D,UAAU,aAAa;AAClEI,uBAAaC,SAAAA;AACbtD,mBAAS,IAAA;AACTH,mBAAS0D,UAAU;AAElBC,qBAAmBC,UAAUC,UAAUC,KAAAA;AAKxC,cAAI,OAAOC,WAAW,aAAa;AACjCA,mBAAOC,cAAc,IAAIC,YAAY,iCAAA,CAAA;UACvC;AACA;QACF;AAIA,YAAIzB,UAAUY,UAAU,eAAe,CAACpD,SAAS0D,SAAS;AACxD,gBAAMQ,SAAS7C,QAAQ8C,UAAS;AAChC,gBAAMxD,QAAQU,QAAQ+C,WAAU,EAAGjD;AACnCV,6BAAmB;YACjBC,WAAWwD,OAAO/C;YAClBR;YACAC,UAAUD,QAAQ,IAAIuD,OAAO/C,SAASR,QAAQ;YAC9C0D,QAAQC,iBAAiB9B,MAAAA;UAC3B,CAAA;QACF;AACA,YAAIa,UAAU,CAACrD,SAAS0D,SAAS;AAC/BnD,mBAAS8C,MAAAA;AACThD,mBAASqD,UAAUL;QACrB;MACF,CAAA,CAAA,GAEKkB,cAAO,CAAA;AAIlB,aAAcC,WAAI;WACb1F,YAAYU,IAAI,CAAC2D,UAAU9B,QAAQoD,SAAStB,KAAAA,CAAAA;QAC/C9B,QAAQoD,SAASnB,0BAAiBoB,iBAAiB;QACnDrD,QAAQoD,SAASnB,0BAAiBC,OAAO;OAC1C;AAED,aAAO,OAAaoB,WAAK7B,QAAAA;IAC3B,CAAA,EAAGG,KAAY2B,eAAeC,cAAO;AAGrC,UAAMpB,YAAYqB,WAAW,MAAA;AAC3B,UAAI,CAAC9E,SAAS0D,WAAW,CAACrD,SAASqD,SAAS;AAC1CjC,YAAIsD,KAAK,8BAA8B;UACrCC,aAAa3D,QAAQ4D,eAAc;UACnCC,eAAe7D,QAAQ8C,UAAS;UAChCgB,cAAc9D,QAAQ+D,gBAAe;QACvC,GAAA;;;;;;AACA,aAAKC,oBAA0BC,gBAAU5C,KAAAA,CAAAA;AACzCnC,iBAAS,IAAIgF,MAAM,2BAA2BjG,OAAAA,IAAW,CAAA;MAC3D;IACF,GAAGA,OAAAA;AAEH,WAAO,MAAA;AACLmC,UAAI,0BAAA,QAAA;;;;;;AACJ+B,mBAAaC,SAAAA;AACb,WAAK4B,oBAA0BC,gBAAU5C,KAAAA,CAAAA;AACzC,UAAI,CAACtB,mBAAmB;AACtB,aAAKiE,oBAAoBhE,QAAQmE,SAAQ,CAAA;MAC3C;IACF;EACF,GAAG;IAACnE;GAAQ;AAEZ,SAAOoE,YACL,MACE,sBAAA,cAACC,eAAAA;IAAcC,MAAK;IAAMC,mBAAmB3G;KAC3C,sBAAA,cAAC4G,uBAAAA;IAAsB/D,OAAOT;KAC5B,sBAAA,cAACyE,yBAAAA;IAAwBhE,OAAOT;IAAS0E,SAASC;KAChD,sBAAA,cAACC,gBAAgBC,UAAQ;IAACpE,OAAOT,QAAQO;KACvC,sBAAA,cAACuE,KAAAA;IACCnH;IACAkB;IACAI;IACAjB;IACAuB,UAAUJ;UAOtB;IAACvB;IAAUoC;IAASrC;IAAakB;IAAOI;GAAM;AAElD;AAEA,IAAM2B,gBAAgB,CAACZ,YAAAA;AACpBsC,aAAmBC,aAAa,CAAC;AACjCD,aAAmBC,SAASvC,UAAUA;AACzC;AAMA,IAAMiD,mBAAmB,CAAC8B,aAAAA;AAExB,QAAMC,cAAcD,SAASE,MAAM,qBAAA;AACnC,MAAID,aAAa;AACf,UAAMV,OAAOU,YAAY,CAAA;AAEzB,WAAOV,KACJY,MAAM,GAAA,EACN/G,IAAI,CAACgH,SAASA,KAAKC,OAAO,CAAA,EAAGC,YAAW,IAAKF,KAAKG,MAAM,CAAA,CAAA,EACxDhC,KAAK,GAAA;EACV;AAGA,QAAMiC,QAAQR,SAASG,MAAM,GAAA;AAC7B,SAAOK,MAAMA,MAAMzF,SAAS,CAAA;AAC9B;;;AC5RA,SAAoB0F,oBAAoB;AACxC,SAASC,eAAAA,oBAAmB;AAE5B,SAASC,aAAAA,kBAAiB;;AAUnB,IAAMC,kBAAkB,CAAIC,iBAAAA;AACjC,QAAMC,UAAUC,iBAAAA;AAChB,SAAOC,aAAaF,QAAQG,aAAaC,KAAKL,YAAAA,CAAAA;AAChD;AAOO,IAAMM,gBAAgB,CAAIN,iBAAAA;AAC/B,QAAMI,eAAeL,gBAAgBC,YAAAA;AACrCO,EAAAA,WAAUH,aAAaI,SAAS,GAAG,2BAA2BR,aAAaS,UAAU,IAAE;;;;;;;;;AACvF,SAAOL,aAAa,CAAA;AACtB;AAOO,IAAMM,oBAAoB,CAAIC,mBAAAA;AACnC,QAAMN,OAAOC,cAAcK,cAAAA;AAC3B,SAAOR,aAAaE,IAAAA;AACtB;AAOO,IAAMO,yBAAyB,CACpCD,mBAAAA;AAEA,QAAME,WAAWP,cAAcQ,qBAAaC,YAAY;AACxD,QAAMV,OAAOC,cAAcK,cAAAA;AAC3B,QAAMK,QAAQb,aAAaE,IAAAA;AAC3B,QAAMY,SAASC,aACb,CAACC,OAAAA;AACCN,aAASO,IAAIf,MAAMc,GAAGN,SAASQ,IAAIhB,IAAAA,CAAAA,CAAAA;EACrC,GACA;IAACQ;IAAUR;GAAK;AAElB,SAAO;IAACW;IAAOC;;AACjB;AAKO,IAAMK,sBAAsB,MAAqChB,cAAcQ,qBAAaS,gBAAgB;;;AC9DnH,SAASC,aAAAA,YAAWC,YAAAA,iBAAgB;AAE7B,IAAKC,eAAAA,0BAAAA,eAAAA;;;;;SAAAA;;AAiBL,IAAMC,aAAa,CAACC,OAAgBC,WAAW,MAAC;AACrD,QAAM,CAACC,OAAOC,QAAAA,IAAYC,UAAAA,CAAAA;AAC1BC,EAAAA,WAAU,MAAA;AACR,QAAI,CAACJ,UAAU;AACb;IACF;AAEA,UAAMK,IAAIC,YAAY,MAAA;AACpBJ,eAAS,CAACD,WAAAA;AACR,gBAAQA,QAAAA;UACN,KAAA,GAA2B;AACzB,gBAAI,CAACF,OAAO;AACV,qBAAA;YACF,OAAO;AACLQ,4BAAcF,CAAAA;AACd,qBAAA;YACF;UACF;UAEA,KAAA,GAA0B;AACxB,gBAAIN,OAAO;AACT,qBAAA;YACF;AACA;UACF;UAEA,KAAA,GAA2B;AACzBQ,0BAAcF,CAAAA;AACd,mBAAA;UACF;QACF;AAEA,eAAOJ;MACT,CAAA;IACF,GAAGD,QAAAA;AAEH,WAAO,MAAMO,cAAcF,CAAAA;EAC7B,GAAG;IAACL;GAAS;AAEb,MAAI,CAACA,UAAU;AACb,WAAOD,QAAAA,IAAAA;EACT;AAEA,SAAOE;AACT;;;AC/DA,SAAoBO,mBAAAA,kBAAiBC,gBAAAA,qBAAoB;AACzD,SAASC,eAAAA,cAAaC,kBAAkB;AAMjC,IAAMC,mBAAmB,CAC9BC,SAAAA;AAEA,QAAMC,WAAWC,WAAWC,gBAAAA;AAC5B,QAAMC,WAAWC,cAAaL,IAAAA;AAE9B,QAAMM,iBAAiBC,aACrB,CAACC,OAAAA;AACCP,aAASQ,IAAIT,MAAMQ,GAAGP,SAASS,IAAIV,IAAAA,CAAAA,CAAAA;EACrC,GACA;IAACC;IAAUD;GAAK;AAGlB,SAAO;IAAEI;IAAUE;EAAe;AACpC;;;AJTA,IAAMK,yBAAyB;AAExB,IAAMC,MAAM,CAAC,EAAEC,aAAaC,aAAaC,OAAOC,OAAOC,UAAUC,SAAQ,MAAY;AAC1F,QAAMC,gBAAgBC,gBAAgBC,qBAAaC,YAAY;AAC/D,QAAMC,aAAaH,gBAAgBC,qBAAaG,SAAS;AACzD,QAAMC,QAAQC,WAAWX,OAAOE,QAAAA;AAChC,QAAMU,uBAAuBF,SAASG,aAAaC;AAKnDC,EAAAA,WAAU,MAAA;AACR,QAAIH,wBAAwBI,YAAYC,iBAAiBrB,sBAAAA,EAAwBsB,WAAW,GAAG;AAC7FF,kBAAYG,KAAKvB,sBAAAA;IACnB;EACF,GAAG;IAACgB;GAAqB;AAEzB,MAAIX,OAAO;AAET,UAAMA;EACR;AAGA,MAAI,CAACW,sBAAsB;AACzB,QAAI,CAACb,aAAa;AAChB,aAAO;IACT;AAEA,WAAO,gBAAAqB,OAAA,cAACrB,aAAAA;MAAYW;MAAcP;;EACpC;AAEA,QAAMkB,kBAAkBC,gBAAgBlB,aAAAA;AACxC,SACE,gBAAAgB,OAAA,cAACC,iBAAAA,MACEb,WAAWe,IAAI,CAAC,EAAEC,IAAIC,MAAMC,UAAS,MACpC,gBAAAN,OAAA,cAACM,WAAAA;IAAUC,KAAKH;;AAIxB;AAEA,IAAMF,kBAAkB,CAACM,aAAAA;AACvB,MAAIA,SAASV,WAAW,GAAG;AACzB,WAAO,CAAC,EAAEW,SAAQ,MAA0B,gBAAAT,OAAA,cAAAA,OAAA,UAAA,MAAGS,QAAAA;EACjD;AAEA,SAAOC,gBAAgBF,QAAAA,EACpBL,IAAI,CAAC,EAAEQ,QAAO,MAAOA,OAAAA,EACrBC,OAAO,CAACC,KAAKC,SAAS,CAAC,EAAEL,SAAQ,MAChC,gBAAAT,OAAA,cAACa,KAAAA,MACC,gBAAAb,OAAA,cAACc,MAAAA,MAAML,QAAAA,CAAAA,CAAAA;AAGf;",
6
+ "names": ["React", "useEffect", "RegistryContext", "Effect", "Fiber", "PubSub", "Queue", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "runAndForwardErrors", "invariant", "log", "ErrorBoundary", "ErrorFallback", "useAsyncEffect", "useDefaultValue", "ContextProtocolProvider", "ENABLED_KEY", "useApp", "pluginManager", "pluginLoader", "pluginLoaderProp", "plugins", "pluginsProp", "core", "coreProp", "defaults", "defaultsProp", "setupEvents", "setupEventsProp", "placeholder", "fallback", "ErrorFallback", "cacheEnabled", "safeMode", "debounce", "timeout", "useDefaultValue", "map", "meta", "id", "useMemo", "sync", "plugin", "find", "invariant", "readyRef", "useRef", "ready", "setReady", "useState", "errorRef", "error", "setError", "startupProgress", "setStartupProgress", "activated", "total", "progress", "cached", "JSON", "parse", "localStorage", "getItem", "enabled", "length", "isExternalManager", "manager", "mgr", "PluginManager", "make", "log", "provided", "useEffect", "registry", "subscribe", "value", "setItem", "stringify", "setupDevtools", "useAsyncEffect", "capabilities", "contribute", "interface", "Capabilities", "implementation", "module", "AtomRegistry", "fiber", "gen", "queue", "activation", "listener", "forkDaemon", "take", "pipe", "tap", "event", "state", "error$", "ActivationEvents", "Startup", "clearTimeout", "timeoutId", "current", "globalThis", "composer", "profiler", "dump", "window", "dispatchEvent", "CustomEvent", "active", "getActive", "getModules", "status", "humanizeModuleId", "forever", "all", "activate", "SetupReactSurface", "join", "scoped", "runFork", "setTimeout", "warn", "eventsFired", "getEventsFired", "activeModules", "pendingReset", "getPendingReset", "runAndForwardErrors", "interrupt", "Error", "shutdown", "useCallback", "ErrorBoundary", "name", "FallbackComponent", "PluginManagerProvider", "ContextProtocolProvider", "context", "PluginManagerContext", "RegistryContext", "Provider", "App", "moduleId", "pluginMatch", "match", "split", "word", "charAt", "toUpperCase", "slice", "parts", "useAtomValue", "useCallback", "invariant", "useCapabilities", "interfaceDef", "manager", "usePluginManager", "useAtomValue", "capabilities", "atom", "useCapability", "invariant", "length", "identifier", "useAtomCapability", "atomCapability", "useAtomCapabilityState", "registry", "Capabilities", "AtomRegistry", "value", "update", "useCallback", "fn", "set", "get", "useOperationInvoker", "OperationInvoker", "useEffect", "useState", "LoadingState", "useLoading", "ready", "debounce", "stage", "setStage", "useState", "useEffect", "i", "setInterval", "clearInterval", "RegistryContext", "useAtomValue", "useCallback", "useContext", "useSettingsState", "atom", "registry", "useContext", "RegistryContext", "settings", "useAtomValue", "updateSettings", "useCallback", "fn", "set", "get", "FIRST_INTERACTIVE_MARK", "App", "placeholder", "Placeholder", "ready", "error", "debounce", "progress", "reactContexts", "useCapabilities", "Capabilities", "ReactContext", "reactRoots", "ReactRoot", "stage", "useLoading", "placeholderDismissed", "LoadingState", "Done", "useEffect", "performance", "getEntriesByName", "length", "mark", "React", "ComposedContext", "composeContexts", "map", "id", "root", "Component", "key", "contexts", "children", "topologicalSort", "context", "reduce", "Acc", "Next"]
7
+ }