@dxos/plugin-pipeline 0.8.4-main.effb148878 → 0.8.4-staging.60fe92afc8

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 (38) hide show
  1. package/PLUGIN.mdl +345 -0
  2. package/dist/lib/neutral/PipelinePlugin.mjs +12 -0
  3. package/dist/lib/neutral/PipelinePlugin.mjs.map +4 -4
  4. package/dist/lib/neutral/{PipelineProperties-NFNEU3NR.mjs → PipelineProperties-JZQYG2CN.mjs} +9 -11
  5. package/dist/lib/neutral/PipelineProperties-JZQYG2CN.mjs.map +7 -0
  6. package/dist/lib/neutral/capabilities/index.mjs +1 -1
  7. package/dist/lib/neutral/{chunk-OVZ2ASS7.mjs → chunk-CYXDAAKN.mjs} +6 -4
  8. package/dist/lib/neutral/chunk-CYXDAAKN.mjs.map +7 -0
  9. package/dist/lib/neutral/components/index.mjs +4 -8
  10. package/dist/lib/neutral/components/index.mjs.map +3 -3
  11. package/dist/lib/neutral/containers/index.mjs +1 -1
  12. package/dist/lib/neutral/hooks/index.mjs +3 -4
  13. package/dist/lib/neutral/hooks/index.mjs.map +3 -3
  14. package/dist/lib/neutral/index.mjs +1 -1
  15. package/dist/lib/neutral/meta.json +1 -1
  16. package/dist/lib/neutral/meta.mjs +1 -1
  17. package/dist/lib/neutral/plugin.mjs +1 -1
  18. package/dist/lib/neutral/{react-surface-4W5YLCHT.mjs → react-surface-QG7QSZSS.mjs} +2 -2
  19. package/dist/lib/neutral/{react-surface-4W5YLCHT.mjs.map → react-surface-QG7QSZSS.mjs.map} +1 -1
  20. package/dist/types/src/PipelinePlugin.d.ts.map +1 -1
  21. package/dist/types/src/components/PipelineComponent/PipelineColumn.d.ts.map +1 -1
  22. package/dist/types/src/containers/PipelineArticle/PipelineArticle.stories.d.ts.map +1 -1
  23. package/dist/types/src/containers/PipelineProperties/PipelineProperties.d.ts.map +1 -1
  24. package/dist/types/src/hooks/usePipelineBoardModel.d.ts.map +1 -1
  25. package/dist/types/src/meta.d.ts +1 -1
  26. package/dist/types/src/meta.d.ts.map +1 -1
  27. package/dist/types/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +43 -44
  29. package/src/PipelinePlugin.tsx +6 -0
  30. package/src/capabilities/react-surface.tsx +1 -1
  31. package/src/components/PipelineComponent/PipelineColumn.tsx +4 -13
  32. package/src/containers/PipelineArticle/PipelineArticle.stories.tsx +3 -6
  33. package/src/containers/PipelineProperties/PipelineProperties.tsx +21 -22
  34. package/src/hooks/usePipelineBoardModel.ts +3 -4
  35. package/src/meta.ts +5 -4
  36. package/src/vite-env.d.ts +10 -0
  37. package/dist/lib/neutral/PipelineProperties-NFNEU3NR.mjs.map +0 -7
  38. package/dist/lib/neutral/chunk-OVZ2ASS7.mjs.map +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-pipeline",
3
- "version": "0.8.4-main.effb148878",
3
+ "version": "0.8.4-staging.60fe92afc8",
4
4
  "description": "Pipeline plugin for Composer",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -66,6 +66,7 @@
66
66
  "types": "./dist/types/src/index.d.ts",
67
67
  "default": "./dist/lib/neutral/index.mjs"
68
68
  },
