@dxos/plugin-pipeline 0.8.3-main.ef1bc66f44 → 0.8.4-main.2244d791bb

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 (48) hide show
  1. package/dist/lib/browser/{PipelineContainer-TRO66W6L.mjs → PipelineContainer-2BRZPECS.mjs} +126 -53
  2. package/dist/lib/browser/PipelineContainer-2BRZPECS.mjs.map +7 -0
  3. package/dist/lib/browser/{PipelineSettings-EBR3UU5C.mjs → PipelineSettings-R54RTVWZ.mjs} +41 -32
  4. package/dist/lib/browser/PipelineSettings-R54RTVWZ.mjs.map +7 -0
  5. package/dist/lib/browser/{app-graph-builder-NKUZQ6A7.mjs → app-graph-builder-NUJB33F7.mjs} +8 -7
  6. package/dist/lib/browser/app-graph-builder-NUJB33F7.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-XDHJKK7D.mjs → chunk-7GVESVYR.mjs} +2 -2
  8. package/dist/lib/browser/{chunk-J5YNPKHT.mjs → chunk-QWNKLHBY.mjs} +3 -3
  9. package/dist/lib/browser/{chunk-J5YNPKHT.mjs.map → chunk-QWNKLHBY.mjs.map} +1 -1
  10. package/dist/lib/browser/index.mjs +30 -29
  11. package/dist/lib/browser/index.mjs.map +3 -3
  12. package/dist/lib/browser/meta.json +1 -1
  13. package/dist/lib/browser/{react-surface-CH2SUJTQ.mjs → react-surface-CMTEEE6F.mjs} +11 -10
  14. package/dist/lib/browser/react-surface-CMTEEE6F.mjs.map +7 -0
  15. package/dist/lib/browser/types/index.mjs +2 -2
  16. package/dist/types/src/PipelinePlugin.d.ts.map +1 -1
  17. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
  18. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
  19. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  20. package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
  21. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
  22. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
  23. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  24. package/dist/types/src/components/PipelineColumn.d.ts +3 -4
  25. package/dist/types/src/components/PipelineColumn.d.ts.map +1 -1
  26. package/dist/types/src/components/PipelineComponent.d.ts +13 -7
  27. package/dist/types/src/components/PipelineComponent.d.ts.map +1 -1
  28. package/dist/types/src/components/PipelineComponent.stories.d.ts +11 -11
  29. package/dist/types/src/components/PipelineComponent.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/PipelineContainer.d.ts +1 -1
  31. package/dist/types/src/components/PipelineContainer.d.ts.map +1 -1
  32. package/dist/types/src/components/PipelineContainer.stories.d.ts +11 -11
  33. package/dist/types/src/components/PipelineContainer.stories.d.ts.map +1 -1
  34. package/dist/types/src/components/PipelineSettings.d.ts.map +1 -1
  35. package/dist/types/src/translations.d.ts +11 -11
  36. package/dist/types/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +39 -38
  38. package/src/components/PipelineColumn.tsx +32 -32
  39. package/src/components/PipelineComponent.stories.tsx +11 -4
  40. package/src/components/PipelineComponent.tsx +100 -17
  41. package/src/components/PipelineContainer.stories.tsx +5 -5
  42. package/src/components/PipelineContainer.tsx +6 -2
  43. package/src/components/PipelineSettings.tsx +35 -30
  44. package/dist/lib/browser/PipelineContainer-TRO66W6L.mjs.map +0 -7
  45. package/dist/lib/browser/PipelineSettings-EBR3UU5C.mjs.map +0 -7
  46. package/dist/lib/browser/app-graph-builder-NKUZQ6A7.mjs.map +0 -7
  47. package/dist/lib/browser/react-surface-CH2SUJTQ.mjs.map +0 -7
  48. /package/dist/lib/browser/{chunk-XDHJKK7D.mjs.map → chunk-7GVESVYR.mjs.map} +0 -0
@@ -1,35 +1,47 @@
1
1
  import {
2
2
  meta
3
- } from "./chunk-J5YNPKHT.mjs";
3
+ } from "./chunk-QWNKLHBY.mjs";
4
4
 
5
5
  // src/components/PipelineContainer.tsx
6
6
  import React3, { useCallback } from "react";
7
- import { useOperationInvoker } from "@dxos/app-framework/react";
8
- import { Surface } from "@dxos/app-framework/react";
9
- import { Obj as Obj2 } from "@dxos/echo";
7
+ import { Capabilities } from "@dxos/app-framework";
8
+ import { useCapability } from "@dxos/app-framework/ui";
9
+ import { useOperationInvoker } from "@dxos/app-framework/ui";
10
+ import { Surface } from "@dxos/app-framework/ui";
11
+ import { Obj as Obj3 } from "@dxos/echo";
10
12
  import { ATTENDABLE_PATH_SEPARATOR, DeckOperation } from "@dxos/plugin-deck/types";
13
+ import { Layout } from "@dxos/react-ui";
11
14
  import { useAttention } from "@dxos/react-ui-attention";
12
- import { Layout } from "@dxos/react-ui-mosaic";
13
15
 
14
16
  // src/components/PipelineComponent.tsx
