@dxos/react-ui-canvas-compute 0.8.0 → 0.8.1-main.013e445

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 (80) hide show
  1. package/dist/lib/browser/index.mjs +85 -34
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +234 -184
  5. package/dist/lib/node/index.cjs.map +4 -4
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/lib/node-esm/index.mjs +85 -34
  8. package/dist/lib/node-esm/index.mjs.map +4 -4
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/components/DiagnosticOverlay.d.ts +2 -1
  11. package/dist/types/src/components/DiagnosticOverlay.d.ts.map +1 -1
  12. package/dist/types/src/compute.stories.d.ts +2 -1
  13. package/dist/types/src/compute.stories.d.ts.map +1 -1
  14. package/dist/types/src/graph/controller.d.ts +14 -13
  15. package/dist/types/src/graph/controller.d.ts.map +1 -1
  16. package/dist/types/src/hooks/index.d.ts +1 -0
  17. package/dist/types/src/hooks/index.d.ts.map +1 -1
  18. package/dist/types/src/hooks/useComputeGraphController.d.ts +10 -0
  19. package/dist/types/src/hooks/useComputeGraphController.d.ts.map +1 -0
  20. package/dist/types/src/shapes/Append.d.ts +2 -1
  21. package/dist/types/src/shapes/Append.d.ts.map +1 -1
  22. package/dist/types/src/shapes/Array.d.ts +2 -1
  23. package/dist/types/src/shapes/Array.d.ts.map +1 -1
  24. package/dist/types/src/shapes/Audio.d.ts +2 -1
  25. package/dist/types/src/shapes/Audio.d.ts.map +1 -1
  26. package/dist/types/src/shapes/Beacon.d.ts +2 -1
  27. package/dist/types/src/shapes/Beacon.d.ts.map +1 -1
  28. package/dist/types/src/shapes/Boolean.d.ts.map +1 -1
  29. package/dist/types/src/shapes/Chat.d.ts +2 -1
  30. package/dist/types/src/shapes/Chat.d.ts.map +1 -1
  31. package/dist/types/src/shapes/Constant.d.ts +2 -1
  32. package/dist/types/src/shapes/Constant.d.ts.map +1 -1
  33. package/dist/types/src/shapes/Database.d.ts +2 -1
  34. package/dist/types/src/shapes/Database.d.ts.map +1 -1
  35. package/dist/types/src/shapes/Function.d.ts.map +1 -1
  36. package/dist/types/src/shapes/Gpt.d.ts +2 -1
  37. package/dist/types/src/shapes/Gpt.d.ts.map +1 -1
  38. package/dist/types/src/shapes/GptRealtime.d.ts +2 -1
  39. package/dist/types/src/shapes/GptRealtime.d.ts.map +1 -1
  40. package/dist/types/src/shapes/Json.d.ts +3 -2
  41. package/dist/types/src/shapes/Json.d.ts.map +1 -1
  42. package/dist/types/src/shapes/Logic.d.ts +3 -2
  43. package/dist/types/src/shapes/Logic.d.ts.map +1 -1
  44. package/dist/types/src/shapes/Queue.d.ts +3 -2
  45. package/dist/types/src/shapes/Queue.d.ts.map +1 -1
  46. package/dist/types/src/shapes/RNG.d.ts +2 -1
  47. package/dist/types/src/shapes/RNG.d.ts.map +1 -1
  48. package/dist/types/src/shapes/Scope.d.ts +2 -1
  49. package/dist/types/src/shapes/Scope.d.ts.map +1 -1
  50. package/dist/types/src/shapes/Surface.d.ts +2 -1
  51. package/dist/types/src/shapes/Surface.d.ts.map +1 -1
  52. package/dist/types/src/shapes/Switch.d.ts +2 -1
  53. package/dist/types/src/shapes/Switch.d.ts.map +1 -1
  54. package/dist/types/src/shapes/Table.d.ts +2 -1
  55. package/dist/types/src/shapes/Table.d.ts.map +1 -1
  56. package/dist/types/src/shapes/Template.d.ts.map +1 -1
  57. package/dist/types/src/shapes/Text.d.ts +2 -1
  58. package/dist/types/src/shapes/Text.d.ts.map +1 -1
  59. package/dist/types/src/shapes/TextToImage.d.ts +2 -1
  60. package/dist/types/src/shapes/TextToImage.d.ts.map +1 -1
  61. package/dist/types/src/shapes/Thread.d.ts +3 -2
  62. package/dist/types/src/shapes/Thread.d.ts.map +1 -1
  63. package/dist/types/src/shapes/Trigger.d.ts +4 -3
  64. package/dist/types/src/shapes/Trigger.d.ts.map +1 -1
  65. package/dist/types/src/shapes/common/FunctionBody.d.ts +1 -1
  66. package/dist/types/src/shapes/common/FunctionBody.d.ts.map +1 -1
  67. package/dist/types/src/shapes/common/TypeSelect.d.ts +2 -1
  68. package/dist/types/src/shapes/common/TypeSelect.d.ts.map +1 -1
  69. package/dist/types/src/shapes/defs.d.ts +1 -1
  70. package/dist/types/src/shapes/defs.d.ts.map +1 -1
  71. package/dist/types/src/testing/circuits.d.ts +20 -3
  72. package/dist/types/src/testing/circuits.d.ts.map +1 -1
  73. package/package.json +40 -41
  74. package/src/compute.stories.tsx +20 -51
  75. package/src/hooks/index.ts +1 -0
  76. package/src/hooks/useComputeGraphController.ts +65 -0
  77. package/src/shapes/Function.tsx +3 -3
  78. package/src/shapes/Trigger.tsx +1 -1
  79. package/src/shapes/defs.ts +1 -1
  80. package/src/testing/circuits.ts +12 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-canvas-compute",
