@oomol-lab/open-flow 0.1.0-alpha.9 → 0.1.0-beta.10

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 (74) hide show
  1. package/README.md +5 -1
  2. package/dist/browser/DesignerIcon-DjgOMYI5.js +2065 -0
  3. package/dist/browser/createResourceDialog-DNBueSYZ.js +505 -0
  4. package/dist/browser/{dist-n9WmBm5w.js → dist-BKuSVKCC.js} +1 -1
  5. package/dist/browser/dist-BMRLCebL.js +1893 -0
  6. package/dist/browser/{dist-DWzdGVm9.js → dist-By46o5UV.js} +74 -74
  7. package/dist/browser/dist-CP0883sY.js +4 -0
  8. package/dist/browser/{dist-B0Q2Mn0n.js → dist-Cc0y2Pli.js} +809 -810
  9. package/dist/browser/dist-CeSZ2xSM.js +444 -0
  10. package/dist/browser/{dist-Bc9TvHYl.js → dist-Dg_VXC8f.js} +134 -135
  11. package/dist/browser/{dist-DhsGR_K3.js → dist-DmuE3M0R.js} +47 -48
  12. package/dist/browser/{dist-D5mdziGP.js → dist-DpDLsYtO.js} +18 -19
  13. package/dist/browser/dist-DxahK_I8.js +2688 -0
  14. package/dist/browser/{dist-DXgEYMFx.js → dist-meg_oHVR.js} +230 -230
  15. package/dist/browser/{esm-YIGXG-Js.js → esm-yhVU_KbQ.js} +14 -15
  16. package/dist/browser/flow-authoring-module.d.ts +2 -2
  17. package/dist/browser/flow-authoring-node.d.ts +9 -4
  18. package/dist/browser/flow-authoring.d.ts +2 -1
  19. package/dist/browser/flow-authoring.js +752 -162
  20. package/dist/browser/flow-change.d.ts +122 -13
  21. package/dist/browser/flow-change.js +326 -96
  22. package/dist/browser/flow-notifications.d.ts +5 -0
  23. package/dist/browser/flowChanges-B2ttnaj9.js +12265 -0
  24. package/dist/browser/{flowRunInputEditorStore-DXOyyY7o.js → flowRunInputEditorStore-DDidwd8h.js} +1528 -783
  25. package/dist/browser/{flowWorkspace-D7-rBA1-.js → flowWorkspace-Dr8-Hut9.js} +42428 -42499
  26. package/dist/browser/getPseudoElementBounds-5LArT6Xc.js +7147 -0
  27. package/dist/browser/icons-KIOgjHpD.js +730 -0
  28. package/dist/browser/languages-DgJehE1g.js +62 -0
  29. package/dist/browser/lib-C5Ipyfps.js +7856 -0
  30. package/dist/browser/licenses.md +119 -1
  31. package/dist/browser/main-DmjVyuWr.js +76 -0
  32. package/dist/browser/{markdownContent-ColGUxHy.js → markdownContent-DUfLdnUt.js} +4811 -4795
  33. package/dist/browser/theme.css +63 -0
  34. package/dist/browser/theme.css.d.ts +1 -0
  35. package/dist/browser/typeScriptSession-_TgJ_7Oq.js +2578 -0
  36. package/dist/browser/waitNotificationInputs-BPulOxYt.js +26 -0
  37. package/dist/browser/workbench-contract.d.ts +2 -1
  38. package/dist/browser/workbench.css +1 -1
  39. package/dist/browser/workbench.d.ts +47 -1
  40. package/dist/browser/workbench.js +1524 -1768
  41. package/dist/browser/workbenchSelect-CbXrdwxW.js +1375 -0
  42. package/dist/common/connector-action.d.ts +6 -0
  43. package/dist/common/connector-action.js +37 -29
  44. package/dist/common/control-api-conformance.d.ts +1 -0
  45. package/dist/common/control-api-conformance.js +171 -51
  46. package/dist/common/control-api-errors.d.ts +28 -0
  47. package/dist/common/control-api.d.ts +80 -21
  48. package/dist/common/control-api.js +311 -131
  49. package/dist/common/flow-encoding.d.ts +2 -2
  50. package/dist/common/flow-encoding.js +28 -9
  51. package/dist/common/flow-notifications.d.ts +5 -0
  52. package/dist/common/flow-semantics.d.ts +4 -0
  53. package/dist/common/flow-semantics.js +3544 -1098
  54. package/dist/common/integration-trigger.d.ts +1 -0
  55. package/dist/common/licenses.md +1 -25
  56. package/dist/common/localization.d.ts +21 -0
  57. package/dist/common/localization.js +62 -0
  58. package/dist/common/provider-triggers.js +4 -1
  59. package/dist/common/run-events.js +2 -1
  60. package/dist/common/run-lifecycle.d.ts +17 -2
  61. package/dist/common/run-lifecycle.js +53 -2
  62. package/dist/common/runtime-contract.d.ts +1 -1
  63. package/dist/common/runtime-contract.js +27 -0
  64. package/dist/common/scheduler.d.ts +68 -7
  65. package/dist/common/scheduler.js +528 -240
  66. package/dist/index.d.ts +2 -1
  67. package/package.json +10 -1
  68. package/dist/browser/addNodeOptions-DRndy4EK.js +0 -6910
  69. package/dist/browser/createLucideIcon-CqjqCezK.js +0 -5537
  70. package/dist/browser/createResourceDialog-A64dDFCG.js +0 -467
  71. package/dist/browser/dist-CUkceEvN.js +0 -1620
  72. package/dist/browser/dist-CVtP-E2c.js +0 -1543
  73. package/dist/browser/dist-DQVavPcf.js +0 -2328
  74. package/dist/browser/field-CKGQHCIi.js +0 -312
