@dxos/plugin-deck 0.8.4-main.b97322e → 0.8.4-main.f5c0578

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 (83) hide show
  1. package/dist/lib/browser/{app-graph-builder-JTFSDT2I.mjs → app-graph-builder-DVEKLXB4.mjs} +3 -3
  2. package/dist/lib/browser/app-graph-builder-DVEKLXB4.mjs.map +7 -0
  3. package/dist/lib/browser/{check-app-scheme-57U62A3A.mjs → check-app-scheme-3BQJXWEY.mjs} +1 -1
  4. package/dist/lib/browser/{check-app-scheme-57U62A3A.mjs.map → check-app-scheme-3BQJXWEY.mjs.map} +2 -2
  5. package/dist/lib/browser/{chunk-D7KTFCUV.mjs → chunk-6MQIYIPY.mjs} +180 -180
  6. package/dist/lib/browser/chunk-6MQIYIPY.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-QDZO4AJ4.mjs → chunk-MX7WRVX3.mjs} +11 -11
  8. package/dist/lib/browser/{chunk-QDZO4AJ4.mjs.map → chunk-MX7WRVX3.mjs.map} +3 -3
  9. package/dist/lib/browser/{chunk-JFTXENFN.mjs → chunk-NRCPV6AV.mjs} +2 -2
  10. package/dist/lib/browser/{chunk-JFTXENFN.mjs.map → chunk-NRCPV6AV.mjs.map} +2 -2
  11. package/dist/lib/browser/index.mjs +13 -7
  12. package/dist/lib/browser/index.mjs.map +3 -3
  13. package/dist/lib/browser/{intent-resolver-P2OBK5HK.mjs → intent-resolver-2SUIIV6N.mjs} +5 -5
  14. package/dist/lib/browser/intent-resolver-2SUIIV6N.mjs.map +7 -0
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/{react-root-PO64J7ML.mjs → react-root-GVZANZX7.mjs} +4 -4
  17. package/dist/lib/browser/{react-root-PO64J7ML.mjs.map → react-root-GVZANZX7.mjs.map} +2 -2
  18. package/dist/lib/browser/{react-surface-E45YOVF5.mjs → react-surface-NXSSD2GW.mjs} +4 -4
  19. package/dist/lib/browser/{react-surface-E45YOVF5.mjs.map → react-surface-NXSSD2GW.mjs.map} +1 -1
  20. package/dist/lib/browser/{settings-6AJZPZPM.mjs → settings-LUPQPZ27.mjs} +1 -1
  21. package/dist/lib/browser/{settings-6AJZPZPM.mjs.map → settings-LUPQPZ27.mjs.map} +1 -1
  22. package/dist/lib/browser/{state-MVDYX77Y.mjs → state-CRXR7X63.mjs} +2 -2
  23. package/dist/lib/browser/toolkit-OBKFXX23.mjs +47 -0
  24. package/dist/lib/browser/toolkit-OBKFXX23.mjs.map +7 -0
  25. package/dist/lib/browser/{url-handler-7L7M6IKH.mjs → url-handler-LROZYQ26.mjs} +2 -2
  26. package/dist/lib/browser/url-handler-LROZYQ26.mjs.map +7 -0
  27. package/dist/types/src/DeckPlugin.d.ts.map +1 -1
  28. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  29. package/dist/types/src/capabilities/check-app-scheme.d.ts.map +1 -1
  30. package/dist/types/src/capabilities/index.d.ts +1 -1
  31. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  32. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  33. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  34. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  35. package/dist/types/src/capabilities/toolkit.d.ts +5 -0
  36. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  37. package/dist/types/src/capabilities/tools.d.ts +1 -1
  38. package/dist/types/src/capabilities/tools.d.ts.map +1 -1
  39. package/dist/types/src/capabilities/url-handler.d.ts.map +1 -1
  40. package/dist/types/src/components/DeckLayout/Banner.d.ts.map +1 -1
  41. package/dist/types/src/components/DeckLayout/DeckLayout.d.ts.map +1 -1
  42. package/dist/types/src/components/Plank/Plank.d.ts +1 -1
  43. package/dist/types/src/components/Plank/Plank.d.ts.map +1 -1
  44. package/dist/types/src/components/Plank/Plank.stories.d.ts +1 -1
  45. package/dist/types/src/components/Plank/Plank.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/Plank/PlankError.d.ts.map +1 -1
  47. package/dist/types/src/components/Plank/PlankHeading.d.ts +1 -1
  48. package/dist/types/src/components/Plank/PlankHeading.d.ts.map +1 -1
  49. package/dist/types/src/components/Sidebar/ComplementarySidebar.d.ts.map +1 -1
  50. package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
  51. package/dist/types/src/hooks/useNodeActionExpander.d.ts.map +1 -1
  52. package/dist/types/tsconfig.tsbuildinfo +1 -1
  53. package/package.json +36 -32
  54. package/src/DeckPlugin.ts +11 -5
  55. package/src/capabilities/app-graph-builder.ts +4 -3
  56. package/src/capabilities/check-app-scheme.ts +1 -1
  57. package/src/capabilities/index.ts +2 -1
  58. package/src/capabilities/intent-resolver.ts +10 -9
  59. package/src/capabilities/react-root.tsx +2 -1
  60. package/src/capabilities/react-surface.tsx +1 -1
  61. package/src/capabilities/settings.ts +1 -1
  62. package/src/capabilities/state.ts +3 -2
  63. package/src/capabilities/toolkit.ts +55 -0
  64. package/src/capabilities/tools.ts +9 -6
  65. package/src/capabilities/url-handler.ts +3 -2
  66. package/src/components/DeckLayout/Banner.tsx +1 -1
  67. package/src/components/DeckLayout/ContentEmpty.tsx +1 -1
  68. package/src/components/DeckLayout/DeckLayout.tsx +11 -10
  69. package/src/components/Plank/Plank.stories.tsx +4 -3
  70. package/src/components/Plank/Plank.tsx +7 -6
  71. package/src/components/Plank/PlankError.tsx +2 -1
  72. package/src/components/Plank/PlankHeading.tsx +5 -4
  73. package/src/components/Sidebar/ComplementarySidebar.tsx +4 -3
  74. package/src/components/Sidebar/SidebarButton.tsx +2 -2
  75. package/src/hooks/useDeckCompanions.ts +2 -2
  76. package/src/hooks/useNodeActionExpander.ts +1 -1
  77. package/dist/lib/browser/app-graph-builder-JTFSDT2I.mjs.map +0 -7
  78. package/dist/lib/browser/chunk-D7KTFCUV.mjs.map +0 -7
  79. package/dist/lib/browser/intent-resolver-P2OBK5HK.mjs.map +0 -7
  80. package/dist/lib/browser/tools-TKQDPCHJ.mjs +0 -88
  81. package/dist/lib/browser/tools-TKQDPCHJ.mjs.map +0 -7
  82. package/dist/lib/browser/url-handler-7L7M6IKH.mjs.map +0 -7
  83. /package/dist/lib/browser/{state-MVDYX77Y.mjs.map → state-CRXR7X63.mjs.map} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-deck",
