@dxos/plugin-debug 0.7.5-labs.5f04cf6 → 0.7.5-labs.e27f9b9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/lib/browser/SpaceGenerator-4VO7E5P2.mjs +846 -0
  2. package/dist/lib/browser/SpaceGenerator-4VO7E5P2.mjs.map +7 -0
  3. package/dist/lib/browser/{app-graph-builder-FXELWOFS.mjs → app-graph-builder-IMWFZ3OZ.mjs} +7 -3
  4. package/dist/lib/browser/app-graph-builder-IMWFZ3OZ.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +3 -9
  6. package/dist/lib/browser/index.mjs.map +3 -3
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/{react-surface-ACHNR2UU.mjs → react-surface-XDHEQY27.mjs} +54 -51
  9. package/dist/lib/browser/react-surface-XDHEQY27.mjs.map +7 -0
  10. package/dist/types/src/DebugPlugin.d.ts.map +1 -1
  11. package/dist/types/src/capabilities/app-graph-builder.d.ts +22 -22
  12. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  13. package/dist/types/src/capabilities/index.d.ts +26 -31
  14. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  15. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  16. package/dist/types/src/components/DebugSettings.d.ts.map +1 -1
  17. package/dist/types/src/components/DebugStatus.d.ts.map +1 -1
  18. package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts.map +1 -1
  19. package/dist/types/src/components/SpaceGenerator/SpaceGenerator.d.ts.map +1 -1
  20. package/dist/types/src/components/SpaceGenerator/presets.d.ts +17 -0
  21. package/dist/types/src/components/SpaceGenerator/presets.d.ts.map +1 -0
  22. package/dist/types/tsconfig.tsbuildinfo +1 -1
  23. package/package.json +47 -46
  24. package/src/DebugPlugin.tsx +2 -7
  25. package/src/capabilities/app-graph-builder.ts +6 -3
  26. package/src/capabilities/index.ts +0 -1
  27. package/src/capabilities/react-surface.tsx +7 -15
  28. package/src/components/DebugSettings.tsx +70 -70
  29. package/src/components/DebugStatus.tsx +17 -21
  30. package/src/components/SpaceGenerator/ObjectGenerator.tsx +0 -81
  31. package/src/components/SpaceGenerator/SpaceGenerator.tsx +7 -6
  32. package/src/components/SpaceGenerator/presets.ts +322 -0
  33. package/dist/lib/browser/SpaceGenerator-YNT3WDFI.mjs +0 -479
  34. package/dist/lib/browser/SpaceGenerator-YNT3WDFI.mjs.map +0 -7
  35. package/dist/lib/browser/app-graph-builder-FXELWOFS.mjs.map +0 -7
  36. package/dist/lib/browser/react-context-OZU6J7G3.mjs +0 -37
  37. package/dist/lib/browser/react-context-OZU6J7G3.mjs.map +0 -7
  38. package/dist/lib/browser/react-surface-ACHNR2UU.mjs.map +0 -7
  39. package/dist/types/src/capabilities/react-context.d.ts +0 -8
  40. package/dist/types/src/capabilities/react-context.d.ts.map +0 -1
  41. package/src/capabilities/react-context.tsx +0 -38
