@crewx/workflow 0.3.22-rc.18 → 0.3.22-rc.181

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 (49) hide show
  1. package/SKILL.md +40 -4
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +268 -86
  4. package/dist/cli.js.map +1 -1
  5. package/dist/src/card-state.d.ts +20 -0
  6. package/dist/src/card-state.d.ts.map +1 -0
  7. package/dist/src/card-state.js +121 -0
  8. package/dist/src/card-state.js.map +1 -0
  9. package/dist/src/engine.d.ts +9 -2
  10. package/dist/src/engine.d.ts.map +1 -1
  11. package/dist/src/engine.js +70 -22
  12. package/dist/src/engine.js.map +1 -1
  13. package/dist/src/failure.d.ts +41 -0
  14. package/dist/src/failure.d.ts.map +1 -0
  15. package/dist/src/failure.js +122 -0
  16. package/dist/src/failure.js.map +1 -0
  17. package/dist/src/list-view.d.ts +22 -0
  18. package/dist/src/list-view.d.ts.map +1 -0
  19. package/dist/src/list-view.js +188 -0
  20. package/dist/src/list-view.js.map +1 -0
  21. package/dist/src/mermaid.js +3 -3
  22. package/dist/src/mermaid.js.map +1 -1
  23. package/dist/src/parent-task-sync.d.ts +139 -0
  24. package/dist/src/parent-task-sync.d.ts.map +1 -0
  25. package/dist/src/parent-task-sync.js +445 -0
  26. package/dist/src/parent-task-sync.js.map +1 -0
  27. package/dist/src/retry-policy.d.ts +38 -0
  28. package/dist/src/retry-policy.d.ts.map +1 -0
  29. package/dist/src/retry-policy.js +140 -0
  30. package/dist/src/retry-policy.js.map +1 -0
  31. package/dist/src/run-manager.d.ts +36 -2
  32. package/dist/src/run-manager.d.ts.map +1 -1
  33. package/dist/src/run-manager.js +1195 -234
  34. package/dist/src/run-manager.js.map +1 -1
  35. package/dist/src/types.d.ts +37 -3
  36. package/dist/src/types.d.ts.map +1 -1
  37. package/dist/src/types.js +2 -0
  38. package/dist/src/types.js.map +1 -1
  39. package/dist/src/utils/output-format.d.ts +12 -0
  40. package/dist/src/utils/output-format.d.ts.map +1 -1
  41. package/dist/src/utils/output-format.js +103 -5
  42. package/dist/src/utils/output-format.js.map +1 -1
  43. package/dist/src/workflow-persistence.d.ts +48 -0
  44. package/dist/src/workflow-persistence.d.ts.map +1 -0
  45. package/dist/src/workflow-persistence.js +224 -0
  46. package/dist/src/workflow-persistence.js.map +1 -0
  47. package/dist/workflow-schema.json +29 -4
  48. package/package.json +23 -4
  49. package/workflow-schema.json +29 -4