3
- "version": "0.8.4-main.b97322e",
3
+ "version": "0.8.4-main.f5c0578",
4
4
  "description": "DXOS Surface plugin for the main application layout.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -10,10 +10,12 @@
10
10
  "type": "module",
11
11
  "exports": {
12
12
  ".": {
13
+ "source": "./src/index.ts",
13
14
  "types": "./dist/types/src/index.d.ts",
14
15
  "browser": "./dist/lib/browser/index.mjs"
15
16
  },
16
17
  "./types": {
18
+ "source": "./src/types/index.ts",
17
19
  "types": "./dist/types/src/types/index.d.ts",
18
20
  "browser": "./dist/lib/browser/types/index.mjs"
19
21
  }
@@ -31,48 +33,50 @@
31
33
  "src"
32
34
  ],
33
35
  "dependencies": {
36
+ "@effect/ai": "0.25.2",
34
37
  "@fluentui/react-tabster": "^9.24.2",
35
38
  "@preact-signals/safe-react": "^0.9.0",
36
39
  "@preact/signals-core": "^1.9.0",
37
40
  "@radix-ui/react-context": "1.1.1",
38
- "effect": "3.17.0",
41
+ "effect": "3.17.7",
39
42
  "immer": "^10.1.1",
40
- "@dxos/ai": "0.8.4-main.b97322e",
41
- "@dxos/async": "0.8.4-main.b97322e",
42
- "@dxos/app-framework": "0.8.4-main.b97322e",
43
- "@dxos/blueprints": "0.8.4-main.b97322e",
44
- "@dxos/debug": "0.8.4-main.b97322e",
45
- "@dxos/echo": "0.8.4-main.b97322e",
46
- "@dxos/echo-schema": "0.8.4-main.b97322e",
47
- "@dxos/echo-signals": "0.8.4-main.b97322e",
48
- "@dxos/invariant": "0.8.4-main.b97322e",
49
- "@dxos/live-object": "0.8.4-main.b97322e",
50
- "@dxos/local-storage": "0.8.4-main.b97322e",
51
- "@dxos/keyboard": "0.8.4-main.b97322e",
52
- "@dxos/plugin-attention": "0.8.4-main.b97322e",
53
- "@dxos/log": "0.8.4-main.b97322e",
54
- "@dxos/plugin-graph": "0.8.4-main.b97322e",
55
- "@dxos/plugin-observability": "0.8.4-main.b97322e",
56
- "@dxos/react-client": "0.8.4-main.b97322e",
57
- "@dxos/react-ui-attention": "0.8.4-main.b97322e",
58
- "@dxos/plugin-theme": "0.8.4-main.b97322e",
59
- "@dxos/react-ui-form": "0.8.4-main.b97322e",
60
- "@dxos/react-ui-stack": "0.8.4-main.b97322e",
61
- "@dxos/react-ui-tabs": "0.8.4-main.b97322e",
62
- "@dxos/react-ui-text-tooltip": "0.8.4-main.b97322e",
63
- "@dxos/util": "0.8.4-main.b97322e"
43
+ "@dxos/ai": "0.8.4-main.f5c0578",
44
+ "@dxos/app-framework": "0.8.4-main.f5c0578",
45
+ "@dxos/async": "0.8.4-main.f5c0578",
46
+ "@dxos/blueprints": "0.8.4-main.f5c0578",
47
+ "@dxos/assistant": "0.8.4-main.f5c0578",
48
+ "@dxos/debug": "0.8.4-main.f5c0578",
49
+ "@dxos/echo-schema": "0.8.4-main.f5c0578",
50
+ "@dxos/echo": "0.8.4-main.f5c0578",
51
+ "@dxos/echo-signals": "0.8.4-main.f5c0578",
52
+ "@dxos/invariant": "0.8.4-main.f5c0578",
53
+ "@dxos/keyboard": "0.8.4-main.f5c0578",
54
+ "@dxos/live-object": "0.8.4-main.f5c0578",
55
+ "@dxos/local-storage": "0.8.4-main.f5c0578",
56
+ "@dxos/log": "0.8.4-main.f5c0578",
57
+ "@dxos/plugin-graph": "0.8.4-main.f5c0578",
58
+ "@dxos/plugin-attention": "0.8.4-main.f5c0578",
59
+ "@dxos/plugin-observability": "0.8.4-main.f5c0578",
60
+ "@dxos/plugin-theme": "0.8.4-main.f5c0578",
61
+ "@dxos/react-client": "0.8.4-main.f5c0578",
62
+ "@dxos/react-ui-attention": "0.8.4-main.f5c0578",
63
+ "@dxos/react-ui-stack": "0.8.4-main.f5c0578",
64
+ "@dxos/react-ui-tabs": "0.8.4-main.f5c0578",
65
+ "@dxos/react-ui-form": "0.8.4-main.f5c0578",
66
+ "@dxos/util": "0.8.4-main.f5c0578",
67
+ "@dxos/react-ui-text-tooltip": "0.8.4-main.f5c0578"
64
68
  },
