@pranshulsoni/flowwatch 1.0.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 (73) hide show
  1. package/README.md +442 -0
  2. package/dist/ai/groqInsightService.d.ts +39 -0
  3. package/dist/ai/groqInsightService.js +230 -0
  4. package/dist/createFlowwatch.d.ts +17 -0
  5. package/dist/createFlowwatch.js +90 -0
  6. package/dist/dashboard/routes/dashboardResponse.d.ts +204 -0
  7. package/dist/dashboard/routes/dashboardResponse.js +248 -0
  8. package/dist/dashboard/routes/router.d.ts +13 -0
  9. package/dist/dashboard/routes/router.js +708 -0
  10. package/dist/dashboard/static/dashboard.html +6061 -0
  11. package/dist/engine/background/queues/workflowQueue.d.ts +6 -0
  12. package/dist/engine/background/queues/workflowQueue.js +14 -0
  13. package/dist/engine/background/workers/workflowWorker.d.ts +15 -0
  14. package/dist/engine/background/workers/workflowWorker.js +98 -0
  15. package/dist/engine/errors/errorEngine.d.ts +27 -0
  16. package/dist/engine/errors/errorEngine.js +115 -0
  17. package/dist/engine/flags/evaluateFlag.d.ts +3 -0
  18. package/dist/engine/flags/evaluateFlag.js +50 -0
  19. package/dist/engine/flags/flagEngine.d.ts +9 -0
  20. package/dist/engine/flags/flagEngine.js +52 -0
  21. package/dist/engine/flags/hashRollout.d.ts +1 -0
  22. package/dist/engine/flags/hashRollout.js +9 -0
  23. package/dist/engine/flags/types.d.ts +7 -0
  24. package/dist/engine/flags/types.js +1 -0
  25. package/dist/engine/trace/traceEngine.d.ts +26 -0
  26. package/dist/engine/trace/traceEngine.js +76 -0
  27. package/dist/engine/workflows/types.d.ts +28 -0
  28. package/dist/engine/workflows/types.js +1 -0
  29. package/dist/engine/workflows/workflowEngine.d.ts +15 -0
  30. package/dist/engine/workflows/workflowEngine.js +112 -0
  31. package/dist/index.d.ts +9 -0
  32. package/dist/index.js +3 -0
  33. package/dist/persistence/cache/redisClient.d.ts +2 -0
  34. package/dist/persistence/cache/redisClient.js +4 -0
  35. package/dist/persistence/db/postgres.d.ts +3 -0
  36. package/dist/persistence/db/postgres.js +4 -0
  37. package/dist/persistence/migrations/migrationRunner.d.ts +3 -0
  38. package/dist/persistence/migrations/migrationRunner.js +46 -0
  39. package/dist/persistence/migrations/migrations.d.ts +5 -0
  40. package/dist/persistence/migrations/migrations.js +191 -0
  41. package/dist/persistence/repositories/errors/errorRepository.d.ts +38 -0
  42. package/dist/persistence/repositories/errors/errorRepository.js +63 -0
  43. package/dist/persistence/repositories/flags/flagRepository.d.ts +72 -0
  44. package/dist/persistence/repositories/flags/flagRepository.js +245 -0
  45. package/dist/persistence/repositories/traces/traceRepository.d.ts +64 -0
  46. package/dist/persistence/repositories/traces/traceRepository.js +110 -0
  47. package/dist/persistence/repositories/workflows/workflowRepository.d.ts +93 -0
  48. package/dist/persistence/repositories/workflows/workflowRepository.js +260 -0
  49. package/dist/persistence/transaction.d.ts +2 -0
  50. package/dist/persistence/transaction.js +16 -0
  51. package/dist/runtime/config/normalizeConfig.d.ts +2 -0
  52. package/dist/runtime/config/normalizeConfig.js +46 -0
  53. package/dist/runtime/config/validationConfig.d.ts +2 -0
  54. package/dist/runtime/config/validationConfig.js +119 -0
  55. package/dist/runtime/health/healthService.d.ts +30 -0
  56. package/dist/runtime/health/healthService.js +54 -0
  57. package/dist/runtime/tracing/traceContext.d.ts +12 -0
  58. package/dist/runtime/tracing/traceContext.js +28 -0
  59. package/dist/runtime/tracing/tracingMiddleware.d.ts +3 -0
  60. package/dist/runtime/tracing/tracingMiddleware.js +46 -0
  61. package/dist/search/elasticsearch/client.d.ts +2 -0
  62. package/dist/search/elasticsearch/client.js +4 -0
  63. package/dist/search/elasticsearch/indexSetup.d.ts +3 -0
  64. package/dist/search/elasticsearch/indexSetup.js +43 -0
  65. package/dist/search/elasticsearch/indexer.d.ts +9 -0
  66. package/dist/search/elasticsearch/indexer.js +86 -0
  67. package/dist/search/elasticsearch/mappingChecker.d.ts +2 -0
  68. package/dist/search/elasticsearch/mappingChecker.js +28 -0
  69. package/dist/types/index.d.ts +48 -0
  70. package/dist/types/index.js +1 -0
  71. package/dist/utils/flowwatchEnvStore.d.ts +27 -0
  72. package/dist/utils/flowwatchEnvStore.js +145 -0
  73. package/package.json +63 -0