69
+ "./assets/PLUGIN.mdl": "./PLUGIN.mdl",
69
70
  "./plugin": {
70
71
  "source": "./src/plugin.ts",
71
72
  "types": "./dist/types/src/plugin.d.ts",
@@ -80,40 +81,38 @@
80
81
  "types": "dist/types/src/index.d.ts",
81
82
  "files": [
82
83
  "dist",
83
- "src"
84
+ "src",
85
+ "PLUGIN.mdl"
84
86
  ],
85
87
  "dependencies": {
86
88
  "@radix-ui/react-compose-refs": "1.1.1",
87
89
  "@radix-ui/react-context": "1.1.1",
88
90
  "@radix-ui/react-slot": "1.1.2",
89
- "effect": "3.20.0",
90
- "@dxos/app-framework": "0.8.4-main.effb148878",
91
- "@dxos/app-toolkit": "0.8.4-main.effb148878",
92
- "@dxos/assistant-toolkit": "0.8.4-main.effb148878",
93
- "@dxos/async": "0.8.4-main.effb148878",
94
- "@dxos/compute": "0.8.4-main.effb148878",
95
- "@dxos/devtools": "0.8.4-main.effb148878",
96
- "@dxos/echo": "0.8.4-main.effb148878",
97
- "@dxos/echo-atom": "0.8.4-main.effb148878",
98
- "@dxos/echo-query": "0.8.4-main.effb148878",
99
- "@dxos/plugin-deck": "0.8.4-main.effb148878",
100
- "@dxos/plugin-inbox": "0.8.4-main.effb148878",
101
- "@dxos/plugin-client": "0.8.4-main.effb148878",
102
- "@dxos/plugin-graph": "0.8.4-main.effb148878",
103
- "@dxos/plugin-space": "0.8.4-main.effb148878",
104
- "@dxos/log": "0.8.4-main.effb148878",
105
- "@dxos/react-client": "0.8.4-main.effb148878",
106
- "@dxos/plugin-markdown": "0.8.4-main.effb148878",
107
- "@dxos/react-ui-components": "0.8.4-main.effb148878",
108
- "@dxos/react-ui-form": "0.8.4-main.effb148878",
109
- "@dxos/react-ui-attention": "0.8.4-main.effb148878",
110
- "@dxos/react-ui-list": "0.8.4-main.effb148878",
111
- "@dxos/react-ui-stack": "0.8.4-main.effb148878",
112
- "@dxos/react-ui-menu": "0.8.4-main.effb148878",
113
- "@dxos/react-ui-mosaic": "0.8.4-main.effb148878",
114
- "@dxos/types": "0.8.4-main.effb148878",
115
- "@dxos/util": "0.8.4-main.effb148878",
116
- "@dxos/schema": "0.8.4-main.effb148878"
91
+ "effect": "3.21.3",
92
+ "@dxos/app-toolkit": "0.8.4-staging.60fe92afc8",
93
+ "@dxos/compute": "0.8.4-staging.60fe92afc8",
94
+ "@dxos/app-framework": "0.8.4-staging.60fe92afc8",
95
+ "@dxos/echo": "0.8.4-staging.60fe92afc8",
96
+ "@dxos/echo-query": "0.8.4-staging.60fe92afc8",
97
+ "@dxos/devtools": "0.8.4-staging.60fe92afc8",
98
+ "@dxos/keys": "0.8.4-staging.60fe92afc8",
99
+ "@dxos/log": "0.8.4-staging.60fe92afc8",
100
+ "@dxos/plugin-graph": "0.8.4-staging.60fe92afc8",
101
+ "@dxos/effect": "0.8.4-staging.60fe92afc8",
102
+ "@dxos/plugin-client": "0.8.4-staging.60fe92afc8",
103
+ "@dxos/plugin-inbox": "0.8.4-staging.60fe92afc8",
104
+ "@dxos/plugin-space": "0.8.4-staging.60fe92afc8",
105
+ "@dxos/plugin-markdown": "0.8.4-staging.60fe92afc8",
106
+ "@dxos/react-client": "0.8.4-staging.60fe92afc8",
107
+ "@dxos/react-ui-attention": "0.8.4-staging.60fe92afc8",
108
+ "@dxos/react-ui-form": "0.8.4-staging.60fe92afc8",
109
+ "@dxos/react-ui-menu": "0.8.4-staging.60fe92afc8",
110
+ "@dxos/react-ui-mosaic": "0.8.4-staging.60fe92afc8",
111
+ "@dxos/schema": "0.8.4-staging.60fe92afc8",
112
+ "@dxos/react-ui-stack": "0.8.4-staging.60fe92afc8",
113
+ "@dxos/react-ui-list": "0.8.4-staging.60fe92afc8",
114
+ "@dxos/types": "0.8.4-staging.60fe92afc8",
115
+ "@dxos/util": "0.8.4-staging.60fe92afc8"
117
116
  },
118
117
  "devDependencies": {
119
118
  "@effect-atom/atom-react": "^0.5.0",
@@ -121,25 +120,25 @@
121
120
  "@types/react-dom": "~19.2.3",
122
121
  "react": "~19.2.3",
123
122
  "react-dom": "~19.2.3",
124
- "vite": "^8.0.14",
125
- "@dxos/echo-db": "0.8.4-main.effb148878",
126
- "@dxos/plugin-attention": "0.8.4-main.effb148878",
127
- "@dxos/plugin-inbox": "0.8.4-main.effb148878",
128
- "@dxos/plugin-preview": "0.8.4-main.effb148878",
129
- "@dxos/plugin-theme": "0.8.4-main.effb148878",
130
- "@dxos/random": "0.8.4-main.effb148878",
131
- "@dxos/react-ui": "0.8.4-main.effb148878",
132
- "@dxos/storybook-utils": "0.8.4-main.effb148878",
133
- "@dxos/ui-theme": "0.8.4-main.effb148878",
134
- "@dxos/plugin-testing": "0.8.4-main.effb148878"
123
+ "vite": "^8.0.16",
124
+ "@dxos/echo-client": "0.8.4-staging.60fe92afc8",
125
+ "@dxos/plugin-attention": "0.8.4-staging.60fe92afc8",
126
+ "@dxos/plugin-inbox": "0.8.4-staging.60fe92afc8",
127
+ "@dxos/plugin-preview": "0.8.4-staging.60fe92afc8",
128
+ "@dxos/plugin-testing": "0.8.4-staging.60fe92afc8",
129
+ "@dxos/react-ui": "0.8.4-staging.60fe92afc8",
130
+ "@dxos/storybook-utils": "0.8.4-staging.60fe92afc8",
131
+ "@dxos/random": "0.8.4-staging.60fe92afc8",
132
+ "@dxos/ui-theme": "0.8.4-staging.60fe92afc8",
133
+ "@dxos/plugin-theme": "0.8.4-staging.60fe92afc8"
135
134
  },
136
135
  "peerDependencies": {
137
136
  "@effect-atom/atom-react": "^0.5.0",
138
- "effect": "3.20.0",
137
+ "effect": "3.21.3",
139
138
  "react": "~19.2.3",
140
139
  "react-dom": "~19.2.3",
141
- "@dxos/ui-theme": "0.8.4-main.effb148878",
142
- "@dxos/react-ui": "0.8.4-main.effb148878"
140
+ "@dxos/react-ui": "0.8.4-staging.60fe92afc8",
141
+ "@dxos/ui-theme": "0.8.4-staging.60fe92afc8"
143
142
  },
144
143
  "publishConfig": {
145
144
  "access": "public"
@@ -10,12 +10,18 @@ import { AppGraphBuilder, CreateObject, ReactSurface } from '#capabilities';
10
10
  import { meta } from '#meta';
11
11
  import { translations } from '#translations';
12
12
 
13
+ // eslint-disable-next-line import/no-relative-packages
14
+ import pluginSpec from '../PLUGIN.mdl?raw';
15
+
13
16
  export const PipelinePlugin = Plugin.define(meta).pipe(
14
17
  AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),
15
18
  AppPlugin.addCreateObjectModule({ activate: CreateObject }),
16
19
  AppPlugin.addSchemaModule({ schema: [Pipeline.Pipeline] }),
17
20
  AppPlugin.addSurfaceModule({ activate: ReactSurface }),
18
21
  AppPlugin.addTranslationsModule({ translations }),
22
+ AppPlugin.addPluginAssetModule({
23
+ asset: { pluginId: meta.id, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },
24
+ }),
19
25
  Plugin.make,
20
26
  );
21
27
 
@@ -44,7 +44,7 @@ export default Capability.makeModule(() =>
44
44
  },
45
45
  }),
