@dxos/app-framework 0.3.11-main.0e40963 → 0.3.11-main.101b0f0

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 (44) hide show
  1. package/dist/lib/browser/{chunk-C2K6M6WC.mjs → chunk-7MQ2DVDI.mjs} +19 -2
  2. package/dist/lib/browser/chunk-7MQ2DVDI.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +185 -148
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/plugin-KC4DT4AJ.mjs +109 -0
  7. package/dist/lib/browser/plugin-KC4DT4AJ.mjs.map +7 -0
  8. package/dist/lib/node/{chunk-BOQBLWMX.cjs → chunk-FETX4EGX.cjs} +26 -7
  9. package/dist/lib/node/chunk-FETX4EGX.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +182 -147
  11. package/dist/lib/node/index.cjs.map +3 -3
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/{plugin-WDNRX2SR.cjs → plugin-RDMDEGRT.cjs} +60 -14
  14. package/dist/lib/node/plugin-RDMDEGRT.cjs.map +7 -0
  15. package/dist/types/src/plugins/IntentPlugin/IntentContext.d.ts +10 -2
  16. package/dist/types/src/plugins/IntentPlugin/IntentContext.d.ts.map +1 -1
  17. package/dist/types/src/plugins/IntentPlugin/intent.d.ts +34 -1
  18. package/dist/types/src/plugins/IntentPlugin/intent.d.ts.map +1 -1
  19. package/dist/types/src/plugins/IntentPlugin/plugin.d.ts.map +1 -1
  20. package/dist/types/src/plugins/IntentPlugin/provides.d.ts +2 -2
  21. package/dist/types/src/plugins/IntentPlugin/provides.d.ts.map +1 -1
  22. package/dist/types/src/plugins/PluginHost/PluginHost.d.ts +4 -2
  23. package/dist/types/src/plugins/PluginHost/PluginHost.d.ts.map +1 -1
  24. package/dist/types/src/plugins/PluginHost/plugin.d.ts.map +1 -1
  25. package/dist/types/src/plugins/SurfacePlugin/Surface.d.ts +4 -5
  26. package/dist/types/src/plugins/SurfacePlugin/Surface.d.ts.map +1 -1
  27. package/dist/types/src/plugins/common/layout.d.ts +15 -14
  28. package/dist/types/src/plugins/common/layout.d.ts.map +1 -1
  29. package/package.json +8 -7
  30. package/project.json +3 -1
  31. package/src/plugins/IntentPlugin/IntentContext.tsx +27 -3
  32. package/src/plugins/IntentPlugin/intent.ts +41 -2
  33. package/src/plugins/IntentPlugin/plugin.tsx +56 -7
  34. package/src/plugins/IntentPlugin/provides.ts +2 -2
  35. package/src/plugins/PluginHost/PluginHost.tsx +92 -57
  36. package/src/plugins/PluginHost/plugin.ts +1 -0
  37. package/src/plugins/SurfacePlugin/Surface.tsx +15 -21
  38. package/src/plugins/common/layout.ts +15 -14
  39. package/tsconfig.json +3 -0
  40. package/dist/lib/browser/chunk-C2K6M6WC.mjs.map +0 -7
  41. package/dist/lib/browser/plugin-CBPJO5NB.mjs +0 -63
  42. package/dist/lib/browser/plugin-CBPJO5NB.mjs.map +0 -7
  43. package/dist/lib/node/chunk-BOQBLWMX.cjs.map +0 -7
  44. package/dist/lib/node/plugin-WDNRX2SR.cjs.map +0 -7
@@ -4,11 +4,26 @@ var parseIntentResolverPlugin = (plugin) => plugin.provides.intent?.resolver ? p
4
4
 
5
5
  // packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx
6
6
  import { createContext, useContext } from "react";
