@oomol-lab/open-flow 0.1.0-alpha.1 → 0.1.0-alpha.12

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 (78) hide show
  1. package/README.md +5 -1
  2. package/dist/browser/addNodeOptions-BYQXyUmQ.js +9571 -0
  3. package/dist/browser/carbon-DMCVsjHo.js +53 -0
  4. package/dist/browser/{project-change.js → change-7rp2OZLm.js} +16 -46
  5. package/dist/browser/createResourceDialog-CWD62rU0.js +467 -0
  6. package/dist/browser/{dist-o4dBuwiG.js → dist-3Mj8q8Pr.js} +28 -28
  7. package/dist/browser/{dist-CIq6ue3I.js → dist-BKuSVKCC.js} +1115 -1103
  8. package/dist/browser/{dist-DL0SDskM.js → dist-BMqL-qR5.js} +473 -906
  9. package/dist/browser/{dist-CLZJNoWB.js → dist-BN4ZCyOB.js} +10 -10
  10. package/dist/browser/{dist-zyY--HOV.js → dist-BpopSHwP.js} +3 -3
  11. package/dist/browser/dist-C46JByB-.js +252 -0
  12. package/dist/browser/{dist-BbyiRq3c.js → dist-CJpzJrLM.js} +294 -284
  13. package/dist/browser/{dist-Djd02JSy.js → dist-CPuF50D9.js} +198 -198
  14. package/dist/browser/{dist-CvcmLAMW.js → dist-CUSrALSX.js} +115 -115
  15. package/dist/browser/dist-CeSZ2xSM.js +444 -0
  16. package/dist/browser/{dist-7oZK9QXZ.js → dist-DMi8_lU3.js} +5 -5
  17. package/dist/browser/{dist-B9OV3YTx.js → dist-DUzA0Ukh.js} +22 -22
  18. package/dist/browser/{dist-aWSZx4q1.js → dist-DWADUsVB.js} +75 -75
  19. package/dist/browser/{dist-BLk5M0uK.js → dist-Mecbzdl2.js} +3 -3
  20. package/dist/browser/{esm-DXw7EADW.js → esm-DmVDlOEJ.js} +14 -24
  21. package/dist/browser/flow-authoring-edge.d.ts +3 -0
  22. package/dist/browser/flow-authoring-module.d.ts +4 -0
  23. package/dist/browser/flow-authoring-node.d.ts +86 -0
  24. package/dist/browser/flow-authoring.d.ts +4 -0
  25. package/dist/browser/flow-authoring.js +783 -0
  26. package/dist/browser/{project-change.d.ts → flow-change.d.ts} +29 -37
  27. package/dist/browser/flow-change.js +234 -0
  28. package/dist/browser/{project-notifications.d.ts → flow-notifications.d.ts} +6 -3
  29. package/dist/browser/flowRunInputEditorStore-BYxwvHZl.js +8952 -0
  30. package/dist/browser/flowWorkspace-Bwqmoq-c.js +47439 -0
  31. package/dist/browser/languages-DgJehE1g.js +62 -0
  32. package/dist/browser/lib-C5Ipyfps.js +7856 -0
  33. package/dist/browser/{lib-S4ccuMeT.js → lib-GrGxYjsJ.js} +3 -5
  34. package/dist/browser/licenses.md +620 -12
  35. package/dist/browser/main-DmjVyuWr.js +76 -0
  36. package/dist/browser/{markdownContent-ZZFfSRqO.js → markdownContent-0teWaxq8.js} +5188 -5144
  37. package/dist/browser/theme.css +63 -0
  38. package/dist/browser/theme.css.d.ts +1 -0
  39. package/dist/browser/typeScriptSession-D5neIpug.js +2560 -0
  40. package/dist/browser/{composite-7VwgfnXx.js → useOpenInteractionType-CRgOHg5M.js} +2209 -2750
  41. package/dist/browser/workbench-contract.d.ts +6 -6
  42. package/dist/browser/workbench.css +1 -1
  43. package/dist/browser/workbench.d.ts +18 -2
  44. package/dist/browser/workbench.js +4200 -2233
  45. package/dist/common/connector-action.d.ts +6 -0
  46. package/dist/common/connector-action.js +38 -30
  47. package/dist/common/control-api-conformance.js +262 -359
  48. package/dist/common/control-api-errors.d.ts +32 -24
  49. package/dist/common/control-api.d.ts +57 -73
  50. package/dist/common/control-api.js +199 -205
  51. package/dist/common/cron-trigger.d.ts +1 -1
  52. package/dist/common/cron-trigger.js +1 -1
  53. package/dist/common/flow-encoding.d.ts +11 -0
  54. package/dist/common/{project-encoding.js → flow-encoding.js} +14 -13
  55. package/dist/common/{project-notifications.d.ts → flow-notifications.d.ts} +6 -3
  56. package/dist/common/{project-semantics.d.ts → flow-semantics.d.ts} +11 -12
  57. package/dist/common/{project-semantics.js → flow-semantics.js} +959 -934
  58. package/dist/common/integration-trigger.d.ts +2 -1
  59. package/dist/common/integration-trigger.js +1 -1
  60. package/dist/common/licenses.md +1 -25
  61. package/dist/common/localization.d.ts +21 -0
  62. package/dist/common/localization.js +62 -0
  63. package/dist/common/poll-trigger.d.ts +1 -1
  64. package/dist/common/provider-triggers.js +1057 -948
  65. package/dist/common/run-lifecycle.js +1 -1
  66. package/dist/common/runtime-contract.d.ts +1 -1
  67. package/dist/common/runtime-contract.js +1 -1
  68. package/dist/common/scheduler.d.ts +8 -7
  69. package/dist/common/scheduler.js +251 -232
  70. package/dist/common/webhook-trigger.d.ts +1 -1
  71. package/dist/common/webhook-trigger.js +35 -1
  72. package/package.json +23 -10
  73. package/dist/browser/addNodeOptions-DqoIueCR.js +0 -33746
  74. package/dist/browser/carbon-nMY84Amv.js +0 -53
  75. package/dist/browser/createResourceDialog-ByuJWdSL.js +0 -439
  76. package/dist/browser/dist-n-z5HtaO.js +0 -4
  77. package/dist/browser/flowWorkspace-DwVMpcar.js +0 -22092
  78. package/dist/common/project-encoding.d.ts +0 -11