3
- "version": "0.8.0",
3
+ "version": "0.8.1-main.013e445",
4
4
  "description": "A compute graph extension for the canvas editor component.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -24,33 +24,33 @@
24
24
  "@antv/layout": "^1.2.13",
25
25
  "@effect/platform": "0.75.1",
26
26
  "chess.js": "^1.0.0",
27
- "@dxos/app-framework": "0.8.0",
28
- "@dxos/assistant": "0.8.0",
29
- "@dxos/artifact": "0.8.0",
30
- "@dxos/async": "0.8.0",
31
- "@dxos/context": "0.8.0",
32
- "@dxos/conductor": "0.8.0",
33
- "@dxos/debug": "0.8.0",
34
- "@dxos/echo-schema": "0.8.0",
35
- "@dxos/edge-client": "0.8.0",
36
- "@dxos/functions": "0.8.0",
37
- "@dxos/invariant": "0.8.0",
38
- "@dxos/graph": "0.8.0",
39
- "@dxos/keys": "0.8.0",
40
- "@dxos/live-object": "0.8.0",
41
- "@dxos/log": "0.8.0",
42
- "@dxos/react-client": "0.8.0",
43
- "@dxos/react-edge-client": "0.8.0",
44
- "@dxos/react-ui-canvas": "0.8.0",
45
- "@dxos/react-ui-canvas-editor": "0.8.0",
46
- "@dxos/react-ui-editor": "0.8.0",
47
- "@dxos/react-ui-attention": "0.8.0",
48
- "@dxos/react-ui-form": "0.8.0",
49
- "@dxos/react-ui-sfx": "0.8.0",
50
- "@dxos/react-ui-stack": "0.8.0",
51
- "@dxos/schema": "0.8.0",
52
- "@dxos/react-ui-syntax-highlighter": "0.8.0",
53
- "@dxos/util": "0.8.0"
27
+ "@dxos/app-framework": "0.8.1-main.013e445",
28
+ "@dxos/assistant": "0.8.1-main.013e445",
29
+ "@dxos/async": "0.8.1-main.013e445",
30
+ "@dxos/artifact": "0.8.1-main.013e445",
31
+ "@dxos/conductor": "0.8.1-main.013e445",
32
+ "@dxos/context": "0.8.1-main.013e445",
33
+ "@dxos/debug": "0.8.1-main.013e445",
34
+ "@dxos/echo-schema": "0.8.1-main.013e445",
35
+ "@dxos/edge-client": "0.8.1-main.013e445",
36
+ "@dxos/functions": "0.8.1-main.013e445",
37
+ "@dxos/graph": "0.8.1-main.013e445",
38
+ "@dxos/invariant": "0.8.1-main.013e445",
39
+ "@dxos/keys": "0.8.1-main.013e445",
40
+ "@dxos/live-object": "0.8.1-main.013e445",
41
+ "@dxos/log": "0.8.1-main.013e445",
42
+ "@dxos/react-client": "0.8.1-main.013e445",
43
+ "@dxos/react-edge-client": "0.8.1-main.013e445",
44
+ "@dxos/react-ui-canvas": "0.8.1-main.013e445",
45
+ "@dxos/react-ui-attention": "0.8.1-main.013e445",
46
+ "@dxos/react-ui-canvas-editor": "0.8.1-main.013e445",
47
+ "@dxos/react-ui-form": "0.8.1-main.013e445",
48
+ "@dxos/react-ui-editor": "0.8.1-main.013e445",
49
+ "@dxos/react-ui-sfx": "0.8.1-main.013e445",
50
+ "@dxos/react-ui-stack": "0.8.1-main.013e445",
51
+ "@dxos/react-ui-syntax-highlighter": "0.8.1-main.013e445",
52
+ "@dxos/schema": "0.8.1-main.013e445",
53
+ "@dxos/util": "0.8.1-main.013e445"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@effect/ai": "0.8.0",
@@ -58,27 +58,26 @@
58
58
  "@types/lodash.defaultsdeep": "^4.6.6",