65
69
  "devDependencies": {
66
70
  "@effect-rx/rx-react": "0.38.0",
67
- "@effect/platform": "0.89.0",
71
+ "@effect/platform": "0.90.2",
68
72
  "@types/react": "~18.2.0",
69
73
  "@types/react-dom": "~18.2.0",
70
74
  "react": "~18.2.0",
71
75
  "react-dom": "~18.2.0",
72
76
  "vite": "5.4.7",
73
- "@dxos/react-ui": "0.8.4-main.b97322e",
74
- "@dxos/react-ui-theme": "0.8.4-main.b97322e",
75
- "@dxos/storybook-utils": "0.8.4-main.b97322e"
77
+ "@dxos/react-ui-theme": "0.8.4-main.f5c0578",
78
+ "@dxos/storybook-utils": "0.8.4-main.f5c0578",
79
+ "@dxos/react-ui": "0.8.4-main.f5c0578"
76
80
  },
77
81
  "peerDependencies": {
78
82
  "@effect-rx/rx-react": "^0.34.1",
@@ -80,8 +84,8 @@
80
84
  "effect": "^3.13.3",
81
85
  "react": "~18.2.0",
82
86
  "react-dom": "~18.2.0",
83
- "@dxos/react-ui": "0.8.4-main.b97322e",
84
- "@dxos/react-ui-theme": "0.8.4-main.b97322e"
87
+ "@dxos/react-ui": "0.8.4-main.f5c0578",
88
+ "@dxos/react-ui-theme": "0.8.4-main.f5c0578"
85
89
  },