@@ -4,6 +4,7 @@ export type JsonValue = null | boolean | number | string | readonly JsonValue[]
4
4
  export declare const resourceNameMaxLength = 80;
5
5
  export type ResourceNameIssue = 'controlCharacter' | 'empty' | 'specialCharacter' | 'tooLong';
6
6
  export declare function resourceNameIssue(value: string): ResourceNameIssue | undefined;
7
+ export declare function validVariableName(value: string): boolean;
7
8
  export interface PortDefinition {
8
9
  readonly description?: string;
9
10
  readonly jsonSchema: JsonValue;
@@ -12,6 +13,13 @@ export interface PortDefinition {
12
13
  export interface InputPortDefinition extends PortDefinition {
13
14
  readonly value?: JsonValue;
14
15
  }
16
+ export interface Port extends PortDefinition {
17
+ readonly handle: string;
18
+ }
19
+ export interface InputPort extends InputPortDefinition {
20
+ readonly handle: string;
21
+ }
22
+ export declare function portsByHandle<Value extends Port>(ports: readonly Value[]): Readonly<Record<string, Value>>;
15
23
  export interface NodeSource {
16
24
  readonly kind: 'node';
17
25
  readonly nodeId: string;
@@ -38,6 +46,7 @@ export interface OutputMapping {
38
46
  interface GraphNodeBase {
39
47
  readonly concurrency: number;
40
48
  readonly description?: string;
49
+ readonly icon?: string;
41
50
  readonly inputs: Readonly<Record<string, InputMapping>>;
42
51
  readonly name?: string;
43
52
  readonly timeoutMs?: number;
@@ -48,7 +57,7 @@ export interface SubflowNode extends GraphNodeBase {
48
57
  }
49
58
  export interface ValueNode extends GraphNodeBase {
50
59
  readonly kind: 'value';
51
- readonly values: Readonly<Record<string, InputPortDefinition>>;
60
+ readonly values: readonly InputPort[];
52
61
  }
53
62
  export type ConditionOperator = '!=' | '<' | '<=' | '==' | '>' | '>=' | 'contains' | 'endsWith' | 'hasKey' | 'hasValue' | 'isEmpty' | 'isFalse' | 'isNotEmpty' | 'isNotNull' | 'isNull' | 'isTrue' | 'notContains' | 'notHasKey' | 'notHasValue' | 'startsWith';
54
63
  export interface ConditionExpression {
@@ -64,9 +73,7 @@ export interface ConditionCase {
64
73
  export interface ConditionNode extends GraphNodeBase {
65
74
  readonly cases: readonly ConditionCase[];
66
75
  readonly defaultOutput?: string;
67
- readonly input: InputPortDefinition & {
68
- readonly handle: string;
69
- };
76
+ readonly input: InputPort;
70
77
  readonly kind: 'condition';
71
78
  }
72
79
  export type ManagedTaskExecutor = {
@@ -83,9 +90,9 @@ export interface ConnectorCapability {
83
90
  readonly kind: 'connector';
84
91
  }
85
92
  interface TaskDefinitionBase {
86
- readonly inputs: Readonly<Record<string, InputPortDefinition>>;
93
+ readonly inputs: readonly InputPort[];
87
94
  readonly name: string;
88
- readonly outputs: Readonly<Record<string, PortDefinition>>;
95
+ readonly outputs: readonly Port[];
89
96
  }
90
97
  export interface InlineTaskDefinition extends TaskDefinitionBase {
91
98
  readonly capabilities?: readonly ConnectorCapability[];
@@ -143,8 +150,7 @@ export type TriggerKeySnapshot = (TriggerKeySnapshotBase & {
143
150
  readonly endpoint: IntegrationEndpointDeclaration;
144
151
  readonly type: 'integration';
145
152
  });
146
- export interface WebhookInputDefinition extends InputPortDefinition {
147
- readonly handle: string;
153
+ export interface WebhookInputDefinition extends InputPort {
148
154
  }
149
155
  export interface WebhookOptions {
150
156
  readonly allowedMethods?: readonly string[];
@@ -156,6 +162,7 @@ export interface WebhookOptions {
156
162
  }
157
163
  interface TriggerNodeBase {
158
164
  readonly description?: string;
165
+ readonly icon?: string;
159
166
  readonly name: string;
160
167
  }
161
168
  export type TriggerNode = (TriggerNodeBase & {
@@ -182,20 +189,17 @@ export type TriggerNode = (TriggerNodeBase & {
182
189
  readonly kind: 'integration';
183
190
  });
184
191
  export type GraphNode = ConditionNode | SubflowNode | TaskNode | TriggerNode | ValueNode;
185
- export interface ProjectDocument {
192
+ export interface FlowDocument {
186
193
  readonly bindings: Readonly<Record<string, {
187
- readonly kind: 'connection' | 'secret';
194
+ readonly kind: 'connection' | 'variable';
188
195
  readonly target: string;
189
196
  }>>;
190
- readonly flows: Readonly<Record<string, {
191
- readonly graph: Graph;
192
- readonly name: string;
193
- }>>;
197
+ readonly graph: Graph;
194
198
  readonly subflows: Readonly<Record<string, {
195
199
  readonly graph: Graph;
196
- readonly inputs: Readonly<Record<string, InputPortDefinition>>;
200
+ readonly inputs: readonly InputPort[];
197
201
  readonly name: string;
198
- readonly outputs: Readonly<Record<string, OutputMapping & PortDefinition>>;
202
+ readonly outputs: readonly (OutputMapping & Port)[];
199
203
  }>>;
200
204
  readonly tasks: Readonly<Record<string, ManagedTaskDefinition>>;
201
205
  }
@@ -205,12 +209,11 @@ export interface CodeModule {
205
209
  readonly source: string;
206
210
  }
207
211
  export interface RevisionContent {
208
- readonly document: ProjectDocument;
212
+ readonly document: FlowDocument;
209
213
  readonly modelVersion: 1;
210
214
  readonly modules: Readonly<Record<string, CodeModule>>;
211
215
  }
212
216
  export type GraphTarget = {
213
- readonly id: string;
214
217
  readonly kind: 'flow';
215
218
  } | {
216
219
  readonly id: string;
@@ -223,27 +226,16 @@ export interface GraphEdge {
223
226
  readonly targetHandle: string;
224
227
  }
225
228
  export type ChangeOperation = {
226
- readonly binding: ProjectDocument['bindings'][string];
229
+ readonly binding: FlowDocument['bindings'][string];
227
230
  readonly bindingId: string;
228
231
  readonly kind: 'binding.create';
229
232
  } | {
230
- readonly binding: ProjectDocument['bindings'][string];
233
+ readonly binding: FlowDocument['bindings'][string];
231
234
  readonly bindingId: string;
232
235
  readonly kind: 'binding.replace';
233
236
  } | {
234
237
  readonly bindingId: string;
235
238
  readonly kind: 'binding.delete';
236
- } | {
237
- readonly flow: ProjectDocument['flows'][string];
238
- readonly flowId: string;
239
- readonly kind: 'flow.create';
240
- } | {
241
- readonly flowId: string;
242
- readonly kind: 'flow.delete';
243
- } | {
244
- readonly flowId: string;
245
- readonly kind: 'flow.rename';
246
- readonly name: string;
247
239
  } | {
248
240
  readonly kind: 'graph.edge.connect';
249
241
  readonly edge: GraphEdge;
@@ -284,10 +276,10 @@ export type ChangeOperation = {
284
276
  readonly source: string;
285
277
  } | {
286
278
  readonly kind: 'subflow.create';
287
- readonly subflow: ProjectDocument['subflows'][string];
279
+ readonly subflow: FlowDocument['subflows'][string];
288
280
  readonly subflowId: string;
289
281
  } | {
290
- readonly definition: Omit<ProjectDocument['subflows'][string], 'graph'>;
282
+ readonly definition: Omit<FlowDocument['subflows'][string], 'graph'>;
291
283
  readonly kind: 'subflow.definition.replace';
292
284
  readonly subflowId: string;
293
285
  } | {
@@ -295,17 +287,17 @@ export type ChangeOperation = {
295
287
  readonly subflowId: string;
296
288
  } | {
297
289
  readonly kind: 'task.create';
298
- readonly task: ProjectDocument['tasks'][string];
290
+ readonly task: FlowDocument['tasks'][string];
299
291
  readonly taskId: string;
300
292
  } | {
301
293
  readonly kind: 'task.delete';
302
294
  readonly taskId: string;
303
295
  } | {
304
296
  readonly kind: 'task.replace';
305
- readonly task: ProjectDocument['tasks'][string];
297
+ readonly task: FlowDocument['tasks'][string];
306
298
  readonly taskId: string;
307
299
  };
308
- export declare class ProjectChangeError extends Error {
300
+ export declare class FlowChangeError extends Error {
309
301
  }
310
- export declare function applyProjectChanges(content: RevisionContent, operations: readonly ChangeOperation[]): RevisionContent;
302
+ export declare function applyFlowChanges(content: RevisionContent, operations: readonly ChangeOperation[]): RevisionContent;
311
303
  export {};
@@ -0,0 +1,234 @@
1
+ //#region src/flow/common/change.ts
2
+ var e = 80;
3
+ function t(e) {
4
+ let t = e.trim();
5
+ if (t.length == 0) return "empty";
6
+ if (t.length > 80) return "tooLong";
7
+ for (let e of t) {
8
+ let t = e.charCodeAt(0);
9
+ if (t <= 31 || t >= 127 && t <= 159) return "controlCharacter";
10
+ }
11
+ if (!/^[\p{L}\p{N}](?:[\p{L}\p{N} _-]*[\p{L}\p{N}])?$/u.test(t)) return "specialCharacter";
12
+ }
13
+ function n(e) {
14
+ return e.length <= 256 && /^[A-Za-z_][A-Za-z0-9_]*$/.test(e) && e.slice(0, 3).toUpperCase() != "OO_";
15
+ }
16
+ function r(e) {
17
+ return Object.fromEntries(e.map((e) => [e.handle, e]));
18
+ }
19
+ var i = class extends Error {};
20
+ function a() {
21
+ throw new i();
22
+ }
23
+ function o(e, t) {
24
+ if (t.kind == "flow") return e.graph;
25
+ let n = e.subflows[t.id];
26
+ return n ?? a(), n.graph;
27
+ }
28
+ function s(e, t, n) {
29
+ if (t.kind == "flow") return {
30
+ ...e,
31
+ graph: n
32
+ };
33
+ let r = e.subflows[t.id];
34
+ return r ?? a(), {
35
+ ...e,
36
+ subflows: {
37
+ ...e.subflows,
38
+ [t.id]: {
39
+ ...r,
40
+ graph: n
41
+ }
42
+ }
43
+ };
44
+ }
45
+ function c(e, t) {
46
+ if (!("inputs" in e)) return e;
47
+ let n = { ...e.inputs };
48
+ for (let [e, r] of Object.entries(n)) {
49
+ if (r.kind != "sources") continue;
50
+ let i = r.sources.filter((e) => e.kind != "node" || !t.has(e.nodeId));
51
+ i.length == 0 ? delete n[e] : n[e] = {
52
+ kind: "sources",
53
+ sources: i
54
+ };
55
+ }
56
+ return {
57
+ ...e,
58
+ inputs: n
59
+ };
60
+ }
61
+ function l(e, t) {
62
+ let n = { ...e.document }, r = { ...e.modules };
63
+ for (let e of t) switch (e.kind) {
64
+ case "binding.create":
65
+ n.bindings[e.bindingId] != null && a(), n.bindings = {
66
+ ...n.bindings,
67
+ [e.bindingId]: e.binding
68
+ };
69
+ break;
70
+ case "binding.replace":
71
+ n.bindings[e.bindingId] ?? a(), n.bindings = {
72
+ ...n.bindings,
73
+ [e.bindingId]: e.binding
74
+ };
75
+ break;
76
+ case "binding.delete": {
77
+ n.bindings[e.bindingId] ?? a();
78
+ let t = { ...n.bindings };
79
+ delete t[e.bindingId], n.bindings = t;
80
+ break;
81
+ }
82
+ case "graph.edge.connect": {
83
+ let t = o(n, e.target);
84
+ t.nodes[e.edge.source] ?? a();
85
+ let r = t.nodes[e.edge.target];
86
+ (r == null || !("inputs" in r)) && a();
87
+ let i = r.inputs[e.edge.targetHandle], c = {
88
+ kind: "node",
89
+ nodeId: e.edge.source,
90
+ output: e.edge.sourceHandle
91
+ }, l = i?.kind == "sources" ? i.sources.filter((e) => e.kind != "binding" || n.bindings[e.bindingId]?.kind != "variable") : [];
92
+ l.some((e) => e.kind == "node" && e.nodeId == c.nodeId && e.output == c.output) && a();
93
+ let u = {
94
+ ...r,
95
+ inputs: {
96
+ ...r.inputs,
97
+ [e.edge.targetHandle]: {
98
+ kind: "sources",
99
+ sources: [...l, c]
100
+ }
101
+ }
102
+ };
103
+ Object.assign(n, s(n, e.target, { nodes: {
104
+ ...t.nodes,
105
+ [e.edge.target]: u
106
+ } }));
107
+ break;
108
+ }
109
+ case "graph.edge.disconnect": {
110
+ let t = o(n, e.target), r = t.nodes[e.edge.target];
111
+ (r == null || !("inputs" in r)) && a();
112
+ let i = r.inputs[e.edge.targetHandle];
113
+ i?.kind != "sources" && a();
114
+ let c = i.sources.filter((t) => t.kind != "node" || t.nodeId != e.edge.source || t.output != e.edge.sourceHandle);
115
+ c.length == i.sources.length && a();
116
+ let l = { ...r.inputs };
117
+ c.length == 0 ? delete l[e.edge.targetHandle] : l[e.edge.targetHandle] = {
118
+ kind: "sources",
119
+ sources: c
120
+ }, Object.assign(n, s(n, e.target, { nodes: {
121
+ ...t.nodes,
122
+ [e.edge.target]: {
123
+ ...r,
124
+ inputs: l
125
+ }
126
+ } }));
127
+ break;
128
+ }
129
+ case "graph.node.create": {
130
+ let t = o(n, e.target);
131
+ (t.nodes[e.nodeId] != null || e.target.kind == "subflow" && !("inputs" in e.node)) && a(), Object.assign(n, s(n, e.target, { nodes: {
132
+ ...t.nodes,
133
+ [e.nodeId]: e.node
134
+ } }));
135
+ break;
136
+ }
137
+ case "graph.node.delete": {
138
+ let t = o(n, e.target);
139
+ t.nodes[e.nodeId] ?? a();
140
+ let r = /* @__PURE__ */ new Set([e.nodeId]), i = Object.fromEntries(Object.entries(t.nodes).flatMap(([e, t]) => r.has(e) ? [] : [[e, c(t, r)]]));
141
+ if (Object.assign(n, s(n, e.target, { nodes: i })), e.target.kind == "subflow") {
142
+ let t = n.subflows[e.target.id], i = t.outputs.map((e) => ({
143
+ ...e,
144
+ sources: e.sources.filter((e) => e.kind != "node" || !r.has(e.nodeId))
145
+ }));
146
+ n.subflows = {
147
+ ...n.subflows,
148
+ [e.target.id]: {
149
+ ...t,
150
+ outputs: i
151
+ }
152
+ };
153
+ }
154
+ break;
155
+ }
156
+ case "graph.node.replace": {
157
+ let t = o(n, e.target);
158
+ (t.nodes[e.nodeId] == null || e.target.kind == "subflow" && !("inputs" in e.node)) && a(), Object.assign(n, s(n, e.target, { nodes: {
159
+ ...t.nodes,
160
+ [e.nodeId]: e.node
161
+ } }));
162
+ break;
163
+ }
164
+ case "module.create":
165
+ r[e.moduleId] != null && a(), r[e.moduleId] = e.module;
166
+ break;
167
+ case "module.delete":
168
+ r[e.moduleId] ?? a(), delete r[e.moduleId];
169
+ break;
170
+ case "module.rename": {
171
+ let t = r[e.moduleId];
172
+ t ?? a(), r[e.moduleId] = {
173
+ ...t,
174
+ name: e.name
175
+ };
176
+ break;
177
+ }
178
+ case "module.source.replace": {
179
+ let t = r[e.moduleId];
180
+ t ?? a(), r[e.moduleId] = {
181
+ ...t,
182
+ imports: e.imports,
183
+ source: e.source
184
+ };
185
+ break;
186
+ }
187
+ case "subflow.create":
188
+ n.subflows[e.subflowId] != null && a(), n.subflows = {
189
+ ...n.subflows,
190
+ [e.subflowId]: e.subflow
191
+ };
192
+ break;
193
+ case "subflow.definition.replace": {
194
+ let t = n.subflows[e.subflowId];
195
+ t ?? a(), n.subflows = {
196
+ ...n.subflows,
197
+ [e.subflowId]: {
198
+ ...e.definition,
199
+ graph: t.graph
200
+ }
201
+ };
202
+ break;
203
+ }
204
+ case "subflow.delete": {
205
+ n.subflows[e.subflowId] ?? a();
206
+ let t = { ...n.subflows };
207
+ delete t[e.subflowId], n.subflows = t;
208
+ break;
209
+ }
210
+ case "task.create":
211
+ n.tasks[e.taskId] != null && a(), n.tasks = {
212
+ ...n.tasks,
213
+ [e.taskId]: e.task
214
+ };
215
+ break;
216
+ case "task.delete": {
217
+ n.tasks[e.taskId] ?? a();
218
+ let t = { ...n.tasks };
219
+ delete t[e.taskId], n.tasks = t;
220
+ break;
221
+ }
222
+ case "task.replace": n.tasks[e.taskId] ?? a(), n.tasks = {
223
+ ...n.tasks,
224
+ [e.taskId]: e.task
225
+ };
226
+ }
227
+ return {
228
+ document: n,
229
+ modelVersion: e.modelVersion,
230
+ modules: r
231
+ };
232
+ }
233
+ //#endregion
234
+ export { i as FlowChangeError, l as applyFlowChanges, r as portsByHandle, t as resourceNameIssue, e as resourceNameMaxLength, n as validVariableName };
@@ -1,12 +1,15 @@
1
- export type ProjectChangeEvent = {
1
+ export interface FlowCatalogEvent {
2
+ readonly kind: 'flows.changed';
3
+ readonly version: 1;
4
+ }
5
+ export type FlowChangeEvent = {
2
6
  readonly kind: 'draft.changed';
3
- readonly projectId: string;
7
+ readonly flowId: string;
4
8
  readonly revisionId: string;
5
9
  readonly version: 1;
6
10
  } | {
7
11
  readonly flowId: string;
8
12
  readonly kind: 'run.created';
9
- readonly projectId: string;
10
13
  readonly runId: string;
11
14
  readonly version: 1;
12
15
  };