@dxos/plugin-registry 0.8.4-main.bc674ce → 0.8.4-main.c351d160a8

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 (122) hide show
  1. package/dist/lib/browser/PluginArticle-N2ITBUGD.mjs +29 -0
  2. package/dist/lib/browser/PluginArticle-N2ITBUGD.mjs.map +7 -0
  3. package/dist/lib/browser/PluginRegistry-DKO4UEYH.mjs +78 -0
  4. package/dist/lib/browser/PluginRegistry-DKO4UEYH.mjs.map +7 -0
  5. package/dist/lib/browser/{app-graph-builder-P3ZGGFAR.mjs → app-graph-builder-AHS5BI4Y.mjs} +21 -20
  6. package/dist/lib/browser/app-graph-builder-AHS5BI4Y.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2YWVCU2W.mjs +191 -0
  8. package/dist/lib/browser/chunk-2YWVCU2W.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-VOAOTNGS.mjs → chunk-KMUDYITM.mjs} +4 -2
  10. package/dist/lib/browser/chunk-KMUDYITM.mjs.map +7 -0
  11. package/dist/lib/browser/cli/index.mjs +15 -16
  12. package/dist/lib/browser/cli/index.mjs.map +3 -3
  13. package/dist/lib/browser/index.mjs +15 -12
  14. package/dist/lib/browser/index.mjs.map +3 -3
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/{operation-resolver-P5PKLPRT.mjs → operation-resolver-PK4B2BZQ.mjs} +7 -6
  17. package/dist/lib/browser/operation-resolver-PK4B2BZQ.mjs.map +7 -0
  18. package/dist/lib/browser/react-surface-ZBP7YXKO.mjs +85 -0
  19. package/dist/lib/browser/react-surface-ZBP7YXKO.mjs.map +7 -0
  20. package/dist/lib/node-esm/PluginArticle-3NEYDKN5.mjs +30 -0
  21. package/dist/lib/node-esm/PluginArticle-3NEYDKN5.mjs.map +7 -0
  22. package/dist/lib/node-esm/PluginRegistry-BYKWC732.mjs +79 -0
  23. package/dist/lib/node-esm/PluginRegistry-BYKWC732.mjs.map +7 -0
  24. package/dist/lib/node-esm/{app-graph-builder-56JXLOGZ.mjs → app-graph-builder-DBDL5WWF.mjs} +21 -20
  25. package/dist/lib/node-esm/app-graph-builder-DBDL5WWF.mjs.map +7 -0
  26. package/dist/lib/node-esm/chunk-BOCFM775.mjs +192 -0
  27. package/dist/lib/node-esm/chunk-BOCFM775.mjs.map +7 -0
  28. package/dist/lib/node-esm/{chunk-SALMIZ2W.mjs → chunk-ENSNUFQK.mjs} +4 -2
  29. package/dist/lib/node-esm/chunk-ENSNUFQK.mjs.map +7 -0
  30. package/dist/lib/node-esm/cli/index.mjs +15 -16
  31. package/dist/lib/node-esm/cli/index.mjs.map +3 -3
  32. package/dist/lib/node-esm/index.mjs +15 -12
  33. package/dist/lib/node-esm/index.mjs.map +3 -3
  34. package/dist/lib/node-esm/meta.json +1 -1
  35. package/dist/lib/node-esm/{operation-resolver-3ZB5W3T3.mjs → operation-resolver-CCHN4NBP.mjs} +7 -6
  36. package/dist/lib/node-esm/operation-resolver-CCHN4NBP.mjs.map +7 -0
  37. package/dist/lib/node-esm/react-surface-FJHMLGZF.mjs +86 -0
  38. package/dist/lib/node-esm/react-surface-FJHMLGZF.mjs.map +7 -0
  39. package/dist/types/src/RegistryPlugin.d.ts.map +1 -1
  40. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -1
  41. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
  42. package/dist/types/src/capabilities/operation-resolver/index.d.ts +1 -1
  43. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -1
  44. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
  45. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  46. package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
  47. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
  48. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
  49. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  50. package/dist/types/src/cli/commands/disable.d.ts +2 -2
  51. package/dist/types/src/cli/commands/enable.d.ts +2 -2
  52. package/dist/types/src/cli/plugin.d.ts.map +1 -1
  53. package/dist/types/src/cli/storage.d.ts +4 -4
  54. package/dist/types/src/cli/storage.d.ts.map +1 -1
  55. package/dist/types/src/components/PluginDetail/PluginDetail.d.ts.map +1 -0
  56. package/dist/types/src/components/{PluginDetail.stories.d.ts → PluginDetail/PluginDetail.stories.d.ts} +1 -0
  57. package/dist/types/src/components/PluginDetail/PluginDetail.stories.d.ts.map +1 -0
  58. package/dist/types/src/components/PluginDetail/index.d.ts +2 -0
  59. package/dist/types/src/components/PluginDetail/index.d.ts.map +1 -0
  60. package/dist/types/src/components/PluginList/PluginItem.d.ts.map +1 -0
  61. package/dist/types/src/components/PluginList/PluginList.d.ts.map +1 -0
  62. package/dist/types/src/components/PluginList/PluginList.stories.d.ts.map +1 -0
  63. package/dist/types/src/components/PluginList/index.d.ts +2 -0
  64. package/dist/types/src/components/PluginList/index.d.ts.map +1 -0
  65. package/dist/types/src/components/index.d.ts +0 -1
  66. package/dist/types/src/components/index.d.ts.map +1 -1
  67. package/dist/types/src/containers/PluginArticle/PluginArticle.d.ts +7 -0
  68. package/dist/types/src/containers/PluginArticle/PluginArticle.d.ts.map +1 -0
  69. package/dist/types/src/containers/PluginArticle/index.d.ts +3 -0
  70. package/dist/types/src/containers/PluginArticle/index.d.ts.map +1 -0
  71. package/dist/types/src/containers/PluginRegistry/PluginRegistry.d.ts +8 -0
  72. package/dist/types/src/containers/PluginRegistry/PluginRegistry.d.ts.map +1 -0
  73. package/dist/types/src/containers/PluginRegistry/index.d.ts +3 -0
  74. package/dist/types/src/containers/PluginRegistry/index.d.ts.map +1 -0
  75. package/dist/types/src/containers/index.d.ts +4 -0
  76. package/dist/types/src/containers/index.d.ts.map +1 -0
  77. package/dist/types/src/meta.d.ts +2 -0
  78. package/dist/types/src/meta.d.ts.map +1 -1
  79. package/dist/types/tsconfig.tsbuildinfo +1 -1
  80. package/package.json +33 -31
  81. package/src/RegistryPlugin.tsx +6 -5
  82. package/src/capabilities/app-graph-builder/app-graph-builder.ts +23 -22
  83. package/src/capabilities/operation-resolver/operation-resolver.ts +4 -3
  84. package/src/capabilities/react-surface/react-surface.tsx +24 -35
  85. package/src/cli/plugin.ts +3 -2
  86. package/src/cli/storage.ts +14 -21
  87. package/src/components/{PluginDetail.stories.tsx → PluginDetail/PluginDetail.stories.tsx} +4 -3
  88. package/src/components/PluginDetail/PluginDetail.tsx +81 -0
  89. package/src/components/PluginDetail/index.ts +5 -0
  90. package/src/components/{PluginItem.tsx → PluginList/PluginItem.tsx} +14 -10
  91. package/src/components/{PluginList.stories.tsx → PluginList/PluginList.stories.tsx} +14 -7
  92. package/src/components/PluginList/index.ts +5 -0
  93. package/src/components/index.ts +0 -1
  94. package/src/containers/PluginArticle/PluginArticle.tsx +28 -0
  95. package/src/containers/PluginArticle/index.ts +7 -0
  96. package/src/{components/RegistryContainer.tsx → containers/PluginRegistry/PluginRegistry.tsx} +23 -20
  97. package/src/containers/PluginRegistry/index.ts +7 -0
  98. package/src/containers/index.ts +8 -0
  99. package/src/meta.ts +4 -4
  100. package/dist/lib/browser/app-graph-builder-P3ZGGFAR.mjs.map +0 -7
  101. package/dist/lib/browser/chunk-VOAOTNGS.mjs.map +0 -7
  102. package/dist/lib/browser/operation-resolver-P5PKLPRT.mjs.map +0 -7
  103. package/dist/lib/browser/react-surface-IIM6T7IA.mjs +0 -337
  104. package/dist/lib/browser/react-surface-IIM6T7IA.mjs.map +0 -7
  105. package/dist/lib/node-esm/app-graph-builder-56JXLOGZ.mjs.map +0 -7
  106. package/dist/lib/node-esm/chunk-SALMIZ2W.mjs.map +0 -7
  107. package/dist/lib/node-esm/operation-resolver-3ZB5W3T3.mjs.map +0 -7
  108. package/dist/lib/node-esm/react-surface-F67P7RC3.mjs +0 -338
  109. package/dist/lib/node-esm/react-surface-F67P7RC3.mjs.map +0 -7
  110. package/dist/types/src/components/PluginDetail.d.ts.map +0 -1
  111. package/dist/types/src/components/PluginDetail.stories.d.ts.map +0 -1
  112. package/dist/types/src/components/PluginItem.d.ts.map +0 -1
  113. package/dist/types/src/components/PluginList.d.ts.map +0 -1
  114. package/dist/types/src/components/PluginList.stories.d.ts.map +0 -1
  115. package/dist/types/src/components/RegistryContainer.d.ts +0 -8
  116. package/dist/types/src/components/RegistryContainer.d.ts.map +0 -1
  117. package/src/components/PluginDetail.tsx +0 -79
  118. /package/dist/types/src/components/{PluginDetail.d.ts → PluginDetail/PluginDetail.d.ts} +0 -0
  119. /package/dist/types/src/components/{PluginItem.d.ts → PluginList/PluginItem.d.ts} +0 -0
  120. /package/dist/types/src/components/{PluginList.d.ts → PluginList/PluginList.d.ts} +0 -0
  121. /package/dist/types/src/components/{PluginList.stories.d.ts → PluginList/PluginList.stories.d.ts} +0 -0
  122. /package/src/components/{PluginList.tsx → PluginList/PluginList.tsx} +0 -0
