@dxos/react-ui-canvas-compute 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

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 (50) hide show
  1. package/dist/lib/browser/index.mjs +706 -881
  2. package/dist/lib/browser/index.mjs.map +3 -3
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +706 -881
  5. package/dist/lib/node-esm/index.mjs.map +3 -3
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/compute.stories.d.ts +22 -1
  8. package/dist/types/src/compute.stories.d.ts.map +1 -1
  9. package/dist/types/src/graph/controller.d.ts +13 -13
  10. package/dist/types/src/graph/controller.d.ts.map +1 -1
  11. package/dist/types/src/hooks/useComputeNodeState.d.ts +2 -2
  12. package/dist/types/src/hooks/useComputeNodeState.d.ts.map +1 -1
  13. package/dist/types/src/hooks/useGraphMonitor.d.ts.map +1 -1
  14. package/dist/types/src/shapes/Function.d.ts.map +1 -1
  15. package/dist/types/src/shapes/Queue.d.ts.map +1 -1
  16. package/dist/types/src/shapes/RNG.d.ts.map +1 -1
  17. package/dist/types/src/shapes/Surface.d.ts.map +1 -1
  18. package/dist/types/src/shapes/Trigger.d.ts +3 -2
  19. package/dist/types/src/shapes/Trigger.d.ts.map +1 -1
  20. package/dist/types/src/shapes/common/Box.d.ts +1 -1
  21. package/dist/types/src/testing/circuits.d.ts +18 -24
  22. package/dist/types/src/testing/circuits.d.ts.map +1 -1
  23. package/dist/types/tsconfig.tsbuildinfo +1 -1
  24. package/package.json +55 -51
  25. package/src/compute.stories.tsx +66 -110
  26. package/src/graph/controller.ts +100 -70
  27. package/src/graph/node-defs.ts +3 -3
  28. package/src/hooks/useComputeNodeState.ts +4 -3
  29. package/src/hooks/useGraphMonitor.ts +9 -8
  30. package/src/json.test.ts +3 -3
  31. package/src/schema.test.ts +8 -8
  32. package/src/shapes/Audio.tsx +1 -1
  33. package/src/shapes/Beacon.tsx +1 -1
  34. package/src/shapes/Boolean.tsx +2 -2
  35. package/src/shapes/Function.tsx +8 -6
  36. package/src/shapes/Gpt.tsx +1 -1
  37. package/src/shapes/GptRealtime.tsx +1 -1
  38. package/src/shapes/Queue.tsx +8 -4
  39. package/src/shapes/RNG.tsx +5 -1
  40. package/src/shapes/Scope.tsx +1 -1
  41. package/src/shapes/Surface.tsx +6 -2
  42. package/src/shapes/Switch.tsx +1 -1
  43. package/src/shapes/Table.tsx +3 -3
  44. package/src/shapes/Thread.tsx +6 -6
  45. package/src/shapes/Trigger.tsx +13 -8
  46. package/src/shapes/common/Box.tsx +6 -6
  47. package/src/shapes/common/FunctionBody.tsx +2 -2
  48. package/src/shapes/common/TypeSelect.tsx +1 -1
  49. package/src/shapes/defs.ts +3 -3
  50. package/src/testing/circuits.ts +5 -14
@@ -6,14 +6,17 @@ import type * as Context from 'effect/Context';
6
6
  import * as Effect from 'effect/Effect';
7
7
  import * as Either from 'effect/Either';
8
8
  import * as Exit from 'effect/Exit';
9
+ import * as Layer from 'effect/Layer';
10
+ import type * as ManagedRuntime from 'effect/ManagedRuntime';
9
11
  import * as Scope from 'effect/Scope';
10
12
 
13
+ import type { AiService } from '@dxos/ai';
11
14
  import { Event, synchronized } from '@dxos/async';
