@dxos/react-ui-canvas-compute 0.8.4-main.f5c0578 → 0.8.4-main.fcfe5033a5

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 (120) hide show
  1. package/dist/lib/browser/index.mjs +949 -1120
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +949 -1120
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/compute.stories.d.ts +33 -5
  8. package/dist/types/src/compute.stories.d.ts.map +1 -1
  9. package/dist/types/src/graph/controller.d.ts +21 -33
  10. package/dist/types/src/graph/controller.d.ts.map +1 -1
  11. package/dist/types/src/hooks/useComputeGraphController.d.ts +1 -1
  12. package/dist/types/src/hooks/useComputeGraphController.d.ts.map +1 -1
  13. package/dist/types/src/hooks/useComputeNodeState.d.ts +2 -2
  14. package/dist/types/src/hooks/useComputeNodeState.d.ts.map +1 -1
  15. package/dist/types/src/hooks/useGraphMonitor.d.ts +2 -2
  16. package/dist/types/src/hooks/useGraphMonitor.d.ts.map +1 -1
  17. package/dist/types/src/json.test.d.ts +1 -1
  18. package/dist/types/src/json.test.d.ts.map +1 -1
  19. package/dist/types/src/shapes/Append.d.ts +1 -1
  20. package/dist/types/src/shapes/Append.d.ts.map +1 -1
  21. package/dist/types/src/shapes/Array.d.ts +1 -1
  22. package/dist/types/src/shapes/Array.d.ts.map +1 -1
  23. package/dist/types/src/shapes/Audio.d.ts +1 -1
  24. package/dist/types/src/shapes/Audio.d.ts.map +1 -1
  25. package/dist/types/src/shapes/Beacon.d.ts +1 -1
  26. package/dist/types/src/shapes/Beacon.d.ts.map +1 -1
  27. package/dist/types/src/shapes/Boolean.d.ts +1 -1
  28. package/dist/types/src/shapes/Boolean.d.ts.map +1 -1
  29. package/dist/types/src/shapes/Chat.d.ts +1 -1
  30. package/dist/types/src/shapes/Chat.d.ts.map +1 -1
  31. package/dist/types/src/shapes/Constant.d.ts +2 -2
  32. package/dist/types/src/shapes/Constant.d.ts.map +1 -1
  33. package/dist/types/src/shapes/Database.d.ts +1 -1
  34. package/dist/types/src/shapes/Database.d.ts.map +1 -1
  35. package/dist/types/src/shapes/{Queue.d.ts → Feed.d.ts} +9 -9
  36. package/dist/types/src/shapes/Feed.d.ts.map +1 -0
  37. package/dist/types/src/shapes/Function.d.ts +1 -1
  38. package/dist/types/src/shapes/Function.d.ts.map +1 -1
  39. package/dist/types/src/shapes/Gpt.d.ts +1 -1
  40. package/dist/types/src/shapes/Gpt.d.ts.map +1 -1
  41. package/dist/types/src/shapes/GptRealtime.d.ts +1 -1
  42. package/dist/types/src/shapes/GptRealtime.d.ts.map +1 -1
  43. package/dist/types/src/shapes/Json.d.ts +1 -1
  44. package/dist/types/src/shapes/Json.d.ts.map +1 -1
  45. package/dist/types/src/shapes/Logic.d.ts +1 -1
  46. package/dist/types/src/shapes/Logic.d.ts.map +1 -1
  47. package/dist/types/src/shapes/RNG.d.ts +1 -1
  48. package/dist/types/src/shapes/RNG.d.ts.map +1 -1
  49. package/dist/types/src/shapes/Scope.d.ts +1 -1
  50. package/dist/types/src/shapes/Scope.d.ts.map +1 -1
  51. package/dist/types/src/shapes/Surface.d.ts +1 -1
  52. package/dist/types/src/shapes/Surface.d.ts.map +1 -1
  53. package/dist/types/src/shapes/Switch.d.ts +1 -1
  54. package/dist/types/src/shapes/Switch.d.ts.map +1 -1
  55. package/dist/types/src/shapes/Table.d.ts +1 -1
  56. package/dist/types/src/shapes/Table.d.ts.map +1 -1
  57. package/dist/types/src/shapes/Template.d.ts +1 -1
  58. package/dist/types/src/shapes/Template.d.ts.map +1 -1
  59. package/dist/types/src/shapes/Text.d.ts +1 -1
  60. package/dist/types/src/shapes/Text.d.ts.map +1 -1
  61. package/dist/types/src/shapes/TextToImage.d.ts +1 -1
  62. package/dist/types/src/shapes/TextToImage.d.ts.map +1 -1
  63. package/dist/types/src/shapes/Thread.d.ts +1 -1
  64. package/dist/types/src/shapes/Thread.d.ts.map +1 -1
  65. package/dist/types/src/shapes/Trigger.d.ts +7 -34
  66. package/dist/types/src/shapes/Trigger.d.ts.map +1 -1
  67. package/dist/types/src/shapes/common/Box.d.ts +4 -4
  68. package/dist/types/src/shapes/common/Box.d.ts.map +1 -1
  69. package/dist/types/src/shapes/common/FunctionBody.d.ts +3 -3
  70. package/dist/types/src/shapes/common/FunctionBody.d.ts.map +1 -1
  71. package/dist/types/src/shapes/defs.d.ts +2 -1
  72. package/dist/types/src/shapes/defs.d.ts.map +1 -1
  73. package/dist/types/src/shapes/index.d.ts +2 -2
  74. package/dist/types/src/shapes/index.d.ts.map +1 -1
  75. package/dist/types/src/testing/circuits.d.ts +18 -24
  76. package/dist/types/src/testing/circuits.d.ts.map +1 -1
  77. package/dist/types/tsconfig.tsbuildinfo +1 -1
  78. package/package.json +61 -53
  79. package/src/README.md +0 -3
  80. package/src/compute-layout.ts +1 -1
  81. package/src/compute.stories.tsx +97 -123
  82. package/src/graph/controller.ts +108 -74
  83. package/src/graph/node-defs.ts +31 -31
  84. package/src/hooks/useComputeGraphController.ts +1 -1
  85. package/src/hooks/useComputeNodeState.ts +5 -5
  86. package/src/hooks/useGraphMonitor.ts +11 -10
  87. package/src/json.test.ts +4 -4
  88. package/src/registry.ts +2 -2
  89. package/src/schema.test.ts +12 -12
  90. package/src/shapes/Append.tsx +1 -1
  91. package/src/shapes/Array.tsx +1 -1
  92. package/src/shapes/Audio.tsx +2 -3
  93. package/src/shapes/Beacon.tsx +1 -2
  94. package/src/shapes/Boolean.tsx +2 -2
  95. package/src/shapes/Chat.tsx +1 -2
  96. package/src/shapes/Constant.tsx +1 -2
  97. package/src/shapes/Database.tsx +1 -1
  98. package/src/shapes/{Queue.tsx → Feed.tsx} +27 -22
  99. package/src/shapes/Function.tsx +13 -11
  100. package/src/shapes/Gpt.tsx +7 -3
  101. package/src/shapes/GptRealtime.tsx +1 -1
  102. package/src/shapes/Json.tsx +8 -4
  103. package/src/shapes/Logic.tsx +1 -1
  104. package/src/shapes/RNG.tsx +6 -3
  105. package/src/shapes/Scope.tsx +1 -2
  106. package/src/shapes/Surface.tsx +13 -5
  107. package/src/shapes/Switch.tsx +1 -2
  108. package/src/shapes/Table.tsx +4 -4
  109. package/src/shapes/Template.tsx +2 -3
  110. package/src/shapes/Text.tsx +1 -2
  111. package/src/shapes/TextToImage.tsx +1 -1
  112. package/src/shapes/Thread.tsx +18 -12
  113. package/src/shapes/Trigger.tsx +44 -56
  114. package/src/shapes/common/Box.tsx +5 -8
  115. package/src/shapes/common/FunctionBody.tsx +4 -3
  116. package/src/shapes/common/TypeSelect.tsx +1 -1
  117. package/src/shapes/defs.ts +5 -4
  118. package/src/shapes/index.ts +2 -2
  119. package/src/testing/circuits.ts +7 -16
  120. package/dist/types/src/shapes/Queue.d.ts.map +0 -1
@@ -1,10 +1,16 @@
1
1
  import "@dxos/node-std/globals";
2
2
 
3
3
  // src/graph/controller.ts
4
- import { Effect, Either, Exit, Scope } from "effect";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Either from "effect/Either";
6
+ import * as Exit from "effect/Exit";
7
+ import * as Layer from "effect/Layer";
8
+ import * as Scope from "effect/Scope";
5
9
  import { Event, synchronized } from "@dxos/async";
6
10
  import { GraphExecutor, ValueBag, isNotExecuted } from "@dxos/conductor";
7
11
  import { Resource } from "@dxos/context";
12
+ import { unwrapExit } from "@dxos/effect";
13
+ import { ComputeEventLogger, Trace } from "@dxos/functions";
8
14
  import { log } from "@dxos/log";
9
15
 
10
16
  // src/hooks/compute-context.ts
@@ -66,7 +72,7 @@ var useComputeGraphController = ({ controller, graph, editorRef }) => {
66
72
  };
67
73
 
68
74
  // src/hooks/useComputeNodeState.ts
69
- import { Schema } from "effect";
75
+ import * as Schema from "effect/Schema";
70
76
  import { useCallback, useEffect as useEffect2, useState as useState2 } from "react";
71
77
  import { invariant } from "@dxos/invariant";
72
78
  var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-ui-canvas-compute/src/hooks/useComputeNodeState.ts";