46
46
  Surface.create({
47
- id: 'object-properties',
47
+ id: 'objectProperties',
48
48
  filter: AppSurface.object(AppSurface.ObjectProperties, Pipeline.Pipeline),
49
49
  component: ({ data }) => <PipelineProperties pipeline={data.subject} />,
50
50
  }),
@@ -3,12 +3,10 @@
3
3
  //
4
4
 
5
5
  import { useComposedRefs } from '@radix-ui/react-compose-refs';
6
- import * as Function from 'effect/Function';
7
- import * as Option from 'effect/Option';
8
6
  import React, { forwardRef, useMemo, useRef, useState } from 'react';
9
7
 
10
8
  import { resolveSchemaWithRegistry } from '@dxos/app-toolkit/query';
11
- import { Annotation, Filter, Obj, Query, Type } from '@dxos/echo';
9
+ import { Filter, Obj, Query, Type } from '@dxos/echo';
12
10
  import { useObject } from '@dxos/react-client/echo';
13
11
  import { Panel, Toolbar, useAsyncEffect, useTranslation } from '@dxos/react-ui';
14
12
  import { Card } from '@dxos/react-ui';
@@ -54,7 +52,7 @@ export const PipelineColumn = ({ data: column, location, classNames, debug }: Pi
54
52
  return;
55
53
  }