@@ -0,0 +1,445 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WORKFLOW_PARENT_TASK_KINDS = exports.WORKFLOW_PARENT_ORPHAN_ERROR = exports.WORKFLOW_PARENT_ORPHAN_GRACE_MS = void 0;
4
+ exports.deriveWorkflowParentLifecycle = deriveWorkflowParentLifecycle;
5
+ exports.deriveWorkflowParentLifecycleDecision = deriveWorkflowParentLifecycleDecision;
6
+ exports.deriveWorkflowParentLifecycleChange = deriveWorkflowParentLifecycleChange;
7
+ exports.syncWorkflowParentTaskLifecycle = syncWorkflowParentTaskLifecycle;
8
+ exports.previewWorkflowParentRepair = previewWorkflowParentRepair;
9
+ exports.createWorkflowParentPersistSink = createWorkflowParentPersistSink;
10
+ exports.reconcileWorkflowParentTasks = reconcileWorkflowParentTasks;
11
+ exports.reconcileWorkflowParentRunFiles = reconcileWorkflowParentRunFiles;
12
+ exports.WORKFLOW_PARENT_ORPHAN_GRACE_MS = 10 * 60 * 1000;
13
+ exports.WORKFLOW_PARENT_ORPHAN_ERROR = 'Workflow run file missing after grace period (orphaned workflow task)';
14
+ exports.WORKFLOW_PARENT_TASK_KINDS = [
15
+ 'workflow_card',
16
+ 'workflow_ui_instance',
17
+ ];
18
+ function latestAuditEndedAt(run) {
19
+ let latest;
20
+ for (const entry of run.audit ?? []) {
21
+ const timestamp = Date.parse(entry.ended_at);
22
+ if (!Number.isFinite(timestamp))
23
+ continue;
24
+ if (!latest || timestamp >= latest.timestamp) {
25
+ latest = { value: entry.ended_at, timestamp };
26
+ }
27
+ }
28
+ return latest?.value ?? null;
29
+ }
30
+ function deriveWorkflowParentLifecycle(run) {
31
+ if (run.status === 'completed' || run.status === 'failed' || run.status === 'cancelled') {
32
+ const completedAt = latestAuditEndedAt(run) ?? run.updated_at;
33
+ const createdAtMs = Date.parse(run.created_at);
34
+ const completedAtMs = Date.parse(completedAt);
35
+ const durationMs = Number.isFinite(createdAtMs) && Number.isFinite(completedAtMs)
36
+ ? Math.max(0, completedAtMs - createdAtMs)
37
+ : null;
38
+ if (run.status === 'completed') {
39
+ return { status: 'success', error: null, completedAt, durationMs };
40
+ }
41
+ return {
42
+ status: 'failed',
43
+ error: run.error ?? (run.status === 'cancelled' ? 'Workflow run cancelled' : 'Workflow run failed'),
44
+ completedAt,
45
+ durationMs,
46
+ };
47
+ }
48
+ if (run.status === 'running' || run.status === 'retrying') {
49
+ return { status: 'running', error: null, completedAt: null, durationMs: null };
50
+ }
51
+ if (run.status === 'pending' || run.status === undefined) {
52
+ return { status: 'pending', error: null, completedAt: null, durationMs: null };
53
+ }
54
+ return null;
55
+ }
56
+ function parseWorkflowParentMarker(metadata) {
57
+ if (!metadata)
58
+ return null;
59
+ try {
60
+ const parsed = JSON.parse(metadata);
61
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
62
+ return null;
63
+ const record = parsed;
64
+ return (record.kind === 'workflow_card' || record.kind === 'workflow_ui_instance') && typeof record.workflowRunId === 'string'
65
+ ? {
66
+ kind: record.kind,
67
+ workflowRunId: record.workflowRunId,
68
+ ...(typeof record.uiInstanceId === 'string' && record.uiInstanceId.trim()
69
+ ? { uiInstanceId: record.uiInstanceId.trim() }
70
+ : {}),
71
+ }
72
+ : null;
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ function lifecycleMatches(row, lifecycle) {
79
+ return row.status === lifecycle.status
80
+ && row.error === lifecycle.error
81
+ && row.completed_at === lifecycle.completedAt
82
+ && row.duration_ms === lifecycle.durationMs;
83
+ }
84
+ function isTerminalParentStatus(status) {
85
+ return status === 'success'
86
+ || status === 'completed'
87
+ || status === 'failed'
88
+ || status === 'cancelled'
89
+ || status === 'error';
90
+ }
91
+ function protectsNewerTerminalParent(row, run, snapshotUpdatedAt) {
92
+ if (!isTerminalParentStatus(row.status))
93
+ return false;
94
+ if (!row.completed_at)
95
+ return false;
96
+ const taskCompletedAt = Date.parse(row.completed_at);
97
+ const runUpdatedAt = Date.parse(snapshotUpdatedAt ?? run.updated_at);
98
+ if (!Number.isFinite(taskCompletedAt) || !Number.isFinite(runUpdatedAt))
99
+ return true;
100
+ return taskCompletedAt >= runUpdatedAt;
101
+ }
102
+ function deriveWorkflowParentLifecycleDecision(options) {
103
+ const ineligible = () => ({
104
+ status: 'ineligible',
105
+ change: null,
106
+ linkedAuditInstanceId: null,
107
+ });
108
+ if (options.row.platform !== 'workflow' || options.row.workspace_id !== options.workspaceId) {
109
+ return ineligible();
110
+ }
111
+ const marker = parseWorkflowParentMarker(options.row.metadata);
112
+ if (!marker || marker.kind !== options.kind || marker.workflowRunId !== options.run.id) {
113
+ return ineligible();
114
+ }
115
+ const lifecycle = deriveWorkflowParentLifecycle(options.run);
116
+ if (!lifecycle)
117
+ return ineligible();
118
+ const linkedAuditInstanceId = marker.kind === 'workflow_ui_instance'
119
+ ? marker.uiInstanceId ?? null
120
+ : null;
121
+ if (lifecycleMatches(options.row, lifecycle)) {
122
+ return { status: 'unchanged', change: null, linkedAuditInstanceId };
123
+ }
124
+ if ((lifecycle.status === 'running' || lifecycle.status === 'pending')
125
+ && protectsNewerTerminalParent(options.row, options.run, options.snapshotUpdatedAt)) {
126
+ return { status: 'stale-suppressed', change: null, linkedAuditInstanceId: null };
127
+ }
128
+ const runStatus = options.run.status ?? 'pending';
129
+ const reason = runStatus === 'pending'
130
+ ? 'Persisted run is pending (or legacy statusless); no execution outcome is inferred.'
131
+ : `Persisted run status "${runStatus}" is projected to the parent lifecycle.`;
132
+ return {
133
+ status: 'changed',
134
+ linkedAuditInstanceId,
135
+ change: {
136
+ id: options.row.id,
137
+ kind: options.kind,
138
+ before: {
139
+ status: options.row.status,
140
+ error: options.row.error,
141
+ completedAt: options.row.completed_at,
142
+ durationMs: options.row.duration_ms,
143
+ },
144
+ after: lifecycle,
145
+ reason,
146
+ },
147
+ };
148
+ }
149
+ function deriveWorkflowParentLifecycleChange(options) {
150
+ return deriveWorkflowParentLifecycleDecision(options).change;
151
+ }
152
+ function applyWorkflowParentLifecycleChange(options, change) {
153
+ options.taskRepo.updateTaskLifecycle({
154
+ id: options.row.id,
155
+ status: change.after.status,
156
+ error: change.after.error,
157
+ completedAt: change.after.completedAt,
158
+ durationMs: change.after.durationMs,
159
+ workspaceId: options.workspaceId,
160
+ });
161
+ }
162
+ function syncWorkflowParentTaskLifecycle(options) {
163
+ const change = deriveWorkflowParentLifecycleDecision(options).change;
164
+ if (!change)
165
+ return false;
166
+ applyWorkflowParentLifecycleChange(options, change);
167
+ return true;
168
+ }
169
+ function evaluateWorkflowParentLifecycle(options) {
170
+ const evaluations = [];
171
+ for (const kind of options.parentKinds) {
172
+ const row = options.taskRepo.findWorkflowParentTask({
173
+ workspaceId: options.workspaceId,
174
+ workflowRunId: options.run.id,
175
+ kind,
176
+ });
177
+ if (!row)
178
+ continue;
179
+ evaluations.push({
180
+ kind,
181
+ row,
182
+ decision: deriveWorkflowParentLifecycleDecision({
183
+ row,
184
+ run: options.run,
185
+ workspaceId: options.workspaceId,
186
+ kind,
187
+ snapshotUpdatedAt: latestAuditEndedAt(options.run),
188
+ }),
189
+ });
190
+ }
191
+ return evaluations;
192
+ }
193
+ function buildWorkflowParentTaskLookup(workspaceId, rows) {
194
+ const rowsByKind = new Map();
195
+ for (const row of rows) {
196
+ if (row.platform !== 'workflow' || row.workspace_id !== workspaceId)
197
+ continue;
198
+ const marker = parseWorkflowParentMarker(row.metadata);
199
+ if (!marker)
200
+ continue;
201
+ const rowsByRunId = rowsByKind.get(marker.kind) ?? new Map();
202
+ if (!rowsByRunId.has(marker.workflowRunId)) {
203
+ rowsByRunId.set(marker.workflowRunId, row);
204
+ }
205
+ rowsByKind.set(marker.kind, rowsByRunId);
206
+ }
207
+ return {
208
+ findWorkflowParentTask: (lookup) => {
209
+ if (lookup.workspaceId !== workspaceId)
210
+ return undefined;
211
+ return rowsByKind.get(lookup.kind)?.get(lookup.workflowRunId);
212
+ },
213
+ };
214
+ }
215
+ function previewWorkflowParentRepair(options) {
216
+ const parentKinds = options.parentKinds ?? exports.WORKFLOW_PARENT_TASK_KINDS;
217
+ const changes = [];
218
+ const linkedAuditInstanceIds = new Set();
219
+ for (const { decision } of evaluateWorkflowParentLifecycle({
220
+ taskRepo: options.taskRepo,
221
+ run: options.run,
222
+ workspaceId: options.workspaceId,
223
+ parentKinds,
224
+ })) {
225
+ if (decision.linkedAuditInstanceId) {
226
+ linkedAuditInstanceIds.add(decision.linkedAuditInstanceId);
227
+ }
228
+ if (decision.change)
229
+ changes.push(decision.change);
230
+ }
231
+ return {
232
+ runId: options.run.id,
233
+ runStatus: options.run.status ?? 'pending',
234
+ changes,
235
+ linkedAuditInstanceIds: [...linkedAuditInstanceIds],
236
+ };
237
+ }
238
+ function createWorkflowParentPersistSink(options) {
239
+ const parentKinds = options.parentKinds ?? exports.WORKFLOW_PARENT_TASK_KINDS;
240
+ return (run) => {
241
+ const changedParentTaskIds = [];
242
+ const linkedAuditInstanceIds = new Set();
243
+ if (!deriveWorkflowParentLifecycle(run)) {
244
+ return { changedParentTaskIds, linkedAuditInstanceIds: [] };
245
+ }
246
+ for (const { kind, row, decision } of evaluateWorkflowParentLifecycle({
247
+ taskRepo: options.taskRepo,
248
+ run,
249
+ workspaceId: options.workspaceId,
250
+ parentKinds,
251
+ })) {
252
+ if (decision.linkedAuditInstanceId) {
253
+ linkedAuditInstanceIds.add(decision.linkedAuditInstanceId);
254
+ }
255
+ if (decision.change) {
256
+ applyWorkflowParentLifecycleChange({
257
+ taskRepo: options.taskRepo,
258
+ row,
259
+ run,
260
+ workspaceId: options.workspaceId,
261
+ kind,
262
+ snapshotUpdatedAt: latestAuditEndedAt(run),
263
+ }, decision.change);
264
+ changedParentTaskIds.push(row.id);
265
+ }
266
+ }
267
+ return { changedParentTaskIds, linkedAuditInstanceIds: [...linkedAuditInstanceIds] };
268
+ };
269
+ }
270
+ function isStale(startedAt, nowMs, graceMs) {
271
+ const startedAtMs = Date.parse(startedAt);
272
+ return Number.isFinite(startedAtMs) && nowMs - startedAtMs >= graceMs;
273
+ }
274
+ function createSkipCounts() {
275
+ return {};
276
+ }
277
+ function incrementSkipped(result, reason) {
278
+ result.skipped += 1;
279
+ const skippedBy = result.skippedBy ?? (result.skippedBy = {});
280
+ skippedBy[reason] = (skippedBy[reason] ?? 0) + 1;
281
+ }
282
+ function reconcileWorkflowParentTasks(options) {
283
+ const graceMs = options.orphanGraceMs ?? exports.WORKFLOW_PARENT_ORPHAN_GRACE_MS;
284
+ const nowMs = options.nowMs ?? Date.now();
285
+ const result = {
286
+ aligned: 0,
287
+ orphaned: 0,
288
+ scanned: 0,
289
+ skipped: 0,
290
+ skippedBy: createSkipCounts(),
291
+ };
292
+ const skip = (reason) => {
293
+ incrementSkipped(result, reason);
294
+ };
295
+ const workspacePathCache = new Map();
296
+ const resolveWorkspacePathCached = (workspaceId) => {
297
+ if (!workspacePathCache.has(workspaceId)) {
298
+ workspacePathCache.set(workspaceId, options.resolveWorkspacePath(workspaceId));
299
+ }
300
+ return workspacePathCache.get(workspaceId);
301
+ };
302
+ for (const row of options.taskRepo.findRunningWorkflowParentTasks()) {
303
+ result.scanned = (result.scanned ?? 0) + 1;
304
+ const marker = parseWorkflowParentMarker(row.metadata);
305
+ if (row.platform !== 'workflow' || !marker) {
306
+ skip('no-marker');
307
+ continue;
308
+ }
309
+ const workspaceId = row.workspace_id;
310
+ if (!workspaceId) {
311
+ skip('no-workspace-id');
312
+ continue;
313
+ }
314
+ const workspacePath = resolveWorkspacePathCached(workspaceId);
315
+ if (!workspacePath) {
316
+ skip('no-workspace-path');
317
+ continue;
318
+ }
319
+ const workflowRunId = marker.workflowRunId;
320
+ let run = null;
321
+ try {
322
+ run = options.loadRun(workspacePath, workflowRunId);
323
+ }
324
+ catch {
325
+ }
326
+ if (!run) {
327
+ if (row.status !== 'running' || !isStale(row.started_at, nowMs, graceMs)) {
328
+ skip(row.status === 'running' ? 'not-stale' : 'run-missing');
329
+ continue;
330
+ }
331
+ const completedAt = row.completed_at ?? new Date(nowMs).toISOString();
332
+ const durationMs = row.duration_ms ?? Math.max(0, nowMs - Date.parse(row.started_at));
333
+ options.taskRepo.updateTaskLifecycle({
334
+ id: row.id,
335
+ status: 'failed',
336
+ error: exports.WORKFLOW_PARENT_ORPHAN_ERROR,
337
+ completedAt,
338
+ durationMs: Number.isFinite(durationMs) ? durationMs : null,
339
+ workspaceId,
340
+ });
341
+ result.orphaned += 1;
342
+ continue;
343
+ }
344
+ const lifecycle = deriveWorkflowParentLifecycle(run);
345
+ if (!lifecycle) {
346
+ skip('not-stale');
347
+ continue;
348
+ }
349
+ if (lifecycleMatches(row, lifecycle))
350
+ continue;
351
+ const decision = deriveWorkflowParentLifecycleDecision({
352
+ row,
353
+ run,
354
+ workspaceId,
355
+ kind: marker.kind,
356
+ });
357
+ if (decision.status === 'stale-suppressed') {
358
+ skip('not-stale');
359
+ continue;
360
+ }
361
+ if (decision.change) {
362
+ applyWorkflowParentLifecycleChange({
363
+ taskRepo: options.taskRepo,
364
+ row,
365
+ run,
366
+ workspaceId,
367
+ kind: marker.kind,
368
+ }, decision.change);
369
+ result.aligned += 1;
370
+ }
371
+ }
372
+ return result;
373
+ }
374
+ function reconcileWorkflowParentRunFiles(options) {
375
+ const result = {
376
+ aligned: 0,
377
+ orphaned: 0,
378
+ skipped: 0,
379
+ skippedBy: createSkipCounts(),
380
+ runFilesScanned: 0,
381
+ };
382
+ for (const workspace of options.workspaces) {
383
+ if (!workspace.workspaceId) {
384
+ incrementSkipped(result, 'no-workspace-id');
385
+ continue;
386
+ }
387
+ if (!workspace.workspacePath) {
388
+ incrementSkipped(result, 'no-workspace-path');
389
+ continue;
390
+ }
391
+ const taskLookup = options.listWorkflowParentTasks
392
+ ? buildWorkflowParentTaskLookup(workspace.workspaceId, options.listWorkflowParentTasks(workspace.workspaceId))
393
+ : options.taskRepo;
394
+ let runIds = [];
395
+ try {
396
+ runIds = options.listRunIds(workspace.workspacePath);
397
+ }
398
+ catch {
399
+ incrementSkipped(result, 'no-workspace-path');
400
+ continue;
401
+ }
402
+ for (const workflowRunId of runIds) {
403
+ result.runFilesScanned = (result.runFilesScanned ?? 0) + 1;
404
+ let run = null;
405
+ try {
406
+ run = options.readRun(workspace.workspacePath, workflowRunId);
407
+ }
408
+ catch {
409
+ }
410
+ if (!run || typeof run.id !== 'string') {
411
+ incrementSkipped(result, 'run-missing');
412
+ continue;
413
+ }
414
+ const parentKinds = options.parentKinds ?? exports.WORKFLOW_PARENT_TASK_KINDS;
415
+ for (const { kind, row, decision } of evaluateWorkflowParentLifecycle({
416
+ taskRepo: taskLookup,
417
+ run,
418
+ workspaceId: workspace.workspaceId,
419
+ parentKinds,
420
+ })) {
421
+ if (decision.status === 'stale-suppressed') {
422
+ incrementSkipped(result, 'suppressed');
423
+ continue;
424
+ }
425
+ if (decision.status === 'ineligible') {
426
+ incrementSkipped(result, 'ineligible');
427
+ continue;
428
+ }
429
+ if (!decision.change)
430
+ continue;
431
+ applyWorkflowParentLifecycleChange({
432
+ taskRepo: options.taskRepo,
433
+ row,
434
+ run,
435
+ workspaceId: workspace.workspaceId,
436
+ kind,
437
+ snapshotUpdatedAt: latestAuditEndedAt(run),
438
+ }, decision.change);
439
+ result.aligned += 1;
440
+ }
441
+ }
442
+ }
443
+ return result;
444
+ }
445
+ //# sourceMappingURL=parent-task-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parent-task-sync.js","sourceRoot":"","sources":["../../src/parent-task-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { RetryPolicy } from './types';
2
+ export declare const RETRY_BASE_DELAY_MS = 1000;
3
+ export declare const RETRY_DEFAULT_MAX_DELAY_MS = 30000;
4
+ export declare const RETRY_HARD_MAX_DELAY_MS = 60000;
5
+ export declare const RETRY_MAX_ATTEMPTS_CEILING = 10;
6
+ export declare const DEFAULT_RETRYABLE_CODES: readonly ["NODE_EXIT_NONZERO", "NODE_TIMEOUT", "SPAWN_FAILED"];
7
+ export declare const RETRYABLE_NODE_TYPES: readonly ["agent_task", "skill_task", "shell_task"];
8
+ export type RetryPolicyParseResult = {
9
+ ok: true;
10
+ policy: RetryPolicy | undefined;
11
+ } | {
12
+ ok: false;
13
+ path: string;
14
+ reason: string;
15
+ };
16
+ export declare function parseRetryPolicy(node: unknown): RetryPolicyParseResult;
17
+ export interface RetryDecisionRun {
18
+ status?: 'pending' | 'running' | 'retrying' | 'completed' | 'failed' | 'cancelled';
19
+ last_failure?: {
20
+ failedNode?: unknown;
21
+ attempt?: unknown;
22
+ causeCode?: unknown;
23
+ };
24
+ node_attempts?: Record<string, unknown>;
25
+ }
26
+ export interface RetryDecisionInput {
27
+ policy?: RetryPolicy;
28
+ run: RetryDecisionRun;
29
+ nodeId: string;
30
+ }
31
+ export interface RetryDecision {
32
+ retry: boolean;
33
+ reason: string;
34
+ attempt?: number;
35
+ }
36
+ export declare function decideRetry(input: RetryDecisionInput): RetryDecision;
37
+ export declare function computeRetryDelayMs(policy: RetryPolicy, attempt: number): number;
38
+ //# sourceMappingURL=retry-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-policy.d.ts","sourceRoot":"","sources":["../../src/retry-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EAEZ,MAAM,SAAS,CAAC;AAGjB,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AACzC,eAAO,MAAM,0BAA0B,QAAS,CAAC;AACjD,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,eAAO,MAAM,uBAAuB,gEAIe,CAAC;AAEpD,eAAO,MAAM,oBAAoB,qDAIvB,CAAC;AAmBX,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAWhD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,sBAAsB,CA4DtE;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACnF,YAAY,CAAC,EAAE;QACb,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,EAAE,gBAAgB,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAOD,wBAAgB,WAAW,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CA8BpE;AAGD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAShF"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RETRYABLE_NODE_TYPES = exports.DEFAULT_RETRYABLE_CODES = exports.RETRY_MAX_ATTEMPTS_CEILING = exports.RETRY_HARD_MAX_DELAY_MS = exports.RETRY_DEFAULT_MAX_DELAY_MS = exports.RETRY_BASE_DELAY_MS = void 0;
4
+ exports.parseRetryPolicy = parseRetryPolicy;
5
+ exports.decideRetry = decideRetry;
6
+ exports.computeRetryDelayMs = computeRetryDelayMs;
7
+ const types_1 = require("./types");
8
+ exports.RETRY_BASE_DELAY_MS = 1000;
9
+ exports.RETRY_DEFAULT_MAX_DELAY_MS = 30000;
10
+ exports.RETRY_HARD_MAX_DELAY_MS = 60000;
11
+ exports.RETRY_MAX_ATTEMPTS_CEILING = 10;
12
+ exports.DEFAULT_RETRYABLE_CODES = [
13
+ 'NODE_EXIT_NONZERO',
14
+ 'NODE_TIMEOUT',
15
+ 'SPAWN_FAILED',
16
+ ];
17
+ exports.RETRYABLE_NODE_TYPES = [
18
+ 'agent_task',
19
+ 'skill_task',
20
+ 'shell_task',
21
+ ];
22
+ const FAILURE_CODES = new Set([
23
+ 'CLI_UNRESOLVABLE',
24
+ 'SPAWN_FAILED',
25
+ 'NODE_TIMEOUT',
26
+ 'NODE_EXIT_NONZERO',
27
+ 'OUTPUT_INVALID',
28
+ 'RATE_LIMITED',
29
+ 'CONFIG_INVALID',
30
+ 'INTERRUPTED',
31
+ 'CANCELLED',
32
+ 'UNKNOWN',
33
+ ]);
34
+ function isRecord(value) {
35
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
36
+ }
37
+ function invalid(path, reason) {
38
+ return { ok: false, path, reason };
39
+ }
40
+ function parseRetryPolicy(node) {
41
+ if (!isRecord(node))
42
+ return invalid('retry', 'node must be an object');
43
+ const rawRetry = node.retry;
44
+ if (rawRetry === undefined)
45
+ return { ok: true, policy: undefined };
46
+ if (!isRecord(rawRetry))
47
+ return invalid('retry', 'retry must be an object');
48
+ const nodeType = node.type;
49
+ if (typeof nodeType !== 'string'
50
+ || !exports.RETRYABLE_NODE_TYPES.includes(nodeType)) {
51
+ return invalid('retry', 'retry is only supported on agent_task, skill_task, and shell_task nodes');
52
+ }
53
+ const max = rawRetry.max;
54
+ if (typeof max !== 'number' || !Number.isFinite(max)) {
55
+ return invalid('retry.max', 'retry.max must be a finite number');
56
+ }
57
+ if (!Number.isInteger(max))
58
+ return invalid('retry.max', 'retry.max must be an integer');
59
+ if (max < 0 || max > exports.RETRY_MAX_ATTEMPTS_CEILING) {
60
+ return invalid('retry.max', `retry.max must be between 0 and ${exports.RETRY_MAX_ATTEMPTS_CEILING}`);
61
+ }
62
+ const delay = rawRetry.delay;
63
+ if (delay !== 'fixed' && delay !== 'exponential') {
64
+ return invalid('retry.delay', 'retry.delay must be "fixed" or "exponential"');
65
+ }
66
+ let maxDelay = exports.RETRY_DEFAULT_MAX_DELAY_MS;
67
+ if (rawRetry.max_delay !== undefined) {
68
+ if (typeof rawRetry.max_delay !== 'number' || !Number.isFinite(rawRetry.max_delay)) {
69
+ return invalid('retry.max_delay', 'retry.max_delay must be a finite number');
70
+ }
71
+ if (!Number.isInteger(rawRetry.max_delay) || rawRetry.max_delay < 0) {
72
+ return invalid('retry.max_delay', 'retry.max_delay must be a non-negative integer');
73
+ }
74
+ maxDelay = rawRetry.max_delay;
75
+ }
76
+ let on = [...exports.DEFAULT_RETRYABLE_CODES];
77
+ if (rawRetry.on !== undefined) {
78
+ if (!Array.isArray(rawRetry.on))
79
+ return invalid('retry.on', 'retry.on must be an array');
80
+ on = [];
81
+ for (const [index, candidate] of rawRetry.on.entries()) {
82
+ if (typeof candidate !== 'string' || !FAILURE_CODES.has(candidate)) {
83
+ return invalid(`retry.on[${index}]`, `retry.on[${index}] is not a supported workflow failure code`);
84
+ }
85
+ const code = candidate;
86
+ if (types_1.NEVER_RETRYABLE.includes(code)) {
87
+ return invalid(`retry.on[${index}]`, `${code} cannot be retried`);
88
+ }
89
+ on.push(code);
90
+ }
91
+ }
92
+ return {
93
+ ok: true,
94
+ policy: { max, delay, max_delay: maxDelay, on },
95
+ };
96
+ }
97
+ function declined(reason) {
98
+ return { retry: false, reason };
99
+ }
100
+ function decideRetry(input) {
101
+ const { policy, run, nodeId } = input;
102
+ if (!policy)
103
+ return declined('retry policy is not configured');
104
+ if (run.status !== 'failed')
105
+ return declined('run is not failed');
106
+ const failure = run.last_failure;
107
+ if (!failure || failure.failedNode !== nodeId)
108
+ return declined('latest failure is not for this node');
109
+ const attempt = failure.attempt;
110
+ const storedAttempt = run.node_attempts?.[nodeId];
111
+ if (typeof attempt !== 'number'
112
+ || !Number.isInteger(attempt)
113
+ || attempt <= 0
114
+ || storedAttempt !== attempt) {
115
+ return declined('latest attempt is stale');
116
+ }
117
+ const causeCode = failure.causeCode;
118
+ if (typeof causeCode !== 'string')
119
+ return declined('latest failure has no supported cause');
120
+ if (types_1.NEVER_RETRYABLE.includes(causeCode)) {
121
+ return declined('latest failure is never retryable');
122
+ }
123
+ if (!policy.on.includes(causeCode)) {
124
+ return declined('latest failure is outside the retry policy');
125
+ }
126
+ if (attempt >= policy.max + 1)
127
+ return declined('retry budget is exhausted');
128
+ return { retry: true, reason: 'retry policy matched', attempt };
129
+ }
130
+ function computeRetryDelayMs(policy, attempt) {
131
+ const safeAttempt = Number.isInteger(attempt) && attempt > 0 ? attempt : 1;
132
+ const base = policy.delay === 'exponential'
133
+ ? exports.RETRY_BASE_DELAY_MS * (2 ** (safeAttempt - 1))
134
+ : exports.RETRY_BASE_DELAY_MS;
135
+ const configuredCap = typeof policy.max_delay === 'number' && Number.isFinite(policy.max_delay)
136
+ ? Math.max(0, policy.max_delay)
137
+ : exports.RETRY_DEFAULT_MAX_DELAY_MS;
138
+ return Math.min(base, configuredCap, exports.RETRY_HARD_MAX_DELAY_MS);
139
+ }
140
+ //# sourceMappingURL=retry-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-policy.js","sourceRoot":"","sources":["../../src/retry-policy.ts"],"names":[],"mappings":"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"}