@dxos/plugin-explorer 0.13.0 → 0.16.0-next-60712ab191a99ba90316cc4be753e9e11b17100a

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 (47) hide show
  1. package/PLUGIN.mdl +18 -0
  2. package/dist/lib/ExplorerAction.mjs +1 -16
  3. package/dist/lib/ExplorerEvents.mjs +1 -15
  4. package/dist/lib/ExplorerPlugin.mjs +1 -16
  5. package/dist/lib/ForceGraph.mjs +1 -2
  6. package/dist/lib/Graph.mjs +1 -37
  7. package/dist/lib/capabilities.browser.mjs +1 -2
  8. package/dist/lib/capabilities.browser.mjs.map +1 -1
  9. package/dist/lib/capabilities.mjs +1 -2
  10. package/dist/lib/capabilities.mjs.map +1 -1
  11. package/dist/lib/capabilities.tauri.mjs +1 -2
  12. package/dist/lib/capabilities.tauri.mjs.map +1 -1
  13. package/dist/lib/chunk-ExplorerAction.mjs +16 -0
  14. package/dist/lib/chunk-ExplorerAction.mjs.map +1 -0
  15. package/dist/lib/chunk-ExplorerEvents.mjs +15 -0
  16. package/dist/lib/chunk-ExplorerEvents.mjs.map +1 -0
  17. package/dist/lib/chunk-ExplorerPlugin.mjs +16 -0
  18. package/dist/lib/chunk-ExplorerPlugin.mjs.map +1 -0
  19. package/dist/lib/chunk-ForceGraph.mjs +11 -0
  20. package/dist/lib/chunk-ForceGraph.mjs.map +1 -0
  21. package/dist/lib/chunk-Graph2.mjs +37 -0
  22. package/dist/lib/chunk-Graph2.mjs.map +1 -0
  23. package/dist/lib/chunk-Hooks.mjs +9 -0
  24. package/dist/lib/chunk-Hooks.mjs.map +1 -0
  25. package/dist/lib/chunk-PLUGIN.mjs +2 -2
  26. package/dist/lib/components.mjs.map +1 -1
  27. package/dist/lib/index.mjs +3 -3
  28. package/dist/lib/meta.mjs.map +1 -1
  29. package/dist/lib/ns/ForceGraph.mjs +2 -11
  30. package/dist/lib/ns/Hooks.mjs +1 -9
  31. package/dist/lib/testing.mjs.map +1 -1
  32. package/dist/lib/translations.mjs.map +1 -1
  33. package/dist/lib/types.mjs +3 -3
  34. package/dist/types/src/capabilities/gen/browser.d.ts.map +1 -1
  35. package/dist/types/src/capabilities/gen/tauri.d.ts.map +1 -1
  36. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  37. package/dist/types/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +30 -30
  39. package/src/capabilities/gen/browser.ts +1 -3
  40. package/src/capabilities/gen/tauri.ts +1 -3
  41. package/src/capabilities/index.ts +1 -4
  42. package/dist/lib/ExplorerAction.mjs.map +0 -1
  43. package/dist/lib/ExplorerEvents.mjs.map +0 -1
  44. package/dist/lib/ExplorerPlugin.mjs.map +0 -1
  45. package/dist/lib/Graph.mjs.map +0 -1
  46. package/dist/lib/ns/ForceGraph.mjs.map +0 -1
  47. package/dist/lib/ns/Hooks.mjs.map +0 -1
package/PLUGIN.mdl CHANGED
@@ -321,6 +321,24 @@ test QA-1: Create a Graph and switch layout variants
321
321
  `space.db.query(dxos.Filter.everything())` for the object named "QA Graph" and call
322
322
  `org.dxos.operation.space.removeObjects` with that reference, rather than the test
323
323
  guessing an id it was never given.