59
59
  "@types/react": "~18.2.0",
60
60
  "@types/react-dom": "~18.2.0",
61
- "effect": "^3.12.3",
61
+ "effect": "3.13.3",
62
62
  "lodash.defaultsdeep": "^4.6.1",
63
63
  "react": "~18.2.0",
64
64
  "react-dom": "~18.2.0",
65
65
  "vite": "5.4.7",
66
- "@dxos/app-framework": "0.8.0",
67
- "@dxos/artifact-testing": "0.8.0",
68
- "@dxos/echo-signals": "0.8.0",
69
- "@dxos/random": "0.8.0",
70
- "@dxos/react-ui": "0.8.0",
71
- "@dxos/react-ui-theme": "0.8.0",
72
- "@dxos/storybook-utils": "0.8.0",
73
- "@dxos/compute": "0.8.0"
66
+ "@dxos/app-framework": "0.8.1-main.013e445",
67
+ "@dxos/artifact-testing": "0.8.1-main.013e445",
68
+ "@dxos/compute": "0.8.1-main.013e445",
69
+ "@dxos/echo-signals": "0.8.1-main.013e445",
70
+ "@dxos/random": "0.8.1-main.013e445",
71
+ "@dxos/react-ui": "0.8.1-main.013e445",
72
+ "@dxos/react-ui-theme": "0.8.1-main.013e445",
73
+ "@dxos/storybook-utils": "0.8.1-main.013e445"
74
74
  },
75
75
  "peerDependencies": {
76
- "@effect/schema": "^0.75.5",
77
- "effect": "^3.12.3",
76
+ "effect": "3.13.3",
78
77
  "react": "~18.2.0",
79
78
  "react-dom": "~18.2.0",
80
- "@dxos/react-ui-theme": "0.8.0",
81
- "@dxos/react-ui": "0.8.0"
79
+ "@dxos/react-ui": "0.8.1-main.013e445",
80
+ "@dxos/react-ui-theme": "0.8.1-main.013e445"
82
81
  },