17
+ import { Atom, useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
15
18
  import { createContext } from "@radix-ui/react-context";
16
- import React2 from "react";
17
- import { useObject as useObject2 } from "@dxos/react-client/echo";
19
+ import * as Schema from "effect/Schema";
20
+ import React2, { useMemo as useMemo2 } from "react";
21
+ import { Obj as Obj2, Query as Query2 } from "@dxos/echo";
22
+ import { AtomObj, AtomQuery } from "@dxos/echo-atom";
23
+ import { getQueryTarget } from "@dxos/plugin-space";
24
+ import { getSpace as getSpace2, isSpace } from "@dxos/react-client/echo";
18
25
  import { Toolbar, useTranslation as useTranslation2 } from "@dxos/react-ui";
19
- import { Stack } from "@dxos/react-ui-stack";
26
+ import { Board as Board2, useBoard as useBoard2, useEventHandlerAdapter } from "@dxos/react-ui-mosaic";
27
+ import { Pipeline } from "@dxos/types";
20
28
 
21
29
  // src/components/PipelineColumn.tsx
30
+ import { useAtomValue } from "@effect-atom/atom-react";
22
31
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
23
32
  import React, { forwardRef, useMemo, useRef, useState } from "react";
24
33
  import { Obj, Query, Type } from "@dxos/echo";
25
- import { getQueryTarget, resolveSchemaWithRegistry } from "@dxos/plugin-space";
26
- import { Filter, getSpace, isSpace, useObject, useQuery } from "@dxos/react-client/echo";
34
+ import { resolveSchemaWithRegistry } from "@dxos/plugin-space";
35
+ import { Filter, getSpace, useObject } from "@dxos/react-client/echo";
27
36
  import { useAsyncEffect, useTranslation } from "@dxos/react-ui";
28
- import { Card, Focus, Mosaic } from "@dxos/react-ui-mosaic";
37
+ import { Board, Card, Focus, Mosaic, useBoard } from "@dxos/react-ui-mosaic";
29
38
  import { ProjectionModel, createEchoChangeCallback } from "@dxos/schema";
39
+ import { mx } from "@dxos/ui-theme";
30
40
  var PIPELINE_COLUMN_NAME = "PipelineColumn";
31
- var PipelineColumn = ({ column }) => {
41
+ var PipelineColumn = ({ data: column, location, classNames, debug }) => {
32
42
  const { t } = useTranslation(meta.id);
43
+ const { model } = useBoard(PIPELINE_COLUMN_NAME);
44
+ const items = useAtomValue(model.items(column));
33
45
  const [viewSnapshot] = useObject(column.view);
34
46
  const view = column.view.target;
35
47
  const space = getSpace(view);
@@ -45,7 +57,7 @@ var PipelineColumn = ({ column }) => {
45
57
  JSON.stringify(viewSnapshot?.query.ast)
46
58
  ]);
47
59
  useAsyncEffect(async () => {
48
- if (!query || !space) {
60
+ if (!query || !space?.db) {
49
61
  return;
50
62
  }
51
63
  const schema2 = await resolveSchemaWithRegistry(space.db.schemaRegistry, query.ast);
@@ -54,16 +66,6 @@ var PipelineColumn = ({ column }) => {
54
66
  space,
55
67
  query
56
68
  ]);
57
- const queryTarget = getQueryTarget(query.ast, space);
58
- const items = useQuery(queryTarget, query);
59
- const sortedItems = useMemo(() => {
60
- return isSpace(queryTarget) ? items : [
61
- ...items.reverse()
62
- ];
63
- }, [
64
- queryTarget,
65
- items
66
- ]);
67
69
  const projectionModel = useMemo(() => {
68
70
  if (!schema || !view) {
69
71
  return void 0;
@@ -95,23 +97,25 @@ var PipelineColumn = ({ column }) => {
95
97
  if (!view) {
96
98
  return null;
97
99
  }
98
- return /* @__PURE__ */ React.createElement(Focus.Group, {
99
- asChild: true
100
+ const dragHandleRef = useRef(null);
101
+ return /* @__PURE__ */ React.createElement(Board.Column.Root, {
102
+ data: column,
103
+ location,
104
+ classNames,
105
+ debug,
106
+ dragHandleRef
100
107
  }, /* @__PURE__ */ React.createElement("div", {
101
- className: "grid bs-full card-default-width overflow-hidden grid-rows-[min-content_1fr] density-fine border border-separator rounded-md bg-deckSurface"
102
- }, /* @__PURE__ */ React.createElement(Card.Toolbar, null, /* @__PURE__ */ React.createElement(Card.DragHandle, null), /* @__PURE__ */ React.createElement(Card.Title, null, column.name ?? t("untitled view title")), /* @__PURE__ */ React.createElement(Card.Menu, null)), /* @__PURE__ */ React.createElement(Mosaic.Container, {
103
- asChild: true,
104
- axis: "vertical",
105
- withFocus: true
106
- }, /* @__PURE__ */ React.createElement(Mosaic.Viewport, {
107
- axis: "vertical",
108
- padding: true
109
- }, /* @__PURE__ */ React.createElement(Mosaic.Stack, {
110
- axis: "vertical",
111
- items: sortedItems,
112
- getId: (item) => item.id,
108
+ role: "none",
109
+ "data-testid": "board-column",
110
+ className: mx("group/column grid bs-full overflow-hidden grid-rows-[var(--rail-action)_1fr]", classNames)
111
+ }, /* @__PURE__ */ React.createElement(Board.Column.Header, {
112
+ classNames: "border-be border-separator",
113
+ label: column.name ?? t("untitled view title"),
114
+ dragHandleRef
115
+ }), /* @__PURE__ */ React.createElement(Board.Column.Body, {
116
+ data: column,
113
117
  Tile
114
- })))));
118
+ })));
115
119
  };
116
120
  PipelineColumn.displayName = PIPELINE_COLUMN_NAME;
117
121
  var ITEM_TILE_NAME = "ItemTile";
@@ -137,23 +141,89 @@ ItemTile.displayName = ITEM_TILE_NAME;
137
141
  // src/components/PipelineComponent.tsx
138
142
  var itemNoOp = ({ item }) => /* @__PURE__ */ React2.createElement("span", null, item.id);
139
143
  var PIPELINE_ROOT = "Pipeline.Root";
140
- var [PipelineRoot, usePipeline] = createContext(PIPELINE_ROOT, {
144
+ var [PipelineRootContext, usePipeline] = createContext(PIPELINE_ROOT, {
141
145
  Item: itemNoOp
142
146
  });
147
+ var PipelineRoot = ({ model, children, ...contextValue }) => /* @__PURE__ */ React2.createElement(PipelineRootContext, contextValue, /* @__PURE__ */ React2.createElement(Board2.Root, {
148
+ model
149
+ }, children));
143
150
  PipelineRoot.displayName = PIPELINE_ROOT;
151
+ var emptyColumnsAtom = Atom.make(() => []);
152
+ var emptyItemsAtom = Atom.make(() => []);
153
+ var emptyPipelineModel = {
154
+ getColumnId: (data) => data.view.dxn.toString(),
155
+ getItemId: (data) => data.id,
156
+ isColumn: (obj) => Schema.is(Pipeline.Column)(obj),
157
+ isItem: (obj) => Obj2.isObject(obj),
158
+ columns: emptyColumnsAtom,
159
+ items: () => emptyItemsAtom,
160
+ getColumns: () => [],
161
+ getItems: () => []
162
+ };
163
+ var usePipelineBoardModel = (pipeline, registry) => useMemo2(() => {
164
+ if (pipeline == null) {
165
+ return emptyPipelineModel;
166
+ }
167
+ const space = getSpace2(pipeline);
168
+ const columnsAtom = AtomObj.makeProperty(pipeline, "columns");
169
+ const columnAtomFamily = Atom.family((viewKey) => Atom.make((get) => {
170
+ const columns = get(columnsAtom);
171
+ return columns.find((c) => c.view.dxn.toString() === viewKey);
172
+ }));
173
+ const itemsAtomFamily = Atom.family((viewKey) => Atom.make((get) => {
174
+ const column = get(columnAtomFamily(viewKey));
175
+ if (column == null) {
176
+ return [];
177
+ }
178
+ const viewSnapshot = get(AtomObj.make(column.view));
179
+ if (!viewSnapshot?.query?.ast) {
180
+ return [];
181
+ }
182
+ const query = Query2.fromAst(JSON.parse(JSON.stringify(viewSnapshot.query.ast)));
183
+ const queryTarget = space ? getQueryTarget(query.ast, space) : void 0;
184
+ if (!queryTarget) {
185
+ return [];
186
+ }
187
+ const raw = get(AtomQuery.make(queryTarget, query));
188
+ return isSpace(queryTarget) ? raw : [
189
+ ...raw
190
+ ].reverse();
191
+ }));
192
+ return {
193
+ getColumnId: (data) => data.view.dxn.toString(),
194
+ getItemId: (data) => data.id,
195
+ isColumn: (obj) => Schema.is(Pipeline.Column)(obj),
196
+ isItem: (obj) => Obj2.isObject(obj),
197
+ columns: columnsAtom,
198
+ items: (column) => itemsAtomFamily(column.view.dxn.toString()),
199
+ getColumns: () => [
200
+ ...registry.get(columnsAtom)
201
+ ],
202
+ getItems: (column) => registry.get(itemsAtomFamily(column.view.dxn.toString())) ?? []
203
+ };
204
+ }, [
205
+ pipeline,
206
+ registry
207
+ ]);
144
208
  var PIPELINE_CONTENT_NAME = "Pipeline.Content";
145
209
  var PipelineContent = ({ pipeline }) => {
146
- const [columns] = useObject2(pipeline, "columns");
147
- return /* @__PURE__ */ React2.createElement(Stack, {
148
- orientation: "horizontal",
149
- size: "contain",
150
- rail: false
151
- }, columns.map((column) => {
152
- return /* @__PURE__ */ React2.createElement(PipelineColumn, {
153
- key: column.view.dxn.toString(),
154
- column
155
- });
156
- }));
210
+ const { model } = useBoard2(PIPELINE_CONTENT_NAME);
211
+ const columns = useAtomValue2(model.columns);
212
+ const eventHandler = useEventHandlerAdapter({
213
+ id: pipeline.id,
214
+ // TODO(wittjosiah): Cast because columns array is readonly.
215
+ items: columns,
216
+ getId: model.getColumnId,
217
+ get: (data) => data,
218
+ make: (object) => object,
219
+ canDrop: ({ source }) => model.isColumn(source.data),
220
+ onChange: (mutate) => Obj2.change(pipeline, (p) => mutate(p.columns))
221
+ });
222
+ return /* @__PURE__ */ React2.createElement(Board2.Content, {
223
+ id: "pipeline",
224
+ eventHandler,
225
+ Tile: PipelineColumn
226
+ });
157
227
  };
158
228
  PipelineContent.displayName = PIPELINE_CONTENT_NAME;
159
229
  var PIPELINE_TOOLBAR_NAME = "Pipeline.Toolbar";
@@ -176,8 +246,10 @@ var PipelineComponent = {
176
246
 
177
247
  // src/components/PipelineContainer.tsx
178
248
  var PipelineContainer = ({ role, subject: pipeline }) => {
249
+ const registry = useCapability(Capabilities.AtomRegistry);
250
+ const model = usePipelineBoardModel(pipeline, registry);
179
251
  const { invokePromise } = useOperationInvoker();
180
- const attendableId = Obj2.getDXN(pipeline).toString();
252
+ const attendableId = Obj3.getDXN(pipeline).toString();
181
253
  const { hasAttention } = useAttention(attendableId);
182
254
  const handleColumnAdd = useCallback(() => invokePromise(DeckOperation.ChangeCompanion, {
183
255
  primary: attendableId,
@@ -191,6 +263,7 @@ var PipelineContainer = ({ role, subject: pipeline }) => {
191
263
  toolbar: true
192
264
  }, /* @__PURE__ */ React3.createElement(PipelineComponent.Root, {
193
265
  Item: PipelineItem,
266
+ model,
194
267
  onAddColumn: handleColumnAdd
195
268
  }, /* @__PURE__ */ React3.createElement(PipelineComponent.Toolbar, {
196
269
  disabled: !hasAttention
@@ -199,7 +272,7 @@ var PipelineContainer = ({ role, subject: pipeline }) => {
199
272
  })));
200
273
  };
201
274
  var PipelineItem = ({ item, projectionModel }) => {
202
- return /* @__PURE__ */ React3.createElement(Surface, {
275
+ return /* @__PURE__ */ React3.createElement(Surface.Surface, {
203
276
  role: "card--content",
204
277
  data: {
205
278
  subject: item,
@@ -213,4 +286,4 @@ export {
213
286
  PipelineContainer,
214
287
  PipelineContainer_default as default
215
288
  };
216
- //# sourceMappingURL=PipelineContainer-TRO66W6L.mjs.map
289
+ //# sourceMappingURL=PipelineContainer-2BRZPECS.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/PipelineContainer.tsx", "../../../src/components/PipelineComponent.tsx", "../../../src/components/PipelineColumn.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { Capabilities } from '@dxos/app-framework';\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { Surface } from '@dxos/app-framework/ui';\nimport { type SurfaceComponentProps } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { ATTENDABLE_PATH_SEPARATOR, DeckOperation } from '@dxos/plugin-deck/types';\nimport { Layout } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { type Pipeline as PipelineType } from '@dxos/types';\n\nimport { type ItemProps, PipelineComponent, usePipelineBoardModel } from './PipelineComponent';\n\nexport type PipelineContainerProps = SurfaceComponentProps<PipelineType.Pipeline>;\n\nexport const PipelineContainer = ({ role, subject: pipeline }: PipelineContainerProps) => {\n const registry = useCapability(Capabilities.AtomRegistry);\n const model = usePipelineBoardModel(pipeline, registry);\n const { invokePromise } = useOperationInvoker();\n const attendableId = Obj.getDXN(pipeline).toString();\n const { hasAttention } = useAttention(attendableId);\n\n const handleColumnAdd = useCallback(\n () =>\n invokePromise(DeckOperation.ChangeCompanion, {\n primary: attendableId,\n companion: `${attendableId}${ATTENDABLE_PATH_SEPARATOR}settings`,\n }),\n [invokePromise, attendableId],\n );\n\n return (\n <Layout.Main role={role} toolbar>\n <PipelineComponent.Root Item={PipelineItem} model={model} onAddColumn={handleColumnAdd}>\n <PipelineComponent.Toolbar disabled={!hasAttention} />\n <PipelineComponent.Content pipeline={pipeline} />\n </PipelineComponent.Root>\n </Layout.Main>\n );\n};\n\nconst PipelineItem = ({ item, projectionModel }: ItemProps) => {\n return (\n <Surface.Surface\n role='card--content'\n data={{\n subject: item,\n projection: projectionModel,\n }}\n limit={1}\n />\n );\n};\n\nexport default PipelineContainer;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, type Registry, useAtomValue } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport * as Schema from 'effect/Schema';\nimport React, { type FC, type PropsWithChildren, useMemo } from 'react';\n\nimport { Obj, Query } from '@dxos/echo';\nimport { AtomObj, AtomQuery } from '@dxos/echo-atom';\nimport { getQueryTarget } from '@dxos/plugin-space';\nimport { getSpace, isSpace } from '@dxos/react-client/echo';\nimport { Toolbar, type ToolbarRootProps, useTranslation } from '@dxos/react-ui';\nimport { Board, type BoardModel, useBoard, useEventHandlerAdapter } from '@dxos/react-ui-mosaic';\nimport { type ProjectionModel } from '@dxos/schema';\nimport { Pipeline, type Pipeline as PipelineType } from '@dxos/types';\n\nimport { meta } from '../meta';\n\nimport { PipelineColumn } from './PipelineColumn';\n\ntype ItemProps = {\n item: Obj.Unknown;\n projectionModel?: ProjectionModel;\n};\n\nconst itemNoOp = ({ item }: ItemProps) => <span>{item.id}</span>;\n\ntype PipelineContextValue = {\n Item: FC<ItemProps>;\n // TODO(wittjosiah): Support adding items.\n // If the created item doesn't match the current query, it will not be visible.\n // onAddItem?: (schema: Schema.Schema.AnyNoContext) => void;\n onAddColumn?: () => void;\n};\n\n//\n// Root\n//\n\ntype PipelineRootProps = PropsWithChildren<\n PipelineContextValue & {\n model: BoardModel<PipelineType.Column, Obj.Unknown>;\n }\n>;\n\nconst PIPELINE_ROOT = 'Pipeline.Root';\n\nconst [PipelineRootContext, usePipeline] = createContext<PipelineContextValue>(PIPELINE_ROOT, {\n Item: itemNoOp,\n});\n\nconst PipelineRoot = ({ model, children, ...contextValue }: PipelineRootProps) => (\n <PipelineRootContext {...contextValue}>\n <Board.Root model={model}>{children}</Board.Root>\n </PipelineRootContext>\n);\n\nPipelineRoot.displayName = PIPELINE_ROOT;\n\n//\n// usePipelineBoardModel\n//\n\nconst emptyColumnsAtom = Atom.make(() => [] as PipelineType.Column[]);\nconst emptyItemsAtom = Atom.make(() => [] as Obj.Unknown[]);\nconst emptyPipelineModel: BoardModel<PipelineType.Column, Obj.Unknown> = {\n getColumnId: (data) => (data as PipelineType.Column).view.dxn.toString(),\n getItemId: (data) => (data as Obj.Unknown).id,\n isColumn: (obj: unknown): obj is PipelineType.Column => Schema.is(Pipeline.Column)(obj),\n isItem: (obj): obj is Obj.Unknown => Obj.isObject(obj),\n columns: emptyColumnsAtom,\n items: () => emptyItemsAtom,\n getColumns: () => [],\n getItems: () => [],\n};\n\nconst usePipelineBoardModel = (\n pipeline: PipelineType.Pipeline | undefined,\n registry: Registry.Registry,\n): BoardModel<PipelineType.Column, Obj.Unknown> =>\n useMemo<BoardModel<PipelineType.Column, Obj.Unknown>>(() => {\n if (pipeline == null) {\n return emptyPipelineModel;\n }\n const space = getSpace(pipeline);\n const columnsAtom = AtomObj.makeProperty(pipeline, 'columns');\n const columnAtomFamily = Atom.family<string, Atom.Atom<PipelineType.Column | undefined>>((viewKey: string) =>\n Atom.make((get) => {\n const columns = get(columnsAtom);\n return columns.find((c) => c.view.dxn.toString() === viewKey);\n }),\n );\n const itemsAtomFamily = Atom.family<string, Atom.Atom<Obj.Unknown[]>>((viewKey: string) =>\n Atom.make((get) => {\n const column = get(columnAtomFamily(viewKey));\n if (column == null) {\n return [];\n }\n const viewSnapshot = get(AtomObj.make(column.view));\n if (!viewSnapshot?.query?.ast) {\n return [];\n }\n const query = Query.fromAst(JSON.parse(JSON.stringify(viewSnapshot.query.ast)));\n const queryTarget = space ? getQueryTarget(query.ast, space) : undefined;\n if (!queryTarget) {\n return [];\n }\n const raw = get(AtomQuery.make(queryTarget, query));\n return isSpace(queryTarget) ? raw : [...raw].reverse();\n }),\n );\n return {\n getColumnId: (data) => (data as PipelineType.Column).view.dxn.toString(),\n getItemId: (data) => (data as Obj.Unknown).id,\n isColumn: (obj: unknown): obj is PipelineType.Column => Schema.is(Pipeline.Column)(obj),\n isItem: (obj: unknown): obj is Obj.Unknown => Obj.isObject(obj),\n columns: columnsAtom,\n items: (column) => itemsAtomFamily(column.view.dxn.toString()),\n getColumns: () => [...registry.get(columnsAtom)],\n getItems: (column) => registry.get(itemsAtomFamily(column.view.dxn.toString())) ?? [],\n };\n }, [pipeline, registry]);\n\n//\n// Content\n//\n\nconst PIPELINE_CONTENT_NAME = 'Pipeline.Content';\n\ntype PipelineContentProps = {\n pipeline: PipelineType.Pipeline;\n};\n\nconst PipelineContent = ({ pipeline }: PipelineContentProps) => {\n const { model } = useBoard(PIPELINE_CONTENT_NAME);\n const columns = useAtomValue(model.columns);\n const eventHandler = useEventHandlerAdapter<PipelineType.Column, Obj.Unknown>({\n id: pipeline.id,\n // TODO(wittjosiah): Cast because columns array is readonly.\n items: columns as any,\n getId: model.getColumnId,\n get: (data) => data as unknown as Obj.Unknown,\n make: (object) => object as unknown as PipelineType.Column,\n canDrop: ({ source }) => model.isColumn(source.data),\n onChange: (mutate) => Obj.change(pipeline, (p) => mutate(p.columns)),\n });\n\n return <Board.Content id='pipeline' eventHandler={eventHandler} Tile={PipelineColumn} />;\n};\n\nPipelineContent.displayName = PIPELINE_CONTENT_NAME;\n\n//\n// Toolbar\n//\n\nconst PIPELINE_TOOLBAR_NAME = 'Pipeline.Toolbar';\n\nexport const PipelineToolbar = (props: ToolbarRootProps) => {\n const { t } = useTranslation(meta.id);\n const { onAddColumn } = usePipeline(PIPELINE_TOOLBAR_NAME);\n\n return (\n <Toolbar.Root {...props}>\n <Toolbar.IconButton icon='ph--plus--regular' iconOnly label={t('add column label')} onClick={onAddColumn} />\n </Toolbar.Root>\n );\n};\n\nPipelineToolbar.displayName = PIPELINE_TOOLBAR_NAME;\n\n//\n// Project\n//\n\nexport const PipelineComponent = {\n Root: PipelineRoot,\n Content: PipelineContent,\n Toolbar: PipelineToolbar,\n};\n\nexport { usePipeline, usePipelineBoardModel };\n\nexport type { ItemProps, PipelineContextValue, PipelineRootProps };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport type * as Schema from 'effect/Schema';\nimport React, { forwardRef, useMemo, useRef, useState } from 'react';\n\nimport { Obj, Query, Type } from '@dxos/echo';\nimport { resolveSchemaWithRegistry } from '@dxos/plugin-space';\nimport { Filter, getSpace, useObject } from '@dxos/react-client/echo';\nimport { useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Board, Card, Focus, Mosaic, type MosaicTileProps, useBoard } from '@dxos/react-ui-mosaic';\nimport { ProjectionModel, createEchoChangeCallback } from '@dxos/schema';\nimport { type Pipeline } from '@dxos/types';\nimport { mx } from '@dxos/ui-theme';\n\nimport { meta } from '../meta';\n\nimport { type ItemProps, usePipeline } from './PipelineComponent';\n\n//\n// PipelineColumn\n//\n\nconst PIPELINE_COLUMN_NAME = 'PipelineColumn';\n\nexport type PipelineColumnProps = Pick<MosaicTileProps<Pipeline.Column>, 'classNames' | 'location' | 'data' | 'debug'>;\n\n// TODO(wittjosiah): Support item DnD reordering (ordering needs to be stored on the view presentation collection).\nexport const PipelineColumn = ({ data: column, location, classNames, debug }: PipelineColumnProps) => {\n const { t } = useTranslation(meta.id);\n const { model } = useBoard<Pipeline.Column, Obj.Unknown>(PIPELINE_COLUMN_NAME);\n const items = useAtomValue(model.items(column));\n // Subscribe to the view target for reactivity.\n const [viewSnapshot] = useObject(column.view);\n const view = column.view.target;\n const space = getSpace(view);\n const { Item } = usePipeline(PIPELINE_COLUMN_NAME);\n const [schema, setSchema] = useState<Schema.Schema.AnyNoContext>();\n const query = useMemo(() => {\n if (!view) {\n return Query.select(Filter.nothing());\n } else {\n // NOTE: Snapshot is required to prevent signal read in prohibited scope.\n // TODO(wittjosiah): Without stringify, filter.filters remains a proxied array.\n return Query.fromAst(JSON.parse(JSON.stringify(viewSnapshot?.query.ast)));\n }\n }, [JSON.stringify(viewSnapshot?.query.ast)]);\n\n useAsyncEffect(async () => {\n if (!query || !space?.db) {\n return;\n }\n\n const schema = await resolveSchemaWithRegistry(space.db.schemaRegistry, query.ast);\n setSchema(() => schema);\n }, [space, query]);\n\n const projectionModel = useMemo(() => {\n if (!schema || !view) {\n return undefined;\n }\n\n // For mutable schemas (EchoSchema), use the live jsonSchema reference for reactivity.\n const jsonSchema = Type.isMutable(schema) ? schema.jsonSchema : Type.toJsonSchema(schema);\n const change = createEchoChangeCallback(view, Type.isMutable(schema) ? schema : undefined);\n return new ProjectionModel({ view, baseSchema: jsonSchema, change });\n }, [schema, view]);\n\n const Tile = useMemo(() => {\n return forwardRef<HTMLDivElement, Pick<MosaicTileProps<Obj.Unknown>, 'classNames' | 'location' | 'data' | 'debug'>>(\n (props, ref) => <ItemTile {...props} ref={ref} itemProps={{ item: props.data, projectionModel }} />,\n );\n }, [Item, projectionModel]);\n\n if (!view) {\n return null;\n }\n\n const dragHandleRef = useRef<HTMLButtonElement>(null);\n\n return (\n <Board.Column.Root\n data={column}\n location={location}\n classNames={classNames}\n debug={debug}\n dragHandleRef={dragHandleRef}\n >\n <div\n role='none'\n data-testid='board-column'\n className={mx('group/column grid bs-full overflow-hidden grid-rows-[var(--rail-action)_1fr]', classNames)}\n >\n <Board.Column.Header\n classNames='border-be border-separator'\n label={column.name ?? t('untitled view title')}\n dragHandleRef={dragHandleRef}\n />\n <Board.Column.Body data={column} Tile={Tile} />\n </div>\n </Board.Column.Root>\n );\n};\n\nPipelineColumn.displayName = PIPELINE_COLUMN_NAME;\n\n//\n// ItemTile\n//\n\nconst ITEM_TILE_NAME = 'ItemTile';\n\ntype ItemTileProps = Pick<MosaicTileProps<Obj.Unknown>, 'classNames' | 'location' | 'data' | 'debug'> & {\n itemProps: ItemProps;\n};\n\nconst ItemTile = forwardRef<HTMLDivElement, ItemTileProps>(\n ({ classNames, data, location, debug, itemProps }, forwardedRef) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n const { Item } = usePipeline(ITEM_TILE_NAME);\n\n return (\n <Mosaic.Tile asChild id={data.id} data={data} location={location} debug={debug}>\n <Focus.Group asChild>\n <Card.Root classNames={classNames} ref={composedRef}>\n <Card.Toolbar>\n <Card.DragHandle />\n <Card.Title>{Obj.getLabel(data)}</Card.Title>\n <Card.Menu />\n </Card.Toolbar>\n <Card.Content>\n <Item {...itemProps} />\n </Card.Content>\n </Card.Root>\n </Focus.Group>\n </Mosaic.Tile>\n );\n },\n);\n\nItemTile.displayName = ITEM_TILE_NAME;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "Capabilities", "useCapability", "useOperationInvoker", "Surface", "Obj", "ATTENDABLE_PATH_SEPARATOR", "DeckOperation", "Layout", "useAttention", "Atom", "useAtomValue", "createContext", "Schema", "React", "useMemo", "Obj", "Query", "AtomObj", "AtomQuery", "getQueryTarget", "getSpace", "isSpace", "Toolbar", "useTranslation", "Board", "useBoard", "useEventHandlerAdapter", "Pipeline", "useAtomValue", "useComposedRefs", "React", "forwardRef", "useMemo", "useRef", "useState", "Obj", "Query", "Type", "resolveSchemaWithRegistry", "Filter", "getSpace", "useObject", "useAsyncEffect", "useTranslation", "Board", "Card", "Focus", "Mosaic", "useBoard", "ProjectionModel", "createEchoChangeCallback", "mx", "PIPELINE_COLUMN_NAME", "PipelineColumn", "data", "column", "location", "classNames", "debug", "t", "useTranslation", "meta", "id", "model", "useBoard", "items", "useAtomValue", "viewSnapshot", "useObject", "view", "target", "space", "getSpace", "Item", "usePipeline", "schema", "setSchema", "useState", "query", "useMemo", "Query", "select", "Filter", "nothing", "fromAst", "JSON", "parse", "stringify", "ast", "useAsyncEffect", "db", "resolveSchemaWithRegistry", "schemaRegistry", "projectionModel", "undefined", "jsonSchema", "Type", "isMutable", "toJsonSchema", "change", "createEchoChangeCallback", "ProjectionModel", "baseSchema", "Tile", "forwardRef", "props", "ref", "ItemTile", "itemProps", "item", "dragHandleRef", "useRef", "Board", "Column", "Root", "div", "role", "data-testid", "className", "mx", "Header", "label", "name", "Body", "displayName", "ITEM_TILE_NAME", "forwardedRef", "rootRef", "composedRef", "useComposedRefs", "Mosaic", "asChild", "Focus", "Group", "Card", "Toolbar", "DragHandle", "Title", "Obj", "getLabel", "Menu", "Content", "itemNoOp", "item", "React", "span", "id", "PIPELINE_ROOT", "PipelineRootContext", "usePipeline", "createContext", "Item", "PipelineRoot", "model", "children", "contextValue", "Board", "Root", "displayName", "emptyColumnsAtom", "Atom", "make", "emptyItemsAtom", "emptyPipelineModel", "getColumnId", "data", "view", "dxn", "toString", "getItemId", "isColumn", "obj", "is", "Pipeline", "Column", "isItem", "Obj", "isObject", "columns", "items", "getColumns", "getItems", "usePipelineBoardModel", "pipeline", "registry", "useMemo", "space", "getSpace", "columnsAtom", "AtomObj", "makeProperty", "columnAtomFamily", "family", "viewKey", "get", "find", "c", "itemsAtomFamily", "column", "viewSnapshot", "query", "ast", "Query", "fromAst", "JSON", "parse", "stringify", "queryTarget", "getQueryTarget", "undefined", "raw", "AtomQuery", "isSpace", "reverse", "PIPELINE_CONTENT_NAME", "PipelineContent", "useBoard", "useAtomValue", "eventHandler", "useEventHandlerAdapter", "getId", "object", "canDrop", "source", "onChange", "mutate", "change", "p", "Content", "Tile", "PipelineColumn", "PIPELINE_TOOLBAR_NAME", "PipelineToolbar", "props", "t", "useTranslation", "meta", "onAddColumn", "Toolbar", "IconButton", "icon", "iconOnly", "label", "onClick", "PipelineComponent", "PipelineContainer", "role", "subject", "pipeline", "registry", "useCapability", "Capabilities", "AtomRegistry", "model", "usePipelineBoardModel", "invokePromise", "useOperationInvoker", "attendableId", "Obj", "getDXN", "toString", "hasAttention", "useAttention", "handleColumnAdd", "useCallback", "DeckOperation", "ChangeCompanion", "primary", "companion", "ATTENDABLE_PATH_SEPARATOR", "React", "Layout", "Main", "toolbar", "PipelineComponent", "Root", "Item", "PipelineItem", "onAddColumn", "Toolbar", "disabled", "Content", "item", "projectionModel", "Surface", "data", "projection", "limit"]
7
+ }
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  meta
3
- } from "./chunk-J5YNPKHT.mjs";
3
+ } from "./chunk-QWNKLHBY.mjs";
4
4
 
5
5
  // src/components/PipelineSettings.tsx
6
6
  import * as Schema from "effect/Schema";
7
7
  import React, { useCallback, useMemo, useRef, useState } from "react";
8
- import { DXN, Filter, Obj, Query, Ref, Tag, Type } from "@dxos/echo";
8
+ import { DXN, Filter, Query, Ref, Tag, Type } from "@dxos/echo";
9
9
  import { useTypeOptions } from "@dxos/plugin-space";
10
10
  import { resolveSchemaWithRegistry } from "@dxos/plugin-space";
11
- import { getSpace, useQuery } from "@dxos/react-client/echo";
11
+ import { getSpace, useObject, useQuery } from "@dxos/react-client/echo";
12
12
  import { IconButton, useAsyncEffect, useTranslation } from "@dxos/react-ui";
13
13
  import { Form, ViewEditor } from "@dxos/react-ui-form";
14
14
  import { List } from "@dxos/react-ui-list";
15
15
  import { View } from "@dxos/schema";
16
16
  import { Pipeline, Task } from "@dxos/types";
17
- import { inputTextLabel, mx, osTranslations, subtleHover } from "@dxos/ui-theme";
17
+ import { mx, osTranslations, subtleHover } from "@dxos/ui-theme";
18
18
  import { arrayMove } from "@dxos/util";
19
19
  var listGrid = "grid grid-cols-[min-content_1fr_min-content_min-content_min-content]";
20
20
  var listItemGrid = "grid grid-cols-subgrid col-span-5";
@@ -23,11 +23,12 @@ var PipelineObjectSettings = ({ classNames, pipeline }) => {
23
23
  const { t } = useTranslation(meta.id);
24
24
  const space = getSpace(pipeline);
25
25
  const [expandedId, setExpandedId] = useState();
26
- const column = useMemo(() => pipeline.columns.find((column2) => column2.view.dxn.toString() === expandedId), [
27
- pipeline.columns,
26
+ const [columns, updateColumns] = useObject(pipeline, "columns");
27
+ const column = useMemo(() => columns.find((column2) => column2.view.dxn.toString() === expandedId), [
28
+ columns,
28
29
  expandedId
29
30
  ]);
30
- const view = column?.view.target;
31
+ const [view, updateView] = useObject(column?.view);
31
32
  const [schema, setSchema] = useState(() => Schema.Struct({}));
32
33
  const projectionRef = useRef(null);
33
34
  const tags = useQuery(space?.db, Filter.type(Tag.Tag));
@@ -60,10 +61,10 @@ var PipelineObjectSettings = ({ classNames, pipeline }) => {
60
61
  view,
61
62
  schema
62
63
  ]);
63
- const handleMove = useCallback((fromIndex, toIndex) => Obj.change(pipeline, (p) => {
64
- arrayMove(p.columns, fromIndex, toIndex);
64
+ const handleMove = useCallback((fromIndex, toIndex) => updateColumns((columns2) => {
65
+ arrayMove(columns2, fromIndex, toIndex);
65
66
  }), [
66
- pipeline
67
+ updateColumns
67
68
  ]);
68
69
  const handleQueryChanged = useCallback(async (newQuery, target) => {
69
70
  if (!view || !space) {
@@ -75,8 +76,8 @@ var PipelineObjectSettings = ({ classNames, pipeline }) => {
75
76
  queue
76
77
  ]
77
78
  }) : Query.fromAst(newQuery);
78
- Obj.change(view, (v) => {
79
- v.query.ast = query.ast;
79
+ updateView((view2) => {
80
+ view2.query.ast = query.ast;
80
81
  });
81
82
  const newSchema = await resolveSchemaWithRegistry(space.db.schemaRegistry, query.ast);
82
83
  if (!newSchema) {
@@ -86,12 +87,13 @@ var PipelineObjectSettings = ({ classNames, pipeline }) => {
86
87
  query,
87
88
  jsonSchema: Type.toJsonSchema(newSchema)
88
89
  });
89
- Obj.change(view, (v) => {
90
- v.projection = Obj.getSnapshot(newView).projection;
90
+ updateView((view2) => {
91
+ view2.projection = newView.projection;
91
92
  });
92
93
  setSchema(() => newSchema);
93
94
  }, [
94
95
  view,
96
+ updateView,
95
97
  schema
96
98
  ]);
97
99
  const handleToggleField = useCallback((column2) => {
@@ -101,24 +103,29 @@ var PipelineObjectSettings = ({ classNames, pipeline }) => {
101
103
  if (column2.view.dxn.toString() === expandedId) {
102
104
  setExpandedId(void 0);
103
105
  }
104
- const index = pipeline.columns.findIndex((l) => l === column2);
106
+ const index = columns.findIndex((l) => l === column2);
105
107
  const viewToRemove = await column2.view.load();
106
- Obj.change(pipeline, (p) => {
107
- p.columns.splice(index, 1);
108
+ updateColumns((columns2) => {
109
+ columns2.splice(index, 1);
108
110
  });
109
111
  space?.db.remove(viewToRemove);
110
112
  }, [
111
113
  expandedId,
112
- pipeline.columns,
114
+ columns,
115
+ updateColumns,
113
116
  space
114
117
  ]);
115
118
  const handleAdd = useCallback(() => {
119
+ if (!space) {
120
+ return;
121
+ }
116
122
  const newView = View.make({
117
123
  query: Query.select(Filter.type(Task.Task)),
118
124
  jsonSchema: Type.toJsonSchema(Task.Task)
119
125
  });
120
- Obj.change(pipeline, (p) => {
121
- p.columns.push({
126
+ space.db.add(newView);
127
+ updateColumns((columns2) => {
128
+ columns2.push({
122
129
  name: "Tasks",
123
130
  // Type assertion needed due to QueryAST type variance.
124
131
  view: Ref.make(newView),
@@ -127,33 +134,35 @@ var PipelineObjectSettings = ({ classNames, pipeline }) => {
127
134
  });
128
135
  setExpandedId(newView.id);
129
136
  }, [
130
- pipeline
137
+ space,
138
+ updateColumns
131
139
  ]);
132
140
  const handleColumnSave = useCallback((values) => {
133
141
  if (column) {
134
- const columnIndex = pipeline.columns.findIndex((c) => c === column);
135
- Obj.change(pipeline, (p) => {
136
- p.columns[columnIndex].name = values.name;
142
+ const columnIndex = columns.findIndex((c) => c === column);
143
+ updateColumns((columns2) => {
144
+ columns2[columnIndex].name = values.name;
137
145
  });
138
146
  }
139
147
  }, [
140
148
  column,
141
- pipeline
149
+ columns,
150
+ updateColumns
142
151
  ]);
143
152
  return /* @__PURE__ */ React.createElement("div", {
144
153
  role: "none",
145
154
  className: mx("plb-cardSpacingBlock overflow-y-auto", classNames)
146
155
  }, /* @__PURE__ */ React.createElement("h2", {
147
- className: mx(inputTextLabel)
156
+ className: "text-sm text-description plb-1"
148
157
  }, t("views label")), /* @__PURE__ */ React.createElement(List.Root, {
149
- items: pipeline.columns,
158
+ items: columns,
150
159
  isItem: Schema.is(Pipeline.Column),
151
160
  getId: (column2) => column2.view.dxn.toString(),
152
161
  onMove: handleMove
153
- }, ({ items: columns }) => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", {
162
+ }, ({ items: columns2 }) => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", {
154
163
  role: "list",
155
164
  className: mx(listGrid)
156
- }, columns.map((column2) => /* @__PURE__ */ React.createElement(List.Item, {
165
+ }, columns2.map((column2) => /* @__PURE__ */ React.createElement(List.Item, {
157
166
  key: column2.view.dxn.toString(),
158
167
  item: column2,
159
168
  classNames: listItemGrid,
@@ -176,7 +185,7 @@ var PipelineObjectSettings = ({ classNames, pipeline }) => {
176
185
  }),
177
186
  icon: expandedId === column2.view.dxn.toString() ? "ph--caret-down--regular" : "ph--caret-right--regular",
178
187
  onClick: () => handleToggleField(column2)
179
- })), expandedId === column2.view.dxn.toString() && view && /* @__PURE__ */ React.createElement("div", {
188
+ })), expandedId === column2.view.dxn.toString() && column2?.view.target && /* @__PURE__ */ React.createElement("div", {
180
189
  role: "none",
181
190
  className: "col-span-5 mlb-2 border border-separator rounded-md"
182
191
  }, /* @__PURE__ */ React.createElement(Form.Root, {
@@ -189,7 +198,7 @@ var PipelineObjectSettings = ({ classNames, pipeline }) => {
189
198
  mode: "tag",
190
199
  readonly: true,
191
200
  schema,
192
- view,
201
+ view: column2.view.target,
193
202
  registry: space?.db.schemaRegistry,
194
203
  tags,
195
204
  types,
@@ -209,4 +218,4 @@ export {
209
218
  PipelineObjectSettings,
210
219
  PipelineSettings_default as default
211
220
  };
212
- //# sourceMappingURL=PipelineSettings-EBR3UU5C.mjs.map
221
+ //# sourceMappingURL=PipelineSettings-R54RTVWZ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/PipelineSettings.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 { DXN, Filter, Query, type QueryAST, Ref, Tag, Type } from '@dxos/echo';\nimport { type Mutable } from '@dxos/echo/internal';\nimport { useTypeOptions } from '@dxos/plugin-space';\nimport { resolveSchemaWithRegistry } from '@dxos/plugin-space';\nimport { getSpace, 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, View } from '@dxos/schema';\nimport { Pipeline, Task } from '@dxos/types';\nimport { mx, osTranslations, subtleHover } 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\n// TODO(burdon): Standardize Object/Plugin settings.\nexport type PipelineObjectSettingsProps = ThemedClassName<{\n pipeline: Pipeline.Pipeline;\n}>;\n\n/**\n * Supports editing the pipeline view.\n */\nexport const PipelineObjectSettings = ({ classNames, pipeline }: PipelineObjectSettingsProps) => {\n const { t } = useTranslation(meta.id);\n const space = getSpace(pipeline);\n const [expandedId, setExpandedId] = useState<string>();\n const [columns, updateColumns] = useObject(pipeline, 'columns');\n const column = useMemo(\n () => columns.find((column) => column.view.dxn.toString() === expandedId),\n [columns, expandedId],\n );\n const [view, updateView] = useObject(column?.view);\n const [schema, setSchema] = useState<Schema.Schema.AnyNoContext>(() => Schema.Struct({}));\n const projectionRef = useRef<ProjectionModel>(null);\n const tags = useQuery(space?.db, Filter.type(Tag.Tag));\n const types = useTypeOptions({\n space,\n annotation: {\n location: ['database', 'runtime'],\n kind: ['user'],\n registered: ['registered', 'unregistered'],\n },\n });\n\n useAsyncEffect(async () => {\n if (!view?.query || !space) {\n return;\n }\n\n const foundSchema = await resolveSchemaWithRegistry(space.db.schemaRegistry, view.query.ast);\n if (foundSchema && foundSchema !== schema) {\n setSchema(() => foundSchema);\n }\n }, [space, view, schema]);\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?: string) => {\n if (!view || !space) {\n return;\n }\n\n const queue = target && DXN.tryParse(target) ? target : undefined;\n const query = queue ? Query.fromAst(newQuery).options({ queues: [queue] }) : Query.fromAst(newQuery);\n updateView((view) => {\n view.query.ast = query.ast as Mutable<typeof query.ast>;\n });\n const newSchema = await resolveSchemaWithRegistry(space.db.schemaRegistry, query.ast);\n if (!newSchema) {\n return;\n }\n\n const newView = View.make({\n query,\n jsonSchema: Type.toJsonSchema(newSchema),\n });\n updateView((view) => {\n view.projection = newView.projection as Mutable<typeof view.projection>;\n });\n\n setSchema(() => newSchema);\n },\n [view, updateView, schema],\n );\n\n const handleToggleField = useCallback((column: Pipeline.Column) => {\n setExpandedId((prevExpandedId) =>\n prevExpandedId === column.view.dxn.toString() ? undefined : column.view.dxn.toString(),\n );\n }, []);\n\n const handleDelete = useCallback(\n async (column: Pipeline.Column) => {\n if (column.view.dxn.toString() === 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 space?.db.remove(viewToRemove);\n },\n [expandedId, columns, updateColumns, space],\n );\n\n const handleAdd = useCallback(() => {\n if (!space) {\n return;\n }\n const newView = View.make({\n query: Query.select(Filter.type(Task.Task)),\n jsonSchema: Type.toJsonSchema(Task.Task),\n });\n space.db.add(newView);\n updateColumns((columns) => {\n columns.push({\n name: 'Tasks',\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 }, [space, updateColumns]);\n\n const handleColumnSave = useCallback(\n (values: Schema.Schema.Type<typeof ColumnFormSchema>) => {\n if (column) {\n const columnIndex = columns.findIndex((c) => c === column);\n updateColumns((columns) => {\n columns[columnIndex].name = values.name;\n });\n }\n },\n [column, columns, updateColumns],\n );\n\n return (\n <div role='none' className={mx('plb-cardSpacingBlock overflow-y-auto', classNames)}>\n <h2 className='text-sm text-description plb-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.dxn.toString()}\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.dxn.toString()}\n item={column}\n classNames={listItemGrid}\n aria-expanded={expandedId === column.view.dxn.toString()}\n >\n <div role='none' className={mx(subtleHover, listItemGrid, 'rounded-sm cursor-pointer min-bs-10')}>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleToggleField(column)}>{column.name}</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={\n expandedId === column.view.dxn.toString()\n ? 'ph--caret-down--regular'\n : 'ph--caret-right--regular'\n }\n onClick={() => handleToggleField(column)}\n />\n </div>\n {expandedId === column.view.dxn.toString() && column?.view.target && (\n <div role='none' className='col-span-5 mlb-2 border border-separator rounded-md'>\n <Form.Root schema={ColumnFormSchema} values={column} autoSave onSave={handleColumnSave}>\n <Form.Content>\n <Form.FieldSet />\n </Form.Content>\n </Form.Root>\n <ViewEditor\n ref={projectionRef}\n mode='tag'\n readonly\n schema={schema}\n view={column.view.target}\n registry={space?.db.schemaRegistry}\n tags={tags}\n types={types}\n onQueryChanged={handleQueryChanged}\n />\n </div>\n )}\n </List.Item>\n ))}\n </div>\n </>\n )}\n </List.Root>\n\n <div role='none' className='mlb-cardSpacingBlock'>\n <IconButton icon='ph--plus--regular' label={t('add view label')} onClick={handleAdd} classNames='is-full' />\n </div>\n </div>\n );\n};\n\nexport default PipelineObjectSettings;\n"],
5
+ "mappings": "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",
6
+ "names": ["Schema", "React", "useCallback", "useMemo", "useRef", "useState", "DXN", "Filter", "Query", "Ref", "Tag", "Type", "useTypeOptions", "resolveSchemaWithRegistry", "getSpace", "useObject", "useQuery", "IconButton", "useAsyncEffect", "useTranslation", "Form", "ViewEditor", "List", "View", "Pipeline", "Task", "mx", "osTranslations", "subtleHover", "arrayMove", "listGrid", "listItemGrid", "ColumnFormSchema", "Pipeline", "Column", "pipe", "mutable", "pick", "PipelineObjectSettings", "classNames", "pipeline", "t", "useTranslation", "meta", "id", "space", "getSpace", "expandedId", "setExpandedId", "useState", "columns", "updateColumns", "useObject", "column", "useMemo", "find", "view", "dxn", "toString", "updateView", "schema", "setSchema", "Struct", "projectionRef", "useRef", "tags", "useQuery", "db", "Filter", "type", "Tag", "types", "useTypeOptions", "annotation", "location", "kind", "registered", "useAsyncEffect", "query", "foundSchema", "resolveSchemaWithRegistry", "schemaRegistry", "ast", "handleMove", "useCallback", "fromIndex", "toIndex", "arrayMove", "handleQueryChanged", "newQuery", "target", "queue", "DXN", "tryParse", "undefined", "Query", "fromAst", "options", "queues", "newSchema", "newView", "View", "make", "jsonSchema", "Type", "toJsonSchema", "projection", "handleToggleField", "prevExpandedId", "handleDelete", "index", "findIndex", "l", "viewToRemove", "load", "splice", "remove", "handleAdd", "select", "Task", "add", "push", "name", "Ref", "order", "handleColumnSave", "values", "columnIndex", "c", "div", "role", "className", "mx", "h2", "List", "Root", "items", "isItem", "is", "getId", "onMove", "map", "Item", "key", "item", "aria-expanded", "subtleHover", "ItemDragHandle", "ItemTitle", "onClick", "ItemDeleteButton", "label", "autoHide", "data-testid", "IconButton", "iconOnly", "variant", "ns", "osTranslations", "icon", "Form", "autoSave", "onSave", "Content", "FieldSet", "ViewEditor", "ref", "mode", "readonly", "registry", "onQueryChanged"]
7
+ }
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  meta
3
- } from "./chunk-J5YNPKHT.mjs";
3
+ } from "./chunk-QWNKLHBY.mjs";
4
4
 
5
5
  // src/capabilities/app-graph-builder/app-graph-builder.ts
6
6
  import * as Effect from "effect/Effect";
7
- import { Capability, Common } from "@dxos/app-framework";
7
+ import { Capability } from "@dxos/app-framework";
8
+ import { AppCapabilities } from "@dxos/app-toolkit";
8
9
  import { ATTENDABLE_PATH_SEPARATOR, PLANK_COMPANION_TYPE } from "@dxos/plugin-deck/types";
9
10
  import { GraphBuilder } from "@dxos/plugin-graph";
10
11
  import { Pipeline } from "@dxos/types";
@@ -13,7 +14,7 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
13
14
  GraphBuilder.createTypeExtension({
14
15
  id: `${meta.id}/triggers`,
15
16
  type: Pipeline.Pipeline,
16
- connector: (pipeline, get) => {
17
+ connector: (pipeline) => {
17
18
  const nodeId = pipeline.id;
18
19
  return Effect.succeed([
19
20
  {
@@ -25,7 +26,7 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
25
26
  data: "invocations",
26
27
  properties: {
27
28
  label: [
28
- "project invocations label",
29
+ "pipeline invocations label",
29
30
  {
30
31
  ns: meta.id
31
32
  }
@@ -43,7 +44,7 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
43
44
  data: "automation",
44
45
  properties: {
45
46
  label: [
46
- "project automation label",
47
+ "pipeline automation label",
47
48
  {
48
49
  ns: meta.id
49
50
  }
@@ -56,9 +57,9 @@ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function
56
57
  }
57
58
  })
58
59
  ]);
59
- return Capability.contributes(Common.Capability.AppGraphBuilder, extensions);
60
+ return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
60
61
  }));
61
62
  export {
62
63
  app_graph_builder_default as default
63
64
  };
64
- //# sourceMappingURL=app-graph-builder-NKUZQ6A7.mjs.map
65
+ //# sourceMappingURL=app-graph-builder-NUJB33F7.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 { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { ATTENDABLE_PATH_SEPARATOR, PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { GraphBuilder } from '@dxos/plugin-graph';\nimport { Pipeline } from '@dxos/types';\n\nimport { meta } from '../../meta';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const extensions = yield* Effect.all([\n GraphBuilder.createTypeExtension({\n id: `${meta.id}/triggers`,\n type: Pipeline.Pipeline,\n connector: (pipeline) => {\n const nodeId = pipeline.id;\n return Effect.succeed([\n {\n id: [nodeId, 'invocations'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'invocations',\n properties: {\n label: ['pipeline invocations label', { ns: meta.id }],\n icon: 'ph--clock-countdown--regular',\n disposition: 'hidden',\n },\n },\n {\n id: [nodeId, 'automation'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'automation',\n properties: {\n label: ['pipeline automation label', { ns: meta.id }],\n icon: 'ph--lightning--regular',\n disposition: 'hidden',\n },\n },\n ]);\n },\n }),\n ]);\n\n return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);\n }),\n);\n"],
5
+ "mappings": ";;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAChC,SAASC,2BAA2BC,4BAA4B;AAChE,SAASC,oBAAoB;AAC7B,SAASC,gBAAgB;AAIzB,IAAA,4BAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,aAAa,OAAcC,WAAI;IACnCC,aAAaC,oBAAoB;MAC/BC,IAAI,GAAGC,KAAKD,EAAE;MACdE,MAAMC,SAASA;MACfC,WAAW,CAACC,aAAAA;AACV,cAAMC,SAASD,SAASL;AACxB,eAAcO,eAAQ;UACpB;YACEP,IAAI;cAACM;cAAQ;cAAeE,KAAKC,yBAAAA;YACjCP,MAAMQ;YACNC,MAAM;YACNC,YAAY;cACVC,OAAO;gBAAC;gBAA8B;kBAAEC,IAAIb,KAAKD;gBAAG;;cACpDe,MAAM;cACNC,aAAa;YACf;UACF;UACA;YACEhB,IAAI;cAACM;cAAQ;cAAcE,KAAKC,yBAAAA;YAChCP,MAAMQ;YACNC,MAAM;YACNC,YAAY;cACVC,OAAO;gBAAC;gBAA6B;kBAAEC,IAAIb,KAAKD;gBAAG;;cACnDe,MAAM;cACNC,aAAa;YACf;UACF;SACD;MACH;IACF,CAAA;GACD;AAED,SAAOvB,WAAWwB,YAAYC,gBAAgBC,iBAAiBvB,UAAAA;AACjE,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "AppCapabilities", "ATTENDABLE_PATH_SEPARATOR", "PLANK_COMPANION_TYPE", "GraphBuilder", "Pipeline", "Capability", "makeModule", "fnUntraced", "extensions", "all", "GraphBuilder", "createTypeExtension", "id", "meta", "type", "Pipeline", "connector", "pipeline", "nodeId", "succeed", "join", "ATTENDABLE_PATH_SEPARATOR", "PLANK_COMPANION_TYPE", "data", "properties", "label", "ns", "icon", "disposition", "contributes", "AppCapabilities", "AppGraphBuilder"]
7
+ }