@dxos/react-ui-canvas-compute 0.8.4-main.f9ba587 → 0.8.4-main.fcc0d83b33

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