@dxos/app-framework 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/.storybook/main.mts +1 -1
  2. package/.storybook/preview.mts +2 -2
  3. package/CHANGELOG.md +93 -0
  4. package/TASKS.md +11 -0
  5. package/dist/lib/chunk-SurfaceManager.mjs +960 -0
  6. package/dist/lib/chunk-SurfaceManager.mjs.map +1 -0
  7. package/dist/lib/chunk-capability.mjs +15 -0
  8. package/dist/lib/chunk-capability.mjs.map +1 -0
  9. package/dist/lib/{browser/chunk-FJ4765WW.mjs → chunk-context.mjs} +4 -5
  10. package/dist/lib/chunk-context.mjs.map +1 -0
  11. package/dist/lib/chunk-history-tracker.mjs +160 -0
  12. package/dist/lib/chunk-history-tracker.mjs.map +1 -0
  13. package/dist/lib/chunk-plugin-manager.mjs +1390 -0
  14. package/dist/lib/chunk-plugin-manager.mjs.map +1 -0
  15. package/dist/lib/chunk-plugin-manifest.mjs +125 -0
  16. package/dist/lib/chunk-plugin-manifest.mjs.map +1 -0
  17. package/dist/lib/chunk-process-manager-capability.mjs +126 -0
  18. package/dist/lib/chunk-process-manager-capability.mjs.map +1 -0
  19. package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
  20. package/dist/lib/chunk-url-loader.mjs +347 -0
  21. package/dist/lib/chunk-url-loader.mjs.map +1 -0
  22. package/dist/lib/cli.mjs +78 -0
  23. package/dist/lib/cli.mjs.map +1 -0
  24. package/dist/lib/common/activation-events.mjs +35 -0
  25. package/dist/lib/common/activation-events.mjs.map +1 -0
  26. package/dist/lib/common/capabilities.mjs +184 -0
  27. package/dist/lib/common/capabilities.mjs.map +1 -0
  28. package/dist/lib/config.mjs +2 -0
  29. package/dist/lib/core/activation-event.mjs +55 -0
  30. package/dist/lib/core/activation-event.mjs.map +1 -0
  31. package/dist/lib/core/capability.mjs +189 -0
  32. package/dist/lib/core/capability.mjs.map +1 -0
  33. package/dist/lib/core/plugin-manager.mjs +2 -0
  34. package/dist/lib/core/plugin.mjs +340 -0
  35. package/dist/lib/core/plugin.mjs.map +1 -0
  36. package/dist/lib/core/url-loader.mjs +2 -0
  37. package/dist/lib/index.mjs +134 -0
  38. package/dist/lib/index.mjs.map +1 -0
  39. package/dist/lib/testing/react.mjs +70 -0
  40. package/dist/lib/testing/react.mjs.map +1 -0
  41. package/dist/lib/testing.mjs +399 -0
  42. package/dist/lib/testing.mjs.map +1 -0
  43. package/dist/lib/ui.mjs +636 -0
  44. package/dist/lib/ui.mjs.map +1 -0
  45. package/dist/lib/vite-plugin.mjs +986 -0
  46. package/dist/lib/vite-plugin.mjs.map +1 -0
  47. package/dist/plugin/node-esm/index.mjs +4 -3
  48. package/dist/plugin/node-esm/index.mjs.map +3 -3
  49. package/dist/plugin/node-esm/meta.json +1 -1
  50. package/dist/types/src/common/Role.d.ts +31 -0
  51. package/dist/types/src/common/Role.d.ts.map +1 -0
  52. package/dist/types/src/common/Role.test.d.ts +2 -0
  53. package/dist/types/src/common/Role.test.d.ts.map +1 -0
  54. package/dist/types/src/common/capabilities.d.ts +11 -2
  55. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  56. package/dist/types/src/common/index.d.ts +1 -0
  57. package/dist/types/src/common/index.d.ts.map +1 -1
  58. package/dist/types/src/core/capability-manager.d.ts +1 -1
  59. package/dist/types/src/core/capability-manager.d.ts.map +1 -1
  60. package/dist/types/src/core/capability.d.ts +38 -5
  61. package/dist/types/src/core/capability.d.ts.map +1 -1
  62. package/dist/types/src/core/plugin-manager.d.ts +1 -1
  63. package/dist/types/src/core/plugin-manager.d.ts.map +1 -1
  64. package/dist/types/src/core/plugin.d.ts +14 -1
  65. package/dist/types/src/core/plugin.d.ts.map +1 -1
  66. package/dist/types/src/core/registry.d.ts +1 -1
  67. package/dist/types/src/core/registry.d.ts.map +1 -1
  68. package/dist/types/src/plugin-process-manager/history/capability.d.ts +1 -1
  69. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts +1 -1
  70. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts.map +1 -1
  71. package/dist/types/src/testing/StorybookErrorFallback.d.ts +15 -0
  72. package/dist/types/src/testing/StorybookErrorFallback.d.ts.map +1 -0
  73. package/dist/types/src/testing/harness.d.ts +1 -1
  74. package/dist/types/src/testing/harness.d.ts.map +1 -1
  75. package/dist/types/src/testing/index.d.ts +2 -0
  76. package/dist/types/src/testing/index.d.ts.map +1 -1
  77. package/dist/types/src/testing/react.d.ts +4 -4
  78. package/dist/types/src/testing/react.d.ts.map +1 -1
  79. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  80. package/dist/types/src/testing/withPluginManager.stories.d.ts +6 -0
  81. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  82. package/dist/types/src/testing/withSurfaceDebug.d.ts +10 -0
  83. package/dist/types/src/testing/withSurfaceDebug.d.ts.map +1 -0
  84. package/dist/types/src/ui/components/App/App.d.ts +0 -32
  85. package/dist/types/src/ui/components/App/App.d.ts.map +1 -1
  86. package/dist/types/src/ui/components/App/index.d.ts +1 -0
  87. package/dist/types/src/ui/components/App/index.d.ts.map +1 -1
  88. package/dist/types/src/ui/components/App/loader.d.ts +35 -0
  89. package/dist/types/src/ui/components/App/loader.d.ts.map +1 -0
  90. package/dist/types/src/ui/components/HomeSection/HomeSection.d.ts +26 -0
  91. package/dist/types/src/ui/components/HomeSection/HomeSection.d.ts.map +1 -0
  92. package/dist/types/src/ui/components/HomeSection/HomeSection.stories.d.ts +15 -0
  93. package/dist/types/src/ui/components/HomeSection/HomeSection.stories.d.ts.map +1 -0
  94. package/dist/types/src/ui/components/HomeSection/index.d.ts +2 -0
  95. package/dist/types/src/ui/components/HomeSection/index.d.ts.map +1 -0
  96. package/dist/types/src/ui/components/NamePopover/NamePopover.d.ts +14 -0
  97. package/dist/types/src/ui/components/NamePopover/NamePopover.d.ts.map +1 -0
  98. package/dist/types/src/ui/components/NamePopover/index.d.ts +2 -0
  99. package/dist/types/src/ui/components/NamePopover/index.d.ts.map +1 -0
  100. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +21 -9
  101. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -1
  102. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts +4 -1
  103. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -1
  104. package/dist/types/src/ui/components/Surface/SurfaceComponent.test.d.ts +2 -0
  105. package/dist/types/src/ui/components/Surface/SurfaceComponent.test.d.ts.map +1 -0
  106. package/dist/types/src/ui/components/Surface/SurfaceDebug.d.ts +40 -0
  107. package/dist/types/src/ui/components/Surface/SurfaceDebug.d.ts.map +1 -0
  108. package/dist/types/src/ui/components/Surface/SurfaceManager.d.ts +23 -0
  109. package/dist/types/src/ui/components/Surface/SurfaceManager.d.ts.map +1 -0
  110. package/dist/types/src/ui/components/Surface/SurfaceManagerContext.d.ts +11 -0
  111. package/dist/types/src/ui/components/Surface/SurfaceManagerContext.d.ts.map +1 -0
  112. package/dist/types/src/ui/components/Surface/SurfaceMetrics.d.ts +72 -0
  113. package/dist/types/src/ui/components/Surface/SurfaceMetrics.d.ts.map +1 -0
  114. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -1
  115. package/dist/types/src/ui/components/Surface/index.d.ts +20 -25
  116. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -1
  117. package/dist/types/src/ui/components/Surface/types.d.ts +56 -52
  118. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -1
  119. package/dist/types/src/ui/components/index.d.ts +2 -0
  120. package/dist/types/src/ui/components/index.d.ts.map +1 -1
  121. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -1
  122. package/dist/types/tsconfig.tsbuildinfo +1 -1
  123. package/moon.yml +25 -18
  124. package/package.json +58 -73
  125. package/src/common/Role.test.ts +41 -0
  126. package/src/common/Role.ts +54 -0
  127. package/src/common/capabilities.ts +17 -2
  128. package/src/common/index.ts +1 -0
  129. package/src/core/capability-manager.test.ts +1 -1
  130. package/src/core/capability-manager.ts +1 -1
  131. package/src/core/capability.ts +45 -6
  132. package/src/core/plugin-manager.test.ts +38 -3
  133. package/src/core/plugin-manager.ts +18 -1
  134. package/src/core/plugin.ts +16 -1
  135. package/src/core/registry.ts +1 -1
  136. package/src/plugin-process-manager/process-manager-capability.ts +25 -2
  137. package/src/testing/StorybookErrorFallback.tsx +40 -0
  138. package/src/testing/harness.ts +1 -1
  139. package/src/testing/index.ts +2 -0
  140. package/src/testing/react.test.tsx +2 -1
  141. package/src/testing/react.tsx +14 -8
  142. package/src/testing/withPluginManager.stories.tsx +16 -1
  143. package/src/testing/withPluginManager.tsx +13 -2
  144. package/src/testing/withSurfaceDebug.tsx +22 -0
  145. package/src/ui/components/App/App.tsx +7 -35
  146. package/src/ui/components/App/index.ts +1 -0
  147. package/src/ui/components/App/loader.ts +39 -0
  148. package/src/ui/components/HomeSection/HomeSection.stories.tsx +43 -0
  149. package/src/ui/components/HomeSection/HomeSection.tsx +69 -0
  150. package/src/ui/components/HomeSection/index.ts +5 -0
  151. package/src/ui/components/NamePopover/NamePopover.tsx +70 -0
  152. package/src/ui/components/NamePopover/index.ts +5 -0
  153. package/src/ui/components/Surface/DESIGN.md +136 -0
  154. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +70 -41
  155. package/src/ui/components/Surface/SurfaceComponent.test.tsx +403 -0
  156. package/src/ui/components/Surface/SurfaceComponent.tsx +209 -189
  157. package/src/ui/components/Surface/SurfaceDebug.tsx +435 -0
  158. package/src/ui/components/Surface/SurfaceManager.ts +95 -0
  159. package/src/ui/components/Surface/SurfaceManagerContext.ts +23 -0
  160. package/src/ui/components/Surface/SurfaceMetrics.ts +202 -0
  161. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +12 -2
  162. package/src/ui/components/Surface/index.ts +24 -22
  163. package/src/ui/components/Surface/types.test.ts +47 -54
  164. package/src/ui/components/Surface/types.ts +66 -91
  165. package/src/ui/components/index.ts +2 -0
  166. package/src/ui/hooks/useApp.tsx +7 -3
  167. package/src/vite-plugin/boot-loader/loader-app/boot-loader.css +1 -1
  168. package/tsconfig.json +3 -0
  169. package/vite.config.ts +26 -0
  170. package/dist/lib/browser/capability-S44TE2H7.mjs +0 -35
  171. package/dist/lib/browser/capability-S44TE2H7.mjs.map +0 -7
  172. package/dist/lib/browser/chunk-3NQLTQCP.mjs +0 -47
  173. package/dist/lib/browser/chunk-3NQLTQCP.mjs.map +0 -7
  174. package/dist/lib/browser/chunk-53HJHMS5.mjs +0 -7
  175. package/dist/lib/browser/chunk-53HJHMS5.mjs.map +0 -7
  176. package/dist/lib/browser/chunk-FJ4765WW.mjs.map +0 -7
  177. package/dist/lib/browser/chunk-J5LGTIGS.mjs +0 -10
  178. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +0 -7
  179. package/dist/lib/browser/chunk-KRJ4KK2W.mjs +0 -505
  180. package/dist/lib/browser/chunk-KRJ4KK2W.mjs.map +0 -7
  181. package/dist/lib/browser/chunk-LUH4Y5F2.mjs +0 -430
  182. package/dist/lib/browser/chunk-LUH4Y5F2.mjs.map +0 -7
  183. package/dist/lib/browser/chunk-NKVRSMFN.mjs +0 -95
  184. package/dist/lib/browser/chunk-NKVRSMFN.mjs.map +0 -7
  185. package/dist/lib/browser/chunk-OO53M5UK.mjs +0 -260
  186. package/dist/lib/browser/chunk-OO53M5UK.mjs.map +0 -7
  187. package/dist/lib/browser/chunk-OPTS3ZSN.mjs +0 -83
  188. package/dist/lib/browser/chunk-OPTS3ZSN.mjs.map +0 -7
  189. package/dist/lib/browser/chunk-Q2GLJTVV.mjs +0 -12
  190. package/dist/lib/browser/chunk-Q2GLJTVV.mjs.map +0 -7
  191. package/dist/lib/browser/chunk-SYXIYT6T.mjs +0 -143
  192. package/dist/lib/browser/chunk-SYXIYT6T.mjs.map +0 -7
  193. package/dist/lib/browser/chunk-U5MESPM5.mjs +0 -603
  194. package/dist/lib/browser/chunk-U5MESPM5.mjs.map +0 -7
  195. package/dist/lib/browser/chunk-UGYCLOXE.mjs +0 -1471
  196. package/dist/lib/browser/chunk-UGYCLOXE.mjs.map +0 -7
  197. package/dist/lib/browser/chunk-VF37YTXJ.mjs +0 -28
  198. package/dist/lib/browser/chunk-VF37YTXJ.mjs.map +0 -7
  199. package/dist/lib/browser/chunk-YUVQIOTB.mjs +0 -60
  200. package/dist/lib/browser/chunk-YUVQIOTB.mjs.map +0 -7
  201. package/dist/lib/browser/cli/index.mjs +0 -74
  202. package/dist/lib/browser/cli/index.mjs.map +0 -7
  203. package/dist/lib/browser/common/activation-events.mjs +0 -20
  204. package/dist/lib/browser/common/activation-events.mjs.map +0 -7
  205. package/dist/lib/browser/common/capabilities.mjs +0 -56
  206. package/dist/lib/browser/common/capabilities.mjs.map +0 -7
  207. package/dist/lib/browser/config/index.mjs +0 -8
  208. package/dist/lib/browser/config/index.mjs.map +0 -7
  209. package/dist/lib/browser/core/activation-event.mjs +0 -20
  210. package/dist/lib/browser/core/activation-event.mjs.map +0 -7
  211. package/dist/lib/browser/core/capability.mjs +0 -32
  212. package/dist/lib/browser/core/capability.mjs.map +0 -7
  213. package/dist/lib/browser/core/plugin-manager.mjs +0 -19
  214. package/dist/lib/browser/core/plugin-manager.mjs.map +0 -7
  215. package/dist/lib/browser/core/plugin.mjs +0 -51
  216. package/dist/lib/browser/core/plugin.mjs.map +0 -7
  217. package/dist/lib/browser/core/url-loader.mjs +0 -24
  218. package/dist/lib/browser/core/url-loader.mjs.map +0 -7
  219. package/dist/lib/browser/index.mjs +0 -98
  220. package/dist/lib/browser/index.mjs.map +0 -7
  221. package/dist/lib/browser/meta.json +0 -1
  222. package/dist/lib/browser/process-manager-capability-QK4BMKMN.mjs +0 -132
  223. package/dist/lib/browser/process-manager-capability-QK4BMKMN.mjs.map +0 -7
  224. package/dist/lib/browser/testing/index.mjs +0 -359
  225. package/dist/lib/browser/testing/index.mjs.map +0 -7
  226. package/dist/lib/browser/testing/react.mjs +0 -78
  227. package/dist/lib/browser/testing/react.mjs.map +0 -7
  228. package/dist/lib/browser/ui/index.mjs +0 -60
  229. package/dist/lib/browser/ui/index.mjs.map +0 -7
  230. package/dist/lib/node-esm/capability-3YRF77LV.mjs +0 -36
  231. package/dist/lib/node-esm/capability-3YRF77LV.mjs.map +0 -7
  232. package/dist/lib/node-esm/chunk-2UPUZXGU.mjs +0 -9
  233. package/dist/lib/node-esm/chunk-2UPUZXGU.mjs.map +0 -7
  234. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +0 -10
  235. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +0 -7
  236. package/dist/lib/node-esm/chunk-4SE7SX7N.mjs +0 -261
  237. package/dist/lib/node-esm/chunk-4SE7SX7N.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-BMW6P6QA.mjs +0 -48
  239. package/dist/lib/node-esm/chunk-BMW6P6QA.mjs.map +0 -7
  240. package/dist/lib/node-esm/chunk-COHOWGGJ.mjs +0 -144
  241. package/dist/lib/node-esm/chunk-COHOWGGJ.mjs.map +0 -7
  242. package/dist/lib/node-esm/chunk-DRT75WGD.mjs +0 -604
  243. package/dist/lib/node-esm/chunk-DRT75WGD.mjs.map +0 -7
  244. package/dist/lib/node-esm/chunk-FKMVORZN.mjs +0 -431
  245. package/dist/lib/node-esm/chunk-FKMVORZN.mjs.map +0 -7
  246. package/dist/lib/node-esm/chunk-FPW45EZH.mjs +0 -14
  247. package/dist/lib/node-esm/chunk-FPW45EZH.mjs.map +0 -7
  248. package/dist/lib/node-esm/chunk-GLH4LGHZ.mjs +0 -84
  249. package/dist/lib/node-esm/chunk-GLH4LGHZ.mjs.map +0 -7
  250. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  251. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +0 -7
  252. package/dist/lib/node-esm/chunk-IL7O7IRX.mjs +0 -1472
  253. package/dist/lib/node-esm/chunk-IL7O7IRX.mjs.map +0 -7
  254. package/dist/lib/node-esm/chunk-ND2HETHD.mjs +0 -506
  255. package/dist/lib/node-esm/chunk-ND2HETHD.mjs.map +0 -7
  256. package/dist/lib/node-esm/chunk-TLKYZKPW.mjs +0 -29
  257. package/dist/lib/node-esm/chunk-TLKYZKPW.mjs.map +0 -7
  258. package/dist/lib/node-esm/chunk-VCPGX7WN.mjs +0 -62
  259. package/dist/lib/node-esm/chunk-VCPGX7WN.mjs.map +0 -7
  260. package/dist/lib/node-esm/chunk-XSZMX53L.mjs +0 -96
  261. package/dist/lib/node-esm/chunk-XSZMX53L.mjs.map +0 -7
  262. package/dist/lib/node-esm/cli/index.mjs +0 -75
  263. package/dist/lib/node-esm/cli/index.mjs.map +0 -7
  264. package/dist/lib/node-esm/common/activation-events.mjs +0 -21
  265. package/dist/lib/node-esm/common/activation-events.mjs.map +0 -7
  266. package/dist/lib/node-esm/common/capabilities.mjs +0 -57
  267. package/dist/lib/node-esm/common/capabilities.mjs.map +0 -7
  268. package/dist/lib/node-esm/config/index.mjs +0 -9
  269. package/dist/lib/node-esm/config/index.mjs.map +0 -7
  270. package/dist/lib/node-esm/core/activation-event.mjs +0 -21
  271. package/dist/lib/node-esm/core/activation-event.mjs.map +0 -7
  272. package/dist/lib/node-esm/core/capability.mjs +0 -33
  273. package/dist/lib/node-esm/core/capability.mjs.map +0 -7
  274. package/dist/lib/node-esm/core/plugin-manager.mjs +0 -20
  275. package/dist/lib/node-esm/core/plugin-manager.mjs.map +0 -7
  276. package/dist/lib/node-esm/core/plugin.mjs +0 -52
  277. package/dist/lib/node-esm/core/plugin.mjs.map +0 -7
  278. package/dist/lib/node-esm/core/url-loader.mjs +0 -25
  279. package/dist/lib/node-esm/core/url-loader.mjs.map +0 -7
  280. package/dist/lib/node-esm/index.mjs +0 -99
  281. package/dist/lib/node-esm/index.mjs.map +0 -7
  282. package/dist/lib/node-esm/meta.json +0 -1
  283. package/dist/lib/node-esm/process-manager-capability-5S7WZ2JR.mjs +0 -133
  284. package/dist/lib/node-esm/process-manager-capability-5S7WZ2JR.mjs.map +0 -7
  285. package/dist/lib/node-esm/testing/index.mjs +0 -360
  286. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  287. package/dist/lib/node-esm/testing/react.mjs +0 -79
  288. package/dist/lib/node-esm/testing/react.mjs.map +0 -7
  289. package/dist/lib/node-esm/ui/index.mjs +0 -61
  290. package/dist/lib/node-esm/ui/index.mjs.map +0 -7
  291. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +0 -11
  292. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +0 -1
  293. package/src/ui/components/Surface/SurfaceInfo.tsx +0 -106
  294. package/vitest.config.ts +0 -14
