@crewx/workflow 0.3.22-rc.14 → 0.3.22-rc.140

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 (46) hide show
  1. package/SKILL.md +40 -4
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +266 -9
  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 +68 -2
  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/mermaid.d.ts.map +1 -1
  18. package/dist/src/mermaid.js +7 -4
  19. package/dist/src/mermaid.js.map +1 -1
  20. package/dist/src/parent-task-sync.d.ts +120 -0
  21. package/dist/src/parent-task-sync.d.ts.map +1 -0
  22. package/dist/src/parent-task-sync.js +307 -0
  23. package/dist/src/parent-task-sync.js.map +1 -0
  24. package/dist/src/retry-policy.d.ts +38 -0
  25. package/dist/src/retry-policy.d.ts.map +1 -0
  26. package/dist/src/retry-policy.js +140 -0
  27. package/dist/src/retry-policy.js.map +1 -0
  28. package/dist/src/run-manager.d.ts +35 -2
  29. package/dist/src/run-manager.d.ts.map +1 -1
  30. package/dist/src/run-manager.js +1182 -219
  31. package/dist/src/run-manager.js.map +1 -1
  32. package/dist/src/types.d.ts +39 -4
  33. package/dist/src/types.d.ts.map +1 -1
  34. package/dist/src/types.js +2 -0
  35. package/dist/src/types.js.map +1 -1
  36. package/dist/src/utils/output-format.d.ts +12 -0
  37. package/dist/src/utils/output-format.d.ts.map +1 -1
  38. package/dist/src/utils/output-format.js +103 -5
  39. package/dist/src/utils/output-format.js.map +1 -1
  40. package/dist/src/workflow-persistence.d.ts +48 -0
  41. package/dist/src/workflow-persistence.d.ts.map +1 -0
  42. package/dist/src/workflow-persistence.js +224 -0
  43. package/dist/src/workflow-persistence.js.map +1 -0
  44. package/dist/workflow-schema.json +34 -5
  45. package/package.json +14 -4
  46. package/workflow-schema.json +34 -5
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getStableCauseMessage = getStableCauseMessage;
4
+ exports.createWorkflowFailureError = createWorkflowFailureError;
5
+ exports.getWorkflowFailureCode = getWorkflowFailureCode;
6
+ exports.classifyWorkflowFailure = classifyWorkflowFailure;
7
+ exports.buildNodeFailure = buildNodeFailure;
8
+ exports.buildEvidencePreview = buildEvidencePreview;
9
+ exports.sanitizeLocalRunError = sanitizeLocalRunError;
10
+ exports.readNodeAttempt = readNodeAttempt;
11
+ const sdk_1 = require("@crewx/sdk");
12
+ const STABLE_CAUSE_MESSAGES = {
13
+ CLI_UNRESOLVABLE: 'CrewX CLI executable could not be resolved.',
14
+ SPAWN_FAILED: 'The node process could not be started.',
15
+ NODE_TIMEOUT: 'The node execution exceeded its timeout.',
16
+ NODE_EXIT_NONZERO: 'The node process exited with a non-zero status.',
17
+ OUTPUT_INVALID: 'The node output did not match the required format.',
18
+ CONFIG_INVALID: 'The workflow node configuration is invalid.',
19
+ INTERRUPTED: 'The node execution was interrupted.',
20
+ CANCELLED: 'The workflow run was cancelled.',
21
+ UNKNOWN: 'The node execution failed.',
22
+ };
23
+ const PERSISTED_FAILURE_CODES = new Set(Object.keys(STABLE_CAUSE_MESSAGES));
24
+ function getStableCauseMessage(code) {
25
+ return STABLE_CAUSE_MESSAGES[code];
26
+ }
27
+ function createWorkflowFailureError(code, message) {
28
+ const error = new Error(message);
29
+ error.code = code;
30
+ return error;
31
+ }
32
+ function getWorkflowFailureCode(error) {
33
+ if (!error || typeof error !== 'object')
34
+ return undefined;
35
+ const code = error.code;
36
+ return typeof code === 'string' && PERSISTED_FAILURE_CODES.has(code)
37
+ ? code
38
+ : undefined;
39
+ }
40
+ function classifyWorkflowFailure(input) {
41
+ const typedCode = input.errorCode;
42
+ if (typedCode === 'CLI_UNRESOLVABLE')
43
+ return 'CLI_UNRESOLVABLE';
44
+ if (typedCode === 'CONFIG_INVALID')
45
+ return 'CONFIG_INVALID';
46
+ if (typedCode === 'OUTPUT_INVALID')
47
+ return 'OUTPUT_INVALID';
48
+ if (typedCode === 'CANCELLED')
49
+ return 'CANCELLED';
50
+ if (typedCode === 'INTERRUPTED')
51
+ return 'INTERRUPTED';
52
+ if (typedCode === 'UNKNOWN')
53
+ return 'UNKNOWN';
54
+ const processResult = input.process;
55
+ if (!processResult)
56
+ return 'UNKNOWN';
57
+ if (processResult.errorOrigin === 'spawn')
58
+ return 'SPAWN_FAILED';
59
+ if (processResult.timedOut)
60
+ return 'NODE_TIMEOUT';
61
+ if (processResult.signal !== null)
62
+ return 'INTERRUPTED';
63
+ if (processResult.errorOrigin === 'post_spawn' || processResult.errorOrigin === 'stdin') {
64
+ return 'UNKNOWN';
65
+ }
66
+ if (typeof processResult.status === 'number' && processResult.status !== 0) {
67
+ return 'NODE_EXIT_NONZERO';
68
+ }
69
+ return 'UNKNOWN';
70
+ }
71
+ function buildNodeFailure(input) {
72
+ const exitCode = input.causeCode === 'NODE_EXIT_NONZERO' && typeof input.exitCode === 'number'
73
+ ? input.exitCode
74
+ : null;
75
+ const signal = input.causeCode === 'INTERRUPTED' ? input.signal : null;
76
+ return {
77
+ failedNode: input.failedNode,
78
+ attempt: input.attempt,
79
+ causeCode: input.causeCode,
80
+ causeMessage: getStableCauseMessage(input.causeCode),
81
+ exitCode,
82
+ evidencePreview: buildEvidencePreview({
83
+ causeCode: input.causeCode,
84
+ exitCode,
85
+ signal,
86
+ errorOrigin: input.errorOrigin,
87
+ timedOut: input.timedOut ?? false,
88
+ }),
89
+ occurredAt: input.occurredAt ?? new Date().toISOString(),
90
+ };
91
+ }
92
+ function buildEvidencePreview(input) {
93
+ switch (input.causeCode) {
94
+ case 'NODE_EXIT_NONZERO':
95
+ return typeof input.exitCode === 'number' ? `exit code: ${input.exitCode}` : null;
96
+ case 'NODE_TIMEOUT':
97
+ return input.timedOut ? 'timeout' : null;
98
+ case 'SPAWN_FAILED':
99
+ return input.errorOrigin === 'spawn' ? 'origin: spawn' : null;
100
+ case 'INTERRUPTED':
101
+ return input.signal === null ? null : `signal: ${input.signal}`;
102
+ case 'UNKNOWN':
103
+ return input.errorOrigin === 'post_spawn' || input.errorOrigin === 'stdin'
104
+ ? `origin: ${input.errorOrigin}`
105
+ : null;
106
+ default:
107
+ return null;
108
+ }
109
+ }
110
+ function sanitizeLocalRunError(raw, fallback) {
111
+ try {
112
+ return (0, sdk_1.redactTechnicalMessage)(raw) ?? fallback;
113
+ }
114
+ catch {
115
+ return fallback;
116
+ }
117
+ }
118
+ function readNodeAttempt(run, nodeId) {
119
+ const attempt = run.node_attempts?.[nodeId];
120
+ return typeof attempt === 'number' && Number.isInteger(attempt) && attempt > 0 ? attempt : 1;
121
+ }
122
+ //# sourceMappingURL=failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure.js","sourceRoot":"","sources":["../../src/failure.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/mermaid.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAA0B,MAAM,SAAS,CAAC;AAQpE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAMD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CASpD;AAkFD,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA0EpD"}
1
+ {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/mermaid.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAA0B,MAAM,SAAS,CAAC;AAQpE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAMD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CASpD;AAoFD,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA0EpD"}
@@ -22,6 +22,8 @@ function escapeMermaidLabel(s) {
22
22
  function buildLabel(nodeId, node) {
23
23
  if (node.type === 'end')
24
24
  return 'END';
25
+ if (node.type === 'error')
26
+ return 'ERROR';
25
27
  let subtitle = '';
26
28
  if (node.agent) {
27
29
  subtitle = `@${escapeMermaidLabel(node.agent)}`;
@@ -44,7 +46,7 @@ function buildLabel(nodeId, node) {
44
46
  }
45
47
  function wrapShape(nodeId, label, type) {
46
48
  const safe = safeNodeId(nodeId);
47
- if (type === 'end') {
49
+ if (type === 'end' || type === 'error') {
48
50
  return `${safe}(("${label}"))`;
49
51
  }
50
52
  const q = `"\`${label}\`"`;
@@ -68,6 +70,7 @@ function wrapShape(nodeId, label, type) {
68
70
  const NODE_STYLES = {
69
71
  approval: 'fill:#e0f2fe,stroke:#93c5fd,color:#1e3a5f',
70
72
  expression: 'fill:#fef3c7,stroke:#f59e0b,color:#78350f',
73
+ error: 'fill:#fee2e2,stroke:#f87171,color:#7f1d1d',
71
74
  };
72
75
  function toMermaid(spec) {
73
76
  const lines = ['flowchart TD'];
@@ -84,7 +87,7 @@ function toMermaid(spec) {
84
87
  }
85
88
  if (node.type === 'branch' && node.branches && !Array.isArray(node.branches)) {
86
89
  for (const [condLabel, target] of Object.entries(node.branches)) {
87
- const edgeLabel = escapeMermaidLabel(condLabel === 'true' ? '통과' : condLabel === 'false' ? '반려' : condLabel);
90
+ const edgeLabel = escapeMermaidLabel(condLabel === 'true' ? 'Approve' : condLabel === 'false' ? 'Reject' : condLabel);
88
91
  lines.push(` ${src} -->|${edgeLabel}| ${safeNodeId(target)}`);
89
92
  }
90
93
  }
@@ -103,10 +106,10 @@ function toMermaid(spec) {
103
106
  }
104
107
  if (node.type === 'approval') {
105
108
  if (node.on_approve) {
106
- lines.push(` ${src} -->|${escapeMermaidLabel('승인')}| ${safeNodeId(node.on_approve)}`);
109
+ lines.push(` ${src} -->|${escapeMermaidLabel('Approve')}| ${safeNodeId(node.on_approve)}`);
107
110
  }
108
111
  if (node.on_reject) {
109
- lines.push(` ${src} -->|${escapeMermaidLabel('반려')}| ${safeNodeId(node.on_reject)}`);
112
+ lines.push(` ${src} -->|${escapeMermaidLabel('Reject')}| ${safeNodeId(node.on_reject)}`);
110
113
  }
111
114
  }
112
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../src/mermaid.ts"],"names":[],"mappings":";;AAeA,gCAEC;AAMD,gDASC;AAkFD,8BA0EC;AAlLD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW;CACnF,CAAC,CAAC;AAGH,SAAgB,UAAU,CAAC,MAAc;IACvC,OAAO,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAClE,CAAC;AAMD,SAAgB,kBAAkB,CAAC,CAAS;IAC1C,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAOD,SAAS,UAAU,CAAC,MAAc,EAAE,IAAkB;IAEpD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAGtC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,QAAQ,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IAClD,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACpD,QAAQ,GAAG,SAAS,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACvD,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,QAAQ,GAAG,KAAK,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC1E,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,QAAQ;QACrB,CAAC,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,QAAQ,GAAG;QAC9C,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAG/B,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,MAAM,GAAG,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,MAAM,MAAM,WAAW,EAAE,CAAC;AACvC,CAAC;AAcD,SAAS,SAAS,CAAC,MAAc,EAAE,KAAa,EAAE,IAAY;IAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEhC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,GAAG,IAAI,MAAM,KAAK,KAAK,CAAC;IACjC,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,KAAK,KAAK,CAAC;IAC3B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACzB,KAAK,YAAY;YACf,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC;QAC3B,KAAK,UAAU;YACb,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC;QAC3B,KAAK,MAAM;YACT,OAAO,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC;QAC7B,KAAK,YAAY;YACf,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC;QAC3B,KAAK,YAAY;YACf,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC;QAC3B;YACE,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAC3B,CAAC;AACH,CAAC;AAGD,MAAM,WAAW,GAA2B;IAC1C,QAAQ,EAAE,2CAA2C;IACrD,UAAU,EAAE,2CAA2C;CACxD,CAAC;AAKF,SAAgB,SAAS,CAAC,IAAkB;IAC1C,MAAM,KAAK,GAAa,CAAC,cAAc,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAGzB,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAGf,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAE/B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7E,KAAK,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChE,MAAM,SAAS,GAAG,kBAAkB,CAClC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CACvE,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,SAAS,KAAK,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAErC,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;oBACnC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;wBACtB,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,QAAQ,CAAC,QAAQ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACvE,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,kBAAkB,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACzF,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,kBAAkB,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;IACH,CAAC;IAGD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;IAClD,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9B,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;QACtC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../src/mermaid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import type { RunExecution } from './types.js';
2
+ export type WorkflowParentTaskStatus = 'pending' | 'running' | 'success' | 'failed';
3
+ export type WorkflowParentTaskKind = 'workflow_card' | 'workflow_ui_instance';
4
+ export interface WorkflowParentTaskLookup {
5
+ workspaceId: string;
6
+ workflowRunId: string;
7
+ kind: WorkflowParentTaskKind;
8
+ }
9
+ export interface WorkflowParentLifecycle {
10
+ status: WorkflowParentTaskStatus;
11
+ error: string | null;
12
+ completedAt: string | null;
13
+ durationMs: number | null;
14
+ }
15
+ export interface WorkflowParentLifecycleSnapshot {
16
+ status: string;
17
+ error: string | null;
18
+ completedAt: string | null;
19
+ durationMs: number | null;
20
+ }
21
+ export interface WorkflowParentLifecycleChange {
22
+ id: string;
23
+ kind: WorkflowParentTaskKind;
24
+ before: WorkflowParentLifecycleSnapshot;
25
+ after: WorkflowParentLifecycle;
26
+ reason: string;
27
+ }
28
+ export interface WorkflowParentTaskRow {
29
+ id: string;
30
+ agent_id: string;
31
+ thread_id: string | null;
32
+ workspace_id: string | null;
33
+ platform: string | null;
34
+ status: string;
35
+ error: string | null;
36
+ completed_at: string | null;
37
+ duration_ms: number | null;
38
+ started_at: string;
39
+ metadata: string | null;
40
+ }
41
+ export interface WorkflowParentTaskRepository {
42
+ findRunningWorkflowParentTasks(): WorkflowParentTaskRow[];
43
+ updateTaskLifecycle(opts: {
44
+ id: string;
45
+ status: WorkflowParentTaskStatus;
46
+ error: string | null;
47
+ completedAt: string | null;
48
+ durationMs: number | null;
49
+ workspaceId: string;
50
+ }): void;
51
+ }
52
+ export interface WorkflowParentPersistTaskRepository {
53
+ findWorkflowParentTask(opts: WorkflowParentTaskLookup): WorkflowParentTaskRow | undefined;
54
+ updateTaskLifecycle: WorkflowParentTaskRepository['updateTaskLifecycle'];
55
+ }
56
+ export interface SyncWorkflowParentTaskLifecycleOptions {
57
+ taskRepo: Pick<WorkflowParentPersistTaskRepository, 'updateTaskLifecycle'>;
58
+ row: WorkflowParentTaskRow;
59
+ run: RunExecution;
60
+ workspaceId: string;
61
+ kind: WorkflowParentTaskKind;
62
+ snapshotUpdatedAt?: string | null;
63
+ }
64
+ export interface WorkflowParentPersistSinkOptions {
65
+ taskRepo: WorkflowParentPersistTaskRepository;
66
+ workspaceId: string;
67
+ parentKinds?: readonly WorkflowParentTaskKind[];
68
+ }
69
+ export interface WorkflowParentPersistResult {
70
+ changedParentTaskIds: string[];
71
+ linkedAuditInstanceIds: string[];
72
+ }
73
+ export interface DeriveWorkflowParentLifecycleChangeOptions {
74
+ row: WorkflowParentTaskRow;
75
+ run: RunExecution;
76
+ workspaceId: string;
77
+ kind: WorkflowParentTaskKind;
78
+ snapshotUpdatedAt?: string | null;
79
+ }
80
+ export type WorkflowParentLifecycleDecisionStatus = 'ineligible' | 'unchanged' | 'stale-suppressed' | 'changed';
81
+ export interface WorkflowParentLifecycleDecision {
82
+ status: WorkflowParentLifecycleDecisionStatus;
83
+ change: WorkflowParentLifecycleChange | null;
84
+ linkedAuditInstanceId: string | null;
85
+ }
86
+ export interface PreviewWorkflowParentRepairOptions {
87
+ taskRepo: Pick<WorkflowParentPersistTaskRepository, 'findWorkflowParentTask'>;
88
+ run: RunExecution;
89
+ workspaceId: string;
90
+ parentKinds?: readonly WorkflowParentTaskKind[];
91
+ }
92
+ export interface WorkflowParentRepairPreview {
93
+ runId: string;
94
+ runStatus: NonNullable<RunExecution['status']>;
95
+ changes: WorkflowParentLifecycleChange[];
96
+ linkedAuditInstanceIds: string[];
97
+ }
98
+ export interface ReconcileWorkflowParentTasksOptions {
99
+ taskRepo: WorkflowParentTaskRepository;
100
+ resolveWorkspacePath: (workspaceId: string) => string | undefined;
101
+ loadRun: (workspacePath: string, workflowRunId: string) => RunExecution | null;
102
+ orphanGraceMs?: number;
103
+ nowMs?: number;
104
+ }
105
+ export interface WorkflowParentReconciliationResult {
106
+ aligned: number;
107
+ orphaned: number;
108
+ skipped: number;
109
+ }
110
+ export declare const WORKFLOW_PARENT_ORPHAN_GRACE_MS: number;
111
+ export declare const WORKFLOW_PARENT_ORPHAN_ERROR = "Workflow run file missing after grace period (orphaned workflow task)";
112
+ export declare const WORKFLOW_PARENT_TASK_KINDS: readonly WorkflowParentTaskKind[];
113
+ export declare function deriveWorkflowParentLifecycle(run: RunExecution): WorkflowParentLifecycle | null;
114
+ export declare function deriveWorkflowParentLifecycleDecision(options: DeriveWorkflowParentLifecycleChangeOptions): WorkflowParentLifecycleDecision;
115
+ export declare function deriveWorkflowParentLifecycleChange(options: DeriveWorkflowParentLifecycleChangeOptions): WorkflowParentLifecycleChange | null;
116
+ export declare function syncWorkflowParentTaskLifecycle(options: SyncWorkflowParentTaskLifecycleOptions): boolean;
117
+ export declare function previewWorkflowParentRepair(options: PreviewWorkflowParentRepairOptions): WorkflowParentRepairPreview;
118
+ export declare function createWorkflowParentPersistSink(options: WorkflowParentPersistSinkOptions): (run: RunExecution) => WorkflowParentPersistResult;
119
+ export declare function reconcileWorkflowParentTasks(options: ReconcileWorkflowParentTasksOptions): WorkflowParentReconciliationResult;
120
+ //# sourceMappingURL=parent-task-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parent-task-sync.d.ts","sourceRoot":"","sources":["../../src/parent-task-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,307 @@
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.WORKFLOW_PARENT_ORPHAN_GRACE_MS = 10 * 60 * 1000;
12
+ exports.WORKFLOW_PARENT_ORPHAN_ERROR = 'Workflow run file missing after grace period (orphaned workflow task)';
13
+ exports.WORKFLOW_PARENT_TASK_KINDS = [
14
+ 'workflow_card',
15
+ 'workflow_ui_instance',
16
+ ];
17
+ function latestAuditEndedAt(run) {
18
+ let latest;
19
+ for (const entry of run.audit ?? []) {
20
+ const timestamp = Date.parse(entry.ended_at);
21
+ if (!Number.isFinite(timestamp))
22
+ continue;
23
+ if (!latest || timestamp >= latest.timestamp) {
24
+ latest = { value: entry.ended_at, timestamp };
25
+ }
26
+ }
27
+ return latest?.value ?? null;
28
+ }
29
+ function deriveWorkflowParentLifecycle(run) {
30
+ if (run.status === 'completed' || run.status === 'failed' || run.status === 'cancelled') {
31
+ const completedAt = latestAuditEndedAt(run) ?? run.updated_at;
32
+ const createdAtMs = Date.parse(run.created_at);
33
+ const completedAtMs = Date.parse(completedAt);
34
+ const durationMs = Number.isFinite(createdAtMs) && Number.isFinite(completedAtMs)
35
+ ? Math.max(0, completedAtMs - createdAtMs)
36
+ : null;
37
+ if (run.status === 'completed') {
38
+ return { status: 'success', error: null, completedAt, durationMs };
39
+ }
40
+ return {
41
+ status: 'failed',
42
+ error: run.error ?? (run.status === 'cancelled' ? 'Workflow run cancelled' : 'Workflow run failed'),
43
+ completedAt,
44
+ durationMs,
45
+ };
46
+ }
47
+ if (run.status === 'running' || run.status === 'retrying') {
48
+ return { status: 'running', error: null, completedAt: null, durationMs: null };
49
+ }
50
+ if (run.status === 'pending' || run.status === undefined) {
51
+ return { status: 'pending', error: null, completedAt: null, durationMs: null };
52
+ }
53
+ return null;
54
+ }
55
+ function parseWorkflowParentMarker(metadata) {
56
+ if (!metadata)
57
+ return null;
58
+ try {
59
+ const parsed = JSON.parse(metadata);
60
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
61
+ return null;
62
+ const record = parsed;
63
+ return (record.kind === 'workflow_card' || record.kind === 'workflow_ui_instance') && typeof record.workflowRunId === 'string'
64
+ ? {
65
+ kind: record.kind,
66
+ workflowRunId: record.workflowRunId,
67
+ ...(typeof record.uiInstanceId === 'string' && record.uiInstanceId.trim()
68
+ ? { uiInstanceId: record.uiInstanceId.trim() }
69
+ : {}),
70
+ }
71
+ : null;
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ function lifecycleMatches(row, lifecycle) {
78
+ return row.status === lifecycle.status
79
+ && row.error === lifecycle.error
80
+ && row.completed_at === lifecycle.completedAt
81
+ && row.duration_ms === lifecycle.durationMs;
82
+ }
83
+ function isTerminalParentStatus(status) {
84
+ return status === 'success'
85
+ || status === 'completed'
86
+ || status === 'failed'
87
+ || status === 'cancelled'
88
+ || status === 'error';
89
+ }
90
+ function protectsNewerTerminalParent(row, run, snapshotUpdatedAt) {
91
+ if (!isTerminalParentStatus(row.status))
92
+ return false;
93
+ if (!row.completed_at)
94
+ return false;
95
+ const taskCompletedAt = Date.parse(row.completed_at);
96
+ const runUpdatedAt = Date.parse(snapshotUpdatedAt ?? run.updated_at);
97
+ if (!Number.isFinite(taskCompletedAt) || !Number.isFinite(runUpdatedAt))
98
+ return true;
99
+ return taskCompletedAt >= runUpdatedAt;
100
+ }
101
+ function deriveWorkflowParentLifecycleDecision(options) {
102
+ const ineligible = () => ({
103
+ status: 'ineligible',
104
+ change: null,
105
+ linkedAuditInstanceId: null,
106
+ });
107
+ if (options.row.platform !== 'workflow' || options.row.workspace_id !== options.workspaceId) {
108
+ return ineligible();
109
+ }
110
+ const marker = parseWorkflowParentMarker(options.row.metadata);
111
+ if (!marker || marker.kind !== options.kind || marker.workflowRunId !== options.run.id) {
112
+ return ineligible();
113
+ }
114
+ const lifecycle = deriveWorkflowParentLifecycle(options.run);
115
+ if (!lifecycle)
116
+ return ineligible();
117
+ const linkedAuditInstanceId = marker.kind === 'workflow_ui_instance'
118
+ ? marker.uiInstanceId ?? null
119
+ : null;
120
+ if (lifecycleMatches(options.row, lifecycle)) {
121
+ return { status: 'unchanged', change: null, linkedAuditInstanceId };
122
+ }
123
+ if ((lifecycle.status === 'running' || lifecycle.status === 'pending')
124
+ && protectsNewerTerminalParent(options.row, options.run, options.snapshotUpdatedAt)) {
125
+ return { status: 'stale-suppressed', change: null, linkedAuditInstanceId: null };
126
+ }
127
+ const runStatus = options.run.status ?? 'pending';
128
+ const reason = runStatus === 'pending'
129
+ ? 'Persisted run is pending (or legacy statusless); no execution outcome is inferred.'
130
+ : `Persisted run status "${runStatus}" is projected to the parent lifecycle.`;
131
+ return {
132
+ status: 'changed',
133
+ linkedAuditInstanceId,
134
+ change: {
135
+ id: options.row.id,
136
+ kind: options.kind,
137
+ before: {
138
+ status: options.row.status,
139
+ error: options.row.error,
140
+ completedAt: options.row.completed_at,
141
+ durationMs: options.row.duration_ms,
142
+ },
143
+ after: lifecycle,
144
+ reason,
145
+ },
146
+ };
147
+ }
148
+ function deriveWorkflowParentLifecycleChange(options) {
149
+ return deriveWorkflowParentLifecycleDecision(options).change;
150
+ }
151
+ function applyWorkflowParentLifecycleChange(options, change) {
152
+ options.taskRepo.updateTaskLifecycle({
153
+ id: options.row.id,
154
+ status: change.after.status,
155
+ error: change.after.error,
156
+ completedAt: change.after.completedAt,
157
+ durationMs: change.after.durationMs,
158
+ workspaceId: options.workspaceId,
159
+ });
160
+ }
161
+ function syncWorkflowParentTaskLifecycle(options) {
162
+ const change = deriveWorkflowParentLifecycleDecision(options).change;
163
+ if (!change)
164
+ return false;
165
+ applyWorkflowParentLifecycleChange(options, change);
166
+ return true;
167
+ }
168
+ function previewWorkflowParentRepair(options) {
169
+ const parentKinds = options.parentKinds ?? exports.WORKFLOW_PARENT_TASK_KINDS;
170
+ const changes = [];
171
+ const linkedAuditInstanceIds = new Set();
172
+ for (const kind of parentKinds) {
173
+ const row = options.taskRepo.findWorkflowParentTask({
174
+ workspaceId: options.workspaceId,
175
+ workflowRunId: options.run.id,
176
+ kind,
177
+ });
178
+ if (!row)
179
+ continue;
180
+ const decision = deriveWorkflowParentLifecycleDecision({
181
+ row,
182
+ run: options.run,
183
+ workspaceId: options.workspaceId,
184
+ kind,
185
+ snapshotUpdatedAt: latestAuditEndedAt(options.run),
186
+ });
187
+ if (decision.linkedAuditInstanceId) {
188
+ linkedAuditInstanceIds.add(decision.linkedAuditInstanceId);
189
+ }
190
+ if (decision.change)
191
+ changes.push(decision.change);
192
+ }
193
+ return {
194
+ runId: options.run.id,
195
+ runStatus: options.run.status ?? 'pending',
196
+ changes,
197
+ linkedAuditInstanceIds: [...linkedAuditInstanceIds],
198
+ };
199
+ }
200
+ function createWorkflowParentPersistSink(options) {
201
+ const parentKinds = options.parentKinds ?? exports.WORKFLOW_PARENT_TASK_KINDS;
202
+ return (run) => {
203
+ const changedParentTaskIds = [];
204
+ const linkedAuditInstanceIds = new Set();
205
+ if (!deriveWorkflowParentLifecycle(run)) {
206
+ return { changedParentTaskIds, linkedAuditInstanceIds: [] };
207
+ }
208
+ for (const kind of parentKinds) {
209
+ const row = options.taskRepo.findWorkflowParentTask({
210
+ workspaceId: options.workspaceId,
211
+ workflowRunId: run.id,
212
+ kind,
213
+ });
214
+ if (!row)
215
+ continue;
216
+ const lifecycleOptions = {
217
+ taskRepo: options.taskRepo,
218
+ row,
219
+ run,
220
+ workspaceId: options.workspaceId,
221
+ kind,
222
+ snapshotUpdatedAt: latestAuditEndedAt(run),
223
+ };
224
+ const decision = deriveWorkflowParentLifecycleDecision(lifecycleOptions);
225
+ if (decision.linkedAuditInstanceId) {
226
+ linkedAuditInstanceIds.add(decision.linkedAuditInstanceId);
227
+ }
228
+ if (decision.change) {
229
+ applyWorkflowParentLifecycleChange(lifecycleOptions, decision.change);
230
+ changedParentTaskIds.push(row.id);
231
+ }
232
+ }
233
+ return { changedParentTaskIds, linkedAuditInstanceIds: [...linkedAuditInstanceIds] };
234
+ };
235
+ }
236
+ function isStale(startedAt, nowMs, graceMs) {
237
+ const startedAtMs = Date.parse(startedAt);
238
+ return Number.isFinite(startedAtMs) && nowMs - startedAtMs >= graceMs;
239
+ }
240
+ function reconcileWorkflowParentTasks(options) {
241
+ const graceMs = options.orphanGraceMs ?? exports.WORKFLOW_PARENT_ORPHAN_GRACE_MS;
242
+ const nowMs = options.nowMs ?? Date.now();
243
+ const result = { aligned: 0, orphaned: 0, skipped: 0 };
244
+ for (const row of options.taskRepo.findRunningWorkflowParentTasks()) {
245
+ const marker = parseWorkflowParentMarker(row.metadata);
246
+ if (row.platform !== 'workflow' || !marker) {
247
+ result.skipped += 1;
248
+ continue;
249
+ }
250
+ const workspaceId = row.workspace_id;
251
+ if (!workspaceId) {
252
+ result.skipped += 1;
253
+ continue;
254
+ }
255
+ const workspacePath = options.resolveWorkspacePath(workspaceId);
256
+ if (!workspacePath) {
257
+ result.skipped += 1;
258
+ continue;
259
+ }
260
+ const workflowRunId = marker.workflowRunId;
261
+ let run = null;
262
+ try {
263
+ run = options.loadRun(workspacePath, workflowRunId);
264
+ }
265
+ catch {
266
+ }
267
+ if (!run) {
268
+ if (row.status !== 'running' || !isStale(row.started_at, nowMs, graceMs)) {
269
+ result.skipped += 1;
270
+ continue;
271
+ }
272
+ const completedAt = row.completed_at ?? new Date(nowMs).toISOString();
273
+ const durationMs = row.duration_ms ?? Math.max(0, nowMs - Date.parse(row.started_at));
274
+ options.taskRepo.updateTaskLifecycle({
275
+ id: row.id,
276
+ status: 'failed',
277
+ error: exports.WORKFLOW_PARENT_ORPHAN_ERROR,
278
+ completedAt,
279
+ durationMs: Number.isFinite(durationMs) ? durationMs : null,
280
+ workspaceId,
281
+ });
282
+ result.orphaned += 1;
283
+ continue;
284
+ }
285
+ const lifecycle = deriveWorkflowParentLifecycle(run);
286
+ if (!lifecycle) {
287
+ result.skipped += 1;
288
+ continue;
289
+ }
290
+ if (lifecycleMatches(row, lifecycle))
291
+ continue;
292
+ if (syncWorkflowParentTaskLifecycle({
293
+ taskRepo: options.taskRepo,
294
+ row,
295
+ run,
296
+ workspaceId,
297
+ kind: marker.kind,
298
+ })) {
299
+ result.aligned += 1;
300
+ }
301
+ else {
302
+ result.skipped += 1;
303
+ }
304
+ }
305
+ return result;
306
+ }
307
+ //# sourceMappingURL=parent-task-sync.js.map