7
+ import { useEffect } from "react";
7
8
  var IntentContext = /* @__PURE__ */ createContext({
8
- dispatch: async () => {
9
+ dispatch: async () => ({}),
10
+ registerResolver: () => () => {
9
11
  }
10
12
  });
11
13
  var useIntent = () => useContext(IntentContext);
14
+ var useIntentDispatcher = () => {
15
+ const { dispatch } = useIntent();
16
+ return dispatch;
17
+ };
18
+ var useIntentResolver = (plugin, resolver) => {
19
+ const { registerResolver } = useIntent();
20
+ useEffect(() => {
21
+ return registerResolver(plugin, resolver);
22
+ }, [
23
+ plugin,
24
+ resolver
25
+ ]);
26
+ };
12
27
  var IntentProvider = IntentContext.Provider;
13
28
 
14
29
  // packages/sdk/app-framework/src/plugins/IntentPlugin/meta.ts
@@ -21,7 +36,9 @@ export {
21
36
  parseIntentPlugin,
22
37
  parseIntentResolverPlugin,
23
38
  useIntent,
39
+ useIntentDispatcher,
40
+ useIntentResolver,
24
41
  IntentProvider,
25
42
  meta_default
26
43
  };
27
- //# sourceMappingURL=chunk-C2K6M6WC.mjs.map
44
+ //# sourceMappingURL=chunk-7MQ2DVDI.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugins/IntentPlugin/provides.ts", "../../../src/plugins/IntentPlugin/IntentContext.tsx", "../../../src/plugins/IntentPlugin/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type IntentContext } from './IntentContext';\nimport { type IntentResolver } from './intent';\nimport { type Plugin } from '../PluginHost';\n\nexport type IntentResolverProvides = {\n intent: {\n resolver: IntentResolver;\n };\n};\n\nexport type IntentPluginProvides = {\n intent: IntentContext;\n};\n\nexport const parseIntentPlugin = (plugin: Plugin) =>\n (plugin.provides as any).intent?.dispatch ? (plugin as Plugin<IntentPluginProvides>) : undefined;\n\nexport const parseIntentResolverPlugin = (plugin: Plugin) =>\n (plugin.provides as any).intent?.resolver ? (plugin as Plugin<IntentResolverProvides>) : undefined;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Context, createContext, useContext, type Provider } from 'react';\nimport { useEffect } from 'react';\n\nimport { type UnsubscribeCallback } from '@dxos/async';\n\nimport { type IntentDispatcher, type IntentResolver } from './intent';\n\nexport type IntentContext = {\n dispatch: IntentDispatcher;\n registerResolver: (pluginId: string, resolver: IntentResolver) => UnsubscribeCallback;\n};\n\nconst IntentContext: Context<IntentContext> = createContext<IntentContext>({\n dispatch: async () => ({}),\n registerResolver: () => () => {},\n});\n\n/**\n * @deprecated\n * TODO(burdon): Use useIntentDispatcher.\n */\nexport const useIntent = () => useContext(IntentContext);\n\n// TODO(burdon): Dispatch or Dispatcher?\nexport const useIntentDispatcher = (): IntentDispatcher => {\n const { dispatch } = useIntent();\n return dispatch;\n};\n\nexport const useIntentResolver = (plugin: string, resolver: IntentResolver) => {\n const { registerResolver } = useIntent();\n useEffect(() => {\n return registerResolver(plugin, resolver);\n }, [plugin, resolver]);\n};\n\nexport const IntentProvider: Provider<IntentContext> = IntentContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nconst IntentMeta = {\n id: 'dxos.org/plugin/intent',\n};\n\nexport default IntentMeta;\n"],
5
+ "mappings": ";AAkBO,IAAMA,oBAAoB,CAACC,WAC/BA,OAAOC,SAAiBC,QAAQC,WAAYH,SAA0CI;AAElF,IAAMC,4BAA4B,CAACL,WACvCA,OAAOC,SAAiBC,QAAQI,WAAYN,SAA4CI;;;AClB3F,SAAuBG,eAAeC,kBAAiC;AACvE,SAASC,iBAAiB;AAW1B,IAAMC,gBAAwCC,8BAA6B;EACzEC,UAAU,aAAa,CAAC;EACxBC,kBAAkB,MAAM,MAAA;EAAO;AACjC,CAAA;AAMO,IAAMC,YAAY,MAAMC,WAAWL,aAAAA;AAGnC,IAAMM,sBAAsB,MAAA;AACjC,QAAM,EAAEJ,SAAQ,IAAKE,UAAAA;AACrB,SAAOF;AACT;AAEO,IAAMK,oBAAoB,CAACC,QAAgBC,aAAAA;AAChD,QAAM,EAAEN,iBAAgB,IAAKC,UAAAA;AAC7BM,YAAU,MAAA;AACR,WAAOP,iBAAiBK,QAAQC,QAAAA;EAClC,GAAG;IAACD;IAAQC;GAAS;AACvB;AAEO,IAAME,iBAA0CX,cAAcY;;;ACpCrE,IAAMC,aAAa;EACjBC,IAAI;AACN;AAEA,IAAA,eAAeD;",
6
+ "names": ["parseIntentPlugin", "plugin", "provides", "intent", "dispatch", "undefined", "parseIntentResolverPlugin", "resolver", "createContext", "useContext", "useEffect", "IntentContext", "createContext", "dispatch", "registerResolver", "useIntent", "useContext", "useIntentDispatcher", "useIntentResolver", "plugin", "resolver", "useEffect", "IntentProvider", "Provider", "IntentMeta", "id"]
7
+ }
@@ -10,8 +10,10 @@ import {
10
10
  meta_default,
11
11
  parseIntentPlugin,
12
12
  parseIntentResolverPlugin,
13
- useIntent
14
- } from "./chunk-C2K6M6WC.mjs";
13
+ useIntent,
14
+ useIntentDispatcher,
15
+ useIntentResolver
16
+ } from "./chunk-7MQ2DVDI.mjs";
15
17
  import {
16
18
  filterPlugins,
17
19
  findPlugin,
@@ -93,7 +95,7 @@ var parseTranslationsPlugin = (plugin) => {
93
95
  var pluginMeta = (meta) => meta;
94
96
  var Plugin;
95
97
  (function(Plugin2) {
96
- var lazy = Plugin2.lazy = (p, props) => {
98
+ Plugin2.lazy = (p, props) => {
97
99
  return () => p().then(({ default: definition }) => {
98
100
  return definition(props);
99
101
  });
@@ -123,141 +125,15 @@ var PluginProvider = PluginContext.Provider;
123
125
 
124
126
  // packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx
125
127
  import { shallow } from "deepsignal/react";
126
- import React, { useEffect } from "react";
128
+ import React3, { useEffect, useState } from "react";
127
129
  import { LocalStorageStore } from "@dxos/local-storage";
128
130
  import { log } from "@dxos/log";
129
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx";
130
- var parsePluginHost = (plugin) => plugin.provides.plugins ? plugin : void 0;
131
- var PLUGIN_HOST = "dxos.org/plugin/host";
132
- var PluginHost = ({ order, plugins: definitions, core = [], defaults = [], fallback = null }) => {
133
- const state = new LocalStorageStore(PLUGIN_HOST, {
134
- ready: false,
135
- enabled: [
136
- ...defaults
137
- ],
138
- plugins: [],
139
- available: order.filter(({ id }) => !core.includes(id)),
140
- setPlugin: (id, enabled) => {
141
- if (enabled) {
142
- state.values.enabled = [
143
- ...state.values.enabled,
144
- id
145
- ];
146
- } else {
147
- state.values.enabled = state.values.enabled.filter((enabled2) => enabled2 !== id);
148
- }
149
- }
150
- });
151
- state.prop(state.values.$enabled, "enabled", LocalStorageStore.json);
152
- return {
153
- meta: {
154
- id: PLUGIN_HOST,
155
- name: "Plugin host"
156
- },
157
- provides: {
158
- plugins: state.values,
159
- context: ({ children }) => /* @__PURE__ */ React.createElement(PluginProvider, {
160
- value: state.values
161
- }, children),
162
- root: () => {
163
- useEffect(() => {
164
- log("initializing plugins", {
165
- enabled: state.values.enabled
166
- }, {
167
- F: __dxlog_file,
168
- L: 67,
169
- S: void 0,
170
- C: (f, a) => f(...a)
171
- });
172
- const timeout = setTimeout(async () => {
173
- const enabledIds = [
174
- ...core,
175
- ...state.values.enabled
176
- ].sort((a, b) => {
177
- const indexA = order.findIndex(({ id }) => id === a);
178
- const indexB = order.findIndex(({ id }) => id === b);
179
- return indexA - indexB;
180
- });
181
- const enabled = await Promise.all(enabledIds.map((id) => definitions[id]).filter((definition) => Boolean(definition)).map((definition) => definition()));
182
- const plugins = await Promise.all(enabled.map(async (definition) => {
183
- const plugin = await initializePlugin(definition).catch((err) => {
184
- console.error("Failed to initialize plugin:", definition.meta.id, err);
185
- return void 0;
186
- });
187
- return plugin;
188
- })).then((plugins2) => plugins2.filter((plugin) => Boolean(plugin)));
189
- log("plugins initialized", {
190
- plugins
191
- }, {
192
- F: __dxlog_file,
193
- L: 92,
194
- S: void 0,
195
- C: (f, a) => f(...a)
196
- });
197
- await Promise.all(enabled.map(async (pluginDefinition) => {
198
- await pluginDefinition.ready?.(plugins);
199
- }));
200
- log("plugins ready", {
201
- plugins
202
- }, {
203
- F: __dxlog_file,
204
- L: 99,
205
- S: void 0,
206
- C: (f, a) => f(...a)
207
- });
208
- state.values.plugins = shallow(plugins);
209
- state.values.ready = true;
210
- });
211
- return () => {
212
- clearTimeout(timeout);
213
- state.values.ready = false;
214
- };
215
- }, []);
216
- if (!state.values.ready) {
217
- return /* @__PURE__ */ React.createElement(React.Fragment, null, fallback);
218
- }
219
- const ComposedContext = composeContext(state.values.plugins);
220
- return /* @__PURE__ */ React.createElement(ComposedContext, null, rootComponents(state.values.plugins));
221
- }
222
- }
223
- };
224
- };
225
- var initializePlugin = async (pluginDefinition) => {
226
- const provides = await pluginDefinition.initialize?.();
227
- return {
228
- ...pluginDefinition,
229
- provides: {
230
- ...pluginDefinition.provides,
231
- ...provides
232
- }
233
- };
234
- };
235
- var rootComponents = (plugins) => {
236
- return plugins.map((plugin) => {
237
- const Component2 = plugin.provides.root;
238
- if (Component2) {
239
- return /* @__PURE__ */ React.createElement(Component2, {
240
- key: plugin.meta.id
241
- });
242
- } else {
243
- return null;
244
- }
245
- }).filter((node) => Boolean(node));
246
- };
247
- var composeContext = (plugins) => {
248
- return compose(plugins.map((p) => p.provides.context).filter(Boolean));
249
- };
250
- var compose = (contexts) => {
251
- return [
252
- ...contexts
253
- ].reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React.createElement(Acc, null, /* @__PURE__ */ React.createElement(Next, null, children)));
254
- };
255
131
 
256
132
  // packages/sdk/app-framework/src/plugins/SurfacePlugin/helpers.ts
257
133
  var isObject = (data) => !!data && typeof data === "object";
258
134
 
259
135
  // packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx
260
- import React2, { Component } from "react";
136
+ import React, { Component } from "react";
261
137
  var ErrorBoundary = class extends Component {
262
138
  constructor(props) {
263
139
  super(props);
@@ -277,7 +153,7 @@ var ErrorBoundary = class extends Component {
277
153
  }
278
154
  render() {
279
155
  if (this.state.error) {
280
- return /* @__PURE__ */ React2.createElement(this.props.fallback, {
156
+ return /* @__PURE__ */ React.createElement(this.props.fallback, {
281
157
  error: this.state.error,
282
158
  reset: this.resetError
283
159
  });
@@ -292,9 +168,9 @@ var ErrorBoundary = class extends Component {
292
168
  };
293
169
 
294
170
  // packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx
295
- import React3, { forwardRef, Fragment, isValidElement } from "react";
171
+ import React2, { forwardRef, Fragment, isValidElement, Suspense } from "react";
296
172
  import { createContext as createContext2, useContext as useContext2 } from "react";
297
- var Surface = /* @__PURE__ */ forwardRef(({ role, name = role, fallback, ...rest }, forwardedRef) => {
173
+ var Surface = /* @__PURE__ */ forwardRef(({ role, name = role, fallback, placeholder, ...rest }, forwardedRef) => {
298
174
  const props = {
299
175
  role,
300
176
  name,
@@ -303,16 +179,17 @@ var Surface = /* @__PURE__ */ forwardRef(({ role, name = role, fallback, ...rest
303
179
  };
304
180
  const context = useContext2(SurfaceContext);
305
181
  const data = props.data ?? (name && context?.surfaces?.[name]?.data || {});
306
- return /* @__PURE__ */ React3.createElement(React3.Fragment, null, fallback ? /* @__PURE__ */ React3.createElement(ErrorBoundary, {
307
- data,
308
- fallback
309
- }, /* @__PURE__ */ React3.createElement(SurfaceResolver, {
182
+ const resolver = /* @__PURE__ */ React2.createElement(SurfaceResolver, {
310
183
  ...props,
311
184
  ref: forwardedRef
312
- })) : /* @__PURE__ */ React3.createElement(SurfaceResolver, {
313
- ...props,
314
- ref: forwardedRef
315
- }));
185
+ });
186
+ const suspense = placeholder ? /* @__PURE__ */ React2.createElement(Suspense, {
187
+ fallback: placeholder
188
+ }, resolver) : resolver;
189
+ return fallback ? /* @__PURE__ */ React2.createElement(ErrorBoundary, {
190
+ data,
191
+ fallback
192
+ }, suspense) : suspense;
316
193
  });
317
194
  var SurfaceContext = /* @__PURE__ */ createContext2(null);
318
195
  var SurfaceResolver = /* @__PURE__ */ forwardRef((props, forwardedRef) => {
@@ -326,9 +203,9 @@ var SurfaceResolver = /* @__PURE__ */ forwardRef((props, forwardedRef) => {
326
203
  ...props.surfaces
327
204
  }
328
205
  };
329
- return /* @__PURE__ */ React3.createElement(SurfaceContext.Provider, {
206
+ return /* @__PURE__ */ React2.createElement(SurfaceContext.Provider, {
330
207
  value: currentContext
331
- }, nodes.length > 0 ? nodes : props.contentFallback ? /* @__PURE__ */ React3.createElement(props.contentFallback, null) : null);
208
+ }, nodes);
332
209
  });
333
210
  var resolveNodes = (components, props, context, forwardedRef) => {
334
211
  const data = {
@@ -363,12 +240,170 @@ var resolveNodes = (components, props, context, forwardedRef) => {
363
240
  return 1;
364
241
  }
365
242
  return 0;
366
- }).map(([key, result]) => /* @__PURE__ */ React3.createElement(Fragment, {
243
+ }).map(([key, result]) => /* @__PURE__ */ React2.createElement(Fragment, {
367
244
  key
368
245
  }, result.node));
369
246
  return props.limit ? nodes.slice(0, props.limit) : nodes;
370
247
  };
371
248
 
249
+ // packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx
250
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx";
251
+ var parsePluginHost = (plugin) => plugin.provides.plugins ? plugin : void 0;
252
+ var PLUGIN_HOST = "dxos.org/plugin/host";
253
+ var PluginHost = ({ order, plugins: definitions, core = [], defaults = [], fallback = DefaultFallback, placeholder = null }) => {
254
+ const state = new LocalStorageStore(PLUGIN_HOST, {
255
+ ready: false,
256
+ enabled: [
257
+ ...defaults
258
+ ],
259
+ plugins: [],
260
+ available: order.filter(({ id }) => !core.includes(id)),
261
+ setPlugin: (id, enabled) => {
262
+ if (enabled) {
263
+ state.values.enabled = [
264
+ ...state.values.enabled,
265
+ id
266
+ ];
267
+ } else {
268
+ state.values.enabled = state.values.enabled.filter((enabled2) => enabled2 !== id);
269
+ }
270
+ }
271
+ });
272
+ state.prop(state.values.$enabled, "enabled", LocalStorageStore.json);
273
+ return {
274
+ meta: {
275
+ id: PLUGIN_HOST,
276
+ name: "Plugin host"
277
+ },
278
+ provides: {
279
+ plugins: state.values,
280
+ context: ({ children }) => /* @__PURE__ */ React3.createElement(PluginProvider, {
281
+ value: state.values
282
+ }, children),
283
+ root: () => {
284
+ return /* @__PURE__ */ React3.createElement(ErrorBoundary, {
285
+ fallback
286
+ }, /* @__PURE__ */ React3.createElement(Root, {
287
+ order,
288
+ core,
289
+ definitions,
290
+ state: state.values,
291
+ placeholder
292
+ }));
293
+ }
294
+ }
295
+ };
296
+ };
297
+ var DefaultFallback = ({ error }) => {
298
+ return /* @__PURE__ */ React3.createElement("div", {
299
+ style: {
300
+ padding: "1rem"
301
+ }
302
+ }, /* @__PURE__ */ React3.createElement("h1", {
303
+ style: {
304
+ fontSize: "1.2rem",
305
+ fontWeight: 700,
306
+ margin: "0.5rem 0"
307
+ }
308
+ }, error.message), /* @__PURE__ */ React3.createElement("pre", null, error.stack));
309
+ };
310
+ var Root = ({ order, core: corePluginIds, definitions, state, placeholder }) => {
311
+ const [error, setError] = useState();
312
+ useEffect(() => {
313
+ log("initializing plugins", {
314
+ enabled: state.enabled
315
+ }, {
316
+ F: __dxlog_file,
317
+ L: 101,
318
+ S: void 0,
319
+ C: (f, a) => f(...a)
320
+ });
321
+ const timeout = setTimeout(async () => {
322
+ try {
323
+ const enabledIds = [
324
+ ...corePluginIds,
325
+ ...state.enabled
326
+ ].sort((a, b) => {
327
+ const indexA = order.findIndex(({ id }) => id === a);
328
+ const indexB = order.findIndex(({ id }) => id === b);
329
+ return indexA - indexB;
330
+ });
331
+ const enabled = await Promise.all(enabledIds.map((id) => definitions[id]).filter((definition) => Boolean(definition)).map((definition) => definition()));
332
+ const plugins = await Promise.all(enabled.map(async (definition) => {
333
+ const plugin = await initializePlugin(definition).catch((err) => {
334
+ console.error("Failed to initialize plugin:", definition.meta.id, err);
335
+ return void 0;
336
+ });
337
+ return plugin;
338
+ })).then((plugins2) => plugins2.filter((plugin) => Boolean(plugin)));
339
+ log("plugins initialized", {
340
+ plugins
341
+ }, {
342
+ F: __dxlog_file,
343
+ L: 127,
344
+ S: void 0,
345
+ C: (f, a) => f(...a)
346
+ });
347
+ await Promise.all(enabled.map((pluginDefinition) => pluginDefinition.ready?.(plugins)));
348
+ log("plugins ready", {
349
+ plugins
350
+ }, {
351
+ F: __dxlog_file,
352
+ L: 130,
353
+ S: void 0,
354
+ C: (f, a) => f(...a)
355
+ });
356
+ state.plugins = shallow(plugins);
357
+ state.ready = true;
358
+ } catch (err) {
359
+ setError(err);
360
+ }
361
+ });
362
+ return () => {
363
+ clearTimeout(timeout);
364
+ state.ready = false;
365
+ };
366
+ }, []);
367
+ if (error) {
368
+ throw error;
369
+ }
370
+ if (!state.ready) {
371
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, placeholder);
372
+ }
373
+ const ComposedContext = composeContext(state.plugins);
374
+ return /* @__PURE__ */ React3.createElement(ComposedContext, null, rootComponents(state.plugins));
375
+ };
376
+ var initializePlugin = async (pluginDefinition) => {
377
+ const provides = await pluginDefinition.initialize?.();
378
+ return {
379
+ ...pluginDefinition,
380
+ provides: {
381
+ ...pluginDefinition.provides,
382
+ ...provides
383
+ }
384
+ };
385
+ };
386
+ var rootComponents = (plugins) => {
387
+ return plugins.map((plugin) => {
388
+ const Component2 = plugin.provides.root;
389
+ if (Component2) {
390
+ return /* @__PURE__ */ React3.createElement(Component2, {
391
+ key: plugin.meta.id
392
+ });
393
+ } else {
394
+ return null;
395
+ }
396
+ }).filter((node) => Boolean(node));
397
+ };
398
+ var composeContext = (plugins) => {
399
+ return compose(plugins.map((p) => p.provides.context).filter(Boolean));
400
+ };
401
+ var compose = (contexts) => {
402
+ return [
403
+ ...contexts
404
+ ].reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React3.createElement(Acc, null, /* @__PURE__ */ React3.createElement(Next, null, children)));
405
+ };
406
+
372
407
  // packages/sdk/app-framework/src/App.tsx
373
408
  import React4 from "react";
374
409
  import { invariant } from "@dxos/invariant";
@@ -383,7 +418,7 @@ var createApp = ({ order, plugins, core = order.map(({ id }) => id), ...params }
383
418
  plugins: {
384
419
  ...plugins,
385
420
  [meta_default2.id]: Plugin.lazy(() => import("./plugin-JDIMDLDU.mjs")),
386
- [meta_default.id]: Plugin.lazy(() => import("./plugin-CBPJO5NB.mjs"))
421
+ [meta_default.id]: Plugin.lazy(() => import("./plugin-KC4DT4AJ.mjs"))
387
422
  },
388
423
  core: [
389
424
  meta_default2.id,
@@ -411,8 +446,8 @@ var createApp = ({ order, plugins, core = order.map(({ id }) => id), ...params }
411
446
  ]
412
447
  });
413
448
  const Context = host.provides.context;
414
- const Root = host.provides.root;
415
- return () => /* @__PURE__ */ React4.createElement(Context, null, /* @__PURE__ */ React4.createElement(Root, null));
449
+ const Root2 = host.provides.root;
450
+ return () => /* @__PURE__ */ React4.createElement(Context, null, /* @__PURE__ */ React4.createElement(Root2, null));
416
451
  };
417
452
  export {
418
453
  ErrorBoundary,
@@ -449,6 +484,8 @@ export {
449
484
  pluginMeta,
450
485
  resolvePlugin,
451
486
  useIntent,
487
+ useIntentDispatcher,
488
+ useIntentResolver,
452
489
  usePlugin,
453
490
  usePlugins,
454
491
  useResolvePlugin,