callman-core 1.31.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 (126) hide show
  1. package/ai-packs/db-queries.md +1 -1
  2. package/ai-packs/scenario-nodes.md +89 -15
  3. package/dist/ai/prompts/scenario.d.ts +1 -1
  4. package/dist/ai/prompts/scenario.d.ts.map +1 -1
  5. package/dist/ai/prompts/scenario.js +6 -3
  6. package/dist/ai/prompts/scenario.js.map +1 -1
  7. package/dist/ai/prompts/scenarioNodeDefaults.d.ts.map +1 -1
  8. package/dist/ai/prompts/scenarioNodeDefaults.js +9 -0
  9. package/dist/ai/prompts/scenarioNodeDefaults.js.map +1 -1
  10. package/dist/ai/prompts/scenarioNodeReference.d.ts.map +1 -1
  11. package/dist/ai/prompts/scenarioNodeReference.js +136 -17
  12. package/dist/ai/prompts/scenarioNodeReference.js.map +1 -1
  13. package/dist/host/db/db-query-reference.js +1 -1
  14. package/dist/host/db/db-query-reference.js.map +1 -1
  15. package/dist/host/db/mongoAdapter.d.ts +1 -0
  16. package/dist/host/db/mongoAdapter.d.ts.map +1 -1
  17. package/dist/host/db/mongoAdapter.js +21 -0
  18. package/dist/host/db/mongoAdapter.js.map +1 -1
  19. package/dist/host/db/queryExecutor.js +2 -2
  20. package/dist/host/db/queryExecutor.js.map +1 -1
  21. package/dist/host/index.d.ts +3 -1
  22. package/dist/host/index.d.ts.map +1 -1
  23. package/dist/host/index.js +4 -1
  24. package/dist/host/index.js.map +1 -1
  25. package/dist/host/temporal/temporalService.d.ts +67 -0
  26. package/dist/host/temporal/temporalService.d.ts.map +1 -0
  27. package/dist/host/temporal/temporalService.js +1182 -0
  28. package/dist/host/temporal/temporalService.js.map +1 -0
  29. package/dist/host/temporal/types.d.ts +13 -0
  30. package/dist/host/temporal/types.d.ts.map +1 -0
  31. package/dist/host/temporal/types.js +5 -0
  32. package/dist/host/temporal/types.js.map +1 -0
  33. package/dist/scenario-runner/adapters/connection-config.d.ts +17 -1
  34. package/dist/scenario-runner/adapters/connection-config.d.ts.map +1 -1
  35. package/dist/scenario-runner/adapters/index.d.ts +4 -2
  36. package/dist/scenario-runner/adapters/index.d.ts.map +1 -1
  37. package/dist/scenario-runner/adapters/index.js +8 -0
  38. package/dist/scenario-runner/adapters/index.js.map +1 -1
  39. package/dist/scenario-runner/adapters/kafka-executor.d.ts +5 -0
  40. package/dist/scenario-runner/adapters/kafka-executor.d.ts.map +1 -1
  41. package/dist/scenario-runner/adapters/kafka-executor.js +12 -3
  42. package/dist/scenario-runner/adapters/kafka-executor.js.map +1 -1
  43. package/dist/scenario-runner/adapters/temporal-executor.d.ts +10 -0
  44. package/dist/scenario-runner/adapters/temporal-executor.d.ts.map +1 -0
  45. package/dist/scenario-runner/adapters/temporal-executor.js +186 -0
  46. package/dist/scenario-runner/adapters/temporal-executor.js.map +1 -0
  47. package/dist/scenario-runner/adapters/types.d.ts +17 -5
  48. package/dist/scenario-runner/adapters/types.d.ts.map +1 -1
  49. package/dist/scenario-runner/condition.d.ts.map +1 -1
  50. package/dist/scenario-runner/condition.js +73 -0
  51. package/dist/scenario-runner/condition.js.map +1 -1
  52. package/dist/scenario-runner/graphTraversal.d.ts +6 -0
  53. package/dist/scenario-runner/graphTraversal.d.ts.map +1 -1
  54. package/dist/scenario-runner/graphTraversal.js +9 -0
  55. package/dist/scenario-runner/graphTraversal.js.map +1 -1
  56. package/dist/scenario-runner/index.d.ts +4 -0
  57. package/dist/scenario-runner/index.d.ts.map +1 -1
  58. package/dist/scenario-runner/index.js +8 -0
  59. package/dist/scenario-runner/index.js.map +1 -1
  60. package/dist/scenario-runner/kafkaEvent.d.ts +3 -0
  61. package/dist/scenario-runner/kafkaEvent.d.ts.map +1 -0
  62. package/dist/scenario-runner/kafkaEvent.js +18 -0
  63. package/dist/scenario-runner/kafkaEvent.js.map +1 -0
  64. package/dist/scenario-runner/nodePolicy.d.ts +9 -2
  65. package/dist/scenario-runner/nodePolicy.d.ts.map +1 -1
  66. package/dist/scenario-runner/nodePolicy.js +53 -0
  67. package/dist/scenario-runner/nodePolicy.js.map +1 -1
  68. package/dist/scenario-runner/runScenario.d.ts.map +1 -1
  69. package/dist/scenario-runner/runScenario.js +115 -22
  70. package/dist/scenario-runner/runScenario.js.map +1 -1
  71. package/dist/scenario-runner/scenarioReference.d.ts +45 -0
  72. package/dist/scenario-runner/scenarioReference.d.ts.map +1 -0
  73. package/dist/scenario-runner/scenarioReference.js +151 -0
  74. package/dist/scenario-runner/scenarioReference.js.map +1 -0
  75. package/dist/scenario-runner/temporal.d.ts +73 -0
  76. package/dist/scenario-runner/temporal.d.ts.map +1 -0
  77. package/dist/scenario-runner/temporal.js +377 -0
  78. package/dist/scenario-runner/temporal.js.map +1 -0
  79. package/dist/scenario-runner/types.d.ts +211 -4
  80. package/dist/scenario-runner/types.d.ts.map +1 -1
  81. package/dist/ui-test/commands.d.ts.map +1 -1
  82. package/dist/ui-test/commands.js +71 -0
  83. package/dist/ui-test/commands.js.map +1 -1
  84. package/dist-cjs/ai/prompts/scenario.js +6 -3
  85. package/dist-cjs/ai/prompts/scenario.js.map +1 -1
  86. package/dist-cjs/ai/prompts/scenarioNodeDefaults.js +9 -0
  87. package/dist-cjs/ai/prompts/scenarioNodeDefaults.js.map +1 -1
  88. package/dist-cjs/ai/prompts/scenarioNodeReference.js +135 -16
  89. package/dist-cjs/ai/prompts/scenarioNodeReference.js.map +1 -1
  90. package/dist-cjs/host/db/db-query-reference.js +1 -1
  91. package/dist-cjs/host/db/db-query-reference.js.map +1 -1
  92. package/dist-cjs/host/db/mongoAdapter.js +23 -1
  93. package/dist-cjs/host/db/mongoAdapter.js.map +1 -1
  94. package/dist-cjs/host/db/queryExecutor.js +1 -1
  95. package/dist-cjs/host/db/queryExecutor.js.map +1 -1
  96. package/dist-cjs/host/index.js +21 -2
  97. package/dist-cjs/host/index.js.map +1 -1
  98. package/dist-cjs/host/temporal/temporalService.js +1200 -0
  99. package/dist-cjs/host/temporal/temporalService.js.map +1 -0
  100. package/dist-cjs/host/temporal/types.js +6 -0
  101. package/dist-cjs/host/temporal/types.js.map +1 -0
  102. package/dist-cjs/scenario-runner/adapters/index.js +17 -3
  103. package/dist-cjs/scenario-runner/adapters/index.js.map +1 -1
  104. package/dist-cjs/scenario-runner/adapters/kafka-executor.js +15 -4
  105. package/dist-cjs/scenario-runner/adapters/kafka-executor.js.map +1 -1
  106. package/dist-cjs/scenario-runner/adapters/temporal-executor.js +190 -0
  107. package/dist-cjs/scenario-runner/adapters/temporal-executor.js.map +1 -0
  108. package/dist-cjs/scenario-runner/condition.js +73 -0
  109. package/dist-cjs/scenario-runner/condition.js.map +1 -1
  110. package/dist-cjs/scenario-runner/graphTraversal.js +10 -1
  111. package/dist-cjs/scenario-runner/graphTraversal.js.map +1 -1
  112. package/dist-cjs/scenario-runner/index.js +24 -1
  113. package/dist-cjs/scenario-runner/index.js.map +1 -1
  114. package/dist-cjs/scenario-runner/kafkaEvent.js +22 -0
  115. package/dist-cjs/scenario-runner/kafkaEvent.js.map +1 -0
  116. package/dist-cjs/scenario-runner/nodePolicy.js +56 -1
  117. package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -1
  118. package/dist-cjs/scenario-runner/runScenario.js +114 -21
  119. package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
  120. package/dist-cjs/scenario-runner/scenarioReference.js +159 -0
  121. package/dist-cjs/scenario-runner/scenarioReference.js.map +1 -0
  122. package/dist-cjs/scenario-runner/temporal.js +386 -0
  123. package/dist-cjs/scenario-runner/temporal.js.map +1 -0
  124. package/dist-cjs/ui-test/commands.js +71 -0
  125. package/dist-cjs/ui-test/commands.js.map +1 -1
  126. package/package.json +2 -1