12
15
  import {
13
16
  type ComputeEdge,
14
17
  type ComputeGraphModel,
15
- type ComputeMeta,
16
18
  type ComputeNode,
19
+ type ComputeNodeMeta,
17
20
  type GptInput,
18
21
  type GptOutput,
19
22
  type GraphDiagnostic,
@@ -22,11 +25,19 @@ import {
22
25
  isNotExecuted,
23
26
  } from '@dxos/conductor';
24
27
  import { Resource } from '@dxos/context';
25
- import { type ComputeEventLogger, type ComputeEventPayload } from '@dxos/functions';
26
- import { type ServiceContainer } from '@dxos/functions';
28
+ import type { Database } from '@dxos/echo';
29
+ import { unwrapExit } from '@dxos/effect';
30
+ import {
31
+ ComputeEventLogger,
32
+ type ComputeEventPayload,
33
+ type CredentialsService,
34
+ type FunctionInvocationService,
35
+ type QueueService,
36
+ TracingService,
37
+ } from '@dxos/functions';
27
38
  import { log } from '@dxos/log';
28
39
  import { type CanvasGraphModel } from '@dxos/react-ui-canvas-editor';
29
- import { type ContentBlock } from '@dxos/schema';
40
+ import { type ContentBlock } from '@dxos/types';
30
41
 
31
42
  import { createComputeGraph } from '../hooks';
32
43
  import { type ComputeShape } from '../shapes';
@@ -72,6 +83,14 @@ type ComputeOutputEvent = {
72
83
  value: RuntimeValue;
73
84
  };
74
85
 
86
+ // TODO(dmaretskyi): Re-use function servies definition.
87
+ export type ComputeServices =
88
+ | AiService.AiService
89
+ | Database.Service
90
+ | QueueService
91
+ | CredentialsService
92
+ | FunctionInvocationService;
93
+
75
94
  /**
76
95
  * Nodes that will automatically trigger the execution of the graph on startup.
77
96
  */
@@ -79,10 +98,10 @@ const AUTO_TRIGGER_NODES = ['chat', 'switch', 'constant'];
79
98
 
80
99
  export const createComputeGraphController = (
81
100
  graph: CanvasGraphModel<ComputeShape>,
82
- serviceContainer: ServiceContainer,
101
+ computeRuntime: ManagedRuntime.ManagedRuntime<ComputeServices, never>,
83
102
  ) => {
84
103
  const computeGraph = createComputeGraph(graph);
85
- const controller = new ComputeGraphController(serviceContainer, computeGraph);
104
+ const controller = new ComputeGraphController(computeRuntime, computeGraph);
86
105
  return { controller, graph };
87
106
  };
88
107
 
@@ -117,7 +136,7 @@ export class ComputeGraphController extends Resource {
117
136
  public readonly events = new Event<ComputeEventPayload>();
118
137
 
119
138
  constructor(
120
- private readonly _serviceContainer: ServiceContainer,
139
+ private readonly _computeRuntime: ManagedRuntime.ManagedRuntime<ComputeServices, never>,
121
140
  /** Persistent compute graph. */
122
141
  private readonly _graph: ComputeGraphModel,
123
142
  ) {
@@ -212,7 +231,7 @@ export class ComputeGraphController extends Resource {
212
231
  });
213
232
  }
214
233
 
215
- async getMeta(node: ComputeNode): Promise<ComputeMeta> {
234
+ async getMeta(node: ComputeNode): Promise<ComputeNodeMeta> {
216
235
  const { meta } = await resolveComputeNode(node);
217
236
  return meta;
218
237
  }
@@ -232,37 +251,41 @@ export class ComputeGraphController extends Resource {
232
251
  executor.setOutputs(nodeId, Effect.succeed(ValueBag.make(outputs)));
233
252
  }
234
253
 
235
- const serviceLayer = this._serviceContainer.createLayer();
236
- await Effect.runPromise(
237
- Effect.gen(this, function* () {
238
- const scope = yield* Scope.make();
239
-
240
- // TODO(dmaretskyi): Code duplication.
241
- const executable = yield* Effect.promise(() => resolveComputeNode(this._graph.getNode(nodeId)));
242
- const computingOutputs = executable.exec != null;
243
- // TODO(dmaretskyi): Check if the node has a compute function and run computeOutputs if it does.
244
- const effect = (computingOutputs ? executor.computeOutputs(nodeId) : executor.computeInputs(nodeId)).pipe(
245
- Effect.withSpan('runGraph'),
246
- Scope.extend(scope),
247
-
248
- Effect.flatMap(computeValueBag),
249
- Effect.provide(serviceLayer),
250
- Effect.withSpan('test'),
251
- Effect.tap((values) => {
252
- for (const [key, value] of Object.entries(values)) {
253
- if (computingOutputs) {
254
- this._onOutputComputed(nodeId, key, value);
255
- } else {
256
- this._onInputComputed(nodeId, key, value);
254
+ unwrapExit(
255
+ await this._computeRuntime.runPromiseExit(
256
+ Effect.gen(this, function* () {
257
+ const scope = yield* Scope.make();
258
+
259
+ // TODO(dmaretskyi): Code duplication.
260
+ const executable = yield* Effect.promise(() => resolveComputeNode(this._graph.getNode(nodeId)));
261
+ const computingOutputs = executable.exec != null;
262
+ // TODO(dmaretskyi): Check if the node has a compute function and run computeOutputs if it does.
263
+ const effect = (computingOutputs ? executor.computeOutputs(nodeId) : executor.computeInputs(nodeId)).pipe(
264
+ Effect.withSpan('runGraph'),
265
+ Scope.extend(scope),
266
+ Effect.provide(
267
+ ComputeEventLogger.layerFromTracing.pipe(
268
+ Layer.provideMerge(TracingService.layerNoop), // TODO(dmaretskyi): Plug-in tracing events to visual feedback in the compute graph editor.
269
+ ),
270
+ ),
271
+ Effect.flatMap(computeValueBag),
272
+ Effect.withSpan('test'),
273
+ Effect.tap((values) => {
274
+ for (const [key, value] of Object.entries(values)) {
275
+ if (computingOutputs) {
276
+ this._onOutputComputed(nodeId, key, value);
277
+ } else {
278
+ this._onInputComputed(nodeId, key, value);
279
+ }
257
280
  }
258
- }
259
- }),
260
- );
281
+ }),
282
+ );
261
283
 
262
- yield* effect;
284
+ yield* effect;
263
285
 
264
- yield* Scope.close(scope, Exit.void);
265
- }),
286
+ yield* Scope.close(scope, Exit.void);
287
+ }),
288
+ ),
266
289
  );
267
290
 
268
291
  this.update.emit();
@@ -290,44 +313,51 @@ export class ComputeGraphController extends Resource {
290
313
  : this._graph.nodes.filter((node) => node.type != null && AUTO_TRIGGER_NODES.includes(node.type));
291
314
  const allAffectedNodes = [...new Set(triggerNodes.flatMap((node) => executor.getAllDependantNodes(node.id)))];
292
315
 
293
- await Effect.runPromise(
294
- Effect.gen(this, function* () {
295
- const scope = yield* Scope.make();
296
-
297
- // TODO(burdon): Return map?
298
- const tasks: Effect.Effect<unknown, any, never>[] = [];
299
- for (const node of allAffectedNodes) {
300
- // TODO(dmaretskyi): Code duplication.
301
- const executable = yield* Effect.promise(() => resolveComputeNode(this._graph.getNode(node)));
302
- const computingOutputs = executable.exec != null;
303
-
304
- // TODO(dmaretskyi): Check if the node has a compute function and run computeOutputs if it does.
305
- const effect = (computingOutputs ? executor.computeOutputs(node) : executor.computeInputs(node)).pipe(
306
- Effect.withSpan('runGraph'),
307
- Scope.extend(scope),
308
- Effect.flatMap(computeValueBag),
309
- Effect.provide(this._serviceContainer.createLayer()),
310
- Effect.withSpan('test'),
311
- Effect.tap((values) => {
312
- for (const [key, value] of Object.entries(values)) {
313
- if (computingOutputs) {
314
- this._onOutputComputed(node, key, value);
315
- } else {
316
- this._onInputComputed(node, key, value);
316
+ unwrapExit(
317
+ await this._computeRuntime.runPromiseExit(
318
+ Effect.gen(this, function* () {
319
+ const scope = yield* Scope.make();
320
+
321
+ // TODO(burdon): Return map?
322
+ const tasks: Effect.Effect<unknown, any, ComputeServices>[] = [];
323
+ for (const node of allAffectedNodes) {
324
+ // TODO(dmaretskyi): Code duplication.
325
+ const executable = yield* Effect.promise(() => resolveComputeNode(this._graph.getNode(node)));
326
+ const computingOutputs = executable.exec != null;
327
+
328
+ // TODO(dmaretskyi): Check if the node has a compute function and run computeOutputs if it does.
329
+ const effect = (computingOutputs ? executor.computeOutputs(node) : executor.computeInputs(node)).pipe(
330
+ Effect.withSpan('runGraph'),
331
+ Scope.extend(scope),
332
+ Effect.flatMap(computeValueBag),
333
+ Effect.provide(
334
+ ComputeEventLogger.layerFromTracing.pipe(
335
+ Layer.provideMerge(TracingService.layerNoop), // TODO(dmaretskyi): Plug-in tracing events to visual feedback in the compute graph editor.
336
+ ),
337
+ ),
338
+
339
+ Effect.withSpan('test'),
340
+ Effect.tap((values) => {
341
+ for (const [key, value] of Object.entries(values)) {
342
+ if (computingOutputs) {
343
+ this._onOutputComputed(node, key, value);
344
+ } else {
345
+ this._onInputComputed(node, key, value);
346
+ }
317
347
  }
318
- }
319
- }),
320
- );
348
+ }),
349
+ );
321
350
 
322
- tasks.push(effect);
323
- }
351
+ tasks.push(effect);
352
+ }
324
353
 
325
- //
326
- yield* Effect.all(tasks);
354
+ //
355
+ yield* Effect.all(tasks);
327
356
 
328
- //
329
- yield* Scope.close(scope, Exit.void);
330
- }),
357
+ //
358
+ yield* Scope.close(scope, Exit.void);
359
+ }),
360
+ ),
331
361
  );
332
362
 
333
363
  this.update.emit();
@@ -12,7 +12,7 @@ import {
12
12
  registry,
13
13
  } from '@dxos/conductor';
14
14
  import { raise } from '@dxos/debug';
15
- import { ObjectId, toJsonSchema } from '@dxos/echo/internal';
15
+ import { JsonSchema, Obj } from '@dxos/echo';
16
16
  import { invariant } from '@dxos/invariant';
17
17
 
18
18
  import { type ComputeShape, type ConstantShape, type TemplateShape } from '../shapes';
@@ -68,7 +68,7 @@ const nodeFactory: Record<NodeType | 'trigger', (shape: ComputeShape) => Compute
68
68
  ['switch' as const]: () => createNode('switch'),
69
69
  ['template' as const]: (shape) => {
70
70
  const node = createNode('template', { valueType: (shape as TemplateShape).valueType, value: shape.text });
71
- node.inputSchema = toJsonSchema(getTemplateInputSchema(node));
71
+ node.inputSchema = JsonSchema.toJsonSchema(getTemplateInputSchema(node));
72
72
  return node;
73
73
  },
74
74
  ['text' as const]: () => createNode('text'),
@@ -77,7 +77,7 @@ const nodeFactory: Record<NodeType | 'trigger', (shape: ComputeShape) => Compute
77
77
  };
78
78
 
79
79
  const createNode = (type: string, props?: Partial<ComputeNode>): ComputeNode => ({
80
- id: ObjectId.random(),
80
+ id: Obj.ID.random(),
81
81
  type,
82
82
  ...props,
83
83
  });
@@ -5,7 +5,7 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import { useCallback, useEffect, useState } from 'react';
7
7
 
8
- import type { ComputeMeta, ComputeNode } from '@dxos/conductor';
8
+ import type { ComputeNode, ComputeNodeMeta } from '@dxos/conductor';
9
9
  import type { ComputeEventPayload } from '@dxos/functions';
10
10
  import { invariant } from '@dxos/invariant';
11
11
 
@@ -16,7 +16,7 @@ import { useComputeContext } from './compute-context';
16
16
 
17
17
  export type ComputeNodeState = {
18
18
  node: ComputeNode;
19
- meta: ComputeMeta;
19
+ meta: ComputeNodeMeta;
20
20
  runtime: {
21
21
  inputs: Record<string, RuntimeValue>;
22
22
  outputs: Record<string, RuntimeValue>;
@@ -33,7 +33,7 @@ export const useComputeNodeState = (shape: ComputeShape): ComputeNodeState => {
33
33
  const { controller } = useComputeContext();
34
34
  invariant(controller);
35
35
 
36
- const [meta, setMeta] = useState<ComputeMeta>();
36
+ const [meta, setMeta] = useState<ComputeNodeMeta>();
37
37
  useEffect(() => {
38
38
  let disposed = false;
39
39
  queueMicrotask(async () => {
@@ -43,6 +43,7 @@ export const useComputeNodeState = (shape: ComputeShape): ComputeNodeState => {
43
43
  if (disposed) {
44
44
  return;
45
45
  }
46
+
46
47
  setMeta(meta);
47
48
  });
48
49
 
@@ -5,9 +5,8 @@
5
5
  import { useMemo } from 'react';
6
6
 
7
7
  import { type ComputeEdge, ComputeGraphModel, type ComputeNode, DEFAULT_INPUT, DEFAULT_OUTPUT } from '@dxos/conductor';
8
- import { ObjectId, Ref } from '@dxos/echo/internal';
8
+ import { Obj, Ref } from '@dxos/echo';
9
9
  import { invariant } from '@dxos/invariant';
10
- import { getSpace } from '@dxos/react-client/echo';
11
10
  import { type CanvasGraphModel, type Connection, type GraphMonitor } from '@dxos/react-ui-canvas-editor';
12
11
  import { isNonNullable } from '@dxos/util';
13
12
 
@@ -27,7 +26,7 @@ export const mapEdge = (
27
26
  invariant(targetNode?.node);
28
27
 
29
28
  return {
30
- id: ObjectId.random(),
29
+ id: Obj.ID.random(),
31
30
  source: sourceNode.node,
32
31
  target: targetNode.node,
33
32
  output,
@@ -113,19 +112,21 @@ export const createComputeGraph = (graph?: CanvasGraphModel<ComputeShape>) => {
113
112
  const linkTriggerToCompute = (graph: ComputeGraphModel, computeNode: ComputeNode, triggerData: TriggerShape) => {
114
113
  const functionTrigger = triggerData.functionTrigger?.target;
115
114
  invariant(functionTrigger);
116
- functionTrigger.function = Ref.make(graph.root);
117
- functionTrigger.inputNodeId = computeNode.id;
115
+ Obj.change(functionTrigger, (t) => {
116
+ t.function = Ref.make(graph.root);
117
+ t.inputNodeId = computeNode.id;
118
+ });
118
119
  };
119
120
 
120
121
  const deleteTriggerObjects = (computeGraph: ComputeGraphModel, deleted: CanvasGraphModel) => {
121
- const space = getSpace(computeGraph.root);
122
- if (!space) {
122
+ const db = Obj.getDatabase(computeGraph.root);
123
+ if (!db) {
123
124
  return;
124
125
  }
125
126
  for (const node of deleted.nodes) {
126
127
  if (node.type === 'trigger') {
127
128
  const trigger = node as TriggerShape;
128
- space.db.remove(trigger.functionTrigger!.target!);
129
+ db.remove(trigger.functionTrigger!.target!);
129
130
  }
130
131
  }
131
132
  };
package/src/json.test.ts CHANGED
@@ -5,12 +5,12 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import { describe, test } from 'vitest';
7
7
 
8
- import { BaseGraphEdge, BaseGraphNode } from '@dxos/graph';
8
+ import { Graph } from '@dxos/graph';
9
9
 
10
10
  import { createGptCircuit } from './testing';
11
11
 
12
12
  export const Shape = Schema.extend(
13
- BaseGraphNode,
13
+ Graph.Node,
14
14
  Schema.Struct({
15
15
  text: Schema.optional(Schema.String),
16
16
  guide: Schema.optional(Schema.Boolean),
@@ -19,7 +19,7 @@ export const Shape = Schema.extend(
19
19
  );
20
20
 
21
21
  export const Connection = Schema.extend(
22
- BaseGraphEdge,
22
+ Graph.Edge,
23
23
  Schema.Struct({
24
24
  input: Schema.optional(Schema.String),
25
25
  output: Schema.optional(Schema.String),
@@ -5,9 +5,9 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import { describe, test } from 'vitest';
7
7
 
8
- import { live } from '@dxos/echo/internal';
9
- import { BaseGraphNode, Graph } from '@dxos/graph';
8
+ import { Graph } from '@dxos/graph';
10
9
  import {
10
+ CanvasGraphModel,
11
11
  Polygon,
12
12
  Shape,
13
13
  createEllipse,
@@ -21,19 +21,19 @@ import { ComputeShape, createFunction, createSwitch } from './shapes';
21
21
 
22
22
  describe('compute', () => {
23
23
  test('model', ({ expect }) => {
24
- // const model = CanvasGraphModel.create<ComputeShape>();
24
+ const model = CanvasGraphModel.create<ComputeShape>();
25
25
  const node = createSwitch({ id: 'x', center: { x: 0, y: 0 }, size: { width: 80, height: 80 } });
26
26
  console.log(JSON.stringify(node, null, 2));
27
27
  expect(Schema.is(ComputeShape)(node)).toBe(true);
28
28
  expect(Schema.is(Polygon)(node)).toBe(true);
29
29
  expect(Schema.is(Shape)(node)).toBe(true);
30
- expect(Schema.is(BaseGraphNode)(node)).toBe(true);
30
+ expect(Schema.is(Graph.Node)(node)).toBe(true);
31
31
 
32
- const graph = live(Graph, { nodes: [], edges: [] });
33
- graph.nodes.push(node); // Throws.
32
+ const graph: Graph.Any = { nodes: [], edges: [] };
33
+ graph.nodes.push(node);
34
34
 
35
- // model.createNode(node);
36
- // console.log(JSON.stringify(model, null, 2));
35
+ model.createNode(node);
36
+ console.log(JSON.stringify(model, null, 2));
37
37
  });
38
38
  });
39
39
 
@@ -35,7 +35,7 @@ export const AudioComponent = ({ shape }: ShapeComponentProps<AudioShape>) => {
35
35
 
36
36
  // https://docs.pmnd.rs/react-three-fiber/api/canvas#render-props
37
37
  return (
38
- <div className='flex w-full justify-center items-center'>
38
+ <div className='flex is-full justify-center items-center'>
39
39
  <Icon
40
40
  icon={active ? 'ph--microphone--regular' : 'ph--microphone-slash--regular'}
41
41
  classNames={['transition opacity-20 duration-1000', active && 'opacity-100 text-red-500']}
@@ -33,7 +33,7 @@ export const BeaconComponent = ({ shape }: ShapeComponentProps<BeaconShape>) =>
33
33
  const value = input?.type === 'executed' ? input.value : false;
34
34
 
35
35
  return (
36
- <div className='flex w-full justify-center items-center'>
36
+ <div className='flex is-full justify-center items-center'>
37
37
  <Icon
38
38
  icon='ph--sun--regular'
39
39
  classNames={['transition opacity-20 duration-1000', isTruthy(value) && 'opacity-100 text-yellow-500']}
@@ -57,7 +57,7 @@ const defineShape = <S extends GateShape>({
57
57
  // Be careful not to name component factories with a capital letter.
58
58
  component: () => {
59
59
  return (
60
- <div className='flex w-full justify-center items-center'>
60
+ <div className='flex is-full justify-center items-center'>
61
61
  <Symbol />
62
62
  </div>
63
63
  );
@@ -95,7 +95,7 @@ const createSymbol =
95
95
  const paths = pathConstructor({ startX, endX, height });
96
96
 
97
97
  return (
98
- <svg viewBox={`0 0 ${width} ${height}`} className='w-full h-full'>
98
+ <svg viewBox={`0 0 ${width} ${height}`} className='is-full bs-full'>
99
99
  {/* Input line. */}
100
100
  {getAnchorPoints({ x: 0, y: centerY }, inputs).map(({ x, y }, i) => (
101
101
  <line key={i} x1={x} y1={y} x2={startX * 1.3} y2={y} strokeWidth={strokeWidth} className={className} />
@@ -35,7 +35,11 @@ export type FunctionShape = Schema.Schema.Type<typeof FunctionShape>;
35
35
  export type CreateFunctionProps = CreateShapeProps<FunctionShape>;
36
36
 
37
37
  export const createFunction = (props: CreateFunctionProps) =>
38
- createShape<FunctionShape>({ type: 'function', size: { width: 256, height: 192 }, ...props });
38
+ createShape<FunctionShape>({
39
+ type: 'function',
40
+ size: { width: 256, height: 192 },
41
+ ...props,
42
+ });
39
43
 
40
44
  //
41
45
  // Component
@@ -62,17 +66,15 @@ const TextInputComponent = ({ shape, title, ...props }: TextInputComponentProps)
62
66
  return;
63
67
  }
64
68
 
65
- const {
66
- objects: [fn],
67
- } = await space.db.query(Filter.type(Function.Function, { source: Ref.make(object) })).run();
69
+ const [fn] = await space.db.query(Filter.type(Function.Function, { source: Ref.make(object) })).run();
68
70
  if (!fn) {
69
71
  return;
70
72
  }
71
73
 
72
74
  node.value = value;
73
75
  node.function = Ref.make(fn);
74
- node.inputSchema = getSnapshot(fn.inputSchema);
75
- node.outputSchema = getSnapshot(fn.outputSchema);
76
+ node.inputSchema = fn.inputSchema ? getSnapshot(fn.inputSchema) : undefined;
77
+ node.outputSchema = fn.outputSchema ? getSnapshot(fn.outputSchema) : undefined;
76
78
  },
77
79
  [client, node],
78
80
  );
@@ -74,7 +74,7 @@ export const GptComponent = ({ shape }: ShapeComponentProps<GptShape>) => {
74
74
  return (
75
75
  <FunctionBody
76
76
  shape={shape}
77
- content={<div className='px-2 py-1 overflow-y-scroll'>{text}</div>}
77
+ content={<div className='pli-2 plb-1 overflow-y-auto'>{text}</div>}
78
78
  status={`${tokens} tokens`}
79
79
  inputSchema={meta.input}
80
80
  outputSchema={meta.output}
@@ -143,7 +143,7 @@ export const GptRealtimeComponent = ({ shape }: ShapeComponentProps<GptRealtimeS
143
143
  };
144
144
 
145
145
  return (
146
- <div className='flex w-full justify-center items-center'>
146
+ <div className='flex is-full justify-center items-center'>
147
147
  <Icon
148
148
  icon={isReady ? 'ph--waveform--regular' : isLive ? 'ph--pulse--regular' : 'ph--play--regular'}
149
149
  size={16}
@@ -8,7 +8,7 @@ import React, { Fragment } from 'react';
8
8
  import { DEFAULT_OUTPUT, QueueInput, QueueOutput } from '@dxos/conductor';
9
9
  import { type ThemedClassName } from '@dxos/react-ui';
10
10
  import { type ShapeComponentProps, type ShapeDef } from '@dxos/react-ui-canvas-editor';
11
- import { mx } from '@dxos/react-ui-theme';
11
+ import { mx } from '@dxos/ui-theme';
12
12
 
13
13
  import { useComputeNodeState } from '../hooks';
14
14
 
@@ -28,7 +28,11 @@ export type QueueShape = Schema.Schema.Type<typeof QueueShape>;
28
28
  export type CreateQueueProps = CreateShapeProps<QueueShape>;
29
29
 
30
30
  export const createQueue = (props: CreateQueueProps) =>
31
- createShape<QueueShape>({ type: 'queue', size: { width: 256, height: 512 }, ...props });
31
+ createShape<QueueShape>({
32
+ type: 'queue',
33
+ size: { width: 256, height: 512 },
34
+ ...props,
35
+ });
32
36
 
33
37
  export const QueueComponent = ({ shape }: ShapeComponentProps<QueueShape>) => {
34
38
  const { runtime } = useComputeNodeState(shape);
@@ -42,9 +46,9 @@ export const QueueComponent = ({ shape }: ShapeComponentProps<QueueShape>) => {
42
46
 
43
47
  return (
44
48
  <Box shape={shape} status={`${items.length} items`} onAction={handleAction}>
45
- <div className='flex flex-col w-full overflow-y-scroll divide-y divide-separator'>
49
+ <div className='flex flex-col is-full overflow-y-auto divide-y divide-separator'>
46
50
  {[...items].map((item, i) => (
47
- <QueueItem key={i} classNames='p-1 px-2' item={item} />
51
+ <QueueItem key={i} classNames='p-1 pli-2' item={item} />
48
52
  ))}
49
53
  </div>
50
54
  </Box>
@@ -27,7 +27,11 @@ export type RandomShape = Schema.Schema.Type<typeof RandomShape>;
27
27
  export type CreateRandomProps = CreateShapeProps<RandomShape>;
28
28
 
29
29
  export const createRandom = (props: CreateRandomProps) =>
30
- createShape<RandomShape>({ type: 'rng', size: { width: 64, height: 64 }, ...props });
30
+ createShape<RandomShape>({
31
+ type: 'rng',
32
+ size: { width: 64, height: 64 },
33
+ ...props,
34
+ });
31
35
 
32
36
  const icons = [
33
37
  'ph--dice-one--regular',
@@ -39,7 +39,7 @@ export const ScopeComponent = ({ shape }: ShapeComponentProps<ScopeShape>) => {
39
39
  const { getAverage } = useAudioStream(active);
40
40
 
41
41
  return (
42
- <div className='flex w-full justify-center items-center bg-black'>
42
+ <div className='flex is-full justify-center items-center bg-black'>
43
43
  <Chaos active={active} getValue={getAverage} options={{ ...shaderPresets.heptapod, zoom: 1.2 }} />
44
44
  </div>
45
45
  );
@@ -5,7 +5,7 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import React from 'react';
7
7
 
8
- import { Surface } from '@dxos/app-framework';
8
+ import { Surface } from '@dxos/app-framework/react';
9
9
  import { DEFAULT_INPUT } from '@dxos/conductor';
10
10
  import { type ShapeComponentProps, type ShapeDef } from '@dxos/react-ui-canvas-editor';
11
11
  import { createAnchorMap } from '@dxos/react-ui-canvas-editor';
@@ -27,7 +27,11 @@ export type SurfaceShape = Schema.Schema.Type<typeof SurfaceShape>;
27
27
  export type CreateSurfaceProps = CreateShapeProps<SurfaceShape>;
28
28
 
29
29
  export const createSurface = (props: CreateSurfaceProps) =>
30
- createShape<SurfaceShape>({ type: 'surface', size: { width: 384, height: 384 }, ...props });
30
+ createShape<SurfaceShape>({
31
+ type: 'surface',
32
+ size: { width: 384, height: 384 },
33
+ ...props,
34
+ });
31
35
 
32
36
  export const SurfaceComponent = ({ shape }: ShapeComponentProps<SurfaceShape>) => {
33
37
  const { runtime } = useComputeNodeState(shape);
@@ -36,7 +36,7 @@ export const SwitchComponent = ({ shape }: ShapeComponentProps<SwitchShape>) =>
36
36
  }, [value]);
37
37
 
38
38
  return (
39
- <div className='flex w-full justify-center items-center' onClick={(ev) => ev.stopPropagation()}>
39
+ <div className='flex is-full justify-center items-center' onClick={(ev) => ev.stopPropagation()}>
40
40
  <Input.Root>
41
41
  <Input.Switch checked={value} onCheckedChange={(value) => setValue(value)} />
42
42
  </Input.Root>
@@ -7,13 +7,13 @@ import React from 'react';
7
7
 
8
8
  import { createInputSchema, createOutputSchema } from '@dxos/conductor';
9
9
  import { type ShapeComponentProps, type ShapeDef } from '@dxos/react-ui-canvas-editor';
10
- import { DataType } from '@dxos/schema';
10
+ import { Message } from '@dxos/types';
11
11
 
12
12
  import { Box, createFunctionAnchors } from './common';
13
13
  import { ComputeShape, type CreateShapeProps, createShape } from './defs';
14
14
 
15
- const InputSchema = createInputSchema(DataType.Message);
16
- const OutputSchema = createOutputSchema(Schema.mutable(Schema.Array(DataType.Message)));
15
+ const InputSchema = createInputSchema(Message.Message);
16
+ const OutputSchema = createOutputSchema(Schema.mutable(Schema.Array(Message.Message)));
17
17
 
18
18
  export const TableShape = Schema.extend(
19
19
  ComputeShape,