@@ -0,0 +1,29 @@
1
+ import {
2
+ PluginDetail
3
+ } from "./chunk-2YWVCU2W.mjs";
4
+ import "./chunk-KMUDYITM.mjs";
5
+
6
+ // src/containers/PluginArticle/PluginArticle.tsx
7
+ import React, { useCallback } from "react";
8
+ import { usePluginManager } from "@dxos/app-framework/ui";
9
+ import { runAndForwardErrors } from "@dxos/effect";
10
+ var PluginArticle = ({ subject: plugin }) => {
11
+ const manager = usePluginManager();
12
+ const enabled = manager.getEnabled().includes(plugin.meta.id);
13
+ const handleEnableChange = useCallback((enabled2) => enabled2 ? runAndForwardErrors(manager.enable(plugin.meta.id)) : runAndForwardErrors(manager.disable(plugin.meta.id)), [
14
+ manager,
15
+ plugin.meta.id
16
+ ]);
17
+ return /* @__PURE__ */ React.createElement(PluginDetail, {
18
+ plugin,
19
+ enabled,
20
+ onEnabledChange: handleEnableChange
21
+ });
22
+ };
23
+
24
+ // src/containers/PluginArticle/index.ts
25
+ var PluginArticle_default = PluginArticle;
26
+ export {
27
+ PluginArticle_default as default
28
+ };
29
+ //# sourceMappingURL=PluginArticle-N2ITBUGD.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/PluginArticle/PluginArticle.tsx", "../../../src/containers/PluginArticle/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { usePluginManager } from '@dxos/app-framework/ui';\nimport { runAndForwardErrors } from '@dxos/effect';\n\nimport { PluginDetail } from '../../components';\n\n// TODO(burdon): Convert to ECHO type.\nexport type PluginArticleProps = { subject: Plugin.Plugin };\n\nexport const PluginArticle = ({ subject: plugin }: PluginArticleProps) => {\n const manager = usePluginManager();\n const enabled = manager.getEnabled().includes(plugin.meta.id);\n const handleEnableChange = useCallback(\n (enabled: boolean) =>\n enabled\n ? runAndForwardErrors(manager.enable(plugin.meta.id))\n : runAndForwardErrors(manager.disable(plugin.meta.id)),\n [manager, plugin.meta.id],\n );\n\n return <PluginDetail plugin={plugin} enabled={enabled} onEnabledChange={handleEnableChange} />;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { PluginArticle } from './PluginArticle';\n\nexport default PluginArticle;\n"],
5
+ "mappings": ";;;;;;AAIA,OAAOA,SAASC,mBAAmB;AAGnC,SAASC,wBAAwB;AACjC,SAASC,2BAA2B;AAO7B,IAAMC,gBAAgB,CAAC,EAAEC,SAASC,OAAM,MAAsB;AACnE,QAAMC,UAAUC,iBAAAA;AAChB,QAAMC,UAAUF,QAAQG,WAAU,EAAGC,SAASL,OAAOM,KAAKC,EAAE;AAC5D,QAAMC,qBAAqBC,YACzB,CAACN,aACCA,WACIO,oBAAoBT,QAAQU,OAAOX,OAAOM,KAAKC,EAAE,CAAA,IACjDG,oBAAoBT,QAAQW,QAAQZ,OAAOM,KAAKC,EAAE,CAAA,GACxD;IAACN;IAASD,OAAOM,KAAKC;GAAG;AAG3B,SAAO,sBAAA,cAACM,cAAAA;IAAab;IAAgBG;IAAkBW,iBAAiBN;;AAC1E;;;ACrBA,IAAA,wBAAeO;",
6
+ "names": ["React", "useCallback", "usePluginManager", "runAndForwardErrors", "PluginArticle", "subject", "plugin", "manager", "usePluginManager", "enabled", "getEnabled", "includes", "meta", "id", "handleEnableChange", "useCallback", "runAndForwardErrors", "enable", "disable", "PluginDetail", "onEnabledChange", "PluginArticle"]
7
+ }
@@ -0,0 +1,78 @@
1
+ import {
2
+ PluginList
3
+ } from "./chunk-2YWVCU2W.mjs";
4
+ import {
5
+ getPluginPath
6
+ } from "./chunk-KMUDYITM.mjs";
7
+
8
+ // src/containers/PluginRegistry/PluginRegistry.tsx
9
+ import { useAtomValue } from "@effect-atom/atom-react";
10
+ import * as Effect from "effect/Effect";
11
+ import React, { useCallback, useMemo } from "react";
12
+ import { useCapabilities, useOperationInvoker, usePluginManager } from "@dxos/app-framework/ui";
13
+ import { AppCapabilities, LayoutOperation, SettingsOperation } from "@dxos/app-toolkit";
14
+ import { runAndForwardErrors } from "@dxos/effect";
15
+ import { ObservabilityOperation } from "@dxos/plugin-observability/types";
16
+ import { ScrollArea } from "@dxos/react-ui";
17
+ var sortByPluginMeta = ({ meta: { name: a = "" } }, { meta: { name: b = "" } }) => a.localeCompare(b);
18
+ var PluginRegistry = ({ id, plugins: pluginsProp }) => {
19
+ const manager = usePluginManager();
20
+ const { invoke, invokePromise } = useOperationInvoker();
21
+ const plugins = useMemo(() => pluginsProp.sort(sortByPluginMeta), [
22
+ pluginsProp
23
+ ]);
24
+ const enabled = useAtomValue(manager.enabled);
25
+ const allSettings = useCapabilities(AppCapabilities.Settings);
26
+ const handleChange = useCallback((id2, enabled2) => Effect.gen(function* () {
27
+ if (enabled2) {
28
+ yield* manager.enable(id2);
29
+ } else {
30
+ yield* manager.disable(id2);
31
+ }
32
+ yield* invoke(ObservabilityOperation.SendEvent, {
33
+ name: "plugins.toggle",
34
+ properties: {
35
+ plugin: id2,
36
+ enabled: enabled2
37
+ }
38
+ });
39
+ }).pipe(runAndForwardErrors), [
40
+ invoke,
41
+ manager
42
+ ]);
43
+ const handleClick = useCallback((pluginId) => invokePromise(LayoutOperation.Open, {
44
+ subject: [
45
+ getPluginPath(pluginId)
46
+ ],
47
+ pivotId: id,
48
+ positioning: "end"
49
+ }), [
50
+ invokePromise,
51
+ id
52
+ ]);
53
+ const hasSettings = useCallback((pluginId) => allSettings.some((s) => s.prefix === pluginId), [
54
+ allSettings
55
+ ]);
56
+ const handleSettings = useCallback((pluginId) => invokePromise(SettingsOperation.Open, {
57
+ plugin: pluginId
58
+ }), [
59
+ invokePromise
60
+ ]);
61
+ return /* @__PURE__ */ React.createElement(ScrollArea.Root, {
62
+ orientation: "vertical"
63
+ }, /* @__PURE__ */ React.createElement(ScrollArea.Viewport, null, /* @__PURE__ */ React.createElement(PluginList, {
64
+ plugins,
65
+ enabled,
66
+ onClick: handleClick,
67
+ onChange: handleChange,
68
+ hasSettings,
69
+ onSettings: handleSettings
70
+ })));
71
+ };
72
+
73
+ // src/containers/PluginRegistry/index.ts
74
+ var PluginRegistry_default = PluginRegistry;
75
+ export {
76
+ PluginRegistry_default as default
77
+ };
78
+ //# sourceMappingURL=PluginRegistry-DKO4UEYH.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/PluginRegistry/PluginRegistry.tsx", "../../../src/containers/PluginRegistry/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\nimport React, { useCallback, useMemo } from 'react';\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { useCapabilities, useOperationInvoker, usePluginManager } from '@dxos/app-framework/ui';\nimport { AppCapabilities, LayoutOperation, SettingsOperation } from '@dxos/app-toolkit';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { ObservabilityOperation } from '@dxos/plugin-observability/types';\nimport { ScrollArea } from '@dxos/react-ui';\n\nimport { PluginList } from '../../components';\nimport { getPluginPath } from '../../meta';\n\nconst sortByPluginMeta = ({ meta: { name: a = '' } }: Plugin.Plugin, { meta: { name: b = '' } }: Plugin.Plugin) =>\n a.localeCompare(b);\n\nexport type PluginRegistryProps = {\n id: string;\n plugins: Plugin.Plugin[];\n};\n\nexport const PluginRegistry = ({ id, plugins: pluginsProp }: PluginRegistryProps) => {\n const manager = usePluginManager();\n const { invoke, invokePromise } = useOperationInvoker();\n const plugins = useMemo(() => pluginsProp.sort(sortByPluginMeta), [pluginsProp]);\n const enabled = useAtomValue(manager.enabled);\n const allSettings = useCapabilities(AppCapabilities.Settings);\n\n // TODO(wittjosiah): Factor out to an intent?\n const handleChange = useCallback(\n (id: string, enabled: boolean) =>\n Effect.gen(function* () {\n if (enabled) {\n yield* manager.enable(id);\n } else {\n yield* manager.disable(id);\n }\n\n yield* invoke(ObservabilityOperation.SendEvent, {\n name: 'plugins.toggle',\n properties: {\n plugin: id,\n enabled,\n },\n });\n }).pipe(runAndForwardErrors),\n [invoke, manager],\n );\n\n const handleClick = useCallback(\n (pluginId: string) =>\n invokePromise(LayoutOperation.Open, {\n subject: [getPluginPath(pluginId)],\n pivotId: id,\n positioning: 'end',\n }),\n [invokePromise, id],\n );\n\n const hasSettings = useCallback((pluginId: string) => allSettings.some((s) => s.prefix === pluginId), [allSettings]);\n\n const handleSettings = useCallback(\n (pluginId: string) => invokePromise(SettingsOperation.Open, { plugin: pluginId }),\n [invokePromise],\n );\n\n return (\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport>\n <PluginList\n plugins={plugins}\n enabled={enabled}\n onClick={handleClick}\n onChange={handleChange}\n hasSettings={hasSettings}\n onSettings={handleSettings}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { PluginRegistry } from './PluginRegistry';\n\nexport default PluginRegistry;\n"],
5
+ "mappings": ";;;;;;;;AAIA,SAASA,oBAAoB;AAC7B,YAAYC,YAAY;AACxB,OAAOC,SAASC,aAAaC,eAAe;AAG5C,SAASC,iBAAiBC,qBAAqBC,wBAAwB;AACvE,SAASC,iBAAiBC,iBAAiBC,yBAAyB;AACpE,SAASC,2BAA2B;AACpC,SAASC,8BAA8B;AACvC,SAASC,kBAAkB;AAK3B,IAAMC,mBAAmB,CAAC,EAAEC,MAAM,EAAEC,MAAMC,IAAI,GAAE,EAAE,GAAmB,EAAEF,MAAM,EAAEC,MAAME,IAAI,GAAE,EAAE,MAC3FD,EAAEE,cAAcD,CAAAA;AAOX,IAAME,iBAAiB,CAAC,EAAEC,IAAIC,SAASC,YAAW,MAAuB;AAC9E,QAAMC,UAAUC,iBAAAA;AAChB,QAAM,EAAEC,QAAQC,cAAa,IAAKC,oBAAAA;AAClC,QAAMN,UAAUO,QAAQ,MAAMN,YAAYO,KAAKhB,gBAAAA,GAAmB;IAACS;GAAY;AAC/E,QAAMQ,UAAUC,aAAaR,QAAQO,OAAO;AAC5C,QAAME,cAAcC,gBAAgBC,gBAAgBC,QAAQ;AAG5D,QAAMC,eAAeC,YACnB,CAACjB,KAAYU,aACJQ,WAAI,aAAA;AACT,QAAIR,UAAS;AACX,aAAOP,QAAQgB,OAAOnB,GAAAA;IACxB,OAAO;AACL,aAAOG,QAAQiB,QAAQpB,GAAAA;IACzB;AAEA,WAAOK,OAAOgB,uBAAuBC,WAAW;MAC9C3B,MAAM;MACN4B,YAAY;QACVC,QAAQxB;QACRU,SAAAA;MACF;IACF,CAAA;EACF,CAAA,EAAGe,KAAKC,mBAAAA,GACV;IAACrB;IAAQF;GAAQ;AAGnB,QAAMwB,cAAcV,YAClB,CAACW,aACCtB,cAAcuB,gBAAgBC,MAAM;IAClCC,SAAS;MAACC,cAAcJ,QAAAA;;IACxBK,SAASjC;IACTkC,aAAa;EACf,CAAA,GACF;IAAC5B;IAAeN;GAAG;AAGrB,QAAMmC,cAAclB,YAAY,CAACW,aAAqBhB,YAAYwB,KAAK,CAACC,MAAMA,EAAEC,WAAWV,QAAAA,GAAW;IAAChB;GAAY;AAEnH,QAAM2B,iBAAiBtB,YACrB,CAACW,aAAqBtB,cAAckC,kBAAkBV,MAAM;IAAEN,QAAQI;EAAS,CAAA,GAC/E;IAACtB;GAAc;AAGjB,SACE,sBAAA,cAACmC,WAAWC,MAAI;IAACC,aAAY;KAC3B,sBAAA,cAACF,WAAWG,UAAQ,MAClB,sBAAA,cAACC,YAAAA;IACC5C;IACAS;IACAoC,SAASnB;IACToB,UAAU/B;IACVmB;IACAa,YAAYT;;AAKtB;;;AC/EA,IAAA,yBAAeU;",
6
+ "names": ["useAtomValue", "Effect", "React", "useCallback", "useMemo", "useCapabilities", "useOperationInvoker", "usePluginManager", "AppCapabilities", "LayoutOperation", "SettingsOperation", "runAndForwardErrors", "ObservabilityOperation", "ScrollArea", "sortByPluginMeta", "meta", "name", "a", "b", "localeCompare", "PluginRegistry", "id", "plugins", "pluginsProp", "manager", "usePluginManager", "invoke", "invokePromise", "useOperationInvoker", "useMemo", "sort", "enabled", "useAtomValue", "allSettings", "useCapabilities", "AppCapabilities", "Settings", "handleChange", "useCallback", "gen", "enable", "disable", "ObservabilityOperation", "SendEvent", "properties", "plugin", "pipe", "runAndForwardErrors", "handleClick", "pluginId", "LayoutOperation", "Open", "subject", "getPluginPath", "pivotId", "positioning", "hasSettings", "some", "s", "prefix", "handleSettings", "SettingsOperation", "ScrollArea", "Root", "orientation", "Viewport", "PluginList", "onClick", "onChange", "onSettings", "PluginRegistry"]
7
+ }
@@ -2,11 +2,12 @@ import {
2
2
  REGISTRY_ID,
3
3
  REGISTRY_KEY,
4
4
  meta
5
- } from "./chunk-VOAOTNGS.mjs";
5
+ } from "./chunk-KMUDYITM.mjs";
6
6
 
