@oomol-lab/open-flow 0.1.0-beta.10 → 0.1.0-beta.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.
- package/dist/browser/DesignerIcon-ckcKnxxJ.js +2267 -0
- package/dist/browser/createResourceDialog-2pESP2wA.js +111 -0
- package/dist/browser/{dist-meg_oHVR.js → dist-BZ5PTFAs.js} +335 -335
- package/dist/browser/dist-Bmb2mZvW.js +795 -0
- package/dist/browser/{dist-Cc0y2Pli.js → dist-Ce71Szg7.js} +622 -622
- package/dist/browser/dist-DSe6KRsr.js +1224 -0
- package/dist/browser/{dist-Dg_VXC8f.js → dist-DY4qlXTK.js} +134 -134
- package/dist/browser/{esm-yhVU_KbQ.js → esm-BPZ0P6x4.js} +59 -59
- package/dist/browser/flow-authoring-node.d.ts +11 -4
- package/dist/browser/flow-authoring.d.ts +1 -1
- package/dist/browser/flow-authoring.js +5032 -275
- package/dist/browser/flow-change-schema.d.ts +6 -0
- package/dist/browser/flow-change.d.ts +21 -8
- package/dist/browser/flow-change.js +5048 -155
- package/dist/browser/{flowChanges-B2ttnaj9.js → flowChanges-CHPdBmZb.js} +4433 -3786
- package/dist/browser/{flowRunInputEditorStore-DDidwd8h.js → flowRunInputEditorStore-NPGePkvP.js} +679 -689
- package/dist/browser/flowWorkspace-BLGcgnHj.js +158418 -0
- package/dist/browser/{getPseudoElementBounds-5LArT6Xc.js → getPseudoElementBounds-Dfqo78k7.js} +691 -687
- package/dist/browser/host-conformance.d.ts +7 -0
- package/dist/browser/host-conformance.js +33 -0
- package/dist/browser/{languages-DgJehE1g.js → languages-i3Xmpt6S.js} +6 -15
- package/dist/browser/licenses.md +82 -0
- package/dist/browser/{markdownContent-DUfLdnUt.js → markdownContent-BawLYUjh.js} +23 -23
- package/dist/browser/select-Dn3vpjGC.js +6872 -0
- package/dist/browser/theme.css +34 -34
- package/dist/browser/{typeScriptSession-_TgJ_7Oq.js → typeScriptSession-BoV-FDl3.js} +257 -257
- package/dist/browser/waitNotificationInputs-BFbQUOyp.js +29 -0
- package/dist/browser/workbench-contract.d.ts +8 -2
- package/dist/browser/workbench.css +1 -1
- package/dist/browser/workbench.js +1277 -1021
- package/dist/browser/workbenchSelect-DzF8oik9.js +435 -0
- package/dist/common/control-api-conformance.d.ts +6 -0
- package/dist/common/control-api-conformance.js +300 -85
- package/dist/common/control-api.d.ts +37 -10
- package/dist/common/control-api.js +5199 -437
- package/dist/common/control-requests.d.ts +68 -0
- package/dist/common/control-requests.js +4913 -0
- package/dist/common/engine-contract.d.ts +1 -1
- package/dist/common/flow-encoding.d.ts +3 -1
- package/dist/common/flow-encoding.js +4761 -63
- package/dist/common/flow-graph.d.ts +6 -0
- package/dist/common/flow-json.d.ts +2 -0
- package/dist/common/flow-modules.d.ts +20 -0
- package/dist/common/flow-schema.d.ts +8 -0
- package/dist/common/flow-semantics.d.ts +6 -5
- package/dist/common/flow-semantics.js +14641 -9800
- package/dist/common/integration-trigger.d.ts +1 -0
- package/dist/common/mcp-conformance.d.ts +2 -0
- package/dist/common/mcp.d.ts +545 -0
- package/dist/common/mcp.js +4964 -0
- package/dist/common/run-events.d.ts +2 -2
- package/dist/common/run-events.js +8 -15
- package/dist/common/runtime-contract.d.ts +9 -1
- package/dist/common/runtime-contract.js +137 -27
- package/dist/common/scheduler.d.ts +11 -33
- package/dist/common/scheduler.js +7241 -428
- package/dist/index.d.ts +5 -5
- package/package.json +13 -1
- package/dist/browser/DesignerIcon-DjgOMYI5.js +0 -2065
- package/dist/browser/createResourceDialog-DNBueSYZ.js +0 -505
- package/dist/browser/dist-BMRLCebL.js +0 -1893
- package/dist/browser/flowWorkspace-Dr8-Hut9.js +0 -45541
- package/dist/browser/icons-KIOgjHpD.js +0 -730
- package/dist/browser/waitNotificationInputs-BPulOxYt.js +0 -26
- package/dist/browser/workbenchSelect-CbXrdwxW.js +0 -1375
|
@@ -19,7 +19,7 @@ function t(n, r) {
|
|
|
19
19
|
}
|
|
20
20
|
//#endregion
|
|
21
21
|
//#region src/control/common/conformance.ts
|
|
22
|
-
var n = "open-flow-engine/
|
|
22
|
+
var n = "open-flow-engine/v2";
|
|
23
23
|
function r(e) {
|
|
24
24
|
throw Error(e);
|
|
25
25
|
}
|
|
@@ -79,9 +79,9 @@ function m(e, t, n, r = "marker", i) {
|
|
|
79
79
|
return p(e, t, n, [{
|
|
80
80
|
kind: "graph.node.create",
|
|
81
81
|
node: {
|
|
82
|
-
concurrency: 1,
|
|
83
82
|
inputs: {},
|
|
84
83
|
kind: "value",
|
|
84
|
+
name: r,
|
|
85
85
|
values: [{
|
|
86
86
|
handle: "ready",
|
|
87
87
|
jsonSchema: { type: "boolean" },
|
|
@@ -93,10 +93,21 @@ function m(e, t, n, r = "marker", i) {
|
|
|
93
93
|
target: { kind: "flow" }
|
|
94
94
|
}], i);
|
|
95
95
|
}
|
|
96
|
-
function h(e, t) {
|
|
96
|
+
async function h(e, t, n) {
|
|
97
|
+
return g(await c(await p(e, t, n, [{
|
|
98
|
+
kind: "graph.node.create",
|
|
99
|
+
node: {
|
|
100
|
+
kind: "manual",
|
|
101
|
+
name: "Start"
|
|
102
|
+
},
|
|
103
|
+
nodeId: "start",
|
|
104
|
+
target: { kind: "flow" }
|
|
105
|
+
}]), 200, "Add manual trigger"), "Manual trigger Revision");
|
|
106
|
+
}
|
|
107
|
+
function g(e, t) {
|
|
97
108
|
return s(a(e.revision, `${t} revision`).revisionId, `${t} revisionId`);
|
|
98
109
|
}
|
|
99
|
-
function
|
|
110
|
+
function _(e, t, r, i, a) {
|
|
100
111
|
return u(e, `/v1/flows/${encodeURIComponent(t)}/revisions/${encodeURIComponent(r)}/publications`, {
|
|
101
112
|
body: JSON.stringify({
|
|
102
113
|
engineContract: n,
|
|
@@ -107,7 +118,7 @@ function g(e, t, r, i, a) {
|
|
|
107
118
|
method: "POST"
|
|
108
119
|
});
|
|
109
120
|
}
|
|
110
|
-
async function
|
|
121
|
+
async function v(e, t, n, r) {
|
|
111
122
|
let o = await c(t, n, r), l = s(o.operationId, `${r} operationId`);
|
|
112
123
|
for (let t = 0; o.status == "pending" && t < 100; t += 1) await new Promise((e) => setTimeout(e, 10)), o = await c(await u(e, `/v1/flows/${s(o.flowId, `${r} flowId`)}/publish-operations/${l}`), 200, `${r} operation`);
|
|
113
124
|
i(o.status, "succeeded", `${r} terminal status`);
|
|
@@ -117,7 +128,7 @@ async function _(e, t, n, r) {
|
|
|
117
128
|
publication: f
|
|
118
129
|
};
|
|
119
130
|
}
|
|
120
|
-
function
|
|
131
|
+
function y(e, t, n, r, i) {
|
|
121
132
|
return u(e, `/v1/flows/${encodeURIComponent(t)}/publications/${encodeURIComponent(n)}/rollback`, {
|
|
122
133
|
body: JSON.stringify({
|
|
123
134
|
expectedLivePublicationId: r,
|
|
@@ -127,10 +138,14 @@ function v(e, t, n, r, i) {
|
|
|
127
138
|
method: "POST"
|
|
128
139
|
});
|
|
129
140
|
}
|
|
130
|
-
function
|
|
141
|
+
function b(e, t, n) {
|
|
131
142
|
return u(e, "/v1/runs", {
|
|
132
143
|
body: JSON.stringify({
|
|
133
144
|
inputs: {},
|
|
145
|
+
trigger: {
|
|
146
|
+
nodeId: "start",
|
|
147
|
+
payload: {}
|
|
148
|
+
},
|
|
134
149
|
publicationId: t,
|
|
135
150
|
version: 1
|
|
136
151
|
}),
|
|
@@ -138,7 +153,67 @@ function y(e, t, n) {
|
|
|
138
153
|
method: "POST"
|
|
139
154
|
});
|
|
140
155
|
}
|
|
141
|
-
var
|
|
156
|
+
var x = [
|
|
157
|
+
{
|
|
158
|
+
name: "admits simultaneous retries as one Run and preserves its Trigger identity",
|
|
159
|
+
async verify(e) {
|
|
160
|
+
let t = await f(e, "Concurrent Run", "concurrent-run-flow"), r = s(t.flowId, "Flow ID"), d = await h(e, r, s(t.draftRevisionId, "Revision ID")), p = (t = {}) => u(e, `/v1/flows/${r}/revisions/${d}/runs`, {
|
|
161
|
+
method: "POST",
|
|
162
|
+
headers: { "idempotency-key": "concurrent-run" },
|
|
163
|
+
body: JSON.stringify({
|
|
164
|
+
engineContract: n,
|
|
165
|
+
inputs: {},
|
|
166
|
+
trigger: {
|
|
167
|
+
nodeId: "start",
|
|
168
|
+
payload: t
|
|
169
|
+
},
|
|
170
|
+
version: 1
|
|
171
|
+
})
|
|
172
|
+
}), m = await Promise.all([
|
|
173
|
+
p(),
|
|
174
|
+
p(),
|
|
175
|
+
p(),
|
|
176
|
+
p()
|
|
177
|
+
]);
|
|
178
|
+
i(m.map((e) => e.status).toSorted(), [
|
|
179
|
+
200,
|
|
180
|
+
200,
|
|
181
|
+
200,
|
|
182
|
+
202
|
|
183
|
+
], "One Run is admitted");
|
|
184
|
+
let g = await Promise.all(m.map((e) => e.json())), _ = s(a(g[0], "Run").runId, "Run ID");
|
|
185
|
+
for (let e of g) i(a(e, "Run").runId, _, "Concurrent Run identity");
|
|
186
|
+
await l(await p({ changed: !0 }), 409, "run.conflict", "Reject changed Trigger replay"), i(o((await c(await u(e, `/v1/flows/${r}/runs`), 200, "List admitted Runs")).runs, "Runs").length, 1, "No duplicate Run");
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
name: "deduplicates simultaneous creation and lost-response retries",
|
|
191
|
+
async verify(e) {
|
|
192
|
+
let t = await Promise.all(Array.from({ length: 4 }, () => d(e, "Concurrent Flow", "concurrent-create")));
|
|
193
|
+
i(t.map((e) => e.status).toSorted(), [
|
|
194
|
+
200,
|
|
195
|
+
200,
|
|
196
|
+
200,
|
|
197
|
+
201
|
|
198
|
+
], "One creation commits");
|
|
199
|
+
let n = await Promise.all(t.map((e) => e.json()));
|
|
200
|
+
for (let e of n) i(e, n[0], "Concurrent replay identity");
|
|
201
|
+
i(await c(await d(e, "Concurrent Flow", "concurrent-create"), 200, "Retry lost creation response"), n[0], "Lost-response replay"), await l(await d(e, "Different Flow", "concurrent-create"), 409, "flow.conflict", "Reject changed retry");
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
name: "commits one concurrent Draft change and replays the winning key",
|
|
206
|
+
async verify(e) {
|
|
207
|
+
let t = await f(e, "Concurrent Draft", "concurrent-draft"), n = s(t.flowId, "Flow ID"), o = s(t.draftRevisionId, "Revision ID"), d = await Promise.all([m(e, n, o, "left", "concurrent-left"), m(e, n, o, "right", "concurrent-right")]);
|
|
208
|
+
i(d.map((e) => e.status).toSorted(), [200, 412], "One Draft CAS commits");
|
|
209
|
+
let p = d.findIndex((e) => e.status == 200), h = await c(d[p] ?? r("Missing winning response"), 200, "Winning Draft change");
|
|
210
|
+
await l(d[1 - p] ?? r("Missing losing response"), 412, "flow.revision-conflict", "Losing Draft change");
|
|
211
|
+
let g = p == 0 ? "left" : "right";
|
|
212
|
+
i(await c(await m(e, n, o, g, `concurrent-${g}`), 200, "Replay winning change"), h, "Replay precedes stale Revision check");
|
|
213
|
+
let _ = a(a(a((await c(await u(e, `/v1/flows/${n}/draft`), 200, "Read authoritative Draft")).content, "Content").document, "Document").graph, "Graph").nodes;
|
|
214
|
+
i(Object.keys(a(_, "Nodes")), [g], "No partial losing edit");
|
|
215
|
+
}
|
|
216
|
+
},
|
|
142
217
|
{
|
|
143
218
|
name: "manages deployment Variables with stable limits and exact-case identity",
|
|
144
219
|
async verify(e) {
|
|
@@ -200,7 +275,7 @@ var b = [
|
|
|
200
275
|
{
|
|
201
276
|
name: "commits immutable Draft Revisions for one Flow",
|
|
202
277
|
async verify(e) {
|
|
203
|
-
let t = await f(e, "Draft flow", "draft-flow"), n = s(t.flowId, "Draft Flow flowId"), r = s(t.draftRevisionId, "Draft Flow revisionId"), o = await c(await m(e, n, r, "marker", "draft-change"), 200, "Change Draft"), d =
|
|
278
|
+
let t = await f(e, "Draft flow", "draft-flow"), n = s(t.flowId, "Draft Flow flowId"), r = s(t.draftRevisionId, "Draft Flow revisionId"), o = await c(await m(e, n, r, "marker", "draft-change"), 200, "Change Draft"), d = g(o, "Changed Draft");
|
|
204
279
|
i(a(o.revision, "Changed Draft revision").parentRevisionId, r, "Changed Draft parent"), i(await c(await m(e, n, r, "marker", "draft-change"), 200, "Replay Draft change"), o, "Replayed Draft change"), await l(await m(e, n, r, "another-marker", "draft-change"), 409, "flow.conflict", "Conflicting Draft change replay"), await l(await m(e, n, d, "marker"), 400, "flow.invalid", "Duplicate Draft Node", "A Node with this ID already exists"), await l(await p(e, n, d, [{
|
|
205
280
|
before: [{
|
|
206
281
|
handle: "ready",
|
|
@@ -218,17 +293,47 @@ var b = [
|
|
|
218
293
|
value: !0
|
|
219
294
|
}]
|
|
220
295
|
}]), 400, "flow.invalid", "No-op Draft change"), await l(await m(e, n, r, "stale"), 412, "flow.revision-conflict", "Stale Draft change"), i(a(a(a(a((await c(await u(e, `/v1/flows/${n}/revisions/${r}`), 200, "Read old Revision")).content, "Old content").document, "Old document").graph, "Old graph").nodes, "Old nodes"), {}, "Old Revision nodes"), i((await c(await u(e, `/v1/flows/${n}/draft`), 200, "Read Draft")).revisionId, d, "Draft revisionId");
|
|
221
|
-
let
|
|
222
|
-
i(
|
|
296
|
+
let h = await c(await u(e, `/v1/flows/${n}/draft/sync`), 200, "Sync Draft");
|
|
297
|
+
i(h.kind, "snapshot", "Draft sync kind"), i(a(h.draft, "Draft snapshot").revisionId, d, "Draft snapshot revisionId");
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
name: "loads the current editor without changing Draft or Presentation",
|
|
302
|
+
async verify(e) {
|
|
303
|
+
let t = await f(e, "Editor flow", "editor-flow"), n = s(t.flowId, "Editor Flow identity"), r = await c(await m(e, n, s(t.draftRevisionId, "Editor Draft identity"), "marker"), 200, "Change editor Draft"), o = await c(await u(e, `/v1/flows/${n}/presentation`, {
|
|
304
|
+
method: "PUT",
|
|
305
|
+
body: JSON.stringify({
|
|
306
|
+
expectedRevision: 1,
|
|
307
|
+
value: { nodes: { marker: {
|
|
308
|
+
x: 12,
|
|
309
|
+
y: 24
|
|
310
|
+
} } },
|
|
311
|
+
version: 1
|
|
312
|
+
})
|
|
313
|
+
}), 200, "Update editor Presentation"), d = await c(await u(e, `/v1/flows/${n}/editor`), 200, "Read editor");
|
|
314
|
+
i(d.version, 1, "Editor version"), i(a(d.flow, "Editor Flow").draftRevisionId, g(r, "Editor change"), "Editor Draft head");
|
|
315
|
+
for (let t of [
|
|
316
|
+
"flow",
|
|
317
|
+
"draft",
|
|
318
|
+
"live",
|
|
319
|
+
"presentation"
|
|
320
|
+
]) {
|
|
321
|
+
let r = t == "flow" ? `/v1/flows/${n}` : `/v1/flows/${n}/${t}`;
|
|
322
|
+
i(d[t], await c(await u(e, r), 200, `Read editor ${t}`), `Editor ${t}`);
|
|
323
|
+
}
|
|
324
|
+
i(d.presentation, o, "Reading editor preserves Presentation"), await l(await u(e, "/v1/flows/missing-editor/editor"), 404, "flow.not-found", "Read missing editor");
|
|
223
325
|
}
|
|
224
326
|
},
|
|
225
327
|
{
|
|
226
328
|
name: "keeps Presentation CAS independent from the Draft head",
|
|
227
329
|
async verify(e) {
|
|
228
|
-
let t = await f(e, "Presentation flow", "presentation-flow"), n = s(t.flowId, "Presentation Flow flowId"), r = s(t.draftRevisionId, "Presentation Flow revisionId"), a = `/v1/flows/${n}/presentation`, o = {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
330
|
+
let t = await f(e, "Presentation flow", "presentation-flow"), n = s(t.flowId, "Presentation Flow flowId"), r = s(t.draftRevisionId, "Presentation Flow revisionId"), a = `/v1/flows/${n}/presentation`, o = {
|
|
331
|
+
edges: [],
|
|
332
|
+
nodes: { task: {
|
|
333
|
+
x: 120,
|
|
334
|
+
y: 80
|
|
335
|
+
} }
|
|
336
|
+
}, d = await c(await u(e, a, {
|
|
232
337
|
body: JSON.stringify({
|
|
233
338
|
expectedRevision: 1,
|
|
234
339
|
value: o,
|
|
@@ -256,7 +361,7 @@ var b = [
|
|
|
256
361
|
{
|
|
257
362
|
name: "validates, admits, lists, and cancels one Draft Run",
|
|
258
363
|
async verify(e) {
|
|
259
|
-
let t = await f(e, "Run flow", "run-flow"), r = s(t.flowId, "Run Flow flowId"), d = s(t.draftRevisionId, "Run Flow revisionId");
|
|
364
|
+
let t = await f(e, "Run flow", "run-flow"), r = s(t.flowId, "Run Flow flowId"), d = await h(e, r, s(t.draftRevisionId, "Run Flow revisionId"));
|
|
260
365
|
i((await c(await u(e, `/v1/flows/${r}/revisions/${d}/check`, {
|
|
261
366
|
body: JSON.stringify({
|
|
262
367
|
engineContract: n,
|
|
@@ -264,31 +369,72 @@ var b = [
|
|
|
264
369
|
}),
|
|
265
370
|
method: "POST"
|
|
266
371
|
}), 200, "Check Flow")).valid, !0, "Flow validity");
|
|
267
|
-
let p = `/v1/flows/${r}/revisions/${d}/runs
|
|
372
|
+
let p = `/v1/flows/${r}/revisions/${d}/runs`;
|
|
373
|
+
for (let t of [
|
|
374
|
+
void 0,
|
|
375
|
+
{
|
|
376
|
+
nodeId: "missing",
|
|
377
|
+
payload: {}
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
nodeId: "start",
|
|
381
|
+
payload: { unexpected: !0 }
|
|
382
|
+
}
|
|
383
|
+
]) await l(await u(e, p, {
|
|
384
|
+
body: JSON.stringify({
|
|
385
|
+
engineContract: n,
|
|
386
|
+
inputs: {},
|
|
387
|
+
trigger: t,
|
|
388
|
+
version: 1
|
|
389
|
+
}),
|
|
390
|
+
headers: { "idempotency-key": `invalid-entry-${JSON.stringify(t)}` },
|
|
391
|
+
method: "POST"
|
|
392
|
+
}), 400, "run.invalid", "Reject invalid start node or payload");
|
|
393
|
+
let m = () => u(e, p, {
|
|
394
|
+
body: JSON.stringify({
|
|
395
|
+
engineContract: n,
|
|
396
|
+
inputs: {},
|
|
397
|
+
trigger: {
|
|
398
|
+
nodeId: "start",
|
|
399
|
+
payload: {}
|
|
400
|
+
},
|
|
401
|
+
version: 1
|
|
402
|
+
}),
|
|
403
|
+
headers: { "idempotency-key": "draft-run" },
|
|
404
|
+
method: "POST"
|
|
405
|
+
}), g = await c(await m(), 202, "Create Draft Run"), _ = s(g.runId, "Draft Run runId");
|
|
406
|
+
i(await c(await m(), 200, "Replay Draft Run"), g, "Replayed Draft Run"), await l(await u(e, p, {
|
|
268
407
|
body: JSON.stringify({
|
|
269
408
|
engineContract: n,
|
|
270
409
|
inputs: {},
|
|
410
|
+
trigger: {
|
|
411
|
+
nodeId: "another",
|
|
412
|
+
payload: {}
|
|
413
|
+
},
|
|
271
414
|
version: 1
|
|
272
415
|
}),
|
|
273
416
|
headers: { "idempotency-key": "draft-run" },
|
|
274
417
|
method: "POST"
|
|
275
|
-
}),
|
|
276
|
-
|
|
277
|
-
let _ = s((await c(await u(e, p, {
|
|
418
|
+
}), 409, "run.conflict", "Changing the entry conflicts with the original Run request"), await l(await u(e, `/v1/runs/${_}/result`), 409, "run.not-terminal", "Read queued Run result");
|
|
419
|
+
let v = s((await c(await u(e, p, {
|
|
278
420
|
body: JSON.stringify({
|
|
279
421
|
engineContract: n,
|
|
280
422
|
inputs: {},
|
|
423
|
+
trigger: {
|
|
424
|
+
nodeId: "start",
|
|
425
|
+
payload: {}
|
|
426
|
+
},
|
|
281
427
|
version: 1
|
|
282
428
|
}),
|
|
283
429
|
headers: { "idempotency-key": "draft-run-second" },
|
|
284
430
|
method: "POST"
|
|
285
|
-
}), 202, "Create second Draft Run")).runId, "Second Draft Run"),
|
|
286
|
-
i(o(
|
|
287
|
-
let
|
|
288
|
-
i(o((await c(await u(e, `/v1/flows/${r}/runs?limit=1&cursor=${encodeURIComponent(
|
|
431
|
+
}), 202, "Create second Draft Run")).runId, "Second Draft Run"), y = await c(await u(e, `/v1/flows/${r}/runs?limit=1`), 200, "List Runs");
|
|
432
|
+
i(o(y.runs, "Runs").map((e) => a(e, "Run").runId), [v], "Listed Runs");
|
|
433
|
+
let b = s(y.nextCursor, "Run cursor");
|
|
434
|
+
i(o((await c(await u(e, `/v1/flows/${r}/runs?limit=1&cursor=${encodeURIComponent(b)}`), 200, "List next Runs")).runs, "Next Runs").map((e) => a(e, "Run").runId), [_], "Listed next Runs"), await l(await u(e, `/v1/flows/${s((await f(e, "Other Run flow", "other-run-flow")).flowId, "Other Run Flow flowId")}/runs?limit=1&cursor=${encodeURIComponent(b)}`), 400, "page.invalid-cursor", "Reject Run cursor from another Flow"), i((await c(await u(e, `/v1/runs/${_}/cancel`, {
|
|
289
435
|
body: JSON.stringify({ version: 1 }),
|
|
290
436
|
method: "POST"
|
|
291
|
-
}), 200, "Cancel Run")).status, "canceled", "Canceled Run status"), i((await c(await u(e, `/v1/runs/${
|
|
437
|
+
}), 200, "Cancel Run")).status, "canceled", "Canceled Run status"), i((await c(await u(e, `/v1/runs/${_}/result`), 200, "Read canceled Run result")).status, "canceled", "Canceled Run result"), i((await c(await u(e, `/v1/runs/${_}/events`), 200, "Read canceled Run events")).done, !0, "Canceled Run events"), i((await c(await u(e, `/v1/runs/${v}/cancel`, {
|
|
292
438
|
body: JSON.stringify({ version: 1 }),
|
|
293
439
|
method: "POST"
|
|
294
440
|
}), 200, "Cancel second Draft Run")).status, "canceled", "Second canceled Run status");
|
|
@@ -298,11 +444,10 @@ var b = [
|
|
|
298
444
|
name: "pauses, resolves, resumes, and cancels waiting Draft Runs",
|
|
299
445
|
runtime: !0,
|
|
300
446
|
async verify(e) {
|
|
301
|
-
let t = await f(e, "Wait flow", "wait-flow"), d = s(t.flowId, "Wait Flow flowId"), m = `/v1/flows/${d}/revisions/${
|
|
447
|
+
let t = await f(e, "Wait flow", "wait-flow"), d = s(t.flowId, "Wait Flow flowId"), m = `/v1/flows/${d}/revisions/${g(await c(await p(e, d, await h(e, d, s(t.draftRevisionId, "Wait Flow revisionId")), [{
|
|
302
448
|
kind: "graph.node.create",
|
|
303
449
|
node: {
|
|
304
450
|
actions: ["approve", "reject"],
|
|
305
|
-
concurrency: 1,
|
|
306
451
|
input: {
|
|
307
452
|
handle: "value",
|
|
308
453
|
jsonSchema: {},
|
|
@@ -314,46 +459,58 @@ var b = [
|
|
|
314
459
|
value: { request: 1 }
|
|
315
460
|
} },
|
|
316
461
|
kind: "wait",
|
|
462
|
+
name: "Approval",
|
|
317
463
|
prompt: "Approve request 1?"
|
|
318
464
|
},
|
|
319
465
|
nodeId: "approval",
|
|
320
466
|
target: { kind: "flow" }
|
|
321
|
-
}
|
|
467
|
+
}, {
|
|
468
|
+
kind: "graph.edge.connect",
|
|
469
|
+
edge: {
|
|
470
|
+
source: "start",
|
|
471
|
+
target: "approval"
|
|
472
|
+
},
|
|
473
|
+
target: { kind: "flow" }
|
|
474
|
+
}]), 200, "Create Wait"), "Wait Revision")}/runs`, _ = async (t, r) => c(await u(e, m, {
|
|
322
475
|
body: JSON.stringify({
|
|
323
476
|
engineContract: n,
|
|
324
477
|
inputs: {},
|
|
478
|
+
trigger: {
|
|
479
|
+
nodeId: "start",
|
|
480
|
+
payload: {}
|
|
481
|
+
},
|
|
325
482
|
version: 1
|
|
326
483
|
}),
|
|
327
484
|
headers: { "idempotency-key": t },
|
|
328
485
|
method: "POST"
|
|
329
|
-
}), 202, r),
|
|
330
|
-
for (let t = 0;
|
|
331
|
-
i(
|
|
332
|
-
let
|
|
333
|
-
i(
|
|
334
|
-
let
|
|
335
|
-
i(o((await c(await u(e, `/v1/flows/${d}/runs?status=waiting`), 200, "List waiting Runs")).runs, "Waiting Runs").map((e) => a(e, "Waiting Run").runId), [
|
|
336
|
-
let
|
|
337
|
-
i(
|
|
338
|
-
let
|
|
486
|
+
}), 202, r), v = await _("wait-run", "Create Wait Run"), y = s(v.runId, "Wait Run runId"), b = v;
|
|
487
|
+
for (let t = 0; b.status != "waiting" && t < 200; t += 1) await new Promise((e) => setTimeout(e, 10)), b = await c(await u(e, `/v1/runs/${y}`), 200, "Read Wait Run");
|
|
488
|
+
i(b.status, "waiting", "Wait Run status");
|
|
489
|
+
let x = a(b.waiting, "Active Wait");
|
|
490
|
+
i(x.actions, ["approve", "reject"], "Wait actions"), i(x.nodeId, "approval", "Wait node"), i(x.prompt, "Approve request 1?", "Wait prompt"), s(x.expiresAt, "Wait expiry"), s(x.waitingSince, "Wait start");
|
|
491
|
+
let S = s(x.waitId, "Wait id");
|
|
492
|
+
i(o((await c(await u(e, `/v1/flows/${d}/runs?status=waiting`), 200, "List waiting Runs")).runs, "Waiting Runs").map((e) => a(e, "Waiting Run").runId), [y], "Waiting Run list");
|
|
493
|
+
let C = await c(await u(e, `/v1/runs/${y}/events`), 200, "Read waiting Run events");
|
|
494
|
+
i(C.done, !1, "Waiting events done"), o(C.events, "Waiting events").some((e) => a(e, "Waiting event").kind == "run.waiting") || r("Waiting Run must contain run.waiting."), await l(await u(e, `/v1/runs/${y}/result`), 409, "run.not-terminal", "Read waiting Run result");
|
|
495
|
+
let w = `/v1/runs/${y}/waits/${S}/resolve`, T = (t) => u(e, w, {
|
|
339
496
|
body: JSON.stringify({
|
|
340
497
|
action: t,
|
|
341
498
|
version: 1
|
|
342
499
|
}),
|
|
343
500
|
method: "POST"
|
|
344
501
|
});
|
|
345
|
-
await l(await
|
|
346
|
-
let
|
|
347
|
-
i(
|
|
348
|
-
let
|
|
349
|
-
i(
|
|
350
|
-
for (let t = 0;
|
|
351
|
-
i(
|
|
352
|
-
let
|
|
353
|
-
i(
|
|
354
|
-
let
|
|
355
|
-
for (let t = 0;
|
|
356
|
-
i(
|
|
502
|
+
await l(await T("continue"), 400, "run.invalid", "Reject unsupported Wait action");
|
|
503
|
+
let E = await c(await T("approve"), 200, "Approve Wait");
|
|
504
|
+
i(E.action, "approve", "Approved action"), i(E.resolutionAccepted, !0, "Approved resolution"), i(E.status, "queued", "Resolved Run status"), s(E.resolvedAt, "Wait resolution time");
|
|
505
|
+
let D = await c(await T("reject"), 200, "Reject resolved Wait");
|
|
506
|
+
i(D.action, "approve", "Winning action"), i(D.resolutionAccepted, !1, "Competing resolution");
|
|
507
|
+
for (let t = 0; b.status != "completed" && t < 200; t += 1) await new Promise((e) => setTimeout(e, 10)), b = await c(await u(e, `/v1/runs/${y}`), 200, "Read resumed Run");
|
|
508
|
+
i(b.status, "completed", "Resumed Run status"), i(b.waiting, void 0, "Completed Wait projection");
|
|
509
|
+
let O = await c(await T("approve"), 200, "Replay approved Wait");
|
|
510
|
+
i(O.resolutionAccepted, !0, "Replayed resolution"), i(O.status, "completed", "Replayed terminal status"), i(o((await c(await u(e, `/v1/runs/${y}/events`), 200, "Read resumed Run events")).events, "Completed events").filter((e) => a(e, "Completed event").kind == "run.resolved").length, 1, "Resolved event count");
|
|
511
|
+
let k = await _("wait-run-cancel", "Create cancelable Wait Run"), A = s(k.runId, "Cancelable Wait Run id"), j = k;
|
|
512
|
+
for (let t = 0; j.status != "waiting" && t < 200; t += 1) await new Promise((e) => setTimeout(e, 10)), j = await c(await u(e, `/v1/runs/${A}`), 200, "Read cancelable Wait Run");
|
|
513
|
+
i(j.status, "waiting", "Cancelable Wait status"), i((await c(await u(e, `/v1/runs/${A}/cancel`, {
|
|
357
514
|
body: JSON.stringify({ version: 1 }),
|
|
358
515
|
method: "POST"
|
|
359
516
|
}), 200, "Cancel waiting Run")).status, "canceled", "Canceled waiting Run status");
|
|
@@ -392,6 +549,10 @@ var b = [
|
|
|
392
549
|
body: JSON.stringify({
|
|
393
550
|
engineContract: n,
|
|
394
551
|
inputs: {},
|
|
552
|
+
trigger: {
|
|
553
|
+
nodeId: "start",
|
|
554
|
+
payload: {}
|
|
555
|
+
},
|
|
395
556
|
version: 1
|
|
396
557
|
}),
|
|
397
558
|
headers: { "idempotency-key": r },
|
|
@@ -400,35 +561,74 @@ var b = [
|
|
|
400
561
|
await l(await p(c, "unsupported-engine/v1", "unsupported-run"), 409, "engine.unsupported", "Run unsupported Engine"), await l(await p(r, n, "missing-revision-run"), 404, "flow.not-found", "Run missing Revision");
|
|
401
562
|
}
|
|
402
563
|
}
|
|
403
|
-
],
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
}, {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
564
|
+
], S = [
|
|
565
|
+
{
|
|
566
|
+
name: "controls Live admission independently from publishing and Draft testing",
|
|
567
|
+
async verify(e) {
|
|
568
|
+
let t = await f(e, "Enabled flow", "enabled-flow"), r = s(t.flowId, "Flow id"), o = await h(e, r, s(t.draftRevisionId, "Draft id")), d = (t, n) => u(e, `/v1/flows/${r}/enabled`, {
|
|
569
|
+
method: "PUT",
|
|
570
|
+
body: JSON.stringify({
|
|
571
|
+
enabled: t,
|
|
572
|
+
expectedPublicationId: n,
|
|
573
|
+
version: 1
|
|
574
|
+
})
|
|
575
|
+
});
|
|
576
|
+
await l(await d(!0, "missing"), 409, "flow.conflict", "Cannot enable unpublished Flow");
|
|
577
|
+
let p = s((await v(e, await _(e, r, o, null, "enable-first"), 202, "Publish")).publication.publicationId, "Publication id"), m = await c(await d(!1, p), 200, "Disable");
|
|
578
|
+
i(m.live, {
|
|
579
|
+
enabled: !1,
|
|
580
|
+
publicationId: p,
|
|
581
|
+
revisionId: o
|
|
582
|
+
}, "Disabled summary"), i((await c(await u(e, "/v1/flows"), 200, "List disabled Flow")).flows, [m], "List includes Live state"), i((await c(await u(e, `/v1/flows/${r}/live`), 200, "Disabled Live")).status, "suspended", "Disabled Live status"), await l(await b(e, p, "disabled-run"), 412, "live.conflict", "Disabled Live rejects Run"), await c(await u(e, `/v1/flows/${r}/revisions/${o}/runs`, {
|
|
583
|
+
method: "POST",
|
|
584
|
+
headers: { "idempotency-key": "disabled-draft" },
|
|
585
|
+
body: JSON.stringify({
|
|
586
|
+
engineContract: n,
|
|
587
|
+
inputs: {},
|
|
588
|
+
trigger: {
|
|
589
|
+
nodeId: "start",
|
|
590
|
+
payload: {}
|
|
591
|
+
},
|
|
592
|
+
version: 1
|
|
593
|
+
})
|
|
594
|
+
}), 202, "Disabled Flow permits Draft test");
|
|
595
|
+
let g = s((await v(e, await _(e, r, o, p, "enable-next"), 202, "Publish disabled Flow")).publication.publicationId, "Next Publication id");
|
|
596
|
+
i(a((await c(await u(e, `/v1/flows/${r}`), 200, "Read Flow")).live, "Live").enabled, !1, "Publish preserves disabled state"), await l(await d(!0, p), 409, "flow.conflict", "Stale switch rejects"), await c(await d(!0, g), 200, "Enable"), await c(await b(e, g, "enabled-run"), 202, "Enabled Live accepts Run");
|
|
597
|
+
}
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
name: "publishes one immutable Flow with idempotent Live CAS",
|
|
601
|
+
async verify(e) {
|
|
602
|
+
let t = await f(e, "Publication flow", "publication-flow"), n = s(t.flowId, "Publication Flow flowId"), r = await h(e, n, s(t.draftRevisionId, "Publication Flow revisionId"));
|
|
603
|
+
i((await c(await u(e, `/v1/flows/${n}/live`), 200, "Read Live")).status, "not-published", "Initial Live status");
|
|
604
|
+
let a = () => _(e, n, r, null, "publication-first"), o = await v(e, await a(), 202, "Publish Flow"), d = o.publication, p = s(d.publicationId, "Publication id");
|
|
605
|
+
i(await c(await a(), 202, "Replay Publish"), o.operation, "Replayed Publish operation"), await l(await _(e, n, r, p, "publication-first"), 409, "publication.conflict", "Conflicting replay");
|
|
606
|
+
let m = await c(await u(e, `/v1/flows/${n}/live`), 200, "Read published Live");
|
|
607
|
+
i(m.publication, d, "Live Publication"), i((await c(await u(e, `/v1/flows/${n}/editor`), 200, "Read published editor")).live, m, "Published editor Live projection");
|
|
608
|
+
let g = await c(await u(e, `/v1/flows/${n}/publications?includeTotal=true`), 200, "List Publications");
|
|
609
|
+
i(g.publications, [d], "Publication history"), i(g.total, 1, "Publication total"), await l(await u(e, `/v1/flows/${n}/revisions/${r}/publications`, {
|
|
610
|
+
body: JSON.stringify({
|
|
611
|
+
engineContract: "unsupported-engine/v1",
|
|
612
|
+
expectedLivePublicationId: p,
|
|
613
|
+
version: 1
|
|
614
|
+
}),
|
|
615
|
+
headers: { "idempotency-key": "unsupported-publication" },
|
|
616
|
+
method: "POST"
|
|
617
|
+
}), 409, "engine.unsupported", "Publish unsupported Engine"), await l(await _(e, n, "00000000-0000-7000-8000-000000000002", p, "missing-revision-publication"), 404, "flow.not-found", "Publish missing Revision"), await l(await y(e, n, "00000000-0000-7000-8000-000000000004", p, "missing-rollback"), 404, "publication.not-found", "Rollback missing Publication"), await l(await b(e, "00000000-0000-7000-8000-000000000004", "missing-publication-run"), 404, "publication.not-found", "Run missing Publication");
|
|
618
|
+
}
|
|
619
|
+
},
|
|
620
|
+
{
|
|
621
|
+
name: "rolls back immutable history and fixes a Live Run target",
|
|
622
|
+
async verify(e) {
|
|
623
|
+
let t = await f(e, "Rollback flow", "rollback-flow"), n = s(t.flowId, "Rollback Flow flowId"), r = await h(e, n, s(t.draftRevisionId, "Rollback Flow revisionId")), a = (await v(e, await _(e, n, r, null, "publish-first"), 202, "Publish first Revision")).publication, o = s(a.publicationId, "First Publication"), d = (await v(e, await _(e, n, g(await c(await m(e, n, r), 200, "Change Draft"), "Second Revision"), o, "publish-second"), 202, "Publish second Revision")).publication, p = s(d.publicationId, "Second Publication");
|
|
624
|
+
await l(await b(e, o, "stale-live-run"), 412, "live.conflict", "Run stale Publication");
|
|
625
|
+
let x = () => y(e, n, o, p, "rollback-first"), S = await c(await x(), 201, "Rollback Flow"), C = s(S.publicationId, "Rollback Publication");
|
|
626
|
+
i(S.operation, "rollback", "Rollback operation"), i(S.sourcePublicationId, o, "Rollback source"), i(await c(await x(), 200, "Replay Rollback"), S, "Replayed Rollback");
|
|
627
|
+
let w = await c(await b(e, C, "rollback-run"), 202, "Create Live Run");
|
|
628
|
+
i(w.flowId, n, "Live Run flowId"), i(w.revisionId, r, "Live Run revisionId"), await c(await u(e, `/v1/flows/${n}`, { method: "DELETE" }), 202, "Retire Flow"), await l(await b(e, C, "retired-run"), 409, "flow.busy", "Run retired Flow");
|
|
629
|
+
}
|
|
430
630
|
}
|
|
431
|
-
|
|
631
|
+
], C = [{
|
|
432
632
|
name: "exposes one deployment-scoped Trigger Key catalog",
|
|
433
633
|
async verify(e) {
|
|
434
634
|
let t = await c(await u(e, "/v1/trigger-keys"), 200, "List Trigger Keys"), n = await c(await u(e, "/v1/trigger-keys/catalog"), 200, "List Trigger definitions"), r = o(t.keys, "Trigger Keys").map((e) => a(e, "Trigger Key")), d = o(n.definitions, "Trigger definitions").map((e) => a(e, "Trigger definition"));
|
|
@@ -442,7 +642,7 @@ var b = [
|
|
|
442
642
|
}, {
|
|
443
643
|
name: "operates and retires one Live Trigger binding",
|
|
444
644
|
async verify(e) {
|
|
445
|
-
let t = await f(e, "Trigger flow", "trigger-flow"), n = s(t.flowId, "Trigger Flow flowId"), r =
|
|
645
|
+
let t = await f(e, "Trigger flow", "trigger-flow"), n = s(t.flowId, "Trigger Flow flowId"), r = g(await c(await p(e, n, s(t.draftRevisionId, "Trigger Flow revisionId"), [{
|
|
446
646
|
kind: "graph.node.create",
|
|
447
647
|
node: {
|
|
448
648
|
cronTimes: [{
|
|
@@ -464,20 +664,29 @@ var b = [
|
|
|
464
664
|
},
|
|
465
665
|
nodeId: "webhook",
|
|
466
666
|
target: { kind: "flow" }
|
|
467
|
-
}]), 200, "Create Trigger nodes"), "Trigger Revision"), l = (await
|
|
468
|
-
i(
|
|
469
|
-
for (let e of
|
|
667
|
+
}]), 200, "Create Trigger nodes"), "Trigger Revision"), l = (await v(e, await _(e, n, r, null, "trigger-publication"), 202, "Publish Trigger Flow")).publication, d = s(l.publicationId, "Trigger Publication"), m = `/v1/flows/${n}/triggers`, h = o((await c(await u(e, m), 200, "List Trigger bindings")).bindings, "Trigger bindings").map((e) => a(e, "Trigger binding"));
|
|
668
|
+
i(h.map((e) => e.triggerNodeId), ["cron", "webhook"], "Trigger binding order");
|
|
669
|
+
for (let e of h) i(e.currentPublicationId, d, "Trigger Publication");
|
|
470
670
|
let y = `${m}/webhook`, b = s(a((await c(await u(e, y), 200, "Read Webhook")).binding, "Webhook").endpointUrl, "Webhook endpoint"), x = (t) => u(e, `${y}/${t}`, {
|
|
471
671
|
body: JSON.stringify({ version: 1 }),
|
|
472
672
|
method: "POST"
|
|
473
673
|
});
|
|
474
|
-
i((await c(await x("pause"), 200, "Pause Webhook")).operatorState, "paused", "Paused state"), i((await e.request(new Request(b, { method: "POST" }))).status, 404, "Paused callback"), i((await c(await x("resume"), 200, "Resume Webhook")).operatorState, "active", "Resumed state"), i((await e.request(new Request(b, { method: "POST" }))).status, 200, "Resumed callback")
|
|
674
|
+
i((await c(await x("pause"), 200, "Pause Webhook")).operatorState, "paused", "Paused state"), i((await e.request(new Request(b, { method: "POST" }))).status, 404, "Paused callback"), i((await c(await x("resume"), 200, "Resume Webhook")).operatorState, "active", "Resumed state"), i((await e.request(new Request(b, { method: "POST" }))).status, 200, "Resumed callback");
|
|
675
|
+
let S = (t) => u(e, `/v1/flows/${n}/enabled`, {
|
|
676
|
+
method: "PUT",
|
|
677
|
+
body: JSON.stringify({
|
|
678
|
+
enabled: t,
|
|
679
|
+
expectedPublicationId: d,
|
|
680
|
+
version: 1
|
|
681
|
+
})
|
|
682
|
+
});
|
|
683
|
+
await c(await S(!1), 200, "Disable Trigger Flow"), i((await e.request(new Request(b, { method: "POST" }))).status, 404, "Disabled Flow blocks callback"), await c(await x("pause"), 200, "Pause binding while Flow disabled"), await c(await S(!0), 200, "Enable Trigger Flow"), i((await e.request(new Request(b, { method: "POST" }))).status, 404, "Enabling preserves binding pause"), await c(await x("resume"), 200, "Resume binding after enabling Flow"), i((await e.request(new Request(b, { method: "POST" }))).status, 200, "Enabled Flow permits callback"), await v(e, await _(e, n, g(await c(await p(e, n, r, [{
|
|
475
684
|
kind: "graph.node.delete",
|
|
476
685
|
nodeId: "webhook",
|
|
477
686
|
target: { kind: "flow" }
|
|
478
687
|
}]), 200, "Delete Webhook"), "Retired Trigger Revision"), d, "retire-trigger"), 202, "Publish retired Trigger"), i(a((await c(await u(e, y), 200, "Read retired Webhook")).binding, "Retired Webhook").currentPublicationId, void 0, "Retired Publication");
|
|
479
688
|
}
|
|
480
|
-
}],
|
|
689
|
+
}], w = [{
|
|
481
690
|
name: "projects the deployment Connector catalog and authorized Connections",
|
|
482
691
|
async verify(e) {
|
|
483
692
|
let t = o((await c(await u(e, "/v1/connector/providers"), 200, "List Connector Providers")).providers, "Connector Providers").map((e) => a(e, "Connector Provider")), n = o((await c(await u(e, "/v1/connector/actions"), 200, "List Connector Actions")).actions, "Connector Actions").map((e) => a(e, "Connector Action"));
|
|
@@ -497,6 +706,12 @@ var b = [
|
|
|
497
706
|
async verify(e) {
|
|
498
707
|
await l(await u(e, "/v1/connector/actions?service=mail&q=send"), 400, "flow.invalid", "Conflicting Connector query"), await l(await u(e, "/v1/connector/actions?q=%20%20"), 400, "flow.invalid", "Empty Connector query"), await l(await u(e, `/v1/connector/connections/${"a".repeat(257)}`), 400, "flow.invalid", "Oversized Connector service"), await l(await u(e, "/v1/connector/actions/conformance.missing"), 404, "connector.action-not-found", "Missing Connector Action");
|
|
499
708
|
}
|
|
709
|
+
}], T = [{
|
|
710
|
+
name: "preserves committed mutations and idempotency receipts after restart",
|
|
711
|
+
async verify(e) {
|
|
712
|
+
let t = await f(e, "Recovery", "recovery-create"), n = s(t.flowId, "Flow ID"), r = s(t.draftRevisionId, "Revision ID"), o = await c(await m(e, n, r, "marker", "recovery-change"), 200, "Commit change");
|
|
713
|
+
await e.restart(), i((await c(await d(e, "Recovery", "recovery-create"), 200, "Replay creation after restart")).flowId, n, "Durable creation identity"), i(await c(await m(e, n, r, "marker", "recovery-change"), 200, "Replay change after restart"), o, "Durable change receipt"), i((await c(await u(e, `/v1/flows/${n}/draft`), 200, "Recovered Draft")).revisionId, a(o.revision, "Revision").revisionId, "Recovered head");
|
|
714
|
+
}
|
|
500
715
|
}];
|
|
501
716
|
//#endregion
|
|
502
|
-
export {
|
|
717
|
+
export { w as connectorControlApiConformanceCases, x as controlApiConformanceCases, T as controlRecoveryConformanceCases, S as publicationControlApiConformanceCases, C as triggerControlApiConformanceCases };
|