56
54
 
57
- const type = await resolveSchemaWithRegistry(db.schemaRegistry, query.ast);
55
+ const type = await resolveSchemaWithRegistry(db, query.ast);
58
56
  setType(() => type);
59
57
  }, [db, query]);
60
58
 
@@ -119,14 +117,7 @@ const ItemTile = forwardRef<HTMLDivElement, ItemTileProps>(
119
117
  const rootRef = useRef<HTMLDivElement>(null);
120
118
  const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);
121
119
  const { Item } = usePipeline(ITEM_TILE_NAME);
122
- const icon = Function.pipe(
123
- Obj.getType(data),
124
- Option.fromNullable,
125
- Option.map(Type.getSchema),
126
- Option.flatMap(Annotation.IconAnnotation.get),
127
- Option.map(({ icon }) => icon),
128
- Option.getOrElse(() => 'ph--circle-dashed--regular'),
129
- );
120
+ const icon = Obj.getIcon(data)?.icon ?? 'ph--circle-dashed--regular';
130
121
 
131
122
  return (
132
123
  <Menu.Root>
@@ -137,7 +128,7 @@ const ItemTile = forwardRef<HTMLDivElement, ItemTileProps>(
137
128
  <Card.Icon icon={icon} />
138
129
  <Card.Title>{Obj.getLabel(data, { fallback: 'typename' })}</Card.Title>
139
130
  {/* TODO(wittjosiah): Reconcile with Card.Menu. */}
140
- <Card.IconBlock padding>
131
+ <Card.IconBlock>
141
132
  <Menu.Trigger asChild>
142
133
  <Toolbar.IconButton
143
134
  iconOnly
@@ -8,8 +8,8 @@ import * as Layer from 'effect/Layer';
8
8
  import React from 'react';
9
9
 
10
10
  import { withPluginManager } from '@dxos/app-framework/testing';
11
- import { Collection, Database, Feed, Filter, JsonSchema, Obj, Query, Ref, Tag, View } from '@dxos/echo';
12
- import { createFeedServiceLayer } from '@dxos/echo-db';
11
+ import { Collection, Database, Feed, Filter, JsonSchema, Obj, Query, Ref, Scope, Tag, View } from '@dxos/echo';
12
+ import { createFeedServiceLayer } from '@dxos/echo-client';
13
13
  import { ClientPlugin } from '@dxos/plugin-client/plugin';
14
14
  import { initializeIdentity } from '@dxos/plugin-client/testing';
15
15
  import { InboxPlugin } from '@dxos/plugin-inbox/plugin';
@@ -110,11 +110,8 @@ const meta = {
110
110
  );
111
111
  yield* Feed.append(messageFeed, messages);
112
112
 
113
- const messageQueueDxn = Feed.getQueueUri(messageFeed)!;
114
113
  const messageView = ViewModel.make({
115
- query: Query.select(Filter.type(Message.Message)).from({
116
- feeds: [messageQueueDxn],
117
- }),
114
+ query: Query.select(Filter.type(Message.Message)).from(Scope.feed(Obj.getURI(messageFeed))),
118
115
  jsonSchema: JsonSchema.toJsonSchema(Message.Message),
119
116
  });
120
117
 
@@ -7,8 +7,9 @@ import React, { useCallback, useMemo, useRef, useState } from 'react';
7
7
 
8
8
  import { resolveSchemaWithRegistry } from '@dxos/app-toolkit/query';
9
9
  import { useTypeOptions } from '@dxos/app-toolkit/ui';
10
- import { EchoURI, Filter, JsonSchema, Obj, Query, type QueryAST, Ref, Tag, type Type } from '@dxos/echo';
11
- import { type JsonPath, type Mutable } from '@dxos/echo/internal';
10
+ import { EID, Filter, JsonSchema, Obj, Query, type QueryAST, Ref, Scope, Tag, type Type } from '@dxos/echo';
11
+ import { type Mutable } from '@dxos/echo/Obj';
12
+ import { SchemaEx } from '@dxos/effect';
12
13
  import { useObject, useQuery } from '@dxos/react-client/echo';
13
14
  import { IconButton, type ThemedClassName, useAsyncEffect, useTranslation } from '@dxos/react-ui';
14
15
  import { Form, ViewEditor } from '@dxos/react-ui-form';
@@ -55,7 +56,7 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
55
56
  return;
56
57
  }
57
58
 
58
- const foundType = await resolveSchemaWithRegistry(db.schemaRegistry, view.query.ast);
59
+ const foundType = await resolveSchemaWithRegistry(db, view.query.ast);
59
60
  if (foundType && foundType !== type) {
60
61
  setType(() => foundType);
61
62
  }
@@ -70,17 +71,17 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
70
71
  );
