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