@@ -17,4 +17,10 @@ export interface ConnectorActionPorts {
17
17
  readonly nullable: boolean;
18
18
  }[];
19
19
  }
20
+ export interface ConnectorRuntimeInputPort {
21
+ readonly handle: string;
22
+ readonly jsonSchema: unknown;
23
+ readonly nullable: boolean;
24
+ }
20
25
  export declare function connectorActionPorts(inputSchema: unknown, outputSchema: unknown): ConnectorActionPorts;
26
+ export declare function normalizeConnectorRuntimeInputs<Value>(ports: readonly ConnectorRuntimeInputPort[], inputs: Readonly<Record<string, Value>>): Readonly<Record<string, Value>>;
@@ -3,82 +3,90 @@ var e = Array.isArray, t = (e) => typeof e == "object" && !!e, n = (n) => t(n) &
3
3
  //#endregion
4
4
  //#region src/connector/common/actionSchema.ts
5
5
  function i(e, t) {
6
- let n = a(e);
6
+ let n = o(e);
7
7
  return {
8
8
  inputs: n,
9
9
  initialInputs: n.flatMap((e) => e.value === void 0 ? [] : [{
10
10
  handle: e.handle,
11
11
  value: e.value
12
12
  }]),
13
- outputs: o(t)
13
+ outputs: s(t)
14
14
  };
15
15
  }