@@ -2,32 +2,18 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import type { FC, PropsWithChildren, ReactNode, Ref } from 'react';
5
+ import type { ComponentType, FC, PropsWithChildren, ReactNode } from 'react';
6
6
 
7
- import type { DXN } from '@dxos/keys';
8
7
  import { log } from '@dxos/log';
9
8
  import type { MakeOptional, Position } from '@dxos/util';
10
9
 
11
- /**
12
- * A typed role token. Carries a role NSID for runtime dispatch plus a phantom
13
- * data type so consumers using `type={SomeToken}` and providers using
14
- * `AppSurface.object(SomeToken, ...)` share a single type-level contract.
15
- *
16
- * Mint via {@link makeType}. The `role` field holds the bare NSID (e.g.
17
- * `org.dxos.role.article`) — the dispatch key, `data-role` attribute value,
18
- * and what `.role` comparisons inside matched components see.
19
- */
20
- export type RoleToken<TData> = {
21
- readonly role: string;
22
- /** Covariant phantom; never accessed at runtime. */
23
- readonly _phantom?: TData;
24
- };
10
+ import * as Role from '../../../common/Role';
25
11
 
26
12
  /**
27
- * One entry in a {@link SurfaceFilter} — a role NSID plus the guard that
28
- * validates the data shape when the Surface dispatcher is matching that role.
13
+ * One entry in a {@link Filter} — a role NSID plus the guard that validates the
14
+ * data shape when the Surface dispatcher is matching that role.
29
15
  */
