@dxos/app-framework 0.8.4-main.b97322e → 0.8.4-main.c4373fc

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 (211) hide show
  1. package/.storybook/main.mts +11 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  4. package/.swc/plugins/{v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 → linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7} +0 -0
  5. package/dist/lib/browser/{app-graph-builder-LYF7EKNN.mjs → app-graph-builder-77MY7KAY.mjs} +31 -30
  6. package/dist/lib/browser/app-graph-builder-77MY7KAY.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-FO2PH7M3.mjs → chunk-4NFLRSTX.mjs} +189 -137
  8. package/dist/lib/browser/chunk-4NFLRSTX.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-FMN65HSW.mjs → chunk-OKF2PAWO.mjs} +408 -281
  10. package/dist/lib/browser/chunk-OKF2PAWO.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-ORWHM7CO.mjs → chunk-SCPE4ZO2.mjs} +11 -8
  12. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +20 -28
  14. package/dist/lib/browser/index.mjs.map +3 -3
  15. package/dist/lib/browser/{intent-dispatcher-LSYQZSEB.mjs → intent-dispatcher-Y4LZNOBC.mjs} +2 -2
  16. package/dist/lib/browser/{intent-resolver-ZTNOSO3A.mjs → intent-resolver-XO5OYWVD.mjs} +7 -7
  17. package/dist/lib/browser/intent-resolver-XO5OYWVD.mjs.map +7 -0
  18. package/dist/lib/browser/meta.json +1 -1
  19. package/dist/lib/browser/{store-KML2R4IE.mjs → store-E3YSBPJQ.mjs} +4 -4
  20. package/dist/lib/browser/{store-KML2R4IE.mjs.map → store-E3YSBPJQ.mjs.map} +2 -2
  21. package/dist/lib/browser/testing/index.mjs +14 -19
  22. package/dist/lib/browser/testing/index.mjs.map +3 -3
  23. package/dist/lib/browser/worker.mjs +7 -9
  24. package/dist/lib/node-esm/{app-graph-builder-SAOWGJDK.mjs → app-graph-builder-WK7WBM6I.mjs} +31 -30
  25. package/dist/lib/node-esm/app-graph-builder-WK7WBM6I.mjs.map +7 -0
  26. package/dist/lib/node-esm/{chunk-ZEZ4FVEU.mjs → chunk-7DNZQ6H2.mjs} +408 -281
  27. package/dist/lib/node-esm/chunk-7DNZQ6H2.mjs.map +7 -0
  28. package/dist/lib/node-esm/{chunk-73HGSHKE.mjs → chunk-AHCD4UYO.mjs} +189 -137
  29. package/dist/lib/node-esm/chunk-AHCD4UYO.mjs.map +7 -0
  30. package/dist/lib/node-esm/{chunk-UMZQERLE.mjs → chunk-ZX63QUGE.mjs} +11 -8
  31. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +7 -0
  32. package/dist/lib/node-esm/index.mjs +20 -28
  33. package/dist/lib/node-esm/index.mjs.map +3 -3
  34. package/dist/lib/node-esm/{intent-dispatcher-6CYNGPSW.mjs → intent-dispatcher-R4CCPBHO.mjs} +2 -2
  35. package/dist/lib/node-esm/{intent-resolver-W7Z7WFFM.mjs → intent-resolver-NVYY6BQA.mjs} +7 -7
  36. package/dist/lib/node-esm/intent-resolver-NVYY6BQA.mjs.map +7 -0
  37. package/dist/lib/node-esm/meta.json +1 -1
  38. package/dist/lib/node-esm/{store-QEXGXLWZ.mjs → store-QA5DGTOS.mjs} +4 -4
  39. package/dist/lib/node-esm/{store-QEXGXLWZ.mjs.map → store-QA5DGTOS.mjs.map} +2 -2
  40. package/dist/lib/node-esm/testing/index.mjs +14 -19
  41. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  42. package/dist/lib/node-esm/worker.mjs +7 -9
  43. package/dist/types/src/common/capabilities.d.ts +85 -8
  44. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  45. package/dist/types/src/common/collaboration.d.ts +10 -9
  46. package/dist/types/src/common/collaboration.d.ts.map +1 -1
  47. package/dist/types/src/common/events.d.ts.map +1 -1
  48. package/dist/types/src/common/file.d.ts +1 -1
  49. package/dist/types/src/common/file.d.ts.map +1 -1
  50. package/dist/types/src/common/index.d.ts +1 -1
  51. package/dist/types/src/common/index.d.ts.map +1 -1
  52. package/dist/types/src/common/layout.d.ts +1 -3
  53. package/dist/types/src/common/layout.d.ts.map +1 -1
  54. package/dist/types/src/common/surface.d.ts +7 -13
  55. package/dist/types/src/common/surface.d.ts.map +1 -1
  56. package/dist/types/src/common/translations.d.ts +1 -1
  57. package/dist/types/src/common/translations.d.ts.map +1 -1
  58. package/dist/types/src/components/App.d.ts +10 -0
  59. package/dist/types/src/components/App.d.ts.map +1 -0
  60. package/dist/types/src/components/App.stories.d.ts +14 -0
  61. package/dist/types/src/components/App.stories.d.ts.map +1 -0
  62. package/dist/types/src/components/DefaultFallback.d.ts +8 -0
  63. package/dist/types/src/components/DefaultFallback.d.ts.map +1 -0
  64. package/dist/types/src/components/index.d.ts +2 -0
  65. package/dist/types/src/components/index.d.ts.map +1 -0
  66. package/dist/types/src/{App.d.ts → components/useApp.d.ts} +7 -6
  67. package/dist/types/src/components/useApp.d.ts.map +1 -0
  68. package/dist/types/src/components/useLoading.d.ts +19 -0
  69. package/dist/types/src/components/useLoading.d.ts.map +1 -0
  70. package/dist/types/src/core/capabilities.d.ts +5 -2
  71. package/dist/types/src/core/capabilities.d.ts.map +1 -1
  72. package/dist/types/src/core/manager.d.ts +6 -2
  73. package/dist/types/src/core/manager.d.ts.map +1 -1
  74. package/dist/types/src/core/plugin.d.ts +4 -1
  75. package/dist/types/src/core/plugin.d.ts.map +1 -1
  76. package/dist/types/src/index.d.ts +1 -1
  77. package/dist/types/src/index.d.ts.map +1 -1
  78. package/dist/types/src/playground/debug/Debug.d.ts +1 -1
  79. package/dist/types/src/playground/debug/plugin.d.ts +1 -1
  80. package/dist/types/src/playground/debug/plugin.d.ts.map +1 -1
  81. package/dist/types/src/playground/generator/Main.d.ts +1 -1
  82. package/dist/types/src/playground/generator/Toolbar.d.ts +1 -1
  83. package/dist/types/src/playground/generator/Toolbar.d.ts.map +1 -1
  84. package/dist/types/src/playground/generator/generator.d.ts +1 -1
  85. package/dist/types/src/playground/generator/generator.d.ts.map +1 -1
  86. package/dist/types/src/playground/generator/plugin.d.ts +1 -1
  87. package/dist/types/src/playground/generator/plugin.d.ts.map +1 -1
  88. package/dist/types/src/playground/layout/Layout.d.ts +2 -2
  89. package/dist/types/src/playground/layout/plugin.d.ts +1 -1
  90. package/dist/types/src/playground/layout/plugin.d.ts.map +1 -1
  91. package/dist/types/src/playground/logger/Toolbar.d.ts +1 -1
  92. package/dist/types/src/playground/logger/Toolbar.d.ts.map +1 -1
  93. package/dist/types/src/playground/logger/plugin.d.ts +1 -1
  94. package/dist/types/src/playground/logger/plugin.d.ts.map +1 -1
  95. package/dist/types/src/playground/logger/schema.d.ts +1 -1
  96. package/dist/types/src/playground/logger/schema.d.ts.map +1 -1
  97. package/dist/types/src/playground/playground.stories.d.ts +5 -4
  98. package/dist/types/src/playground/playground.stories.d.ts.map +1 -1
  99. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +1 -1
  100. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +1 -1
  101. package/dist/types/src/plugin-intent/actions.d.ts +5 -7
  102. package/dist/types/src/plugin-intent/actions.d.ts.map +1 -1
  103. package/dist/types/src/plugin-intent/errors.d.ts.map +1 -1
  104. package/dist/types/src/plugin-intent/index.d.ts +1 -0
  105. package/dist/types/src/plugin-intent/index.d.ts.map +1 -1
  106. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +7 -7
  107. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +1 -1
  108. package/dist/types/src/plugin-intent/intent.d.ts +1 -1
  109. package/dist/types/src/plugin-intent/intent.d.ts.map +1 -1
  110. package/dist/types/src/plugin-intent/meta.d.ts +3 -0
  111. package/dist/types/src/plugin-intent/meta.d.ts.map +1 -0
  112. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +1 -1
  113. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +1 -1
  114. package/dist/types/src/plugin-settings/actions.d.ts +5 -7
  115. package/dist/types/src/plugin-settings/actions.d.ts.map +1 -1
  116. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +1 -1
  117. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +1 -1
  118. package/dist/types/src/plugin-settings/intent-resolver.d.ts +1 -1
  119. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +1 -1
  120. package/dist/types/src/plugin-settings/meta.d.ts +3 -0
  121. package/dist/types/src/plugin-settings/meta.d.ts.map +1 -0
  122. package/dist/types/src/plugin-settings/store.d.ts +1 -1
  123. package/dist/types/src/plugin-settings/store.d.ts.map +1 -1
  124. package/dist/types/src/plugin-settings/translations.d.ts +2 -1
  125. package/dist/types/src/plugin-settings/translations.d.ts.map +1 -1
  126. package/dist/types/src/react/ErrorBoundary.d.ts +13 -14
  127. package/dist/types/src/react/ErrorBoundary.d.ts.map +1 -1
  128. package/dist/types/src/react/IntentContext.d.ts.map +1 -1
  129. package/dist/types/src/react/Surface.d.ts +2 -2
  130. package/dist/types/src/react/Surface.d.ts.map +1 -1
  131. package/dist/types/src/react/Surface.stories.d.ts +6 -5
  132. package/dist/types/src/react/Surface.stories.d.ts.map +1 -1
  133. package/dist/types/src/react/common.d.ts.map +1 -1
  134. package/dist/types/src/react/useCapabilities.d.ts.map +1 -1
  135. package/dist/types/src/testing/withPluginManager.d.ts +6 -6
  136. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  137. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  138. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  139. package/dist/types/tsconfig.tsbuildinfo +1 -1
  140. package/moon.yml +4 -0
  141. package/package.json +34 -29
  142. package/src/common/capabilities.ts +109 -10
  143. package/src/common/collaboration.ts +6 -9
  144. package/src/common/events.ts +3 -1
  145. package/src/common/file.ts +1 -1
  146. package/src/common/index.ts +1 -1
  147. package/src/common/layout.ts +3 -4
  148. package/src/common/surface.ts +15 -18
  149. package/src/common/translations.ts +1 -1
  150. package/src/components/App.stories.tsx +33 -0
  151. package/src/components/App.tsx +59 -0
  152. package/src/components/DefaultFallback.tsx +26 -0
  153. package/src/components/index.ts +5 -0
  154. package/src/{App.tsx → components/useApp.tsx} +24 -136
  155. package/src/components/useLoading.tsx +70 -0
  156. package/src/core/capabilities.test.ts +2 -2
  157. package/src/core/capabilities.ts +12 -7
  158. package/src/core/manager.test.ts +22 -21
  159. package/src/core/manager.ts +139 -54
  160. package/src/core/plugin.ts +8 -2
  161. package/src/helpers.test.ts +1 -1
  162. package/src/index.ts +1 -1
  163. package/src/playground/debug/Debug.tsx +1 -1
  164. package/src/playground/debug/plugin.ts +7 -8
  165. package/src/playground/generator/Toolbar.tsx +2 -1
  166. package/src/playground/generator/generator.ts +4 -4
  167. package/src/playground/generator/plugin.ts +12 -13
  168. package/src/playground/layout/plugin.ts +10 -9
  169. package/src/playground/logger/Toolbar.tsx +2 -1
  170. package/src/playground/logger/plugin.ts +30 -25
  171. package/src/playground/logger/schema.ts +1 -1
  172. package/src/playground/playground.stories.tsx +20 -16
  173. package/src/plugin-intent/IntentPlugin.ts +13 -13
  174. package/src/plugin-intent/actions.ts +4 -6
  175. package/src/plugin-intent/errors.ts +1 -0
  176. package/src/plugin-intent/index.ts +1 -0
  177. package/src/plugin-intent/intent-dispatcher.test.ts +10 -3
  178. package/src/plugin-intent/intent-dispatcher.ts +16 -12
  179. package/src/plugin-intent/intent.ts +1 -1
  180. package/src/plugin-intent/meta.ts +10 -0
  181. package/src/plugin-settings/SettingsPlugin.ts +27 -28
  182. package/src/plugin-settings/actions.ts +9 -13
  183. package/src/plugin-settings/app-graph-builder.ts +20 -17
  184. package/src/plugin-settings/intent-resolver.ts +5 -4
  185. package/src/plugin-settings/meta.ts +10 -0
  186. package/src/plugin-settings/store.ts +1 -1
  187. package/src/plugin-settings/translations.ts +3 -3
  188. package/src/react/ErrorBoundary.tsx +26 -15
  189. package/src/react/IntentContext.tsx +3 -2
  190. package/src/react/Surface.stories.tsx +23 -18
  191. package/src/react/Surface.tsx +14 -5
  192. package/src/react/common.ts +2 -1
  193. package/src/react/useCapabilities.ts +2 -1
  194. package/src/testing/withPluginManager.stories.tsx +9 -5
  195. package/src/testing/withPluginManager.tsx +25 -29
  196. package/tsconfig.json +2 -9
  197. package/vitest.config.ts +8 -6
  198. package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
  199. package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs.map +0 -7
  200. package/dist/lib/browser/chunk-FMN65HSW.mjs.map +0 -7
  201. package/dist/lib/browser/chunk-FO2PH7M3.mjs.map +0 -7
  202. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  203. package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs.map +0 -7
  204. package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs.map +0 -7
  205. package/dist/lib/node-esm/chunk-73HGSHKE.mjs.map +0 -7
  206. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  207. package/dist/lib/node-esm/chunk-ZEZ4FVEU.mjs.map +0 -7
  208. package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs.map +0 -7
  209. package/dist/types/src/App.d.ts.map +0 -1
  210. /package/dist/lib/browser/{intent-dispatcher-LSYQZSEB.mjs.map → intent-dispatcher-Y4LZNOBC.mjs.map} +0 -0
  211. /package/dist/lib/node-esm/{intent-dispatcher-6CYNGPSW.mjs.map → intent-dispatcher-R4CCPBHO.mjs.map} +0 -0
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { createConfig } from '../../../../tools/storybook/.storybook/main';
6
+
7
+ export const stories = [
8
+ '../src/**/*.stories.tsx',
9
+ ]
10
+
11
+ export default createConfig({ stories });
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { preview } from '../../../../tools/storybook/.storybook/preview';
6
+
7
+ export * from '../../../../tools/storybook/.storybook/preview';
8
+ export default preview;
@@ -1,26 +1,27 @@
1
1
  import {
2
2
  SETTINGS_ID,
3
3
  SETTINGS_KEY,
4
- SETTINGS_PLUGIN,
5
- SettingsAction
6
- } from "./chunk-ORWHM7CO.mjs";
4
+ SettingsAction,
5
+ meta
6
+ } from "./chunk-SCPE4ZO2.mjs";
7
7
  import {
8
8
  Capabilities,
9
9
  contributes,
10
10
  createIntent
11
- } from "./chunk-FMN65HSW.mjs";
11
+ } from "./chunk-OKF2PAWO.mjs";
12
12
 