86
90
  "publishConfig": {
87
91
  "access": "public"
package/src/DeckPlugin.ts CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { setAutoFreeze } from 'immer';
6
6
 
7
- import { allOf, Capabilities, contributes, defineModule, definePlugin, Events, oneOf } from '@dxos/app-framework';
7
+ import { Capabilities, Events, allOf, contributes, defineModule, definePlugin, oneOf } from '@dxos/app-framework';
8
8
  import { translations as stackTranslations } from '@dxos/react-ui-stack';
9
9
 
10
10
  import {
@@ -15,7 +15,7 @@ import {
15
15
  LayoutIntentResolver,
16
16
  ReactRoot,
17
17
  ReactSurface,
18
- Tools,
18
+ Toolkit,
19
19
  UrlHandler,
20
20
  } from './capabilities';
21
21
  import { DeckEvents } from './events';
@@ -73,10 +73,16 @@ export const DeckPlugin = () =>
73
73
  activatesOn: Events.SetupAppGraph,
74
74
  activate: AppGraphBuilder,
75
75
  }),
76
+ // defineModule({
77
+ // id: `${meta.id}/module/tools`,
78
+ // activatesOn: Events.SetupArtifactDefinition,
79
+ // activate: Tools,
80
+ // }),
76
81
  defineModule({
77
- id: `${meta.id}/module/tools`,
78
- activatesOn: Events.SetupArtifactDefinition,
79
- activate: Tools,
82
+ id: `${meta.id}/module/toolkit`,
83
+ // TODO(wittjosiah): Shouldn't use the startup event.
84
+ activatesOn: Events.Startup,
85
+ activate: Toolkit,
80
86
  }),