@@ -0,0 +1,151 @@
1
+ // A scenario-ref node embeds a COPY of another scenario's graph (the run
2
+ // engine executes the snapshot, never the live scenario). Building that copy
3
+ // needs fresh node and edge ids — the same scenario can be linked twice, and
4
+ // ids must stay unique across the host scenario including nested bodies — and
5
+ // every id reference inside the copy has to follow (edges, an end node's loop
6
+ // target, a group's ungroup snapshot).
7
+ //
8
+ // Hosts that link a scenario without the desktop (the server, for API and MCP
9
+ // clients) use this so the snapshot is exactly what the desktop would build.
10
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
11
+ const CONTAINER_TYPES = new Set(["subscenario", "scenario-ref", "foreach"]);
12
+ const randomSuffix = () => {
13
+ const uuid = globalThis.crypto?.randomUUID?.();
14
+ return uuid ? uuid.replace(/-/g, "").slice(0, 12) : Math.random().toString(36).slice(2, 14);
15
+ };
16
+ export const createScenarioSnapshotId = (prefix) => `${prefix}-${randomSuffix()}`;
17
+ const childGraph = (node) => {
18
+ const config = isRecord(node.data) && isRecord(node.data.config) ? node.data.config : {};
19
+ return {
20
+ nodes: Array.isArray(config.nodes) ? config.nodes.filter(isRecord) : [],
21
+ edges: Array.isArray(config.edges) ? config.edges.filter(isRecord) : [],
22
+ };
23
+ };
24
+ const collectIds = (nodes, idMap, createId) => {
25
+ for (const node of nodes) {
26
+ if (typeof node.id === "string") {
27
+ idMap.set(node.id, createId(`scenario-${String(node.type ?? "node")}`));
28
+ }
29
+ if (CONTAINER_TYPES.has(String(node.type))) {
30
+ collectIds(childGraph(node).nodes, idMap, createId);
31
+ }
32
+ }
33
+ };
34
+ const cloneEdge = (edge, idMap, createId) => ({
35
+ ...structuredClone(edge),
36
+ id: createId("scenario-edge"),
37
+ source: idMap.get(String(edge.source)) ?? edge.source,
38
+ target: idMap.get(String(edge.target)) ?? edge.target,
39
+ });
40
+ const remapUngroupSnapshot = (snapshot, idMap, createId) => {
41
+ if (!isRecord(snapshot))
42
+ return snapshot;
43
+ const remap = (entries, keys) => (Array.isArray(entries) ? entries.filter(isRecord) : []).flatMap((entry) => {
44
+ const first = idMap.get(String(entry[keys[0]]));
45
+ const second = idMap.get(String(entry[keys[1]]));
46
+ return first && second
47
+ ? [{ ...structuredClone(entry), edgeId: createId("scenario-edge"), [keys[0]]: first, [keys[1]]: second }]
48
+ : [];
49
+ });
50
+ return {
51
+ ...structuredClone(snapshot),
52
+ incoming: remap(snapshot.incoming, ["externalSourceId", "internalTargetId"]),
53
+ outgoing: remap(snapshot.outgoing, ["internalSourceId", "externalTargetId"]),
54
+ };
55
+ };
56
+ const cloneNode = (node, idMap, createId) => {
57
+ const clone = structuredClone(node);
58
+ clone.id = idMap.get(String(node.id)) ?? createId(`scenario-${String(node.type ?? "node")}`);
59
+ const data = isRecord(clone.data) ? clone.data : null;
60
+ const config = data && isRecord(data.config) ? data.config : null;
61
+ if (!config)
62
+ return clone;
63
+ if (clone.type === "end" && typeof config.loopTargetNodeId === "string") {
64
+ config.loopTargetNodeId = idMap.get(config.loopTargetNodeId) ?? config.loopTargetNodeId;
65
+ }
66
+ if (CONTAINER_TYPES.has(String(clone.type))) {
67
+ const inner = childGraph(node);
68
+ config.nodes = inner.nodes.map((child) => cloneNode(child, idMap, createId));
69
+ config.edges = inner.edges.map((edge) => cloneEdge(edge, idMap, createId));
70
+ }
71
+ if (clone.type === "subscenario" && "ungroupSnapshot" in config) {
72
+ config.ungroupSnapshot = remapUngroupSnapshot(config.ungroupSnapshot, idMap, createId);
73
+ }
74
+ return clone;
75
+ };
76
+ /** A deep copy of a scenario graph with every node and edge id replaced. */
77
+ export const cloneScenarioGraphWithFreshIds = (nodes, edges, createId = createScenarioSnapshotId) => {
78
+ const sourceNodes = nodes.filter(isRecord);
79
+ const idMap = new Map();
80
+ collectIds(sourceNodes, idMap, createId);
81
+ return {
82
+ nodes: sourceNodes.map((node) => cloneNode(node, idMap, createId)),
83
+ edges: edges.filter(isRecord).map((edge) => cloneEdge(edge, idMap, createId)),
84
+ };
85
+ };
86
+ /** The snapshot part of a scenario-ref node's config (no executionPolicy). */
87
+ export const buildScenarioReferenceConfig = (source, options = {}) => {
88
+ const graph = cloneScenarioGraphWithFreshIds(source.nodes, source.edges, options.createId);
89
+ return {
90
+ nodes: graph.nodes,
91
+ edges: graph.edges,
92
+ referencedScenarioId: source.id,
93
+ referencedScenarioVersion: typeof source.version === "number" ? source.version : null,
94
+ referencedScenarioName: (source.name ?? "").slice(0, 500),
95
+ lastSyncedAt: (options.now ?? new Date()).toISOString(),
96
+ };
97
+ };
98
+ /**
99
+ * Whether a graph (including nested bodies) links `scenarioId` — linking a
100
+ * scenario whose graph references the host would loop forever.
101
+ */
102
+ export const scenarioGraphReferencesScenario = (nodes, scenarioId) => nodes.filter(isRecord).some((node) => {
103
+ const config = isRecord(node.data) && isRecord(node.data.config) ? node.data.config : null;
104
+ if (node.type === "scenario-ref" && config?.referencedScenarioId === scenarioId) {
105
+ return true;
106
+ }
107
+ return CONTAINER_TYPES.has(String(node.type)) && scenarioGraphReferencesScenario(childGraph(node).nodes, scenarioId);
108
+ });
109
+ /**
110
+ * Linking a scenario also brings its environment variables: a source
111
+ * environment with no same-named (case-insensitive) environment is copied;
112
+ * a matching one only gains the keys it lacks — the host's own values win.
113
+ */
114
+ export const mergeLinkedScenarioEnvironments = (current, source, createId = createScenarioSnapshotId) => {
115
+ const next = current.map((env) => ({
116
+ ...env,
117
+ variables: env.variables.map((variable) => ({ ...variable })),
118
+ }));
119
+ let addedEnvCount = 0;
120
+ let addedVarCount = 0;
121
+ for (const sourceEnv of source) {
122
+ const name = (sourceEnv.name ?? "").trim();
123
+ const target = next.find((env) => (env.name ?? "").trim().toLowerCase() === name.toLowerCase());
124
+ if (!target) {
125
+ next.push({
126
+ id: createId("scenario-env"),
127
+ name: name || "Environment",
128
+ variables: sourceEnv.variables.map((variable) => ({
129
+ id: createId("env-var"),
130
+ key: variable.key,
131
+ value: variable.value,
132
+ enabled: variable.enabled,
133
+ })),
134
+ });
135
+ addedEnvCount += 1;
136
+ addedVarCount += sourceEnv.variables.length;
137
+ continue;
138
+ }
139
+ const keys = new Set(target.variables.map((variable) => variable.key.trim()).filter(Boolean));
140
+ for (const variable of sourceEnv.variables) {
141
+ const key = variable.key.trim();
142
+ if (!key || keys.has(key))
143
+ continue;
144
+ target.variables.push({ id: createId("env-var"), key: variable.key, value: variable.value, enabled: variable.enabled });
145
+ keys.add(key);
146
+ addedVarCount += 1;
147
+ }
148
+ }
149
+ return { environments: next, addedEnvCount, addedVarCount };
150
+ };
151
+ //# sourceMappingURL=scenarioReference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenarioReference.js","sourceRoot":"","sources":["../../src/scenario-runner/scenarioReference.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import type { ScenarioTemporalResult, TemporalOperation, TemporalRetryPolicyConfig, TemporalScenarioNodeConfig, TemporalWorkflowIdConflictPolicy, TemporalWorkflowIdReusePolicy } from "./types.js";
2
+ export declare const TEMPORAL_OPERATIONS: readonly TemporalOperation[];
3
+ export declare const isTemporalOperation: (value: unknown) => value is TemporalOperation;
4
+ export interface TemporalOperationSpec {
5
+ operation: TemporalOperation;
6
+ label: string;
7
+ summary: string;
8
+ /** Config fields that must be non-empty for the node to run. */
9
+ required: readonly (keyof TemporalScenarioNodeConfig)[];
10
+ /** Config fields the operation reads (besides the required ones). */
11
+ optional: readonly (keyof TemporalScenarioNodeConfig)[];
12
+ /** The operation may block for a long time (awaits the workflow). */
13
+ waits: boolean;
14
+ }
15
+ export declare const TEMPORAL_OPERATION_SPECS: Record<TemporalOperation, TemporalOperationSpec>;
16
+ export declare const TEMPORAL_WORKFLOW_ID_REUSE_POLICIES: readonly TemporalWorkflowIdReusePolicy[];
17
+ export declare const TEMPORAL_WORKFLOW_ID_CONFLICT_POLICIES: readonly TemporalWorkflowIdConflictPolicy[];
18
+ /** Every key of ScenarioTemporalResult, with its "not applicable" value. */
19
+ export declare const createEmptyTemporalResult: (operation: TemporalOperation, namespace: string) => ScenarioTemporalResult;
20
+ export interface TemporalResolvedStartOptions {
21
+ idReusePolicy?: TemporalWorkflowIdReusePolicy;
22
+ idConflictPolicy?: TemporalWorkflowIdConflictPolicy;
23
+ memo?: Record<string, unknown>;
24
+ searchAttributes?: Record<string, unknown>;
25
+ workflowExecutionTimeoutMs?: number;
26
+ workflowRunTimeoutMs?: number;
27
+ workflowTaskTimeoutMs?: number;
28
+ startDelayMs?: number;
29
+ retryPolicy?: TemporalRetryPolicyConfig;
30
+ }
31
+ export interface TemporalResolvedOperation {
32
+ operation: TemporalOperation;
33
+ /** Namespace override (empty = the connection's). */
34
+ namespace: string | null;
35
+ workflowId: string | null;
36
+ runId: string | null;
37
+ workflowType: string | null;
38
+ taskQueue: string | null;
39
+ args: unknown[];
40
+ signalName: string | null;
41
+ signalArgs: unknown[];
42
+ queryName: string | null;
43
+ updateName: string | null;
44
+ waitForStage: "ACCEPTED" | "COMPLETED";
45
+ waitForResult: boolean;
46
+ followRuns: boolean;
47
+ reason: string | null;
48
+ query: string | null;
49
+ pageSize: number | null;
50
+ eventTypes: string[];
51
+ historyLimit: number | null;
52
+ taskQueueType: "workflow" | "activity";
53
+ startOptions: TemporalResolvedStartOptions;
54
+ }
55
+ export declare class TemporalConfigError extends Error {
56
+ constructor(message: string);
57
+ }
58
+ /**
59
+ * Static validation (no templates resolved): which required fields are empty
60
+ * for the chosen operation. Hosts use it in the builder / on save.
61
+ */
62
+ export declare const getTemporalNodeMissingFields: (config: Partial<TemporalScenarioNodeConfig> | null | undefined) => string[];
63
+ /**
64
+ * Resolve every template in the config and parse the JSON fields. Throws
65
+ * TemporalConfigError when a required field is empty or JSON is invalid —
66
+ * the executor turns that into a fail-fast node failure (no gRPC call).
67
+ */
68
+ export declare const resolveTemporalOperation: (config: TemporalScenarioNodeConfig, resolve: (template: string) => string, resolveJson: (template: string) => string, options?: {
69
+ nodeLabel?: string;
70
+ }) => TemporalResolvedOperation;
71
+ /** Deep link into the Temporal Web UI, when the connection names one. */
72
+ export declare const buildTemporalUiUrl: (uiBaseUrl: string | null | undefined, namespace: string, workflowId: string | null, runId: string | null) => string | null;
73
+ //# sourceMappingURL=temporal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal.d.ts","sourceRoot":"","sources":["../../src/scenario-runner/temporal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,377 @@
1
+ // Temporal node helpers shared by the executor, the hosts and the authoring
2
+ // tools (desktop builder validation, backend zod schema, MCP required-field
3
+ // check all read TEMPORAL_OPERATION_SPECS instead of keeping their own list).
4
+ //
5
+ // `resolveTemporalOperation` turns a node config + the live template values
6
+ // into a fully resolved, typed operation (templates substituted, JSON args
7
+ // parsed) and is the ONE place that decides what is required per operation.
8
+ export const TEMPORAL_OPERATIONS = [
9
+ "startWorkflow",
10
+ "signal",
11
+ "signalWithStart",
12
+ "query",
13
+ "update",
14
+ "awaitResult",
15
+ "describe",
16
+ "history",
17
+ "cancel",
18
+ "terminate",
19
+ "list",
20
+ "count",
21
+ "describeTaskQueue",
22
+ ];
23
+ export const isTemporalOperation = (value) => typeof value === "string" && TEMPORAL_OPERATIONS.includes(value);
24
+ const START_OPTIONS = [
25
+ "idReusePolicy",
26
+ "idConflictPolicy",
27
+ "memo",
28
+ "searchAttributes",
29
+ "workflowExecutionTimeoutMs",
30
+ "workflowRunTimeoutMs",
31
+ "workflowTaskTimeoutMs",
32
+ "startDelayMs",
33
+ "retryPolicy",
34
+ ];
35
+ export const TEMPORAL_OPERATION_SPECS = {
36
+ startWorkflow: {
37
+ operation: "startWorkflow",
38
+ label: "Start workflow",
39
+ summary: "Start a workflow execution; optionally wait for its result.",
40
+ required: ["workflowType", "taskQueue"],
41
+ optional: ["workflowId", "args", "waitForResult", "followRuns", "onTimeout", ...START_OPTIONS],
42
+ waits: true,
43
+ },
44
+ signal: {
45
+ operation: "signal",
46
+ label: "Signal",
47
+ summary: "Send a signal to a running workflow.",
48
+ required: ["workflowId", "signalName"],
49
+ optional: ["runId", "args"],
50
+ waits: false,
51
+ },
52
+ signalWithStart: {
53
+ operation: "signalWithStart",
54
+ label: "Signal with start",
55
+ summary: "Signal the workflow, starting it first when it is not running.",
56
+ required: ["workflowId", "workflowType", "taskQueue", "signalName"],
57
+ optional: ["args", "signalArgs", ...START_OPTIONS],
58
+ waits: false,
59
+ },
60
+ query: {
61
+ operation: "query",
62
+ label: "Query",
63
+ summary: "Read workflow state through a query handler (works on closed workflows too).",
64
+ required: ["workflowId", "queryName"],
65
+ optional: ["runId", "args"],
66
+ waits: false,
67
+ },
68
+ update: {
69
+ operation: "update",
70
+ label: "Update",
71
+ summary: "Invoke an update handler and wait for its result.",
72
+ required: ["workflowId", "updateName"],
73
+ optional: ["runId", "args", "waitForStage"],
74
+ waits: true,
75
+ },
76
+ awaitResult: {
77
+ operation: "awaitResult",
78
+ label: "Await result",
79
+ summary: "Wait for the workflow to close and expose its result or failure.",
80
+ required: ["workflowId"],
81
+ optional: ["runId", "followRuns", "onTimeout"],
82
+ waits: true,
83
+ },
84
+ describe: {
85
+ operation: "describe",
86
+ label: "Describe",
87
+ summary: "Status, type, task queue, timings, memo, search attributes and pending activities.",
88
+ required: ["workflowId"],
89
+ optional: ["runId"],
90
+ waits: false,
91
+ },
92
+ history: {
93
+ operation: "history",
94
+ label: "History",
95
+ summary: "Fetch the event history and summarize it (event counts, activities, signals, timers, failure).",
96
+ required: ["workflowId"],
97
+ optional: ["runId", "eventTypes", "historyLimit"],
98
+ waits: false,
99
+ },
100
+ cancel: {
101
+ operation: "cancel",
102
+ label: "Cancel",
103
+ summary: "Request cancellation (the workflow runs its cleanup).",
104
+ required: ["workflowId"],
105
+ optional: ["runId", "reason"],
106
+ waits: false,
107
+ },
108
+ terminate: {
109
+ operation: "terminate",
110
+ label: "Terminate",
111
+ summary: "Terminate the workflow immediately (no cleanup).",
112
+ required: ["workflowId"],
113
+ optional: ["runId", "reason"],
114
+ waits: false,
115
+ },
116
+ list: {
117
+ operation: "list",
118
+ label: "List",
119
+ summary: "List workflow executions matching a visibility filter.",
120
+ required: ["query"],
121
+ optional: ["pageSize"],
122
+ waits: false,
123
+ },
124
+ count: {
125
+ operation: "count",
126
+ label: "Count",
127
+ summary: "Count workflow executions matching a visibility filter (GROUP BY supported).",
128
+ required: ["query"],
129
+ optional: [],
130
+ waits: false,
131
+ },
132
+ describeTaskQueue: {
133
+ operation: "describeTaskQueue",
134
+ label: "Describe task queue",
135
+ summary: "Which workers poll a task queue — a worker-is-alive check.",
136
+ required: ["taskQueue"],
137
+ optional: ["taskQueueType"],
138
+ waits: false,
139
+ },
140
+ };
141
+ export const TEMPORAL_WORKFLOW_ID_REUSE_POLICIES = [
142
+ "ALLOW_DUPLICATE",
143
+ "ALLOW_DUPLICATE_FAILED_ONLY",
144
+ "REJECT_DUPLICATE",
145
+ "TERMINATE_IF_RUNNING",
146
+ ];
147
+ export const TEMPORAL_WORKFLOW_ID_CONFLICT_POLICIES = [
148
+ "FAIL",
149
+ "USE_EXISTING",
150
+ "TERMINATE_EXISTING",
151
+ ];
152
+ /** Every key of ScenarioTemporalResult, with its "not applicable" value. */
153
+ export const createEmptyTemporalResult = (operation, namespace) => ({
154
+ operation,
155
+ namespace,
156
+ workflowId: null,
157
+ runId: null,
158
+ status: null,
159
+ workflowType: null,
160
+ taskQueue: null,
161
+ result: null,
162
+ failure: null,
163
+ startTime: null,
164
+ closeTime: null,
165
+ historyLength: null,
166
+ memo: null,
167
+ searchAttributes: null,
168
+ activities: [],
169
+ pendingChildren: [],
170
+ events: [],
171
+ eventCounts: {},
172
+ signals: [],
173
+ timers: [],
174
+ truncatedHistory: false,
175
+ executions: [],
176
+ count: null,
177
+ groups: [],
178
+ pollers: [],
179
+ hasPollers: null,
180
+ updateId: null,
181
+ requested: null,
182
+ timedOut: false,
183
+ durationMs: 0,
184
+ });
185
+ export class TemporalConfigError extends Error {
186
+ constructor(message) {
187
+ super(message);
188
+ this.name = "TemporalConfigError";
189
+ }
190
+ }
191
+ const FIELD_LABELS = {
192
+ workflowId: "workflow id",
193
+ workflowType: "workflow type",
194
+ taskQueue: "task queue",
195
+ signalName: "signal name",
196
+ queryName: "query name",
197
+ updateName: "update name",
198
+ query: "list filter",
199
+ };
200
+ const describeField = (field) => FIELD_LABELS[field] ?? String(field);
201
+ const isBlank = (value) => value === undefined || value === null || (typeof value === "string" && value.trim() === "");
202
+ /**
203
+ * Static validation (no templates resolved): which required fields are empty
204
+ * for the chosen operation. Hosts use it in the builder / on save.
205
+ */
206
+ export const getTemporalNodeMissingFields = (config) => {
207
+ const operation = config?.operation;
208
+ if (!isTemporalOperation(operation)) {
209
+ return ["operation"];
210
+ }
211
+ const missing = [];
212
+ if (isBlank(config?.connectionId)) {
213
+ missing.push("connectionId");
214
+ }
215
+ for (const field of TEMPORAL_OPERATION_SPECS[operation].required) {
216
+ if (isBlank(config?.[field])) {
217
+ missing.push(String(field));
218
+ }
219
+ }
220
+ return missing;
221
+ };
222
+ const parseJsonArray = (raw, field, resolve) => {
223
+ const text = (raw ?? "").trim();
224
+ if (!text) {
225
+ return [];
226
+ }
227
+ const resolved = resolve(text);
228
+ let parsed;
229
+ try {
230
+ parsed = JSON.parse(resolved);
231
+ }
232
+ catch {
233
+ throw new TemporalConfigError(`Temporal ${field} must be a JSON array after template resolution (got: ${resolved.slice(0, 80)}).`);
234
+ }
235
+ if (Array.isArray(parsed)) {
236
+ return parsed;
237
+ }
238
+ // A single value is a convenience for one-argument handlers.
239
+ return [parsed];
240
+ };
241
+ const parseJsonObject = (raw, field, resolve) => {
242
+ const text = (raw ?? "").trim();
243
+ if (!text) {
244
+ return undefined;
245
+ }
246
+ const resolved = resolve(text);
247
+ let parsed;
248
+ try {
249
+ parsed = JSON.parse(resolved);
250
+ }
251
+ catch {
252
+ throw new TemporalConfigError(`Temporal ${field} must be a JSON object after template resolution (got: ${resolved.slice(0, 80)}).`);
253
+ }
254
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
255
+ throw new TemporalConfigError(`Temporal ${field} must be a JSON object.`);
256
+ }
257
+ return parsed;
258
+ };
259
+ const positiveInt = (value) => typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.round(value) : undefined;
260
+ const createGeneratedWorkflowId = (label) => {
261
+ const slug = label
262
+ .trim()
263
+ .toLowerCase()
264
+ .replace(/[^a-z0-9]+/g, "-")
265
+ .replace(/^-+|-+$/g, "")
266
+ .slice(0, 40);
267
+ const random = globalThis.crypto?.randomUUID?.() ??
268
+ `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
269
+ return `callman-${slug || "workflow"}-${random}`;
270
+ };
271
+ /**
272
+ * Resolve every template in the config and parse the JSON fields. Throws
273
+ * TemporalConfigError when a required field is empty or JSON is invalid —
274
+ * the executor turns that into a fail-fast node failure (no gRPC call).
275
+ */
276
+ export const resolveTemporalOperation = (config, resolve, resolveJson, options = {}) => {
277
+ if (!isTemporalOperation(config.operation)) {
278
+ throw new TemporalConfigError(`Temporal node has no operation. Choose one of: ${TEMPORAL_OPERATIONS.join(", ")}.`);
279
+ }
280
+ const spec = TEMPORAL_OPERATION_SPECS[config.operation];
281
+ const text = (value) => {
282
+ const resolved = resolve((value ?? "").trim()).trim();
283
+ return resolved ? resolved : null;
284
+ };
285
+ for (const field of spec.required) {
286
+ const value = config[field];
287
+ const resolved = typeof value === "string" ? text(value) : value;
288
+ if (isBlank(resolved)) {
289
+ throw new TemporalConfigError(`Temporal ${spec.label.toLowerCase()} needs a ${describeField(field)}.`);
290
+ }
291
+ }
292
+ let workflowId = text(config.workflowId);
293
+ if (!workflowId && config.operation === "startWorkflow") {
294
+ workflowId = createGeneratedWorkflowId(options.nodeLabel ?? "workflow");
295
+ }
296
+ const historyLimit = positiveInt(config.historyLimit);
297
+ const pageSize = positiveInt(config.pageSize);
298
+ return {
299
+ operation: config.operation,
300
+ namespace: text(config.namespace),
301
+ workflowId,
302
+ runId: text(config.runId),
303
+ workflowType: text(config.workflowType),
304
+ taskQueue: text(config.taskQueue),
305
+ args: parseJsonArray(config.args, "args", resolveJson),
306
+ signalName: text(config.signalName),
307
+ signalArgs: parseJsonArray(config.signalArgs, "signalArgs", resolveJson),
308
+ queryName: text(config.queryName),
309
+ updateName: text(config.updateName),
310
+ waitForStage: config.waitForStage === "ACCEPTED" ? "ACCEPTED" : "COMPLETED",
311
+ waitForResult: config.waitForResult === true,
312
+ followRuns: config.followRuns !== false,
313
+ reason: text(config.reason),
314
+ query: text(config.query),
315
+ pageSize: pageSize ?? null,
316
+ eventTypes: Array.isArray(config.eventTypes)
317
+ ? config.eventTypes
318
+ .map((entry) => (typeof entry === "string" ? entry.trim() : ""))
319
+ .filter((entry) => entry.length > 0)
320
+ : [],
321
+ historyLimit: historyLimit ?? null,
322
+ taskQueueType: config.taskQueueType === "activity" ? "activity" : "workflow",
323
+ startOptions: {
324
+ ...(config.idReusePolicy &&
325
+ TEMPORAL_WORKFLOW_ID_REUSE_POLICIES.includes(config.idReusePolicy)
326
+ ? { idReusePolicy: config.idReusePolicy }
327
+ : {}),
328
+ ...(config.idConflictPolicy &&
329
+ TEMPORAL_WORKFLOW_ID_CONFLICT_POLICIES.includes(config.idConflictPolicy)
330
+ ? { idConflictPolicy: config.idConflictPolicy }
331
+ : {}),
332
+ ...(parseJsonObject(config.memo, "memo", resolveJson)
333
+ ? { memo: parseJsonObject(config.memo, "memo", resolveJson) }
334
+ : {}),
335
+ ...(parseJsonObject(config.searchAttributes, "searchAttributes", resolveJson)
336
+ ? {
337
+ searchAttributes: parseJsonObject(config.searchAttributes, "searchAttributes", resolveJson),
338
+ }
339
+ : {}),
340
+ ...(positiveInt(config.workflowExecutionTimeoutMs)
341
+ ? { workflowExecutionTimeoutMs: positiveInt(config.workflowExecutionTimeoutMs) }
342
+ : {}),
343
+ ...(positiveInt(config.workflowRunTimeoutMs)
344
+ ? { workflowRunTimeoutMs: positiveInt(config.workflowRunTimeoutMs) }
345
+ : {}),
346
+ ...(positiveInt(config.workflowTaskTimeoutMs)
347
+ ? { workflowTaskTimeoutMs: positiveInt(config.workflowTaskTimeoutMs) }
348
+ : {}),
349
+ ...(positiveInt(config.startDelayMs) ? { startDelayMs: positiveInt(config.startDelayMs) } : {}),
350
+ ...(config.retryPolicy && typeof config.retryPolicy === "object"
351
+ ? { retryPolicy: normalizeRetryPolicy(config.retryPolicy) }
352
+ : {}),
353
+ },
354
+ };
355
+ };
356
+ const normalizeRetryPolicy = (value) => ({
357
+ ...(positiveInt(value.maximumAttempts) ? { maximumAttempts: positiveInt(value.maximumAttempts) } : {}),
358
+ ...(positiveInt(value.initialIntervalMs)
359
+ ? { initialIntervalMs: positiveInt(value.initialIntervalMs) }
360
+ : {}),
361
+ ...(typeof value.backoffCoefficient === "number" && value.backoffCoefficient >= 1
362
+ ? { backoffCoefficient: value.backoffCoefficient }
363
+ : {}),
364
+ ...(positiveInt(value.maximumIntervalMs)
365
+ ? { maximumIntervalMs: positiveInt(value.maximumIntervalMs) }
366
+ : {}),
367
+ });
368
+ /** Deep link into the Temporal Web UI, when the connection names one. */
369
+ export const buildTemporalUiUrl = (uiBaseUrl, namespace, workflowId, runId) => {
370
+ const base = (uiBaseUrl ?? "").trim().replace(/\/+$/, "");
371
+ if (!base || !workflowId) {
372
+ return null;
373
+ }
374
+ const path = `${base}/namespaces/${encodeURIComponent(namespace)}/workflows/${encodeURIComponent(workflowId)}`;
375
+ return runId ? `${path}/${encodeURIComponent(runId)}` : path;
376
+ };
377
+ //# sourceMappingURL=temporal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal.js","sourceRoot":"","sources":["../../src/scenario-runner/temporal.ts"],"names":[],"mappings":"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"}