13
13
  // src/plugin-settings/app-graph-builder.ts
14
14
  import { Rx } from "@effect-rx/rx-react";
15
- import { Option, pipe } from "effect";
16
- import { createExtension, ROOT_ID } from "@dxos/app-graph";
15
+ import * as Function from "effect/Function";
16
+ import * as Option from "effect/Option";
17
+ import { ROOT_ID, createExtension } from "@dxos/app-graph";
17
18
  import { isNonNullable } from "@dxos/util";
18
- var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBuilder, [
19
+ var app_graph_builder_default = ((context) => contributes(Capabilities.AppGraphBuilder, [
19
20
  createExtension({
20
- id: `${SETTINGS_PLUGIN}/action`,
21
- actions: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => node2.id === ROOT_ID ? Option.some(node2) : Option.none()), Option.map(() => [
21
+ id: `${meta.id}/action`,
22
+ actions: (node) => Rx.make((get) => Function.pipe(get(node), Option.flatMap((node2) => node2.id === ROOT_ID ? Option.some(node2) : Option.none()), Option.map(() => [
22
23
  {
23
- id: SETTINGS_PLUGIN,
24
+ id: meta.id,
24
25
  data: async () => {
25
26
  const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
26
27
  await dispatch(createIntent(SettingsAction.Open));
@@ -29,7 +30,7 @@ var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBu
29
30
  label: [
30
31
  "open settings label",
31
32
  {
32
- ns: SETTINGS_PLUGIN
33
+ ns: meta.id
33
34
  }
34
35
  ],
35
36
  icon: "ph--gear--regular",
@@ -43,16 +44,16 @@ var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBu
43
44
  ]), Option.getOrElse(() => [])))
44
45
  }),
45
46
  createExtension({
46
- id: `${SETTINGS_PLUGIN}/core`,
47
- connector: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => node2.id === ROOT_ID ? Option.some(node2) : Option.none()), Option.map(() => [
47
+ id: `${meta.id}/core`,
48
+ connector: (node) => Rx.make((get) => Function.pipe(get(node), Option.flatMap((node2) => node2.id === ROOT_ID ? Option.some(node2) : Option.none()), Option.map(() => [
48
49
  {
49
50
  id: SETTINGS_ID,
50
- type: SETTINGS_PLUGIN,
51
+ type: meta.id,
51
52
  properties: {
52
53
  label: [
53
54
  "app settings label",
54
55
  {
55
- ns: SETTINGS_PLUGIN
56
+ ns: meta.id
56
57
  }
57
58
  ],
58
59
  icon: "ph--gear--regular",
@@ -64,8 +65,8 @@ var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBu
64
65
  ]), Option.getOrElse(() => [])))
65
66
  }),
66
67
  createExtension({
67
- id: `${SETTINGS_PLUGIN}/core-plugins`,
68
- connector: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => node2.id !== SETTINGS_ID ? Option.none() : Option.some(node2)), Option.map(() => {
68
+ id: `${meta.id}/core-plugins`,
69
+ connector: (node) => Rx.make((get) => Function.pipe(get(node), Option.flatMap((node2) => node2.id !== SETTINGS_ID ? Option.none() : Option.some(node2)), Option.map(() => {
69
70
  const manager = get(context.capability(Capabilities.PluginManager));
70
71
  const [settingsStore] = get(context.capabilities(Capabilities.SettingsStore));
71
72
  return [
@@ -78,13 +79,13 @@ var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBu
78
79
  plugin.meta,
79
80
  settings
80
81
  ];
81
- }).filter(isNonNullable).map(([meta, settings]) => ({
82
- id: `${SETTINGS_KEY}:${meta.id.replaceAll("/", ":")}`,
82
+ }).filter(isNonNullable).map(([meta2, settings]) => ({
83
+ id: `${SETTINGS_KEY}:${meta2.id.replaceAll("/", ":")}`,
83
84
  type: "category",
84
85
  data: settings,
85
86
  properties: {
86
- label: meta.name ?? meta.id,
87
- icon: meta.icon ?? "ph--circle--regular"
87
+ label: meta2.name ?? meta2.id,
88
+ icon: meta2.icon ?? "ph--circle--regular"
88
89
  }
89
90
  })),
90
91
  {
@@ -94,7 +95,7 @@ var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBu
94
95
  label: [
95
96
  "custom plugins label",
96
97
  {
97
- ns: SETTINGS_PLUGIN
98
+ ns: meta.id
98
99
  }
99
100
  ],
100
101
  icon: "ph--squares-four--regular",
@@ -106,8 +107,8 @@ var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBu
106
107
  }), Option.getOrElse(() => [])))
107
108
  }),
108
109
  createExtension({
109
- id: `${SETTINGS_PLUGIN}/custom-plugins`,
110
- connector: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => node2.id !== `${SETTINGS_KEY}:custom-plugins` ? Option.none() : Option.some(node2)), Option.map(() => {
110
+ id: `${meta.id}/custom-plugins`,
111
+ connector: (node) => Rx.make((get) => Function.pipe(get(node), Option.flatMap((node2) => node2.id !== `${SETTINGS_KEY}:custom-plugins` ? Option.none() : Option.some(node2)), Option.map(() => {
111
112
  const manager = get(context.capability(Capabilities.PluginManager));
112
113
  const [settingsStore] = get(context.capabilities(Capabilities.SettingsStore));
113
114
  return manager.plugins.filter((plugin) => !manager.core.includes(plugin.meta.id)).map((plugin) => {
@@ -119,19 +120,19 @@ var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBu
119
120
  plugin.meta,
120
121
  settings
121
122
  ];
122
- }).filter(isNonNullable).map(([meta, settings]) => ({
123
- id: `${SETTINGS_KEY}:${meta.id.replaceAll("/", ":")}`,
123
+ }).filter(isNonNullable).map(([meta2, settings]) => ({
124
+ id: `${SETTINGS_KEY}:${meta2.id.replaceAll("/", ":")}`,
124
125
  type: "category",
125
126
  data: settings,
126
127
  properties: {
127
- label: meta.name ?? meta.id,
128
- icon: meta.icon ?? "ph--circle--regular"
128
+ label: meta2.name ?? meta2.id,
129
+ icon: meta2.icon ?? "ph--circle--regular"
129
130
  }
130
131
  }));
131
132
  }), Option.getOrElse(() => [])))
132
133
  })
133
- ]);
134
+ ]));
134
135
  export {
135
136
  app_graph_builder_default as default
136
137
  };
137
- //# sourceMappingURL=app-graph-builder-LYF7EKNN.mjs.map
138
+ //# sourceMappingURL=app-graph-builder-77MY7KAY.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugin-settings/app-graph-builder.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport * as Function from 'effect/Function';\nimport * as Option from 'effect/Option';\n\nimport { ROOT_ID, createExtension } from '@dxos/app-graph';\nimport { type SettingsStore, type SettingsValue } from '@dxos/local-storage';\nimport { isNonNullable } from '@dxos/util';\n\nimport { Capabilities } from '../common';\nimport { type PluginContext, type PluginMeta, contributes } from '../core';\nimport { createIntent } from '../plugin-intent';\n\nimport { SETTINGS_ID, SETTINGS_KEY, SettingsAction } from './actions';\nimport { meta } from './meta';\n\nexport default (context: PluginContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${meta.id}/action`,\n actions: (node) =>\n Rx.make((get) =>\n Function.pipe(\n get(node),\n Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),\n Option.map(() => [\n {\n id: meta.id,\n data: async () => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n await dispatch(createIntent(SettingsAction.Open));\n },\n properties: {\n label: ['open settings label', { ns: meta.id }],\n icon: 'ph--gear--regular',\n disposition: 'menu',\n keyBinding: {\n macos: 'meta+,',\n windows: 'alt+,',\n },\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n createExtension({\n id: `${meta.id}/core`,\n connector: (node) =>\n Rx.make((get) =>\n Function.pipe(\n get(node),\n Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),\n Option.map(() => [\n {\n id: SETTINGS_ID,\n type: meta.id,\n properties: {\n label: ['app settings label', { ns: meta.id }],\n icon: 'ph--gear--regular',\n disposition: 'pin-end',\n position: 'hoist',\n testId: 'treeView.appSettings',\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n createExtension({\n id: `${meta.id}/core-plugins`,\n connector: (node) =>\n Rx.make((get) =>\n Function.pipe(\n get(node),\n Option.flatMap((node) => (node.id !== SETTINGS_ID ? Option.none() : Option.some(node))),\n Option.map(() => {\n const manager = get(context.capability(Capabilities.PluginManager));\n const [settingsStore] = get(context.capabilities(Capabilities.SettingsStore));\n return [\n ...manager.plugins\n .filter((plugin) => manager.core.includes(plugin.meta.id))\n .map((plugin): [PluginMeta, SettingsStore<SettingsValue>] | null => {\n const settings = settingsStore?.getStore(plugin.meta.id);\n if (!settings) {\n return null;\n }\n\n return [plugin.meta, settings];\n })\n .filter(isNonNullable)\n .map(([meta, settings]) => ({\n id: `${SETTINGS_KEY}:${meta.id.replaceAll('/', ':')}`,\n type: 'category',\n data: settings,\n properties: {\n label: meta.name ?? meta.id,\n icon: meta.icon ?? 'ph--circle--regular',\n },\n })),\n\n {\n id: `${SETTINGS_KEY}:custom-plugins`,\n type: 'category',\n properties: {\n label: ['custom plugins label', { ns: meta.id }],\n icon: 'ph--squares-four--regular',\n role: 'branch',\n disposition: 'collection',\n },\n },\n ];\n }),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n createExtension({\n id: `${meta.id}/custom-plugins`,\n connector: (node) =>\n Rx.make((get) =>\n Function.pipe(\n get(node),\n Option.flatMap((node) =>\n node.id !== `${SETTINGS_KEY}:custom-plugins` ? Option.none() : Option.some(node),\n ),\n Option.map(() => {\n const manager = get(context.capability(Capabilities.PluginManager));\n const [settingsStore] = get(context.capabilities(Capabilities.SettingsStore));\n return manager.plugins\n .filter((plugin) => !manager.core.includes(plugin.meta.id))\n .map((plugin): [PluginMeta, SettingsStore<SettingsValue>] | null => {\n const settings = settingsStore?.getStore(plugin.meta.id);\n if (!settings) {\n return null;\n }\n\n return [plugin.meta, settings];\n })\n .filter(isNonNullable)\n .map(([meta, settings]) => ({\n id: `${SETTINGS_KEY}:${meta.id.replaceAll('/', ':')}`,\n type: 'category',\n data: settings,\n properties: {\n label: meta.name ?? meta.id,\n icon: meta.icon ?? 'ph--circle--regular',\n },\n }));\n }),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n ]);\n"],
5
+ "mappings": "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",
6
+ "names": ["Rx", "Function", "Option", "ROOT_ID", "createExtension", "isNonNullable", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "meta", "actions", "node", "Rx", "make", "get", "pipe", "flatMap", "ROOT_ID", "some", "none", "map", "data", "dispatchPromise", "dispatch", "getCapability", "IntentDispatcher", "createIntent", "SettingsAction", "Open", "properties", "label", "ns", "icon", "disposition", "keyBinding", "macos", "windows", "getOrElse", "connector", "SETTINGS_ID", "type", "position", "testId", "manager", "capability", "PluginManager", "settingsStore", "capabilities", "SettingsStore", "plugins", "filter", "plugin", "core", "includes", "settings", "getStore", "isNonNullable", "SETTINGS_KEY", "replaceAll", "name", "role"]
7
+ }
@@ -2,7 +2,7 @@ import {
2
2
  Capabilities,
3
3
  Events,
4
4
  PluginManager
5
- } from "./chunk-FMN65HSW.mjs";
5
+ } from "./chunk-OKF2PAWO.mjs";
6
6
 
7
7
  // src/react/PluginManagerProvider.ts
8
8
  import { createContext, useContext } from "react";
@@ -23,7 +23,7 @@ var useCapability = (interfaceDef) => {
23
23
  const capabilities = useCapabilities(interfaceDef);
24
24
  invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`, {
25
25
  F: __dxlog_file,
26
- L: 28,
26
+ L: 29,
27
27
  S: void 0,
28
28
  A: [
29
29
  "capabilities.length > 0",
@@ -39,14 +39,22 @@ var useAppGraph = () => useCapability(Capabilities.AppGraph);
39
39
  var useLayout = () => useCapability(Capabilities.Layout);
40
40
 
41
41
  // src/react/ErrorBoundary.tsx
42
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
42
43
  import React, { Component } from "react";
43
- var ErrorBoundary = class extends Component {
44
- constructor(props) {
45
- super(props);
46
- this.state = {
47
- error: void 0
48
- };
44
+ function _define_property(obj, key, value) {
45
+ if (key in obj) {
46
+ Object.defineProperty(obj, key, {
47
+ value,
48
+ enumerable: true,
49
+ configurable: true,
50
+ writable: true
51
+ });
52
+ } else {
53
+ obj[key] = value;
49
54
  }
55
+ return obj;
56
+ }
57
+ var ErrorBoundary = class extends Component {
50
58
  static getDerivedStateFromError(error) {
51
59
  return {
52
60
  error
@@ -59,10 +67,10 @@ var ErrorBoundary = class extends Component {
59
67
  }
60
68
  render() {
61
69
  if (this.state.error) {
62
- return /* @__PURE__ */ React.createElement(this.props.fallback, {
70
+ const Fallback = this.props.fallback ?? DefaultFallback;
71
+ return /* @__PURE__ */ React.createElement(Fallback, {
63
72
  data: this.props.data,
64
- error: this.state.error,
65
- reset: this.resetError
73
+ error: this.state.error
66
74
  });
67
75
  }
68
76
  return this.props.children;
@@ -72,11 +80,30 @@ var ErrorBoundary = class extends Component {
72
80
  error: void 0
73
81
  });
74
82
  }
83
+ constructor(...args) {
84
+ super(...args), _define_property(this, "state", {
85
+ error: void 0
86
+ });
87
+ }
88
+ };
89
+ var DefaultFallback = ({ data, error }) => {
90
+ var _effect = _useSignals();
91
+ try {
92
+ return /* @__PURE__ */ React.createElement("div", {
93
+ className: "flex flex-col gap-2 overflow-hidden border border-red-500 rounded-sm"
94
+ }, /* @__PURE__ */ React.createElement("h1", {
95
+ className: "p-2"
96
+ }, "ERROR: ", error.message), /* @__PURE__ */ React.createElement("pre", {
97
+ className: "p-2 overflow-y-auto text-sm text-subdued"
98
+ }, JSON.stringify(data, null, 2)));
99
+ } finally {
100
+ _effect.f();
101
+ }
75
102
  };
76
103
 
77
104
  // src/react/Surface.tsx
78
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
79
- import React2, { memo, forwardRef, Suspense, useMemo, Fragment } from "react";
105
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
106
+ import React2, { Fragment, Suspense, forwardRef, memo, useMemo } from "react";
80
107
  import { useDefaultValue } from "@dxos/react-hooks";
81
108
  import { byPosition } from "@dxos/util";
82
109
  var DEFAULT_PLACEHOLDER = /* @__PURE__ */ React2.createElement(Fragment, null);
@@ -98,7 +125,7 @@ var isSurfaceAvailable = (context, { role, data }) => {
98
125
  return candidates.length > 0;
99
126
  };
100
127
  var Surface = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef(({ id: _id, role, data: _data, limit, fallback, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
101
- var _effect = _useSignals();
128
+ var _effect = _useSignals2();
102
129
  try {
103
130
  const surfaces = useSurfaces();
104
131
  const data = useDefaultValue(_data, () => ({}));
@@ -146,14 +173,17 @@ var useIntentResolver = (module, resolver) => {
146
173
  ]);
147
174
  };
148
175
 
149
- // src/App.tsx
150
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
176
+ // src/components/useApp.tsx
151
177
  import { RegistryContext } from "@effect-rx/rx-react";
152
178
  import { effect } from "@preact/signals-core";
153
- import React3, { useCallback, useEffect as useEffect2, useMemo as useMemo2, useState } from "react";
179
+ import React5, { useCallback, useEffect as useEffect3, useMemo as useMemo2 } from "react";
154
180
  import { invariant as invariant2 } from "@dxos/invariant";
155
181
  import { live } from "@dxos/live-object";
156
- import { useDefaultValue as useDefaultValue2 } from "@dxos/react-hooks";
182
+ import { useAsyncEffect, useDefaultValue as useDefaultValue2 } from "@dxos/react-hooks";
183
+
184
+ // src/components/App.tsx
185
+ import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
186
+ import React3 from "react";
157
187
 
158
188
  // src/helpers.ts
159
189
  var topologicalSort = (nodes) => {
@@ -186,10 +216,125 @@ var topologicalSort = (nodes) => {
186
216
  return allDependencies.map((id) => nodes.find((node) => node.id === id)).filter((node) => node !== void 0);
187
217
  };
188
218
 
189
- // src/App.tsx
190
- var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/app-framework/src/App.tsx";
219
+ // src/components/useLoading.tsx
220
+ import { useEffect as useEffect2, useState } from "react";
221
+ var LoadingState = /* @__PURE__ */ (function(LoadingState2) {
222
+ LoadingState2[LoadingState2["Loading"] = 0] = "Loading";
223
+ LoadingState2[LoadingState2["FadeIn"] = 1] = "FadeIn";
224
+ LoadingState2[LoadingState2["FadeOut"] = 2] = "FadeOut";
225
+ LoadingState2[LoadingState2["Done"] = 3] = "Done";
226
+ return LoadingState2;
227
+ })({});
228
+ var useLoading = (state, debounce = 0) => {
229
+ const [stage, setStage] = useState(0);
230
+ useEffect2(() => {
231
+ if (!debounce) {
232
+ return;
233
+ }
234
+ const i = setInterval(() => {
235
+ setStage((stage2) => {
236
+ switch (stage2) {
237
+ case 0: {
238
+ if (!state.ready) {
239
+ return 1;
240
+ } else {
241
+ clearInterval(i);
242
+ return 3;
243
+ }
244
+ }
245
+ case 1: {
246
+ if (state.ready) {
247
+ return 2;
248
+ }
249
+ break;
250
+ }
251
+ case 2: {
252
+ clearInterval(i);
253
+ return 3;
254
+ }
255
+ }
256
+ return stage2;
257
+ });
258
+ }, debounce);
259
+ return () => clearInterval(i);
260
+ }, [
261
+ debounce
262
+ ]);
263
+ if (!debounce) {
264
+ return state.ready ? 3 : 0;
265
+ }
266
+ return stage;
267
+ };
268
+
269
+ // src/components/App.tsx
270
+ var App = ({ placeholder: Placeholder, state, debounce }) => {
271
+ var _effect = _useSignals3();
272
+ try {
273
+ const reactContexts = useCapabilities(Capabilities.ReactContext);
274
+ const reactRoots = useCapabilities(Capabilities.ReactRoot);
275
+ const stage = useLoading(state, debounce);
276
+ if (state.error) {
277
+ throw state.error;
278
+ }
279
+ if (stage < LoadingState.Done) {
280
+ if (!Placeholder) {
281
+ return null;
282
+ }
283
+ return /* @__PURE__ */ React3.createElement(Placeholder, {
284
+ stage
285
+ });
286
+ }
287
+ const ComposedContext = composeContexts(reactContexts);
288
+ return /* @__PURE__ */ React3.createElement(ComposedContext, null, reactRoots.map(({ id, root: Component2 }) => /* @__PURE__ */ React3.createElement(Component2, {
289
+ key: id
290
+ })));
291
+ } finally {
292
+ _effect.f();
293
+ }
294
+ };
295
+ var composeContexts = (contexts) => {
296
+ if (contexts.length === 0) {
297
+ return ({ children }) => /* @__PURE__ */ React3.createElement(React3.Fragment, null, children);
298
+ }
299
+ return topologicalSort(contexts).map(({ context }) => context).reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React3.createElement(Acc, null, /* @__PURE__ */ React3.createElement(Next, null, children)));
300
+ };
301
+
302
+ // src/components/DefaultFallback.tsx
303
+ import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
304
+ import React4 from "react";
305
+ var DefaultFallback2 = ({ error }) => {
306
+ var _effect = _useSignals4();
307
+ try {
308
+ return /* @__PURE__ */ React4.createElement("div", {
309
+ style: {
310
+ margin: "1rem",
311
+ padding: "1rem",
312
+ overflow: "hidden",
313
+ border: "4px solid teal",
314
+ borderRadius: "1rem"
315
+ }
316
+ }, /* @__PURE__ */ React4.createElement("h1", {
317
+ style: {
318
+ margin: "0.5rem 0",
319
+ fontSize: "1.2rem"
320
+ }
321
+ }, "[ERROR]: ", error.message), /* @__PURE__ */ React4.createElement("pre", {
322
+ style: {
323
+ overflow: "auto",
324
+ fontSize: "1rem",
325
+ whiteSpace: "pre-wrap",
326
+ color: "#888888"
327
+ }
328
+ }, error.stack));
329
+ } finally {
330
+ _effect.f();
331
+ }
332
+ };
333
+
334
+ // src/components/useApp.tsx
335
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/app-framework/src/components/useApp.tsx";
191
336
  var ENABLED_KEY = "dxos.org/app-framework/enabled";
192
- var useApp = ({ pluginManager, pluginLoader: _pluginLoader, plugins: _plugins, core: _core, defaults: _defaults, placeholder, fallback = DefaultFallback, cacheEnabled = false, safeMode = false }) => {
337
+ var useApp = ({ pluginManager, pluginLoader: _pluginLoader, plugins: _plugins, core: _core, defaults: _defaults, placeholder, fallback = DefaultFallback2, cacheEnabled = false, safeMode = false, debounce = 0 }) => {
193
338
  const plugins = useDefaultValue2(_plugins, () => []);
194
339
  const core = useDefaultValue2(_core, () => plugins.map(({ meta }) => meta.id));
195
340
  const defaults = useDefaultValue2(_defaults, () => []);
@@ -197,7 +342,7 @@ var useApp = ({ pluginManager, pluginLoader: _pluginLoader, plugins: _plugins, c
197
342
  const plugin = plugins.find((plugin2) => plugin2.meta.id === id);
198
343
  invariant2(plugin, `Plugin not found: ${id}`, {
199
344
  F: __dxlog_file2,
200
- L: 78,
345
+ L: 82,
201
346
  S: void 0,
202
347
  A: [
203
348
  "plugin",
@@ -232,7 +377,7 @@ var useApp = ({ pluginManager, pluginLoader: _pluginLoader, plugins: _plugins, c
232
377
  core,
233
378
  enabled
234
379
  ]);
235
- useEffect2(() => {
380
+ useEffect3(() => {
236
381
  return manager.activation.on(({ event, state: _state, error }) => {
237
382
  if (!state.ready && event === Events.Startup.id) {
238
383
  state.ready = _state === "activated";
@@ -245,7 +390,7 @@ var useApp = ({ pluginManager, pluginLoader: _pluginLoader, plugins: _plugins, c
245
390
  manager,
246
391
  state
247
392
  ]);
248
- useEffect2(() => {
393
+ useEffect3(() => {
249
394
  effect(() => {
250
395
  cacheEnabled && localStorage.setItem(ENABLED_KEY, JSON.stringify(manager.enabled));
251
396
  });
@@ -253,7 +398,12 @@ var useApp = ({ pluginManager, pluginLoader: _pluginLoader, plugins: _plugins, c
253
398
  cacheEnabled,
254
399
  manager
255
400
  ]);
256
- useEffect2(() => {
401
+ useEffect3(() => {
402
+ setupDevtools(manager);
403
+ }, [
404
+ manager
405
+ ]);
406
+ useAsyncEffect(async () => {
257
407
  manager.context.contributeCapability({
258
408
  interface: Capabilities.PluginManager,
259
409
  implementation: manager,
@@ -264,6 +414,11 @@ var useApp = ({ pluginManager, pluginLoader: _pluginLoader, plugins: _plugins, c
264
414
  implementation: manager.registry,
265
415
  module: "dxos.org/app-framework/rx-registry"
266
416
  });
417
+ await Promise.all([
418
+ // TODO(wittjosiah): Factor out such that this could be called per surface role when attempting to render.
419
+ manager.activate(Events.SetupReactSurface),
420
+ manager.activate(Events.Startup)
421
+ ]);
267
422
  return () => {
268
423
  manager.context.removeCapability(Capabilities.PluginManager, manager);
269
424
  manager.context.removeCapability(Capabilities.RxRegistry, manager.registry);
@@ -271,32 +426,16 @@ var useApp = ({ pluginManager, pluginLoader: _pluginLoader, plugins: _plugins, c
271
426
  }, [
272
427
  manager
273
428
  ]);
274
- useEffect2(() => {
275
- setupDevtools(manager);
276
- }, [
277
- manager
278
- ]);
279
- useEffect2(() => {
280
- const timeout = setTimeout(async () => {
281
- await Promise.all([
282
- // TODO(wittjosiah): Factor out such that this could be called per surface role when attempting to render.
283
- manager.activate(Events.SetupReactSurface),
284
- manager.activate(Events.Startup)
285
- ]);
286
- });
287
- return () => clearTimeout(timeout);
288
- }, [
289
- manager
290
- ]);
291
- return useCallback(() => /* @__PURE__ */ React3.createElement(ErrorBoundary, {
429
+ return useCallback(() => /* @__PURE__ */ React5.createElement(ErrorBoundary, {
292
430
  fallback
293
- }, /* @__PURE__ */ React3.createElement(PluginManagerProvider, {
431
+ }, /* @__PURE__ */ React5.createElement(PluginManagerProvider, {
294
432
  value: manager
295
- }, /* @__PURE__ */ React3.createElement(RegistryContext.Provider, {
433
+ }, /* @__PURE__ */ React5.createElement(RegistryContext.Provider, {
296
434
  value: manager.registry
297
- }, /* @__PURE__ */ React3.createElement(App, {
435
+ }, /* @__PURE__ */ React5.createElement(App, {
298
436
  placeholder,
299
- state
437
+ state,
438
+ debounce
300
439
  })))), [
301
440
  fallback,
302
441
  manager,
@@ -304,96 +443,9 @@ var useApp = ({ pluginManager, pluginLoader: _pluginLoader, plugins: _plugins, c
304
443
  state
305
444
  ]);
306
445
  };
307
- var DELAY_PLACEHOLDER = 2e3;
308
- var useLoading = (state) => {
309
- const [stage, setStage] = useState(0);
310
- useEffect2(() => {
311
- const i = setInterval(() => {
312
- setStage((tick) => {
313
- switch (tick) {
314
- case 0:
315
- if (!state.ready) {
316
- return 1;
317
- } else {
318
- clearInterval(i);
319
- return 3;
320
- }
321
- case 1:
322
- if (state.ready) {
323
- return 2;
324
- }
325
- break;
326
- case 2:
327
- clearInterval(i);
328
- return 3;
329
- }
330
- return tick;
331
- });
332
- }, DELAY_PLACEHOLDER);
333
- return () => clearInterval(i);
334
- }, []);
335
- return stage;
336
- };
337
- var App = ({ placeholder: Placeholder, state }) => {
338
- var _effect = _useSignals2();
339
- try {
340
- const reactContexts = useCapabilities(Capabilities.ReactContext);
341
- const reactRoots = useCapabilities(Capabilities.ReactRoot);
342
- const stage = useLoading(state);
343
- if (state.error) {
344
- throw state.error;
345
- }
346
- if (stage < 3) {
347
- if (!Placeholder) {
348
- return null;
349
- }
350
- return /* @__PURE__ */ React3.createElement(Placeholder, {
351
- stage
352
- });
353
- }
354
- const ComposedContext = composeContexts(reactContexts);
355
- return /* @__PURE__ */ React3.createElement(ComposedContext, null, reactRoots.map(({ id, root: Component2 }) => /* @__PURE__ */ React3.createElement(Component2, {
356
- key: id
357
- })));
358
- } finally {
359
- _effect.f();
360
- }
361
- };
362
- var DefaultFallback = ({ error }) => {
363
- var _effect = _useSignals2();
364
- try {
365
- return /* @__PURE__ */ React3.createElement("div", {
366
- style: {
367
- margin: "0.5rem",
368
- padding: "1rem",
369
- overflow: "hidden",
370
- border: "1px solid red"
371
- }
372
- }, /* @__PURE__ */ React3.createElement("h1", {
373
- style: {
374
- margin: "0.5rem 0",
375
- fontSize: "1.2rem"
376
- }
377
- }, "[ERROR]: ", error.message), /* @__PURE__ */ React3.createElement("pre", {
378
- style: {
379
- overflow: "auto",
380
- fontSize: "1rem",
381
- whiteSpace: "pre-wrap",
382
- color: "#888888"
383
- }
384
- }, error.stack));
385
- } finally {
386
- _effect.f();
387
- }
388
- };
389
- var composeContexts = (contexts) => {
390
- if (contexts.length === 0) {
391
- return ({ children }) => /* @__PURE__ */ React3.createElement(React3.Fragment, null, children);
392
- }
393
- return topologicalSort(contexts).map(({ context }) => context).reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React3.createElement(Acc, null, /* @__PURE__ */ React3.createElement(Next, null, children)));
394
- };
395
446
  var setupDevtools = (manager) => {
396
- globalThis.composer ??= {};
447
+ var _globalThis;
448
+ (_globalThis = globalThis).composer ?? (_globalThis.composer = {});
397
449
  globalThis.composer.manager = manager;
398
450
  };
399
451
 
@@ -412,4 +464,4 @@ export {
412
464
  useIntentResolver,
413
465
  useApp
414
466
  };
415
- //# sourceMappingURL=chunk-FO2PH7M3.mjs.map
467
+ //# sourceMappingURL=chunk-4NFLRSTX.mjs.map