83
82
  "publishConfig": {
84
83
  "access": "public"
@@ -9,8 +9,8 @@ import React, { type PropsWithChildren, useEffect, useMemo, useRef, useState } f
9
9
 
10
10
  import { withPluginManager } from '@dxos/app-framework/testing';
11
11
  import { capabilities, createEdgeServices } from '@dxos/artifact-testing';
12
- import { type UnsubscribeCallback } from '@dxos/async';
13
- import { type ComputeGraphModel, type ComputeNode, type GraphDiagnostic } from '@dxos/conductor';
12
+ import { createTestOllamaClient } from '@dxos/assistant/testing';
13
+ import { EdgeGpt, type ComputeGraphModel, type ComputeNode, type GraphDiagnostic } from '@dxos/conductor';
14
14
  import { withClientProvider } from '@dxos/react-client/testing';
15
15
  import { Select, Toolbar } from '@dxos/react-ui';
16
16
  import { withAttention } from '@dxos/react-ui-attention/testing';
@@ -22,7 +22,7 @@ import { withLayout, withTheme } from '@dxos/storybook-utils';
22
22
  import { DiagnosticOverlay } from './components';
23
23
  import { ComputeShapeLayout } from './compute-layout';
24
24
  import { type ComputeGraphController } from './graph';
25
- import { ComputeContext, useGraphMonitor } from './hooks';
25
+ import { ComputeContext, useComputeGraphController, useGraphMonitor } from './hooks';
26
26
  import { computeShapes } from './registry';
27
27
  import { type ComputeShape } from './shapes';
28
28
  import {
@@ -42,35 +42,24 @@ import {
42
42
 
43
43
  const sidebarTypes: NonNullable<RenderProps['sidebar']>[] = ['canvas', 'compute', 'controller', 'selected'] as const;
44
44
 
45
- // TODO(burdon): Move to async/context?
46
- const combine = (...cbs: UnsubscribeCallback[]) => {
47
- return () => {
48
- for (const cb of cbs) {
49
- cb();
50
- }
51
- };
52
- };
53
-
54
45
  type RenderProps = EditorRootProps<ComputeShape> &
55
46
  PropsWithChildren<{
56
47
  init?: boolean;
57
48
  sidebar?: 'canvas' | 'compute' | 'controller' | 'selected';
58
49
  computeGraph?: ComputeGraphModel;
59
- controller?: ComputeGraphController;
50
+ controller?: ComputeGraphController | null;
60
51
  }>;
61
52
 
62
53
  const Render = ({
63
54
  id = 'test',
64
55
  children,
65
56
  graph,
66
- controller,
57
+ controller = null,
67
58
  init,
68
59
  sidebar: _sidebar,
69
60
  registry,
70
61
  ...props
71
62
  }: RenderProps) => {
72
- const [, forceUpdate] = useState({});
73
-
74
63
  const editorRef = useRef<EditorController>(null);
75
64
 
76
65
  // Selection.
@@ -101,41 +90,7 @@ const Render = ({
101
90
  }, [graph, controller, sidebar, selected]);
102
91
 
103
92
  // Controller.
104
- useEffect(() => {
105
- if (!controller || !graph) {
106
- return;
107
- }
108
-
109
- void controller.open();
110
- const off = combine(
111
- controller.update.on(() => {
112
- void editorRef.current?.update();
113
- forceUpdate({});
114
- }),
115
-
116
- // TODO(burdon): Every node is called on every update.
117
- controller.output.on(({ nodeId, property, value }) => {
118
- if (value.type === 'not-executed') {
119
- // If the node didn't execute, don't trigger.
120
- return;
121
- }
122
-
123
- const edge = graph.edges.find((edge) => {
124
- const source = graph.getNode(edge.source);
125
- return (source as ComputeShape).node === nodeId && edge.output === property;
126
- });
127
-
128
- if (edge) {
129
- void editorRef.current?.action?.({ type: 'trigger', edges: [edge] });
130
- }
131
- }),
132
- );
133
-
134
- return () => {
135
- void controller.close();
136
- off();
137
- };
138
- }, [graph, controller]);
93
+ useComputeGraphController({ controller, graph, editorRef });
139
94
 
140
95
  // Sync monitor.
141
96
  const graphMonitor = useGraphMonitor(controller?.graph);
@@ -343,6 +298,20 @@ export const Artifact: Story = {
343
298
  },
344
299
  };
345
300
 
301
+ export const ImageGen: Story = {
302
+ args: {
303
+ // debug: true,
304
+ showGrid: false,
305
+ snapToGrid: false,
306
+ // sidebar: 'json',
307
+ sidebar: 'controller',
308
+ registry: new ShapeRegistry(computeShapes),
309
+ ...createComputeGraphController(createGptCircuit({ image: true, artifact: true }), {
310
+ gpt: new EdgeGpt(createTestOllamaClient()),
311
+ }),
312
+ },
313
+ };
314
+
346
315
  export const Audio: Story = {
347
316
  args: {
348
317
  // debug: true,
@@ -3,5 +3,6 @@
3
3
  //
4
4
 
5
5
  export * from './compute-context';
6
+ export * from './useComputeGraphController';
6
7
  export * from './useComputeNodeState';
7
8
  export * from './useGraphMonitor';
@@ -0,0 +1,65 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type RefObject, useEffect, useState } from 'react';
6
+
7
+ import { type UnsubscribeCallback } from '@dxos/async';
8
+ import { type EditorRootProps, type EditorController } from '@dxos/react-ui-canvas-editor';
9
+
10
+ import { type ComputeGraphController } from '../graph';
11
+ import { type ComputeShape } from '../shapes';
12
+
13
+ // TODO(burdon): Move to async/context?
14
+ const combine = (...cbs: UnsubscribeCallback[]) => {
15
+ return () => {
16
+ for (const cb of cbs) {
17
+ cb();
18
+ }
19
+ };
20
+ };
21
+
22
+ export type UseComputeGraphControllerOptions = Pick<EditorRootProps<ComputeShape>, 'graph'> & {
23
+ controller: ComputeGraphController | null;
24
+ editorRef: RefObject<EditorController>;
25
+ };
26
+
27
+ export const useComputeGraphController = ({ controller, graph, editorRef }: UseComputeGraphControllerOptions) => {
28
+ const [, forceUpdate] = useState({});
29
+
30
+ useEffect(() => {
31
+ if (!controller || !graph) {
32
+ return;
33
+ }
34
+
35
+ void controller.open();
36
+ const off = combine(
37
+ controller.update.on(() => {
38
+ void editorRef.current?.update();
39
+ forceUpdate({});
40
+ }),
41
+
42
+ // TODO(burdon): Every node is called on every update.
43
+ controller.output.on(({ nodeId, property, value }) => {
44
+ if (value.type === 'not-executed') {
45
+ // If the node didn't execute, don't trigger.
46
+ return;
47
+ }
48
+
49
+ const edge = graph.edges.find((edge) => {
50
+ const source = graph.getNode(edge.source);
51
+ return (source as ComputeShape).node === nodeId && edge.output === property;
52
+ });
53
+
54
+ if (edge) {
55
+ void editorRef.current?.action?.({ type: 'trigger', edges: [edge] });
56
+ }
57
+ }),
58
+ );
59
+
60
+ return () => {
61
+ void controller.close();
62
+ off();
63
+ };
64
+ }, [graph, controller]);
65
+ };
@@ -5,8 +5,8 @@
5
5
  import React, { useCallback, useRef } from 'react';
6
6
 
7
7
  import { AnyOutput, FunctionInput } from '@dxos/conductor';
8
- import { getSnapshot, S } from '@dxos/echo-schema';
9
- import { FunctionType, ScriptType } from '@dxos/functions';
8
+ import { getSnapshot, isInstanceOf, S } from '@dxos/echo-schema';
9
+ import { FunctionType, ScriptType } from '@dxos/functions/types';
10
10
  import { useClient } from '@dxos/react-client';
11
11
  import { Filter, makeRef, parseId } from '@dxos/react-client/echo';
12
12
  import {
@@ -56,7 +56,7 @@ const TextInputComponent = ({ shape, title, ...props }: TextInputComponentProps)
56
56
 
57
57
  const space = client.spaces.get(spaceId);
58
58
  const object = space?.db.getObjectById(objectId);
59
- if (!space || !(object instanceof ScriptType)) {
59
+ if (!space || !isInstanceOf(ScriptType, object)) {
60
60
  return;
61
61
  }
62
62
 
@@ -22,7 +22,7 @@ import {
22
22
  TriggerKind,
23
23
  type TriggerType,
24
24
  type WebhookTrigger,
25
- } from '@dxos/functions';
25
+ } from '@dxos/functions/types';
26
26
  import { DXN, SpaceId } from '@dxos/keys';
27
27
  import { create, makeRef, useSpace } from '@dxos/react-client/echo';
28
28
  import { Select, type SelectRootProps } from '@dxos/react-ui';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { AST } from '@effect/schema';
5
+ import { SchemaAST as AST } from 'effect';
6
6
 
7
7
  import { DEFAULT_INPUT, DEFAULT_OUTPUT } from '@dxos/conductor';
8
8
  import { ObjectId, S } from '@dxos/echo-schema';
@@ -37,7 +37,10 @@ import {
37
37
  createTemplate,
38
38
  } from '../shapes';
39
39
 
40
- export const createComputeGraphController = (graph?: CanvasGraphModel<ComputeShape>, services?: Partial<Services>) => {
40
+ export const createComputeGraphController = (
41
+ graph = CanvasGraphModel.create<ComputeShape>(),
42
+ services?: Partial<Services>,
43
+ ) => {
41
44
  const computeGraph = createComputeGraph(graph);
42
45
  const controller = new ComputeGraphController(computeGraph);
43
46
  controller.setServices(services ?? {});
@@ -228,6 +231,7 @@ export const createGptCircuit = (options: {
228
231
  image?: boolean;
229
232
  history?: boolean;
230
233
  artifact?: boolean;
234
+ instructions?: boolean;
231
235
  }) => {
232
236
  const model = CanvasGraphModel.create<ComputeShape>();
233
237
  model.builder.call((builder) => {
@@ -255,18 +259,21 @@ export const createGptCircuit = (options: {
255
259
  .createEdge({ source: gpt.id, target: append.id, output: 'messages', input: 'items' });
256
260
  }
257
261
 
258
- if (options.artifact) {
262
+ if (options.instructions) {
259
263
  const prompt = model.createNode(
260
264
  createTemplate({
261
265
  text: createSystemPrompt(),
262
266
  ...position({ x: -18, y: -12, width: 8, height: 10 }),
263
267
  }),
264
268
  );
269
+
270
+ builder.createEdge({ source: prompt.id, target: gpt.id, input: 'systemPrompt' });
271
+ }
272
+
273
+ if (options.artifact) {
265
274
  const artifact = model.createNode(createSurface(position({ x: 17, y: -10, width: 14, height: 14 })));
266
275
 
267
- builder
268
- .createEdge({ source: prompt.id, target: gpt.id, input: 'systemPrompt' })
269
- .createEdge({ source: gpt.id, target: artifact.id, output: 'artifact' });
276
+ builder.createEdge({ source: gpt.id, target: artifact.id, output: 'artifact' });
270
277
  }
271
278
 
272
279
  if (options.cot) {