81
87
  defineModule({
82
88
  id: `${meta.id}/module/url`,
@@ -5,13 +5,14 @@
5
5
  import { Rx } from '@effect-rx/rx-react';
6
6
  import { Option, pipe } from 'effect';
7
7
 
8
- import { Capabilities, contributes, createIntent, LayoutAction, type PluginContext } from '@dxos/app-framework';
8
+ import { Capabilities, LayoutAction, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
9
9
  import { AttentionCapabilities } from '@dxos/plugin-attention';
10
- import { createExtension, ROOT_ID, rxFromSignal } from '@dxos/plugin-graph';
10
+ import { ROOT_ID, createExtension, rxFromSignal } from '@dxos/plugin-graph';
11
11
 
12
- import { DeckCapabilities } from './capabilities';
13
12
  import { DECK_PLUGIN } from '../meta';
14
13
 
14
+ import { DeckCapabilities } from './capabilities';
15
+
15
16
  export default (context: PluginContext) =>
16
17
  contributes(
17
18
  Capabilities.AppGraphBuilder,
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, contributes, type PluginContext } from '@dxos/app-framework';
5
+ import { Capabilities, type PluginContext, contributes } from '@dxos/app-framework';
6
6
 
7
7
  import { DECK_PLUGIN } from '../meta';
8
8
  import { type DeckSettingsProps } from '../types';
@@ -11,7 +11,8 @@ export const DeckState = lazy(() => import('./state'));
11
11
  export const LayoutIntentResolver = lazy(() => import('./intent-resolver'));
12
12
  export const ReactRoot = lazy(() => import('./react-root'));
13
13
  export const ReactSurface = lazy(() => import('./react-surface'));
14
- export const Tools = lazy(() => import('./tools'));
14
+ // export const Tools = lazy(() => import('./tools'));
15
+ export const Toolkit = lazy(() => import('./toolkit'));
15
16
  export const UrlHandler = lazy(() => import('./url-handler'));
16
17
 
17
18
  export * from './capabilities';
@@ -3,17 +3,17 @@
3
3
  //
4
4
 
5
5
  import { batch } from '@preact/signals-core';
6
- import { Schema, Effect, pipe, Option } from 'effect';
6
+ import { Effect, Option, Schema, pipe } from 'effect';
7
7
 
8
8
  import {
9
9
  Capabilities,
10
- createResolver,
11
- contributes,
12
10
  IntentAction,
13
11
  LayoutAction,
14
12
  type PluginContext,
15
- createIntent,
16
13
  chain,
14
+ contributes,
15
+ createIntent,
16
+ createResolver,
17
17
  } from '@dxos/app-framework';
18
18
  import { Obj } from '@dxos/echo';
19
19
  import { invariant } from '@dxos/invariant';
@@ -24,20 +24,21 @@ import { isActionLike } from '@dxos/plugin-graph';
24
24
  import { ObservabilityAction } from '@dxos/plugin-observability/types';
25
25
  import { byPosition, isNonNullable } from '@dxos/util';
26
26
 
27
- import { DeckCapabilities } from './capabilities';
28
27
  import { closeEntry, createEntryId, incrementPlank, openEntry } from '../layout';
29
28
  import { DECK_PLUGIN } from '../meta';
30
29
  import {
31
30
  DeckAction,
32
- type LayoutMode,
33
31
  type DeckSettingsProps,
34
- isLayoutMode,
35
- getMode,
36
- defaultDeck,
32
+ type LayoutMode,
37
33
  PLANK_COMPANION_TYPE,
34
+ defaultDeck,
35
+ getMode,
36
+ isLayoutMode,
38
37
  } from '../types';
39
38
  import { setActive } from '../util';
40
39
 
40
+ import { DeckCapabilities } from './capabilities';
41
+
41
42
  export default (context: PluginContext) =>
42
43
  contributes(Capabilities.IntentResolver, [
43
44
  createResolver({
@@ -6,10 +6,11 @@ import React, { useCallback } from 'react';
6
6
 
7
7
  import { Capabilities, contributes, useCapability } from '@dxos/app-framework';
8
8
 
9
- import { DeckCapabilities } from './capabilities';
10
9
  import { DeckLayout } from '../components';
11
10
  import { DECK_PLUGIN } from '../meta';
12
11
 
12
+ import { DeckCapabilities } from './capabilities';
13
+
13
14
  export default () =>
14
15
  contributes(Capabilities.ReactRoot, {
15
16
  id: DECK_PLUGIN,
@@ -7,7 +7,7 @@ import React from 'react';
7
7
  import { Capabilities, contributes, createSurface } from '@dxos/app-framework';
8
8
  import { SettingsStore } from '@dxos/local-storage';
9
9
 
10
- import { DeckSettings, Banner } from '../components';
10
+ import { Banner, DeckSettings } from '../components';
11
11
  import { DECK_PLUGIN } from '../meta';
12
12
  import { type DeckSettingsProps } from '../types';
13
13
 
@@ -6,7 +6,7 @@ import { Capabilities, contributes } from '@dxos/app-framework';
6
6
  import { live } from '@dxos/live-object';
7
7
 
8
8
  import { meta } from '../meta';
9
- import { DeckSettingsSchema, type DeckSettingsProps } from '../types';
9
+ import { type DeckSettingsProps, DeckSettingsSchema } from '../types';
10
10
 
11
11
  export default () => {
12
12
  const settings = live<DeckSettingsProps>({
@@ -8,9 +8,10 @@ import { live } from '@dxos/live-object';
8
8
  import { LocalStorageStore } from '@dxos/local-storage';
9
9
  import { type SidebarState } from '@dxos/react-ui';
10
10
 
11
- import { DeckCapabilities } from './capabilities';
12
11
  import { DECK_PLUGIN } from '../meta';
13
- import { getMode, type DeckPluginState, defaultDeck, type DeckState } from '../types';
12
+ import { type DeckPluginState, type DeckState, defaultDeck, getMode } from '../types';
13
+
14
+ import { DeckCapabilities } from './capabilities';
14
15
 
15
16
  const boolean = /true|false/;
16
17
 
@@ -0,0 +1,55 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { AiTool, AiToolkit } from '@effect/ai';
6
+ import { Effect, Schema } from 'effect';
7
+
8
+ import { Capabilities, LayoutAction, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
9
+ import { ArtifactId } from '@dxos/assistant';
10
+ import { type SpaceId } from '@dxos/keys';
11
+ import { trim } from '@dxos/util';
12
+
13
+ import { DeckCapabilities } from './capabilities';
14
+
15
+ class DeckToolkit extends AiToolkit.make(
16
+ AiTool.make('open-item', {
17
+ description: trim`
18
+ Opens an item in the application.
19
+ `,
20
+ parameters: {
21
+ id: ArtifactId,
22
+ },
23
+ success: Schema.Any,
24
+ failure: Schema.Never,
25
+ }),
26
+ ) {
27
+ static layer = (context: PluginContext) =>
28
+ DeckToolkit.toLayer({
29
+ 'open-item': ({ id }) =>
30
+ Effect.gen(function* () {
31
+ const state = context.getCapability(DeckCapabilities.DeckState);
32
+ const dxn = ArtifactId.toDXN(id, state.activeDeck as SpaceId);
33
+
34
+ // TODO(wittjosiah): Support other variants.
35
+ const echoDxn = dxn.asEchoDXN();
36
+ if (!echoDxn) {
37
+ throw new Error(`Invalid object ID: ${id}`);
38
+ }
39
+
40
+ // TODO(wittjosiah): Get capabilities via layers.
41
+ const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
42
+ yield* dispatch(
43
+ createIntent(LayoutAction.Open, {
44
+ subject: [`${echoDxn.spaceId!}:${echoDxn.echoId}`],
45
+ part: 'main',
46
+ }),
47
+ );
48
+ }).pipe(Effect.orDie),
49
+ });
50
+ }
51
+
52
+ export default (context: PluginContext) => [
53
+ contributes(Capabilities.Toolkit, DeckToolkit),
54
+ contributes(Capabilities.ToolkitHandler, DeckToolkit.layer(context)),
55
+ ];
@@ -2,17 +2,20 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ // ISSUE(burdon): tools
6
+ // @ts-nocheck
7
+
5
8
  import { Schema } from 'effect';
6
9
 
7
- import { createTool, ToolResult } from '@dxos/ai';
8
10
  import {
9
- contributes,
10
- createIntent,
11
11
  Capabilities,
12
12
  LayoutAction,
13
13
  type PromiseIntentDispatcher,
14
+ contributes,
15
+ createIntent,
14
16
  } from '@dxos/app-framework';
15
17
  import { invariant } from '@dxos/invariant';
18
+ import { trim } from '@dxos/util';
16
19
 
17
20
  import { meta } from '../meta';
18
21
  import { DeckAction } from '../types';
@@ -30,9 +33,9 @@ export default () =>
30
33
  contributes(Capabilities.Tools, [
31
34
  createTool(meta.id, {
32
35
  name: 'show',
33
- description: `
34
- Show an item as a companion to an existing plank. This will make the item appear alongside the primary content.
35
- When supplying IDs, they must be fully qualified like space:object.
36
+ description: trim`
37
+ Show an item as a companion to an existing plank.
38
+ When supplying IDs, they must be fully qualified like this: space-key:object-id
36
39
  `,
37
40
  caption: 'Showing item...',
38
41
  // TODO(wittjosiah): Refactor Layout/Navigation/Deck actions so that they can be used directly.
@@ -2,12 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, contributes, createIntent, LayoutAction, type PluginContext } from '@dxos/app-framework';
5
+ import { Capabilities, LayoutAction, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
6
6
  import { scheduledEffect } from '@dxos/echo-signals/core';
7
7
 
8
- import { DeckCapabilities } from './capabilities';
9
8
  import { defaultDeck } from '../types';
10
9
 
10
+ import { DeckCapabilities } from './capabilities';
11
+
11
12
  // TODO(wittjosiah): Cleanup the url handling. May justify introducing routing capabilities.
12
13
  export default async (context: PluginContext) => {
13
14
  const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
@@ -5,7 +5,7 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { Surface } from '@dxos/app-framework';
8
- import { useTranslation, type ThemedClassName } from '@dxos/react-ui';
8
+ import { type ThemedClassName, useTranslation } from '@dxos/react-ui';
9
9
  import { mx } from '@dxos/react-ui-theme';
10
10
 
11
11
  import { DECK_PLUGIN } from '../../meta';
@@ -10,8 +10,8 @@ import { DeckCapabilities } from '../../capabilities';
10
10
  import { useBreakpoints } from '../../hooks';
11
11
  import { getMode } from '../../types';
12
12
  import { layoutAppliesTopbar } from '../../util';
13
- import { ToggleSidebarButton } from '../Sidebar';
14
13
  import { fixedSidebarToggleStyles } from '../fragments';
14
+ import { ToggleSidebarButton } from '../Sidebar';
15
15
 
16
16
  export const ContentEmpty = () => {
17
17
  const breakpoint = useBreakpoints();
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { untracked } from '@preact/signals-core';
6
- import React, { useCallback, useEffect, useMemo, useRef, type UIEvent, Fragment } from 'react';
6
+ import React, { Fragment, type UIEvent, useCallback, useEffect, useMemo, useRef } from 'react';
7
7
 
8
8
  import {
9
9
  Capabilities,
@@ -15,24 +15,25 @@ import {
15
15
  } from '@dxos/app-framework';
16
16
  import { AttentionCapabilities } from '@dxos/plugin-attention';
17
17
  import { Main, type MainProps, useMediaQuery, useOnTransition } from '@dxos/react-ui';
18
- import { Stack, StackContext, DEFAULT_HORIZONTAL_SIZE } from '@dxos/react-ui-stack';
18
+ import { DEFAULT_HORIZONTAL_SIZE, Stack, StackContext } from '@dxos/react-ui-stack';
19
19
  import { mainPaddingTransitions } from '@dxos/react-ui-theme';
20
20
 
21
- import { ActiveNode } from './ActiveNode';
22
- import { ContentEmpty } from './ContentEmpty';
23
- import { Dialog } from './Dialog';
24
- import { PopoverContent, PopoverRoot } from './Popover';
25
- import { StatusBar } from './StatusBar';
26
- import { Toast } from './Toast';
27
- import { Topbar } from './Topbar';
28
21
  import { DeckCapabilities } from '../../capabilities';
29
22
  import { useBreakpoints, useHoistStatusbar } from '../../hooks';
30
23
  import { DECK_PLUGIN } from '../../meta';
31
24
  import { type DeckSettingsProps, getMode } from '../../types';
32
25
  import { calculateOverscroll, layoutAppliesTopbar } from '../../util';
26
+ import { fixedComplementarySidebarToggleStyles, fixedSidebarToggleStyles } from '../fragments';
33
27
  import { Plank } from '../Plank';
34
28
  import { ComplementarySidebar, Sidebar, ToggleComplementarySidebarButton, ToggleSidebarButton } from '../Sidebar';
35
- import { fixedComplementarySidebarToggleStyles, fixedSidebarToggleStyles } from '../fragments';
29
+
30
+ import { ActiveNode } from './ActiveNode';
31
+ import { ContentEmpty } from './ContentEmpty';
32
+ import { Dialog } from './Dialog';
33
+ import { PopoverContent, PopoverRoot } from './Popover';
34
+ import { StatusBar } from './StatusBar';
35
+ import { Toast } from './Toast';
36
+ import { Topbar } from './Topbar';
36
37
 
37
38
  export type DeckLayoutProps = {
38
39
  onDismissToast: (id: string) => void;
@@ -4,7 +4,7 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
  import React from 'react';
9
9
 
10
10
  import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
@@ -12,12 +12,13 @@ import { withPluginManager } from '@dxos/app-framework/testing';
12
12
  import { AttentionPlugin } from '@dxos/plugin-attention';
13
13
  import { GraphPlugin } from '@dxos/plugin-graph';
14
14
  import { Stack } from '@dxos/react-ui-stack';
15
- import { withTheme, withLayout } from '@dxos/storybook-utils';
15
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
16
16
 
17
- import { Plank, type PlankProps } from './Plank';
18
17
  import { DeckStateFactory } from '../../capabilities';
19
18
  import { translations } from '../../translations';
20
19
 
20
+ import { Plank, type PlankProps } from './Plank';
21
+
21
22
  const meta: Meta<PlankProps> = {
22
23
  title: 'plugins/plugin-deck/Plank',
23
24
  component: Plank,
@@ -16,23 +16,24 @@ import {
16
16
  LayoutAction,
17
17
  Surface,
18
18
  createIntent,
19
- useCapability,
20
19
  useAppGraph,
20
+ useCapability,
21
21
  useIntentDispatcher,
22
22
  } from '@dxos/app-framework';
23
23
  import { debounce } from '@dxos/async';
24
- import { useNode, type Node } from '@dxos/plugin-graph';
24
+ import { type Node, useNode } from '@dxos/plugin-graph';
25
25
  import { ATTENDABLE_PATH_SEPARATOR, useAttentionAttributes } from '@dxos/react-ui-attention';
26
26
  import { StackItem, railGridHorizontal } from '@dxos/react-ui-stack';
27
27
  import { mainIntrinsicSize, mx } from '@dxos/react-ui-theme';
28
28
 
29
+ import { DeckCapabilities } from '../../capabilities';
30
+ import { useCompanions, useMainSize } from '../../hooks';
31
+ import { parseEntryId } from '../../layout';
32
+ import { DeckAction, type DeckSettingsProps, type LayoutMode, type ResolvedPart } from '../../types';
33
+
29
34
  import { PlankContentError, PlankError } from './PlankError';
30
35
  import { PlankHeading } from './PlankHeading';
31
36
  import { PlankLoading } from './PlankLoading';
32
- import { DeckCapabilities } from '../../capabilities';
33
- import { useMainSize, useCompanions } from '../../hooks';
34
- import { parseEntryId } from '../../layout';
35
- import { DeckAction, type LayoutMode, type ResolvedPart, type DeckSettingsProps } from '../../types';
36
37
 
37
38
  const UNKNOWN_ID = 'unknown_id';
38
39
 
@@ -8,9 +8,10 @@ import { type Node } from '@dxos/plugin-graph';
8
8
  import { useTranslation } from '@dxos/react-ui';
9
9
  import { descriptionMessage, mx } from '@dxos/react-ui-theme';
10
10
 
11
+ import { DECK_PLUGIN } from '../../meta';
12
+
11
13
  import { PlankHeading, type PlankHeadingProps } from './PlankHeading';
12
14
  import { PlankLoading } from './PlankLoading';
13
- import { DECK_PLUGIN } from '../../meta';
14
15
 
15
16
  export const PlankContentError = ({ error }: { error?: Error }) => {
16
17
  const { t } = useTranslation(DECK_PLUGIN);
@@ -2,22 +2,23 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import React, { Fragment, memo, useCallback, useEffect, useMemo, type MouseEvent } from 'react';
5
+ import React, { Fragment, type MouseEvent, memo, useCallback, useEffect, useMemo } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, Surface, useAppGraph, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { LayoutAction, Surface, createIntent, useAppGraph, useIntentDispatcher } from '@dxos/app-framework';
8
8
  import { type Node } from '@dxos/plugin-graph';
9
9
  import { Icon, IconButton, Popover, toLocalizedString, useTranslation } from '@dxos/react-ui';
10
10
  import { StackItem, type StackItemSigilAction } from '@dxos/react-ui-stack';
11
11
  import { TextTooltip } from '@dxos/react-ui-text-tooltip';
12
12
  import { hoverableControls, hoverableFocusedWithinControls } from '@dxos/react-ui-theme';
13
13
 
14
- import { PlankCompanionControls, PlankControls } from './PlankControls';
15
14
  import { useBreakpoints } from '../../hooks';
16
15
  import { parseEntryId } from '../../layout';
17
16
  import { DECK_PLUGIN } from '../../meta';
18
- import { PLANK_COMPANION_TYPE, DeckAction, type ResolvedPart, type LayoutMode } from '../../types';
17
+ import { DeckAction, type LayoutMode, PLANK_COMPANION_TYPE, type ResolvedPart } from '../../types';
19
18
  import { soloInlinePadding } from '../fragments';
20
19
 
20
+ import { PlankCompanionControls, PlankControls } from './PlankControls';
21
+
21
22
  const MAX_COMPANIONS = 5;
22
23
 
23
24
  export type PlankHeadingProps = {
@@ -13,17 +13,18 @@ import React, {
13
13
  } from 'react';
14
14
 
15
15
  import { LayoutAction, Surface, createIntent, useCapability, useIntentDispatcher } from '@dxos/app-framework';
16
- import { Main, useTranslation, toLocalizedString, IconButton, type Label } from '@dxos/react-ui';
16
+ import { IconButton, type Label, Main, toLocalizedString, useTranslation } from '@dxos/react-ui';
17
17
  import { Tabs } from '@dxos/react-ui-tabs';
18
18
 
19
- import { ToggleComplementarySidebarButton } from './SidebarButton';
20
19
  import { DeckCapabilities } from '../../capabilities';
21
- import { type DeckCompanion, getCompanionId, useDeckCompanions, useBreakpoints, useHoistStatusbar } from '../../hooks';
20
+ import { type DeckCompanion, getCompanionId, useBreakpoints, useDeckCompanions, useHoistStatusbar } from '../../hooks';
22
21
  import { DECK_PLUGIN } from '../../meta';
23
22
  import { getMode } from '../../types';
24
23
  import { layoutAppliesTopbar } from '../../util';
25
24
  import { PlankContentError, PlankLoading } from '../Plank';
26
25
 
26
+ import { ToggleComplementarySidebarButton } from './SidebarButton';
27
+
27
28
  const label = ['complementary sidebar title', { ns: DECK_PLUGIN }] satisfies Label;
28
29
 
29
30
  export type ComplementarySidebarProps = {
@@ -4,11 +4,11 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, useCapability, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { LayoutAction, createIntent, useCapability, useIntentDispatcher } from '@dxos/app-framework';
8
8
  import { IconButton, type IconButtonProps, type ThemedClassName, useTranslation } from '@dxos/react-ui';
9
9
 
10
10
  import { DeckCapabilities } from '../../capabilities';
11
- import { useDeckCompanions, getCompanionId } from '../../hooks';
11
+ import { getCompanionId, useDeckCompanions } from '../../hooks';
12
12
  import { DECK_PLUGIN } from '../../meta';
13
13
 
14
14
  export const ToggleSidebarButton = ({
@@ -3,8 +3,8 @@
3
3
  //
4
4
 
5
5
  import { type Label, useAppGraph } from '@dxos/app-framework';
6
- import { ROOT_ID, useConnections, type Node } from '@dxos/plugin-graph';
7
- import { byPosition, type Position } from '@dxos/util';
6
+ import { type Node, ROOT_ID, useConnections } from '@dxos/plugin-graph';
7
+ import { type Position, byPosition } from '@dxos/util';
8
8
 
9
9
  import { ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from '../types';
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { useEffect } from 'react';
6
6
 
7
- import { getGraph, type Node } from '@dxos/plugin-graph';
7
+ import { type Node, getGraph } from '@dxos/plugin-graph';
8
8
 
9
9
  export const useNodeActionExpander = (node?: Node) => {
10
10
  useEffect(() => {