324
+
325
+ test QA-2: Showcase clip
326
+ desc: |
327
+ The 10s showcase clip: Pan a graph of the space. Recorded light at 60 fps with no ident, captions or
328
+ count-in by `tools/autocue/showcase/overnight.mjs`; the clip is the `clip: explorer` step.
329
+ actors: human
330
+ status: unverified # driven by autocue/showcase.mjs
331
+ given:
332
+ - an identity exists
333
+ - space: a space is open
334
+ - plugin-explorer enabled
335
+ steps:
336
+ - name: Create the object
337
+ do: Create a explorer object from the + menu.
338
+ expect: it renders in the plank
339
+ - name: Orbit it
340
+ do: Drag slowly across it.
341
+ expect: the view turns or pans smoothly
324
342
  ```
325
343
 
326
344
  ---
@@ -1,16 +1 @@
1
- import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
2
- import * as Schema from "effect/Schema";
3
- import * as SpaceForm from "@dxos/plugin-space/SpaceForm";
4
- //#region src/types/ExplorerAction.ts
5
- var ExplorerAction_exports = /* @__PURE__ */ __exportAll({ GraphProps: () => GraphProps });
6
- var GraphProps = Schema.Struct({
7
- name: Schema.optional(Schema.String),
8
- typename: Schema.String.pipe(Schema.annotate({ title: "Select type" }), SpaceForm.TypeInputOptionsAnnotation.set({
9
- location: ["database", "runtime"],
10
- kind: ["user"]
11
- }), Schema.optional)
12
- });
13
- //#endregion
14
- export { GraphProps, ExplorerAction_exports as t };
15
-
16
- //# sourceMappingURL=ExplorerAction.mjs.map
1
+ export { n as GraphProps } from "./chunk-ExplorerAction.mjs";
@@ -1,15 +1 @@
1
- import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
2
- import { meta } from "#meta";
3
- import * as ActivationEvent from "@dxos/app-framework/ActivationEvent";
4
- //#region src/types/ExplorerEvents.ts
5
- var ExplorerEvents_exports = /* @__PURE__ */ __exportAll({ Start: () => Start });
6
- /**
7
- * The feature's start event: the plugin's start-gated modules (and cross-plugin
8
- * contributions consumed by this feature) activate here. Fired on demand and by the
9
- * host's idle trickle.
10
- */
11
- var Start = ActivationEvent.pluginStart(meta.profile.key);
12
- //#endregion
13
- export { Start, ExplorerEvents_exports as t };
14
-
15
- //# sourceMappingURL=ExplorerEvents.mjs.map
1
+ export { n as Start } from "./chunk-ExplorerEvents.mjs";
@@ -1,16 +1 @@
1
- import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
2
- import { meta as meta$1 } from "#meta";
3
- import * as Plugin from "@dxos/app-framework/Plugin";
4
- //#region src/ExplorerPlugin.ts
5
- var ExplorerPlugin_exports = /* @__PURE__ */ __exportAll({
6
- make: () => make,
7
- meta: () => meta
8
- });
9
- /** Plugin metadata, available without loading the plugin body. */
10
- var meta = meta$1;
11
- /** Constructs the plugin; the body loads on first enable. */
12
- var make = Plugin.lazy(meta, () => import("#plugin"));
13
- //#endregion
14
- export { make, meta, ExplorerPlugin_exports as t };
15
-
16
- //# sourceMappingURL=ExplorerPlugin.mjs.map
1
+ export { n as make, r as meta } from "./chunk-ExplorerPlugin.mjs";
@@ -1,2 +1 @@
1
- import { n as CanvasForceGraph, t as ForceGraph } from "./chunk-Graph.mjs";
2
- export { CanvasForceGraph, ForceGraph };
1
+ export { n as CanvasForceGraph, t as ForceGraph } from "./chunk-Graph.mjs";
@@ -1,37 +1 @@
1
- import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
2
- import { Annotation, DXN, Filter, Obj, Query, QueryAST, Ref, Type, View } from "@dxos/echo";
3
- import * as Schema from "effect/Schema";
4
- import { ViewAnnotation } from "@dxos/schema";
5
- //#region src/types/Graph.ts
6
- var Graph_exports = /* @__PURE__ */ __exportAll({
7
- Graph: () => Graph,
8
- make: () => make
9
- });
10
- var Graph = class extends Type.makeObject(DXN.make("org.dxos.type.graph", "0.1.0"))(Schema.Struct({
11
- name: Schema.optional(Schema.String),
12
- view: Ref.Ref(View.View).pipe(Annotation.FormInputAnnotation.set(false), Schema.optional),
13
- query: Schema.Struct({
14
- raw: Schema.optional(Schema.String),
15
- ast: QueryAST.Query
16
- }).pipe(Annotation.FormInputAnnotation.set(false))
17
- }).pipe(Annotation.LabelAnnotation.set(["name"]), ViewAnnotation.set(["view"]), Annotation.IconAnnotation.set({
18
- icon: "ph--graph--regular",
19
- hue: "green"
20
- }), Annotation.UserType.set())) {};
21
- /**
22
- * Make a graph as a view of a data set.
23
- */
24
- var make = ({ name, query = {
25
- raw: "",
26
- ast: Query.select(Filter.nothing()).ast
27
- }, view } = {}) => {
28
- return Obj.make(Graph, {
29
- name,
30
- view: view && Ref.make(view),
31
- query
32
- });
33
- };
34
- //#endregion
35
- export { Graph, make, Graph_exports as t };
36
-
37
- //# sourceMappingURL=Graph.mjs.map
1
+ export { t as Graph, r as make } from "./chunk-Graph2.mjs";
@@ -1,4 +1,3 @@
1
- import { t as PLUGIN_default } from "./chunk-PLUGIN.mjs";
2
1
  import * as AppCapability from "@dxos/app-toolkit/AppCapability";
3
2
  import * as SpaceCapability from "@dxos/plugin-space/SpaceCapability";
4
3
  import { translations } from "#translations";
@@ -9,7 +8,7 @@ var CreateObject = SpaceCapability.createObject(() => import("./chunk-create-obj
9
8
  var PluginAsset = AppCapability.pluginAsset({
10
9
  pluginId: meta.profile.key,
11
10
  path: "PLUGIN.mdl",
12
- content: PLUGIN_default,
11
+ content: () => import("./chunk-PLUGIN.mjs"),
13
12
  mimeType: "application/x-mdl"
14
13
  });
15
14
  var ReactSurface = AppCapability.surface(() => import("./chunk-react-surface.mjs"), { roles: ["org.dxos.role.article", "org.dxos.role.section"] });
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.browser.mjs","names":[],"sources":["../../src/capabilities/gen/browser.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// GENERATED by dx-plugin — do not edit. Sliced from ../index.ts for the 'browser' condition.\n\nimport * as AppCapability from '@dxos/app-toolkit/AppCapability';\nimport * as SpaceCapability from '@dxos/plugin-space/SpaceCapability';\n\nimport { meta } from '#meta';\nimport { translations } from '#translations';\n\nimport pluginSpec from '../../../PLUGIN.mdl?raw';\n\nexport const AppGraphBuilder = AppCapability.appGraphBuilder(() => import('../app-graph-builder.ts'));\n\nexport const CreateObject = SpaceCapability.createObject(() => import('../create-object.ts'));\n\nexport const PluginAsset = AppCapability.pluginAsset({\n pluginId: meta.profile.key,\n path: 'PLUGIN.mdl',\n content: pluginSpec,\n mimeType: 'application/x-mdl',\n});\n\nexport const ReactSurface = AppCapability.surface(() => import('../react-surface.ts'), {\n roles: ['org.dxos.role.article', 'org.dxos.role.section'],\n});\n\nexport const Schema = AppCapability.schema(() => import('../schema.ts'));\n\nexport const Translations = AppCapability.translations(translations);\n"],"mappings":";;;;;;AAcA,IAAa,kBAAkB,cAAc,sBAAsB,OAAO,gCAA0B;AAEpG,IAAa,eAAe,gBAAgB,mBAAmB,OAAO,4BAAsB;AAE5F,IAAa,cAAc,cAAc,YAAY;CACnD,UAAU,KAAK,QAAQ;CACvB,MAAM;CACN,SAAS;CACT,UAAU;AACZ,CAAC;AAED,IAAa,eAAe,cAAc,cAAc,OAAO,8BAAwB,EACrF,OAAO,CAAC,yBAAyB,uBAAuB,EAC1D,CAAC;AAED,IAAa,SAAS,cAAc,aAAa,OAAO,qBAAe;AAEvE,IAAa,eAAe,cAAc,aAAa,YAAY"}
1
+ {"version":3,"file":"capabilities.browser.mjs","names":[],"sources":["../../src/capabilities/gen/browser.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// GENERATED by dx-plugin — do not edit. Sliced from ../index.ts for the 'browser' condition.\n\nimport * as AppCapability from '@dxos/app-toolkit/AppCapability';\nimport * as SpaceCapability from '@dxos/plugin-space/SpaceCapability';\n\nimport { meta } from '#meta';\nimport { translations } from '#translations';\n\nexport const AppGraphBuilder = AppCapability.appGraphBuilder(() => import('../app-graph-builder.ts'));\n\nexport const CreateObject = SpaceCapability.createObject(() => import('../create-object.ts'));\n\nexport const PluginAsset = AppCapability.pluginAsset({\n pluginId: meta.profile.key,\n path: 'PLUGIN.mdl',\n content: () => import('../../../PLUGIN.mdl?raw'),\n mimeType: 'application/x-mdl',\n});\n\nexport const ReactSurface = AppCapability.surface(() => import('../react-surface.ts'), {\n roles: ['org.dxos.role.article', 'org.dxos.role.section'],\n});\n\nexport const Schema = AppCapability.schema(() => import('../schema.ts'));\n\nexport const Translations = AppCapability.translations(translations);\n"],"mappings":";;;;;AAYA,IAAa,kBAAkB,cAAc,sBAAsB,OAAO,gCAA0B;AAEpG,IAAa,eAAe,gBAAgB,mBAAmB,OAAO,4BAAsB;AAE5F,IAAa,cAAc,cAAc,YAAY;CACnD,UAAU,KAAK,QAAQ;CACvB,MAAM;CACN,eAAe,OAAO;CACtB,UAAU;AACZ,CAAC;AAED,IAAa,eAAe,cAAc,cAAc,OAAO,8BAAwB,EACrF,OAAO,CAAC,yBAAyB,uBAAuB,EAC1D,CAAC;AAED,IAAa,SAAS,cAAc,aAAa,OAAO,qBAAe;AAEvE,IAAa,eAAe,cAAc,aAAa,YAAY"}
@@ -1,4 +1,3 @@
1
- import { t as PLUGIN_default } from "./chunk-PLUGIN.mjs";
2
1
  import * as AppCapability from "@dxos/app-toolkit/AppCapability";
3
2
  import * as SpaceCapability from "@dxos/plugin-space/SpaceCapability";
4
3
  import { translations } from "#translations";
@@ -9,7 +8,7 @@ var CreateObject = SpaceCapability.createObject(() => import("./chunk-create-obj
9
8
  var PluginAsset = AppCapability.pluginAsset({
10
9
  pluginId: meta.profile.key,
11
10
  path: "PLUGIN.mdl",
12
- content: PLUGIN_default,
11
+ content: () => import("./chunk-PLUGIN.mjs"),
13
12
  mimeType: "application/x-mdl"
14
13
  });
15
14
  var ReactSurface = AppCapability.surface(() => import("./chunk-react-surface.mjs"), { roles: ["org.dxos.role.article", "org.dxos.role.section"] });
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.mjs","names":[],"sources":["../../src/capabilities/index.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as AppCapability from '@dxos/app-toolkit/AppCapability';\nimport * as SpaceCapability from '@dxos/plugin-space/SpaceCapability';\n\nimport { meta } from '#meta';\nimport { translations } from '#translations';\n\n// eslint-disable-next-line import/no-relative-packages\nimport pluginSpec from '../../PLUGIN.mdl?raw';\n\nexport const AppGraphBuilder = AppCapability.appGraphBuilder(() => import('./app-graph-builder.ts'));\nexport const CreateObject = SpaceCapability.createObject(() => import('./create-object.ts'));\nexport const PluginAsset = AppCapability.pluginAsset({\n pluginId: meta.profile.key,\n path: 'PLUGIN.mdl',\n content: pluginSpec,\n mimeType: 'application/x-mdl',\n});\nexport const ReactSurface = AppCapability.surface(() => import('./react-surface.ts'), {\n roles: ['org.dxos.role.article', 'org.dxos.role.section'],\n});\nexport const Schema = AppCapability.schema(() => import('./schema.ts'));\nexport const Translations = AppCapability.translations(translations);\n"],"mappings":";;;;;;AAaA,IAAa,kBAAkB,cAAc,sBAAsB,OAAO,gCAAyB;AACnG,IAAa,eAAe,gBAAgB,mBAAmB,OAAO,4BAAqB;AAC3F,IAAa,cAAc,cAAc,YAAY;CACnD,UAAU,KAAK,QAAQ;CACvB,MAAM;CACN,SAAS;CACT,UAAU;AACZ,CAAC;AACD,IAAa,eAAe,cAAc,cAAc,OAAO,8BAAuB,EACpF,OAAO,CAAC,yBAAyB,uBAAuB,EAC1D,CAAC;AACD,IAAa,SAAS,cAAc,aAAa,OAAO,qBAAc;AACtE,IAAa,eAAe,cAAc,aAAa,YAAY"}
1
+ {"version":3,"file":"capabilities.mjs","names":[],"sources":["../../src/capabilities/index.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as AppCapability from '@dxos/app-toolkit/AppCapability';\nimport * as SpaceCapability from '@dxos/plugin-space/SpaceCapability';\n\nimport { meta } from '#meta';\nimport { translations } from '#translations';\n\nexport const AppGraphBuilder = AppCapability.appGraphBuilder(() => import('./app-graph-builder.ts'));\nexport const CreateObject = SpaceCapability.createObject(() => import('./create-object.ts'));\nexport const PluginAsset = AppCapability.pluginAsset({\n pluginId: meta.profile.key,\n path: 'PLUGIN.mdl',\n content: () => import('../../PLUGIN.mdl?raw'),\n mimeType: 'application/x-mdl',\n});\nexport const ReactSurface = AppCapability.surface(() => import('./react-surface.ts'), {\n roles: ['org.dxos.role.article', 'org.dxos.role.section'],\n});\nexport const Schema = AppCapability.schema(() => import('./schema.ts'));\nexport const Translations = AppCapability.translations(translations);\n"],"mappings":";;;;;AAUA,IAAa,kBAAkB,cAAc,sBAAsB,OAAO,gCAAyB;AACnG,IAAa,eAAe,gBAAgB,mBAAmB,OAAO,4BAAqB;AAC3F,IAAa,cAAc,cAAc,YAAY;CACnD,UAAU,KAAK,QAAQ;CACvB,MAAM;CACN,eAAe,OAAO;CACtB,UAAU;AACZ,CAAC;AACD,IAAa,eAAe,cAAc,cAAc,OAAO,8BAAuB,EACpF,OAAO,CAAC,yBAAyB,uBAAuB,EAC1D,CAAC;AACD,IAAa,SAAS,cAAc,aAAa,OAAO,qBAAc;AACtE,IAAa,eAAe,cAAc,aAAa,YAAY"}
@@ -1,4 +1,3 @@
1
- import { t as PLUGIN_default } from "./chunk-PLUGIN.mjs";
2
1
  import * as AppCapability from "@dxos/app-toolkit/AppCapability";
3
2
  import * as SpaceCapability from "@dxos/plugin-space/SpaceCapability";
4
3
  import { translations } from "#translations";
@@ -9,7 +8,7 @@ var CreateObject = SpaceCapability.createObject(() => import("./chunk-create-obj
9
8
  var PluginAsset = AppCapability.pluginAsset({
10
9
  pluginId: meta.profile.key,
11
10
  path: "PLUGIN.mdl",
12
- content: PLUGIN_default,
11
+ content: () => import("./chunk-PLUGIN.mjs"),
13
12
  mimeType: "application/x-mdl"
14
13
  });
15
14
  var ReactSurface = AppCapability.surface(() => import("./chunk-react-surface.mjs"), { roles: ["org.dxos.role.article", "org.dxos.role.section"] });
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.tauri.mjs","names":[],"sources":["../../src/capabilities/gen/tauri.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// GENERATED by dx-plugin — do not edit. Sliced from ../index.ts for the 'tauri' condition.\n\nimport * as AppCapability from '@dxos/app-toolkit/AppCapability';\nimport * as SpaceCapability from '@dxos/plugin-space/SpaceCapability';\n\nimport { meta } from '#meta';\nimport { translations } from '#translations';\n\nimport pluginSpec from '../../../PLUGIN.mdl?raw';\n\nexport const AppGraphBuilder = AppCapability.appGraphBuilder(() => import('../app-graph-builder.ts'));\n\nexport const CreateObject = SpaceCapability.createObject(() => import('../create-object.ts'));\n\nexport const PluginAsset = AppCapability.pluginAsset({\n pluginId: meta.profile.key,\n path: 'PLUGIN.mdl',\n content: pluginSpec,\n mimeType: 'application/x-mdl',\n});\n\nexport const ReactSurface = AppCapability.surface(() => import('../react-surface.ts'), {\n roles: ['org.dxos.role.article', 'org.dxos.role.section'],\n});\n\nexport const Schema = AppCapability.schema(() => import('../schema.ts'));\n\nexport const Translations = AppCapability.translations(translations);\n"],"mappings":";;;;;;AAcA,IAAa,kBAAkB,cAAc,sBAAsB,OAAO,gCAA0B;AAEpG,IAAa,eAAe,gBAAgB,mBAAmB,OAAO,4BAAsB;AAE5F,IAAa,cAAc,cAAc,YAAY;CACnD,UAAU,KAAK,QAAQ;CACvB,MAAM;CACN,SAAS;CACT,UAAU;AACZ,CAAC;AAED,IAAa,eAAe,cAAc,cAAc,OAAO,8BAAwB,EACrF,OAAO,CAAC,yBAAyB,uBAAuB,EAC1D,CAAC;AAED,IAAa,SAAS,cAAc,aAAa,OAAO,qBAAe;AAEvE,IAAa,eAAe,cAAc,aAAa,YAAY"}
1
+ {"version":3,"file":"capabilities.tauri.mjs","names":[],"sources":["../../src/capabilities/gen/tauri.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// GENERATED by dx-plugin — do not edit. Sliced from ../index.ts for the 'tauri' condition.\n\nimport * as AppCapability from '@dxos/app-toolkit/AppCapability';\nimport * as SpaceCapability from '@dxos/plugin-space/SpaceCapability';\n\nimport { meta } from '#meta';\nimport { translations } from '#translations';\n\nexport const AppGraphBuilder = AppCapability.appGraphBuilder(() => import('../app-graph-builder.ts'));\n\nexport const CreateObject = SpaceCapability.createObject(() => import('../create-object.ts'));\n\nexport const PluginAsset = AppCapability.pluginAsset({\n pluginId: meta.profile.key,\n path: 'PLUGIN.mdl',\n content: () => import('../../../PLUGIN.mdl?raw'),\n mimeType: 'application/x-mdl',\n});\n\nexport const ReactSurface = AppCapability.surface(() => import('../react-surface.ts'), {\n roles: ['org.dxos.role.article', 'org.dxos.role.section'],\n});\n\nexport const Schema = AppCapability.schema(() => import('../schema.ts'));\n\nexport const Translations = AppCapability.translations(translations);\n"],"mappings":";;;;;AAYA,IAAa,kBAAkB,cAAc,sBAAsB,OAAO,gCAA0B;AAEpG,IAAa,eAAe,gBAAgB,mBAAmB,OAAO,4BAAsB;AAE5F,IAAa,cAAc,cAAc,YAAY;CACnD,UAAU,KAAK,QAAQ;CACvB,MAAM;CACN,eAAe,OAAO;CACtB,UAAU;AACZ,CAAC;AAED,IAAa,eAAe,cAAc,cAAc,OAAO,8BAAwB,EACrF,OAAO,CAAC,yBAAyB,uBAAuB,EAC1D,CAAC;AAED,IAAa,SAAS,cAAc,aAAa,OAAO,qBAAe;AAEvE,IAAa,eAAe,cAAc,aAAa,YAAY"}
@@ -0,0 +1,16 @@
1
+ import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
2
+ import * as Schema from "effect/Schema";
3
+ import * as SpaceForm from "@dxos/plugin-space/SpaceForm";
4
+ //#region src/types/ExplorerAction.ts
5
+ var ExplorerAction_exports = /* @__PURE__ */ __exportAll({ GraphProps: () => GraphProps });
6
+ var GraphProps = Schema.Struct({
7
+ name: Schema.optional(Schema.String),
8
+ typename: Schema.String.pipe(Schema.annotate({ title: "Select type" }), SpaceForm.TypeInputOptionsAnnotation.set({
9
+ location: ["database", "runtime"],
10
+ kind: ["user"]
11
+ }), Schema.optional)
12
+ });
13
+ //#endregion
14
+ export { GraphProps as n, ExplorerAction_exports as t };
15
+
16
+ //# sourceMappingURL=chunk-ExplorerAction.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-ExplorerAction.mjs","names":[],"sources":["../../src/types/ExplorerAction.ts"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport * as SpaceForm from '@dxos/plugin-space/SpaceForm';\n\nexport const GraphProps = Schema.Struct({\n name: Schema.optional(Schema.String),\n // TODO(wittjosiah): This should be a query input instead.\n typename: Schema.String.pipe(\n Schema.annotate({ title: 'Select type' }),\n SpaceForm.TypeInputOptionsAnnotation.set({\n location: ['database', 'runtime'],\n kind: ['user'],\n }),\n Schema.optional,\n ),\n});\n"],"mappings":";;;;;AAQA,IAAa,aAAa,OAAO,OAAO;CACtC,MAAM,OAAO,SAAS,OAAO,MAAM;CAEnC,UAAU,OAAO,OAAO,KACtB,OAAO,SAAS,EAAE,OAAO,cAAc,CAAC,GACxC,UAAU,2BAA2B,IAAI;EACvC,UAAU,CAAC,YAAY,SAAS;EAChC,MAAM,CAAC,MAAM;CACf,CAAC,GACD,OAAO,QACT;AACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
2
+ import { meta } from "#meta";
3
+ import * as ActivationEvent from "@dxos/app-framework/ActivationEvent";
4
+ //#region src/types/ExplorerEvents.ts
5
+ var ExplorerEvents_exports = /* @__PURE__ */ __exportAll({ Start: () => Start });
6
+ /**
7
+ * The feature's start event: the plugin's start-gated modules (and cross-plugin
8
+ * contributions consumed by this feature) activate here. Fired on demand and by the
9
+ * host's idle trickle.
10
+ */
11
+ var Start = ActivationEvent.pluginStart(meta.profile.key);
12
+ //#endregion
13
+ export { Start as n, ExplorerEvents_exports as t };
14
+
15
+ //# sourceMappingURL=chunk-ExplorerEvents.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-ExplorerEvents.mjs","names":[],"sources":["../../src/types/ExplorerEvents.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as ActivationEvent from '@dxos/app-framework/ActivationEvent';\n\nimport { meta } from '#meta';\n\n/**\n * The feature's start event: the plugin's start-gated modules (and cross-plugin\n * contributions consumed by this feature) activate here. Fired on demand and by the\n * host's idle trickle.\n */\nexport const Start = ActivationEvent.pluginStart(meta.profile.key);\n"],"mappings":";;;;;;;;;;AAeA,IAAa,QAAQ,gBAAgB,YAAY,KAAK,QAAQ,GAAG"}
@@ -0,0 +1,16 @@
1
+ import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
2
+ import { meta } from "#meta";
3
+ import * as Plugin from "@dxos/app-framework/Plugin";
4
+ //#region src/ExplorerPlugin.ts
5
+ var ExplorerPlugin_exports = /* @__PURE__ */ __exportAll({
6
+ make: () => make,
7
+ meta: () => meta$1
8
+ });
9
+ /** Plugin metadata, available without loading the plugin body. */
10
+ var meta$1 = meta;
11
+ /** Constructs the plugin; the body loads on first enable. */
12
+ var make = Plugin.lazy(meta$1, () => import("#plugin"));
13
+ //#endregion
14
+ export { make as n, meta$1 as r, ExplorerPlugin_exports as t };
15
+
16
+ //# sourceMappingURL=chunk-ExplorerPlugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-ExplorerPlugin.mjs","names":["meta","pluginMeta"],"sources":["../../src/ExplorerPlugin.ts"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Plugin from '@dxos/app-framework/Plugin';\n\nimport { meta as pluginMeta } from '#meta';\n\n/** Plugin metadata, available without loading the plugin body. */\nexport const meta = pluginMeta;\n\n/** Constructs the plugin; the body loads on first enable. */\nexport const make = Plugin.lazy(meta, () => import('#plugin'));\n"],"mappings":";;;;;;;;;AAWA,IAAaA,SAAOC;;AAGpB,IAAa,OAAO,OAAO,KAAKD,cAAY,OAAO,UAAU"}
@@ -0,0 +1,11 @@
1
+ import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
2
+ import { n as CanvasForceGraph, t as ForceGraph } from "./chunk-Graph.mjs";
3
+ //#region src/ForceGraph.ts
4
+ var ForceGraph_exports = /* @__PURE__ */ __exportAll({
5
+ CanvasForceGraph: () => CanvasForceGraph,
6
+ Root: () => ForceGraph
7
+ });
8
+ //#endregion
9
+ export { ForceGraph_exports as t };
10
+
11
+ //# sourceMappingURL=chunk-ForceGraph.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-ForceGraph.mjs","names":[],"sources":["../../src/ForceGraph.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nexport { CanvasForceGraph, ForceGraph as Root } from './components/Graph/index.ts';\nexport type { CanvasForceGraphProps, ForceGraphProps as RootProps } from './components/Graph/index.ts';\n"],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
2
+ import { Annotation, DXN, Filter, Obj, Query, QueryAST, Ref, Type, View } from "@dxos/echo";
3
+ import * as Schema from "effect/Schema";
4
+ import { ViewAnnotation } from "@dxos/schema";
5
+ //#region src/types/Graph.ts
6
+ var Graph_exports = /* @__PURE__ */ __exportAll({
7
+ Graph: () => Graph,
8
+ make: () => make
9
+ });
10
+ var Graph = class extends Type.makeObject(DXN.make("org.dxos.type.graph", "0.1.0"))(Schema.Struct({
11
+ name: Schema.optional(Schema.String),
12
+ view: Ref.Ref(View.View).pipe(Annotation.FormInputAnnotation.set(false), Schema.optional),
13
+ query: Schema.Struct({
14
+ raw: Schema.optional(Schema.String),
15
+ ast: QueryAST.Query
16
+ }).pipe(Annotation.FormInputAnnotation.set(false))
17
+ }).pipe(Annotation.LabelAnnotation.set(["name"]), ViewAnnotation.set(["view"]), Annotation.IconAnnotation.set({
18
+ icon: "ph--graph--regular",
19
+ hue: "green"
20
+ }), Annotation.UserType.set())) {};
21
+ /**
22
+ * Make a graph as a view of a data set.
23
+ */
24
+ var make = ({ name, query = {
25
+ raw: "",
26
+ ast: Query.select(Filter.nothing()).ast
27
+ }, view } = {}) => {
28
+ return Obj.make(Graph, {
29
+ name,
30
+ view: view && Ref.make(view),
31
+ query
32
+ });
33
+ };
34
+ //#endregion
35
+ export { Graph_exports as n, make as r, Graph as t };
36
+
37
+ //# sourceMappingURL=chunk-Graph2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-Graph2.mjs","names":[],"sources":["../../src/types/Graph.ts"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Annotation, DXN, Filter, Obj, Query, QueryAST, Ref, Type, View } from '@dxos/echo';\nimport { ViewAnnotation } from '@dxos/schema';\n\nexport class Graph extends Type.makeObject<Graph>(DXN.make('org.dxos.type.graph', '0.1.0'))(\n Schema.Struct({\n name: Schema.optional(Schema.String),\n view: Ref.Ref(View.View).pipe(Annotation.FormInputAnnotation.set(false), Schema.optional),\n query: Schema.Struct({\n raw: Schema.optional(Schema.String),\n ast: QueryAST.Query,\n }).pipe(Annotation.FormInputAnnotation.set(false)),\n }).pipe(\n Annotation.LabelAnnotation.set(['name']),\n ViewAnnotation.set(['view']),\n Annotation.IconAnnotation.set({ icon: 'ph--graph--regular', hue: 'green' }),\n Annotation.UserType.set(),\n ),\n) {}\n\ntype MakeProps = Omit<Partial<Obj.MakeProps<typeof Graph>>, 'view'> & {\n view?: View.View;\n};\n\n/**\n * Make a graph as a view of a data set.\n */\nexport const make = ({\n name,\n query = { raw: '', ast: Query.select(Filter.nothing()).ast },\n view,\n}: MakeProps = {}): Graph => {\n return Obj.make(Graph, { name, view: view && Ref.make(view), query });\n};\n"],"mappings":";;;;;;;;;AASA,IAAa,QAAb,cAA2B,KAAK,WAAkB,IAAI,KAAK,uBAAuB,OAAO,CAAC,CAAC,CACzF,OAAO,OAAO;CACZ,MAAM,OAAO,SAAS,OAAO,MAAM;CACnC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK,WAAW,oBAAoB,IAAI,KAAK,GAAG,OAAO,QAAQ;CACxF,OAAO,OAAO,OAAO;EACnB,KAAK,OAAO,SAAS,OAAO,MAAM;EAClC,KAAK,SAAS;CAChB,CAAC,CAAC,CAAC,KAAK,WAAW,oBAAoB,IAAI,KAAK,CAAC;AACnD,CAAC,CAAC,CAAC,KACD,WAAW,gBAAgB,IAAI,CAAC,MAAM,CAAC,GACvC,eAAe,IAAI,CAAC,MAAM,CAAC,GAC3B,WAAW,eAAe,IAAI;CAAE,MAAM;CAAsB,KAAK;AAAQ,CAAC,GAC1E,WAAW,SAAS,IAAI,CAC1B,CACF,CAAC,CAAC,CAAC;;;;AASH,IAAa,QAAQ,EACnB,MACA,QAAQ;CAAE,KAAK;CAAI,KAAK,MAAM,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAC;AAAI,GAC3D,SACa,CAAC,MAAa;CAC3B,OAAO,IAAI,KAAK,OAAO;EAAE;EAAM,MAAM,QAAQ,IAAI,KAAK,IAAI;EAAG;CAAM,CAAC;AACtE"}
@@ -0,0 +1,9 @@
1
+ import { n as __reExport, t as __exportAll } from "./chunk-rolldown-runtime.mjs";
2
+ //#region src/Hooks.ts
3
+ var Hooks_exports = /* @__PURE__ */ __exportAll({});
4
+ import * as import__hooks from "#hooks";
5
+ __reExport(Hooks_exports, import__hooks);
6
+ //#endregion
7
+ export { Hooks_exports as t };
8
+
9
+ //# sourceMappingURL=chunk-Hooks.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-Hooks.mjs","names":[],"sources":["../../src/Hooks.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nexport * from '#hooks';\n"],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  //#region PLUGIN.mdl?raw
2
- var PLUGIN_default = "---\nid: org.dxos.plugin.explorer\nname: ExplorerPlugin\nversion: 0.1.0\n---\n\nAn interactive hypergraph visualization plugin for `DXOS` Composer that reveals relationships between objects in a workspace.\nThe plugin renders a live `Graph` object — backed by a `View` and a `QueryAST` query — through four switchable layout\nvariants: force-directed, radial cluster, edge bundling, and lattice.\nNode colours are derived from ECHO object types; hovering a node triggers an anchor-card preview.\n\n## Extensions\n\nThe following extension dialects are used in this document.\nEach extension is defined in the Appendix or resolved via its URI.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `scenario` | `org.dxos.mdl.scenario@1.0` |\n| `component` | `org.dxos.mdl.component@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n| `test` | `org.dxos.mdl.test@1.0` |\n\n## Types\n\n```mdl\ntype QueryInput\n fields:\n raw?: string # raw query string entered by the user\n ast: QueryAST.Query # compiled AST produced by QueryBuilder\n```\n\n```mdl\ntype GraphObject\n desc: ECHO-persistent object that describes a hypergraph visualisation session.\n fields:\n name?: string\n view: Ref<View> # schema view that defines visible fields\n query: QueryInput\n```\n\n```mdl\ntype ExplorerVariant\n literals: force | cluster | bundle | lattice\n```\n\n## Components\n\n```mdl\ncomponent ExplorerArticle\n desc: |\n Top-level article / section surface for a Graph object.\n Renders one of four SVG layout variants and a toolbar for switching between them.\n props:\n role: article | section\n subject: Ref<View>\n attendableId?: string\n state:\n variant: ExplorerVariant # active layout; default force\n filter?: Filter.Any # compiled from toolbar query input\n model?: SpaceGraphModel # live reactive graph built from db + filter\n slots:\n toolbar?: ReactNode # shown only when role === article\n actions:\n setVariant(v: ExplorerVariant)\n setFilter(raw: string)\n layout: |\n ┌────────────────────────────────┐\n │ [toolbar slot — article only] │\n │ [QueryEditor] [variant tabs] │\n ├────────────────────────────────┤\n │ │\n │ SVG canvas (force / cluster │\n │ / bundle / lattice) │\n │ │\n └────────────────────────────────┘\n```\n\n```mdl\ncomponent Visualization\n desc: |\n Internal component that owns a single persistent SVG.Graph mount.\n Swaps the active GraphProjector when the variant changes, seeding the\n new projector with the previous layout so node positions tween smoothly.\n props:\n variant: ExplorerVariant\n model: SpaceGraphModel\n state:\n projector?: GraphProjector<SpaceGraphNode>\n actions:\n createProjector(variant: ExplorerVariant, prev?: GraphLayout) → GraphProjector\n createRenderNode(variant: ExplorerVariant) → RenderNode\n```\n\n## Operations\n\n```mdl\nop createGraph\n desc: |\n Creates a new Graph object scoped to a target space or collection.\n Derives a ViewModel from the database for the selected typename, then\n writes the object via SpaceOperation.AddObject.\n input:\n name?: string\n typename?: string # ECHO typename used to seed the initial view\n target: Space | Collection\n targetNodeId?: string\n output: GraphObject\n effects: [echo:write]\n note: |\n The typename is resolved through ViewModel.makeFromDatabase; the resulting\n View is stored as a Ref inside the Graph object.\n```\n\n```mdl\nop buildFilter\n desc: |\n Compiles a raw query string into a Filter via QueryBuilder.\n Pure — no side effects; result is passed to SpaceGraphModel.setFilter.\n input:\n raw: string\n output: Filter.Any\n errors:\n ParseError: raw string is not valid query syntax\n```\n\n## Features\n\n```mdl\nfeat F-1: Graph Object\n\n req F-1.1: A Graph object stores a name, a View ref, and a compiled QueryAST.\n req F-1.2:\n when: user creates a new graph\n then: op:createGraph derives a ViewModel from the chosen typename and writes the Graph to ECHO\n\n req F-1.3:\n when: Graph is persisted\n then: it appears in the space object list and can be opened as an article\n```\n\n```mdl\nfeat F-2: Live Graph Model\n\n req F-2.1:\n when: ExplorerArticle mounts with a valid Graph subject\n then: SpaceGraphModel is opened against the subject's database\n\n req F-2.2:\n when: user types a query in the toolbar\n then: op:buildFilter compiles the raw string; model.setFilter applied; SVG re-renders\n\n req F-2.3:\n when: Graph is unmounted\n then: SpaceGraphModel is closed and all subscriptions released\n\n req F-2.4:\n when: an ECHO object in the database changes\n then: SpaceGraphModel emits an update and SVG.Graph re-renders without full remount\n tags: [reactive, collaborative]\n```\n\n```mdl\nfeat F-3: Visualization Variants\n\n req F-3.1:\n when: variant tab is selected\n then: Visualization swaps projector; previous node x/y seed the new projector so positions tween\n\n req F-3.2:\n when: variant is force\n then: SVG.Zoom wrapper is mounted enabling pan/zoom drag interaction\n\n req F-3.3:\n when: variant is cluster or bundle\n then: no SVG.Zoom wrapper; leaves grouped by typename; radial labels fade in after tween\n\n req F-3.4:\n when: variant is lattice\n then: nodes rendered as small rounded rectangles sorted by typename then label\n\n req F-3.5:\n when: variant is cluster and user clicks a root or group node\n then: subtree toggles collapsed/expanded via GraphClusterProjector.toggleCollapsed\n```\n\n```mdl\nfeat F-4: Node Interaction\n\n req F-4.1:\n when: pointer enters a node\n then: DxAnchorActivate event dispatched with the object's DXN and label, kind: card\n\n req F-4.2:\n when: pointer leaves a node\n then: DxAnchorActivate cleared (onNodeHover called with null)\n\n req F-4.3:\n when: node has no underlying ECHO object (synthetic root / group)\n then: no preview dispatched; node rendered in neutral colour\n```\n\n## Acceptance\n\n```mdl\nscenario T-1: Graph creation\n given: user opens the object creation dialog and selects Graph\n when: a typename is selected and the form submitted\n then:\n - op:createGraph runs without error\n - new Graph object visible in space object list\n - Graph.view references a valid View object\n```\n\n```mdl\nscenario T-2: Article mounts model\n given: a Graph with a populated query\n when: ExplorerArticle is rendered with role === article\n then:\n - SpaceGraphModel is opened\n - SVG canvas renders nodes derived from the database\n - toolbar shows QueryEditor and variant tabs\n```\n\n```mdl\nscenario T-3: Variant switch preserves positions\n given: force variant is active with nodes positioned\n when: user switches to cluster variant\n then:\n - projector is recreated from previous layout\n - nodes tween from old positions to cluster target positions\n - SVG.Zoom wrapper is absent in the new mount\n```\n\n```mdl\nscenario T-4: Query filter updates graph\n given: ExplorerArticle is open with all objects visible\n when: user types a typename filter in QueryEditor\n then:\n - op:buildFilter returns a Filter without error\n - SpaceGraphModel.setFilter applied\n - only matching nodes remain visible in the SVG\n```\n\n```mdl\nscenario T-5: Node hover preview\n given: force-directed graph with at least one ECHO object node\n when: pointer enters that node\n then:\n - DxAnchorActivate event fired with correct DXN\n - kind === card\n```\n\n```mdl\nscenario T-6: Lattice sort order\n given: database contains objects of two typenames A and B\n when: lattice variant is active\n then:\n - all typename-A nodes appear before typename-B nodes (or vice-versa, consistent order)\n - within each group nodes are ordered alphabetically by label\n```\n\n```mdl\nscenario T-7: Model closed on unmount\n given: ExplorerArticle is mounted and SpaceGraphModel is open\n when: component unmounts\n then:\n - SpaceGraphModel.close() is called\n - no lingering ECHO subscriptions remain\n```\n\n---\n\n## QA\n\nExecutable tests. Each step carries a human instruction (`do`) and, where the step maps to an\ninvocable operation, an agent binding (`invoke`). Report failures by test and step number.\n\nplugin-explorer is not in `getDefaults` or the dev-only default set (see\n`packages/apps/composer-app/src/plugin-defs.tsx`) — it is OFF by default. Neither `createGraph` nor\n`buildFilter` is a registered runtime `Operation` (no `DXN.make` key exists in\n`src/`) — creation goes through the generic `CreateObjectEntry` capability\n(`src/capabilities/create-object.ts`), a UI-driven path with no operation key to invoke, and the\nquery editor calls `buildFilter` as a plain in-process function. Both steps are human-only.\n\n```mdl\ntest QA-1: Create a Graph and switch layout variants\n desc: The core explorer round-trip — create a Graph object, watch it render, switch between layout variants.\n actors: human\n covers: [F-1.1, F-1.2, F-1.3, F-3.1, T-1, T-2, T-3]\n status: unverified\n given:\n - an identity exists\n - space: a space is open, containing at least one object of some typename to visualize\n - no Graph named \"QA Graph\" exists — ABORT rather than reusing one this test did not create\n steps:\n - name: Create the Graph\n do: In the navtree, click + on the space and choose Explorer > Graph. Name it \"QA Graph\" and pick a typename to seed the view.\n expect: a Graph object named \"QA Graph\" is created and opens as an article, rendering an SVG force-directed graph of matching objects\n note: |\n NO `invoke` — `createGraph` has no runtime operation key; the navtree action calls the\n `CreateObjectEntry` capability directly (see above).\n - name: Switch to the cluster variant\n do: Click the \"cluster\" tab in the variant toolbar.\n expect: the projector swaps to radial cluster layout; nodes tween from their force positions rather than jumping; no pan/zoom wrapper is present\n - name: Switch to the lattice variant\n do: Click the \"lattice\" tab.\n expect: nodes render as small rounded rectangles, grouped by typename then sorted alphabetically by label\n - name: Hover a node\n do: Move the pointer over any node with an underlying ECHO object.\n expect: an anchor-card preview appears showing the object's label\n after:\n - name: Delete the Graph\n do: Right-click \"QA Graph\" in the navtree and choose Delete.\n expect: the row leaves the navtree and its plank closes\n note: |\n NO `invoke` here either — the test never captured a live reference to the Graph (its\n creation had no `invoke`/`capture`), so a runner must resolve it by querying\n `space.db.query(dxos.Filter.everything())` for the object named \"QA Graph\" and call\n `org.dxos.operation.space.removeObjects` with that reference, rather than the test\n guessing an id it was never given.\n```\n\n---\n\n## Appendix: Extension Definitions\n\nExtension block types used in this document are defined below using\nthe core `ext` primitive — the only construct the base language provides.\n\n```mdl\next type\n uri: org.dxos.mdl.type@1.0\n desc: A named data structure with typed fields and optional literals.\n fields:\n desc?: Prose\n fields?: FieldMap # name[?]: TypeExpr (# inline comment)\n literals?: UnionList # a | b | c\n extends?: TypeRef[]\n```\n\n```mdl\next feat\n uri: org.dxos.mdl.feat@1.0\n desc: A named feature grouping one or more requirements.\n fields:\n desc?: Prose\n req: RequirementList\n nesting: self # feat blocks may contain feat blocks\n```\n\n```mdl\next scenario\n uri: org.dxos.mdl.scenario@1.0\n desc: An acceptance scenario expressed as given / when / then steps.\n fields:\n given?: Step | Step[]\n when?: Step | Step[]\n then: Step | Step[]\n tags?: TagList\n```\n\n```mdl\next component\n uri: org.dxos.mdl.component@1.0\n desc: A UI component with props, internal state, slots, actions, and events.\n fields:\n desc?: Prose\n props?: FieldMap # external inputs (immutable inside component)\n state?: FieldMap # internal reactive state\n slots?: FieldMap # named ReactNode injection points\n actions?: ActionMap # methods the component exposes or handles\n emits?: EventMap # events the component raises to its parent\n layout?: CodeBlock # ASCII sketch of visual structure (non-normative)\n```\n\n```mdl\next op\n uri: org.dxos.mdl.op@1.0\n desc: |\n A named operation with typed inputs, outputs, and declared errors.\n Pure ops have no effects or requires. Effectful ops declare both.\n fields:\n desc?: Prose\n input?: FieldMap # named input parameters\n output?: TypeExpr # return type\n errors?: ErrorMap # name: Prose (when this error occurs)\n effects?: EffectList # echo:read | echo:write | http | fs | ...\n requires?: ServiceList # injected service dependencies\n note?: Prose # implementation guidance (non-normative)\n```\n";
2
+ var PLUGIN_default = "---\nid: org.dxos.plugin.explorer\nname: ExplorerPlugin\nversion: 0.1.0\n---\n\nAn interactive hypergraph visualization plugin for `DXOS` Composer that reveals relationships between objects in a workspace.\nThe plugin renders a live `Graph` object — backed by a `View` and a `QueryAST` query — through four switchable layout\nvariants: force-directed, radial cluster, edge bundling, and lattice.\nNode colours are derived from ECHO object types; hovering a node triggers an anchor-card preview.\n\n## Extensions\n\nThe following extension dialects are used in this document.\nEach extension is defined in the Appendix or resolved via its URI.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `scenario` | `org.dxos.mdl.scenario@1.0` |\n| `component` | `org.dxos.mdl.component@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n| `test` | `org.dxos.mdl.test@1.0` |\n\n## Types\n\n```mdl\ntype QueryInput\n fields:\n raw?: string # raw query string entered by the user\n ast: QueryAST.Query # compiled AST produced by QueryBuilder\n```\n\n```mdl\ntype GraphObject\n desc: ECHO-persistent object that describes a hypergraph visualisation session.\n fields:\n name?: string\n view: Ref<View> # schema view that defines visible fields\n query: QueryInput\n```\n\n```mdl\ntype ExplorerVariant\n literals: force | cluster | bundle | lattice\n```\n\n## Components\n\n```mdl\ncomponent ExplorerArticle\n desc: |\n Top-level article / section surface for a Graph object.\n Renders one of four SVG layout variants and a toolbar for switching between them.\n props:\n role: article | section\n subject: Ref<View>\n attendableId?: string\n state:\n variant: ExplorerVariant # active layout; default force\n filter?: Filter.Any # compiled from toolbar query input\n model?: SpaceGraphModel # live reactive graph built from db + filter\n slots:\n toolbar?: ReactNode # shown only when role === article\n actions:\n setVariant(v: ExplorerVariant)\n setFilter(raw: string)\n layout: |\n ┌────────────────────────────────┐\n │ [toolbar slot — article only] │\n │ [QueryEditor] [variant tabs] │\n ├────────────────────────────────┤\n │ │\n │ SVG canvas (force / cluster │\n │ / bundle / lattice) │\n │ │\n └────────────────────────────────┘\n```\n\n```mdl\ncomponent Visualization\n desc: |\n Internal component that owns a single persistent SVG.Graph mount.\n Swaps the active GraphProjector when the variant changes, seeding the\n new projector with the previous layout so node positions tween smoothly.\n props:\n variant: ExplorerVariant\n model: SpaceGraphModel\n state:\n projector?: GraphProjector<SpaceGraphNode>\n actions:\n createProjector(variant: ExplorerVariant, prev?: GraphLayout) → GraphProjector\n createRenderNode(variant: ExplorerVariant) → RenderNode\n```\n\n## Operations\n\n```mdl\nop createGraph\n desc: |\n Creates a new Graph object scoped to a target space or collection.\n Derives a ViewModel from the database for the selected typename, then\n writes the object via SpaceOperation.AddObject.\n input:\n name?: string\n typename?: string # ECHO typename used to seed the initial view\n target: Space | Collection\n targetNodeId?: string\n output: GraphObject\n effects: [echo:write]\n note: |\n The typename is resolved through ViewModel.makeFromDatabase; the resulting\n View is stored as a Ref inside the Graph object.\n```\n\n```mdl\nop buildFilter\n desc: |\n Compiles a raw query string into a Filter via QueryBuilder.\n Pure — no side effects; result is passed to SpaceGraphModel.setFilter.\n input:\n raw: string\n output: Filter.Any\n errors:\n ParseError: raw string is not valid query syntax\n```\n\n## Features\n\n```mdl\nfeat F-1: Graph Object\n\n req F-1.1: A Graph object stores a name, a View ref, and a compiled QueryAST.\n req F-1.2:\n when: user creates a new graph\n then: op:createGraph derives a ViewModel from the chosen typename and writes the Graph to ECHO\n\n req F-1.3:\n when: Graph is persisted\n then: it appears in the space object list and can be opened as an article\n```\n\n```mdl\nfeat F-2: Live Graph Model\n\n req F-2.1:\n when: ExplorerArticle mounts with a valid Graph subject\n then: SpaceGraphModel is opened against the subject's database\n\n req F-2.2:\n when: user types a query in the toolbar\n then: op:buildFilter compiles the raw string; model.setFilter applied; SVG re-renders\n\n req F-2.3:\n when: Graph is unmounted\n then: SpaceGraphModel is closed and all subscriptions released\n\n req F-2.4:\n when: an ECHO object in the database changes\n then: SpaceGraphModel emits an update and SVG.Graph re-renders without full remount\n tags: [reactive, collaborative]\n```\n\n```mdl\nfeat F-3: Visualization Variants\n\n req F-3.1:\n when: variant tab is selected\n then: Visualization swaps projector; previous node x/y seed the new projector so positions tween\n\n req F-3.2:\n when: variant is force\n then: SVG.Zoom wrapper is mounted enabling pan/zoom drag interaction\n\n req F-3.3:\n when: variant is cluster or bundle\n then: no SVG.Zoom wrapper; leaves grouped by typename; radial labels fade in after tween\n\n req F-3.4:\n when: variant is lattice\n then: nodes rendered as small rounded rectangles sorted by typename then label\n\n req F-3.5:\n when: variant is cluster and user clicks a root or group node\n then: subtree toggles collapsed/expanded via GraphClusterProjector.toggleCollapsed\n```\n\n```mdl\nfeat F-4: Node Interaction\n\n req F-4.1:\n when: pointer enters a node\n then: DxAnchorActivate event dispatched with the object's DXN and label, kind: card\n\n req F-4.2:\n when: pointer leaves a node\n then: DxAnchorActivate cleared (onNodeHover called with null)\n\n req F-4.3:\n when: node has no underlying ECHO object (synthetic root / group)\n then: no preview dispatched; node rendered in neutral colour\n```\n\n## Acceptance\n\n```mdl\nscenario T-1: Graph creation\n given: user opens the object creation dialog and selects Graph\n when: a typename is selected and the form submitted\n then:\n - op:createGraph runs without error\n - new Graph object visible in space object list\n - Graph.view references a valid View object\n```\n\n```mdl\nscenario T-2: Article mounts model\n given: a Graph with a populated query\n when: ExplorerArticle is rendered with role === article\n then:\n - SpaceGraphModel is opened\n - SVG canvas renders nodes derived from the database\n - toolbar shows QueryEditor and variant tabs\n```\n\n```mdl\nscenario T-3: Variant switch preserves positions\n given: force variant is active with nodes positioned\n when: user switches to cluster variant\n then:\n - projector is recreated from previous layout\n - nodes tween from old positions to cluster target positions\n - SVG.Zoom wrapper is absent in the new mount\n```\n\n```mdl\nscenario T-4: Query filter updates graph\n given: ExplorerArticle is open with all objects visible\n when: user types a typename filter in QueryEditor\n then:\n - op:buildFilter returns a Filter without error\n - SpaceGraphModel.setFilter applied\n - only matching nodes remain visible in the SVG\n```\n\n```mdl\nscenario T-5: Node hover preview\n given: force-directed graph with at least one ECHO object node\n when: pointer enters that node\n then:\n - DxAnchorActivate event fired with correct DXN\n - kind === card\n```\n\n```mdl\nscenario T-6: Lattice sort order\n given: database contains objects of two typenames A and B\n when: lattice variant is active\n then:\n - all typename-A nodes appear before typename-B nodes (or vice-versa, consistent order)\n - within each group nodes are ordered alphabetically by label\n```\n\n```mdl\nscenario T-7: Model closed on unmount\n given: ExplorerArticle is mounted and SpaceGraphModel is open\n when: component unmounts\n then:\n - SpaceGraphModel.close() is called\n - no lingering ECHO subscriptions remain\n```\n\n---\n\n## QA\n\nExecutable tests. Each step carries a human instruction (`do`) and, where the step maps to an\ninvocable operation, an agent binding (`invoke`). Report failures by test and step number.\n\nplugin-explorer is not in `getDefaults` or the dev-only default set (see\n`packages/apps/composer-app/src/plugin-defs.tsx`) — it is OFF by default. Neither `createGraph` nor\n`buildFilter` is a registered runtime `Operation` (no `DXN.make` key exists in\n`src/`) — creation goes through the generic `CreateObjectEntry` capability\n(`src/capabilities/create-object.ts`), a UI-driven path with no operation key to invoke, and the\nquery editor calls `buildFilter` as a plain in-process function. Both steps are human-only.\n\n```mdl\ntest QA-1: Create a Graph and switch layout variants\n desc: The core explorer round-trip — create a Graph object, watch it render, switch between layout variants.\n actors: human\n covers: [F-1.1, F-1.2, F-1.3, F-3.1, T-1, T-2, T-3]\n status: unverified\n given:\n - an identity exists\n - space: a space is open, containing at least one object of some typename to visualize\n - no Graph named \"QA Graph\" exists — ABORT rather than reusing one this test did not create\n steps:\n - name: Create the Graph\n do: In the navtree, click + on the space and choose Explorer > Graph. Name it \"QA Graph\" and pick a typename to seed the view.\n expect: a Graph object named \"QA Graph\" is created and opens as an article, rendering an SVG force-directed graph of matching objects\n note: |\n NO `invoke` — `createGraph` has no runtime operation key; the navtree action calls the\n `CreateObjectEntry` capability directly (see above).\n - name: Switch to the cluster variant\n do: Click the \"cluster\" tab in the variant toolbar.\n expect: the projector swaps to radial cluster layout; nodes tween from their force positions rather than jumping; no pan/zoom wrapper is present\n - name: Switch to the lattice variant\n do: Click the \"lattice\" tab.\n expect: nodes render as small rounded rectangles, grouped by typename then sorted alphabetically by label\n - name: Hover a node\n do: Move the pointer over any node with an underlying ECHO object.\n expect: an anchor-card preview appears showing the object's label\n after:\n - name: Delete the Graph\n do: Right-click \"QA Graph\" in the navtree and choose Delete.\n expect: the row leaves the navtree and its plank closes\n note: |\n NO `invoke` here either — the test never captured a live reference to the Graph (its\n creation had no `invoke`/`capture`), so a runner must resolve it by querying\n `space.db.query(dxos.Filter.everything())` for the object named \"QA Graph\" and call\n `org.dxos.operation.space.removeObjects` with that reference, rather than the test\n guessing an id it was never given.\n\ntest QA-2: Showcase clip\n desc: |\n The 10s showcase clip: Pan a graph of the space. Recorded light at 60 fps with no ident, captions or\n count-in by `tools/autocue/showcase/overnight.mjs`; the clip is the `clip: explorer` step.\n actors: human\n status: unverified # driven by autocue/showcase.mjs\n given:\n - an identity exists\n - space: a space is open\n - plugin-explorer enabled\n steps:\n - name: Create the object\n do: Create a explorer object from the + menu.\n expect: it renders in the plank\n - name: Orbit it\n do: Drag slowly across it.\n expect: the view turns or pans smoothly\n```\n\n---\n\n## Appendix: Extension Definitions\n\nExtension block types used in this document are defined below using\nthe core `ext` primitive — the only construct the base language provides.\n\n```mdl\next type\n uri: org.dxos.mdl.type@1.0\n desc: A named data structure with typed fields and optional literals.\n fields:\n desc?: Prose\n fields?: FieldMap # name[?]: TypeExpr (# inline comment)\n literals?: UnionList # a | b | c\n extends?: TypeRef[]\n```\n\n```mdl\next feat\n uri: org.dxos.mdl.feat@1.0\n desc: A named feature grouping one or more requirements.\n fields:\n desc?: Prose\n req: RequirementList\n nesting: self # feat blocks may contain feat blocks\n```\n\n```mdl\next scenario\n uri: org.dxos.mdl.scenario@1.0\n desc: An acceptance scenario expressed as given / when / then steps.\n fields:\n given?: Step | Step[]\n when?: Step | Step[]\n then: Step | Step[]\n tags?: TagList\n```\n\n```mdl\next component\n uri: org.dxos.mdl.component@1.0\n desc: A UI component with props, internal state, slots, actions, and events.\n fields:\n desc?: Prose\n props?: FieldMap # external inputs (immutable inside component)\n state?: FieldMap # internal reactive state\n slots?: FieldMap # named ReactNode injection points\n actions?: ActionMap # methods the component exposes or handles\n emits?: EventMap # events the component raises to its parent\n layout?: CodeBlock # ASCII sketch of visual structure (non-normative)\n```\n\n```mdl\next op\n uri: org.dxos.mdl.op@1.0\n desc: |\n A named operation with typed inputs, outputs, and declared errors.\n Pure ops have no effects or requires. Effectful ops declare both.\n fields:\n desc?: Prose\n input?: FieldMap # named input parameters\n output?: TypeExpr # return type\n errors?: ErrorMap # name: Prose (when this error occurs)\n effects?: EffectList # echo:read | echo:write | http | fs | ...\n requires?: ServiceList # injected service dependencies\n note?: Prose # implementation guidance (non-normative)\n```\n";
3
3
  //#endregion
4
- export { PLUGIN_default as t };
4
+ export { PLUGIN_default as default };
5
5
 
6
6
  //# sourceMappingURL=chunk-PLUGIN.mjs.map