7
7
  // src/capabilities/app-graph-builder/app-graph-builder.ts
8
8
  import * as Effect from "effect/Effect";
9
- import { Capability, Common, SettingsOperation } from "@dxos/app-framework";
9
+ import { Capabilities, Capability } from "@dxos/app-framework";
10
+ import { AppCapabilities, SettingsOperation } from "@dxos/app-toolkit";
10
11
  import { Operation } from "@dxos/operation";
11
12
  import { GraphBuilder, NodeMatcher } from "@dxos/plugin-graph";
12
13
  var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function* () {
@@ -52,9 +53,9 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
52
53
  },
53
54
  nodes: [
54
55
  {
55
- id: `${REGISTRY_KEY}+all`,
56
+ id: `${REGISTRY_KEY}>all`,
56
57
  type: "category",
57
- data: `${REGISTRY_KEY}+all`,
58
+ data: `${REGISTRY_KEY}>all`,
58
59
  properties: {
59
60
  label: [
60
61
  "all plugins label",
@@ -68,9 +69,9 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
68
69
  }
69
70
  },
70
71
  {
71
- id: `${REGISTRY_KEY}+installed`,
72
+ id: `${REGISTRY_KEY}>installed`,
72
73
  type: "category",
73
- data: `${REGISTRY_KEY}+installed`,
74
+ data: `${REGISTRY_KEY}>installed`,
74
75
  properties: {
75
76
  label: [
76
77
  "installed plugins label",
@@ -84,9 +85,9 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
84
85
  }
85
86
  },
86
87
  {
87
- id: `${REGISTRY_KEY}+recommended`,
88
+ id: `${REGISTRY_KEY}>recommended`,
88
89
  type: "category",
89
- data: `${REGISTRY_KEY}+recommended`,
90
+ data: `${REGISTRY_KEY}>recommended`,
90
91
  properties: {
91
92
  label: [
92
93
  "recommended plugins label",
@@ -100,9 +101,9 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
100
101
  }
101
102
  },
102
103
  {
103
- id: `${REGISTRY_KEY}+labs`,
104
+ id: `${REGISTRY_KEY}>labs`,
104
105
  type: "category",
105
- data: `${REGISTRY_KEY}+labs`,
106
+ data: `${REGISTRY_KEY}>labs`,
106
107
  properties: {
107
108
  label: [
108
109
  "labs plugins label",
@@ -120,11 +121,11 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
120
121
  ])
121
122
  }),
122
123
  GraphBuilder.createExtension({
123
- id: `${meta.id}/actions`,
124
- match: NodeMatcher.whenId(REGISTRY_ID),
124
+ id: `${meta.id}.actions`,
125
+ match: NodeMatcher.whenId(`root/${REGISTRY_ID}`),
125
126
  actions: () => Effect.succeed([
126
127
  {
127
- id: `${meta.id}/load-by-url`,
128
+ id: `${meta.id}.load-by-url`,
128
129
  data: Effect.fnUntraced(function* () {
129
130
  }),
130
131
  properties: {
@@ -141,13 +142,13 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
141
142
  ])
142
143
  }),
143
144
  GraphBuilder.createExtension({
144
- id: `${meta.id}/plugins`,
145
- match: NodeMatcher.whenId(REGISTRY_ID),
145
+ id: `${meta.id}.plugins`,
146
+ match: NodeMatcher.whenId(`root/${REGISTRY_ID}`),
146
147
  connector: () => {
147
- const manager = capabilities.get(Common.Capability.PluginManager);
148
+ const manager = capabilities.get(Capabilities.PluginManager);
148
149
  return Effect.succeed(manager.getPlugins().map((plugin) => ({
149
- id: plugin.meta.id.replaceAll("/", ":"),
150
- type: "dxos.org/plugin",
150
+ id: plugin.meta.id,
151
+ type: "org.dxos.plugin",
151
152
  data: plugin,
152
153
  properties: {
153
154
  label: plugin.meta.name ?? plugin.meta.id,
@@ -158,9 +159,9 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
158
159
  }
159
160
  })
160
161
  ]);
161
- return Capability.contributes(Common.Capability.AppGraphBuilder, extensions);
162
+ return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
162
163
  }));
163
164
  export {
164
165
  app_graph_builder_default as default
165
166
  };
166
- //# sourceMappingURL=app-graph-builder-P3ZGGFAR.mjs.map
167
+ //# sourceMappingURL=app-graph-builder-AHS5BI4Y.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/app-graph-builder/app-graph-builder.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { AppCapabilities, SettingsOperation } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/operation';\nimport { GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';\n\nimport { REGISTRY_ID, REGISTRY_KEY, meta } from '../../meta';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const capabilities = yield* Capability.Service;\n\n const extensions = yield* Effect.all([\n GraphBuilder.createExtension({\n id: meta.id,\n match: NodeMatcher.whenRoot,\n actions: () =>\n Effect.succeed([\n {\n id: meta.id,\n data: () => Operation.invoke(SettingsOperation.OpenPluginRegistry),\n properties: {\n label: ['open plugin registry label', { ns: meta.id }],\n icon: 'ph--squares-four--regular',\n disposition: 'menu',\n },\n },\n ]),\n }),\n GraphBuilder.createExtension({\n id: meta.id,\n match: NodeMatcher.whenRoot,\n connector: () =>\n Effect.succeed([\n {\n id: REGISTRY_ID,\n type: meta.id,\n properties: {\n label: ['plugin registry label', { ns: meta.id }],\n icon: 'ph--squares-four--regular',\n disposition: 'pin-end',\n testId: 'treeView.pluginRegistry',\n },\n nodes: [\n {\n id: `${REGISTRY_KEY}>all`,\n type: 'category' as const,\n data: `${REGISTRY_KEY}>all`,\n properties: {\n label: ['all plugins label', { ns: meta.id }],\n icon: 'ph--squares-four--regular',\n key: REGISTRY_KEY,\n testId: 'pluginRegistry.all',\n },\n },\n {\n id: `${REGISTRY_KEY}>installed`,\n type: 'category' as const,\n data: `${REGISTRY_KEY}>installed`,\n properties: {\n label: ['installed plugins label', { ns: meta.id }],\n icon: 'ph--check--regular',\n key: REGISTRY_KEY,\n testId: 'pluginRegistry.installed',\n },\n },\n {\n id: `${REGISTRY_KEY}>recommended`,\n type: 'category' as const,\n data: `${REGISTRY_KEY}>recommended`,\n properties: {\n label: ['recommended plugins label', { ns: meta.id }],\n icon: 'ph--star--regular',\n key: REGISTRY_KEY,\n testId: 'pluginRegistry.recommended',\n },\n },\n {\n id: `${REGISTRY_KEY}>labs`,\n type: 'category' as const,\n data: `${REGISTRY_KEY}>labs`,\n properties: {\n label: ['labs plugins label', { ns: meta.id }],\n icon: 'ph--flask--regular',\n key: REGISTRY_KEY,\n testId: 'pluginRegistry.labs',\n },\n },\n ],\n },\n ]),\n }),\n GraphBuilder.createExtension({\n id: `${meta.id}.actions`,\n match: NodeMatcher.whenId(`root/${REGISTRY_ID}`),\n actions: () =>\n Effect.succeed([\n {\n id: `${meta.id}.load-by-url`,\n data: Effect.fnUntraced(function* () {}),\n properties: {\n label: ['load by url label', { ns: meta.id }],\n icon: 'ph--cloud-arrow-down--regular',\n disabled: true,\n },\n },\n ]),\n }),\n GraphBuilder.createExtension({\n id: `${meta.id}.plugins`,\n match: NodeMatcher.whenId(`root/${REGISTRY_ID}`),\n connector: () => {\n const manager = capabilities.get(Capabilities.PluginManager);\n return Effect.succeed(\n manager.getPlugins().map((plugin) => ({\n id: plugin.meta.id,\n type: 'org.dxos.plugin',\n data: plugin,\n properties: {\n label: plugin.meta.name ?? plugin.meta.id,\n icon: plugin.meta.icon ?? 'ph--circle--regular',\n disposition: 'hidden',\n },\n })),\n );\n },\n }),\n ]);\n\n return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);\n }),\n);\n"],
5
+ "mappings": "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",
6
+ "names": ["Effect", "Capabilities", "Capability", "AppCapabilities", "SettingsOperation", "Operation", "GraphBuilder", "NodeMatcher", "Capability", "makeModule", "fnUntraced", "capabilities", "Service", "extensions", "all", "GraphBuilder", "createExtension", "id", "meta", "match", "NodeMatcher", "whenRoot", "actions", "succeed", "data", "Operation", "invoke", "SettingsOperation", "OpenPluginRegistry", "properties", "label", "ns", "icon", "disposition", "connector", "REGISTRY_ID", "type", "testId", "nodes", "REGISTRY_KEY", "key", "whenId", "disabled", "manager", "get", "Capabilities", "PluginManager", "getPlugins", "map", "plugin", "name", "contributes", "AppCapabilities", "AppGraphBuilder"]
7
+ }
@@ -0,0 +1,191 @@
1
+ import {
2
+ meta
3
+ } from "./chunk-KMUDYITM.mjs";
4
+
5
+ // src/components/PluginDetail/PluginDetail.tsx
6
+ import React from "react";
7
+ import { Icon, Input, Link, useTranslation } from "@dxos/react-ui";
8
+ import { ScrollArea } from "@dxos/react-ui";
9
+ import { getStyles, mx } from "@dxos/ui-theme";
10
+ var PluginDetail = ({ plugin, enabled, onEnabledChange }) => {
11
+ const { t } = useTranslation(meta.id);
12
+ const { id, name, description, homePage, source, screenshots, icon = "ph--circle--regular", iconHue = "neutral" } = plugin.meta;
13
+ const styles = getStyles(iconHue);
14
+ return /* @__PURE__ */ React.createElement(ScrollArea.Root, {
15
+ orientation: "vertical"
16
+ }, /* @__PURE__ */ React.createElement(ScrollArea.Viewport, null, /* @__PURE__ */ React.createElement("div", {
17
+ role: "none",
18
+ className: "dx-document grid grid-cols-[min-content_1fr] gap-4 p-4"
19
+ }, /* @__PURE__ */ React.createElement("div", {
20
+ role: "none"
21
+ }, /* @__PURE__ */ React.createElement(Icon, {
22
+ classNames: mx("p-1 rounded-md", styles.fill, styles.surfaceText),
23
+ icon,
24
+ size: 14
25
+ })), /* @__PURE__ */ React.createElement("div", {
26
+ role: "none",
27
+ className: "flex flex-col gap-6"
28
+ }, /* @__PURE__ */ React.createElement("div", {
29
+ role: "none",
30
+ className: "grid grid-cols-[1fr_min-content] gap-x-3 w-full pt-1"
31
+ }, /* @__PURE__ */ React.createElement("h2", {
32
+ className: "text-xl"
33
+ }, name), /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Switch, {
34
+ classNames: "self-center",
35
+ checked: enabled,
36
+ onCheckedChange: onEnabledChange
37
+ })), /* @__PURE__ */ React.createElement("p", {
38
+ className: "pt-0.5 text-sm text-description"
39
+ }, id)), /* @__PURE__ */ React.createElement("div", {
40
+ role: "none"
41
+ }, /* @__PURE__ */ React.createElement("p", {
42
+ className: "text-description"
43
+ }, description)), screenshots && screenshots.length > 0 && /* @__PURE__ */ React.createElement("div", {
44
+ role: "none",
45
+ className: "flex flex-col gap-2"
46
+ }, /* @__PURE__ */ React.createElement("h2", null, "Preview"), /* @__PURE__ */ React.createElement("img", {
47
+ src: screenshots[0],
48
+ alt: name,
49
+ className: "aspect-video object-fit"
50
+ })), /* @__PURE__ */ React.createElement("div", {
51
+ role: "none",
52
+ className: "flex flex-col gap-2"
53
+ }, /* @__PURE__ */ React.createElement("h2", null, "Resources"), /* @__PURE__ */ React.createElement("div", {
54
+ className: "flex gap-2"
55
+ }, homePage && /* @__PURE__ */ React.createElement(Link, {
56
+ href: homePage,
57
+ target: "_blank",
58
+ rel: "noreferrer",
59
+ classNames: "text-sm text-description"
60
+ }, t("home page label"), /* @__PURE__ */ React.createElement(Icon, {
61
+ icon: "ph--arrow-square-out--bold",
62
+ size: 3,
63
+ classNames: "inline-block leading-none mx-1"
64
+ })), source && /* @__PURE__ */ React.createElement(Link, {
65
+ href: source,
66
+ target: "_blank",
67
+ rel: "noreferrer",
68
+ classNames: "text-sm text-description"
69
+ }, t("source label"), /* @__PURE__ */ React.createElement(Icon, {
70
+ icon: "ph--arrow-square-out--bold",
71
+ size: 3,
72
+ classNames: "inline-block leading-none mx-1"
73
+ }))))))));
74
+ };
75
+
76
+ // src/components/PluginList/PluginList.tsx
77
+ import React3 from "react";
78
+ import { List } from "@dxos/react-ui";
79
+
80
+ // src/components/PluginList/PluginItem.tsx
81
+ import React2, { useCallback } from "react";
82
+ import { Icon as Icon2, IconButton, Input as Input2, Link as Link2, ListItem, Tag, useTranslation as useTranslation2 } from "@dxos/react-ui";
83
+ import { mx as mx2 } from "@dxos/ui-theme";
84
+ import { getStyles as getStyles2 } from "@dxos/ui-theme";
85
+ var PluginItem = ({ plugin, enabled = [], onClick, onChange, hasSettings: hasSettingsProp, onSettings }) => {
86
+ const { t } = useTranslation2(meta.id);
87
+ const { id, name, description, tags, icon = "ph--circle--regular", iconHue = "neutral" } = plugin.meta;
88
+ const isEnabled = enabled.includes(id);
89
+ const inputId = `${id}-input`;
90
+ const labelId = `${id}-label`;
91
+ const descriptionId = `${id}-description`;
92
+ const handleClick = useCallback(() => onClick?.(id), [
93
+ id,
94
+ onClick
95
+ ]);
96
+ const handleChange = useCallback((event) => {
97
+ event.stopPropagation();
98
+ onChange?.(id, !isEnabled);
99
+ }, [
100
+ id,
101
+ isEnabled,
102
+ onChange
103
+ ]);
104
+ const hasSettings = hasSettingsProp?.(id) ?? false;
105
+ const handleSettings = useCallback(() => onSettings?.(id), [
106
+ id,
107
+ onSettings
108
+ ]);
109
+ const styles = getStyles2(iconHue);
110
+ const gridCols = "grid grid-cols-[5rem_1fr]";
111
+ const gridRows = "grid grid-rows-[40px_1fr_min-content_40px]";
112
+ return /* @__PURE__ */ React2.createElement(ListItem.Root, {
113
+ key: id,
114
+ labelId,
115
+ "data-testid": `pluginList.${id}`,
116
+ "aria-describedby": descriptionId,
117
+ classNames: mx2(gridCols, "h-[12rem] w-full gap-3 pe-2 bg-modal-surface rounded-md overflow-hidden")
118
+ }, /* @__PURE__ */ React2.createElement("div", {
119
+ className: mx2(gridRows, "justify-center rounded-l-md", styles.surface)
120
+ }, /* @__PURE__ */ React2.createElement(Icon2, {
121
+ classNames: mx2("row-start-2 cursor-pointer", styles.surfaceText),
122
+ icon,
123
+ size: 14,
124
+ onClick: handleClick
125
+ })), /* @__PURE__ */ React2.createElement("div", {
126
+ className: mx2(gridRows)
127
+ }, /* @__PURE__ */ React2.createElement("div", {
128
+ className: "flex items-center overflow-hidden cursor-pointer",
129
+ onClick: handleClick
130
+ }, /* @__PURE__ */ React2.createElement("span", {
131
+ className: "text-lg truncate"
132
+ }, name ?? id)), /* @__PURE__ */ React2.createElement("div", null, /* @__PURE__ */ React2.createElement("p", {
133
+ className: mx2("text-description", "line-clamp-4 min-w-0")
134
+ }, description)), /* @__PURE__ */ React2.createElement("div", {
135
+ className: "flex -ms-0.5 overflow-x-auto scrollbar-none"
136
+ }, tags?.map((tag) => /* @__PURE__ */ React2.createElement(Tag, {
137
+ key: tag,
138
+ palette: tagColors[tag],
139
+ classNames: "text-xs uppercase font-thin"
140
+ }, tag))), /* @__PURE__ */ React2.createElement("div", {
141
+ className: "flex gap-2 items-center text-sm"
142
+ }, /* @__PURE__ */ React2.createElement(IconButton, {
143
+ "aria-describedby": descriptionId,
144
+ classNames: "cursor-pointer",
145
+ icon: "ph--gear--regular",
146
+ label: t("settings label"),
147
+ iconOnly: true,
148
+ size: 4,
149
+ onClick: handleSettings,
150
+ disabled: !hasSettings
151
+ }), /* @__PURE__ */ React2.createElement(Link2, {
152
+ "aria-describedby": descriptionId,
153
+ classNames: "text-description cursor-pointer",
154
+ onClick: handleClick
155
+ }, t("details label")), /* @__PURE__ */ React2.createElement("div", {
156
+ className: "grow"
157
+ }), /* @__PURE__ */ React2.createElement("div", {
158
+ className: "pe-1"
159
+ }, /* @__PURE__ */ React2.createElement(Input2.Root, {
160
+ id: inputId
161
+ }, /* @__PURE__ */ React2.createElement(Input2.Switch, {
162
+ classNames: "self-center",
163
+ checked: isEnabled,
164
+ onClick: handleChange
165
+ }))))));
166
+ };
167
+ var tagColors = {
168
+ new: "rose",
169
+ beta: "teal",
170
+ labs: "blue",
171
+ popular: "green",
172
+ featured: "pink",
173
+ experimental: "amber"
174
+ };
175
+
176
+ // src/components/PluginList/PluginList.tsx
177
+ var PluginList = ({ plugins = [], ...props }) => {
178
+ return /* @__PURE__ */ React3.createElement(List, {
179
+ classNames: "grid grid-cols-[repeat(auto-fill,minmax(18rem,1fr))] auto-rows-[max-content] gap-4 p-4"
180
+ }, plugins.map((plugin) => /* @__PURE__ */ React3.createElement(PluginItem, {
181
+ key: plugin.meta.id,
182
+ plugin,
183
+ ...props
184
+ })));
185
+ };
186
+
187
+ export {
188
+ PluginDetail,
189
+ PluginList
190
+ };
191
+ //# sourceMappingURL=chunk-2YWVCU2W.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/PluginDetail/PluginDetail.tsx", "../../../src/components/PluginList/PluginList.tsx", "../../../src/components/PluginList/PluginItem.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { Icon, Input, Link, useTranslation } from '@dxos/react-ui';\nimport { ScrollArea } from '@dxos/react-ui';\nimport { getStyles, mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\n\nexport type PluginDetailProps = {\n plugin: Plugin.Plugin;\n enabled?: boolean;\n onEnabledChange?: (enabled: boolean) => void;\n};\n\nexport const PluginDetail = ({ plugin, enabled, onEnabledChange }: PluginDetailProps) => {\n const { t } = useTranslation(meta.id);\n const {\n id,\n name,\n description,\n homePage,\n source,\n screenshots,\n icon = 'ph--circle--regular',\n iconHue = 'neutral',\n } = plugin.meta;\n const styles = getStyles(iconHue);\n\n return (\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport>\n <div role='none' className='dx-document grid grid-cols-[min-content_1fr] gap-4 p-4'>\n <div role='none'>\n <Icon classNames={mx('p-1 rounded-md', styles.fill, styles.surfaceText)} icon={icon} size={14} />\n </div>\n <div role='none' className='flex flex-col gap-6'>\n <div role='none' className='grid grid-cols-[1fr_min-content] gap-x-3 w-full pt-1'>\n <h2 className='text-xl'>{name}</h2>\n <Input.Root>\n <Input.Switch classNames='self-center' checked={enabled} onCheckedChange={onEnabledChange} />\n </Input.Root>\n <p className='pt-0.5 text-sm text-description'>{id}</p>\n </div>\n <div role='none'>\n <p className='text-description'>{description}</p>\n </div>\n {screenshots && screenshots.length > 0 && (\n <div role='none' className='flex flex-col gap-2'>\n <h2>Preview</h2>\n <img src={screenshots[0]} alt={name} className='aspect-video object-fit' />\n </div>\n )}\n <div role='none' className='flex flex-col gap-2'>\n <h2>Resources</h2>\n <div className='flex gap-2'>\n {homePage && (\n <Link href={homePage} target='_blank' rel='noreferrer' classNames='text-sm text-description'>\n {t('home page label')}\n <Icon icon='ph--arrow-square-out--bold' size={3} classNames='inline-block leading-none mx-1' />\n </Link>\n )}\n\n {source && (\n <Link href={source} target='_blank' rel='noreferrer' classNames='text-sm text-description'>\n {t('source label')}\n <Icon icon='ph--arrow-square-out--bold' size={3} classNames='inline-block leading-none mx-1' />\n </Link>\n )}\n </div>\n </div>\n </div>\n </div>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { List } from '@dxos/react-ui';\n\nimport { PluginItem, type PluginItemProps } from './PluginItem';\n\nexport type PluginListProps = Omit<PluginItemProps, 'plugin'> & {\n plugins?: readonly Plugin.Plugin[];\n};\n\nexport const PluginList = ({ plugins = [], ...props }: PluginListProps) => {\n return (\n <List classNames='grid grid-cols-[repeat(auto-fill,minmax(18rem,1fr))] auto-rows-[max-content] gap-4 p-4'>\n {plugins.map((plugin) => (\n <PluginItem key={plugin.meta.id} plugin={plugin} {...props} />\n ))}\n </List>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type MouseEvent, useCallback } from 'react';\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { type ChromaticPalette, Icon, IconButton, Input, Link, ListItem, Tag, useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\nimport { getStyles } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\nimport { type RegistryTagType } from '../../types';\n\nexport type PluginItemProps = {\n plugin: Plugin.Plugin;\n installed?: readonly string[];\n enabled?: readonly string[];\n onClick?: (id: string) => void;\n onChange?: (id: string, enabled: boolean) => void;\n hasSettings?: (id: string) => boolean;\n onSettings?: (id: string) => void;\n};\n\nexport const PluginItem = ({\n plugin,\n enabled = [],\n onClick,\n onChange,\n hasSettings: hasSettingsProp,\n onSettings,\n}: PluginItemProps) => {\n const { t } = useTranslation(meta.id);\n const { id, name, description, tags, icon = 'ph--circle--regular', iconHue = 'neutral' } = plugin.meta;\n const isEnabled = enabled.includes(id);\n const inputId = `${id}-input`;\n const labelId = `${id}-label`;\n const descriptionId = `${id}-description`;\n const handleClick = useCallback(() => onClick?.(id), [id, onClick]);\n\n const handleChange = useCallback(\n (event: MouseEvent) => {\n event.stopPropagation();\n onChange?.(id, !isEnabled);\n },\n [id, isEnabled, onChange],\n );\n\n const hasSettings = hasSettingsProp?.(id) ?? false;\n const handleSettings = useCallback(() => onSettings?.(id), [id, onSettings]);\n const styles = getStyles(iconHue);\n const gridCols = 'grid grid-cols-[5rem_1fr]';\n const gridRows = 'grid grid-rows-[40px_1fr_min-content_40px]';\n\n return (\n <ListItem.Root\n key={id}\n labelId={labelId}\n data-testid={`pluginList.${id}`}\n aria-describedby={descriptionId}\n classNames={mx(gridCols, 'h-[12rem] w-full gap-3 pe-2 bg-modal-surface rounded-md overflow-hidden')}\n >\n <div className={mx(gridRows, 'justify-center rounded-l-md', styles.surface)}>\n <Icon\n classNames={mx('row-start-2 cursor-pointer', styles.surfaceText)}\n icon={icon}\n size={14}\n onClick={handleClick}\n />\n </div>\n\n <div className={mx(gridRows)}>\n <div className='flex items-center overflow-hidden cursor-pointer' onClick={handleClick}>\n <span className='text-lg truncate'>{name ?? id}</span>\n </div>\n\n <div>\n <p className={mx('text-description', 'line-clamp-4 min-w-0')}>{description}</p>\n </div>\n\n <div className='flex -ms-0.5 overflow-x-auto scrollbar-none'>\n {tags?.map((tag) => (\n <Tag key={tag} palette={tagColors[tag as RegistryTagType]} classNames='text-xs uppercase font-thin'>\n {tag}\n </Tag>\n ))}\n </div>\n\n <div className='flex gap-2 items-center text-sm'>\n <IconButton\n aria-describedby={descriptionId}\n classNames='cursor-pointer'\n icon='ph--gear--regular'\n label={t('settings label')}\n iconOnly\n size={4}\n onClick={handleSettings}\n disabled={!hasSettings}\n />\n\n <Link aria-describedby={descriptionId} classNames='text-description cursor-pointer' onClick={handleClick}>\n {t('details label')}\n </Link>\n\n <div className='grow' />\n <div className='pe-1'>\n <Input.Root id={inputId}>\n <Input.Switch classNames='self-center' checked={isEnabled} onClick={handleChange} />\n </Input.Root>\n </div>\n </div>\n </div>\n </ListItem.Root>\n );\n};\n\nconst tagColors: Record<RegistryTagType, ChromaticPalette> = {\n new: 'rose',\n beta: 'teal',\n labs: 'blue',\n popular: 'green',\n featured: 'pink',\n experimental: 'amber',\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "Icon", "Input", "Link", "useTranslation", "ScrollArea", "getStyles", "mx", "PluginDetail", "plugin", "enabled", "onEnabledChange", "t", "useTranslation", "meta", "id", "name", "description", "homePage", "source", "screenshots", "icon", "iconHue", "styles", "getStyles", "ScrollArea", "Root", "orientation", "Viewport", "div", "role", "className", "Icon", "classNames", "mx", "fill", "surfaceText", "size", "h2", "Input", "Switch", "checked", "onCheckedChange", "p", "length", "img", "src", "alt", "Link", "href", "target", "rel", "React", "List", "React", "useCallback", "Icon", "IconButton", "Input", "Link", "ListItem", "Tag", "useTranslation", "mx", "getStyles", "PluginItem", "plugin", "enabled", "onClick", "onChange", "hasSettings", "hasSettingsProp", "onSettings", "t", "useTranslation", "meta", "id", "name", "description", "tags", "icon", "iconHue", "isEnabled", "includes", "inputId", "labelId", "descriptionId", "handleClick", "useCallback", "handleChange", "event", "stopPropagation", "handleSettings", "styles", "getStyles", "gridCols", "gridRows", "React", "ListItem", "Root", "key", "data-testid", "aria-describedby", "classNames", "mx", "div", "className", "surface", "Icon", "surfaceText", "size", "span", "p", "map", "tag", "Tag", "palette", "tagColors", "IconButton", "label", "iconOnly", "disabled", "Link", "Input", "Switch", "checked", "new", "beta", "labs", "popular", "featured", "experimental", "PluginList", "plugins", "props", "React", "List", "classNames", "map", "plugin", "PluginItem", "key", "meta", "id"]
7
+ }
@@ -2,8 +2,9 @@
2
2
  import { trim } from "@dxos/util";
3
3
  var REGISTRY_ID = "!dxos:plugin-registry";
4
4
  var REGISTRY_KEY = "plugin-registry";
5
+ var getPluginPath = (pluginId) => `root/${REGISTRY_ID}/${pluginId}`;
5
6
  var meta = {
6
- id: "dxos.org/plugin/registry",
7
+ id: "org.dxos.plugin.registry",
7
8
  name: "Plugins",
8
9
  description: trim`
9
10
  Plugin management system for discovering, installing, and configuring workspace extensions.
@@ -14,6 +15,7 @@ var meta = {
14
15
  export {
15
16
  REGISTRY_ID,
16
17
  REGISTRY_KEY,
18
+ getPluginPath,
17
19
  meta
18
20
  };
19
- //# sourceMappingURL=chunk-VOAOTNGS.mjs.map
21
+ //# sourceMappingURL=chunk-KMUDYITM.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const REGISTRY_ID = '!dxos:plugin-registry';\nexport const REGISTRY_KEY = 'plugin-registry';\n\n/** Qualified graph path to a specific plugin node. */\nexport const getPluginPath = (pluginId: string): string => `root/${REGISTRY_ID}/${pluginId}`;\n\nexport const meta: Plugin.Meta = {\n id: 'org.dxos.plugin.registry',\n name: 'Plugins',\n description: trim`\n Plugin management system for discovering, installing, and configuring workspace extensions.\n Browse available plugins and customize your workspace capabilities.\n `,\n};\n"],
5
+ "mappings": ";AAKA,SAASA,YAAY;AAEd,IAAMC,cAAc;AACpB,IAAMC,eAAe;AAGrB,IAAMC,gBAAgB,CAACC,aAA6B,QAAQH,WAAAA,IAAeG,QAAAA;AAE3E,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,aAAaC;;;;AAIf;",
6
+ "names": ["trim", "REGISTRY_ID", "REGISTRY_KEY", "getPluginPath", "pluginId", "meta", "id", "name", "description", "trim"]
7
+ }
@@ -1,9 +1,10 @@
1
1
  import {
2
2
  meta
3
- } from "../chunk-VOAOTNGS.mjs";
3
+ } from "../chunk-KMUDYITM.mjs";
4
4
 
5
5
  // src/cli/plugin.ts
6
- import { Common, Plugin as Plugin4 } from "@dxos/app-framework";
6
+ import { Plugin as Plugin4 } from "@dxos/app-framework";
7
+ import { AppPlugin } from "@dxos/app-toolkit";
7
8
 
8
9
  // src/cli/commands/index.ts
9
10
  import * as Command4 from "@effect/cli/Command";
@@ -22,29 +23,27 @@ import * as FileSystem from "@effect/platform/FileSystem";
22
23
  import * as Path from "@effect/platform/Path";
23
24
  import * as Effect from "effect/Effect";
24
25
  import * as Schema from "effect/Schema";
25
- import { DX_CONFIG, getProfilePath } from "@dxos/client-protocol";
26
- var PLUGINS_FILE = "plugins.json";
26
+ import * as Yaml from "yaml";
27
+ import { DX_CONFIG } from "@dxos/client-protocol";
27
28
  var PluginsSchema = Schema.Array(Schema.String);
28
- var getPluginsPath = (profile) => Effect.gen(function* () {
29
- const path = yield* Path.Path;
30
- return path.join(getProfilePath(DX_CONFIG, profile), PLUGINS_FILE);
31
- });
29
+ var getPluginsConfigPath = (profile) => `${DX_CONFIG}/plugins/${profile}.yml`;
32
30
  var loadEnabledPlugins = Effect.fn(function* ({ profile }) {
33
31
  const fs = yield* FileSystem.FileSystem;
34
- const pluginsPath = yield* getPluginsPath(profile);
32
+ const pluginsPath = getPluginsConfigPath(profile);
35
33
  const content = yield* fs.readFileString(pluginsPath).pipe(Effect.catchTag("SystemError", () => Effect.succeed("[]")));
36
- const parsed = yield* Schema.decodeUnknown(Schema.parseJson(PluginsSchema))(content).pipe(Effect.catchAll(() => Effect.succeed([])));
34
+ const raw = Yaml.parse(content);
35
+ const parsed = yield* Schema.decodeUnknown(PluginsSchema)(raw ?? []).pipe(Effect.catchAll(() => Effect.succeed([])));
37
36
  return parsed;
38
37
  });
39
38
  var saveEnabledPlugins = Effect.fn(function* ({ profile, enabled }) {
40
39
  const fs = yield* FileSystem.FileSystem;
41
- const pluginsPath = yield* getPluginsPath(profile);
42
- const profileDir = getProfilePath(DX_CONFIG, profile);
43
- yield* fs.makeDirectory(profileDir, {
40
+ const path = yield* Path.Path;
41
+ const pluginsPath = getPluginsConfigPath(profile);
42
+ yield* fs.makeDirectory(path.dirname(pluginsPath), {
44
43
  recursive: true
45
44
  });
46
- const encoded = Schema.encodeSync(Schema.parseJson(PluginsSchema))(enabled);
47
- yield* fs.writeFileString(pluginsPath, encoded + "\n");
45
+ const encoded = Yaml.stringify(enabled);
46
+ yield* fs.writeFileString(pluginsPath, encoded);
48
47
  });
49
48
 
50
49
  // src/cli/commands/disable.ts
@@ -210,7 +209,7 @@ var plugin = Command4.make("plugin").pipe(Command4.withDescription("Manage plugi
210
209
  ]));
211
210
 
212
211
  // src/cli/plugin.ts
213
- var RegistryPlugin = Plugin4.define(meta).pipe(Common.Plugin.addCommandModule({
212
+ var RegistryPlugin = Plugin4.define(meta).pipe(AppPlugin.addCommandModule({
214
213
  commands: [
215
214
  plugin
216
215
  ]