@@ -0,0 +1,245 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { withTransaction } from "../../transaction.js";
3
+ // ─── Flag CRUD ────────────────────────────────────────────────────────────────
4
+ export async function createFlag(pool, input) {
5
+ const flagId = randomUUID();
6
+ return withTransaction(pool, async (client) => {
7
+ const result = await client.query(`
8
+ INSERT INTO flowwatch_feature_flags (
9
+ id,
10
+ key,
11
+ description,
12
+ enabled,
13
+ rollout_percentage
14
+ )
15
+ VALUES ($1, $2, $3, $4, $5)
16
+ RETURNING *
17
+ `, [
18
+ flagId,
19
+ input.key,
20
+ input.description ?? null,
21
+ input.enabled ?? false,
22
+ input.rolloutPercentage ?? 0,
23
+ ]);
24
+ const flag = result.rows[0];
25
+ await insertAuditLog(client, {
26
+ flagId: flag.id,
27
+ action: "flag_created",
28
+ before: null,
29
+ after: flag,
30
+ changedBy: input.changedBy,
31
+ });
32
+ return flag;
33
+ });
34
+ }
35
+ export async function listFlags(pool) {
36
+ const result = await pool.query(`
37
+ SELECT *
38
+ FROM flowwatch_feature_flags
39
+ ORDER BY key ASC
40
+ `);
41
+ return result.rows;
42
+ }
43
+ export async function listFlagsWithRuleCounts(pool) {
44
+ const result = await pool.query(`
45
+ SELECT flags.*, COUNT(rules.id)::int AS rule_count
46
+ FROM flowwatch_feature_flags flags
47
+ LEFT JOIN flowwatch_feature_flag_rules rules ON rules.flag_id = flags.id
48
+ GROUP BY flags.id
49
+ ORDER BY flags.key ASC
50
+ `);
51
+ return result.rows;
52
+ }
53
+ export async function getFlagByKey(pool, key) {
54
+ const result = await pool.query(`
55
+ SELECT *
56
+ FROM flowwatch_feature_flags
57
+ WHERE key = $1
58
+ `, [key]);
59
+ return result.rows[0];
60
+ }
61
+ export async function updateFlag(pool, key, input) {
62
+ return withTransaction(pool, async (client) => {
63
+ const beforeResult = await client.query(`SELECT * FROM flowwatch_feature_flags WHERE key = $1`, [key]);
64
+ const before = beforeResult.rows[0];
65
+ if (!before)
66
+ return undefined;
67
+ const result = await client.query(`
68
+ UPDATE flowwatch_feature_flags
69
+ SET description = COALESCE($2, description),
70
+ enabled = COALESCE($3, enabled),
71
+ rollout_percentage = COALESCE($4, rollout_percentage),
72
+ updated_at = now()
73
+ WHERE key = $1
74
+ RETURNING *
75
+ `, [
76
+ key,
77
+ input.description,
78
+ input.enabled,
79
+ input.rolloutPercentage,
80
+ ]);
81
+ const after = result.rows[0];
82
+ await insertAuditLog(client, {
83
+ flagId: after.id,
84
+ action: "flag_updated",
85
+ before,
86
+ after,
87
+ changedBy: input.changedBy,
88
+ });
89
+ return after;
90
+ });
91
+ }
92
+ export async function deleteFlag(pool, key, changedBy) {
93
+ return withTransaction(pool, async (client) => {
94
+ const beforeResult = await client.query(`SELECT * FROM flowwatch_feature_flags WHERE key = $1`, [key]);
95
+ const before = beforeResult.rows[0];
96
+ if (!before)
97
+ return false;
98
+ // Write audit log BEFORE delete so the FK to flowwatch_feature_flags is still valid
99
+ await insertAuditLog(client, {
100
+ flagId: before.id,
101
+ action: "flag_deleted",
102
+ before,
103
+ after: null,
104
+ changedBy,
105
+ });
106
+ await client.query(`DELETE FROM flowwatch_feature_flags WHERE key = $1`, [key]);
107
+ return true;
108
+ });
109
+ }
110
+ // ─── Flag Rules ───────────────────────────────────────────────────────────────
111
+ export async function listFlagRules(pool, flagKey) {
112
+ const flag = await getFlagByKey(pool, flagKey);
113
+ if (!flag) {
114
+ return [];
115
+ }
116
+ const result = await pool.query(`
117
+ SELECT *
118
+ FROM flowwatch_feature_flag_rules
119
+ WHERE flag_id = $1
120
+ ORDER BY created_at ASC
121
+ `, [flag.id]);
122
+ return result.rows;
123
+ }
124
+ export async function createFlagRule(pool, input) {
125
+ return withTransaction(pool, async (client) => {
126
+ const flagResult = await client.query(`SELECT * FROM flowwatch_feature_flags WHERE key = $1`, [input.flagKey]);
127
+ const flag = flagResult.rows[0];
128
+ if (!flag)
129
+ return undefined;
130
+ const result = await client.query(`
131
+ INSERT INTO flowwatch_feature_flag_rules (
132
+ id,
133
+ flag_id,
134
+ attribute,
135
+ operator,
136
+ value,
137
+ enabled
138
+ )
139
+ VALUES ($1, $2, $3, $4, $5::jsonb, $6)
140
+ RETURNING *
141
+ `, [
142
+ randomUUID(),
143
+ flag.id,
144
+ input.attribute,
145
+ input.operator,
146
+ JSON.stringify(input.value),
147
+ input.enabled ?? true,
148
+ ]);
149
+ const rule = result.rows[0];
150
+ await insertAuditLog(client, {
151
+ flagId: flag.id,
152
+ action: "rule_created",
153
+ before: null,
154
+ after: rule,
155
+ changedBy: input.changedBy,
156
+ });
157
+ return rule;
158
+ });
159
+ }
160
+ export async function updateFlagRule(pool, ruleId, input) {
161
+ return withTransaction(pool, async (client) => {
162
+ const beforeResult = await client.query(`SELECT * FROM flowwatch_feature_flag_rules WHERE id = $1`, [ruleId]);
163
+ const before = beforeResult.rows[0];
164
+ if (!before)
165
+ return undefined;
166
+ const result = await client.query(`
167
+ UPDATE flowwatch_feature_flag_rules
168
+ SET attribute = COALESCE($2, attribute),
169
+ operator = COALESCE($3, operator),
170
+ value = COALESCE($4::jsonb, value),
171
+ enabled = COALESCE($5, enabled),
172
+ updated_at = now()
173
+ WHERE id = $1
174
+ RETURNING *
175
+ `, [
176
+ ruleId,
177
+ input.attribute,
178
+ input.operator,
179
+ input.value === undefined ? undefined : JSON.stringify(input.value),
180
+ input.enabled,
181
+ ]);
182
+ const after = result.rows[0];
183
+ await insertAuditLog(client, {
184
+ flagId: after.flag_id,
185
+ action: "rule_updated",
186
+ before,
187
+ after,
188
+ changedBy: input.changedBy,
189
+ });
190
+ return after;
191
+ });
192
+ }
193
+ export async function deleteFlagRule(pool, ruleId, changedBy) {
194
+ return withTransaction(pool, async (client) => {
195
+ const beforeResult = await client.query(`SELECT * FROM flowwatch_feature_flag_rules WHERE id = $1`, [ruleId]);
196
+ const before = beforeResult.rows[0];
197
+ if (!before)
198
+ return false;
199
+ // Write audit log BEFORE delete so the FK to flowwatch_feature_flag_rules is still valid
200
+ await insertAuditLog(client, {
201
+ flagId: before.flag_id,
202
+ action: "rule_deleted",
203
+ before,
204
+ after: null,
205
+ changedBy,
206
+ });
207
+ await client.query(`DELETE FROM flowwatch_feature_flag_rules WHERE id = $1`, [ruleId]);
208
+ return true;
209
+ });
210
+ }
211
+ // ─── Audit logs ───────────────────────────────────────────────────────────────
212
+ export async function listFlagAuditLogs(pool, flagKey) {
213
+ const flag = await getFlagByKey(pool, flagKey);
214
+ if (!flag) {
215
+ return [];
216
+ }
217
+ const result = await pool.query(`
218
+ SELECT *
219
+ FROM flowwatch_feature_flag_audit_logs
220
+ WHERE flag_id = $1
221
+ ORDER BY created_at DESC
222
+ `, [flag.id]);
223
+ return result.rows;
224
+ }
225
+ // Accepts a PoolClient so audit logs share the same transaction as the main op
226
+ async function insertAuditLog(client, input) {
227
+ await client.query(`
228
+ INSERT INTO flowwatch_feature_flag_audit_logs (
229
+ id,
230
+ flag_id,
231
+ action,
232
+ before,
233
+ after,
234
+ changed_by
235
+ )
236
+ VALUES ($1, $2, $3, $4::jsonb, $5::jsonb, $6)
237
+ `, [
238
+ randomUUID(),
239
+ input.flagId,
240
+ input.action,
241
+ JSON.stringify(input.before),
242
+ JSON.stringify(input.after),
243
+ input.changedBy ?? null,
244
+ ]);
245
+ }
@@ -0,0 +1,64 @@
1
+ import type { Pool } from "pg";
2
+ export type TraceSpanType = "middleware" | "service" | "repository" | "external_api" | "workflow_step" | "feature_flag" | "custom";
3
+ export type TraceStatus = "running" | "ok" | "error";
4
+ export interface RequestTraceRow {
5
+ id: string;
6
+ method: string;
7
+ path: string;
8
+ status_code: number | null;
9
+ duration_ms: number | null;
10
+ user_id: string | null;
11
+ ip: string | null;
12
+ user_agent: string | null;
13
+ metadata: unknown;
14
+ started_at: Date;
15
+ ended_at: Date | null;
16
+ created_at: Date;
17
+ }
18
+ export interface TraceSpanRow {
19
+ id: string;
20
+ trace_id: string;
21
+ parent_span_id: string | null;
22
+ name: string;
23
+ type: TraceSpanType;
24
+ status: TraceStatus;
25
+ duration_ms: number | null;
26
+ metadata: unknown;
27
+ started_at: Date;
28
+ ended_at: Date | null;
29
+ created_at: Date;
30
+ }
31
+ export interface CreateRequestTraceInput {
32
+ method: string;
33
+ path: string;
34
+ userId?: string;
35
+ ip?: string;
36
+ userAgent?: string;
37
+ metadata?: unknown;
38
+ }
39
+ export interface FinishRequestTraceInput {
40
+ traceId: string;
41
+ statusCode?: number;
42
+ durationMs: number;
43
+ metadata?: unknown;
44
+ }
45
+ export interface CreateTraceSpanInput {
46
+ traceId: string;
47
+ parentSpanId?: string;
48
+ name: string;
49
+ type: TraceSpanType;
50
+ metadata?: unknown;
51
+ }
52
+ export interface FinishTraceSpanInput {
53
+ spanId: string;
54
+ status: TraceStatus;
55
+ durationMs: number;
56
+ metadata?: unknown;
57
+ }
58
+ export declare function createRequestTrace(pool: Pool, input: CreateRequestTraceInput): Promise<RequestTraceRow>;
59
+ export declare function finishRequestTrace(pool: Pool, input: FinishRequestTraceInput): Promise<RequestTraceRow | undefined>;
60
+ export declare function createTraceSpan(pool: Pool, input: CreateTraceSpanInput): Promise<TraceSpanRow>;
61
+ export declare function finishTraceSpan(pool: Pool, input: FinishTraceSpanInput): Promise<TraceSpanRow | undefined>;
62
+ export declare function getRequestTrace(pool: Pool, traceId: string): Promise<RequestTraceRow | undefined>;
63
+ export declare function listRequestTraces(pool: Pool, limit?: number): Promise<RequestTraceRow[]>;
64
+ export declare function getTraceSpans(pool: Pool, traceId: string): Promise<TraceSpanRow[]>;
@@ -0,0 +1,110 @@
1
+ import { randomUUID } from "node:crypto";
2
+ export async function createRequestTrace(pool, input) {
3
+ const result = await pool.query(`
4
+ INSERT INTO flowwatch_request_traces (
5
+ id,
6
+ method,
7
+ path,
8
+ user_id,
9
+ ip,
10
+ user_agent,
11
+ metadata,
12
+ started_at
13
+ )
14
+ VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb, now())
15
+ RETURNING *
16
+ `, [
17
+ randomUUID(),
18
+ input.method,
19
+ input.path,
20
+ input.userId ?? null,
21
+ input.ip ?? null,
22
+ input.userAgent ?? null,
23
+ JSON.stringify(input.metadata ?? {}),
24
+ ]);
25
+ return result.rows[0];
26
+ }
27
+ export async function finishRequestTrace(pool, input) {
28
+ const result = await pool.query(`
29
+ UPDATE flowwatch_request_traces
30
+ SET status_code = COALESCE($2, status_code),
31
+ duration_ms = $3,
32
+ metadata = COALESCE($4::jsonb, metadata),
33
+ ended_at = now()
34
+ WHERE id = $1
35
+ RETURNING *
36
+ `, [
37
+ input.traceId,
38
+ input.statusCode,
39
+ input.durationMs,
40
+ input.metadata === undefined ? undefined : JSON.stringify(input.metadata),
41
+ ]);
42
+ return result.rows[0];
43
+ }
44
+ export async function createTraceSpan(pool, input) {
45
+ const result = await pool.query(`
46
+ INSERT INTO flowwatch_trace_spans (
47
+ id,
48
+ trace_id,
49
+ parent_span_id,
50
+ name,
51
+ type,
52
+ status,
53
+ metadata,
54
+ started_at
55
+ )
56
+ VALUES ($1, $2, $3, $4, $5, 'running', $6::jsonb, now())
57
+ RETURNING *
58
+ `, [
59
+ randomUUID(),
60
+ input.traceId,
61
+ input.parentSpanId ?? null,
62
+ input.name,
63
+ input.type,
64
+ JSON.stringify(input.metadata ?? {}),
65
+ ]);
66
+ return result.rows[0];
67
+ }
68
+ export async function finishTraceSpan(pool, input) {
69
+ const result = await pool.query(`
70
+ UPDATE flowwatch_trace_spans
71
+ SET status = $2,
72
+ duration_ms = $3,
73
+ metadata = COALESCE($4::jsonb, metadata),
74
+ ended_at = now()
75
+ WHERE id = $1
76
+ RETURNING *
77
+ `, [
78
+ input.spanId,
79
+ input.status,
80
+ input.durationMs,
81
+ input.metadata === undefined ? undefined : JSON.stringify(input.metadata),
82
+ ]);
83
+ return result.rows[0];
84
+ }
85
+ export async function getRequestTrace(pool, traceId) {
86
+ const result = await pool.query(`
87
+ SELECT *
88
+ FROM flowwatch_request_traces
89
+ WHERE id = $1
90
+ `, [traceId]);
91
+ return result.rows[0];
92
+ }
93
+ export async function listRequestTraces(pool, limit = 50) {
94
+ const result = await pool.query(`
95
+ SELECT *
96
+ FROM flowwatch_request_traces
97
+ ORDER BY started_at DESC
98
+ LIMIT $1
99
+ `, [limit]);
100
+ return result.rows;
101
+ }
102
+ export async function getTraceSpans(pool, traceId) {
103
+ const result = await pool.query(`
104
+ SELECT *
105
+ FROM flowwatch_trace_spans
106
+ WHERE trace_id = $1
107
+ ORDER BY started_at ASC
108
+ `, [traceId]);
109
+ return result.rows;
110
+ }
@@ -0,0 +1,93 @@
1
+ import type { Pool } from "pg";
2
+ export interface WorkflowStepDefinitionInput {
3
+ name: string;
4
+ maxRetries?: number;
5
+ }
6
+ export interface CreateWorkflowDefinitionInput {
7
+ name: string;
8
+ version?: number;
9
+ steps: WorkflowStepDefinitionInput[];
10
+ }
11
+ export interface WorkflowDefinitionRecord {
12
+ id: string;
13
+ name: string;
14
+ version: number;
15
+ created_at?: Date;
16
+ updated_at?: Date;
17
+ }
18
+ export interface WorkflowStepRecord {
19
+ id: string;
20
+ workflowId: string;
21
+ stepIndex: number;
22
+ name: string;
23
+ maxRetries: number;
24
+ }
25
+ export interface InsertWorkflowResult {
26
+ workflow: WorkflowDefinitionRecord;
27
+ steps: WorkflowStepRecord[];
28
+ }
29
+ export interface WorkflowExecutionInput {
30
+ workflowId: string;
31
+ workflowName: string;
32
+ workflowVersion: number;
33
+ input?: unknown;
34
+ steps: WorkflowExecutionStepInput[];
35
+ }
36
+ export interface WorkflowExecutionStepInput {
37
+ workflowStepId: string;
38
+ stepIndex: number;
39
+ stepName: string;
40
+ maxRetries: number;
41
+ input?: unknown;
42
+ }
43
+ export interface WorkflowExecutionRecord {
44
+ executionId: string;
45
+ }
46
+ export interface WorkflowExecutionRow {
47
+ id: string;
48
+ workflow_id: string;
49
+ workflow_name: string;
50
+ workflow_version: number;
51
+ status: string;
52
+ input: unknown;
53
+ output: unknown;
54
+ error: unknown;
55
+ created_at: Date;
56
+ started_at: Date | null;
57
+ completed_at: Date | null;
58
+ failed_at: Date | null;
59
+ }
60
+ export interface WorkflowStepExecutionRow {
61
+ id: string;
62
+ execution_id: string;
63
+ workflow_step_id: string | null;
64
+ step_index: number;
65
+ step_name: string;
66
+ status: string;
67
+ input: unknown;
68
+ output: unknown;
69
+ error: unknown;
70
+ attempt_count: number;
71
+ max_retries: number;
72
+ created_at: Date;
73
+ started_at: Date | null;
74
+ completed_at: Date | null;
75
+ failed_at: Date | null;
76
+ next_retry_at: Date | null;
77
+ }
78
+ export declare function insertWorkflow(pool: Pool, input: CreateWorkflowDefinitionInput): Promise<InsertWorkflowResult>;
79
+ export declare function insertWorkflowExecution(pool: Pool, input: WorkflowExecutionInput): Promise<WorkflowExecutionRecord>;
80
+ export declare function getWorkflowExecution(pool: Pool, executionId: string): Promise<WorkflowExecutionRow | undefined>;
81
+ export declare function listWorkflowDefinitions(pool: Pool): Promise<WorkflowDefinitionRecord[]>;
82
+ export declare function getLatestWorkflowDefinitionByName(pool: Pool, workflowName: string): Promise<WorkflowDefinitionRecord | undefined>;
83
+ export declare function listWorkflowExecutions(pool: Pool, limit?: number): Promise<WorkflowExecutionRow[]>;
84
+ export declare function listWorkflowExecutionsByWorkflowName(pool: Pool, workflowName: string, limit?: number): Promise<WorkflowExecutionRow[]>;
85
+ export declare function listWorkflowStepExecutionsByExecutionIds(pool: Pool, executionIds: string[]): Promise<Map<string, WorkflowStepExecutionRow[]>>;
86
+ export declare function listWorkflowStepsByWorkflowIds(pool: Pool, workflowIds: string[]): Promise<Map<string, WorkflowStepRecord[]>>;
87
+ export declare function getWorkflowExecutionSteps(pool: Pool, executionId: string): Promise<WorkflowStepExecutionRow[]>;
88
+ export declare function markWorkflowExecutionRunning(pool: Pool, executionId: string): Promise<void>;
89
+ export declare function markWorkflowExecutionCompleted(pool: Pool, executionId: string, output?: unknown): Promise<void>;
90
+ export declare function markWorkflowExecutionFailed(pool: Pool, executionId: string, error: unknown): Promise<void>;
91
+ export declare function markWorkflowStepRunning(pool: Pool, stepExecutionId: string): Promise<void>;
92
+ export declare function markWorkflowStepCompleted(pool: Pool, stepExecutionId: string, output?: unknown): Promise<void>;
93
+ export declare function markWorkflowStepFailed(pool: Pool, stepExecutionId: string, error: unknown): Promise<void>;