@@ -0,0 +1,322 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type ComputeGraphModel, EmailTriggerOutput, NODE_INPUT } from '@dxos/conductor';
6
+ import { AST, ObjectId, S, toJsonSchema } from '@dxos/echo-schema';
7
+ import { FunctionTrigger, TriggerKind } from '@dxos/functions/types';
8
+ import { invariant } from '@dxos/invariant';
9
+ import { DXN, SpaceId } from '@dxos/keys';
10
+ import { create, makeRef } from '@dxos/live-object';
11
+ import { Filter, type Space } from '@dxos/react-client/echo';
12
+ import {
13
+ type ComputeShape,
14
+ createAppend,
15
+ createChat,
16
+ createComputeGraph,
17
+ createConstant,
18
+ createGpt,
19
+ createQueue,
20
+ createTemplate,
21
+ createText,
22
+ createTrigger,
23
+ } from '@dxos/react-ui-canvas-compute';
24
+ import {
25
+ CanvasBoardType,
26
+ CanvasGraphModel,
27
+ pointMultiply,
28
+ pointsToRect,
29
+ rectToPoints,
30
+ } from '@dxos/react-ui-canvas-editor';
31
+ import { TableType } from '@dxos/react-ui-table';
32
+ import { range } from '@dxos/util';
33
+
34
+ import { type ObjectGenerator } from './ObjectGenerator';
35
+
36
+ export enum PresetName {
37
+ EMAIL_TABLE = 'email-table',
38
+ GPT_QUEUE = 'webhook-gpt-queue',
39
+ CHAT_GPT = 'chat-gpt-text',
40
+ EMAIL_WITH_SUMMARY = 'email-gptSummary-table',
41
+ }
42
+
43
+ export const presets = {
44
+ schemas: [CanvasBoardType, FunctionTrigger],
45
+ types: Object.values(PresetName).map((name) => ({ typename: name })),
46
+ items: [
47
+ [
48
+ PresetName.GPT_QUEUE,
49
+ async (space, n, cb) => {
50
+ const objects = range(n, () => {
51
+ const canvasModel = CanvasGraphModel.create<ComputeShape>();
52
+
53
+ let functionTrigger: FunctionTrigger | undefined;
54
+ canvasModel.builder.call((builder) => {
55
+ const gpt = canvasModel.createNode(createGpt(position({ x: 0, y: -14 })));
56
+ const triggerShape = createTrigger({ triggerKind: TriggerKind.Webhook, ...position({ x: -18, y: -2 }) });
57
+ const trigger = canvasModel.createNode(triggerShape);
58
+ const text = canvasModel.createNode(createText(position({ x: 19, y: 3, width: 10, height: 10 })));
59
+ const { queueId } = setupQueue(canvasModel);
60
+ const append = canvasModel.createNode(createAppend(position({ x: 10, y: 6 })));
61
+
62
+ builder
63
+ .createEdge({ source: trigger.id, target: gpt.id, input: 'prompt', output: 'body' })
64
+ .createEdge({ source: gpt.id, target: text.id, output: 'text' })
65
+ .createEdge({ source: queueId.id, target: append.id, input: 'id' })
66
+ .createEdge({ source: gpt.id, target: append.id, output: 'messages', input: 'items' });
67
+
68
+ functionTrigger = triggerShape.functionTrigger!.target!;
69
+ });
70
+
71
+ const computeModel = createComputeGraph(canvasModel);
72
+
73
+ attachTrigger(functionTrigger, computeModel);
74
+
75
+ return addToSpace(PresetName.GPT_QUEUE, space, canvasModel, computeModel);
76
+ });
77
+ cb?.(objects);
78
+ return objects;
79
+ },
80
+ ],
81
+
82
+ [
83
+ PresetName.EMAIL_TABLE,
84
+ async (space, n, cb) => {
85
+ const objects = range(n, () => {
86
+ const canvasModel = CanvasGraphModel.create<ComputeShape>();
87
+
88
+ const results = space.db.query(Filter.schema(TableType)).runSync();
89
+ const emailTable = results.find((r) => r.object?.view?.target?.query?.type?.endsWith('Email'));
90
+ invariant(emailTable, 'Email table not found.');
91
+
92
+ const template = canvasModel.createNode(
93
+ createTemplate({
94
+ valueType: 'object',
95
+ ...rawPosition({ centerX: -80, centerY: -64, width: 320, height: 320 }),
96
+ }),
97
+ );
98
+ const templateContent = ['{'];
99
+
100
+ let functionTrigger: FunctionTrigger | undefined;
101
+ canvasModel.builder.call((builder) => {
102
+ const triggerShape = createTrigger({ triggerKind: TriggerKind.Email, ...position({ x: -18, y: -2 }) });
103
+ const trigger = canvasModel.createNode(triggerShape);
104
+
105
+ const tableId = canvasModel.createNode(
106
+ createConstant({
107
+ value: DXN.fromLocalObjectId(emailTable.id).toString(),
108
+ ...position({ x: -18, y: 5, width: 8, height: 6 }),
109
+ }),
110
+ );
111
+
112
+ const appendToTable = canvasModel.createNode(createAppend(position({ x: 10, y: 6 })));
113
+
114
+ const properties = AST.getPropertySignatures(EmailTriggerOutput.ast);
115
+ for (let i = 0; i < properties.length; i++) {
116
+ const propName = properties[i].name.toString();
117
+ builder.createEdge({ source: trigger.id, target: template.id, input: propName, output: propName });
118
+ templateContent.push(` "${propName}": "{{${propName}}}"` + (i === properties.length - 1 ? '' : ','));
119
+ }
120
+ templateContent.push('}');
121
+
122
+ builder
123
+ .createEdge({ source: tableId.id, target: appendToTable.id, input: 'id' })
124
+ .createEdge({ source: template.id, target: appendToTable.id, input: 'items' });
125
+
126
+ functionTrigger = triggerShape.functionTrigger!.target!;
127
+ });
128
+
129
+ const computeModel = createComputeGraph(canvasModel);
130
+
131
+ const templateComputeNode = computeModel.nodes.find((n) => n.id === template.node);
132
+ invariant(templateComputeNode, 'Template compute node was not created.');
133
+ templateComputeNode.value = templateContent.join('\n');
134
+ templateComputeNode.inputSchema = toJsonSchema(EmailTriggerOutput);
135
+
136
+ attachTrigger(functionTrigger, computeModel);
137
+
138
+ return addToSpace(PresetName.EMAIL_TABLE, space, canvasModel, computeModel);
139
+ });
140
+ cb?.(objects);
141
+ return objects;
142
+ },
143
+ ],
144
+
145
+ [
146
+ PresetName.CHAT_GPT,
147
+ async (space, n, cb) => {
148
+ const objects = range(n, () => {
149
+ const canvasModel = CanvasGraphModel.create<ComputeShape>();
150
+
151
+ canvasModel.builder.call((builder) => {
152
+ const gpt = canvasModel.createNode(createGpt(position({ x: 0, y: -14 })));
153
+ const chat = canvasModel.createNode(createChat(position({ x: -18, y: -2 })));
154
+ const text = canvasModel.createNode(createText(position({ x: 19, y: 3, width: 10, height: 10 })));
155
+ const { queueId } = setupQueue(canvasModel);
156
+
157
+ const append = canvasModel.createNode(createAppend(position({ x: 10, y: 6 })));
158
+
159
+ builder
160
+ .createEdge({ source: chat.id, target: gpt.id, input: 'prompt' })
161
+ .createEdge({ source: gpt.id, target: text.id, output: 'text' })
162
+ .createEdge({ source: queueId.id, target: append.id, input: 'id' })
163
+ .createEdge({ source: gpt.id, target: append.id, output: 'messages', input: 'items' });
164
+ });
165
+
166
+ const computeModel = createComputeGraph(canvasModel);
167
+
168
+ return addToSpace(PresetName.CHAT_GPT, space, canvasModel, computeModel);
169
+ });
170
+ cb?.(objects);
171
+ return objects;
172
+ },
173
+ ],
174
+
175
+ [
176
+ PresetName.EMAIL_WITH_SUMMARY,
177
+ async (space, n, cb) => {
178
+ const objects = range(n, () => {
179
+ const canvasModel = CanvasGraphModel.create<ComputeShape>();
180
+
181
+ const results = space.db.query(Filter.schema(TableType)).runSync();
182
+ const emailTable = results.find((r) => r.object?.view?.target?.query?.type?.endsWith('Email'));
183
+ invariant(emailTable, 'Email table not found.');
184
+
185
+ const template = canvasModel.createNode(
186
+ createTemplate({
187
+ valueType: 'object',
188
+ ...rawPosition({ centerX: 192, centerY: -176, width: 320, height: 320 }),
189
+ }),
190
+ );
191
+ const templateContent = ['{'];
192
+
193
+ let functionTrigger: FunctionTrigger | undefined;
194
+ canvasModel.builder.call((builder) => {
195
+ const gpt = canvasModel.createNode(
196
+ createGpt(rawPosition({ centerX: -400, centerY: -112, width: 256, height: 202 })),
197
+ );
198
+ const systemPrompt = canvasModel.createNode(
199
+ createConstant({
200
+ value: "use one word to describe content category. don't write anything else",
201
+ ...rawPosition({ centerX: -800, centerY: -160, width: 192, height: 128 }),
202
+ }),
203
+ );
204
+ const triggerShape = createTrigger({
205
+ triggerKind: TriggerKind.Email,
206
+ ...rawPosition({ centerX: -736, centerY: -384, width: 182, height: 192 }),
207
+ });
208
+ const trigger = canvasModel.createNode(triggerShape);
209
+
210
+ const { queueId } = setupQueue(canvasModel, {
211
+ idPosition: { centerX: -720, centerY: 224, width: 192, height: 256 },
212
+ queuePosition: { centerX: -144, centerY: 416, width: 320, height: 448 },
213
+ });
214
+ const appendToQueue = canvasModel.createNode(
215
+ createAppend(rawPosition({ centerX: -80, centerY: 96, width: 122, height: 128 })),
216
+ );
217
+
218
+ const tableId = canvasModel.createNode(
219
+ createConstant({
220
+ value: DXN.fromLocalObjectId(emailTable.id).toString(),
221
+ ...rawPosition({ centerX: -112, centerY: -544, width: 192, height: 256 }),
222
+ }),
223
+ );
224
+
225
+ const appendToTable = canvasModel.createNode(
226
+ createAppend(rawPosition({ centerX: 560, centerY: -416, width: 128, height: 122 })),
227
+ );
228
+
229
+ templateContent.push(' "category": "{{text}}",');
230
+ builder.createEdge({ source: gpt.id, target: template.id, input: 'text', output: 'text' });
231
+
232
+ const properties = AST.getPropertySignatures(EmailTriggerOutput.ast);
233
+ for (let i = 0; i < properties.length; i++) {
234
+ const propName = properties[i].name.toString();
235
+ builder.createEdge({ source: trigger.id, target: template.id, input: propName, output: propName });
236
+ templateContent.push(` "${propName}": "{{${propName}}}"` + (i === properties.length - 1 ? '' : ','));
237
+ }
238
+ templateContent.push('}');
239
+
240
+ builder
241
+ .createEdge({ source: tableId.id, target: appendToTable.id, input: 'id' })
242
+ .createEdge({ source: queueId.id, target: appendToQueue.id, input: 'id' })
243
+ .createEdge({ source: gpt.id, target: appendToQueue.id, output: 'messages', input: 'items' })
244
+ .createEdge({ source: systemPrompt.id, target: gpt.id, input: 'systemPrompt' })
245
+ .createEdge({ source: trigger.id, target: gpt.id, input: 'prompt', output: 'body' })
246
+ .createEdge({ source: template.id, target: appendToTable.id, input: 'items' });
247
+
248
+ functionTrigger = triggerShape.functionTrigger!.target!;
249
+ });
250
+
251
+ const computeModel = createComputeGraph(canvasModel);
252
+
253
+ const templateComputeNode = computeModel.nodes.find((n) => n.id === template.node);
254
+ invariant(templateComputeNode, 'Template compute node was not created.');
255
+ templateComputeNode.value = templateContent.join('\n');
256
+ const extendedSchema = S.extend(EmailTriggerOutput, S.Struct({ text: S.String }));
257
+ templateComputeNode.inputSchema = toJsonSchema(extendedSchema);
258
+
259
+ attachTrigger(functionTrigger, computeModel);
260
+
261
+ return addToSpace(PresetName.EMAIL_WITH_SUMMARY, space, canvasModel, computeModel);
262
+ });
263
+ cb?.(objects);
264
+ return objects;
265
+ },
266
+ ],
267
+ ] as [PresetName, ObjectGenerator<any>][],
268
+ };
269
+
270
+ const addToSpace = (name: string, space: Space, canvas: CanvasGraphModel, compute: ComputeGraphModel) => {
271
+ return space.db.add(
272
+ create(CanvasBoardType, {
273
+ name,
274
+ computeGraph: makeRef(compute.root),
275
+ layout: canvas.graph,
276
+ }),
277
+ );
278
+ };
279
+
280
+ const setupQueue = (
281
+ canvasModel: CanvasGraphModel,
282
+ args?: { idPosition?: RawPositionInput; queuePosition?: RawPositionInput },
283
+ ) => {
284
+ const queueId = canvasModel.createNode(
285
+ createConstant({
286
+ value: new DXN(DXN.kind.QUEUE, ['data', SpaceId.random(), ObjectId.random()]).toString(),
287
+ ...(args?.idPosition ? rawPosition(args.idPosition) : position({ x: -18, y: 5, width: 8, height: 6 })),
288
+ }),
289
+ );
290
+ const queue = canvasModel.createNode(
291
+ createQueue(
292
+ args?.queuePosition ? rawPosition(args.queuePosition) : position({ x: -3, y: 3, width: 14, height: 10 }),
293
+ ),
294
+ );
295
+ canvasModel.createEdge({ source: queueId.id, target: queue.id });
296
+ return { queue, queueId };
297
+ };
298
+
299
+ const attachTrigger = (functionTrigger: FunctionTrigger | undefined, computeModel: ComputeGraphModel) => {
300
+ invariant(functionTrigger);
301
+ functionTrigger.function = DXN.fromLocalObjectId(computeModel.root.id).toString();
302
+ functionTrigger.meta ??= {};
303
+ const inputNode = computeModel.nodes.find((node) => node.type === NODE_INPUT)!;
304
+ functionTrigger.meta.computeNodeId = inputNode.id;
305
+ };
306
+
307
+ type RawPositionInput = { centerX: number; centerY: number; width: number; height: number };
308
+
309
+ const rawPosition = (args: RawPositionInput) => {
310
+ return { center: { x: args.centerX, y: args.centerY }, size: { width: args.width, height: args.height } };
311
+ };
312
+
313
+ const position = (rect: { x: number; y: number; width?: number; height?: number }) => {
314
+ const snap = 32;
315
+ const [center, size] = rectToPoints({ width: 0, height: 0, ...rect });
316
+ const { x, y, width, height } = pointsToRect([pointMultiply(center, snap), pointMultiply(size, snap)]);
317
+ if (width && height) {
318
+ return { center: { x, y }, size: width && height ? { width, height } : undefined };
319
+ } else {
320
+ return { center: { x, y } };
321
+ }
322
+ };