71
72
 
72
73
  const handleQueryChanged = useCallback(
73
- async (newQuery: QueryAST.Query, target?: EchoURI.EchoURI) => {
74
+ async (newQuery: QueryAST.Query, target?: EID.EID) => {
74
75
  if (!view || !db) {
75
76
  return;
76
77
  }
77
78
 
78
79
  const queue = target;
79
- const query = queue ? Query.fromAst(newQuery).from({ feeds: [queue] }) : Query.fromAst(newQuery);
80
+ const query = queue ? Query.fromAst(newQuery).from([Scope.feed(String(queue))]) : Query.fromAst(newQuery);
80
81
  updateView((view) => {
81
82
  view.query.ast = query.ast as Mutable<typeof query.ast>;
82
83
  });
83
- const newType = await resolveSchemaWithRegistry(db.schemaRegistry, query.ast);
84
+ const newType = await resolveSchemaWithRegistry(db, query.ast);
84
85
  if (!newType) {
85
86
  return;
86
87
  }
@@ -100,8 +101,8 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
100
101
 
101
102
  const handleColumnValuesChanged = useCallback(
102
103
  (column: Pipeline.Column) =>
103
- (newValues: { name?: string }, { changed }: { changed: Record<JsonPath, boolean> }) => {
104
- if (changed['name' as JsonPath]) {
104
+ (newValues: { name?: string }, { changed }: { changed: Record<SchemaEx.JsonPath, boolean> }) => {
105
+ if (changed['name' as SchemaEx.JsonPath]) {
105
106
  const columnIndex = columns.findIndex((c) => c === column);
106
107
  if (columnIndex === -1) {
107
108
  return;
@@ -204,20 +205,18 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
204
205
  <Form.FieldSet />
205
206
  </Form.Content>
206
207
  </Form.Root>
207
- {type && (
208
- <ViewEditor
209
- ref={projectionRef}
210
- mode='tag'
211
- readonly
212
- type={type}
213
- view={column.view.target}
214
- registry={db?.schemaRegistry}
215
- db={db}
216
- tags={tags}
217
- types={types}
218
- onQueryChanged={handleQueryChanged}
219
- />
220
- )}
208
+ <ViewEditor
209
+ ref={projectionRef}
210
+ mode='tag'
211
+ readonly
212
+ type={type}
213
+ view={column.view.target}
214
+ registry={db?.graph.registry}
215
+ db={db}
216
+ tags={tags}
217
+ types={types}
218
+ onQueryChanged={handleQueryChanged}
219
+ />
221
220
  </div>
222
221
  )}
223
222
  </List.Item>
@@ -8,7 +8,6 @@ import { useMemo } from 'react';
8
8
 
9
9
  import { getQueryTarget } from '@dxos/app-toolkit/query';
10
10
  import { Obj, Query } from '@dxos/echo';
11
- import { AtomObj, AtomQuery } from '@dxos/echo-atom';
12
11
  import { getSpace, isSpace } from '@dxos/react-client/echo';
13
12
  import { type BoardModel } from '@dxos/react-ui-mosaic';
14
13
  import { Pipeline } from '@dxos/types';
@@ -23,7 +22,7 @@ export const usePipelineBoardModel = (
23
22
  }
24
23
 
25
24
  const space = getSpace(pipeline);
26
- const columnsAtom = AtomObj.makeProperty(pipeline, 'columns');
25
+ const columnsAtom = Obj.atomProperty(pipeline, 'columns');
27
26
  const columnAtomFamily = Atom.family<string, Atom.Atom<Pipeline.Column | undefined>>((viewKey: string) =>
28
27
  Atom.make((get) => {
29
28
  const columns = get(columnsAtom);
@@ -37,7 +36,7 @@ export const usePipelineBoardModel = (
37
36
  if (column == null) {
38
37
  return [];
39
38
  }
40
- const viewSnapshot = get(AtomObj.make(column.view));
39
+ const viewSnapshot = get(Obj.atom(column.view));
41
40
  if (!viewSnapshot?.query?.ast) {
42
41
  return [];
43
42
  }
@@ -46,7 +45,7 @@ export const usePipelineBoardModel = (
46
45
  if (!queryTarget) {
47
46
  return [];
48
47
  }
49
- const raw = get(AtomQuery.make(queryTarget, query));
48
+ const raw = get(queryTarget.query(query).atom);
50
49
  return isSpace(queryTarget) ? raw : [...raw].reverse();
51
50
  }),
52
51
  );
package/src/meta.ts CHANGED
@@ -2,11 +2,12 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type Plugin } from '@dxos/app-framework';
5
+ import { Plugin } from '@dxos/app-framework';
6
+ import { DXN } from '@dxos/keys';
6
7
  import { trim } from '@dxos/util';
7
8
 
8
- export const meta: Plugin.Meta = {
9
- id: 'org.dxos.plugin.pipeline',
9
+ export const meta = Plugin.makeMeta({
10
+ key: DXN.make('org.dxos.plugin.pipeline'),
10
11
  name: 'Pipelines',
11
12
  author: 'DXOS',
12
13
  description: trim`
@@ -28,4 +29,4 @@ export const meta: Plugin.Meta = {
28
29
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-pipeline',
29
30
  spec: 'PLUGIN.mdl',
30
31
  tags: ['labs'],
31
- };
32
+ });
@@ -0,0 +1,10 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ //
4
+ // Copyright 2026 DXOS.org
5
+ //
6
+
7
+ declare module '*.mdl?raw' {
8
+ const content: string;
9
+ export default content;
10
+ }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/containers/PipelineProperties/PipelineProperties.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { resolveSchemaWithRegistry } from '@dxos/app-toolkit/query';\nimport { useTypeOptions } from '@dxos/app-toolkit/ui';\nimport { EchoURI, Filter, JsonSchema, Obj, Query, type QueryAST, Ref, Tag, type Type } from '@dxos/echo';\nimport { type JsonPath, type Mutable } from '@dxos/echo/internal';\nimport { useObject, useQuery } from '@dxos/react-client/echo';\nimport { IconButton, type ThemedClassName, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Form, ViewEditor } from '@dxos/react-ui-form';\nimport { List } from '@dxos/react-ui-list';\nimport { type ProjectionModel, ViewModel } from '@dxos/schema';\nimport { Pipeline } from '@dxos/types';\nimport { mx, osTranslations } from '@dxos/ui-theme';\nimport { arrayMove } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nconst listGrid = 'grid grid-cols-[min-content_1fr_min-content_min-content_min-content]';\nconst listItemGrid = 'grid grid-cols-subgrid col-span-5';\n\nconst ColumnFormSchema = Pipeline.Column.pipe(Schema.mutable, Schema.pick('name'));\n\nexport type PipelinePropertiesProps = ThemedClassName<{\n pipeline: Pipeline.Pipeline;\n}>;\n\n/**\n * Supports editing the pipeline view.\n */\nexport const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesProps) => {\n const { t } = useTranslation(meta.id);\n const db = Obj.getDatabase(pipeline);\n const [expandedId, setExpandedId] = useState<string>();\n const [columns, updateColumns] = useObject(pipeline, 'columns');\n const column = useMemo(() => columns.find((column) => column.view.uri === expandedId), [columns, expandedId]);\n const [view, updateView] = useObject(column?.view);\n const [type, setType] = useState<Type.AnyEntity>();\n const projectionRef = useRef<ProjectionModel>(null);\n const tags = useQuery(db, Filter.type(Tag.Tag));\n const types = useTypeOptions({\n db,\n annotation: {\n location: ['database', 'runtime'],\n kind: ['user'],\n },\n });\n\n useAsyncEffect(async () => {\n if (!view?.query || !db) {\n return;\n }\n\n const foundType = await resolveSchemaWithRegistry(db.schemaRegistry, view.query.ast);\n if (foundType && foundType !== type) {\n setType(() => foundType);\n }\n }, [db, view, type]);\n\n const handleMove = useCallback(\n (fromIndex: number, toIndex: number) =>\n updateColumns((columns) => {\n arrayMove(columns, fromIndex, toIndex);\n }),\n [updateColumns],\n );\n\n const handleQueryChanged = useCallback(\n async (newQuery: QueryAST.Query, target?: EchoURI.EchoURI) => {\n if (!view || !db) {\n return;\n }\n\n const queue = target;\n const query = queue ? Query.fromAst(newQuery).from({ feeds: [queue] }) : Query.fromAst(newQuery);\n updateView((view) => {\n view.query.ast = query.ast as Mutable<typeof query.ast>;\n });\n const newType = await resolveSchemaWithRegistry(db.schemaRegistry, query.ast);\n if (!newType) {\n return;\n }\n\n const newView = ViewModel.make({\n query,\n jsonSchema: newType.jsonSchema,\n });\n updateView((view) => {\n view.projection = Obj.getSnapshot(newView).projection as Mutable<typeof view.projection>;\n });\n\n setType(() => newType);\n },\n [db, view, updateView, type],\n );\n\n const handleColumnValuesChanged = useCallback(\n (column: Pipeline.Column) =>\n (newValues: { name?: string }, { changed }: { changed: Record<JsonPath, boolean> }) => {\n if (changed['name' as JsonPath]) {\n const columnIndex = columns.findIndex((c) => c === column);\n if (columnIndex === -1) {\n return;\n }\n updateColumns((cols) => {\n cols[columnIndex].name = newValues.name ?? '';\n });\n }\n },\n [columns, updateColumns],\n );\n\n const handleToggleField = useCallback((column: Pipeline.Column) => {\n setExpandedId((prevExpandedId) => (prevExpandedId === column.view.uri ? undefined : column.view.uri));\n }, []);\n\n const handleDelete = useCallback(\n async (column: Pipeline.Column) => {\n if (column.view.uri === expandedId) {\n setExpandedId(undefined);\n }\n\n const index = columns.findIndex((l) => l === column);\n const viewToRemove = await column.view.load();\n updateColumns((columns) => {\n columns.splice(index, 1);\n });\n db?.remove(viewToRemove);\n },\n [expandedId, columns, updateColumns, db],\n );\n\n const handleAdd = useCallback(() => {\n if (!db) {\n return;\n }\n const newView = ViewModel.make({\n query: Query.select(Filter.nothing()),\n jsonSchema: JsonSchema.toJsonSchema(Schema.Struct({})),\n });\n db.add(newView);\n updateColumns((columns) => {\n columns.push({\n name: '',\n // Type assertion needed due to QueryAST type variance.\n view: Ref.make(newView) as (typeof columns)[number]['view'],\n order: [],\n });\n });\n setExpandedId(newView.id);\n }, [db, updateColumns]);\n\n return (\n <div className={mx('py-form-padding overflow-y-auto', classNames)}>\n <h2 className='text-sm text-description py-1'>{t('views.label')}</h2>\n\n <List.Root<Pipeline.Column>\n items={columns}\n isItem={Schema.is(Pipeline.Column)}\n getId={(column) => column.view.uri}\n onMove={handleMove}\n >\n {({ items: columns }) => (\n <>\n <div role='list' className={mx(listGrid)}>\n {columns.map((column) => (\n <List.Item<Pipeline.Column>\n key={column.view.uri}\n item={column}\n classNames={listItemGrid}\n aria-expanded={expandedId === column.view.uri}\n >\n <div className={mx(listItemGrid, 'dx-hover rounded-xs cursor-pointer min-h-10')}>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleToggleField(column)}>\n {column.name || t('untitled-view.title')}\n </List.ItemTitle>\n <List.ItemDeleteButton\n label={t('delete-view.label')}\n autoHide={false}\n onClick={() => handleDelete(column)}\n data-testid='view.delete'\n />\n <IconButton\n iconOnly\n variant='ghost'\n label={t('toggle-expand.label', { ns: osTranslations })}\n icon={expandedId === column.view.uri ? 'ph--caret-down--regular' : 'ph--caret-right--regular'}\n onClick={() => handleToggleField(column)}\n />\n </div>\n {expandedId === column.view.uri && column?.view.target && (\n <div className='col-span-5 my-2 border border-separator rounded-md'>\n <Form.Root\n schema={ColumnFormSchema}\n values={column}\n onValuesChanged={handleColumnValuesChanged(column)}\n >\n <Form.Content>\n <Form.FieldSet />\n </Form.Content>\n </Form.Root>\n {type && (\n <ViewEditor\n ref={projectionRef}\n mode='tag'\n readonly\n type={type}\n view={column.view.target}\n registry={db?.schemaRegistry}\n db={db}\n tags={tags}\n types={types}\n onQueryChanged={handleQueryChanged}\n />\n )}\n </div>\n )}\n </List.Item>\n ))}\n </div>\n </>\n )}\n </List.Root>\n\n <div className='my-form-padding'>\n <IconButton icon='ph--plus--regular' label={t('add-view.label')} onClick={handleAdd} classNames='w-full' />\n </div>\n </div>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["Schema", "React", "useCallback", "useMemo", "useRef", "useState", "resolveSchemaWithRegistry", "useTypeOptions", "Filter", "JsonSchema", "Obj", "Query", "Ref", "Tag", "useObject", "useQuery", "IconButton", "useAsyncEffect", "useTranslation", "Form", "ViewEditor", "List", "ViewModel", "Pipeline", "mx", "osTranslations", "arrayMove", "meta", "listGrid", "listItemGrid", "ColumnFormSchema", "Column", "pipe", "mutable", "pick", "PipelineProperties", "classNames", "pipeline", "t", "id", "db", "getDatabase", "expandedId", "setExpandedId", "columns", "updateColumns", "column", "find", "view", "uri", "updateView", "type", "setType", "projectionRef", "tags", "types", "annotation", "location", "kind", "query", "foundType", "schemaRegistry", "ast", "handleMove", "fromIndex", "toIndex", "handleQueryChanged", "newQuery", "target", "queue", "fromAst", "from", "feeds", "newType", "newView", "make", "jsonSchema", "projection", "getSnapshot", "handleColumnValuesChanged", "newValues", "changed", "columnIndex", "findIndex", "c", "cols", "name", "handleToggleField", "prevExpandedId", "undefined", "handleDelete", "index", "l", "viewToRemove", "load", "splice", "remove", "handleAdd", "select", "nothing", "toJsonSchema", "Struct", "add", "push", "order", "div", "className", "h2", "Root", "items", "isItem", "is", "getId", "onMove", "role", "map", "Item", "key", "item", "aria-expanded", "ItemDragHandle", "ItemTitle", "onClick", "ItemDeleteButton", "label", "autoHide", "data-testid", "iconOnly", "variant", "ns", "icon", "schema", "values", "onValuesChanged", "Content", "FieldSet", "ref", "mode", "readonly", "registry", "onQueryChanged"]
7
- }
@@ -1,7 +0,0 @@
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 meta: Plugin.Meta = {\n id: 'org.dxos.plugin.pipeline',\n name: 'Pipelines',\n author: 'DXOS',\n description: trim`\n A multi-column Kanban-style pipeline plugin for DXOS Composer.\n Each Pipeline holds an ordered set of Columns; each Column is backed by a ViewModel whose query\n can select any ECHO object type — messages, contacts, documents, or custom types — from the active space.\n\n Columns are fully configurable through the Settings companion panel, where users can add, rename,\n reorder, and delete columns and edit the underlying query and projection for each column.\n Objects can be dragged between columns and the full pipeline state, including column order and\n per-column item order, persists collaboratively via ECHO.\n\n A built-in Research template scaffolds a four-column pipeline wired to the Mailbox, Contacts,\n Organizations, and Notes objects in the space, providing an out-of-the-box CRM-style workflow.\n Pipeline articles also expose Invocations and Automation companion tabs for AI-driven automation.\n `,\n icon: 'ph--path--regular',\n iconHue: 'purple',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-pipeline',\n spec: 'PLUGIN.mdl',\n tags: ['labs'],\n};\n"],
5
- "mappings": ";AAKA,SAASA,YAAY;AAEd,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,QAAQ;EACRC,aAAaL;;;;;;;;;;;;;;EAcbM,MAAM;EACNC,SAAS;EACTC,QAAQ;EACRC,MAAM;EACNC,MAAM;IAAC;;AACT;",
6
- "names": ["trim", "meta", "id", "name", "author", "description", "icon", "iconHue", "source", "spec", "tags"]
7
- }