30
- export type SurfaceBinding = {
16
+ export type Binding = {
31
17
  readonly role: string;
32
18
  readonly guard: (data: unknown) => boolean;
33
19
  };
@@ -37,53 +23,21 @@ export type SurfaceBinding = {
37
23
  * pairs so a provider can register against multiple roles while keeping the
38
24
  * role and its data shape in a single expression.
39
25
  */
40
- export type SurfaceFilter<TData> = {
41
- readonly bindings: ReadonlyArray<SurfaceBinding>;
26
+ export type Filter<TData> = {
27
+ readonly bindings: ReadonlyArray<Binding>;
42
28
  /** Covariant phantom; never accessed at runtime. */
43
29
  readonly _phantom?: TData;
44
30
  };
45
31
 
46
32
  /**
47
- * Narrow data type carried by a role token.
33
+ * Runtime guard for {@link Filter}. Distinguishes new-style filter bindings from
34
+ * legacy predicate filters.
48
35
  */
49
- export type TokenData<T> = T extends RoleToken<infer D> ? D : never;
50
-
51
- /**
52
- * Runtime guard for {@link SurfaceFilter}. Distinguishes new-style filter
53
- * bindings from legacy predicate filters.
54
- */
55
- export const isSurfaceFilter = (value: unknown): value is SurfaceFilter<any> =>
36
+ export const isFilter = (value: unknown): value is Filter<any> =>
56
37
  typeof value === 'object' && value !== null && Array.isArray((value as { bindings?: unknown }).bindings);
57
38
 
58
39
  /**
59
- * Mints a typed role token. The NSID is validated at compile time via
60
- * {@link DXN.Name}: the final segment must be camelCase (no hyphens).
61
- * Dynamic NSIDs (template-literal / runtime strings) are validated at runtime.
62
- *
63
- * Identity is structural; all tokens with the same `role` string are
64
- * interchangeable at runtime.
65
- */
66
- export const makeType: {
67
- <TData = unknown, T extends string = string>(
68
- nsid: [DXN.Name<T>] extends [never] ? `Invalid NSID "${T}": final segment must be camelCase (no hyphens)` : T,
69
- ): RoleToken<TData>;
70
- } = <TData>(nsid: string): RoleToken<TData> => {
71
- // Runtime guard for dynamic NSIDs that bypass the compile-time DXN.Name<T> check.
72
- if (
73
- typeof nsid !== 'string' ||
74
- !/^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\.[a-zA-Z][a-zA-Z0-9]{0,62})$/.test(
75
- nsid,
76
- )
77
- ) {
78
- throw new Error(
79
- `Invalid role NSID: "${nsid}". Must be a dotted name with a camelCase final segment (no hyphens in the last segment).`,
80
- );
81
- }
82
- return { role: nsid };
83
- };
84
-
85
- /**
86
- * Creates a {@link SurfaceFilter} from a role token and an optional guard.
40
+ * Creates a {@link Filter} from a role token and an optional guard.
87
41
  *
88
42
  * When `guard` is omitted the filter matches any data at the token's role
89
43
  * (role-only dispatch). Pass a guard to add runtime data-shape validation on
@@ -92,7 +46,7 @@ export const makeType: {
92
46
  * This is the framework-level primitive; `@dxos/app-toolkit` builds richer
93
47
  * domain-aware helpers (ECHO schema checks, literal matching, etc.) on top of it.
94
48
  */
95
- export const makeFilter = <TData>(token: RoleToken<TData>, guard?: (data: TData) => boolean): SurfaceFilter<TData> => {
49
+ export const makeFilter = <TData>(token: Role.Role<TData>, guard?: (data: TData) => boolean): Filter<TData> => {
96
50
  const boundGuard =
97
51
  guard == null
98
52
  ? () => true
@@ -109,7 +63,7 @@ export const makeFilter = <TData>(token: RoleToken<TData>, guard?: (data: TData)
109
63
 
110
64
  /**
111
65
  * Typed Surface consumer props — carries the role/data-shape contract via a
112
- * {@link RoleToken}. The `type` prop is required; the string `role` prop has
66
+ * {@link Role.Role}. The `type` prop is required; the string `role` prop has
113
67
  * been removed from the consumer-facing API.
114
68
  */
115
69
  export type Props<T extends Record<string, any> = Record<string, unknown>> = {
@@ -128,16 +82,16 @@ export type Props<T extends Record<string, any> = Record<string, unknown>> = {
128
82
 
129
83
  /**
130
84
  * Typed Surface consumer props — carries the role/data-shape contract via a
131
- * {@link RoleToken}. Available as a typed overload of the Surface component so
85
+ * {@link Role.Role}. Available as a typed overload of the Surface component so
132
86
  * ad-hoc `type` fields on arbitrary spread props don't conflict with the
133
87
  * untyped consumer form.
134
88
  */
135
- export type TypedProps<TToken extends RoleToken<any>> = {
89
+ export type TypedProps<TToken extends Role.Role<any>> = {
136
90
  fallback?: FC<{ error: Error; data?: any }>;
137
91
  placeholder?: ReactNode;
138
92
  id?: string;
139
93
  type: TToken;
140
- data?: TokenData<TToken>;
94
+ data?: Role.Data<TToken>;
141
95
  limit?: number | undefined;
142
96
  } & {
143
97
  /**
@@ -163,7 +117,7 @@ export type CoreProps<T extends Record<string, any> = Record<string, unknown>> =
163
117
  /**
164
118
  * The role token defining how the data should be rendered.
165
119
  */
166
- type: RoleToken<T>;
120
+ type: Role.Role<T>;
167
121
 
168
122
  /**
169
123
  * The data to be rendered by the surface.
@@ -177,7 +131,6 @@ export type CoreProps<T extends Record<string, any> = Record<string, unknown>> =
177
131
  limit?: number | undefined;
178
132
  }>;
179
133
 
180
- // TODO(burdon): Remove ref since relying on this would be error prone.
181
134
  export type ComponentProps<T extends Record<string, any> = Record<string, any>> = {
182
135
  /**
183
136
  * The resolved role NSID string (e.g. `org.dxos.role.article`). Present on
@@ -185,7 +138,6 @@ export type ComponentProps<T extends Record<string, any> = Record<string, any>>
185
138
  * by comparing against a token's `.role` (e.g. `role === AppSurface.Section.role`).
186
139
  */
187
140
  role: string;
188
- ref?: Ref<HTMLElement>;
189
141
  } & PropsWithChildren<{
190
142
  id: string;
191
143
  data: T;
@@ -205,7 +157,7 @@ export type ComponentFunction<T extends Record<string, any> = Record<string, any
205
157
  *
206
158
  * The optional `filter` receives the consumer-supplied `role` as its second
207
159
  * argument so a single definition can encode role-specific guards (used by the
208
- * {@link SurfaceFilter}-based `create` overload).
160
+ * {@link Filter}-based `create` overload).
209
161
  *
210
162
  * @internal The `role` field is populated by the framework from the filter
211
163
  * bindings and is not authored directly.
@@ -215,7 +167,9 @@ export type ReactDefinition<T extends Record<string, any> = any> = Readonly<{
215
167
  id: string;
216
168
  role: string | string[];
217
169
  position?: Position.Position;
218
- component: ComponentFunction<T>;
170
+ component: ComponentType<any>;
171
+ /** Maps the surface props onto the component's props; see {@link TypedReactDefinition.props}. */
172
+ props?: (props: ComponentProps<T>) => Record<string, any>;
219
173
  filter?: (data: Record<string, unknown>, role?: string) => data is T;
220
174
  }>;
221
175
 
@@ -246,11 +200,35 @@ export type Definition<T extends Record<string, any> = any> = ReactDefinition<T>
246
200
  /**
247
201
  * Typed React surface definition — role is derived from the filter's bindings.
248
202
  */
249
- export type TypedReactDefinition<T extends Record<string, any> = any> = Readonly<{
203
+ export type TypedReactDefinition<
204
+ T extends Record<string, any> = any,
205
+ P extends Record<string, any> = ComponentProps<T>,
206
+ > = Readonly<{
250
207
  id: string;
251
- filter: SurfaceFilter<T>;
252
- component: ComponentFunction<T>;
208
+ filter: Filter<T>;
253
209
  position?: Position.Position;
210
+ /**
211
+ * Accepts any component type (not just a function) so a container re-exported through a
212
+ * `lazy()` barrel as `ComponentType<any>` can be registered without a cast.
213
+ */
214
+ component: ComponentType<P>;
215
+ /**
216
+ * Maps the surface props onto the component's own props, so a plain container can be registered
217
+ * directly instead of being wrapped in an adapter that unpacks `data`.
218
+ *
219
+ * Prefer this over an inline `component: ({ data }) => <Container … />`: the mapper's input type
220
+ * derives from the same `filter` that defines the surface's data shape, so the unpacking is
221
+ * checked against the filter rather than restated by hand.
222
+ *
223
+ * @example
224
+ * Surface.create({
225
+ * id: 'defaultPluginSettings',
226
+ * filter: AppSurface.settings(AppSurface.Article),
227
+ * component: DefaultSettings,
228
+ * props: ({ data: { subject } }) => ({ subject }),
229
+ * });
230
+ */
231
+ props?: (props: ComponentProps<T>) => P;
254
232
  }>;
255
233
 
256
234
  /**
@@ -258,13 +236,13 @@ export type TypedReactDefinition<T extends Record<string, any> = any> = Readonly
258
236
  */
259
237
  export type TypedWebComponentDefinition<T extends Record<string, any> = any> = Readonly<{
260
238
  id: string;
261
- filter: SurfaceFilter<T>;
239
+ filter: Filter<T>;
262
240
  tagName: string;
263
241
  position?: Position.Position;
264
242
  }>;
265
243
 
266
244
  const expandBindings = <T extends Record<string, any>>(
267
- filter: SurfaceFilter<T>,
245
+ filter: Filter<T>,
268
246
  ): { role: string | string[]; guard: (data: Record<string, unknown>, role?: string) => data is T } => {
269
247
  const bindings = filter.bindings;
270
248
  const roles = Array.from(new Set(bindings.map((binding) => binding.role)));
@@ -280,33 +258,31 @@ const expandBindings = <T extends Record<string, any>>(
280
258
  };
281
259
 
282
260
  /**
283
- * Validates that a surface or extension local ID follows NSID conventions:
284
- * each dot-separated segment must be alphanumeric, and the final segment must
285
- * be camelCase (no hyphens). This mirrors the rule enforced when the id is
286
- * appended to a plugin's NSID to form a full DXN path.
261
+ * Whether a surface or extension local ID follows NSID conventions: the final
262
+ * dot-separated segment must be camelCase (letters and digits only, starting
263
+ * with a letter — no hyphens or underscores). This mirrors the rule enforced
264
+ * when the id is appended to a plugin's NSID to form a full DXN path.
265
+ *
266
+ * A definition with an invalid id is dropped at dispatch rather than rejected
267
+ * here, so a single malformed contribution cannot crash plugin activation.
287
268
  *
288
269
  * @example Valid: 'about', 'integrationArticle', 'article.journal'
289
270
  * @example Invalid: 'integration-article', 'plugin-spec'
290
271
  */
291
- const validateLocalId = (id: string): void => {
292
- const segments = id.split('.');
293
- const finalSegment = segments[segments.length - 1];
294
- if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(finalSegment)) {
295
- throw new Error(
296
- `Invalid surface id: "${id}". The final segment "${finalSegment}" must be camelCase (letters and digits only, starting with a letter — no hyphens or underscores).`,
297
- );
298
- }
299
- };
272
+ export const isValidLocalId = (id: string): boolean => /^[a-zA-Z][a-zA-Z0-9]*$/.test(id.split('.').pop() ?? '');
300
273
 
301
274
  /**
302
275
  * Creates a React surface definition from a typed filter.
303
276
  */
304
- export function create<T extends Record<string, any> = any>(definition: TypedReactDefinition<T>): ReactDefinition<T>;
305
- export function create<T extends Record<string, any> = any>(definition: TypedReactDefinition<T>): ReactDefinition<T> {
306
- validateLocalId(definition.id);
307
- const { id, filter, component, position } = definition;
277
+ export function create<T extends Record<string, any> = any, P extends Record<string, any> = ComponentProps<T>>(
278
+ definition: TypedReactDefinition<T, P>,
279
+ ): ReactDefinition<T>;
280
+ export function create<T extends Record<string, any> = any, P extends Record<string, any> = ComponentProps<T>>(
281
+ definition: TypedReactDefinition<T, P>,
282
+ ): ReactDefinition<T> {
283
+ const { id, filter, component, props, position } = definition;
308
284
  const { role, guard } = expandBindings(filter);
309
- return { kind: 'react', id, role, position, component, filter: guard };
285
+ return { kind: 'react', id, role, position, component, props, filter: guard };
310
286
  }
311
287
 
312
288
  /**
@@ -318,7 +294,6 @@ export function createWeb<T extends Record<string, any> = any>(
318
294
  export function createWeb<T extends Record<string, any> = any>(
319
295
  definition: TypedWebComponentDefinition<T>,
320
296
  ): WebComponentDefinition<T> {
321
- validateLocalId(definition.id);
322
297
  const { id, filter, tagName, position } = definition;
323
298
  const { role, guard } = expandBindings(filter);
324
299
  return { kind: 'web-component', id, role, position, tagName, filter: guard };
@@ -3,5 +3,7 @@
3
3
  //
4
4
 
5
5
  export * from './App';
6
+ export * from './HomeSection';
7
+ export * from './NamePopover';
6
8
  export * from './PluginManager';
7
9
  export * from './Surface';
@@ -19,7 +19,7 @@ import { ContextProtocolProvider } from '@dxos/web-context-react';
19
19
  import { ActivationEvents, Capabilities } from '../../common';
20
20
  import { PluginManagerContext } from '../../context';
21
21
  import { type ActivationEvent, type Plugin, PluginManager } from '../../core';
22
- import { App, PluginManagerProvider } from '../components';
22
+ import { App, PluginManagerProvider, SurfaceManager, SurfaceManagerProvider } from '../components';
23
23
 
24
24
  const ENABLED_KEY = 'org.dxos.app-framework.enabled';
25
25
 
@@ -317,19 +317,23 @@ export const useApp = ({
317
317
  const progressRef = useRef(startupProgress);
318
318
  progressRef.current = startupProgress;
319
319
 
320
+ const surfaces = useMemo(() => new SurfaceManager(manager.capabilities), [manager]);
321
+
320
322
  return useCallback(
321
323
  () => (
322
324
  <ErrorBoundary name='app' FallbackComponent={fallback}>
323
325
  <PluginManagerProvider value={manager}>
324
326
  <ContextProtocolProvider value={manager} context={PluginManagerContext}>
325
327
  <RegistryContext.Provider value={manager.registry}>
326
- <App ready={ready} error={error} debounce={debounce} progress={progressRef.current} />
328
+ <SurfaceManagerProvider value={surfaces}>
329
+ <App ready={ready} error={error} debounce={debounce} progress={progressRef.current} />
330
+ </SurfaceManagerProvider>
327
331
  </RegistryContext.Provider>
328
332
  </ContextProtocolProvider>
329
333
  </PluginManagerProvider>
330
334
  </ErrorBoundary>
331
335
  ),
332
- [fallback, manager, ready, error],
336
+ [fallback, manager, surfaces, ready, error],
333
337
  );
334
338
  };
335
339
 
@@ -14,7 +14,7 @@ body {
14
14
  /*
15
15
  * Defaults match `@dxos/ui-theme`'s `--color-base-surface`, which resolves to
16
16
  * Tailwind's `neutral-50` / `neutral-950` in light / dark mode respectively
17
- * (see `packages/ui/ui-theme/src/css/theme/semantic.css`). Hosts can override
17
+ * (see `packages/ui/ui-theme/src/css/theme/surfaces.css`). Hosts can override
18
18
  * with the `--boot-loader-bg-*` / `--boot-loader-fg-*` custom properties on
19
19
  * `:root` if they need a different palette. Keeping the boot loader's
20
20
  * background identical to the app's `body` eliminates the flash on handoff
package/tsconfig.json CHANGED
@@ -37,6 +37,9 @@
37
37
  {
38
38
  "path": "../../common/random"
39
39
  },
40
+ {
41
+ "path": "../../common/storybook-addon-logger"
42
+ },
40
43
  {
41
44
  "path": "../../common/storybook-utils"
42
45
  },
package/vite.config.ts ADDED
@@ -0,0 +1,26 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { defineConfig } from '../../../vite.base.config.ts';
6
+
7
+ export default defineConfig({
8
+ entry: {
9
+ 'vite-plugin': 'src/vite-plugin/index.ts',
10
+ 'index': 'src/index.ts',
11
+ 'core/activation-event': 'src/core/activation-event.ts',
12
+ 'common/activation-events': 'src/common/activation-events.ts',
13
+ 'common/capabilities': 'src/common/capabilities.ts',
14
+ 'core/capability': 'src/core/capability.ts',
15
+ 'core/plugin': 'src/core/plugin.ts',
16
+ 'core/plugin-manager': 'src/core/plugin-manager.ts',
17
+ 'core/url-loader': 'src/core/url-loader.ts',
18
+ 'config': 'src/config/index.ts',
19
+ 'cli': 'src/cli/index.ts',
20
+ 'testing': 'src/testing/index.ts',
21
+ 'testing/react': 'src/testing/react.tsx',
22
+ 'ui': 'src/ui/index.ts',
23
+ },
24
+ jsx: 'react',
25
+ test: { node: { environment: 'jsdom' }, storybook: true },
26
+ });
@@ -1,35 +0,0 @@
1
- import {
2
- make,
3
- make2
4
- } from "./chunk-SYXIYT6T.mjs";
5
- import "./chunk-Q2GLJTVV.mjs";
6
- import {
7
- capabilities_exports
8
- } from "./chunk-NKVRSMFN.mjs";
9
- import "./chunk-VF37YTXJ.mjs";
10
- import "./chunk-YUVQIOTB.mjs";
11
- import "./chunk-LUH4Y5F2.mjs";
12
- import "./chunk-UGYCLOXE.mjs";
13
- import "./chunk-3NQLTQCP.mjs";
14
- import "./chunk-OO53M5UK.mjs";
15
- import {
16
- capability_exports
17
- } from "./chunk-OPTS3ZSN.mjs";
18
- import "./chunk-J5LGTIGS.mjs";
19
-
20
- // src/plugin-process-manager/history/capability.ts
21
- import * as Effect from "effect/Effect";
22
- var capability_default = capability_exports.makeModule(Effect.fnUntraced(function* () {
23
- const capabilities = yield* capability_exports.Service;
24
- const undoRegistry = make(() => capabilities.getAll(capabilities_exports.UndoMapping).flat());
25
- const invoker = yield* capability_exports.get(capabilities_exports.OperationInvoker);
26
- const historyTracker = make2(invoker, undoRegistry);
27
- return [
28
- capability_exports.contributes(capabilities_exports.UndoRegistry, undoRegistry),
29
- capability_exports.contributes(capabilities_exports.HistoryTracker, historyTracker)
30
- ];
31
- }));
32
- export {
33
- capability_default as default
34
- };
35
- //# sourceMappingURL=capability-S44TE2H7.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/plugin-process-manager/history/capability.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { OperationInvoker } from '@dxos/operation';\n\nimport { Capabilities } from '../../common';\nimport { Capability } from '../../core';\nimport * as HistoryTracker from './history-tracker';\nimport * as UndoRegistry from './undo-registry';\n\n//\n// Capability Module - contributes both UndoRegistry and HistoryTracker.\n//\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n // Get the context for synchronous access in callbacks.\n const capabilities = yield* Capability.Service;\n\n // Create UndoRegistry.\n const undoRegistry = UndoRegistry.make(() => capabilities.getAll(Capabilities.UndoMapping).flat());\n\n // Create HistoryTracker (depends on UndoRegistry and OperationInvoker).\n const invoker = yield* Capability.get(Capabilities.OperationInvoker);\n // Cast to internal type - the factory always returns OperationInvokerInternal.\n const historyTracker = HistoryTracker.make(invoker as OperationInvoker.OperationInvokerInternal, undoRegistry);\n\n return [\n Capability.contributes(Capabilities.UndoRegistry, undoRegistry),\n Capability.contributes(Capabilities.HistoryTracker, historyTracker),\n ];\n }),\n);\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAIA,YAAYA,YAAY;AAaxB,IAAA,qBAAeC,mBAAWC,WACjBC,kBAAW,aAAA;AAEhB,QAAMC,eAAe,OAAOH,mBAAWI;AAGvC,QAAMC,eAA4BC,KAAK,MAAMH,aAAaI,OAAOC,qBAAaC,WAAW,EAAEC,KAAI,CAAA;AAG/F,QAAMC,UAAU,OAAOX,mBAAWY,IAAIJ,qBAAaK,gBAAgB;AAEnE,QAAMC,iBAAgCR,MAAKK,SAAsDN,YAAAA;AAEjG,SAAO;IACLL,mBAAWe,YAAYP,qBAAaQ,cAAcX,YAAAA;IAClDL,mBAAWe,YAAYP,qBAAaS,gBAAgBH,cAAAA;;AAExD,CAAA,CAAA;",
6
- "names": ["Effect", "Capability", "makeModule", "fnUntraced", "capabilities", "Service", "undoRegistry", "make", "getAll", "Capabilities", "UndoMapping", "flat", "invoker", "get", "OperationInvoker", "historyTracker", "contributes", "UndoRegistry", "HistoryTracker"]
7
- }
@@ -1,47 +0,0 @@
1
- import {
2
- __export
3
- } from "./chunk-J5LGTIGS.mjs";
4
-
5
- // src/core/activation-event.ts
6
- var activation_event_exports = {};
7
- __export(activation_event_exports, {
8
- allOf: () => allOf,
9
- eventKey: () => eventKey,
10
- getEvents: () => getEvents,
11
- isAllOf: () => isAllOf,
12
- isOneOf: () => isOneOf,
13
- make: () => make,
14
- oneOf: () => oneOf
15
- });
16
- import { DXN } from "@dxos/keys";
17
- import { compositeKey } from "@dxos/util";
18
- var make = (nsid, specifier) => ({
19
- id: DXN.make(nsid),
20
- specifier
21
- });
22
- var eventKey = (event) => event.specifier ? compositeKey(event.id, event.specifier) : event.id;
23
- var oneOf = (...events) => ({
24
- type: "one-of",
25
- events
26
- });
27
- var allOf = (...events) => ({
28
- type: "all-of",
29
- events
30
- });
31
- var isOneOf = (events) => "type" in events && events.type === "one-of";
32
- var isAllOf = (events) => "type" in events && events.type === "all-of";
33
- var getEvents = (events) => "type" in events ? events.events : [
34
- events
35
- ];
36
-
37
- export {
38
- make,
39
- eventKey,
40
- oneOf,
41
- allOf,
42
- isOneOf,
43
- isAllOf,
44
- getEvents,
45
- activation_event_exports
46
- };
47
- //# sourceMappingURL=chunk-3NQLTQCP.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/core/activation-event.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { DXN } from '@dxos/keys';\nimport { compositeKey } from '@dxos/util';\n\n/**\n * A unique DXN identifier representing an event.\n *\n * @example dxn:org.dxos.plugin.example.event.ready\n */\nexport type ActivationEvent = {\n id: DXN.DXN;\n specifier?: string;\n};\n\n/**\n * An activation event that can be a single event, or a combination of events.\n */\nexport type Events =\n | ActivationEvent\n | { type: 'one-of'; events: ActivationEvent[] }\n | { type: 'all-of'; events: ActivationEvent[] };\n\n/**\n * Helper to define an activation event from an NSID.\n * Static NSID strings are validated at compile time via {@link DXN.Name}.\n */\nexport const make: {\n <T extends string>(\n nsid: [DXN.Name<T>] extends [never] ? `Invalid NSID \"${T}\": final segment must be camelCase (no hyphens)` : T,\n specifier?: string,\n ): ActivationEvent;\n} = (nsid: string, specifier?: string): ActivationEvent => ({\n id: DXN.make(nsid),\n specifier,\n});\n\n/**\n * Helper to create an activation event key.\n */\nexport const eventKey = (event: ActivationEvent) =>\n event.specifier ? compositeKey(event.id, event.specifier) : event.id;\n\n/**\n * Helper to create an activation event that triggers when any of the given events are activated.\n */\nexport const oneOf = (...events: ActivationEvent[]) => ({ type: 'one-of' as const, events });\n\n/**\n * Helper to create an activation event that triggers when all of the given events are activated.\n */\nexport const allOf = (...events: ActivationEvent[]) => ({ type: 'all-of' as const, events });\n\n/**\n * Helper to check if an activation event is a one-of event.\n */\nexport const isOneOf = (events: Events): events is { type: 'one-of'; events: ActivationEvent[] } =>\n 'type' in events && events.type === 'one-of';\n\n/**\n * Helper to check if an activation event is an all-of event.\n */\nexport const isAllOf = (events: Events): events is { type: 'all-of'; events: ActivationEvent[] } =>\n 'type' in events && events.type === 'all-of';\n\n/**\n * Helper to get the events from an activation event.\n */\nexport const getEvents = (events: Events) => ('type' in events ? events.events : [events]);\n"],
5
- "mappings": ";;;;;AAAA;;;;;;;;;;AAIA,SAASA,WAAW;AACpB,SAASC,oBAAoB;AAwBtB,IAAMC,OAKT,CAACC,MAAcC,eAAyC;EAC1DC,IAAIL,IAAIE,KAAKC,IAAAA;EACbC;AACF;AAKO,IAAME,WAAW,CAACC,UACvBA,MAAMH,YAAYH,aAAaM,MAAMF,IAAIE,MAAMH,SAAS,IAAIG,MAAMF;AAK7D,IAAMG,QAAQ,IAAIC,YAA+B;EAAEC,MAAM;EAAmBD;AAAO;AAKnF,IAAME,QAAQ,IAAIF,YAA+B;EAAEC,MAAM;EAAmBD;AAAO;AAKnF,IAAMG,UAAU,CAACH,WACtB,UAAUA,UAAUA,OAAOC,SAAS;AAK/B,IAAMG,UAAU,CAACJ,WACtB,UAAUA,UAAUA,OAAOC,SAAS;AAK/B,IAAMI,YAAY,CAACL,WAAoB,UAAUA,SAASA,OAAOA,SAAS;EAACA;;",
6
- "names": ["DXN", "compositeKey", "make", "nsid", "specifier", "id", "eventKey", "event", "oneOf", "events", "type", "allOf", "isOneOf", "isAllOf", "getEvents"]
7
- }
@@ -1,7 +0,0 @@
1
- // src/config/index.ts
2
- import { Config2 } from "@dxos/protocols";
3
-
4
- export {
5
- Config2
6
- };
7
- //# sourceMappingURL=chunk-53HJHMS5.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/config/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nexport { Config2 } from '@dxos/protocols';\n"],
5
- "mappings": ";AAIA,SAASA,eAAe;",
6
- "names": ["Config2"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/context.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@dxos/web-context';\n\nimport { type PluginManager } from './core';\n\nexport const PluginManagerContext = createContext<PluginManager.PluginManager>('org.dxos.app-framework.plugin-manager');\n"],
5
- "mappings": ";AAIA,SAASA,qBAAqB;AAIvB,IAAMC,uBAAuBD,cAA2C,uCAAA;",
6
- "names": ["createContext", "PluginManagerContext"]
7
- }
@@ -1,10 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __export = (target, all) => {
3
- for (var name in all)
4
- __defProp(target, name, { get: all[name], enumerable: true });
5
- };
6
-
7
- export {
8
- __export
9
- };
10
- //# sourceMappingURL=chunk-J5LGTIGS.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }