callman-core 1.32.0 → 1.33.0

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 (93) hide show
  1. package/ai-packs/scenario-nodes.md +57 -2
  2. package/dist/ai/prompts/scenario.d.ts +1 -1
  3. package/dist/ai/prompts/scenario.d.ts.map +1 -1
  4. package/dist/ai/prompts/scenario.js +3 -1
  5. package/dist/ai/prompts/scenario.js.map +1 -1
  6. package/dist/ai/prompts/scenarioNodeDefaults.d.ts.map +1 -1
  7. package/dist/ai/prompts/scenarioNodeDefaults.js +9 -0
  8. package/dist/ai/prompts/scenarioNodeDefaults.js.map +1 -1
  9. package/dist/ai/prompts/scenarioNodeReference.d.ts.map +1 -1
  10. package/dist/ai/prompts/scenarioNodeReference.js +80 -2
  11. package/dist/ai/prompts/scenarioNodeReference.js.map +1 -1
  12. package/dist/host/index.d.ts +2 -0
  13. package/dist/host/index.d.ts.map +1 -1
  14. package/dist/host/index.js +3 -0
  15. package/dist/host/index.js.map +1 -1
  16. package/dist/host/temporal/temporalService.d.ts +67 -0
  17. package/dist/host/temporal/temporalService.d.ts.map +1 -0
  18. package/dist/host/temporal/temporalService.js +1182 -0
  19. package/dist/host/temporal/temporalService.js.map +1 -0
  20. package/dist/host/temporal/types.d.ts +13 -0
  21. package/dist/host/temporal/types.d.ts.map +1 -0
  22. package/dist/host/temporal/types.js +5 -0
  23. package/dist/host/temporal/types.js.map +1 -0
  24. package/dist/scenario-runner/adapters/connection-config.d.ts +17 -1
  25. package/dist/scenario-runner/adapters/connection-config.d.ts.map +1 -1
  26. package/dist/scenario-runner/adapters/index.d.ts +3 -2
  27. package/dist/scenario-runner/adapters/index.d.ts.map +1 -1
  28. package/dist/scenario-runner/adapters/index.js +7 -0
  29. package/dist/scenario-runner/adapters/index.js.map +1 -1
  30. package/dist/scenario-runner/adapters/temporal-executor.d.ts +10 -0
  31. package/dist/scenario-runner/adapters/temporal-executor.d.ts.map +1 -0
  32. package/dist/scenario-runner/adapters/temporal-executor.js +186 -0
  33. package/dist/scenario-runner/adapters/temporal-executor.js.map +1 -0
  34. package/dist/scenario-runner/adapters/types.d.ts +16 -5
  35. package/dist/scenario-runner/adapters/types.d.ts.map +1 -1
  36. package/dist/scenario-runner/condition.d.ts.map +1 -1
  37. package/dist/scenario-runner/condition.js +73 -0
  38. package/dist/scenario-runner/condition.js.map +1 -1
  39. package/dist/scenario-runner/graphTraversal.d.ts +6 -0
  40. package/dist/scenario-runner/graphTraversal.d.ts.map +1 -1
  41. package/dist/scenario-runner/graphTraversal.js +9 -0
  42. package/dist/scenario-runner/graphTraversal.js.map +1 -1
  43. package/dist/scenario-runner/index.d.ts +1 -0
  44. package/dist/scenario-runner/index.d.ts.map +1 -1
  45. package/dist/scenario-runner/index.js +3 -0
  46. package/dist/scenario-runner/index.js.map +1 -1
  47. package/dist/scenario-runner/nodePolicy.d.ts +2 -2
  48. package/dist/scenario-runner/nodePolicy.d.ts.map +1 -1
  49. package/dist/scenario-runner/nodePolicy.js +3 -0
  50. package/dist/scenario-runner/nodePolicy.js.map +1 -1
  51. package/dist/scenario-runner/runScenario.d.ts.map +1 -1
  52. package/dist/scenario-runner/runScenario.js +76 -0
  53. package/dist/scenario-runner/runScenario.js.map +1 -1
  54. package/dist/scenario-runner/temporal.d.ts +73 -0
  55. package/dist/scenario-runner/temporal.d.ts.map +1 -0
  56. package/dist/scenario-runner/temporal.js +377 -0
  57. package/dist/scenario-runner/temporal.js.map +1 -0
  58. package/dist/scenario-runner/types.d.ts +206 -4
  59. package/dist/scenario-runner/types.d.ts.map +1 -1
  60. package/dist/ui-test/commands.d.ts.map +1 -1
  61. package/dist/ui-test/commands.js +71 -0
  62. package/dist/ui-test/commands.js.map +1 -1
  63. package/dist-cjs/ai/prompts/scenario.js +3 -1
  64. package/dist-cjs/ai/prompts/scenario.js.map +1 -1
  65. package/dist-cjs/ai/prompts/scenarioNodeDefaults.js +9 -0
  66. package/dist-cjs/ai/prompts/scenarioNodeDefaults.js.map +1 -1
  67. package/dist-cjs/ai/prompts/scenarioNodeReference.js +79 -1
  68. package/dist-cjs/ai/prompts/scenarioNodeReference.js.map +1 -1
  69. package/dist-cjs/host/index.js +20 -2
  70. package/dist-cjs/host/index.js.map +1 -1
  71. package/dist-cjs/host/temporal/temporalService.js +1200 -0
  72. package/dist-cjs/host/temporal/temporalService.js.map +1 -0
  73. package/dist-cjs/host/temporal/types.js +6 -0
  74. package/dist-cjs/host/temporal/types.js.map +1 -0
  75. package/dist-cjs/scenario-runner/adapters/index.js +9 -1
  76. package/dist-cjs/scenario-runner/adapters/index.js.map +1 -1
  77. package/dist-cjs/scenario-runner/adapters/temporal-executor.js +190 -0
  78. package/dist-cjs/scenario-runner/adapters/temporal-executor.js.map +1 -0
  79. package/dist-cjs/scenario-runner/condition.js +73 -0
  80. package/dist-cjs/scenario-runner/condition.js.map +1 -1
  81. package/dist-cjs/scenario-runner/graphTraversal.js +10 -1
  82. package/dist-cjs/scenario-runner/graphTraversal.js.map +1 -1
  83. package/dist-cjs/scenario-runner/index.js +3 -0
  84. package/dist-cjs/scenario-runner/index.js.map +1 -1
  85. package/dist-cjs/scenario-runner/nodePolicy.js +3 -0
  86. package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -1
  87. package/dist-cjs/scenario-runner/runScenario.js +76 -0
  88. package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
  89. package/dist-cjs/scenario-runner/temporal.js +386 -0
  90. package/dist-cjs/scenario-runner/temporal.js.map +1 -0
  91. package/dist-cjs/ui-test/commands.js +71 -0
  92. package/dist-cjs/ui-test/commands.js.map +1 -1
  93. package/package.json +2 -1
@@ -0,0 +1,386 @@
1
+ "use strict";
2
+ // Temporal node helpers shared by the executor, the hosts and the authoring
3
+ // tools (desktop builder validation, backend zod schema, MCP required-field
4
+ // check all read TEMPORAL_OPERATION_SPECS instead of keeping their own list).
5
+ //
6
+ // `resolveTemporalOperation` turns a node config + the live template values
7
+ // into a fully resolved, typed operation (templates substituted, JSON args
8
+ // parsed) and is the ONE place that decides what is required per operation.
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.buildTemporalUiUrl = exports.resolveTemporalOperation = exports.getTemporalNodeMissingFields = exports.TemporalConfigError = exports.createEmptyTemporalResult = exports.TEMPORAL_WORKFLOW_ID_CONFLICT_POLICIES = exports.TEMPORAL_WORKFLOW_ID_REUSE_POLICIES = exports.TEMPORAL_OPERATION_SPECS = exports.isTemporalOperation = exports.TEMPORAL_OPERATIONS = void 0;
11
+ exports.TEMPORAL_OPERATIONS = [
12
+ "startWorkflow",
13
+ "signal",
14
+ "signalWithStart",
15
+ "query",
16
+ "update",
17
+ "awaitResult",
18
+ "describe",
19
+ "history",
20
+ "cancel",
21
+ "terminate",
22
+ "list",
23
+ "count",
24
+ "describeTaskQueue",
25
+ ];
26
+ const isTemporalOperation = (value) => typeof value === "string" && exports.TEMPORAL_OPERATIONS.includes(value);
27
+ exports.isTemporalOperation = isTemporalOperation;
28
+ const START_OPTIONS = [
29
+ "idReusePolicy",
30
+ "idConflictPolicy",
31
+ "memo",
32
+ "searchAttributes",
33
+ "workflowExecutionTimeoutMs",
34
+ "workflowRunTimeoutMs",
35
+ "workflowTaskTimeoutMs",
36
+ "startDelayMs",
37
+ "retryPolicy",
38
+ ];
39
+ exports.TEMPORAL_OPERATION_SPECS = {
40
+ startWorkflow: {
41
+ operation: "startWorkflow",
42
+ label: "Start workflow",
43
+ summary: "Start a workflow execution; optionally wait for its result.",
44
+ required: ["workflowType", "taskQueue"],
45
+ optional: ["workflowId", "args", "waitForResult", "followRuns", "onTimeout", ...START_OPTIONS],
46
+ waits: true,
47
+ },
48
+ signal: {
49
+ operation: "signal",
50
+ label: "Signal",
51
+ summary: "Send a signal to a running workflow.",
52
+ required: ["workflowId", "signalName"],
53
+ optional: ["runId", "args"],
54
+ waits: false,
55
+ },
56
+ signalWithStart: {
57
+ operation: "signalWithStart",
58
+ label: "Signal with start",
59
+ summary: "Signal the workflow, starting it first when it is not running.",
60
+ required: ["workflowId", "workflowType", "taskQueue", "signalName"],
61
+ optional: ["args", "signalArgs", ...START_OPTIONS],
62
+ waits: false,
63
+ },
64
+ query: {
65
+ operation: "query",
66
+ label: "Query",
67
+ summary: "Read workflow state through a query handler (works on closed workflows too).",
68
+ required: ["workflowId", "queryName"],
69
+ optional: ["runId", "args"],
70
+ waits: false,
71
+ },
72
+ update: {
73
+ operation: "update",
74
+ label: "Update",
75
+ summary: "Invoke an update handler and wait for its result.",
76
+ required: ["workflowId", "updateName"],
77
+ optional: ["runId", "args", "waitForStage"],
78
+ waits: true,
79
+ },
80
+ awaitResult: {
81
+ operation: "awaitResult",
82
+ label: "Await result",
83
+ summary: "Wait for the workflow to close and expose its result or failure.",
84
+ required: ["workflowId"],
85
+ optional: ["runId", "followRuns", "onTimeout"],
86
+ waits: true,
87
+ },
88
+ describe: {
89
+ operation: "describe",
90
+ label: "Describe",
91
+ summary: "Status, type, task queue, timings, memo, search attributes and pending activities.",
92
+ required: ["workflowId"],
93
+ optional: ["runId"],
94
+ waits: false,
95
+ },
96
+ history: {
97
+ operation: "history",
98
+ label: "History",
99
+ summary: "Fetch the event history and summarize it (event counts, activities, signals, timers, failure).",
100
+ required: ["workflowId"],
101
+ optional: ["runId", "eventTypes", "historyLimit"],
102
+ waits: false,
103
+ },
104
+ cancel: {
105
+ operation: "cancel",
106
+ label: "Cancel",
107
+ summary: "Request cancellation (the workflow runs its cleanup).",
108
+ required: ["workflowId"],
109
+ optional: ["runId", "reason"],
110
+ waits: false,
111
+ },
112
+ terminate: {
113
+ operation: "terminate",
114
+ label: "Terminate",
115
+ summary: "Terminate the workflow immediately (no cleanup).",
116
+ required: ["workflowId"],
117
+ optional: ["runId", "reason"],
118
+ waits: false,
119
+ },
120
+ list: {
121
+ operation: "list",
122
+ label: "List",
123
+ summary: "List workflow executions matching a visibility filter.",
124
+ required: ["query"],
125
+ optional: ["pageSize"],
126
+ waits: false,
127
+ },
128
+ count: {
129
+ operation: "count",
130
+ label: "Count",
131
+ summary: "Count workflow executions matching a visibility filter (GROUP BY supported).",
132
+ required: ["query"],
133
+ optional: [],
134
+ waits: false,
135
+ },
136
+ describeTaskQueue: {
137
+ operation: "describeTaskQueue",
138
+ label: "Describe task queue",
139
+ summary: "Which workers poll a task queue — a worker-is-alive check.",
140
+ required: ["taskQueue"],
141
+ optional: ["taskQueueType"],
142
+ waits: false,
143
+ },
144
+ };
145
+ exports.TEMPORAL_WORKFLOW_ID_REUSE_POLICIES = [
146
+ "ALLOW_DUPLICATE",
147
+ "ALLOW_DUPLICATE_FAILED_ONLY",
148
+ "REJECT_DUPLICATE",
149
+ "TERMINATE_IF_RUNNING",
150
+ ];
151
+ exports.TEMPORAL_WORKFLOW_ID_CONFLICT_POLICIES = [
152
+ "FAIL",
153
+ "USE_EXISTING",
154
+ "TERMINATE_EXISTING",
155
+ ];
156
+ /** Every key of ScenarioTemporalResult, with its "not applicable" value. */
157
+ const createEmptyTemporalResult = (operation, namespace) => ({
158
+ operation,
159
+ namespace,
160
+ workflowId: null,
161
+ runId: null,
162
+ status: null,
163
+ workflowType: null,
164
+ taskQueue: null,
165
+ result: null,
166
+ failure: null,
167
+ startTime: null,
168
+ closeTime: null,
169
+ historyLength: null,
170
+ memo: null,
171
+ searchAttributes: null,
172
+ activities: [],
173
+ pendingChildren: [],
174
+ events: [],
175
+ eventCounts: {},
176
+ signals: [],
177
+ timers: [],
178
+ truncatedHistory: false,
179
+ executions: [],
180
+ count: null,
181
+ groups: [],
182
+ pollers: [],
183
+ hasPollers: null,
184
+ updateId: null,
185
+ requested: null,
186
+ timedOut: false,
187
+ durationMs: 0,
188
+ });
189
+ exports.createEmptyTemporalResult = createEmptyTemporalResult;
190
+ class TemporalConfigError extends Error {
191
+ constructor(message) {
192
+ super(message);
193
+ this.name = "TemporalConfigError";
194
+ }
195
+ }
196
+ exports.TemporalConfigError = TemporalConfigError;
197
+ const FIELD_LABELS = {
198
+ workflowId: "workflow id",
199
+ workflowType: "workflow type",
200
+ taskQueue: "task queue",
201
+ signalName: "signal name",
202
+ queryName: "query name",
203
+ updateName: "update name",
204
+ query: "list filter",
205
+ };
206
+ const describeField = (field) => FIELD_LABELS[field] ?? String(field);
207
+ const isBlank = (value) => value === undefined || value === null || (typeof value === "string" && value.trim() === "");
208
+ /**
209
+ * Static validation (no templates resolved): which required fields are empty
210
+ * for the chosen operation. Hosts use it in the builder / on save.
211
+ */
212
+ const getTemporalNodeMissingFields = (config) => {
213
+ const operation = config?.operation;
214
+ if (!(0, exports.isTemporalOperation)(operation)) {
215
+ return ["operation"];
216
+ }
217
+ const missing = [];
218
+ if (isBlank(config?.connectionId)) {
219
+ missing.push("connectionId");
220
+ }
221
+ for (const field of exports.TEMPORAL_OPERATION_SPECS[operation].required) {
222
+ if (isBlank(config?.[field])) {
223
+ missing.push(String(field));
224
+ }
225
+ }
226
+ return missing;
227
+ };
228
+ exports.getTemporalNodeMissingFields = getTemporalNodeMissingFields;
229
+ const parseJsonArray = (raw, field, resolve) => {
230
+ const text = (raw ?? "").trim();
231
+ if (!text) {
232
+ return [];
233
+ }
234
+ const resolved = resolve(text);
235
+ let parsed;
236
+ try {
237
+ parsed = JSON.parse(resolved);
238
+ }
239
+ catch {
240
+ throw new TemporalConfigError(`Temporal ${field} must be a JSON array after template resolution (got: ${resolved.slice(0, 80)}).`);
241
+ }
242
+ if (Array.isArray(parsed)) {
243
+ return parsed;
244
+ }
245
+ // A single value is a convenience for one-argument handlers.
246
+ return [parsed];
247
+ };
248
+ const parseJsonObject = (raw, field, resolve) => {
249
+ const text = (raw ?? "").trim();
250
+ if (!text) {
251
+ return undefined;
252
+ }
253
+ const resolved = resolve(text);
254
+ let parsed;
255
+ try {
256
+ parsed = JSON.parse(resolved);
257
+ }
258
+ catch {
259
+ throw new TemporalConfigError(`Temporal ${field} must be a JSON object after template resolution (got: ${resolved.slice(0, 80)}).`);
260
+ }
261
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
262
+ throw new TemporalConfigError(`Temporal ${field} must be a JSON object.`);
263
+ }
264
+ return parsed;
265
+ };
266
+ const positiveInt = (value) => typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.round(value) : undefined;
267
+ const createGeneratedWorkflowId = (label) => {
268
+ const slug = label
269
+ .trim()
270
+ .toLowerCase()
271
+ .replace(/[^a-z0-9]+/g, "-")
272
+ .replace(/^-+|-+$/g, "")
273
+ .slice(0, 40);
274
+ const random = globalThis.crypto?.randomUUID?.() ??
275
+ `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
276
+ return `callman-${slug || "workflow"}-${random}`;
277
+ };
278
+ /**
279
+ * Resolve every template in the config and parse the JSON fields. Throws
280
+ * TemporalConfigError when a required field is empty or JSON is invalid —
281
+ * the executor turns that into a fail-fast node failure (no gRPC call).
282
+ */
283
+ const resolveTemporalOperation = (config, resolve, resolveJson, options = {}) => {
284
+ if (!(0, exports.isTemporalOperation)(config.operation)) {
285
+ throw new TemporalConfigError(`Temporal node has no operation. Choose one of: ${exports.TEMPORAL_OPERATIONS.join(", ")}.`);
286
+ }
287
+ const spec = exports.TEMPORAL_OPERATION_SPECS[config.operation];
288
+ const text = (value) => {
289
+ const resolved = resolve((value ?? "").trim()).trim();
290
+ return resolved ? resolved : null;
291
+ };
292
+ for (const field of spec.required) {
293
+ const value = config[field];
294
+ const resolved = typeof value === "string" ? text(value) : value;
295
+ if (isBlank(resolved)) {
296
+ throw new TemporalConfigError(`Temporal ${spec.label.toLowerCase()} needs a ${describeField(field)}.`);
297
+ }
298
+ }
299
+ let workflowId = text(config.workflowId);
300
+ if (!workflowId && config.operation === "startWorkflow") {
301
+ workflowId = createGeneratedWorkflowId(options.nodeLabel ?? "workflow");
302
+ }
303
+ const historyLimit = positiveInt(config.historyLimit);
304
+ const pageSize = positiveInt(config.pageSize);
305
+ return {
306
+ operation: config.operation,
307
+ namespace: text(config.namespace),
308
+ workflowId,
309
+ runId: text(config.runId),
310
+ workflowType: text(config.workflowType),
311
+ taskQueue: text(config.taskQueue),
312
+ args: parseJsonArray(config.args, "args", resolveJson),
313
+ signalName: text(config.signalName),
314
+ signalArgs: parseJsonArray(config.signalArgs, "signalArgs", resolveJson),
315
+ queryName: text(config.queryName),
316
+ updateName: text(config.updateName),
317
+ waitForStage: config.waitForStage === "ACCEPTED" ? "ACCEPTED" : "COMPLETED",
318
+ waitForResult: config.waitForResult === true,
319
+ followRuns: config.followRuns !== false,
320
+ reason: text(config.reason),
321
+ query: text(config.query),
322
+ pageSize: pageSize ?? null,
323
+ eventTypes: Array.isArray(config.eventTypes)
324
+ ? config.eventTypes
325
+ .map((entry) => (typeof entry === "string" ? entry.trim() : ""))
326
+ .filter((entry) => entry.length > 0)
327
+ : [],
328
+ historyLimit: historyLimit ?? null,
329
+ taskQueueType: config.taskQueueType === "activity" ? "activity" : "workflow",
330
+ startOptions: {
331
+ ...(config.idReusePolicy &&
332
+ exports.TEMPORAL_WORKFLOW_ID_REUSE_POLICIES.includes(config.idReusePolicy)
333
+ ? { idReusePolicy: config.idReusePolicy }
334
+ : {}),
335
+ ...(config.idConflictPolicy &&
336
+ exports.TEMPORAL_WORKFLOW_ID_CONFLICT_POLICIES.includes(config.idConflictPolicy)
337
+ ? { idConflictPolicy: config.idConflictPolicy }
338
+ : {}),
339
+ ...(parseJsonObject(config.memo, "memo", resolveJson)
340
+ ? { memo: parseJsonObject(config.memo, "memo", resolveJson) }
341
+ : {}),
342
+ ...(parseJsonObject(config.searchAttributes, "searchAttributes", resolveJson)
343
+ ? {
344
+ searchAttributes: parseJsonObject(config.searchAttributes, "searchAttributes", resolveJson),
345
+ }
346
+ : {}),
347
+ ...(positiveInt(config.workflowExecutionTimeoutMs)
348
+ ? { workflowExecutionTimeoutMs: positiveInt(config.workflowExecutionTimeoutMs) }
349
+ : {}),
350
+ ...(positiveInt(config.workflowRunTimeoutMs)
351
+ ? { workflowRunTimeoutMs: positiveInt(config.workflowRunTimeoutMs) }
352
+ : {}),
353
+ ...(positiveInt(config.workflowTaskTimeoutMs)
354
+ ? { workflowTaskTimeoutMs: positiveInt(config.workflowTaskTimeoutMs) }
355
+ : {}),
356
+ ...(positiveInt(config.startDelayMs) ? { startDelayMs: positiveInt(config.startDelayMs) } : {}),
357
+ ...(config.retryPolicy && typeof config.retryPolicy === "object"
358
+ ? { retryPolicy: normalizeRetryPolicy(config.retryPolicy) }
359
+ : {}),
360
+ },
361
+ };
362
+ };
363
+ exports.resolveTemporalOperation = resolveTemporalOperation;
364
+ const normalizeRetryPolicy = (value) => ({
365
+ ...(positiveInt(value.maximumAttempts) ? { maximumAttempts: positiveInt(value.maximumAttempts) } : {}),
366
+ ...(positiveInt(value.initialIntervalMs)
367
+ ? { initialIntervalMs: positiveInt(value.initialIntervalMs) }
368
+ : {}),
369
+ ...(typeof value.backoffCoefficient === "number" && value.backoffCoefficient >= 1
370
+ ? { backoffCoefficient: value.backoffCoefficient }
371
+ : {}),
372
+ ...(positiveInt(value.maximumIntervalMs)
373
+ ? { maximumIntervalMs: positiveInt(value.maximumIntervalMs) }
374
+ : {}),
375
+ });
376
+ /** Deep link into the Temporal Web UI, when the connection names one. */
377
+ const buildTemporalUiUrl = (uiBaseUrl, namespace, workflowId, runId) => {
378
+ const base = (uiBaseUrl ?? "").trim().replace(/\/+$/, "");
379
+ if (!base || !workflowId) {
380
+ return null;
381
+ }
382
+ const path = `${base}/namespaces/${encodeURIComponent(namespace)}/workflows/${encodeURIComponent(workflowId)}`;
383
+ return runId ? `${path}/${encodeURIComponent(runId)}` : path;
384
+ };
385
+ exports.buildTemporalUiUrl = buildTemporalUiUrl;
386
+ //# sourceMappingURL=temporal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal.js","sourceRoot":"","sources":["../../src/scenario-runner/temporal.ts"],"names":[],"mappings":";AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,4EAA4E;;;AAW/D,QAAA,mBAAmB,GAAiC;IAC/D,eAAe;IACf,QAAQ;IACR,iBAAiB;IACjB,OAAO;IACP,QAAQ;IACR,aAAa;IACb,UAAU;IACV,SAAS;IACT,QAAQ;IACR,WAAW;IACX,MAAM;IACN,OAAO;IACP,mBAAmB;CACpB,CAAC;AAEK,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAA8B,EAAE,CAChF,OAAO,KAAK,KAAK,QAAQ,IAAK,2BAAyC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAD7E,QAAA,mBAAmB,uBAC0D;AAc1F,MAAM,aAAa,GAAG;IACpB,eAAe;IACf,kBAAkB;IAClB,MAAM;IACN,kBAAkB;IAClB,4BAA4B;IAC5B,sBAAsB;IACtB,uBAAuB;IACvB,cAAc;IACd,aAAa;CACL,CAAC;AAEE,QAAA,wBAAwB,GAAqD;IACxF,aAAa,EAAE;QACb,SAAS,EAAE,eAAe;QAC1B,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,6DAA6D;QACtE,QAAQ,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC;QACvC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC;QAC9F,KAAK,EAAE,IAAI;KACZ;IACD,MAAM,EAAE;QACN,SAAS,EAAE,QAAQ;QACnB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,sCAAsC;QAC/C,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;QACtC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;QAC3B,KAAK,EAAE,KAAK;KACb;IACD,eAAe,EAAE;QACf,SAAS,EAAE,iBAAiB;QAC5B,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,gEAAgE;QACzE,QAAQ,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,CAAC;QACnE,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC;QAClD,KAAK,EAAE,KAAK;KACb;IACD,KAAK,EAAE;QACL,SAAS,EAAE,OAAO;QAClB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,8EAA8E;QACvF,QAAQ,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC;QACrC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;QAC3B,KAAK,EAAE,KAAK;KACb;IACD,MAAM,EAAE;QACN,SAAS,EAAE,QAAQ;QACnB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,mDAAmD;QAC5D,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;QACtC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC;QAC3C,KAAK,EAAE,IAAI;KACZ;IACD,WAAW,EAAE;QACX,SAAS,EAAE,aAAa;QACxB,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE,kEAAkE;QAC3E,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC;QAC9C,KAAK,EAAE,IAAI;KACZ;IACD,QAAQ,EAAE;QACR,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,oFAAoF;QAC7F,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,QAAQ,EAAE,CAAC,OAAO,CAAC;QACnB,KAAK,EAAE,KAAK;KACb;IACD,OAAO,EAAE;QACP,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,gGAAgG;QACzG,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,cAAc,CAAC;QACjD,KAAK,EAAE,KAAK;KACb;IACD,MAAM,EAAE;QACN,SAAS,EAAE,QAAQ;QACnB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,uDAAuD;QAChE,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC7B,KAAK,EAAE,KAAK;KACb;IACD,SAAS,EAAE;QACT,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,kDAAkD;QAC3D,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC7B,KAAK,EAAE,KAAK;KACb;IACD,IAAI,EAAE;QACJ,SAAS,EAAE,MAAM;QACjB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,wDAAwD;QACjE,QAAQ,EAAE,CAAC,OAAO,CAAC;QACnB,QAAQ,EAAE,CAAC,UAAU,CAAC;QACtB,KAAK,EAAE,KAAK;KACb;IACD,KAAK,EAAE;QACL,SAAS,EAAE,OAAO;QAClB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,8EAA8E;QACvF,QAAQ,EAAE,CAAC,OAAO,CAAC;QACnB,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,KAAK;KACb;IACD,iBAAiB,EAAE;QACjB,SAAS,EAAE,mBAAmB;QAC9B,KAAK,EAAE,qBAAqB;QAC5B,OAAO,EAAE,4DAA4D;QACrE,QAAQ,EAAE,CAAC,WAAW,CAAC;QACvB,QAAQ,EAAE,CAAC,eAAe,CAAC;QAC3B,KAAK,EAAE,KAAK;KACb;CACF,CAAC;AAEW,QAAA,mCAAmC,GAA6C;IAC3F,iBAAiB;IACjB,6BAA6B;IAC7B,kBAAkB;IAClB,sBAAsB;CACvB,CAAC;AAEW,QAAA,sCAAsC,GAAgD;IACjG,MAAM;IACN,cAAc;IACd,oBAAoB;CACrB,CAAC;AAEF,4EAA4E;AACrE,MAAM,yBAAyB,GAAG,CACvC,SAA4B,EAC5B,SAAiB,EACO,EAAE,CAAC,CAAC;IAC5B,SAAS;IACT,SAAS;IACT,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,aAAa,EAAE,IAAI;IACnB,IAAI,EAAE,IAAI;IACV,gBAAgB,EAAE,IAAI;IACtB,UAAU,EAAE,EAAE;IACd,eAAe,EAAE,EAAE;IACnB,MAAM,EAAE,EAAE;IACV,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,EAAE;IACX,MAAM,EAAE,EAAE;IACV,gBAAgB,EAAE,KAAK;IACvB,UAAU,EAAE,EAAE;IACd,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,KAAK;IACf,UAAU,EAAE,CAAC;CACd,CAAC,CAAC;AAlCU,QAAA,yBAAyB,6BAkCnC;AAyCH,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC;AAED,MAAM,YAAY,GAA8D;IAC9E,UAAU,EAAE,aAAa;IACzB,YAAY,EAAE,eAAe;IAC7B,SAAS,EAAE,YAAY;IACvB,UAAU,EAAE,aAAa;IACzB,SAAS,EAAE,YAAY;IACvB,UAAU,EAAE,aAAa;IACzB,KAAK,EAAE,aAAa;CACrB,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAuC,EAAU,EAAE,CACxE,YAAY,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AAEvC,MAAM,OAAO,GAAG,CAAC,KAAc,EAAW,EAAE,CAC1C,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAE9F;;;GAGG;AACI,MAAM,4BAA4B,GAAG,CAC1C,MAA8D,EACpD,EAAE;IACZ,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,CAAC;IACpC,IAAI,CAAC,IAAA,2BAAmB,EAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,gCAAwB,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAjBW,QAAA,4BAA4B,gCAiBvC;AAEF,MAAM,cAAc,GAAG,CACrB,GAAuB,EACvB,KAAa,EACb,OAAqC,EAC1B,EAAE;IACb,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,mBAAmB,CAC3B,YAAY,KAAK,yDAAyD,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CACpG,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACtB,GAAuB,EACvB,KAAa,EACb,OAAqC,EACA,EAAE;IACvC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,mBAAmB,CAC3B,YAAY,KAAK,0DAA0D,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CACrG,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,mBAAmB,CAAC,YAAY,KAAK,yBAAyB,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,MAAiC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAc,EAAsB,EAAE,CACzD,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAEnG,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAAU,EAAE;IAC1D,MAAM,IAAI,GAAG,KAAK;SACf,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,MAAM,MAAM,GACV,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;QACjC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC1E,OAAO,WAAW,IAAI,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;AACnD,CAAC,CAAC;AAEF;;;;GAIG;AACI,MAAM,wBAAwB,GAAG,CACtC,MAAkC,EAClC,OAAqC,EACrC,WAAyC,EACzC,UAAkC,EAAE,EACT,EAAE;IAC7B,IAAI,CAAC,IAAA,2BAAmB,EAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,mBAAmB,CAC3B,kDAAkD,2BAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACpF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,gCAAwB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,CAAC,KAAyB,EAAiB,EAAE;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,mBAAmB,CAC3B,YAAY,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,aAAa,CAAC,KAAK,CAAC,GAAG,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,SAAS,KAAK,eAAe,EAAE,CAAC;QACxD,UAAU,GAAG,yBAAyB,CAAC,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE9C,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACjC,UAAU;QACV,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QACzB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QACvC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACjC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC;QACtD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QACnC,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC;QACxE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACjC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QACnC,YAAY,EAAE,MAAM,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;QAC3E,aAAa,EAAE,MAAM,CAAC,aAAa,KAAK,IAAI;QAC5C,UAAU,EAAE,MAAM,CAAC,UAAU,KAAK,KAAK;QACvC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QACzB,QAAQ,EAAE,QAAQ,IAAI,IAAI;QAC1B,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;YAC1C,CAAC,CAAC,MAAM,CAAC,UAAU;iBACd,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;iBAC/D,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACxC,CAAC,CAAC,EAAE;QACN,YAAY,EAAE,YAAY,IAAI,IAAI;QAClC,aAAa,EAAE,MAAM,CAAC,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;QAC5E,YAAY,EAAE;YACZ,GAAG,CAAC,MAAM,CAAC,aAAa;gBACxB,2CAAmC,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC;gBAChE,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE;gBACzC,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,gBAAgB;gBAC3B,8CAAsC,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBACtE,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE;gBAC/C,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC;gBACnD,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE;gBAC7D,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,CAAC;gBAC3E,CAAC,CAAC;oBACE,gBAAgB,EAAE,eAAe,CAC/B,MAAM,CAAC,gBAAgB,EACvB,kBAAkB,EAClB,WAAW,CACZ;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,0BAA0B,CAAC;gBAChD,CAAC,CAAC,EAAE,0BAA0B,EAAE,WAAW,CAAC,MAAM,CAAC,0BAA0B,CAAC,EAAE;gBAChF,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,oBAAoB,CAAC;gBAC1C,CAAC,CAAC,EAAE,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE;gBACpE,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,qBAAqB,CAAC;gBAC3C,CAAC,CAAC,EAAE,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE;gBACtE,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/F,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;gBAC9D,CAAC,CAAC,EAAE,WAAW,EAAE,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;gBAC3D,CAAC,CAAC,EAAE,CAAC;SACR;KACF,CAAC;AACJ,CAAC,CAAC;AAhGW,QAAA,wBAAwB,4BAgGnC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAgC,EAA6B,EAAE,CAAC,CAAC;IAC7F,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtG,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACtC,CAAC,CAAC,EAAE,iBAAiB,EAAE,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE;QAC7D,CAAC,CAAC,EAAE,CAAC;IACP,GAAG,CAAC,OAAO,KAAK,CAAC,kBAAkB,KAAK,QAAQ,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC;QAC/E,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,EAAE;QAClD,CAAC,CAAC,EAAE,CAAC;IACP,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACtC,CAAC,CAAC,EAAE,iBAAiB,EAAE,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE;QAC7D,CAAC,CAAC,EAAE,CAAC;CACR,CAAC,CAAC;AAEH,yEAAyE;AAClE,MAAM,kBAAkB,GAAG,CAChC,SAAoC,EACpC,SAAiB,EACjB,UAAyB,EACzB,KAAoB,EACL,EAAE;IACjB,MAAM,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,IAAI,eAAe,kBAAkB,CAAC,SAAS,CAAC,cAAc,kBAAkB,CAC9F,UAAU,CACX,EAAE,CAAC;IACJ,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC,CAAC;AAdW,QAAA,kBAAkB,sBAc7B"}
@@ -329,6 +329,77 @@ exports.UI_TEST_COMMANDS = [
329
329
  { name: "expect", type: "map", description: "Expected values." },
330
330
  ],
331
331
  example: '- redisCheck:\n connection: "redis-dev"\n key: "otp:{{phone}}"\n extract:\n otp: "value"' }),
332
+ cmd({ key: "temporalStart", category: "Data / Hybrid", platforms: ALL, hybrid: true,
333
+ summary: "Start a Temporal workflow through a workspace connection; extract its ids (or result when waiting).",
334
+ args: [
335
+ { name: "connection", type: "string", required: true, description: "Temporal connection name or id." },
336
+ { name: "workflowType", type: "string", required: true, description: "Workflow type name." },
337
+ { name: "taskQueue", type: "string", required: true, description: "Task queue." },
338
+ { name: "workflowId", type: "string", description: "Workflow id; empty = generated. {{vars}} allowed." },
339
+ { name: "args", type: "list", description: "Workflow arguments (list; mappings sent as JSON)." },
340
+ { name: "waitForResult", type: "boolean", description: "Block until the workflow closes and expose result/status." },
341
+ { name: "extract", type: "map", description: "{ var: \"workflowId\" | \"runId\" | \"result.path\" }." },
342
+ { name: "expect", type: "map|list", description: "Map {path: value} or list [{field, op, value}] over the output (status, result.*)." },
343
+ TIMEOUT,
344
+ ],
345
+ example: '- temporalStart:\n connection: "temporal-dev"\n workflowType: "OrderWorkflow"\n taskQueue: "orders"\n workflowId: "order-{{orderNo}}"\n args:\n - { orderId: "{{orderNo}}" }\n extract:\n runId: "runId"' }),
346
+ cmd({ key: "temporalSignal", category: "Data / Hybrid", platforms: ALL, hybrid: true,
347
+ summary: "Send a signal to a running Temporal workflow.",
348
+ args: [
349
+ { name: "connection", type: "string", required: true, description: "Temporal connection name or id." },
350
+ { name: "workflowId", type: "string", required: true, description: "Workflow id. {{vars}} allowed." },
351
+ { name: "signalName", type: "string", required: true, description: "Signal name." },
352
+ { name: "args", type: "list", description: "Signal arguments." },
353
+ { name: "runId", type: "string", description: "Run id (default: latest run)." },
354
+ TIMEOUT,
355
+ ],
356
+ example: '- temporalSignal:\n connection: "temporal-dev"\n workflowId: "order-{{orderNo}}"\n signalName: "paymentReceived"\n args:\n - { amount: 100 }' }),
357
+ cmd({ key: "temporalQuery", category: "Data / Hybrid", platforms: ALL, hybrid: true,
358
+ summary: "Query a Temporal workflow's state; extract and assert on the reply.",
359
+ args: [
360
+ { name: "connection", type: "string", required: true, description: "Temporal connection name or id." },
361
+ { name: "workflowId", type: "string", required: true, description: "Workflow id. {{vars}} allowed." },
362
+ { name: "queryName", type: "string", required: true, description: "Query handler name." },
363
+ { name: "args", type: "list", description: "Query arguments." },
364
+ { name: "runId", type: "string", description: "Run id (default: latest run)." },
365
+ { name: "extract", type: "map", description: "{ var: \"result.path\" }." },
366
+ { name: "expect", type: "map|list", description: "Map {path: value} or list [{field, op, value}] over the output (result.*)." },
367
+ TIMEOUT,
368
+ ],
369
+ example: '- temporalQuery:\n connection: "temporal-dev"\n workflowId: "order-{{orderNo}}"\n queryName: "getStatus"\n expect:\n - field: "result.step"\n op: equals\n value: "SHIPPED"' }),
370
+ cmd({ key: "temporalAwait", category: "Data / Hybrid", platforms: ALL, hybrid: true,
371
+ summary: "Wait for a Temporal workflow to close; assert on its status / result.",
372
+ args: [
373
+ { name: "connection", type: "string", required: true, description: "Temporal connection name or id." },
374
+ { name: "workflowId", type: "string", required: true, description: "Workflow id. {{vars}} allowed." },
375
+ { name: "runId", type: "string", description: "Run id (default: latest run, following continue-as-new)." },
376
+ { name: "extract", type: "map", description: "{ var: \"result.path\" | \"status\" }." },
377
+ { name: "expect", type: "map|list", description: "Map {path: value} or list [{field, op, value}] over the output (status, result.*, failure.message)." },
378
+ TIMEOUT,
379
+ ],
380
+ example: '- temporalAwait:\n connection: "temporal-dev"\n workflowId: "order-{{orderNo}}"\n timeout: 60000\n expect:\n status: "COMPLETED"' }),
381
+ cmd({ key: "temporalDescribe", category: "Data / Hybrid", platforms: ALL, hybrid: true,
382
+ summary: "Describe a Temporal workflow (status, type, task queue, pending activities); extract and assert.",
383
+ args: [
384
+ { name: "connection", type: "string", required: true, description: "Temporal connection name or id." },
385
+ { name: "workflowId", type: "string", required: true, description: "Workflow id. {{vars}} allowed." },
386
+ { name: "runId", type: "string", description: "Run id (default: latest run)." },
387
+ { name: "extract", type: "map", description: "{ var: \"status\" | \"runId\" | \"workflowType\" }." },
388
+ { name: "expect", type: "map|list", description: "Map {path: value} or list [{field, op, value}] over the output." },
389
+ TIMEOUT,
390
+ ],
391
+ example: '- temporalDescribe:\n connection: "temporal-dev"\n workflowId: "order-{{orderNo}}"\n expect:\n status: "RUNNING"' }),
392
+ cmd({ key: "temporalCancel", category: "Data / Hybrid", platforms: ALL, hybrid: true,
393
+ summary: "Request cancellation of a Temporal workflow (or terminate it).",
394
+ args: [
395
+ { name: "connection", type: "string", required: true, description: "Temporal connection name or id." },
396
+ { name: "workflowId", type: "string", required: true, description: "Workflow id. {{vars}} allowed." },
397
+ { name: "runId", type: "string", description: "Run id (default: latest run)." },
398
+ { name: "terminate", type: "boolean", description: "Terminate immediately instead of a cooperative cancel." },
399
+ { name: "reason", type: "string", description: "Reason recorded in the history." },
400
+ TIMEOUT,
401
+ ],
402
+ example: '- temporalCancel:\n connection: "temporal-dev"\n workflowId: "order-{{orderNo}}"\n reason: "test cleanup"' }),
332
403
  cmd({ key: "runScript", category: "Data / Hybrid", platforms: MOBILE, forms: ["scalar"], scalarArg: "path",
333
404
  summary: "Run a JS file with the mobile engine.", args: [{ name: "path", type: "string", required: true, description: "Script file." }], example: '- runScript: "setup.js"' }),
334
405
  // ── Media ─────────────────────────────────────────────────────────────────