16
- function a(e) {
16
+ function a(e, t) {
17
+ let n = new Map(e.map((e) => [e.handle, e])), r = {};
18
+ for (let [e, i] of Object.entries(t)) {
19
+ let t = n.get(e);
20
+ i == null && t?.nullable == 1 && !f(t.jsonSchema) || (r[e] = i);
21
+ }
22
+ return r;
23
+ }
24
+ function o(e) {
17
25
  let t = r(e);
18
26
  if (t == null || t.type != "object" && t.properties == null) throw Error("Connector action inputSchema must be an object schema.");
19
27
  let n = r(t.properties);
20
28
  if (n == null) return [];
21
- let i = u(t.required);
29
+ let i = d(t.required);
22
30
  return Object.entries(n).map(([e, n]) => {
23
- let r = !i.has(e) || d(n, t);
31
+ let r = !i.has(e) || f(n, t);
24
32
  return {
25
- description: c(t, n),
33
+ description: l(t, n),
26
34
  handle: e,
27
- json_schema: s(t, n),
35
+ json_schema: c(t, n),
28
36
  nullable: r,
29
- value: l(t, n, r)
37
+ value: u(t, n, r)
30
38
  };
31
39
  });
32
40
  }
33
- function o(e) {
41
+ function s(e) {
34
42
  let t = r(e), n = r(t?.properties);
35
43
  if (t != null && (t.type == "object" || n != null)) {
36
44
  if (n == null) return [];
37
- let e = u(t.required);
45
+ let e = d(t.required);
38
46
  return Object.entries(n).map(([n, r]) => ({
39
- description: c(t, r),
47
+ description: l(t, r),
40
48
  handle: n,
41
- json_schema: s(t, r),
42
- nullable: !e.has(n) || d(r, t)
49
+ json_schema: c(t, r),
50
+ nullable: !e.has(n) || f(r, t)
43
51
  }));
44
52
  }
45
53
  return [{
46
- description: c(t, e),
54
+ description: l(t, e),
47
55
  handle: "output",
48
56
  json_schema: e,
49
- nullable: d(e)
57
+ nullable: f(e)
50
58
  }];
51
59
  }
52
- function s(e, t) {
60
+ function c(e, t) {
53
61
  let n = r(t);
54
62
  if (n == null) return t;
55
63
  let i = Object.assign({}, n);
56
64
  return i.$defs == null && e.$defs != null && (i.$defs = e.$defs), i.definitions == null && e.definitions != null && (i.definitions = e.definitions), i;
57
65
  }
58
- function c(e, t) {
59
- for (let n of f(e, t)) if (typeof n.description == "string") return n.description;
66
+ function l(e, t) {
67
+ for (let n of p(e, t)) if (typeof n.description == "string") return n.description;
60
68
  }
61
- function l(e, t, n) {
62
- for (let n of f(e, t)) if (Object.hasOwn(n, "default")) return n.default;
69
+ function u(e, t, n) {
70
+ for (let n of p(e, t)) if (Object.hasOwn(n, "default")) return n.default;
63
71
  return n ? null : void 0;
64
72
  }
65
- function u(e) {
73
+ function d(e) {
66
74
  return Array.isArray(e) ? new Set(e.filter((e) => typeof e == "string")) : /* @__PURE__ */ new Set();
67
75
  }
68
- function d(e, t = e, n = /* @__PURE__ */ new Set()) {
76
+ function f(e, t = e, n = /* @__PURE__ */ new Set()) {
69
77
  let i = r(e);
70
78
  if (i == null) return !1;
71
79
  if (Object.hasOwn(i, "type")) return i.type == "null" || Array.isArray(i.type) && i.type.includes("null");
72
80
  if (Object.hasOwn(i, "enum")) return Array.isArray(i.enum) && i.enum.includes(null);
73
- for (let e of ["anyOf", "oneOf"]) if (Object.hasOwn(i, e)) return Array.isArray(i[e]) && i[e].some((e) => d(e, t, n));
81
+ for (let e of ["anyOf", "oneOf"]) if (Object.hasOwn(i, e)) return Array.isArray(i[e]) && i[e].some((e) => f(e, t, n));
74
82
  let a = typeof i.$ref == "string" ? i.$ref : void 0;
75
83
  if (a == null || n.has(a)) return !1;
76
- let o = p(t, a);
84
+ let o = m(t, a);
77
85
  if (o === void 0) return !1;
78
86
  let s = new Set(n);
79
- return s.add(a), d(o, t, s);
87
+ return s.add(a), f(o, t, s);
80
88
  }
81
- function f(e, t) {
89
+ function p(e, t) {
82
90
  let n = [], i = /* @__PURE__ */ new Set(), a = t;
83
91
  for (;;) {
84
92
  let t = r(a);
@@ -86,12 +94,12 @@ function f(e, t) {
86
94
  n.push(t);
87
95
  let o = typeof t.$ref == "string" ? t.$ref : void 0;
88
96
  if (o == null || i.has(o)) return n;
89
- let s = p(e, o);
97
+ let s = m(e, o);
90
98
  if (s === void 0) return n;
91
99
  i.add(o), a = s;
92
100
  }
93
101
  }
94
- function p(e, t) {
102
+ function m(e, t) {
95
103
  if (t == "#") return e;
96
104
  if (!t.startsWith("#/")) return;
97
105
  let n = e;
@@ -103,4 +111,4 @@ function p(e, t) {
103
111
  return n;
104
112
  }
105
113
  //#endregion
106
- export { i as connectorActionPorts };
114
+ export { i as connectorActionPorts, a as normalizeConnectorRuntimeInputs };
@@ -5,6 +5,7 @@ export interface ControlApiConformanceHarness {
5
5
  }
6
6
  export interface ControlApiConformanceCase {
7
7
  readonly name: string;
8
+ readonly runtime?: true;
8
9
  verify(harness: ControlApiConformanceHarness): Promise<void>;
9
10
  }
10
11
  export declare const controlApiConformanceCases: readonly ControlApiConformanceCase[];
@@ -38,9 +38,11 @@ function s(e, t) {
38
38
  async function c(e, t, n) {
39
39
  return i(e.status, t, `${n} status`), a(await e.json().catch(() => r(`${n} body: expected JSON.`)), `${n} body`);
40
40
  }
41
- async function l(e, t, n, r) {
42
- let o = await c(e, t, r);
43
- i(a(o.error, `${r} error`).code, n, `${r} error code`), i(o.version, 1, `${r} version`);
41
+ async function l(e, t, n, o, l) {
42
+ let u = await c(e, t, o), d = a(u.error, `${o} error`);
43
+ i(d.code, n, `${o} error code`);
44
+ let f = s(d.message, `${o} error message`);
45
+ l != null && !f.includes(l) && r(`${o} error message: expected ${JSON.stringify(l)} in ${JSON.stringify(f)}.`), i(u.version, 1, `${o} version`);
44
46
  }
45
47
  function u(e, t, n = {}) {
46
48
  let r = new Headers(n.headers);
@@ -62,17 +64,18 @@ function d(e, t, n) {
62
64
  async function f(e, t, n) {
63
65
  return c(await d(e, t, n), 201, "Create Flow");
64
66
  }
65
- function p(e, t, n, r) {
67
+ function p(e, t, n, r, i = `change-${crypto.randomUUID()}`) {
66
68
  return u(e, `/v1/flows/${encodeURIComponent(t)}/draft/changes`, {
67
69
  body: JSON.stringify({
68
70
  expectedRevisionId: n,
69
71
  operations: r,
70
72
  version: 1
71
73
  }),
74
+ headers: { "idempotency-key": i },
72
75
  method: "POST"
73
76
  });
74
77
  }
75
- function m(e, t, n, r = "marker") {
78
+ function m(e, t, n, r = "marker", i) {
76
79
  return p(e, t, n, [{
77
80
  kind: "graph.node.create",
78
81
  node: {
@@ -88,7 +91,7 @@ function m(e, t, n, r = "marker") {
88
91
  },
89
92
  nodeId: r,
90
93
  target: { kind: "flow" }
91
- }]);
94
+ }], i);
92
95
  }
93
96
  function h(e, t) {
94
97
  return s(a(e.revision, `${t} revision`).revisionId, `${t} revisionId`);
@@ -104,7 +107,17 @@ function g(e, t, r, i, a) {
104
107
  method: "POST"
105
108
  });
106
109
  }
107
- function _(e, t, n, r, i) {
110
+ async function _(e, t, n, r) {
111
+ let o = await c(t, n, r), l = s(o.operationId, `${r} operationId`);
112
+ 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
+ i(o.status, "succeeded", `${r} terminal status`);
114
+ let d = s(o.publicationId, `${r} publicationId`), f = a((await c(await u(e, `/v1/flows/${s(o.flowId, `${r} flowId`)}/live`), 200, `${r} Live`)).publication, `${r} Publication`);
115
+ return i(f.publicationId, d, `${r} Live Publication`), {
116
+ operation: o,
117
+ publication: f
118
+ };
119
+ }
120
+ function v(e, t, n, r, i) {
108
121
  return u(e, `/v1/flows/${encodeURIComponent(t)}/publications/${encodeURIComponent(n)}/rollback`, {
109
122
  body: JSON.stringify({
110
123
  expectedLivePublicationId: r,
@@ -114,7 +127,7 @@ function _(e, t, n, r, i) {
114
127
  method: "POST"
115
128
  });
116
129
  }
117
- function v(e, t, n) {
130
+ function y(e, t, n) {
118
131
  return u(e, "/v1/runs", {
119
132
  body: JSON.stringify({
120
133
  inputs: {},
@@ -125,7 +138,46 @@ function v(e, t, n) {
125
138
  method: "POST"
126
139
  });
127
140
  }
128
- var y = [
141
+ var b = [
142
+ {
143
+ name: "manages deployment Variables with stable limits and exact-case identity",
144
+ async verify(e) {
145
+ i(await c(await u(e, "/v1/variables"), 200, "List empty Variables"), {
146
+ variables: [],
147
+ version: 1
148
+ }, "Empty Variables");
149
+ let t = (t, n, r = { value: n }) => u(e, `/v1/variables/${encodeURIComponent(t)}`, {
150
+ body: JSON.stringify(r),
151
+ method: "PUT"
152
+ }), n = await c(await t("Token", ""), 200, "Create Variable");
153
+ i(Object.keys(n).toSorted(), [
154
+ "name",
155
+ "updatedAt",
156
+ "value",
157
+ "version"
158
+ ], "Variable fields"), i(n.name, "Token", "Variable name"), i(n.value, "", "Empty Variable value"), i(n.version, 1, "Variable version"), s(n.updatedAt, "Variable updatedAt"), i(await c(await u(e, "/v1/variables/Token"), 200, "Read Variable"), n, "Read Variable"), i(await c(await t("Token", ""), 200, "Put same Variable"), n, "Same Variable update");
159
+ for (let e of [
160
+ "A",
161
+ "Z",
162
+ "a",
163
+ "token"
164
+ ]) await c(await t(e, e), 200, `Create ${e} Variable`);
165
+ i(o((await c(await u(e, "/v1/variables"), 200, "List Variables")).variables, "Variables").map((e) => a(e, "Variable").name), [
166
+ "A",
167
+ "Token",
168
+ "Z",
169
+ "a",
170
+ "token"
171
+ ], "Variable binary order");
172
+ let r = `${"值".repeat(21845)}x`;
173
+ i(new TextEncoder().encode(r).byteLength, 65536, "Variable UTF-8 boundary fixture"), await c(await t("BIG", r), 200, "Create maximum Variable value"), await l(await t("BIG", `${r}x`), 400, "variable.invalid", "Reject oversized Variable value"), await l(await t("OO_TOKEN", "value"), 400, "variable.invalid", "Reject reserved Variable name"), await l(await t("bad-name", "value"), 400, "variable.invalid", "Reject invalid Variable name"), await l(await t("EXTRA", "value", {
174
+ extra: !0,
175
+ value: "value"
176
+ }), 400, "variable.invalid", "Reject extra Variable field"), await l(await u(e, "/v1/variables/MISSING"), 404, "variable.not-found", "Read missing Variable"), await l(await u(e, "/v1/variables/MISSING", { method: "DELETE" }), 404, "variable.not-found", "Delete missing Variable"), i(await c(await u(e, "/v1/variables/Token", { method: "DELETE" }), 200, "Delete Variable"), { version: 1 }, "Delete response");
177
+ for (let e = 0; e < 195; e += 1) await c(await t(`V${String(e).padStart(3, "0")}`, "value"), 200, `Fill Variable ${e}`);
178
+ await l(await t("V195", "value"), 409, "variable.limit-reached", "Reject Variable over limit"), i((await c(await t("A", "updated"), 200, "Update full Variable catalog")).value, "updated", "Full catalog update");
179
+ }
180
+ },
129
181
  {
130
182
  name: "creates, replays, lists, reads, renames, and retires a Flow",
131
183
  async verify(e) {
@@ -148,24 +200,25 @@ var y = [
148
200
  {
149
201
  name: "commits immutable Draft Revisions for one Flow",
150
202
  async verify(e) {
151
- 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), 200, "Change Draft"), d = h(o, "Changed Draft");
152
- i(a(o.revision, "Changed Draft revision").parentRevisionId, r, "Changed Draft parent"), await l(await p(e, n, d, [{
153
- kind: "graph.node.replace",
154
- node: {
155
- concurrency: 1,
156
- inputs: {},
157
- kind: "value",
158
- values: [{
159
- handle: "ready",
160
- jsonSchema: { type: "boolean" },
161
- nullable: !1,
162
- value: !0
163
- }]
164
- },
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 = h(o, "Changed Draft");
204
+ 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
+ before: [{
206
+ handle: "ready",
207
+ jsonSchema: { type: "boolean" },
208
+ nullable: !1,
209
+ value: !0
210
+ }],
211
+ kind: "graph.node.values.set",
165
212
  nodeId: "marker",
166
- target: { kind: "flow" }
213
+ target: { kind: "flow" },
214
+ value: [{
215
+ handle: "ready",
216
+ jsonSchema: { type: "boolean" },
217
+ nullable: !1,
218
+ value: !0
219
+ }]
167
220
  }]), 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");
168
- let g = await c(await u(e, `/v1/flows/${n}/draft/sync?fromRevisionId=${r}`), 200, "Sync Draft");
221
+ let g = await c(await u(e, `/v1/flows/${n}/draft/sync`), 200, "Sync Draft");
169
222
  i(g.kind, "snapshot", "Draft sync kind"), i(a(g.draft, "Draft snapshot").revisionId, d, "Draft snapshot revisionId");
170
223
  }
171
224
  },
@@ -221,7 +274,7 @@ var y = [
221
274
  method: "POST"
222
275
  }), h = await c(await m(), 202, "Create Draft Run"), g = s(h.runId, "Draft Run runId");
223
276
  i(await c(await m(), 200, "Replay Draft Run"), h, "Replayed Draft Run"), await l(await u(e, `/v1/runs/${g}/result`), 409, "run.not-terminal", "Read queued Run result");
224
- let _ = await c(await u(e, p, {
277
+ let _ = s((await c(await u(e, p, {
225
278
  body: JSON.stringify({
226
279
  engineContract: n,
227
280
  inputs: {},
@@ -229,16 +282,83 @@ var y = [
229
282
  }),
230
283
  headers: { "idempotency-key": "draft-run-second" },
231
284
  method: "POST"
232
- }), 202, "Create second Draft Run"), v = await c(await u(e, `/v1/flows/${r}/runs?limit=1`), 200, "List Runs");
233
- i(o(v.runs, "Runs").map((e) => a(e, "Run").runId), [g], "Listed Runs"), s(v.nextCursor, "Run cursor"), i((await c(await u(e, `/v1/runs/${g}/cancel`, {
285
+ }), 202, "Create second Draft Run")).runId, "Second Draft Run"), v = await c(await u(e, `/v1/flows/${r}/runs?limit=1`), 200, "List Runs");
286
+ i(o(v.runs, "Runs").map((e) => a(e, "Run").runId), [_], "Listed Runs");
287
+ let y = s(v.nextCursor, "Run cursor");
288
+ i(o((await c(await u(e, `/v1/flows/${r}/runs?limit=1&cursor=${encodeURIComponent(y)}`), 200, "List next Runs")).runs, "Next Runs").map((e) => a(e, "Run").runId), [g], "Listed next Runs"), i((await c(await u(e, `/v1/runs/${g}/cancel`, {
234
289
  body: JSON.stringify({ version: 1 }),
235
290
  method: "POST"
236
- }), 200, "Cancel Run")).status, "canceled", "Canceled Run status"), i((await c(await u(e, `/v1/runs/${g}/result`), 200, "Read canceled Run result")).status, "canceled", "Canceled Run result"), i((await c(await u(e, `/v1/runs/${g}/events`), 200, "Read canceled Run events")).done, !0, "Canceled Run events"), i((await c(await u(e, `/v1/runs/${s(_.runId, "Second Draft Run")}/cancel`, {
291
+ }), 200, "Cancel Run")).status, "canceled", "Canceled Run status"), i((await c(await u(e, `/v1/runs/${g}/result`), 200, "Read canceled Run result")).status, "canceled", "Canceled Run result"), i((await c(await u(e, `/v1/runs/${g}/events`), 200, "Read canceled Run events")).done, !0, "Canceled Run events"), i((await c(await u(e, `/v1/runs/${_}/cancel`, {
237
292
  body: JSON.stringify({ version: 1 }),
238
293
  method: "POST"
239
294
  }), 200, "Cancel second Draft Run")).status, "canceled", "Second canceled Run status");
240
295
  }
241
296
  },
297
+ {
298
+ name: "pauses, resolves, resumes, and cancels waiting Draft Runs",
299
+ runtime: !0,
300
+ 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/${h(await c(await p(e, d, s(t.draftRevisionId, "Wait Flow revisionId"), [{
302
+ kind: "graph.node.create",
303
+ node: {
304
+ actions: ["approve", "reject"],
305
+ concurrency: 1,
306
+ input: {
307
+ handle: "value",
308
+ jsonSchema: {},
309
+ nullable: !0,
310
+ value: null
311
+ },
312
+ inputs: { value: {
313
+ kind: "value",
314
+ value: { request: 1 }
315
+ } },
316
+ kind: "wait",
317
+ prompt: "Approve request 1?"
318
+ },
319
+ nodeId: "approval",
320
+ target: { kind: "flow" }
321
+ }]), 200, "Create Wait"), "Wait Revision")}/runs`, g = async (t, r) => c(await u(e, m, {
322
+ body: JSON.stringify({
323
+ engineContract: n,
324
+ inputs: {},
325
+ version: 1
326
+ }),
327
+ headers: { "idempotency-key": t },
328
+ method: "POST"
329
+ }), 202, r), _ = await g("wait-run", "Create Wait Run"), v = s(_.runId, "Wait Run runId"), y = _;
330
+ for (let t = 0; y.status != "waiting" && t < 200; t += 1) await new Promise((e) => setTimeout(e, 10)), y = await c(await u(e, `/v1/runs/${v}`), 200, "Read Wait Run");
331
+ i(y.status, "waiting", "Wait Run status");
332
+ let b = a(y.waiting, "Active Wait");
333
+ i(b.actions, ["approve", "reject"], "Wait actions"), i(b.nodeId, "approval", "Wait node"), i(b.prompt, "Approve request 1?", "Wait prompt"), s(b.expiresAt, "Wait expiry"), s(b.waitingSince, "Wait start");
334
+ let x = s(b.waitId, "Wait id");
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), [v], "Waiting Run list");
336
+ let S = await c(await u(e, `/v1/runs/${v}/events`), 200, "Read waiting Run events");
337
+ i(S.done, !1, "Waiting events done"), o(S.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/${v}/result`), 409, "run.not-terminal", "Read waiting Run result");
338
+ let C = `/v1/runs/${v}/waits/${x}/resolve`, w = (t) => u(e, C, {
339
+ body: JSON.stringify({
340
+ action: t,
341
+ version: 1
342
+ }),
343
+ method: "POST"
344
+ });
345
+ await l(await w("continue"), 400, "run.invalid", "Reject unsupported Wait action");
346
+ let T = await c(await w("approve"), 200, "Approve Wait");
347
+ i(T.action, "approve", "Approved action"), i(T.resolutionAccepted, !0, "Approved resolution"), i(T.status, "queued", "Resolved Run status"), s(T.resolvedAt, "Wait resolution time");
348
+ let E = await c(await w("reject"), 200, "Reject resolved Wait");
349
+ i(E.action, "approve", "Winning action"), i(E.resolutionAccepted, !1, "Competing resolution");
350
+ for (let t = 0; y.status != "completed" && t < 200; t += 1) await new Promise((e) => setTimeout(e, 10)), y = await c(await u(e, `/v1/runs/${v}`), 200, "Read resumed Run");
351
+ i(y.status, "completed", "Resumed Run status"), i(y.waiting, void 0, "Completed Wait projection");
352
+ let D = await c(await w("approve"), 200, "Replay approved Wait");
353
+ i(D.resolutionAccepted, !0, "Replayed resolution"), i(D.status, "completed", "Replayed terminal status"), i(o((await c(await u(e, `/v1/runs/${v}/events`), 200, "Read resumed Run events")).events, "Completed events").filter((e) => a(e, "Completed event").kind == "run.resolved").length, 1, "Resolved event count");
354
+ let O = await g("wait-run-cancel", "Create cancelable Wait Run"), k = s(O.runId, "Cancelable Wait Run id"), A = O;
355
+ for (let t = 0; A.status != "waiting" && t < 200; t += 1) await new Promise((e) => setTimeout(e, 10)), A = await c(await u(e, `/v1/runs/${k}`), 200, "Read cancelable Wait Run");
356
+ i(A.status, "waiting", "Cancelable Wait status"), i((await c(await u(e, `/v1/runs/${k}/cancel`, {
357
+ body: JSON.stringify({ version: 1 }),
358
+ method: "POST"
359
+ }), 200, "Cancel waiting Run")).status, "canceled", "Canceled waiting Run status");
360
+ }
361
+ },
242
362
  {
243
363
  name: "rejects invalid and missing Flow control targets",
244
364
  async verify(e) {
@@ -280,35 +400,35 @@ var y = [
280
400
  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");
281
401
  }
282
402
  }
283
- ], b = [{
403
+ ], x = [{
284
404
  name: "publishes one immutable Flow with idempotent Live CAS",
285
405
  async verify(e) {
286
406
  let t = await f(e, "Publication flow", "publication-flow"), n = s(t.flowId, "Publication Flow flowId"), r = s(t.draftRevisionId, "Publication Flow revisionId");
287
407
  i((await c(await u(e, `/v1/flows/${n}/live`), 200, "Read Live")).status, "not-published", "Initial Live status");
288
- let a = () => g(e, n, r, null, "publication-first"), o = await c(await a(), 201, "Publish Flow"), d = s(o.publicationId, "Publication id");
289
- i(await c(await a(), 200, "Replay Publish"), o, "Replayed Publication"), await l(await g(e, n, r, d, "publication-first"), 409, "publication.conflict", "Conflicting replay"), i((await c(await u(e, `/v1/flows/${n}/live`), 200, "Read published Live")).publication, o, "Live Publication");
290
- let p = await c(await u(e, `/v1/flows/${n}/publications?includeTotal=true`), 200, "List Publications");
291
- i(p.publications, [o], "Publication history"), i(p.total, 1, "Publication total"), await l(await u(e, `/v1/flows/${n}/revisions/${r}/publications`, {
408
+ let a = () => g(e, n, r, null, "publication-first"), o = await _(e, await a(), 202, "Publish Flow"), d = o.publication, p = s(d.publicationId, "Publication id");
409
+ i(await c(await a(), 202, "Replay Publish"), o.operation, "Replayed Publish operation"), await l(await g(e, n, r, p, "publication-first"), 409, "publication.conflict", "Conflicting replay"), i((await c(await u(e, `/v1/flows/${n}/live`), 200, "Read published Live")).publication, d, "Live Publication");
410
+ let m = await c(await u(e, `/v1/flows/${n}/publications?includeTotal=true`), 200, "List Publications");
411
+ i(m.publications, [d], "Publication history"), i(m.total, 1, "Publication total"), await l(await u(e, `/v1/flows/${n}/revisions/${r}/publications`, {
292
412
  body: JSON.stringify({
293
413
  engineContract: "unsupported-engine/v1",
294
- expectedLivePublicationId: d,
414
+ expectedLivePublicationId: p,
295
415
  version: 1
296
416
  }),
297
417
  headers: { "idempotency-key": "unsupported-publication" },
298
418
  method: "POST"
299
- }), 409, "engine.unsupported", "Publish unsupported Engine"), await l(await g(e, n, "00000000-0000-7000-8000-000000000002", d, "missing-revision-publication"), 404, "flow.not-found", "Publish missing Revision"), await l(await _(e, n, "00000000-0000-7000-8000-000000000004", d, "missing-rollback"), 404, "publication.not-found", "Rollback missing Publication"), await l(await v(e, "00000000-0000-7000-8000-000000000004", "missing-publication-run"), 404, "publication.not-found", "Run missing Publication");
419
+ }), 409, "engine.unsupported", "Publish unsupported Engine"), await l(await g(e, n, "00000000-0000-7000-8000-000000000002", p, "missing-revision-publication"), 404, "flow.not-found", "Publish missing Revision"), await l(await v(e, n, "00000000-0000-7000-8000-000000000004", p, "missing-rollback"), 404, "publication.not-found", "Rollback missing Publication"), await l(await y(e, "00000000-0000-7000-8000-000000000004", "missing-publication-run"), 404, "publication.not-found", "Run missing Publication");
300
420
  }
301
421
  }, {
302
422
  name: "rolls back immutable history and fixes a Live Run target",
303
423
  async verify(e) {
304
- let t = await f(e, "Rollback flow", "rollback-flow"), n = s(t.flowId, "Rollback Flow flowId"), r = s(t.draftRevisionId, "Rollback Flow revisionId"), a = s((await c(await g(e, n, r, null, "publish-first"), 201, "Publish first Revision")).publicationId, "First Publication"), o = s((await c(await g(e, n, h(await c(await m(e, n, r), 200, "Change Draft"), "Second Revision"), a, "publish-second"), 201, "Publish second Revision")).publicationId, "Second Publication");
305
- await l(await v(e, a, "stale-live-run"), 412, "live.conflict", "Run stale Publication");
306
- let d = () => _(e, n, a, o, "rollback-first"), p = await c(await d(), 201, "Rollback Flow"), y = s(p.publicationId, "Rollback Publication");
307
- i(p.operation, "rollback", "Rollback operation"), i(p.sourcePublicationId, a, "Rollback source"), i(await c(await d(), 200, "Replay Rollback"), p, "Replayed Rollback");
308
- let b = await c(await v(e, y, "rollback-run"), 202, "Create Live Run");
309
- i(b.flowId, n, "Live Run flowId"), i(b.revisionId, r, "Live Run revisionId"), await c(await u(e, `/v1/flows/${n}`, { method: "DELETE" }), 202, "Retire Flow"), await l(await v(e, y, "retired-run"), 409, "flow.busy", "Run retired Flow");
424
+ let t = await f(e, "Rollback flow", "rollback-flow"), n = s(t.flowId, "Rollback Flow flowId"), r = s(t.draftRevisionId, "Rollback Flow revisionId"), a = (await _(e, await g(e, n, r, null, "publish-first"), 202, "Publish first Revision")).publication, o = s(a.publicationId, "First Publication"), d = (await _(e, await g(e, n, h(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");
425
+ await l(await y(e, o, "stale-live-run"), 412, "live.conflict", "Run stale Publication");
426
+ let b = () => v(e, n, o, p, "rollback-first"), x = await c(await b(), 201, "Rollback Flow"), S = s(x.publicationId, "Rollback Publication");
427
+ i(x.operation, "rollback", "Rollback operation"), i(x.sourcePublicationId, o, "Rollback source"), i(await c(await b(), 200, "Replay Rollback"), x, "Replayed Rollback");
428
+ let C = await c(await y(e, S, "rollback-run"), 202, "Create Live Run");
429
+ i(C.flowId, n, "Live Run flowId"), i(C.revisionId, r, "Live Run revisionId"), await c(await u(e, `/v1/flows/${n}`, { method: "DELETE" }), 202, "Retire Flow"), await l(await y(e, S, "retired-run"), 409, "flow.busy", "Run retired Flow");
310
430
  }
311
- }], x = [{
431
+ }], S = [{
312
432
  name: "exposes one deployment-scoped Trigger Key catalog",
313
433
  async verify(e) {
314
434
  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"));
@@ -344,20 +464,20 @@ var y = [
344
464
  },
345
465
  nodeId: "webhook",
346
466
  target: { kind: "flow" }
347
- }]), 200, "Create Trigger nodes"), "Trigger Revision"), l = s((await c(await g(e, n, r, null, "trigger-publication"), 201, "Publish Trigger Flow")).publicationId, "Trigger Publication"), d = `/v1/flows/${n}/triggers`, m = o((await c(await u(e, d), 200, "List Trigger bindings")).bindings, "Trigger bindings").map((e) => a(e, "Trigger binding"));
348
- i(m.map((e) => e.triggerNodeId), ["cron", "webhook"], "Trigger binding order");
349
- for (let e of m) i(e.currentPublicationId, l, "Trigger Publication");
350
- let _ = `${d}/webhook`, v = s(a((await c(await u(e, _), 200, "Read Webhook")).binding, "Webhook").endpointUrl, "Webhook endpoint"), y = (t) => u(e, `${_}/${t}`, {
467
+ }]), 200, "Create Trigger nodes"), "Trigger Revision"), l = (await _(e, await g(e, n, r, null, "trigger-publication"), 202, "Publish Trigger Flow")).publication, d = s(l.publicationId, "Trigger Publication"), m = `/v1/flows/${n}/triggers`, v = o((await c(await u(e, m), 200, "List Trigger bindings")).bindings, "Trigger bindings").map((e) => a(e, "Trigger binding"));
468
+ i(v.map((e) => e.triggerNodeId), ["cron", "webhook"], "Trigger binding order");
469
+ for (let e of v) i(e.currentPublicationId, d, "Trigger Publication");
470
+ 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}`, {
351
471
  body: JSON.stringify({ version: 1 }),
352
472
  method: "POST"
353
473
  });
354
- i((await c(await y("pause"), 200, "Pause Webhook")).operatorState, "paused", "Paused state"), i((await e.request(new Request(v, { method: "POST" }))).status, 404, "Paused callback"), i((await c(await y("resume"), 200, "Resume Webhook")).operatorState, "active", "Resumed state"), i((await e.request(new Request(v, { method: "POST" }))).status, 200, "Resumed callback"), await c(await g(e, n, h(await c(await p(e, n, r, [{
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"), await _(e, await g(e, n, h(await c(await p(e, n, r, [{
355
475
  kind: "graph.node.delete",
356
476
  nodeId: "webhook",
357
477
  target: { kind: "flow" }
358
- }]), 200, "Delete Webhook"), "Retired Trigger Revision"), l, "retire-trigger"), 201, "Publish retired Trigger"), i(a((await c(await u(e, _), 200, "Read retired Webhook")).binding, "Retired Webhook").currentPublicationId, void 0, "Retired Publication");
478
+ }]), 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");
359
479
  }
360
- }], S = [{
480
+ }], C = [{
361
481
  name: "projects the deployment Connector catalog and authorized Connections",
362
482
  async verify(e) {
363
483
  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"));
@@ -379,4 +499,4 @@ var y = [
379
499
  }
380
500
  }];
381
501
  //#endregion
382
- export { S as connectorControlApiConformanceCases, y as controlApiConformanceCases, b as publicationControlApiConformanceCases, x as triggerControlApiConformanceCases };
502
+ export { C as connectorControlApiConformanceCases, b as controlApiConformanceCases, x as publicationControlApiConformanceCases, S as triggerControlApiConformanceCases };
@@ -3,6 +3,7 @@ export declare const controlErrorCode: {
3
3
  readonly authorizationDenied: 'authorization.denied';
4
4
  readonly bindingUnresolved: 'binding.unresolved';
5
5
  readonly connectorActionNotFound: 'connector.action-not-found';
6
+ readonly connectorUnconfigured: 'connector.unconfigured';
6
7
  readonly connectorUnavailable: 'connector.unavailable';
7
8
  readonly engineUnavailable: 'engine.unavailable';
8
9
  readonly engineUnsupported: 'engine.unsupported';
@@ -17,6 +18,8 @@ export declare const controlErrorCode: {
17
18
  readonly pageInvalidCursor: 'page.invalid-cursor';
18
19
  readonly publicationConflict: 'publication.conflict';
19
20
  readonly publicationNotFound: 'publication.not-found';
21
+ readonly publicationUnsupported: 'publication.unsupported';
22
+ readonly publishOperationNotFound: 'publication.operation-not-found';
20
23
  readonly routeNotFound: 'route.not-found';
21
24
  readonly runConflict: 'run.conflict';
22
25
  readonly runEventsExpired: 'run.events-expired';
@@ -24,9 +27,13 @@ export declare const controlErrorCode: {
24
27
  readonly runNotFound: 'run.not-found';
25
28
  readonly runNotTerminal: 'run.not-terminal';
26
29
  readonly runOverloaded: 'run.overloaded';
30
+ readonly runWaitNotFound: 'run.wait-not-found';
27
31
  readonly triggerKeyInvalid: 'trigger-key.invalid';
28
32
  readonly triggerKeyNotFound: 'trigger-key.not-found';
29
33
  readonly triggerNotFound: 'trigger.not-found';
34
+ readonly variableInvalid: 'variable.invalid';
35
+ readonly variableLimitReached: 'variable.limit-reached';
36
+ readonly variableNotFound: 'variable.not-found';
30
37
  };
31
38
  export type ControlErrorCode = (typeof controlErrorCode)[keyof typeof controlErrorCode];
32
39
  export declare const controlErrorMetadata: {
@@ -42,6 +49,9 @@ export declare const controlErrorMetadata: {
42
49
  readonly "connector.action-not-found": {
43
50
  readonly status: 404;
44
51
  };
52
+ readonly "connector.unconfigured": {
53
+ readonly status: 503;
54
+ };
45
55
  readonly "connector.unavailable": {
46
56
  readonly status: 503;
47
57
  };
@@ -84,6 +94,12 @@ export declare const controlErrorMetadata: {
84
94
  readonly "publication.not-found": {
85
95
  readonly status: 404;
86
96
  };
97
+ readonly "publication.unsupported": {
98
+ readonly status: 409;
99
+ };
100
+ readonly "publication.operation-not-found": {
101
+ readonly status: 404;
102
+ };
87
103
  readonly "route.not-found": {
88
104
  readonly status: 404;
89
105
  };
@@ -105,6 +121,9 @@ export declare const controlErrorMetadata: {
105
121
  readonly "run.overloaded": {
106
122
  readonly status: 429;
107
123
  };
124
+ readonly "run.wait-not-found": {
125
+ readonly status: 404;
126
+ };
108
127
  readonly "trigger-key.invalid": {
109
128
  readonly status: 409;
110
129
  };
@@ -114,4 +133,13 @@ export declare const controlErrorMetadata: {
114
133
  readonly "trigger.not-found": {
115
134
  readonly status: 404;
116
135
  };
136
+ readonly "variable.invalid": {
137
+ readonly status: 400;
138
+ };
139
+ readonly "variable.limit-reached": {
140
+ readonly status: 409;
141
+ };
142
+ readonly "variable.not-found": {
143
+ readonly status: 404;
144
+ };
117
145
  };