@@ -74,7 +80,7 @@ var useComputeNodeState = (shape) => {
74
80
  const { controller } = useComputeContext();
75
81
  invariant(controller, void 0, {
76
82
  F: __dxlog_file,
77
- L: 34,
83
+ L: 33,
78
84
  S: void 0,
79
85
  A: [
80
86
  "controller",
@@ -87,7 +93,7 @@ var useComputeNodeState = (shape) => {
87
93
  queueMicrotask(async () => {
88
94
  invariant(shape.node, "Node not specified", {
89
95
  F: __dxlog_file,
90
- L: 40,
96
+ L: 39,
91
97
  S: void 0,
92
98
  A: [
93
99
  "shape.node",
@@ -142,9 +148,8 @@ var useComputeNodeState = (shape) => {
142
148
  // src/hooks/useGraphMonitor.ts
143
149
  import { useMemo } from "react";
144
150
  import { ComputeGraphModel, DEFAULT_INPUT, DEFAULT_OUTPUT } from "@dxos/conductor";
145
- import { ObjectId, Ref } from "@dxos/echo-schema";
151
+ import { Obj, Ref } from "@dxos/echo";
146
152
  import { invariant as invariant2 } from "@dxos/invariant";
147
- import { getSpace } from "@dxos/react-client/echo";
148
153
  import { isNonNullable } from "@dxos/util";
149
154
  var __dxlog_file2 = "/__w/dxos/dxos/packages/ui/react-ui-canvas-compute/src/hooks/useGraphMonitor.ts";
150
155
  var mapEdge = (graph, { source, target, output = DEFAULT_OUTPUT, input = DEFAULT_INPUT }) => {
@@ -152,7 +157,7 @@ var mapEdge = (graph, { source, target, output = DEFAULT_OUTPUT, input = DEFAULT
152
157
  const targetNode = graph.findNode(target);
153
158
  invariant2(sourceNode?.node, void 0, {
154
159
  F: __dxlog_file2,
155
- L: 26,
160
+ L: 25,
156
161
  S: void 0,
157
162
  A: [
158
163
  "sourceNode?.node",
@@ -161,7 +166,7 @@ var mapEdge = (graph, { source, target, output = DEFAULT_OUTPUT, input = DEFAULT
161
166
  });
162
167
  invariant2(targetNode?.node, void 0, {
163
168
  F: __dxlog_file2,
164
- L: 27,
169
+ L: 26,
165
170
  S: void 0,
166
171
  A: [
167
172
  "targetNode?.node",
@@ -169,7 +174,7 @@ var mapEdge = (graph, { source, target, output = DEFAULT_OUTPUT, input = DEFAULT
169
174
  ]
170
175
  });
171
176
  return {
172
- id: ObjectId.random(),
177
+ id: Obj.ID.random(),
173
178
  source: sourceNode.node,
174
179
  target: targetNode.node,
175
180
  output,
@@ -185,7 +190,7 @@ var useGraphMonitor = (model) => {
185
190
  }
186
191
  invariant2(node.type, void 0, {
187
192
  F: __dxlog_file2,
188
- L: 52,
193
+ L: 51,
189
194
  S: void 0,
190
195
  A: [
191
196
  "node.type",
@@ -243,25 +248,27 @@ var linkTriggerToCompute = (graph, computeNode, triggerData) => {
243
248
  const functionTrigger = triggerData.functionTrigger?.target;
244
249
  invariant2(functionTrigger, void 0, {
245
250
  F: __dxlog_file2,
246
- L: 115,
251
+ L: 114,
247
252
  S: void 0,
248
253
  A: [
249
254
  "functionTrigger",
250
255
  ""
251
256
  ]
252
257
  });
253
- functionTrigger.function = Ref.make(graph.root);
254
- functionTrigger.inputNodeId = computeNode.id;
258
+ Obj.change(functionTrigger, (functionTrigger2) => {
259
+ functionTrigger2.function = Ref.make(graph.root);
260
+ functionTrigger2.inputNodeId = computeNode.id;
261
+ });
255
262
  };
256
263
  var deleteTriggerObjects = (computeGraph, deleted) => {
257
- const space = getSpace(computeGraph.root);
258
- if (!space) {
264
+ const db = Obj.getDatabase(computeGraph.root);
265
+ if (!db) {
259
266
  return;
260
267
  }
261
268
  for (const node of deleted.nodes) {
262
269
  if (node.type === "trigger") {
263
270
  const trigger = node;
264
- space.db.remove(trigger.functionTrigger.target);
271
+ db.remove(trigger.functionTrigger.target);
265
272
  }
266
273
  }
267
274
  };
@@ -269,7 +276,7 @@ var deleteTriggerObjects = (computeGraph, deleted) => {
269
276
  // src/graph/node-defs.ts
270
277
  import { NODE_INPUT, NODE_OUTPUT, getTemplateInputSchema, registry } from "@dxos/conductor";
271
278
  import { raise as raise2 } from "@dxos/debug";
272
- import { ObjectId as ObjectId2, toJsonSchema } from "@dxos/echo-schema";
279
+ import { JsonSchema, Obj as Obj2 } from "@dxos/echo";
273
280
  import { invariant as invariant3 } from "@dxos/invariant";
274
281
  var __dxlog_file3 = "/__w/dxos/dxos/packages/ui/react-ui-canvas-compute/src/graph/node-defs.ts";
275
282
  var resolveComputeNode = async (node) => {
@@ -298,46 +305,46 @@ var nodeFactory = {
298
305
  [NODE_INPUT]: () => createNode(NODE_INPUT),
299
306
  [NODE_OUTPUT]: () => createNode(NODE_OUTPUT),
300
307
  // Extensions.
301
- ["text-to-image"]: () => createNode("text-to-image"),
302
- ["and"]: () => createNode("and"),
303
- ["append"]: () => createNode("append"),
304
- ["audio"]: () => createNode("audio"),
305
- ["beacon"]: () => createNode("beacon"),
306
- ["chat"]: () => createNode("chat"),
307
- ["constant"]: (shape) => createNode("constant", {
308
+ "text-to-image": () => createNode("text-to-image"),
309
+ and: () => createNode("and"),
310
+ append: () => createNode("append"),
311
+ audio: () => createNode("audio"),
312
+ beacon: () => createNode("beacon"),
313
+ chat: () => createNode("chat"),
314
+ constant: (shape) => createNode("constant", {
308
315
  value: shape.value
309
316
  }),
310
- ["make-queue"]: () => createNode("make-queue"),
311
- ["database"]: () => createNode("database"),
312
- ["gpt"]: () => createNode("gpt"),
313
- ["gpt-realtime"]: () => createNode("gpt-realtime"),
314
- ["if"]: () => createNode("if"),
315
- ["if-else"]: () => createNode("if-else"),
316
- ["function"]: () => createNode("function"),
317
- ["json"]: () => createNode("json"),
318
- ["json-transform"]: () => createNode("json-transform"),
319
- ["not"]: () => createNode("not"),
320
- ["or"]: () => createNode("or"),
321
- ["queue"]: () => createNode("queue"),
322
- ["rng"]: () => createNode("rng"),
323
- ["reducer"]: () => createNode("reducer"),
324
- ["scope"]: () => createNode("scope"),
325
- ["surface"]: () => createNode("surface"),
326
- ["switch"]: () => createNode("switch"),
327
- ["template"]: (shape) => {
317
+ "make-queue": () => createNode("make-queue"),
318
+ database: () => createNode("database"),
319
+ gpt: () => createNode("gpt"),
320
+ "gpt-realtime": () => createNode("gpt-realtime"),
321
+ if: () => createNode("if"),
322
+ "if-else": () => createNode("if-else"),
323
+ function: () => createNode("function"),
324
+ json: () => createNode("json"),
325
+ "json-transform": () => createNode("json-transform"),
326
+ not: () => createNode("not"),
327
+ or: () => createNode("or"),
328
+ queue: () => createNode("queue"),
329
+ rng: () => createNode("rng"),
330
+ reducer: () => createNode("reducer"),
331
+ scope: () => createNode("scope"),
332
+ surface: () => createNode("surface"),
333
+ switch: () => createNode("switch"),
334
+ template: (shape) => {
328
335
  const node = createNode("template", {
329
336
  valueType: shape.valueType,
330
337
  value: shape.text
331
338
  });
332
- node.inputSchema = toJsonSchema(getTemplateInputSchema(node));
339
+ node.inputSchema = JsonSchema.toJsonSchema(getTemplateInputSchema(node));
333
340
  return node;
334
341
  },
335
- ["text"]: () => createNode("text"),
336
- ["thread"]: () => createNode("thread"),
337
- ["trigger"]: () => createNode(NODE_INPUT)
342
+ text: () => createNode("text"),
343
+ thread: () => createNode("thread"),
344
+ trigger: () => createNode(NODE_INPUT)
338
345
  };
339
346
  var createNode = (type, props) => ({
340
- id: ObjectId2.random(),
347
+ id: Obj2.ID.random(),
341
348
  type,
342
349
  ...props
343
350
  });
@@ -356,37 +363,37 @@ var AUTO_TRIGGER_NODES = [
356
363
  "switch",
357
364
  "constant"
358
365
  ];
359
- var createComputeGraphController = (graph, serviceContainer) => {
366
+ var createComputeGraphController = (graph, computeRuntime) => {
360
367
  const computeGraph = createComputeGraph(graph);
361
- const controller = new ComputeGraphController(serviceContainer, computeGraph);
368
+ const controller = new ComputeGraphController(computeRuntime, computeGraph);
362
369
  return {
363
370
  controller,
364
371
  graph
365
372
  };
366
373
  };
367
374
  var ComputeGraphController = class extends Resource {
368
- _serviceContainer;
375
+ _computeRuntime;
369
376
  _graph;
370
- _executor;
371
- _diagnostics;
377
+ _executor = new GraphExecutor({
378
+ computeNodeResolver: (node) => resolveComputeNode(node)
379
+ });
380
+ _diagnostics = [];
372
381
  /**
373
382
  * Canvas force-sets outputs of those nodes.
374
383
  */
375
- _forcedOutputs;
384
+ _forcedOutputs = {};
376
385
  /**
377
386
  * Runtime state of the execution graph.
378
387
  */
379
- _runtimeStateInputs;
380
- _runtimeStateOutputs;
388
+ _runtimeStateInputs = {};
389
+ _runtimeStateOutputs = {};
381
390
  // TODO(burdon): Remove? Make state reactive?
382
- update;
391
+ update = new Event();
383
392
  /** Computed result. */
384
- output;
385
- events;
386
- constructor(_serviceContainer, _graph) {
387
- super(), this._serviceContainer = _serviceContainer, this._graph = _graph, this._executor = new GraphExecutor({
388
- computeNodeResolver: (node) => resolveComputeNode(node)
389
- }), this._diagnostics = [], this._forcedOutputs = {}, this._runtimeStateInputs = {}, this._runtimeStateOutputs = {}, this.update = new Event(), this.output = new Event(), this.events = new Event();
393
+ output = new Event();
394
+ events = new Event();
395
+ constructor(_computeRuntime, _graph) {
396
+ super(), this._computeRuntime = _computeRuntime, this._graph = _graph;
390
397
  }
391
398
  toJSON() {
392
399
  return {
@@ -456,7 +463,7 @@ var ComputeGraphController = class extends Resource {
456
463
  } catch (err) {
457
464
  log.catch(err, void 0, {
458
465
  F: __dxlog_file4,
459
- L: 199,
466
+ L: 230,
460
467
  S: this,
461
468
  C: (f, a) => f(...a)
462
469
  });
@@ -478,12 +485,11 @@ var ComputeGraphController = class extends Resource {
478
485
  for (const [nodeId2, outputs] of Object.entries(this._forcedOutputs)) {
479
486
  executor.setOutputs(nodeId2, Effect.succeed(ValueBag.make(outputs)));
480
487
  }
481
- const serviceLayer = this._serviceContainer.createLayer();
482
- await Effect.runPromise(Effect.gen(this, function* () {
488
+ unwrapExit(await this._computeRuntime.runPromiseExit(Effect.gen(this, function* () {
483
489
  const scope = yield* Scope.make();
484
490
  const executable = yield* Effect.promise(() => resolveComputeNode(this._graph.getNode(nodeId)));
485
491
  const computingOutputs = executable.exec != null;
486
- const effect = (computingOutputs ? executor.computeOutputs(nodeId) : executor.computeInputs(nodeId)).pipe(Effect.withSpan("runGraph"), Scope.extend(scope), Effect.flatMap(computeValueBag), Effect.provide(serviceLayer), Effect.withSpan("test"), Effect.tap((values) => {
492
+ const effect = (computingOutputs ? executor.computeOutputs(nodeId) : executor.computeInputs(nodeId)).pipe(Effect.withSpan("runGraph"), Scope.extend(scope), Effect.provide(Layer.mergeAll(ComputeEventLogger.layerNoop, Trace.writerLayerNoop)), Effect.flatMap(computeValueBag), Effect.withSpan("test"), Effect.tap((values) => {
487
493
  for (const [key, value] of Object.entries(values)) {
488
494
  if (computingOutputs) {
489
495
  this._onOutputComputed(nodeId, key, value);
@@ -494,7 +500,7 @@ var ComputeGraphController = class extends Resource {
494
500
  }));
495
501
  yield* effect;
496
502
  yield* Scope.close(scope, Exit.void);
497
- }));
503
+ })));
498
504
  this.update.emit();
499
505
  }
500
506
  /**
@@ -515,13 +521,13 @@ var ComputeGraphController = class extends Resource {
515
521
  const allAffectedNodes = [
516
522
  ...new Set(triggerNodes.flatMap((node) => executor.getAllDependantNodes(node.id)))
517
523
  ];
518
- await Effect.runPromise(Effect.gen(this, function* () {
524
+ unwrapExit(await this._computeRuntime.runPromiseExit(Effect.gen(this, function* () {
519
525
  const scope = yield* Scope.make();
520
526
  const tasks = [];
521
527
  for (const node of allAffectedNodes) {
522
528
  const executable = yield* Effect.promise(() => resolveComputeNode(this._graph.getNode(node)));
523
529
  const computingOutputs = executable.exec != null;
524
- const effect = (computingOutputs ? executor.computeOutputs(node) : executor.computeInputs(node)).pipe(Effect.withSpan("runGraph"), Scope.extend(scope), Effect.flatMap(computeValueBag), Effect.provide(this._serviceContainer.createLayer()), Effect.withSpan("test"), Effect.tap((values) => {
530
+ const effect = (computingOutputs ? executor.computeOutputs(node) : executor.computeInputs(node)).pipe(Effect.withSpan("runGraph"), Scope.extend(scope), Effect.flatMap(computeValueBag), Effect.provide(Layer.mergeAll(ComputeEventLogger.layerNoop, Trace.writerLayerNoop)), Effect.withSpan("test"), Effect.tap((values) => {
525
531
  for (const [key, value] of Object.entries(values)) {
526
532
  if (computingOutputs) {
527
533
  this._onOutputComputed(node, key, value);
@@ -534,7 +540,7 @@ var ComputeGraphController = class extends Resource {
534
540
  }
535
541
  yield* Effect.all(tasks);
536
542
  yield* Scope.close(scope, Exit.void);
537
- }));
543
+ })));
538
544
  this.update.emit();
539
545
  }
540
546
  _createLogger() {
@@ -550,7 +556,7 @@ var ComputeGraphController = class extends Resource {
550
556
  event
551
557
  }, {
552
558
  F: __dxlog_file4,
553
- L: 335,
559
+ L: 369,
554
560
  S: this,
555
561
  C: (f, a) => f(...a)
556
562
  });
@@ -627,88 +633,80 @@ var computeValueBag = (bag) => {
627
633
  import { noteShape } from "@dxos/react-ui-canvas-editor";
628
634
 
629
635
  // src/shapes/common/Box.tsx
630
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
631
636
  import React, { forwardRef } from "react";
632
637
  import { invariant as invariant4 } from "@dxos/invariant";
633
638
  import { Icon, IconButton } from "@dxos/react-ui";
634
639
  import { useEditorContext, useShapeDef } from "@dxos/react-ui-canvas-editor";
635
- import { mx } from "@dxos/react-ui-theme";
640
+ import { mx } from "@dxos/ui-theme";
636
641
  var __dxlog_file5 = "/__w/dxos/dxos/packages/ui/react-ui-canvas-compute/src/shapes/common/Box.tsx";
637
642
  var headerHeight = 32;
638
643
  var footerHeight = 32;
639
644
  var Box = /* @__PURE__ */ forwardRef(({ children, classNames, shape, title, status, open, onAction }, forwardedRef) => {
640
- var _effect = _useSignals();
641
- try {
642
- invariant4(shape.type, void 0, {
643
- F: __dxlog_file5,
644
- L: 30,
645
- S: void 0,
646
- A: [
647
- "shape.type",
648
- ""
649
- ]
650
- });
651
- const { icon, name, openable } = useShapeDef(shape.type) ?? {
652
- icon: "ph--placeholder--regular"
653
- };
654
- const { debug } = useEditorContext();
655
- return /* @__PURE__ */ React.createElement("div", {
656
- ref: forwardedRef,
657
- className: "flex flex-col h-full w-full justify-between"
658
- }, /* @__PURE__ */ React.createElement("div", {
659
- className: "flex shrink-0 w-full justify-between items-center h-[32px] bg-hoverSurface"
660
- }, /* @__PURE__ */ React.createElement(Icon, {
661
- icon,
662
- classNames: "mx-2"
663
- }), /* @__PURE__ */ React.createElement("div", {
664
- className: "grow text-sm truncate"
665
- }, debug ? shape.type : name ?? shape.text ?? title), /* @__PURE__ */ React.createElement(IconButton, {
666
- classNames: "p-1 text-green-500",
667
- variant: "ghost",
668
- icon: "ph--play--regular",
669
- size: 4,
670
- label: "run",
671
- iconOnly: true,
672
- onDoubleClick: (ev) => ev.stopPropagation(),
673
- onClick: (ev) => {
674
- ev.stopPropagation();
675
- onAction?.("run");
676
- }
677
- })), /* @__PURE__ */ React.createElement("div", {
678
- className: mx("flex flex-col h-full grow overflow-hidden", classNames)
679
- }, children), /* @__PURE__ */ React.createElement("div", {
680
- className: "flex shrink-0 w-full justify-between items-center h-[32px] bg-hoverSurface"
681
- }, /* @__PURE__ */ React.createElement("div", {
682
- className: "grow px-2 text-sm truncate"
683
- }, debug ? shape.id : status), openable && /* @__PURE__ */ React.createElement(IconButton, {
684
- classNames: "p-1",
685
- variant: "ghost",
686
- icon: open ? "ph--caret-up--regular" : "ph--caret-down--regular",
687
- size: 4,
688
- label: open ? "close" : "open",
689
- iconOnly: true,
690
- onClick: (ev) => {
691
- ev.stopPropagation();
692
- onAction?.(open ? "close" : "open");
693
- }
694
- })));
695
- } finally {
696
- _effect.f();
697
- }
645
+ invariant4(shape.type, void 0, {
646
+ F: __dxlog_file5,
647
+ L: 29,
648
+ S: void 0,
649
+ A: [
650
+ "shape.type",
651
+ ""
652
+ ]
653
+ });
654
+ const { icon, name, openable } = useShapeDef(shape.type) ?? {
655
+ icon: "ph--placeholder--regular"
656
+ };
657
+ const { debug } = useEditorContext();
658
+ return /* @__PURE__ */ React.createElement("div", {
659
+ ref: forwardedRef,
660
+ className: "flex flex-col h-full w-full justify-between"
661
+ }, /* @__PURE__ */ React.createElement("div", {
662
+ className: "flex shrink-0 w-full justify-between items-center h-[32px] bg-input-surface"
663
+ }, /* @__PURE__ */ React.createElement(Icon, {
664
+ icon,
665
+ classNames: "mx-2"
666
+ }), /* @__PURE__ */ React.createElement("div", {
667
+ className: "grow text-sm truncate"
668
+ }, debug ? shape.type : name ?? shape.text ?? title), /* @__PURE__ */ React.createElement(IconButton, {
669
+ classNames: "p-1 text-green-500",
670
+ variant: "ghost",
671
+ icon: "ph--play--regular",
672
+ label: "run",
673
+ iconOnly: true,
674
+ onDoubleClick: (ev) => ev.stopPropagation(),
675
+ onClick: (ev) => {
676
+ ev.stopPropagation();
677
+ onAction?.("run");
678
+ }
679
+ })), /* @__PURE__ */ React.createElement("div", {
680
+ className: mx("flex flex-col h-full grow overflow-hidden", classNames)
681
+ }, children), /* @__PURE__ */ React.createElement("div", {
682
+ className: "flex shrink-0 w-full justify-between items-center h-[32px] bg-input-surface"
683
+ }, /* @__PURE__ */ React.createElement("div", {
684
+ className: "grow px-2 text-sm truncate"
685
+ }, debug ? shape.id : status), openable && /* @__PURE__ */ React.createElement(IconButton, {
686
+ classNames: "p-1",
687
+ variant: "ghost",
688
+ icon: open ? "ph--caret-up--regular" : "ph--caret-down--regular",
689
+ label: open ? "close" : "open",
690
+ iconOnly: true,
691
+ onClick: (ev) => {
692
+ ev.stopPropagation();
693
+ onAction?.(open ? "close" : "open");
694
+ }
695
+ })));
698
696
  });
699
697
 
700
698
  // src/shapes/common/FunctionBody.tsx
701
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
702
- import { SchemaAST as SchemaAST2 } from "effect";
699
+ import * as SchemaAST2 from "effect/SchemaAST";
703
700
  import React2, { useRef, useState as useState3 } from "react";
704
701
  import { VoidInput, VoidOutput } from "@dxos/conductor";
705
702
  import { useCanvasContext } from "@dxos/react-ui-canvas";
706
703
  import { createAnchors, getParentShapeElement, rowHeight } from "@dxos/react-ui-canvas-editor";
707
704
 
708
705
  // src/shapes/defs.ts
709
- import { Schema as Schema2, SchemaAST } from "effect";
706
+ import * as Schema2 from "effect/Schema";
707
+ import * as SchemaAST from "effect/SchemaAST";
710
708
  import { DEFAULT_INPUT as DEFAULT_INPUT2, DEFAULT_OUTPUT as DEFAULT_OUTPUT2 } from "@dxos/conductor";
711
- import { ObjectId as ObjectId3 } from "@dxos/echo-schema";
709
+ import { Obj as Obj3 } from "@dxos/echo";
712
710
  import { Polygon } from "@dxos/react-ui-canvas-editor";
713
711
  var getProperties = (ast) => SchemaAST.getPropertySignatures(ast).map(({ name }) => ({
714
712
  name: name.toString()
@@ -726,13 +724,13 @@ var parseAnchorId = (id) => {
726
724
  };
727
725
  var ComputeShape = Schema2.extend(Polygon, Schema2.Struct({
728
726
  // TODO(burdon): Rename computeNode?
729
- node: Schema2.optional(ObjectId3.annotations({
727
+ node: Schema2.optional(Obj3.ID.annotations({
730
728
  description: "Compute node id"
731
729
  }))
732
730
  }).pipe(Schema2.mutable));
733
731
  var createShape = ({ id, ...rest }) => {
734
732
  return {
735
- id: id ?? ObjectId3.random(),
733
+ id: id ?? Obj3.ID.random(),
736
734
  ...rest
737
735
  };
738
736
  };
@@ -741,70 +739,65 @@ var createShape = ({ id, ...rest }) => {
741
739
  var bodyPadding = 8;
742
740
  var expandedHeight = 200;
743
741
  var FunctionBody = ({ shape, name, content, inputSchema = VoidInput, outputSchema = VoidOutput, ...props }) => {
744
- var _effect = _useSignals2();
745
- try {
746
- const { scale } = useCanvasContext();
747
- const rootRef = useRef(null);
748
- const [open, setOpen] = useState3(false);
749
- const handleAction = (action) => {
750
- if (!rootRef.current) {
751
- return;
752
- }
753
- switch (action) {
754
- case "open": {
755
- const el = getParentShapeElement(rootRef.current, shape.id);
756
- const { height } = el.getBoundingClientRect();
757
- el.style.height = `${height / scale + expandedHeight}px`;
758
- setOpen(true);
759
- break;
760
- }
761
- case "close": {
762
- const el = getParentShapeElement(rootRef.current, shape.id);
763
- el.style.height = "";
764
- setOpen(false);
765
- break;
766
- }
767
- }
768
- };
769
- const inputs = getProperties(inputSchema.ast);
770
- const outputs = getProperties(outputSchema.ast);
771
- const columnCount = inputs.length && outputs.length ? 2 : 1;
772
- return /* @__PURE__ */ React2.createElement(Box, {
773
- ref: rootRef,
774
- shape,
775
- title: name,
776
- classNames: "divide-y divide-separator",
777
- open,
778
- onAction: handleAction,
779
- ...props
780
- }, /* @__PURE__ */ React2.createElement("div", {
781
- className: `grid grid-cols-${columnCount} items-center`,
782
- style: {
783
- paddingTop: bodyPadding,
784
- paddingBottom: bodyPadding
785
- }
786
- }, (inputs?.length ?? 0) > 0 && /* @__PURE__ */ React2.createElement("div", {
787
- className: "flex flex-col"
788
- }, inputs?.map(({ name: name2 }) => /* @__PURE__ */ React2.createElement("div", {
789
- key: name2,
790
- className: "px-2 truncate text-sm font-mono items-center",
791
- style: {
792
- height: rowHeight
742
+ const { scale } = useCanvasContext();
743
+ const rootRef = useRef(null);
744
+ const [open, setOpen] = useState3(false);
745
+ const handleAction = (action) => {
746
+ if (!rootRef.current) {
747
+ return;
748
+ }
749
+ switch (action) {
750
+ case "open": {
751
+ const el = getParentShapeElement(rootRef.current, shape.id);
752
+ const { height } = el.getBoundingClientRect();
753
+ el.style.height = `${height / scale + expandedHeight}px`;
754
+ setOpen(true);
755
+ break;
793
756
  }
794
- }, name2))), (outputs?.length ?? 0) > 0 && /* @__PURE__ */ React2.createElement("div", {
795
- className: "flex flex-col"
796
- }, outputs?.map(({ name: name2 }) => /* @__PURE__ */ React2.createElement("div", {
797
- key: name2,
798
- className: "px-2 truncate text-sm font-mono items-center text-right",
799
- style: {
800
- height: rowHeight
757
+ case "close": {
758
+ const el = getParentShapeElement(rootRef.current, shape.id);
759
+ el.style.height = "";
760
+ setOpen(false);
761
+ break;
801
762
  }
802
- }, name2)))), open && /* @__PURE__ */ React2.createElement("div", {
803
- className: "flex flex-col grow overflow-hidden"
804
- }, content));
805
- } finally {
806
- _effect.f();
807
- }
763
+ }
764
+ };
765
+ const inputs = getProperties(inputSchema.ast);
766
+ const outputs = getProperties(outputSchema.ast);
767
+ const columnCount = inputs.length && outputs.length ? 2 : 1;
768
+ return /* @__PURE__ */ React2.createElement(Box, {
769
+ ref: rootRef,
770
+ shape,
771
+ title: name,
772
+ classNames: "divide-y divide-separator",
773
+ open,
774
+ onAction: handleAction,
775
+ ...props
776
+ }, /* @__PURE__ */ React2.createElement("div", {
777
+ className: `grid grid-cols-${columnCount} items-center`,
778
+ style: {
779
+ paddingTop: bodyPadding,
780
+ paddingBottom: bodyPadding
781
+ }
782
+ }, (inputs?.length ?? 0) > 0 && /* @__PURE__ */ React2.createElement("div", {
783
+ className: "flex flex-col"
784
+ }, inputs?.map(({ name: name2 }) => /* @__PURE__ */ React2.createElement("div", {
785
+ key: name2,
786
+ className: "px-2 truncate text-sm font-mono items-center",
787
+ style: {
788
+ height: rowHeight
789
+ }
790
+ }, name2))), (outputs?.length ?? 0) > 0 && /* @__PURE__ */ React2.createElement("div", {
791
+ className: "flex flex-col"
792
+ }, outputs?.map(({ name: name2 }) => /* @__PURE__ */ React2.createElement("div", {
793
+ key: name2,
794
+ className: "px-2 truncate text-sm font-mono items-center text-right",
795
+ style: {
796
+ height: rowHeight
797
+ }
798
+ }, name2)))), open && /* @__PURE__ */ React2.createElement("div", {
799
+ className: "flex flex-col grow overflow-hidden"
800
+ }, content));
808
801
  };
809
802
  var getHeight = (input) => {
810
803
  const properties = SchemaAST2.getPropertySignatures(input.ast);
@@ -825,47 +818,35 @@ var createFunctionAnchors = (shape, input = VoidInput, output = VoidOutput) => {
825
818
  };
826
819
 
827
820
  // src/shapes/common/TypeSelect.tsx
828
- import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
829
821
  import React3 from "react";
830
822
  import { ComputeValueType } from "@dxos/conductor";
831
823
  import { Select } from "@dxos/react-ui";
832
824
  var TypeSelect = ({ value, onValueChange }) => {
833
- var _effect = _useSignals3();
834
- try {
835
- return /* @__PURE__ */ React3.createElement(Select.Root, {
836
- value,
837
- onValueChange
838
- }, /* @__PURE__ */ React3.createElement(Select.TriggerButton, {
839
- variant: "ghost",
840
- classNames: "w-full !px-0"
841
- }), /* @__PURE__ */ React3.createElement(Select.Portal, null, /* @__PURE__ */ React3.createElement(Select.Content, null, /* @__PURE__ */ React3.createElement(Select.ScrollUpButton, null), /* @__PURE__ */ React3.createElement(Select.Viewport, null, ComputeValueType.literals.map((type) => /* @__PURE__ */ React3.createElement(Select.Option, {
842
- key: type,
843
- value: type
844
- }, type))), /* @__PURE__ */ React3.createElement(Select.ScrollDownButton, null), /* @__PURE__ */ React3.createElement(Select.Arrow, null))));
845
- } finally {
846
- _effect.f();
847
- }
825
+ return /* @__PURE__ */ React3.createElement(Select.Root, {
826
+ value,
827
+ onValueChange
828
+ }, /* @__PURE__ */ React3.createElement(Select.TriggerButton, {
829
+ variant: "ghost",
830
+ classNames: "w-full px-0!"
831
+ }), /* @__PURE__ */ React3.createElement(Select.Portal, null, /* @__PURE__ */ React3.createElement(Select.Content, null, /* @__PURE__ */ React3.createElement(Select.ScrollUpButton, null), /* @__PURE__ */ React3.createElement(Select.Viewport, null, ComputeValueType.literals.map((type) => /* @__PURE__ */ React3.createElement(Select.Option, {
832
+ key: type,
833
+ value: type
834
+ }, type))), /* @__PURE__ */ React3.createElement(Select.ScrollDownButton, null), /* @__PURE__ */ React3.createElement(Select.Arrow, null))));
848
835
  };
849
836
 
850
837
  // src/shapes/Array.tsx
851
- import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
852
- import { Schema as Schema3 } from "effect";
838
+ import * as Schema3 from "effect/Schema";
853
839
  import React4 from "react";
854
840
  import { ReducerInput, ReducerOutput } from "@dxos/conductor";
855
841
  var ReducerShape = Schema3.extend(ComputeShape, Schema3.Struct({
856
842
  type: Schema3.Literal("reducer")
857
843
  }));
858
844
  var ReducerComponent = ({ shape }) => {
859
- var _effect = _useSignals4();
860
- try {
861
- return /* @__PURE__ */ React4.createElement(FunctionBody, {
862
- shape,
863
- inputSchema: ReducerInput,
864
- outputSchema: ReducerOutput
865
- });
866
- } finally {
867
- _effect.f();
868
- }
845
+ return /* @__PURE__ */ React4.createElement(FunctionBody, {
846
+ shape,
847
+ inputSchema: ReducerInput,
848
+ outputSchema: ReducerOutput
849
+ });
869
850
  };
870
851
  var createReducer = ({ id, size = {
871
852
  width: 192,
@@ -885,8 +866,7 @@ var reducerShape = {
885
866
  };
886
867
 
887
868
  // src/shapes/Append.tsx
888
- import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
889
- import { Schema as Schema4 } from "effect";
869
+ import * as Schema4 from "effect/Schema";
890
870
  import React5 from "react";
891
871
  import { AppendInput } from "@dxos/conductor";
892
872
  var AppendShape = Schema4.extend(ComputeShape, Schema4.Struct({
@@ -901,15 +881,10 @@ var createAppend = (props) => createShape({
901
881
  ...props
902
882
  });
903
883
  var AppendComponent = ({ shape }) => {
904
- var _effect = _useSignals5();
905
- try {
906
- return /* @__PURE__ */ React5.createElement(FunctionBody, {
907
- shape,
908
- inputSchema: AppendInput
909
- });
910
- } finally {
911
- _effect.f();
912
- }
884
+ return /* @__PURE__ */ React5.createElement(FunctionBody, {
885
+ shape,
886
+ inputSchema: AppendInput
887
+ });
913
888
  };
914
889
  var appendShape = {
915
890
  type: "append",
@@ -921,8 +896,7 @@ var appendShape = {
921
896
  };
922
897
 
923
898
  // src/shapes/Audio.tsx
924
- import { useSignals as _useSignals6 } from "@preact-signals/safe-react/tracking";
925
- import { Schema as Schema5 } from "effect";
899
+ import * as Schema5 from "effect/Schema";
926
900
  import React6, { useEffect as useEffect3, useState as useState4 } from "react";
927
901
  import { Icon as Icon2 } from "@dxos/react-ui";
928
902
  import { createAnchorMap } from "@dxos/react-ui-canvas-editor";
@@ -938,29 +912,24 @@ var createAudio = (props) => createShape({
938
912
  ...props
939
913
  });
940
914
  var AudioComponent = ({ shape }) => {
941
- var _effect = _useSignals6();
942
- try {
943
- const { node } = useComputeNodeState(shape);
944
- const [active, setActive] = useState4(false);
945
- useEffect3(() => {
946
- node.value = active;
947
- }, [
948
- active
949
- ]);
950
- return /* @__PURE__ */ React6.createElement("div", {
951
- className: "flex w-full justify-center items-center"
952
- }, /* @__PURE__ */ React6.createElement(Icon2, {
953
- icon: active ? "ph--microphone--regular" : "ph--microphone-slash--regular",
954
- classNames: [
955
- "transition opacity-20 duration-1000",
956
- active && "opacity-100 text-red-500"
957
- ],
958
- size: 8,
959
- onClick: () => setActive(!active)
960
- }));
961
- } finally {
962
- _effect.f();
963
- }
915
+ const { node } = useComputeNodeState(shape);
916
+ const [active, setActive] = useState4(false);
917
+ useEffect3(() => {
918
+ node.value = active;
919
+ }, [
920
+ active
921
+ ]);
922
+ return /* @__PURE__ */ React6.createElement("div", {
923
+ className: "flex w-full justify-center items-center"
924
+ }, /* @__PURE__ */ React6.createElement(Icon2, {
925
+ icon: active ? "ph--microphone--regular" : "ph--microphone-slash--regular",
926
+ classNames: [
927
+ "transition opacity-20 duration-1000",
928
+ active && "opacity-100 text-error-text"
929
+ ],
930
+ size: 8,
931
+ onClick: () => setActive(!active)
932
+ }));
964
933
  };
965
934
  var audioShape = {
966
935
  type: "audio",
@@ -977,8 +946,7 @@ var audioShape = {
977
946
  };
978
947
 
979
948
  // src/shapes/Beacon.tsx
980
- import { useSignals as _useSignals7 } from "@preact-signals/safe-react/tracking";
981
- import { Schema as Schema6 } from "effect";
949
+ import * as Schema6 from "effect/Schema";
982
950
  import React7 from "react";
983
951
  import { DEFAULT_INPUT as DEFAULT_INPUT3, isTruthy } from "@dxos/conductor";
984
952
  import { Icon as Icon3 } from "@dxos/react-ui";
@@ -995,24 +963,19 @@ var createBeacon = (props) => createShape({
995
963
  ...props
996
964
  });
997
965
  var BeaconComponent = ({ shape }) => {
998
- var _effect = _useSignals7();
999
- try {
1000
- const { runtime } = useComputeNodeState(shape);
1001
- const input = runtime.inputs[DEFAULT_INPUT3];
1002
- const value = input?.type === "executed" ? input.value : false;
1003
- return /* @__PURE__ */ React7.createElement("div", {
1004
- className: "flex w-full justify-center items-center"
1005
- }, /* @__PURE__ */ React7.createElement(Icon3, {
1006
- icon: "ph--sun--regular",
1007
- classNames: [
1008
- "transition opacity-20 duration-1000",
1009
- isTruthy(value) && "opacity-100 text-yellow-500"
1010
- ],
1011
- size: 8
1012
- }));
1013
- } finally {
1014
- _effect.f();
1015
- }
966
+ const { runtime } = useComputeNodeState(shape);
967
+ const input = runtime.inputs[DEFAULT_INPUT3];
968
+ const value = input?.type === "executed" ? input.value : false;
969
+ return /* @__PURE__ */ React7.createElement("div", {
970
+ className: "flex w-full justify-center items-center"
971
+ }, /* @__PURE__ */ React7.createElement(Icon3, {
972
+ icon: "ph--sun--regular",
973
+ classNames: [
974
+ "transition opacity-20 duration-1000",
975
+ isTruthy(value) && "opacity-100 text-yellow-500"
976
+ ],
977
+ size: 8
978
+ }));
1016
979
  };
1017
980
  var beaconShape = {
1018
981
  type: "beacon",
@@ -1029,7 +992,7 @@ var beaconShape = {
1029
992
  };
1030
993
 
1031
994
  // src/shapes/Boolean.tsx
1032
- import { Schema as Schema7 } from "effect";
995
+ import * as Schema7 from "effect/Schema";
1033
996
  import React8 from "react";
1034
997
  import { getAnchorPoints } from "@dxos/react-ui-canvas-editor";
1035
998
  import { createAnchors as createAnchors2 } from "@dxos/react-ui-canvas-editor";
@@ -1080,7 +1043,7 @@ var createSymbol = (pathConstructor, inputs) => ({
1080
1043
  });
1081
1044
  return /* @__PURE__ */ React8.createElement("svg", {
1082
1045
  viewBox: `0 0 ${width} ${height}`,
1083
- className: "w-full h-full"
1046
+ className: "h-full w-full"
1084
1047
  }, getAnchorPoints({
1085
1048
  x: 0,
1086
1049
  y: centerY
@@ -1202,8 +1165,7 @@ var notShape = defineShape({
1202
1165
  });
1203
1166
 
1204
1167
  // src/shapes/Chat.tsx
1205
- import { useSignals as _useSignals8 } from "@preact-signals/safe-react/tracking";
1206
- import { Schema as Schema8 } from "effect";
1168
+ import * as Schema8 from "effect/Schema";
1207
1169
  import React9, { useRef as useRef2 } from "react";
1208
1170
  import { DEFAULT_OUTPUT as DEFAULT_OUTPUT3 } from "@dxos/conductor";
1209
1171
  import { TextBox } from "@dxos/react-ui-canvas-editor";
@@ -1212,28 +1174,23 @@ var ChatShape = Schema8.extend(ComputeShape, Schema8.Struct({
1212
1174
  type: Schema8.Literal("chat")
1213
1175
  }));
1214
1176
  var TextInputComponent = ({ shape, title, ...props }) => {
1215
- var _effect = _useSignals8();
1216
- try {
1217
- const { runtime } = useComputeNodeState(shape);
1218
- const inputRef = useRef2(null);
1219
- const handleEnter = (text) => {
1220
- const value = text.trim();
1221
- if (value.length) {
1222
- runtime.setOutput(DEFAULT_OUTPUT3, value);
1223
- inputRef.current?.setText("");
1224
- }
1225
- };
1226
- return /* @__PURE__ */ React9.createElement(Box, {
1227
- shape,
1228
- title
1229
- }, /* @__PURE__ */ React9.createElement(TextBox, {
1230
- ref: inputRef,
1231
- onEnter: handleEnter,
1232
- ...props
1233
- }));
1234
- } finally {
1235
- _effect.f();
1236
- }
1177
+ const { runtime } = useComputeNodeState(shape);
1178
+ const inputRef = useRef2(null);
1179
+ const handleEnter = (text) => {
1180
+ const value = text.trim();
1181
+ if (value.length) {
1182
+ runtime.setOutput(DEFAULT_OUTPUT3, value);
1183
+ inputRef.current?.setText("");
1184
+ }
1185
+ };
1186
+ return /* @__PURE__ */ React9.createElement(Box, {
1187
+ shape,
1188
+ title
1189
+ }, /* @__PURE__ */ React9.createElement(TextBox, {
1190
+ ref: inputRef,
1191
+ onEnter: handleEnter,
1192
+ ...props
1193
+ }));
1237
1194
  };
1238
1195
  var createChat = (props) => createShape({
1239
1196
  type: "chat",
@@ -1263,8 +1220,7 @@ var chatShape = {
1263
1220
  };
1264
1221
 
1265
1222
  // src/shapes/Constant.tsx
1266
- import { useSignals as _useSignals9 } from "@preact-signals/safe-react/tracking";
1267
- import { Schema as Schema9 } from "effect";
1223
+ import * as Schema9 from "effect/Schema";
1268
1224
  import React10, { useCallback as useCallback2, useRef as useRef3, useState as useState5 } from "react";
1269
1225
  import { ComputeValueType as ComputeValueType2 } from "@dxos/conductor";
1270
1226
  import { Input } from "@dxos/react-ui";
@@ -1287,57 +1243,52 @@ var inferType = (value) => {
1287
1243
  }
1288
1244
  };
1289
1245
  var ConstantComponent = ({ shape, title, chat, ...props }) => {
1290
- var _effect = _useSignals9();
1291
- try {
1292
- const { node } = useComputeNodeState(shape);
1293
- const [type, setType] = useState5(inferType(node.value) ?? ComputeValueType2.literals[0]);
1294
- const inputRef = useRef3(null);
1295
- const handleEnter = useCallback2((text) => {
1296
- const value = text.trim();
1297
- if (value.length) {
1298
- if (type === "number") {
1299
- const floatValue = parseFloat(value);
1300
- if (!isNaN(floatValue)) {
1301
- node.value = floatValue;
1302
- }
1303
- } else if (type === "object") {
1304
- node.value = safeParseJson(value, {});
1305
- } else {
1306
- node.value = value;
1246
+ const { node } = useComputeNodeState(shape);
1247
+ const [type, setType] = useState5(inferType(node.value) ?? ComputeValueType2.literals[0]);
1248
+ const inputRef = useRef3(null);
1249
+ const handleEnter = useCallback2((text) => {
1250
+ const value = text.trim();
1251
+ if (value.length) {
1252
+ if (type === "number") {
1253
+ const floatValue = parseFloat(value);
1254
+ if (!isNaN(floatValue)) {
1255
+ node.value = floatValue;
1307
1256
  }
1308
- inputRef.current?.focus();
1309
- }
1310
- }, [
1311
- type
1312
- ]);
1313
- return /* @__PURE__ */ React10.createElement(Box, {
1314
- shape,
1315
- title,
1316
- status: /* @__PURE__ */ React10.createElement(TypeSelect, {
1317
- value: type,
1318
- onValueChange: setType
1319
- })
1320
- }, (type === "string" || type === "number") && /* @__PURE__ */ React10.createElement(TextBox2, {
1321
- ...props,
1322
- ref: inputRef,
1323
- value: node.value,
1324
- onEnter: handleEnter
1325
- }), type === "object" && /* @__PURE__ */ React10.createElement(TextBox2, {
1326
- ...props,
1327
- ref: inputRef,
1328
- value: JSON.stringify(node.value, null, 2),
1329
- language: "json"
1330
- }), type === "boolean" && /* @__PURE__ */ React10.createElement("div", {
1331
- className: "flex grow justify-center items-center"
1332
- }, /* @__PURE__ */ React10.createElement(Input.Root, null, /* @__PURE__ */ React10.createElement(Input.Switch, {
1333
- checked: node.value,
1334
- onCheckedChange: (value) => {
1257
+ } else if (type === "object") {
1258
+ node.value = safeParseJson(value, {});
1259
+ } else {
1335
1260
  node.value = value;
1336
1261
  }
1337
- }))));
1338
- } finally {
1339
- _effect.f();
1340
- }
1262
+ inputRef.current?.focus();
1263
+ }
1264
+ }, [
1265
+ type
1266
+ ]);
1267
+ return /* @__PURE__ */ React10.createElement(Box, {
1268
+ shape,
1269
+ title,
1270
+ status: /* @__PURE__ */ React10.createElement(TypeSelect, {
1271
+ value: type,
1272
+ onValueChange: setType
1273
+ })
1274
+ }, (type === "string" || type === "number") && /* @__PURE__ */ React10.createElement(TextBox2, {
1275
+ ...props,
1276
+ ref: inputRef,
1277
+ value: node.value,
1278
+ onEnter: handleEnter
1279
+ }), type === "object" && /* @__PURE__ */ React10.createElement(TextBox2, {
1280
+ ...props,
1281
+ ref: inputRef,
1282
+ value: JSON.stringify(node.value, null, 2),
1283
+ language: "json"
1284
+ }), type === "boolean" && /* @__PURE__ */ React10.createElement("div", {
1285
+ className: "flex grow justify-center items-center"
1286
+ }, /* @__PURE__ */ React10.createElement(Input.Root, null, /* @__PURE__ */ React10.createElement(Input.Switch, {
1287
+ checked: node.value,
1288
+ onCheckedChange: (value) => {
1289
+ node.value = value;
1290
+ }
1291
+ }))));
1341
1292
  };
1342
1293
  var createConstant = (props) => createShape({
1343
1294
  type: "constant",
@@ -1366,8 +1317,7 @@ var constantShape = {
1366
1317
  };
1367
1318
 
1368
1319
  // src/shapes/Database.tsx
1369
- import { useSignals as _useSignals10 } from "@preact-signals/safe-react/tracking";
1370
- import { Schema as Schema10 } from "effect";
1320
+ import * as Schema10 from "effect/Schema";
1371
1321
  import React11 from "react";
1372
1322
  import { createAnchorMap as createAnchorMap5 } from "@dxos/react-ui-canvas-editor";
1373
1323
  var DatabaseShape = Schema10.extend(ComputeShape, Schema10.Struct({
@@ -1382,14 +1332,9 @@ var createDatabase = (props) => createShape({
1382
1332
  ...props
1383
1333
  });
1384
1334
  var DatabaseComponent = ({ shape }) => {
1385
- var _effect = _useSignals10();
1386
- try {
1387
- return /* @__PURE__ */ React11.createElement(Box, {
1388
- shape
1389
- });
1390
- } finally {
1391
- _effect.f();
1392
- }
1335
+ return /* @__PURE__ */ React11.createElement(Box, {
1336
+ shape
1337
+ });
1393
1338
  };
1394
1339
  var databaseShape = {
1395
1340
  type: "database",
@@ -1405,18 +1350,83 @@ var databaseShape = {
1405
1350
  })
1406
1351
  };
1407
1352
 
1353
+ // src/shapes/Feed.tsx
1354
+ import * as Schema11 from "effect/Schema";
1355
+ import React12, { Fragment } from "react";
1356
+ import { DEFAULT_OUTPUT as DEFAULT_OUTPUT4, QueueInput, QueueOutput } from "@dxos/conductor";
1357
+ import { ScrollArea } from "@dxos/react-ui";
1358
+ import { mx as mx2 } from "@dxos/ui-theme";
1359
+ var FeedShape = Schema11.extend(ComputeShape, Schema11.Struct({
1360
+ type: Schema11.Literal("queue")
1361
+ }));
1362
+ var createFeed = (props) => createShape({
1363
+ type: "queue",
1364
+ size: {
1365
+ width: 256,
1366
+ height: 512
1367
+ },
1368
+ ...props
1369
+ });
1370
+ var FeedComponent = ({ shape }) => {
1371
+ const { runtime } = useComputeNodeState(shape);
1372
+ const items = runtime.outputs[DEFAULT_OUTPUT4]?.type === "executed" ? runtime.outputs[DEFAULT_OUTPUT4].value : [];
1373
+ const handleAction = (action) => {
1374
+ if (action === "run") {
1375
+ runtime.evalNode();
1376
+ }
1377
+ };
1378
+ return /* @__PURE__ */ React12.createElement(Box, {
1379
+ shape,
1380
+ status: `${items.length} items`,
1381
+ onAction: handleAction
1382
+ }, /* @__PURE__ */ React12.createElement(ScrollArea.Root, {
1383
+ orientation: "vertical"
1384
+ }, /* @__PURE__ */ React12.createElement(ScrollArea.Viewport, {
1385
+ classNames: "divide-y divide-separator"
1386
+ }, [
1387
+ ...items
1388
+ ].map((item, i) => /* @__PURE__ */ React12.createElement(FeedItem, {
1389
+ key: i,
1390
+ classNames: "p-1 px-2",
1391
+ item
1392
+ })))));
1393
+ };
1394
+ var FeedItem = ({ classNames, item }) => {
1395
+ if (typeof item !== "object") {
1396
+ return /* @__PURE__ */ React12.createElement("div", {
1397
+ className: mx2(classNames, "whitespace-pre-wrap")
1398
+ }, item);
1399
+ }
1400
+ return /* @__PURE__ */ React12.createElement("div", {
1401
+ className: mx2("grid grid-cols-[80px_1fr]", classNames)
1402
+ }, Object.entries(item).map(([key, value]) => /* @__PURE__ */ React12.createElement(Fragment, {
1403
+ key
1404
+ }, /* @__PURE__ */ React12.createElement("div", {
1405
+ className: "p-1 text-xs text-subdued"
1406
+ }, key), /* @__PURE__ */ React12.createElement("div", null, typeof value === "string" ? value : JSON.stringify(value)))));
1407
+ };
1408
+ var feedShape = {
1409
+ type: "feed",
1410
+ name: "Feed",
1411
+ icon: "ph--queue--regular",
1412
+ component: FeedComponent,
1413
+ createShape: createFeed,
1414
+ getAnchors: (shape) => createFunctionAnchors(shape, QueueInput, QueueOutput),
1415
+ resizable: true
1416
+ };
1417
+
1408
1418
  // src/shapes/Function.tsx
1409
- import { useSignals as _useSignals11 } from "@preact-signals/safe-react/tracking";
1410
- import { Schema as Schema11 } from "effect";
1411
- import React12, { useCallback as useCallback3, useRef as useRef4 } from "react";
1419
+ import * as Schema12 from "effect/Schema";
1420
+ import React13, { useCallback as useCallback3, useRef as useRef4 } from "react";
1412
1421
  import { AnyOutput, FunctionInput } from "@dxos/conductor";
1413
- import { Ref as Ref2, getSnapshot, isInstanceOf } from "@dxos/echo-schema";
1414
- import { FunctionType, ScriptType } from "@dxos/functions";
1422
+ import { Ref as Ref2, getSnapshot, isInstanceOf } from "@dxos/echo/internal";
1423
+ import { Script } from "@dxos/functions";
1424
+ import { Operation } from "@dxos/operation";
1415
1425
  import { useClient } from "@dxos/react-client";
1416
1426
  import { Filter, parseId } from "@dxos/react-client/echo";
1417
1427
  import { TextBox as TextBox3 } from "@dxos/react-ui-canvas-editor";
1418
- var FunctionShape = Schema11.extend(ComputeShape, Schema11.Struct({
1419
- type: Schema11.Literal("function")
1428
+ var FunctionShape = Schema12.extend(ComputeShape, Schema12.Struct({
1429
+ type: Schema12.Literal("function")
1420
1430
  }));
1421
1431
  var createFunction = (props) => createShape({
1422
1432
  type: "function",
@@ -1427,59 +1437,54 @@ var createFunction = (props) => createShape({
1427
1437
  ...props
1428
1438
  });
1429
1439
  var TextInputComponent2 = ({ shape, title, ...props }) => {
1430
- var _effect = _useSignals11();
1431
- try {
1432
- const client = useClient();
1433
- const { node, runtime } = useComputeNodeState(shape);
1434
- const inputRef = useRef4(null);
1435
- const handleEnter = useCallback3(async (text) => {
1436
- const value = text.trim();
1437
- const { spaceId, objectId } = parseId(value);
1438
- if (!spaceId || !objectId) {
1439
- return;
1440
- }
1441
- const space = client.spaces.get(spaceId);
1442
- const object = space?.db.getObjectById(objectId);
1443
- if (!space || !isInstanceOf(ScriptType, object)) {
1444
- return;
1445
- }
1446
- const { objects: [fn] } = await space.db.query(Filter.type(FunctionType, {
1447
- source: Ref2.make(object)
1448
- })).run();
1449
- if (!fn) {
1450
- return;
1451
- }
1452
- node.value = value;
1453
- node.function = Ref2.make(fn);
1454
- node.inputSchema = getSnapshot(fn.inputSchema);
1455
- node.outputSchema = getSnapshot(fn.outputSchema);
1456
- }, [
1457
- client,
1458
- node
1459
- ]);
1460
- const handleAction = useCallback3((action) => {
1461
- if (action !== "run") {
1462
- return;
1463
- }
1464
- runtime.evalNode();
1465
- }, [
1466
- runtime
1467
- ]);
1468
- return /* @__PURE__ */ React12.createElement(Box, {
1469
- shape,
1470
- title: "Function",
1471
- onAction: handleAction
1472
- }, /* @__PURE__ */ React12.createElement(TextBox3, {
1473
- ...props,
1474
- ref: inputRef,
1475
- value: node.value,
1476
- language: node.valueType === "object" ? "json" : void 0,
1477
- onBlur: handleEnter,
1478
- onEnter: handleEnter
1479
- }));
1480
- } finally {
1481
- _effect.f();
1482
- }
1440
+ const client = useClient();
1441
+ const { node, runtime } = useComputeNodeState(shape);
1442
+ const inputRef = useRef4(null);
1443
+ const handleEnter = useCallback3(async (text) => {
1444
+ const value = text.trim();
1445
+ const { spaceId, objectId } = parseId(value);
1446
+ if (!spaceId || !objectId) {
1447
+ return;
1448
+ }
1449
+ const space = client.spaces.get(spaceId);
1450
+ const object = space?.db.getObjectById(objectId);
1451
+ if (!space || !isInstanceOf(Script.Script, object)) {
1452
+ return;
1453
+ }
1454
+ const [fn] = await space.db.query(Filter.type(Operation.PersistentOperation, {
1455
+ source: Ref2.make(object)
1456
+ })).run();
1457
+ if (!fn) {
1458
+ return;
1459
+ }
1460
+ node.value = value;
1461
+ node.function = Ref2.make(fn);
1462
+ node.inputSchema = fn.inputSchema ? getSnapshot(fn.inputSchema) : void 0;
1463
+ node.outputSchema = fn.outputSchema ? getSnapshot(fn.outputSchema) : void 0;
1464
+ }, [
1465
+ client,
1466
+ node
1467
+ ]);
1468
+ const handleAction = useCallback3((action) => {
1469
+ if (action !== "run") {
1470
+ return;
1471
+ }
1472
+ runtime.evalNode();
1473
+ }, [
1474
+ runtime
1475
+ ]);
1476
+ return /* @__PURE__ */ React13.createElement(Box, {
1477
+ shape,
1478
+ title: "Function",
1479
+ onAction: handleAction
1480
+ }, /* @__PURE__ */ React13.createElement(TextBox3, {
1481
+ ...props,
1482
+ ref: inputRef,
1483
+ value: node.value,
1484
+ language: node.valueType === "object" ? "json" : void 0,
1485
+ onBlur: handleEnter,
1486
+ onEnter: handleEnter
1487
+ }));
1483
1488
  };
1484
1489
  var functionShape = {
1485
1490
  type: "function",
@@ -1491,12 +1496,12 @@ var functionShape = {
1491
1496
  };
1492
1497
 
1493
1498
  // src/shapes/Gpt.tsx
1494
- import { useSignals as _useSignals12 } from "@preact-signals/safe-react/tracking";
1495
- import { Schema as Schema12 } from "effect";
1496
- import React13, { useEffect as useEffect4, useState as useState6 } from "react";
1499
+ import * as Schema13 from "effect/Schema";
1500
+ import React14, { useEffect as useEffect4, useState as useState6 } from "react";
1497
1501
  import { GptInput, GptOutput } from "@dxos/conductor";
1498
- var GptShape = Schema12.extend(ComputeShape, Schema12.Struct({
1499
- type: Schema12.Literal("gpt")
1502
+ import { ScrollArea as ScrollArea2 } from "@dxos/react-ui";
1503
+ var GptShape = Schema13.extend(ComputeShape, Schema13.Struct({
1504
+ type: Schema13.Literal("gpt")
1500
1505
  }));
1501
1506
  var createGpt = (props) => createShape({
1502
1507
  type: "gpt",
@@ -1507,54 +1512,50 @@ var createGpt = (props) => createShape({
1507
1512
  ...props
1508
1513
  });
1509
1514
  var GptComponent = ({ shape }) => {
1510
- var _effect = _useSignals12();
1511
- try {
1512
- const { meta, runtime } = useComputeNodeState(shape);
1513
- const [text, setText] = useState6("");
1514
- const [tokens, setTokens] = useState6(0);
1515
- useEffect4(() => {
1516
- return runtime.subscribeToEventLog((ev) => {
1517
- switch (ev.type) {
1518
- case "begin-compute": {
1519
- setText("");
1520
- break;
1521
- }
1522
- case "custom": {
1523
- const token = ev.event;
1524
- switch (token.type) {
1525
- case "content_block_delta":
1526
- switch (token.delta.type) {
1527
- case "text_delta": {
1528
- const delta = token.delta.text;
1529
- setText((prev) => {
1530
- const text2 = prev + delta;
1531
- setTokens(text2.split(" ").length);
1532
- return text2;
1533
- });
1534
- break;
1535
- }
1515
+ const { meta, runtime } = useComputeNodeState(shape);
1516
+ const [text, setText] = useState6("");
1517
+ const [tokens, setTokens] = useState6(0);
1518
+ useEffect4(() => {
1519
+ return runtime.subscribeToEventLog((ev) => {
1520
+ switch (ev.type) {
1521
+ case "begin-compute": {
1522
+ setText("");
1523
+ break;
1524
+ }
1525
+ case "custom": {
1526
+ const token = ev.event;
1527
+ switch (token.type) {
1528
+ case "content_block_delta":
1529
+ switch (token.delta.type) {
1530
+ case "text_delta": {
1531
+ const delta = token.delta.text;
1532
+ setText((prev) => {
1533
+ const text2 = prev + delta;
1534
+ setTokens(text2.split(" ").length);
1535
+ return text2;
1536
+ });
1537
+ break;
1536
1538
  }
1537
- break;
1538
- }
1539
- break;
1539
+ }
1540
+ break;
1540
1541
  }
1542
+ break;
1541
1543
  }
1542
- });
1543
- }, [
1544
- runtime?.subscribeToEventLog
1545
- ]);
1546
- return /* @__PURE__ */ React13.createElement(FunctionBody, {
1547
- shape,
1548
- content: /* @__PURE__ */ React13.createElement("div", {
1549
- className: "px-2 py-1 overflow-y-scroll"
1550
- }, text),
1551
- status: `${tokens} tokens`,
1552
- inputSchema: meta.input,
1553
- outputSchema: meta.output
1544
+ }
1554
1545
  });
1555
- } finally {
1556
- _effect.f();
1557
- }
1546
+ }, [
1547
+ runtime?.subscribeToEventLog
1548
+ ]);
1549
+ return /* @__PURE__ */ React14.createElement(FunctionBody, {
1550
+ shape,
1551
+ content: /* @__PURE__ */ React14.createElement(ScrollArea2.Root, {
1552
+ orientation: "vertical",
1553
+ thin: true
1554
+ }, /* @__PURE__ */ React14.createElement(ScrollArea2.Viewport, null, text)),
1555
+ status: `${tokens} tokens`,
1556
+ inputSchema: meta.input,
1557
+ outputSchema: meta.output
1558
+ });
1558
1559
  };
1559
1560
  var gptShape = {
1560
1561
  type: "gpt",
@@ -1566,44 +1567,162 @@ var gptShape = {
1566
1567
  openable: true
1567
1568
  };
1568
1569
 
1570
+ // src/shapes/GptRealtime.tsx
1571
+ import * as Schema14 from "effect/Schema";
1572
+ import React15, { useState as useState7 } from "react";
1573
+ import { log as log2 } from "@dxos/log";
1574
+ import { useConfig } from "@dxos/react-client";
1575
+ import { Icon as Icon4 } from "@dxos/react-ui";
1576
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/ui/react-ui-canvas-compute/src/shapes/GptRealtime.tsx";
1577
+ var GptRealtimeShape = Schema14.extend(ComputeShape, Schema14.Struct({
1578
+ type: Schema14.Literal("gpt-realtime")
1579
+ }));
1580
+ var createGptRealtime = (props) => createShape({
1581
+ type: "gpt-realtime",
1582
+ size: {
1583
+ width: 256,
1584
+ height: 256
1585
+ },
1586
+ ...props
1587
+ });
1588
+ var GptRealtimeComponent = ({ shape }) => {
1589
+ const [isLive, setIsLive] = useState7(false);
1590
+ const [isReady, setIsReady] = useState7(false);
1591
+ const config = useConfig();
1592
+ const start = async () => {
1593
+ setIsLive(true);
1594
+ try {
1595
+ const peerConnection = new RTCPeerConnection();
1596
+ peerConnection.ontrack = (event) => {
1597
+ const audioElement = document.createElement("audio");
1598
+ audioElement.srcObject = event.streams[0];
1599
+ audioElement.autoplay = true;
1600
+ audioElement.controls = false;
1601
+ audioElement.style.display = "none";
1602
+ document.body.appendChild(audioElement);
1603
+ setIsReady(true);
1604
+ };
1605
+ const stream = await navigator.mediaDevices.getUserMedia({
1606
+ audio: true
1607
+ });
1608
+ stream.getTracks().forEach((track) => peerConnection.addTransceiver(track, {
1609
+ direction: "sendrecv"
1610
+ }));
1611
+ const offer = await peerConnection.createOffer();
1612
+ await peerConnection.setLocalDescription(offer);
1613
+ const AiServiceUrl = new URL("/rtc-connect", config.values.runtime?.services?.ai?.server ?? DEFAULT_AI_SERVICE_URL);
1614
+ const response = await fetch(AiServiceUrl, {
1615
+ method: "POST",
1616
+ body: offer.sdp,
1617
+ headers: {
1618
+ "Content-Type": "application/sdp"
1619
+ }
1620
+ });
1621
+ const answer = await response.text();
1622
+ await peerConnection.setRemoteDescription({
1623
+ sdp: answer,
1624
+ type: "answer"
1625
+ });
1626
+ const dataChannel = peerConnection.createDataChannel("response");
1627
+ const configureData = () => {
1628
+ log2.info("Configuring data channel", void 0, {
1629
+ F: __dxlog_file6,
1630
+ L: 87,
1631
+ S: void 0,
1632
+ C: (f, a) => f(...a)
1633
+ });
1634
+ const event = {
1635
+ type: "session.update",
1636
+ session: {
1637
+ modalities: [
1638
+ "text",
1639
+ "audio"
1640
+ ],
1641
+ // Provide the tools. Note they match the keys in the `fns` object above
1642
+ tools: []
1643
+ }
1644
+ };
1645
+ dataChannel.send(JSON.stringify(event));
1646
+ };
1647
+ dataChannel.addEventListener("open", (ev) => {
1648
+ log2.info("Opening data channel", {
1649
+ ev
1650
+ }, {
1651
+ F: __dxlog_file6,
1652
+ L: 100,
1653
+ S: void 0,
1654
+ C: (f, a) => f(...a)
1655
+ });
1656
+ configureData();
1657
+ });
1658
+ dataChannel.addEventListener("message", async (ev) => {
1659
+ const msg = JSON.parse(ev.data);
1660
+ if (msg.type === "response.function_call_arguments.done") {
1661
+ }
1662
+ });
1663
+ } catch (error) {
1664
+ log2.error("Error in realtime session:", {
1665
+ error
1666
+ }, {
1667
+ F: __dxlog_file6,
1668
+ L: 140,
1669
+ S: void 0,
1670
+ C: (f, a) => f(...a)
1671
+ });
1672
+ throw error;
1673
+ }
1674
+ };
1675
+ return /* @__PURE__ */ React15.createElement("div", {
1676
+ className: "flex w-full justify-center items-center"
1677
+ }, /* @__PURE__ */ React15.createElement(Icon4, {
1678
+ icon: isReady ? "ph--waveform--regular" : isLive ? "ph--pulse--regular" : "ph--play--regular",
1679
+ size: 16,
1680
+ classNames: !isLive && "cursor-pointer",
1681
+ onClick: start
1682
+ }));
1683
+ };
1684
+ var gptRealtimeShape = {
1685
+ type: "gpt-realtime",
1686
+ name: "GPT Realtime",
1687
+ icon: "ph--pulse--regular",
1688
+ component: GptRealtimeComponent,
1689
+ createShape: createGptRealtime,
1690
+ // TODO(dmaretskyi): Can we fetch the schema dynamically?
1691
+ getAnchors: (shape) => createFunctionAnchors(shape, Schema14.Struct({
1692
+ audio: Schema14.Any
1693
+ }), Schema14.Struct({})),
1694
+ resizable: true
1695
+ };
1696
+ var DEFAULT_AI_SERVICE_URL = "http://localhost:8788";
1697
+
1569
1698
  // src/shapes/Json.tsx
1570
- import { useSignals as _useSignals13 } from "@preact-signals/safe-react/tracking";
1571
- import { Schema as Schema13 } from "effect";
1572
- import React14 from "react";
1699
+ import * as Schema15 from "effect/Schema";
1700
+ import React16 from "react";
1573
1701
  import { DEFAULT_INPUT as DEFAULT_INPUT4, DefaultOutput, JsonTransformInput } from "@dxos/conductor";
1574
1702
  import { createAnchorMap as createAnchorMap6 } from "@dxos/react-ui-canvas-editor";
1575
- import { JsonFilter } from "@dxos/react-ui-syntax-highlighter";
1576
- var JsonShape = Schema13.extend(ComputeShape, Schema13.Struct({
1577
- type: Schema13.Literal("json")
1703
+ import { Json } from "@dxos/react-ui-syntax-highlighter";
1704
+ var JsonShape = Schema15.extend(ComputeShape, Schema15.Struct({
1705
+ type: Schema15.Literal("json")
1578
1706
  }));
1579
- var JsonTransformShape = Schema13.extend(ComputeShape, Schema13.Struct({
1580
- type: Schema13.Literal("json-transform")
1707
+ var JsonTransformShape = Schema15.extend(ComputeShape, Schema15.Struct({
1708
+ type: Schema15.Literal("json-transform")
1581
1709
  }));
1582
1710
  var JsonComponent = ({ shape, ...props }) => {
1583
- var _effect = _useSignals13();
1584
- try {
1585
- const { runtime } = useComputeNodeState(shape);
1586
- const input = runtime.inputs[DEFAULT_INPUT4];
1587
- const value = input?.type === "executed" ? input.value : void 0;
1588
- return /* @__PURE__ */ React14.createElement(Box, {
1589
- shape
1590
- }, /* @__PURE__ */ React14.createElement(JsonFilter, {
1591
- data: value,
1592
- classNames: "text-xs"
1593
- }));
1594
- } finally {
1595
- _effect.f();
1596
- }
1711
+ const { runtime } = useComputeNodeState(shape);
1712
+ const input = runtime.inputs[DEFAULT_INPUT4];
1713
+ const value = input?.type === "executed" ? input.value : void 0;
1714
+ return /* @__PURE__ */ React16.createElement(Box, {
1715
+ shape
1716
+ }, /* @__PURE__ */ React16.createElement(Json.Root, {
1717
+ data: value
1718
+ }, /* @__PURE__ */ React16.createElement(Json.Content, null, /* @__PURE__ */ React16.createElement(Json.Filter, null), /* @__PURE__ */ React16.createElement(Json.Data, {
1719
+ classNames: "text-xs"
1720
+ }))));
1597
1721
  };
1598
1722
  var JsonTransformComponent = ({ shape, ...props }) => {
1599
- var _effect = _useSignals13();
1600
- try {
1601
- return /* @__PURE__ */ React14.createElement(Box, {
1602
- shape
1603
- });
1604
- } finally {
1605
- _effect.f();
1606
- }
1723
+ return /* @__PURE__ */ React16.createElement(Box, {
1724
+ shape
1725
+ });
1607
1726
  };
1608
1727
  var createJson = (props) => createShape({
1609
1728
  type: "json",
@@ -1617,7 +1736,7 @@ var jsonShape = {
1617
1736
  type: "json",
1618
1737
  name: "JSON",
1619
1738
  icon: "ph--code--regular",
1620
- component: (props) => /* @__PURE__ */ React14.createElement(JsonComponent, props),
1739
+ component: (props) => /* @__PURE__ */ React16.createElement(JsonComponent, props),
1621
1740
  createShape: createJson,
1622
1741
  getAnchors: (shape) => createAnchorMap6(shape, {
1623
1742
  [createAnchorId("input")]: {
@@ -1643,46 +1762,35 @@ var jsonTransformShape = {
1643
1762
  type: "json-transform",
1644
1763
  name: "Transform",
1645
1764
  icon: "ph--shuffle-simple--regular",
1646
- component: (props) => /* @__PURE__ */ React14.createElement(JsonTransformComponent, props),
1765
+ component: (props) => /* @__PURE__ */ React16.createElement(JsonTransformComponent, props),
1647
1766
  createShape: createJsonTransform,
1648
1767
  getAnchors: (shape) => createFunctionAnchors(shape, JsonTransformInput, DefaultOutput),
1649
1768
  resizable: true
1650
1769
  };
1651
1770
 
1652
1771
  // src/shapes/Logic.tsx
1653
- import { useSignals as _useSignals14 } from "@preact-signals/safe-react/tracking";
1654
- import { Schema as Schema14 } from "effect";
1655
- import React15 from "react";
1772
+ import * as Schema16 from "effect/Schema";
1773
+ import React17 from "react";
1656
1774
  import { IfElseInput, IfElseOutput, IfInput, IfOutput } from "@dxos/conductor";
1657
- var IfShape = Schema14.extend(ComputeShape, Schema14.Struct({
1658
- type: Schema14.Literal("if")
1775
+ var IfShape = Schema16.extend(ComputeShape, Schema16.Struct({
1776
+ type: Schema16.Literal("if")
1659
1777
  }));
1660
- var IfElseShape = Schema14.extend(ComputeShape, Schema14.Struct({
1661
- type: Schema14.Literal("if-else")
1778
+ var IfElseShape = Schema16.extend(ComputeShape, Schema16.Struct({
1779
+ type: Schema16.Literal("if-else")
1662
1780
  }));
1663
1781
  var IfComponent = ({ shape, ...props }) => {
1664
- var _effect = _useSignals14();
1665
- try {
1666
- return /* @__PURE__ */ React15.createElement(FunctionBody, {
1667
- shape,
1668
- inputSchema: IfInput,
1669
- outputSchema: IfOutput
1670
- });
1671
- } finally {
1672
- _effect.f();
1673
- }
1782
+ return /* @__PURE__ */ React17.createElement(FunctionBody, {
1783
+ shape,
1784
+ inputSchema: IfInput,
1785
+ outputSchema: IfOutput
1786
+ });
1674
1787
  };
1675
1788
  var IfElseComponent = ({ shape, ...props }) => {
1676
- var _effect = _useSignals14();
1677
- try {
1678
- return /* @__PURE__ */ React15.createElement(FunctionBody, {
1679
- shape,
1680
- inputSchema: IfElseInput,
1681
- outputSchema: IfElseOutput
1682
- });
1683
- } finally {
1684
- _effect.f();
1685
- }
1789
+ return /* @__PURE__ */ React17.createElement(FunctionBody, {
1790
+ shape,
1791
+ inputSchema: IfElseInput,
1792
+ outputSchema: IfElseOutput
1793
+ });
1686
1794
  };
1687
1795
  var createIf = (props) => createShape({
1688
1796
  type: "if",
@@ -1696,7 +1804,7 @@ var ifShape = {
1696
1804
  type: "if",
1697
1805
  name: "IF",
1698
1806
  icon: "ph--arrows-split--regular",
1699
- component: (props) => /* @__PURE__ */ React15.createElement(IfComponent, props),
1807
+ component: (props) => /* @__PURE__ */ React17.createElement(IfComponent, props),
1700
1808
  createShape: createIf,
1701
1809
  getAnchors: (shape) => createFunctionAnchors(shape, IfInput, IfOutput)
1702
1810
  };
@@ -1712,95 +1820,21 @@ var ifElseShape = {
1712
1820
  type: "if-else",
1713
1821
  name: "IF/ELSE",
1714
1822
  icon: "ph--arrows-merge--regular",
1715
- component: (props) => /* @__PURE__ */ React15.createElement(IfElseComponent, props),
1823
+ component: (props) => /* @__PURE__ */ React17.createElement(IfElseComponent, props),
1716
1824
  createShape: createIfElse,
1717
1825
  getAnchors: (shape) => createFunctionAnchors(shape, IfElseInput, IfElseOutput)
1718
1826
  };
1719
1827
 
1720
- // src/shapes/Queue.tsx
1721
- import { useSignals as _useSignals15 } from "@preact-signals/safe-react/tracking";
1722
- import { Schema as Schema15 } from "effect";
1723
- import React16, { Fragment } from "react";
1724
- import { DEFAULT_OUTPUT as DEFAULT_OUTPUT4, QueueInput, QueueOutput } from "@dxos/conductor";
1725
- import { mx as mx2 } from "@dxos/react-ui-theme";
1726
- var QueueShape = Schema15.extend(ComputeShape, Schema15.Struct({
1727
- type: Schema15.Literal("queue")
1728
- }));
1729
- var createQueue = (props) => createShape({
1730
- type: "queue",
1731
- size: {
1732
- width: 256,
1733
- height: 512
1734
- },
1735
- ...props
1736
- });
1737
- var QueueComponent = ({ shape }) => {
1738
- var _effect = _useSignals15();
1739
- try {
1740
- const { runtime } = useComputeNodeState(shape);
1741
- const items = runtime.outputs[DEFAULT_OUTPUT4]?.type === "executed" ? runtime.outputs[DEFAULT_OUTPUT4].value : [];
1742
- const handleAction = (action) => {
1743
- if (action === "run") {
1744
- runtime.evalNode();
1745
- }
1746
- };
1747
- return /* @__PURE__ */ React16.createElement(Box, {
1748
- shape,
1749
- status: `${items.length} items`,
1750
- onAction: handleAction
1751
- }, /* @__PURE__ */ React16.createElement("div", {
1752
- className: "flex flex-col w-full overflow-y-scroll divide-y divide-separator"
1753
- }, [
1754
- ...items
1755
- ].map((item, i) => /* @__PURE__ */ React16.createElement(QueueItem, {
1756
- key: i,
1757
- classNames: "p-1 px-2",
1758
- item
1759
- }))));
1760
- } finally {
1761
- _effect.f();
1762
- }
1763
- };
1764
- var QueueItem = ({ classNames, item }) => {
1765
- var _effect = _useSignals15();
1766
- try {
1767
- if (typeof item !== "object") {
1768
- return /* @__PURE__ */ React16.createElement("div", {
1769
- className: mx2(classNames, "whitespace-pre-wrap")
1770
- }, item);
1771
- }
1772
- return /* @__PURE__ */ React16.createElement("div", {
1773
- className: mx2("grid grid-cols-[80px,1fr]", classNames)
1774
- }, Object.entries(item).map(([key, value]) => /* @__PURE__ */ React16.createElement(Fragment, {
1775
- key
1776
- }, /* @__PURE__ */ React16.createElement("div", {
1777
- className: "p-1 text-xs text-subdued"
1778
- }, key), /* @__PURE__ */ React16.createElement("div", null, typeof value === "string" ? value : JSON.stringify(value)))));
1779
- } finally {
1780
- _effect.f();
1781
- }
1782
- };
1783
- var queueShape = {
1784
- type: "queue",
1785
- name: "Queue",
1786
- icon: "ph--queue--regular",
1787
- component: QueueComponent,
1788
- createShape: createQueue,
1789
- getAnchors: (shape) => createFunctionAnchors(shape, QueueInput, QueueOutput),
1790
- resizable: true
1791
- };
1792
-
1793
1828
  // src/shapes/RNG.tsx
1794
- import { useSignals as _useSignals16 } from "@preact-signals/safe-react/tracking";
1795
- import { Schema as Schema16 } from "effect";
1796
- import React17, { useEffect as useEffect5, useState as useState7 } from "react";
1829
+ import * as Schema17 from "effect/Schema";
1830
+ import React18, { useEffect as useEffect5, useState as useState8 } from "react";
1797
1831
  import { DEFAULT_OUTPUT as DEFAULT_OUTPUT5 } from "@dxos/conductor";
1798
- import { Icon as Icon4 } from "@dxos/react-ui";
1832
+ import { Icon as Icon5 } from "@dxos/react-ui";
1799
1833
  import { createAnchorMap as createAnchorMap7 } from "@dxos/react-ui-canvas-editor";
1800
- var RandomShape = Schema16.extend(ComputeShape, Schema16.Struct({
1801
- type: Schema16.Literal("rng"),
1802
- min: Schema16.optional(Schema16.Number),
1803
- max: Schema16.optional(Schema16.Number)
1834
+ var RandomShape = Schema17.extend(ComputeShape, Schema17.Struct({
1835
+ type: Schema17.Literal("rng"),
1836
+ min: Schema17.optional(Schema17.Number),
1837
+ max: Schema17.optional(Schema17.Number)
1804
1838
  }));
1805
1839
  var createRandom = (props) => createShape({
1806
1840
  type: "rng",
@@ -1820,42 +1854,37 @@ var icons = [
1820
1854
  ];
1821
1855
  var pickIcon = () => icons[Math.floor(Math.random() * icons.length)];
1822
1856
  var RandomComponent = ({ shape }) => {
1823
- var _effect = _useSignals16();
1824
- try {
1825
- const { runtime } = useComputeNodeState(shape);
1826
- const [spin, setSpin] = useState7(false);
1827
- const [icon, setIcon] = useState7(pickIcon());
1828
- useEffect5(() => {
1829
- if (!spin) {
1830
- return;
1831
- }
1832
- const i = setInterval(() => setIcon(pickIcon()), 250);
1833
- const t1 = setTimeout(() => clearInterval(i), 900);
1834
- const t2 = setTimeout(() => setSpin(false), 1100);
1835
- return () => {
1836
- clearInterval(i);
1837
- clearTimeout(t1);
1838
- clearTimeout(t2);
1839
- };
1840
- }, [
1841
- spin
1842
- ]);
1843
- const handleClick = (ev) => {
1844
- ev.stopPropagation();
1845
- runtime.setOutput(DEFAULT_OUTPUT5, Math.random());
1846
- setSpin(true);
1857
+ const { runtime } = useComputeNodeState(shape);
1858
+ const [spin, setSpin] = useState8(false);
1859
+ const [icon, setIcon] = useState8(pickIcon());
1860
+ useEffect5(() => {
1861
+ if (!spin) {
1862
+ return;
1863
+ }
1864
+ const i = setInterval(() => setIcon(pickIcon()), 250);
1865
+ const t1 = setTimeout(() => clearInterval(i), 900);
1866
+ const t2 = setTimeout(() => setSpin(false), 1100);
1867
+ return () => {
1868
+ clearInterval(i);
1869
+ clearTimeout(t1);
1870
+ clearTimeout(t2);
1847
1871
  };
1848
- return /* @__PURE__ */ React17.createElement("div", {
1849
- className: "flex grow items-center justify-center"
1850
- }, /* @__PURE__ */ React17.createElement(Icon4, {
1851
- icon,
1852
- classNames: spin && "animate-[spin_1s]",
1853
- size: 10,
1854
- onClick: handleClick
1855
- }));
1856
- } finally {
1857
- _effect.f();
1858
- }
1872
+ }, [
1873
+ spin
1874
+ ]);
1875
+ const handleClick = (ev) => {
1876
+ ev.stopPropagation();
1877
+ runtime.setOutput(DEFAULT_OUTPUT5, Math.random());
1878
+ setSpin(true);
1879
+ };
1880
+ return /* @__PURE__ */ React18.createElement("div", {
1881
+ className: "flex grow items-center justify-center"
1882
+ }, /* @__PURE__ */ React18.createElement(Icon5, {
1883
+ icon,
1884
+ classNames: spin && "animate-[spin_1s]",
1885
+ size: 10,
1886
+ onClick: handleClick
1887
+ }));
1859
1888
  };
1860
1889
  var randomShape = {
1861
1890
  type: "rng",
@@ -1872,14 +1901,13 @@ var randomShape = {
1872
1901
  };
1873
1902
 
1874
1903
  // src/shapes/Scope.tsx
1875
- import { useSignals as _useSignals17 } from "@preact-signals/safe-react/tracking";
1876
- import { Schema as Schema17 } from "effect";
1877
- import React18 from "react";
1904
+ import * as Schema18 from "effect/Schema";
1905
+ import React19 from "react";
1878
1906
  import { DEFAULT_INPUT as DEFAULT_INPUT5 } from "@dxos/conductor";
1879
1907
  import { createAnchorMap as createAnchorMap8 } from "@dxos/react-ui-canvas-editor";
1880
1908
  import { Chaos, shaderPresets, useAudioStream } from "@dxos/react-ui-sfx";
1881
- var ScopeShape = Schema17.extend(ComputeShape, Schema17.Struct({
1882
- type: Schema17.Literal("scope")
1909
+ var ScopeShape = Schema18.extend(ComputeShape, Schema18.Struct({
1910
+ type: Schema18.Literal("scope")
1883
1911
  }));
1884
1912
  var createScope = (props) => createShape({
1885
1913
  type: "scope",
@@ -1891,25 +1919,20 @@ var createScope = (props) => createShape({
1891
1919
  ...props
1892
1920
  });
1893
1921
  var ScopeComponent = ({ shape }) => {
1894
- var _effect = _useSignals17();
1895
- try {
1896
- const { runtime } = useComputeNodeState(shape);
1897
- const input = runtime.inputs[DEFAULT_INPUT5];
1898
- const active = input?.type === "executed" ? input.value : false;
1899
- const { getAverage } = useAudioStream(active);
1900
- return /* @__PURE__ */ React18.createElement("div", {
1901
- className: "flex w-full justify-center items-center bg-black"
1902
- }, /* @__PURE__ */ React18.createElement(Chaos, {
1903
- active,
1904
- getValue: getAverage,
1905
- options: {
1906
- ...shaderPresets.heptapod,
1907
- zoom: 1.2
1908
- }
1909
- }));
1910
- } finally {
1911
- _effect.f();
1912
- }
1922
+ const { runtime } = useComputeNodeState(shape);
1923
+ const input = runtime.inputs[DEFAULT_INPUT5];
1924
+ const active = input?.type === "executed" ? input.value : false;
1925
+ const { getAverage } = useAudioStream(active);
1926
+ return /* @__PURE__ */ React19.createElement("div", {
1927
+ className: "flex w-full justify-center items-center bg-black"
1928
+ }, /* @__PURE__ */ React19.createElement(Chaos, {
1929
+ active,
1930
+ getValue: getAverage,
1931
+ options: {
1932
+ ...shaderPresets.heptapod,
1933
+ zoom: 1.2
1934
+ }
1935
+ }));
1913
1936
  };
1914
1937
  var scopeShape = {
1915
1938
  type: "scope",
@@ -1926,14 +1949,15 @@ var scopeShape = {
1926
1949
  };
1927
1950
 
1928
1951
  // src/shapes/Surface.tsx
1929
- import { useSignals as _useSignals18 } from "@preact-signals/safe-react/tracking";
1930
- import { Schema as Schema18 } from "effect";
1931
- import React19 from "react";
1932
- import { Surface } from "@dxos/app-framework";
1952
+ import * as Schema19 from "effect/Schema";
1953
+ import React20 from "react";
1954
+ import { Surface } from "@dxos/app-framework/ui";
1955
+ import { AppSurface } from "@dxos/app-toolkit/ui";
1933
1956
  import { DEFAULT_INPUT as DEFAULT_INPUT6 } from "@dxos/conductor";
1957
+ import { Card } from "@dxos/react-ui";
1934
1958
  import { createAnchorMap as createAnchorMap9 } from "@dxos/react-ui-canvas-editor";
1935
- var SurfaceShape = Schema18.extend(ComputeShape, Schema18.Struct({
1936
- type: Schema18.Literal("surface")
1959
+ var SurfaceShape = Schema19.extend(ComputeShape, Schema19.Struct({
1960
+ type: Schema19.Literal("surface")
1937
1961
  }));
1938
1962
  var createSurface = (props) => createShape({
1939
1963
  type: "surface",
@@ -1944,29 +1968,24 @@ var createSurface = (props) => createShape({
1944
1968
  ...props
1945
1969
  });
1946
1970
  var SurfaceComponent = ({ shape }) => {
1947
- var _effect = _useSignals18();
1948
- try {
1949
- const { runtime } = useComputeNodeState(shape);
1950
- const input = runtime.inputs[DEFAULT_INPUT6];
1951
- const value = input?.type === "executed" ? input.value : null;
1952
- const handleAction = (action) => {
1953
- if (action === "run") {
1954
- runtime.evalNode();
1955
- }
1956
- };
1957
- return /* @__PURE__ */ React19.createElement(Box, {
1958
- shape,
1959
- onAction: handleAction
1960
- }, value !== null && /* @__PURE__ */ React19.createElement(Surface, {
1961
- role: "card--extrinsic",
1962
- data: {
1963
- value
1964
- },
1965
- limit: 1
1966
- }));
1967
- } finally {
1968
- _effect.f();
1969
- }
1971
+ const { runtime } = useComputeNodeState(shape);
1972
+ const input = runtime.inputs[DEFAULT_INPUT6];
1973
+ const value = input?.type === "executed" ? input.value : null;
1974
+ const handleAction = (action) => {
1975
+ if (action === "run") {
1976
+ runtime.evalNode();
1977
+ }
1978
+ };
1979
+ return /* @__PURE__ */ React20.createElement(Box, {
1980
+ shape,
1981
+ onAction: handleAction
1982
+ }, /* @__PURE__ */ React20.createElement(Card.Root, null, value !== null && /* @__PURE__ */ React20.createElement(Surface.Surface, {
1983
+ type: AppSurface.Card,
1984
+ data: {
1985
+ subject: value
1986
+ },
1987
+ limit: 1
1988
+ })));
1970
1989
  };
1971
1990
  var surfaceShape = {
1972
1991
  type: "surface",
@@ -1984,14 +2003,13 @@ var surfaceShape = {
1984
2003
  };
1985
2004
 
1986
2005
  // src/shapes/Switch.tsx
1987
- import { useSignals as _useSignals19 } from "@preact-signals/safe-react/tracking";
1988
- import { Schema as Schema19 } from "effect";
1989
- import React20, { useEffect as useEffect6, useState as useState8 } from "react";
2006
+ import * as Schema20 from "effect/Schema";
2007
+ import React21, { useEffect as useEffect6, useState as useState9 } from "react";
1990
2008
  import { DEFAULT_OUTPUT as DEFAULT_OUTPUT6 } from "@dxos/conductor";
1991
2009
  import { Input as Input2 } from "@dxos/react-ui";
1992
2010
  import { createAnchorMap as createAnchorMap10 } from "@dxos/react-ui-canvas-editor";
1993
- var SwitchShape = Schema19.extend(ComputeShape, Schema19.Struct({
1994
- type: Schema19.Literal("switch")
2011
+ var SwitchShape = Schema20.extend(ComputeShape, Schema20.Struct({
2012
+ type: Schema20.Literal("switch")
1995
2013
  }));
1996
2014
  var createSwitch = (props) => createShape({
1997
2015
  type: "switch",
@@ -2002,25 +2020,20 @@ var createSwitch = (props) => createShape({
2002
2020
  ...props
2003
2021
  });
2004
2022
  var SwitchComponent = ({ shape }) => {
2005
- var _effect = _useSignals19();
2006
- try {
2007
- const { runtime } = useComputeNodeState(shape);
2008
- const [value, setValue] = useState8(false);
2009
- useEffect6(() => {
2010
- runtime.setOutput(DEFAULT_OUTPUT6, value);
2011
- }, [
2012
- value
2013
- ]);
2014
- return /* @__PURE__ */ React20.createElement("div", {
2015
- className: "flex w-full justify-center items-center",
2016
- onClick: (ev) => ev.stopPropagation()
2017
- }, /* @__PURE__ */ React20.createElement(Input2.Root, null, /* @__PURE__ */ React20.createElement(Input2.Switch, {
2018
- checked: value,
2019
- onCheckedChange: (value2) => setValue(value2)
2020
- })));
2021
- } finally {
2022
- _effect.f();
2023
- }
2023
+ const { runtime } = useComputeNodeState(shape);
2024
+ const [value, setValue] = useState9(false);
2025
+ useEffect6(() => {
2026
+ runtime.setOutput(DEFAULT_OUTPUT6, value);
2027
+ }, [
2028
+ value
2029
+ ]);
2030
+ return /* @__PURE__ */ React21.createElement("div", {
2031
+ className: "flex w-full justify-center items-center",
2032
+ onClick: (ev) => ev.stopPropagation()
2033
+ }, /* @__PURE__ */ React21.createElement(Input2.Root, null, /* @__PURE__ */ React21.createElement(Input2.Switch, {
2034
+ checked: value,
2035
+ onCheckedChange: (value2) => setValue(value2)
2036
+ })));
2024
2037
  };
2025
2038
  var switchShape = {
2026
2039
  type: "switch",
@@ -2037,15 +2050,14 @@ var switchShape = {
2037
2050
  };
2038
2051
 
2039
2052
  // src/shapes/Table.tsx
2040
- import { useSignals as _useSignals20 } from "@preact-signals/safe-react/tracking";
2041
- import { Schema as Schema20 } from "effect";
2042
- import React21 from "react";
2053
+ import * as Schema21 from "effect/Schema";
2054
+ import React22 from "react";
2043
2055
  import { createInputSchema, createOutputSchema } from "@dxos/conductor";
2044
- import { DataType } from "@dxos/schema";
2045
- var InputSchema = createInputSchema(DataType.Message);
2046
- var OutputSchema = createOutputSchema(Schema20.mutable(Schema20.Array(DataType.Message)));
2047
- var TableShape = Schema20.extend(ComputeShape, Schema20.Struct({
2048
- type: Schema20.Literal("table")
2056
+ import { Message } from "@dxos/types";
2057
+ var InputSchema = createInputSchema(Message.Message);
2058
+ var OutputSchema = createOutputSchema(Schema21.mutable(Schema21.Array(Message.Message)));
2059
+ var TableShape = Schema21.extend(ComputeShape, Schema21.Struct({
2060
+ type: Schema21.Literal("table")
2049
2061
  }));
2050
2062
  var createTable = (props) => createShape({
2051
2063
  type: "table",
@@ -2056,14 +2068,9 @@ var createTable = (props) => createShape({
2056
2068
  ...props
2057
2069
  });
2058
2070
  var TableComponent = ({ shape }) => {
2059
- var _effect = _useSignals20();
2060
- try {
2061
- return /* @__PURE__ */ React21.createElement(Box, {
2062
- shape
2063
- });
2064
- } finally {
2065
- _effect.f();
2066
- }
2071
+ return /* @__PURE__ */ React22.createElement(Box, {
2072
+ shape
2073
+ });
2067
2074
  };
2068
2075
  var tableShape = {
2069
2076
  type: "table",
@@ -2076,62 +2083,56 @@ var tableShape = {
2076
2083
  };
2077
2084
 
2078
2085
  // src/shapes/Template.tsx
2079
- import { useSignals as _useSignals21 } from "@preact-signals/safe-react/tracking";
2080
- import { Schema as Schema21 } from "effect";
2081
- import React22, { useRef as useRef5 } from "react";
2086
+ import * as Schema22 from "effect/Schema";
2087
+ import React23, { useRef as useRef5 } from "react";
2082
2088
  import { ComputeValueType as ComputeValueType3, TemplateOutput, VoidInput as VoidInput2, getTemplateInputSchema as getTemplateInputSchema2 } from "@dxos/conductor";
2083
- import { toJsonSchema as toJsonSchema2 } from "@dxos/echo-schema";
2089
+ import { toJsonSchema } from "@dxos/echo/internal";
2084
2090
  import { invariant as invariant5 } from "@dxos/invariant";
2085
2091
  import { TextBox as TextBox4 } from "@dxos/react-ui-canvas-editor";
2086
- var __dxlog_file6 = "/__w/dxos/dxos/packages/ui/react-ui-canvas-compute/src/shapes/Template.tsx";
2087
- var TemplateShape = Schema21.extend(ComputeShape, Schema21.Struct({
2088
- type: Schema21.Literal("template"),
2089
- valueType: Schema21.optional(ComputeValueType3)
2092
+ var __dxlog_file7 = "/__w/dxos/dxos/packages/ui/react-ui-canvas-compute/src/shapes/Template.tsx";
2093
+ var TemplateShape = Schema22.extend(ComputeShape, Schema22.Struct({
2094
+ type: Schema22.Literal("template"),
2095
+ valueType: Schema22.optional(ComputeValueType3)
2090
2096
  }));
2091
2097
  var TextInputComponent3 = ({ shape, title, ...props }) => {
2092
- var _effect = _useSignals21();
2093
- try {
2094
- const { node } = useComputeNodeState(shape);
2095
- const inputRef = useRef5(null);
2096
- const handleEnter = (text) => {
2097
- const value = text.trim();
2098
- if (value.length) {
2099
- const schema = getTemplateInputSchema2(node);
2100
- node.value = value;
2101
- node.inputSchema = toJsonSchema2(schema);
2102
- }
2103
- };
2104
- const handleTypeChange = (newType) => {
2105
- invariant5(Schema21.is(ComputeValueType3)(newType), "Invalid type", {
2106
- F: __dxlog_file6,
2107
- L: 59,
2108
- S: void 0,
2109
- A: [
2110
- "Schema.is(ComputeValueType)(newType)",
2111
- "'Invalid type'"
2112
- ]
2113
- });
2114
- node.valueType = newType;
2115
- node.inputSchema = toJsonSchema2(getTemplateInputSchema2(node));
2116
- };
2117
- return /* @__PURE__ */ React22.createElement(Box, {
2118
- shape,
2119
- title: "Template",
2120
- status: /* @__PURE__ */ React22.createElement(TypeSelect, {
2121
- value: node.valueType ?? "string",
2122
- onValueChange: handleTypeChange
2123
- })
2124
- }, /* @__PURE__ */ React22.createElement(TextBox4, {
2125
- ...props,
2126
- ref: inputRef,
2127
- value: node.value,
2128
- language: node.valueType === "object" ? "json" : void 0,
2129
- onBlur: handleEnter,
2130
- onEnter: handleEnter
2131
- }));
2132
- } finally {
2133
- _effect.f();
2134
- }
2098
+ const { node } = useComputeNodeState(shape);
2099
+ const inputRef = useRef5(null);
2100
+ const handleEnter = (text) => {
2101
+ const value = text.trim();
2102
+ if (value.length) {
2103
+ const schema = getTemplateInputSchema2(node);
2104
+ node.value = value;
2105
+ node.inputSchema = toJsonSchema(schema);
2106
+ }
2107
+ };
2108
+ const handleTypeChange = (newType) => {
2109
+ invariant5(Schema22.is(ComputeValueType3)(newType), "Invalid type", {
2110
+ F: __dxlog_file7,
2111
+ L: 58,
2112
+ S: void 0,
2113
+ A: [
2114
+ "Schema.is(ComputeValueType)(newType)",
2115
+ "'Invalid type'"
2116
+ ]
2117
+ });
2118
+ node.valueType = newType;
2119
+ node.inputSchema = toJsonSchema(getTemplateInputSchema2(node));
2120
+ };
2121
+ return /* @__PURE__ */ React23.createElement(Box, {
2122
+ shape,
2123
+ title: "Template",
2124
+ status: /* @__PURE__ */ React23.createElement(TypeSelect, {
2125
+ value: node.valueType ?? "string",
2126
+ onValueChange: handleTypeChange
2127
+ })
2128
+ }, /* @__PURE__ */ React23.createElement(TextBox4, {
2129
+ ...props,
2130
+ ref: inputRef,
2131
+ value: node.value,
2132
+ language: node.valueType === "object" ? "json" : void 0,
2133
+ onBlur: handleEnter,
2134
+ onEnter: handleEnter
2135
+ }));
2135
2136
  };
2136
2137
  var createTemplate = (props) => createShape({
2137
2138
  type: "template",
@@ -2145,7 +2146,7 @@ var templateShape = {
2145
2146
  type: "template",
2146
2147
  name: "Template",
2147
2148
  icon: "ph--article--regular",
2148
- component: (props) => /* @__PURE__ */ React22.createElement(TextInputComponent3, {
2149
+ component: (props) => /* @__PURE__ */ React23.createElement(TextInputComponent3, {
2149
2150
  ...props,
2150
2151
  placeholder: "Prompt"
2151
2152
  }),
@@ -2155,14 +2156,13 @@ var templateShape = {
2155
2156
  };
2156
2157
 
2157
2158
  // src/shapes/Text.tsx
2158
- import { useSignals as _useSignals22 } from "@preact-signals/safe-react/tracking";
2159
- import { Schema as Schema22 } from "effect";
2160
- import React23 from "react";
2159
+ import * as Schema23 from "effect/Schema";
2160
+ import React24 from "react";
2161
2161
  import { DEFAULT_INPUT as DEFAULT_INPUT7 } from "@dxos/conductor";
2162
2162
  import { TextBox as TextBox5 } from "@dxos/react-ui-canvas-editor";
2163
2163
  import { createAnchorMap as createAnchorMap11 } from "@dxos/react-ui-canvas-editor";
2164
- var TextShape = Schema22.extend(ComputeShape, Schema22.Struct({
2165
- type: Schema22.Literal("text")
2164
+ var TextShape = Schema23.extend(ComputeShape, Schema23.Struct({
2165
+ type: Schema23.Literal("text")
2166
2166
  }));
2167
2167
  var createText = (props) => createShape({
2168
2168
  type: "text",
@@ -2173,25 +2173,20 @@ var createText = (props) => createShape({
2173
2173
  ...props
2174
2174
  });
2175
2175
  var TextComponent = ({ shape }) => {
2176
- var _effect = _useSignals22();
2177
- try {
2178
- const { runtime } = useComputeNodeState(shape);
2179
- const input = runtime.inputs[DEFAULT_INPUT7];
2180
- const value = input?.type === "executed" ? input.value : 0;
2181
- const handleAction = (action) => {
2182
- if (action === "run") {
2183
- runtime.evalNode();
2184
- }
2185
- };
2186
- return /* @__PURE__ */ React23.createElement(Box, {
2187
- shape,
2188
- onAction: handleAction
2189
- }, /* @__PURE__ */ React23.createElement(TextBox5, {
2190
- value
2191
- }));
2192
- } finally {
2193
- _effect.f();
2194
- }
2176
+ const { runtime } = useComputeNodeState(shape);
2177
+ const input = runtime.inputs[DEFAULT_INPUT7];
2178
+ const value = input?.type === "executed" ? input.value : 0;
2179
+ const handleAction = (action) => {
2180
+ if (action === "run") {
2181
+ runtime.evalNode();
2182
+ }
2183
+ };
2184
+ return /* @__PURE__ */ React24.createElement(Box, {
2185
+ shape,
2186
+ onAction: handleAction
2187
+ }, /* @__PURE__ */ React24.createElement(TextBox5, {
2188
+ value
2189
+ }));
2195
2190
  };
2196
2191
  var textShape = {
2197
2192
  type: "text",
@@ -2209,16 +2204,16 @@ var textShape = {
2209
2204
  };
2210
2205
 
2211
2206
  // src/shapes/Thread.tsx
2212
- import { useSignals as _useSignals23 } from "@preact-signals/safe-react/tracking";
2213
- import { Schema as Schema23 } from "effect";
2214
- import React24, { useEffect as useEffect7, useRef as useRef6 } from "react";
2207
+ import * as Schema24 from "effect/Schema";
2208
+ import React25, { useEffect as useEffect7, useRef as useRef6 } from "react";
2215
2209
  import { createInputSchema as createInputSchema2, createOutputSchema as createOutputSchema2 } from "@dxos/conductor";
2216
- import { mx as mx3 } from "@dxos/react-ui-theme";
2217
- import { DataType as DataType2 } from "@dxos/schema";
2218
- var InputSchema2 = createInputSchema2(DataType2.Message);
2219
- var OutputSchema2 = createOutputSchema2(Schema23.mutable(Schema23.Array(DataType2.Message)));
2220
- var ThreadShape = Schema23.extend(ComputeShape, Schema23.Struct({
2221
- type: Schema23.Literal("thread")
2210
+ import { ScrollArea as ScrollArea3 } from "@dxos/react-ui";
2211
+ import { Message as Message2 } from "@dxos/types";
2212
+ import { mx as mx3 } from "@dxos/ui-theme";
2213
+ var InputSchema2 = createInputSchema2(Message2.Message);
2214
+ var OutputSchema2 = createOutputSchema2(Schema24.mutable(Schema24.Array(Message2.Message)));
2215
+ var ThreadShape = Schema24.extend(ComputeShape, Schema24.Struct({
2216
+ type: Schema24.Literal("thread")
2222
2217
  }));
2223
2218
  var createThread = (props) => createShape({
2224
2219
  type: "thread",
@@ -2229,49 +2224,42 @@ var createThread = (props) => createShape({
2229
2224
  ...props
2230
2225
  });
2231
2226
  var ThreadComponent = ({ shape }) => {
2232
- var _effect = _useSignals23();
2233
- try {
2234
- const items = [];
2235
- const scrollRef = useRef6(null);
2236
- useEffect7(() => {
2237
- if (scrollRef.current) {
2238
- scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
2239
- }
2240
- }, [
2241
- items
2242
- ]);
2243
- return /* @__PURE__ */ React24.createElement(Box, {
2244
- shape
2245
- }, /* @__PURE__ */ React24.createElement("div", {
2246
- ref: scrollRef,
2247
- className: "flex flex-col w-full overflow-y-scroll gap-2 p-2"
2248
- }, [
2249
- ...items
2250
- ].map((item, i) => /* @__PURE__ */ React24.createElement(ThreadItem, {
2251
- key: i,
2252
- item
2253
- }))));
2254
- } finally {
2255
- _effect.f();
2256
- }
2227
+ const items = [];
2228
+ const scrollRef = useRef6(null);
2229
+ useEffect7(() => {
2230
+ if (scrollRef.current) {
2231
+ scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
2232
+ }
2233
+ }, [
2234
+ items
2235
+ ]);
2236
+ return /* @__PURE__ */ React25.createElement(Box, {
2237
+ shape
2238
+ }, /* @__PURE__ */ React25.createElement(ScrollArea3.Root, {
2239
+ orientation: "vertical"
2240
+ }, /* @__PURE__ */ React25.createElement(ScrollArea3.Viewport, {
2241
+ classNames: "gap-2 p-2",
2242
+ ref: scrollRef
2243
+ }, [
2244
+ ...items
2245
+ ].map((item, i) => /* @__PURE__ */ React25.createElement(ThreadItem, {
2246
+ key: i,
2247
+ item
2248
+ })))));
2257
2249
  };
2258
2250
  var ThreadItem = ({ classNames, item }) => {
2259
- var _effect = _useSignals23();
2260
- try {
2261
- if (typeof item !== "object") {
2262
- return /* @__PURE__ */ React24.createElement("div", {
2263
- className: mx3(classNames)
2264
- }, item);
2265
- }
2266
- const { role, message } = item;
2267
- return /* @__PURE__ */ React24.createElement("div", {
2268
- className: mx3("flex", classNames, role === "user" && "justify-end")
2269
- }, /* @__PURE__ */ React24.createElement("div", {
2270
- className: mx3("block rounded-md p-1 px-2 text-sm", role === "user" ? "bg-blue-100 dark:bg-blue-800" : role === "system" ? "bg-red-100, dark:bg-red-800" : "whitespace-pre-wrap bg-neutral-50 dark:bg-neutral-800")
2271
- }, message));
2272
- } finally {
2273
- _effect.f();
2251
+ if (typeof item !== "object") {
2252
+ return /* @__PURE__ */ React25.createElement("div", {
2253
+ role: "none",
2254
+ className: mx3(classNames)
2255
+ }, item);
2274
2256
  }
2257
+ const { role, message } = item;
2258
+ return /* @__PURE__ */ React25.createElement("div", {
2259
+ className: mx3("flex", classNames, role === "user" && "justify-end")
2260
+ }, /* @__PURE__ */ React25.createElement("div", {
2261
+ className: mx3("block rounded-md p-1 px-2 text-sm", role === "user" ? "bg-blue-100 dark:bg-blue-800" : role === "system" ? "bg-red-100, dark:bg-red-800" : "whitespace-pre-wrap bg-neutral-50 dark:bg-neutral-800")
2262
+ }, message));
2275
2263
  };
2276
2264
  var threadShape = {
2277
2265
  type: "thread",
@@ -2284,12 +2272,11 @@ var threadShape = {
2284
2272
  };
2285
2273
 
2286
2274
  // src/shapes/TextToImage.tsx
2287
- import { useSignals as _useSignals24 } from "@preact-signals/safe-react/tracking";
2288
- import { Schema as Schema24 } from "effect";
2289
- import React25 from "react";
2275
+ import * as Schema25 from "effect/Schema";
2276
+ import React26 from "react";
2290
2277
  import { createAnchorMap as createAnchorMap12 } from "@dxos/react-ui-canvas-editor";
2291
- var TextToImageShape = Schema24.extend(ComputeShape, Schema24.Struct({
2292
- type: Schema24.Literal("text-to-image")
2278
+ var TextToImageShape = Schema25.extend(ComputeShape, Schema25.Struct({
2279
+ type: Schema25.Literal("text-to-image")
2293
2280
  }));
2294
2281
  var createTextToImage = (props) => createShape({
2295
2282
  type: "text-to-image",
@@ -2300,14 +2287,9 @@ var createTextToImage = (props) => createShape({
2300
2287
  ...props
2301
2288
  });
2302
2289
  var TextToImageComponent = ({ shape }) => {
2303
- var _effect = _useSignals24();
2304
- try {
2305
- return /* @__PURE__ */ React25.createElement(Box, {
2306
- shape
2307
- });
2308
- } finally {
2309
- _effect.f();
2310
- }
2290
+ return /* @__PURE__ */ React26.createElement(Box, {
2291
+ shape
2292
+ });
2311
2293
  };
2312
2294
  var textToImageShape = {
2313
2295
  type: "text-to-image",
@@ -2324,21 +2306,20 @@ var textToImageShape = {
2324
2306
  };
2325
2307
 
2326
2308
  // src/shapes/Trigger.tsx
2327
- import { useSignals as _useSignals25 } from "@preact-signals/safe-react/tracking";
2328
- import { Schema as Schema25 } from "effect";
2329
- import React26, { useEffect as useEffect8 } from "react";
2309
+ import * as Schema26 from "effect/Schema";
2310
+ import React27, { useEffect as useEffect8 } from "react";
2330
2311
  import { VoidInput as VoidInput3 } from "@dxos/conductor";
2331
- import { ObjectId as ObjectId4, Ref as Ref3 } from "@dxos/echo-schema";
2332
- import { EmailTriggerOutput, FunctionTrigger, QueueTriggerOutput, SubscriptionTriggerOutput, TimerTriggerOutput, TriggerKind, WebhookTriggerOutput } from "@dxos/functions";
2312
+ import { Filter as Filter2, Obj as Obj4, Query, Ref as Ref3 } from "@dxos/echo";
2313
+ import { Trigger, TriggerEvent } from "@dxos/functions";
2333
2314
  import { DXN, SpaceId } from "@dxos/keys";
2334
- import { live, useSpace } from "@dxos/react-client/echo";
2315
+ import { useSpaces } from "@dxos/react-client/echo";
2335
2316
  import { Select as Select2 } from "@dxos/react-ui";
2336
- var TriggerShape = Schema25.extend(ComputeShape, Schema25.Struct({
2337
- type: Schema25.Literal("trigger"),
2338
- functionTrigger: Schema25.optional(Ref3(FunctionTrigger))
2317
+ var TriggerShape = Schema26.extend(ComputeShape, Schema26.Struct({
2318
+ type: Schema26.Literal("trigger"),
2319
+ functionTrigger: Schema26.optional(Ref3.Ref(Trigger.Trigger))
2339
2320
  }));
2340
2321
  var createTrigger = (props) => {
2341
- const functionTrigger = live(FunctionTrigger, {
2322
+ const functionTrigger = Trigger.make({
2342
2323
  enabled: true,
2343
2324
  spec: createTriggerSpec(props)
2344
2325
  });
@@ -2347,115 +2328,97 @@ var createTrigger = (props) => {
2347
2328
  functionTrigger: Ref3.make(functionTrigger),
2348
2329
  size: {
2349
2330
  width: 192,
2350
- height: getHeight(EmailTriggerOutput)
2331
+ height: getHeight(TriggerEvent.EmailEvent)
2351
2332
  },
2352
2333
  ...props
2353
2334
  });
2354
2335
  };
2355
2336
  var TriggerComponent = ({ shape }) => {
2356
- var _effect = _useSignals25();
2357
- try {
2358
- const space = useSpace();
2359
- const functionTrigger = shape.functionTrigger?.target;
2360
- useEffect8(() => {
2361
- if (functionTrigger && !functionTrigger.spec) {
2362
- functionTrigger.spec = createTriggerSpec({
2363
- triggerKind: TriggerKind.Email,
2337
+ const [space] = useSpaces();
2338
+ const functionTrigger = shape.functionTrigger?.target;
2339
+ useEffect8(() => {
2340
+ if (functionTrigger && !functionTrigger.spec) {
2341
+ Obj4.change(functionTrigger, (functionTrigger2) => {
2342
+ functionTrigger2.spec = createTriggerSpec({
2343
+ triggerKind: "email",
2364
2344
  spaceId: space?.id
2365
2345
  });
2366
- }
2367
- }, [
2368
- functionTrigger,
2369
- functionTrigger?.spec
2370
- ]);
2371
- useEffect8(() => {
2372
- shape.size.height = getHeight(getOutputSchema(functionTrigger?.spec?.kind ?? TriggerKind.Email));
2373
- }, [
2374
- functionTrigger?.spec?.kind
2375
- ]);
2376
- const setKind = (kind) => {
2377
- if (functionTrigger?.spec?.kind !== kind) {
2378
- functionTrigger.spec = createTriggerSpec({
2346
+ });
2347
+ }
2348
+ }, [
2349
+ functionTrigger,
2350
+ functionTrigger?.spec
2351
+ ]);
2352
+ useEffect8(() => {
2353
+ shape.size.height = getHeight(getOutputSchema(functionTrigger?.spec?.kind ?? "email"));
2354
+ }, [
2355
+ functionTrigger?.spec?.kind
2356
+ ]);
2357
+ const setKind = (kind) => {
2358
+ if (functionTrigger?.spec?.kind !== kind) {
2359
+ Obj4.change(functionTrigger, (obj) => {
2360
+ obj.spec = createTriggerSpec({
2379
2361
  triggerKind: kind,
2380
2362
  spaceId: space?.id
2381
2363
  });
2382
- }
2383
- };
2384
- if (!functionTrigger?.spec) {
2385
- return;
2364
+ });
2386
2365
  }
2387
- return /* @__PURE__ */ React26.createElement(FunctionBody, {
2388
- shape,
2389
- status: /* @__PURE__ */ React26.createElement(TriggerKindSelect, {
2390
- value: functionTrigger.spec?.kind,
2391
- onValueChange: (kind) => setKind(kind)
2392
- }),
2393
- inputSchema: VoidInput3,
2394
- outputSchema: getOutputSchema(functionTrigger.spec.kind)
2395
- });
2396
- } finally {
2397
- _effect.f();
2366
+ };
2367
+ if (!functionTrigger?.spec) {
2368
+ return;
2398
2369
  }
2370
+ return /* @__PURE__ */ React27.createElement(FunctionBody, {
2371
+ shape,
2372
+ status: /* @__PURE__ */ React27.createElement(TriggerKindSelect, {
2373
+ value: functionTrigger.spec?.kind,
2374
+ onValueChange: (kind) => setKind(kind)
2375
+ }),
2376
+ inputSchema: VoidInput3,
2377
+ outputSchema: getOutputSchema(functionTrigger.spec.kind)
2378
+ });
2399
2379
  };
2400
2380
  var TriggerKindSelect = ({ value, onValueChange }) => {
2401
- var _effect = _useSignals25();
2402
- try {
2403
- return /* @__PURE__ */ React26.createElement(Select2.Root, {
2404
- value,
2405
- onValueChange
2406
- }, /* @__PURE__ */ React26.createElement(Select2.TriggerButton, {
2407
- variant: "ghost",
2408
- classNames: "w-full !px-0"
2409
- }), /* @__PURE__ */ React26.createElement(Select2.Portal, null, /* @__PURE__ */ React26.createElement(Select2.Content, null, /* @__PURE__ */ React26.createElement(Select2.ScrollUpButton, null), /* @__PURE__ */ React26.createElement(Select2.Viewport, null, Object.values(TriggerKind).map((kind) => /* @__PURE__ */ React26.createElement(Select2.Option, {
2410
- key: kind,
2411
- value: kind
2412
- }, kind))), /* @__PURE__ */ React26.createElement(Select2.ScrollDownButton, null), /* @__PURE__ */ React26.createElement(Select2.Arrow, null))));
2413
- } finally {
2414
- _effect.f();
2415
- }
2381
+ return /* @__PURE__ */ React27.createElement(Select2.Root, {
2382
+ value,
2383
+ onValueChange
2384
+ }, /* @__PURE__ */ React27.createElement(Select2.TriggerButton, {
2385
+ variant: "ghost",
2386
+ classNames: "w-full px-0!"
2387
+ }), /* @__PURE__ */ React27.createElement(Select2.Portal, null, /* @__PURE__ */ React27.createElement(Select2.Content, null, /* @__PURE__ */ React27.createElement(Select2.ScrollUpButton, null), /* @__PURE__ */ React27.createElement(Select2.Viewport, null, Trigger.Kinds.map((kind) => /* @__PURE__ */ React27.createElement(Select2.Option, {
2388
+ key: kind,
2389
+ value: kind
2390
+ }, kind))), /* @__PURE__ */ React27.createElement(Select2.ScrollDownButton, null), /* @__PURE__ */ React27.createElement(Select2.Arrow, null))));
2416
2391
  };
2417
2392
  var createTriggerSpec = (props) => {
2418
- const kind = props.triggerKind ?? TriggerKind.Email;
2393
+ const kind = props.triggerKind ?? "email";
2419
2394
  switch (kind) {
2420
- case TriggerKind.Timer:
2421
- return {
2422
- kind: TriggerKind.Timer,
2423
- cron: "*/10 * * * * *"
2424
- };
2425
- case TriggerKind.Webhook:
2426
- return {
2427
- kind: TriggerKind.Webhook,
2395
+ case "timer":
2396
+ return Trigger.specTimer("*/10 * * * * *");
2397
+ case "webhook":
2398
+ return Trigger.specWebhook({
2428
2399
  method: "POST"
2429
- };
2430
- case TriggerKind.Subscription:
2431
- return {
2432
- kind: TriggerKind.Subscription,
2433
- filter: {}
2434
- };
2435
- case TriggerKind.Email:
2436
- return {
2437
- kind: TriggerKind.Email
2438
- };
2439
- case TriggerKind.Queue: {
2400
+ });
2401
+ case "subscription":
2402
+ return Trigger.specSubscription(Query.select(Filter2.nothing()));
2403
+ case "email":
2404
+ return Trigger.specEmail();
2405
+ case "queue": {
2440
2406
  const dxn = new DXN(DXN.kind.QUEUE, [
2441
2407
  "data",
2442
2408
  props.spaceId ?? SpaceId.random(),
2443
- ObjectId4.random()
2409
+ Obj4.ID.random()
2444
2410
  ]).toString();
2445
- return {
2446
- kind: TriggerKind.Queue,
2447
- queue: dxn
2448
- };
2411
+ return Trigger.specQueue(dxn);
2449
2412
  }
2450
2413
  }
2451
2414
  };
2452
2415
  var getOutputSchema = (kind) => {
2453
2416
  const kindToSchema = {
2454
- [TriggerKind.Email]: EmailTriggerOutput,
2455
- [TriggerKind.Subscription]: SubscriptionTriggerOutput,
2456
- [TriggerKind.Timer]: TimerTriggerOutput,
2457
- [TriggerKind.Webhook]: WebhookTriggerOutput,
2458
- [TriggerKind.Queue]: QueueTriggerOutput
2417
+ ["email"]: TriggerEvent.EmailEvent,
2418
+ ["subscription"]: TriggerEvent.SubscriptionEvent,
2419
+ ["timer"]: TriggerEvent.TimerEvent,
2420
+ ["webhook"]: TriggerEvent.WebhookEvent,
2421
+ ["queue"]: TriggerEvent.QueueEvent
2459
2422
  };
2460
2423
  return kindToSchema[kind];
2461
2424
  };
@@ -2465,142 +2428,8 @@ var triggerShape = {
2465
2428
  icon: "ph--lightning--regular",
2466
2429
  component: TriggerComponent,
2467
2430
  createShape: createTrigger,
2468
- getAnchors: (shape) => createFunctionAnchors(shape, VoidInput3, getOutputSchema(shape.functionTrigger?.target?.spec?.kind ?? TriggerKind.Email))
2469
- };
2470
-
2471
- // src/shapes/GptRealtime.tsx
2472
- import { useSignals as _useSignals26 } from "@preact-signals/safe-react/tracking";
2473
- import { Schema as Schema26 } from "effect";
2474
- import React27, { useState as useState9 } from "react";
2475
- import { log as log2 } from "@dxos/log";
2476
- import { useConfig } from "@dxos/react-client";
2477
- import { Icon as Icon5 } from "@dxos/react-ui";
2478
- var __dxlog_file7 = "/__w/dxos/dxos/packages/ui/react-ui-canvas-compute/src/shapes/GptRealtime.tsx";
2479
- var GptRealtimeShape = Schema26.extend(ComputeShape, Schema26.Struct({
2480
- type: Schema26.Literal("gpt-realtime")
2481
- }));
2482
- var createGptRealtime = (props) => createShape({
2483
- type: "gpt-realtime",
2484
- size: {
2485
- width: 256,
2486
- height: 256
2487
- },
2488
- ...props
2489
- });
2490
- var GptRealtimeComponent = ({ shape }) => {
2491
- var _effect = _useSignals26();
2492
- try {
2493
- const [isLive, setIsLive] = useState9(false);
2494
- const [isReady, setIsReady] = useState9(false);
2495
- const config = useConfig();
2496
- const start = async () => {
2497
- setIsLive(true);
2498
- try {
2499
- const peerConnection = new RTCPeerConnection();
2500
- peerConnection.ontrack = (event) => {
2501
- const audioElement = document.createElement("audio");
2502
- audioElement.srcObject = event.streams[0];
2503
- audioElement.autoplay = true;
2504
- audioElement.controls = false;
2505
- audioElement.style.display = "none";
2506
- document.body.appendChild(audioElement);
2507
- setIsReady(true);
2508
- };
2509
- const stream = await navigator.mediaDevices.getUserMedia({
2510
- audio: true
2511
- });
2512
- stream.getTracks().forEach((track) => peerConnection.addTransceiver(track, {
2513
- direction: "sendrecv"
2514
- }));
2515
- const offer = await peerConnection.createOffer();
2516
- await peerConnection.setLocalDescription(offer);
2517
- const AiServiceUrl = new URL("/rtc-connect", config.values.runtime?.services?.ai?.server ?? DEFAULT_AI_SERVICE_URL);
2518
- const response = await fetch(AiServiceUrl, {
2519
- method: "POST",
2520
- body: offer.sdp,
2521
- headers: {
2522
- "Content-Type": "application/sdp"
2523
- }
2524
- });
2525
- const answer = await response.text();
2526
- await peerConnection.setRemoteDescription({
2527
- sdp: answer,
2528
- type: "answer"
2529
- });
2530
- const dataChannel = peerConnection.createDataChannel("response");
2531
- const configureData = () => {
2532
- log2.info("Configuring data channel", void 0, {
2533
- F: __dxlog_file7,
2534
- L: 87,
2535
- S: void 0,
2536
- C: (f, a) => f(...a)
2537
- });
2538
- const event = {
2539
- type: "session.update",
2540
- session: {
2541
- modalities: [
2542
- "text",
2543
- "audio"
2544
- ],
2545
- // Provide the tools. Note they match the keys in the `fns` object above
2546
- tools: []
2547
- }
2548
- };
2549
- dataChannel.send(JSON.stringify(event));
2550
- };
2551
- dataChannel.addEventListener("open", (ev) => {
2552
- log2.info("Opening data channel", {
2553
- ev
2554
- }, {
2555
- F: __dxlog_file7,
2556
- L: 100,
2557
- S: void 0,
2558
- C: (f, a) => f(...a)
2559
- });
2560
- configureData();
2561
- });
2562
- dataChannel.addEventListener("message", async (ev) => {
2563
- const msg = JSON.parse(ev.data);
2564
- if (msg.type === "response.function_call_arguments.done") {
2565
- }
2566
- });
2567
- } catch (error) {
2568
- log2.error("Error in realtime session:", {
2569
- error
2570
- }, {
2571
- F: __dxlog_file7,
2572
- L: 140,
2573
- S: void 0,
2574
- C: (f, a) => f(...a)
2575
- });
2576
- throw error;
2577
- }
2578
- };
2579
- return /* @__PURE__ */ React27.createElement("div", {
2580
- className: "flex w-full justify-center items-center"
2581
- }, /* @__PURE__ */ React27.createElement(Icon5, {
2582
- icon: isReady ? "ph--waveform--regular" : isLive ? "ph--pulse--regular" : "ph--play--regular",
2583
- size: 16,
2584
- classNames: !isLive && "cursor-pointer",
2585
- onClick: start
2586
- }));
2587
- } finally {
2588
- _effect.f();
2589
- }
2431
+ getAnchors: (shape) => createFunctionAnchors(shape, VoidInput3, getOutputSchema(shape.functionTrigger?.target?.spec?.kind ?? "email"))
2590
2432
  };
2591
- var gptRealtimeShape = {
2592
- type: "gpt-realtime",
2593
- name: "GPT Realtime",
2594
- icon: "ph--pulse--regular",
2595
- component: GptRealtimeComponent,
2596
- createShape: createGptRealtime,
2597
- // TODO(dmaretskyi): Can we fetch the schema dynamically?
2598
- getAnchors: (shape) => createFunctionAnchors(shape, Schema26.Struct({
2599
- audio: Schema26.Any
2600
- }), Schema26.Struct({})),
2601
- resizable: true
2602
- };
2603
- var DEFAULT_AI_SERVICE_URL = "http://localhost:8788";
2604
2433
 
2605
2434
  // src/registry.ts
2606
2435
  var computeShapes = [
@@ -2647,7 +2476,7 @@ var computeShapes = [
2647
2476
  shapes: [
2648
2477
  //
2649
2478
  jsonShape,
2650
- queueShape,
2479
+ feedShape,
2651
2480
  threadShape,
2652
2481
  textShape,
2653
2482
  surfaceShape,
@@ -2666,7 +2495,7 @@ var computeShapes = [
2666
2495
 
2667
2496
  // src/compute-layout.ts
2668
2497
  import { DefaultInput, DefaultOutput as DefaultOutput2 } from "@dxos/conductor";
2669
- import { toEffectSchema } from "@dxos/echo-schema";
2498
+ import { toEffectSchema } from "@dxos/echo/internal";
2670
2499
  import { ShapeLayout } from "@dxos/react-ui-canvas-editor";
2671
2500
  var ComputeShapeLayout = class extends ShapeLayout {
2672
2501
  _controller;
@@ -2706,6 +2535,9 @@ export {
2706
2535
  ConstantShape,
2707
2536
  DatabaseComponent,
2708
2537
  DatabaseShape,
2538
+ FeedComponent,
2539
+ FeedItem,
2540
+ FeedShape,
2709
2541
  FunctionBody,
2710
2542
  FunctionShape,
2711
2543
  GptComponent,
@@ -2723,9 +2555,6 @@ export {
2723
2555
  JsonTransformShape,
2724
2556
  NotShape,
2725
2557
  OrShape,
2726
- QueueComponent,
2727
- QueueItem,
2728
- QueueShape,
2729
2558
  RandomComponent,
2730
2559
  RandomShape,
2731
2560
  ReducerComponent,
@@ -2768,6 +2597,7 @@ export {
2768
2597
  createComputeNode,
2769
2598
  createConstant,
2770
2599
  createDatabase,
2600
+ createFeed,
2771
2601
  createFunction,
2772
2602
  createFunctionAnchors,
2773
2603
  createGpt,
@@ -2778,7 +2608,6 @@ export {
2778
2608
  createJsonTransform,
2779
2609
  createNot,
2780
2610
  createOr,
2781
- createQueue,
2782
2611
  createRandom,
2783
2612
  createReducer,
2784
2613
  createScope,
@@ -2792,6 +2621,7 @@ export {
2792
2621
  createThread,
2793
2622
  createTrigger,
2794
2623
  databaseShape,
2624
+ feedShape,
2795
2625
  footerHeight,
2796
2626
  functionShape,
2797
2627
  getHeight,
@@ -2808,7 +2638,6 @@ export {
2808
2638
  notShape,
2809
2639
  orShape,
2810
2640
  parseAnchorId,
2811
- queueShape,
2812
2641
  randomShape,
2813
2642
  reducerShape,
2814
2643
  resolveComputeNode,