@auto-engineer/job-graph-processor 1.12.1

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 (116) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/.turbo/turbo-test.log +14 -0
  3. package/.turbo/turbo-type-check.log +4 -0
  4. package/CHANGELOG.md +12 -0
  5. package/LICENSE +10 -0
  6. package/README.md +408 -0
  7. package/dist/src/apply-policy.d.ts +3 -0
  8. package/dist/src/apply-policy.d.ts.map +1 -0
  9. package/dist/src/apply-policy.js +24 -0
  10. package/dist/src/apply-policy.js.map +1 -0
  11. package/dist/src/apply-policy.specs.d.ts +2 -0
  12. package/dist/src/apply-policy.specs.d.ts.map +1 -0
  13. package/dist/src/apply-policy.specs.js +75 -0
  14. package/dist/src/apply-policy.specs.js.map +1 -0
  15. package/dist/src/commands/process-job-graph.d.ts +31 -0
  16. package/dist/src/commands/process-job-graph.d.ts.map +1 -0
  17. package/dist/src/commands/process-job-graph.js +64 -0
  18. package/dist/src/commands/process-job-graph.js.map +1 -0
  19. package/dist/src/commands/process-job-graph.specs.d.ts +2 -0
  20. package/dist/src/commands/process-job-graph.specs.d.ts.map +1 -0
  21. package/dist/src/commands/process-job-graph.specs.js +73 -0
  22. package/dist/src/commands/process-job-graph.specs.js.map +1 -0
  23. package/dist/src/evolve.d.ts +70 -0
  24. package/dist/src/evolve.d.ts.map +1 -0
  25. package/dist/src/evolve.js +82 -0
  26. package/dist/src/evolve.js.map +1 -0
  27. package/dist/src/evolve.specs.d.ts +2 -0
  28. package/dist/src/evolve.specs.d.ts.map +1 -0
  29. package/dist/src/evolve.specs.js +209 -0
  30. package/dist/src/evolve.specs.js.map +1 -0
  31. package/dist/src/graph-processor.d.ts +22 -0
  32. package/dist/src/graph-processor.d.ts.map +1 -0
  33. package/dist/src/graph-processor.js +82 -0
  34. package/dist/src/graph-processor.js.map +1 -0
  35. package/dist/src/graph-processor.specs.d.ts +2 -0
  36. package/dist/src/graph-processor.specs.d.ts.map +1 -0
  37. package/dist/src/graph-processor.specs.js +286 -0
  38. package/dist/src/graph-processor.specs.js.map +1 -0
  39. package/dist/src/graph-validator.d.ts +19 -0
  40. package/dist/src/graph-validator.d.ts.map +1 -0
  41. package/dist/src/graph-validator.js +65 -0
  42. package/dist/src/graph-validator.js.map +1 -0
  43. package/dist/src/graph-validator.specs.d.ts +2 -0
  44. package/dist/src/graph-validator.specs.d.ts.map +1 -0
  45. package/dist/src/graph-validator.specs.js +86 -0
  46. package/dist/src/graph-validator.specs.js.map +1 -0
  47. package/dist/src/handle-job-event.d.ts +16 -0
  48. package/dist/src/handle-job-event.d.ts.map +1 -0
  49. package/dist/src/handle-job-event.js +46 -0
  50. package/dist/src/handle-job-event.js.map +1 -0
  51. package/dist/src/handle-job-event.specs.d.ts +2 -0
  52. package/dist/src/handle-job-event.specs.d.ts.map +1 -0
  53. package/dist/src/handle-job-event.specs.js +136 -0
  54. package/dist/src/handle-job-event.specs.js.map +1 -0
  55. package/dist/src/index.d.ts +41 -0
  56. package/dist/src/index.d.ts.map +1 -0
  57. package/dist/src/index.js +11 -0
  58. package/dist/src/index.js.map +1 -0
  59. package/dist/src/integration.specs.d.ts +2 -0
  60. package/dist/src/integration.specs.d.ts.map +1 -0
  61. package/dist/src/integration.specs.js +225 -0
  62. package/dist/src/integration.specs.js.map +1 -0
  63. package/dist/src/process-graph.d.ts +14 -0
  64. package/dist/src/process-graph.d.ts.map +1 -0
  65. package/dist/src/process-graph.js +26 -0
  66. package/dist/src/process-graph.js.map +1 -0
  67. package/dist/src/process-graph.specs.d.ts +2 -0
  68. package/dist/src/process-graph.specs.d.ts.map +1 -0
  69. package/dist/src/process-graph.specs.js +41 -0
  70. package/dist/src/process-graph.specs.js.map +1 -0
  71. package/dist/src/process-job-graph.e2e.specs.d.ts +2 -0
  72. package/dist/src/process-job-graph.e2e.specs.d.ts.map +1 -0
  73. package/dist/src/process-job-graph.e2e.specs.js +81 -0
  74. package/dist/src/process-job-graph.e2e.specs.js.map +1 -0
  75. package/dist/src/retry-manager.d.ts +10 -0
  76. package/dist/src/retry-manager.d.ts.map +1 -0
  77. package/dist/src/retry-manager.js +17 -0
  78. package/dist/src/retry-manager.js.map +1 -0
  79. package/dist/src/retry-manager.specs.d.ts +2 -0
  80. package/dist/src/retry-manager.specs.d.ts.map +1 -0
  81. package/dist/src/retry-manager.specs.js +55 -0
  82. package/dist/src/retry-manager.specs.js.map +1 -0
  83. package/dist/src/timeout-manager.d.ts +7 -0
  84. package/dist/src/timeout-manager.d.ts.map +1 -0
  85. package/dist/src/timeout-manager.js +25 -0
  86. package/dist/src/timeout-manager.js.map +1 -0
  87. package/dist/src/timeout-manager.specs.d.ts +2 -0
  88. package/dist/src/timeout-manager.specs.d.ts.map +1 -0
  89. package/dist/src/timeout-manager.specs.js +44 -0
  90. package/dist/src/timeout-manager.specs.js.map +1 -0
  91. package/dist/tsconfig.tsbuildinfo +1 -0
  92. package/ketchup-plan.md +31 -0
  93. package/package.json +25 -0
  94. package/src/apply-policy.specs.ts +85 -0
  95. package/src/apply-policy.ts +27 -0
  96. package/src/commands/process-job-graph.specs.ts +93 -0
  97. package/src/commands/process-job-graph.ts +80 -0
  98. package/src/evolve.specs.ts +235 -0
  99. package/src/evolve.ts +121 -0
  100. package/src/graph-processor.specs.ts +331 -0
  101. package/src/graph-processor.ts +121 -0
  102. package/src/graph-validator.specs.ts +105 -0
  103. package/src/graph-validator.ts +94 -0
  104. package/src/handle-job-event.specs.ts +154 -0
  105. package/src/handle-job-event.ts +59 -0
  106. package/src/index.ts +17 -0
  107. package/src/integration.specs.ts +249 -0
  108. package/src/process-graph.specs.ts +44 -0
  109. package/src/process-graph.ts +42 -0
  110. package/src/process-job-graph.e2e.specs.ts +121 -0
  111. package/src/retry-manager.specs.ts +66 -0
  112. package/src/retry-manager.ts +29 -0
  113. package/src/timeout-manager.specs.ts +55 -0
  114. package/src/timeout-manager.ts +34 -0
  115. package/tsconfig.json +9 -0
  116. package/vitest.config.ts +22 -0
@@ -0,0 +1,46 @@
1
+ import { applyPolicy } from './apply-policy.js';
2
+ import { evolve, getReadyJobs, isGraphComplete } from './evolve.js';
3
+ export function parseCorrelationId(correlationId) {
4
+ const match = correlationId.match(/^graph:(.+):(.+)$/);
5
+ if (match === null)
6
+ return null;
7
+ return { graphId: match[1], jobId: match[2] };
8
+ }
9
+ export function isJobFailure(event) {
10
+ return 'error' in event.data && event.data.error !== undefined;
11
+ }
12
+ export function classifyJobEvent(event) {
13
+ const parsed = parseCorrelationId(event.correlationId ?? '');
14
+ if (parsed === null)
15
+ return null;
16
+ if (isJobFailure(event)) {
17
+ return {
18
+ type: 'JobFailed',
19
+ data: { jobId: parsed.jobId, error: String(event.data.error) },
20
+ };
21
+ }
22
+ return {
23
+ type: 'JobSucceeded',
24
+ data: { jobId: parsed.jobId, result: event.data },
25
+ };
26
+ }
27
+ export function handleJobEvent(state, event) {
28
+ const classified = classifyJobEvent(event);
29
+ if (classified === null)
30
+ return null;
31
+ const events = [classified];
32
+ let current = evolve(state, classified);
33
+ if (classified.type === 'JobFailed') {
34
+ const policyEvents = applyPolicy(current, classified.data.jobId);
35
+ for (const pe of policyEvents) {
36
+ events.push(pe);
37
+ current = evolve(current, pe);
38
+ }
39
+ }
40
+ return {
41
+ events,
42
+ readyJobs: getReadyJobs(current),
43
+ graphComplete: isGraphComplete(current),
44
+ };
45
+ }
46
+ //# sourceMappingURL=handle-job-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-job-event.js","sourceRoot":"","sources":["../../src/handle-job-event.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEjE,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,OAAO,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAY;IAC3C,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAC7D,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEjC,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;SAC/D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE;KAClD,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,cAAc,CAAC,KAAiB,EAAE,KAAY;IAC5D,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,MAAM,GAAoB,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAExC,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjE,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC;QAChC,aAAa,EAAE,eAAe,CAAC,OAAO,CAAC;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=handle-job-event.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-job-event.specs.d.ts","sourceRoot":"","sources":["../../src/handle-job-event.specs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,136 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { evolve, initialState } from './evolve.js';
3
+ import { classifyJobEvent, handleJobEvent, isJobFailure, parseCorrelationId } from './handle-job-event.js';
4
+ describe('parseCorrelationId', () => {
5
+ it('extracts graphId and jobId from graph correlation format', () => {
6
+ expect(parseCorrelationId('graph:g1:job-a')).toEqual({ graphId: 'g1', jobId: 'job-a' });
7
+ });
8
+ });
9
+ describe('isJobFailure', () => {
10
+ it('returns true when event data contains error field', () => {
11
+ expect(isJobFailure({ type: 'BuildFailed', data: { error: 'compile error' } })).toBe(true);
12
+ });
13
+ });
14
+ describe('classifyJobEvent', () => {
15
+ it('returns null for events without graph correlation', () => {
16
+ expect(classifyJobEvent({ type: 'Unrelated', data: {} })).toBe(null);
17
+ });
18
+ it('returns JobFailed when event has error field', () => {
19
+ const result = classifyJobEvent({
20
+ type: 'BuildFailed',
21
+ data: { error: 'compile error' },
22
+ correlationId: 'graph:g1:job-a',
23
+ });
24
+ expect(result).toEqual({
25
+ type: 'JobFailed',
26
+ data: { jobId: 'job-a', error: 'compile error' },
27
+ });
28
+ });
29
+ it('returns JobSucceeded when event has no error', () => {
30
+ const result = classifyJobEvent({
31
+ type: 'BuildCompleted',
32
+ data: { output: 'success' },
33
+ correlationId: 'graph:g1:job-a',
34
+ });
35
+ expect(result).toEqual({
36
+ type: 'JobSucceeded',
37
+ data: { jobId: 'job-a', result: { output: 'success' } },
38
+ });
39
+ });
40
+ });
41
+ describe('handleJobEvent', () => {
42
+ it('returns null for events without graph correlation', () => {
43
+ const state = evolve(initialState(), {
44
+ type: 'GraphSubmitted',
45
+ data: {
46
+ graphId: 'g1',
47
+ jobs: [{ id: 'a', dependsOn: [], target: 'build', payload: {} }],
48
+ failurePolicy: 'halt',
49
+ },
50
+ });
51
+ const result = handleJobEvent(state, { type: 'Unrelated', data: {} });
52
+ expect(result).toBe(null);
53
+ });
54
+ it('emits JobSucceeded and dispatches ready dependents', () => {
55
+ let state = evolve(initialState(), {
56
+ type: 'GraphSubmitted',
57
+ data: {
58
+ graphId: 'g1',
59
+ jobs: [
60
+ { id: 'a', dependsOn: [], target: 'build', payload: {} },
61
+ { id: 'b', dependsOn: ['a'], target: 'test', payload: {} },
62
+ ],
63
+ failurePolicy: 'halt',
64
+ },
65
+ });
66
+ state = evolve(state, {
67
+ type: 'JobDispatched',
68
+ data: { jobId: 'a', target: 'build', correlationId: 'graph:g1:a' },
69
+ });
70
+ const result = handleJobEvent(state, {
71
+ type: 'BuildCompleted',
72
+ data: { output: 'ok' },
73
+ correlationId: 'graph:g1:a',
74
+ });
75
+ expect(result).toEqual({
76
+ events: [{ type: 'JobSucceeded', data: { jobId: 'a', result: { output: 'ok' } } }],
77
+ readyJobs: ['b'],
78
+ graphComplete: false,
79
+ });
80
+ });
81
+ it('marks graph complete when last job succeeds', () => {
82
+ let state = evolve(initialState(), {
83
+ type: 'GraphSubmitted',
84
+ data: {
85
+ graphId: 'g1',
86
+ jobs: [{ id: 'a', dependsOn: [], target: 'build', payload: {} }],
87
+ failurePolicy: 'halt',
88
+ },
89
+ });
90
+ state = evolve(state, {
91
+ type: 'JobDispatched',
92
+ data: { jobId: 'a', target: 'build', correlationId: 'graph:g1:a' },
93
+ });
94
+ const result = handleJobEvent(state, {
95
+ type: 'BuildCompleted',
96
+ data: { output: 'ok' },
97
+ correlationId: 'graph:g1:a',
98
+ });
99
+ expect(result).toEqual({
100
+ events: [{ type: 'JobSucceeded', data: { jobId: 'a', result: { output: 'ok' } } }],
101
+ readyJobs: [],
102
+ graphComplete: true,
103
+ });
104
+ });
105
+ it('applies halt policy and marks graph complete on failure', () => {
106
+ let state = evolve(initialState(), {
107
+ type: 'GraphSubmitted',
108
+ data: {
109
+ graphId: 'g1',
110
+ jobs: [
111
+ { id: 'a', dependsOn: [], target: 'build', payload: {} },
112
+ { id: 'b', dependsOn: ['a'], target: 'test', payload: {} },
113
+ ],
114
+ failurePolicy: 'halt',
115
+ },
116
+ });
117
+ state = evolve(state, {
118
+ type: 'JobDispatched',
119
+ data: { jobId: 'a', target: 'build', correlationId: 'graph:g1:a' },
120
+ });
121
+ const result = handleJobEvent(state, {
122
+ type: 'BuildFailed',
123
+ data: { error: 'compile error' },
124
+ correlationId: 'graph:g1:a',
125
+ });
126
+ expect(result).toEqual({
127
+ events: [
128
+ { type: 'JobFailed', data: { jobId: 'a', error: 'compile error' } },
129
+ { type: 'JobSkipped', data: { jobId: 'b', reason: 'halt policy' } },
130
+ ],
131
+ readyJobs: [],
132
+ graphComplete: true,
133
+ });
134
+ });
135
+ });
136
+ //# sourceMappingURL=handle-job-event.specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-job-event.specs.js","sourceRoot":"","sources":["../../src/handle-job-event.specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export declare const COMMANDS: {
2
+ name: string;
3
+ displayName: string;
4
+ alias: string;
5
+ description: string;
6
+ category: string;
7
+ icon: string;
8
+ fields: {
9
+ graphId: {
10
+ description: string;
11
+ required: boolean;
12
+ };
13
+ jobs: {
14
+ description: string;
15
+ required: boolean;
16
+ };
17
+ failurePolicy: {
18
+ description: string;
19
+ required: boolean;
20
+ };
21
+ };
22
+ examples: string[];
23
+ events: {
24
+ name: string;
25
+ displayName: string;
26
+ }[];
27
+ handle: (command: import("@auto-engineer/message-bus").Command, context?: unknown) => Promise<import("@auto-engineer/message-bus").Event | import("@auto-engineer/message-bus").Event[]>;
28
+ }[];
29
+ export { applyPolicy } from './apply-policy';
30
+ export type { FailurePolicy, GraphState, JobGraphEvent, JobStatus } from './evolve';
31
+ export { evolve, getReadyJobs, getTransitiveDependents, initialState, isGraphComplete } from './evolve';
32
+ export { createGraphProcessor } from './graph-processor';
33
+ export type { Job } from './graph-validator';
34
+ export { validateGraph } from './graph-validator';
35
+ export { classifyJobEvent, handleJobEvent, isJobFailure, parseCorrelationId } from './handle-job-event';
36
+ export { handleProcessGraph } from './process-graph';
37
+ export type { RetryConfig, RetryManager } from './retry-manager';
38
+ export { createRetryManager } from './retry-manager';
39
+ export type { TimeoutManager } from './timeout-manager';
40
+ export { createTimeoutManager } from './timeout-manager';
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA2B,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEpF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,uBAAuB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACxG,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { commandHandler as processJobGraphHandler } from './commands/process-job-graph.js';
2
+ export const COMMANDS = [processJobGraphHandler];
3
+ export { applyPolicy } from './apply-policy.js';
4
+ export { evolve, getReadyJobs, getTransitiveDependents, initialState, isGraphComplete } from './evolve.js';
5
+ export { createGraphProcessor } from './graph-processor.js';
6
+ export { validateGraph } from './graph-validator.js';
7
+ export { classifyJobEvent, handleJobEvent, isJobFailure, parseCorrelationId } from './handle-job-event.js';
8
+ export { handleProcessGraph } from './process-graph.js';
9
+ export { createRetryManager } from './retry-manager.js';
10
+ export { createTimeoutManager } from './timeout-manager.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAExF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,uBAAuB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACxG,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=integration.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.specs.d.ts","sourceRoot":"","sources":["../../src/integration.specs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,225 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { evolve, getReadyJobs, initialState } from './evolve.js';
3
+ import { handleJobEvent } from './handle-job-event.js';
4
+ import { createRetryManager } from './retry-manager.js';
5
+ import { createTimeoutManager } from './timeout-manager.js';
6
+ describe('diamond dependency graph', () => {
7
+ it('processes a→(b,c)→d diamond graph to completion', () => {
8
+ let state = evolve(initialState(), {
9
+ type: 'GraphSubmitted',
10
+ data: {
11
+ graphId: 'g1',
12
+ jobs: [
13
+ { id: 'a', dependsOn: [], target: 'build', payload: {} },
14
+ { id: 'b', dependsOn: ['a'], target: 'test', payload: {} },
15
+ { id: 'c', dependsOn: ['a'], target: 'lint', payload: {} },
16
+ { id: 'd', dependsOn: ['b', 'c'], target: 'deploy', payload: {} },
17
+ ],
18
+ failurePolicy: 'halt',
19
+ },
20
+ });
21
+ expect(getReadyJobs(state)).toEqual(['a']);
22
+ state = evolve(state, {
23
+ type: 'JobDispatched',
24
+ data: { jobId: 'a', target: 'build', correlationId: 'graph:g1:a' },
25
+ });
26
+ const r1 = handleJobEvent(state, {
27
+ type: 'BuildCompleted',
28
+ data: { output: 'ok' },
29
+ correlationId: 'graph:g1:a',
30
+ });
31
+ expect(r1).toEqual({
32
+ events: [{ type: 'JobSucceeded', data: { jobId: 'a', result: { output: 'ok' } } }],
33
+ readyJobs: ['b', 'c'],
34
+ graphComplete: false,
35
+ });
36
+ for (const e of r1.events)
37
+ state = evolve(state, e);
38
+ state = evolve(state, {
39
+ type: 'JobDispatched',
40
+ data: { jobId: 'b', target: 'test', correlationId: 'graph:g1:b' },
41
+ });
42
+ state = evolve(state, {
43
+ type: 'JobDispatched',
44
+ data: { jobId: 'c', target: 'lint', correlationId: 'graph:g1:c' },
45
+ });
46
+ const r2 = handleJobEvent(state, {
47
+ type: 'TestPassed',
48
+ data: {},
49
+ correlationId: 'graph:g1:b',
50
+ });
51
+ expect(r2).toEqual({
52
+ events: [{ type: 'JobSucceeded', data: { jobId: 'b', result: {} } }],
53
+ readyJobs: [],
54
+ graphComplete: false,
55
+ });
56
+ for (const e of r2.events)
57
+ state = evolve(state, e);
58
+ const r3 = handleJobEvent(state, {
59
+ type: 'LintPassed',
60
+ data: {},
61
+ correlationId: 'graph:g1:c',
62
+ });
63
+ expect(r3).toEqual({
64
+ events: [{ type: 'JobSucceeded', data: { jobId: 'c', result: {} } }],
65
+ readyJobs: ['d'],
66
+ graphComplete: false,
67
+ });
68
+ for (const e of r3.events)
69
+ state = evolve(state, e);
70
+ state = evolve(state, {
71
+ type: 'JobDispatched',
72
+ data: { jobId: 'd', target: 'deploy', correlationId: 'graph:g1:d' },
73
+ });
74
+ const r4 = handleJobEvent(state, {
75
+ type: 'Deployed',
76
+ data: {},
77
+ correlationId: 'graph:g1:d',
78
+ });
79
+ expect(r4).toEqual({
80
+ events: [{ type: 'JobSucceeded', data: { jobId: 'd', result: {} } }],
81
+ readyJobs: [],
82
+ graphComplete: true,
83
+ });
84
+ });
85
+ });
86
+ describe('failure policies integration', () => {
87
+ it('halt policy skips all pending and completes graph on failure', () => {
88
+ let state = evolve(initialState(), {
89
+ type: 'GraphSubmitted',
90
+ data: {
91
+ graphId: 'g1',
92
+ jobs: [
93
+ { id: 'a', dependsOn: [], target: 'build', payload: {} },
94
+ { id: 'b', dependsOn: ['a'], target: 'test', payload: {} },
95
+ { id: 'c', dependsOn: [], target: 'lint', payload: {} },
96
+ ],
97
+ failurePolicy: 'halt',
98
+ },
99
+ });
100
+ state = evolve(state, {
101
+ type: 'JobDispatched',
102
+ data: { jobId: 'a', target: 'build', correlationId: 'graph:g1:a' },
103
+ });
104
+ const result = handleJobEvent(state, {
105
+ type: 'BuildFailed',
106
+ data: { error: 'compile error' },
107
+ correlationId: 'graph:g1:a',
108
+ });
109
+ expect(result).toEqual({
110
+ events: [
111
+ { type: 'JobFailed', data: { jobId: 'a', error: 'compile error' } },
112
+ { type: 'JobSkipped', data: { jobId: 'b', reason: 'halt policy' } },
113
+ { type: 'JobSkipped', data: { jobId: 'c', reason: 'halt policy' } },
114
+ ],
115
+ readyJobs: [],
116
+ graphComplete: true,
117
+ });
118
+ });
119
+ it('skip-dependents policy skips only dependents and allows others to continue', () => {
120
+ let state = evolve(initialState(), {
121
+ type: 'GraphSubmitted',
122
+ data: {
123
+ graphId: 'g1',
124
+ jobs: [
125
+ { id: 'a', dependsOn: [], target: 'build', payload: {} },
126
+ { id: 'b', dependsOn: ['a'], target: 'test', payload: {} },
127
+ { id: 'c', dependsOn: [], target: 'lint', payload: {} },
128
+ ],
129
+ failurePolicy: 'skip-dependents',
130
+ },
131
+ });
132
+ state = evolve(state, {
133
+ type: 'JobDispatched',
134
+ data: { jobId: 'a', target: 'build', correlationId: 'graph:g1:a' },
135
+ });
136
+ const result = handleJobEvent(state, {
137
+ type: 'BuildFailed',
138
+ data: { error: 'compile error' },
139
+ correlationId: 'graph:g1:a',
140
+ });
141
+ expect(result).toEqual({
142
+ events: [
143
+ { type: 'JobFailed', data: { jobId: 'a', error: 'compile error' } },
144
+ { type: 'JobSkipped', data: { jobId: 'b', reason: 'dependency failed' } },
145
+ ],
146
+ readyJobs: ['c'],
147
+ graphComplete: false,
148
+ });
149
+ });
150
+ it('continue policy unlocks dependents after failure', () => {
151
+ let state = evolve(initialState(), {
152
+ type: 'GraphSubmitted',
153
+ data: {
154
+ graphId: 'g1',
155
+ jobs: [
156
+ { id: 'a', dependsOn: [], target: 'build', payload: {} },
157
+ { id: 'b', dependsOn: ['a'], target: 'test', payload: {} },
158
+ ],
159
+ failurePolicy: 'continue',
160
+ },
161
+ });
162
+ state = evolve(state, {
163
+ type: 'JobDispatched',
164
+ data: { jobId: 'a', target: 'build', correlationId: 'graph:g1:a' },
165
+ });
166
+ const result = handleJobEvent(state, {
167
+ type: 'BuildFailed',
168
+ data: { error: 'compile error' },
169
+ correlationId: 'graph:g1:a',
170
+ });
171
+ expect(result).toEqual({
172
+ events: [{ type: 'JobFailed', data: { jobId: 'a', error: 'compile error' } }],
173
+ readyJobs: ['b'],
174
+ graphComplete: false,
175
+ });
176
+ });
177
+ });
178
+ describe('timeout integration', () => {
179
+ it('fires timeout callback after elapsed time and evolve treats it as terminal', () => {
180
+ vi.useFakeTimers();
181
+ const timedOut = [];
182
+ const manager = createTimeoutManager((jobId) => timedOut.push(jobId));
183
+ let state = evolve(initialState(), {
184
+ type: 'GraphSubmitted',
185
+ data: {
186
+ graphId: 'g1',
187
+ jobs: [{ id: 'a', dependsOn: [], target: 'build', payload: {} }],
188
+ failurePolicy: 'halt',
189
+ },
190
+ });
191
+ state = evolve(state, {
192
+ type: 'JobDispatched',
193
+ data: { jobId: 'a', target: 'build', correlationId: 'graph:g1:a' },
194
+ });
195
+ manager.start('a', 5000);
196
+ vi.advanceTimersByTime(5000);
197
+ expect(timedOut).toEqual(['a']);
198
+ state = evolve(state, { type: 'JobTimedOut', data: { jobId: 'a', timeoutMs: 5000 } });
199
+ expect(getReadyJobs(state)).toEqual([]);
200
+ vi.useRealTimers();
201
+ });
202
+ });
203
+ describe('retry integration', () => {
204
+ it('retries with backoff then exhausts max retries', () => {
205
+ vi.useFakeTimers();
206
+ const retries = [];
207
+ const manager = createRetryManager((jobId, attempt) => retries.push({ jobId, attempt }));
208
+ const config = { maxRetries: 2, backoffMs: 100, maxBackoffMs: 5000 };
209
+ const exhausted1 = manager.recordFailure('a', config);
210
+ expect(exhausted1).toBe(false);
211
+ vi.advanceTimersByTime(100);
212
+ expect(retries).toEqual([{ jobId: 'a', attempt: 1 }]);
213
+ const exhausted2 = manager.recordFailure('a', config);
214
+ expect(exhausted2).toBe(false);
215
+ vi.advanceTimersByTime(200);
216
+ expect(retries).toEqual([
217
+ { jobId: 'a', attempt: 1 },
218
+ { jobId: 'a', attempt: 2 },
219
+ ]);
220
+ const exhausted3 = manager.recordFailure('a', config);
221
+ expect(exhausted3).toBe(true);
222
+ vi.useRealTimers();
223
+ });
224
+ });
225
+ //# sourceMappingURL=integration.specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.specs.js","sourceRoot":"","sources":["../../src/integration.specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Event } from '@auto-engineer/message-bus';
2
+ import type { FailurePolicy } from './evolve';
3
+ import type { Job } from './graph-validator';
4
+ interface ProcessGraphCommand {
5
+ type: 'ProcessGraph';
6
+ data: {
7
+ graphId: string;
8
+ jobs: readonly Job[];
9
+ failurePolicy: FailurePolicy;
10
+ };
11
+ }
12
+ export declare function handleProcessGraph(command: ProcessGraphCommand): Promise<Event | Event[]>;
13
+ export {};
14
+ //# sourceMappingURL=process-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-graph.d.ts","sourceRoot":"","sources":["../../src/process-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAG7C,UAAU,mBAAmB;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;QACrB,aAAa,EAAE,aAAa,CAAC;KAC9B,CAAC;CACH;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CA0B/F"}
@@ -0,0 +1,26 @@
1
+ import { evolve, getReadyJobs, initialState } from './evolve.js';
2
+ import { validateGraph } from './graph-validator.js';
3
+ export async function handleProcessGraph(command) {
4
+ const { graphId, jobs, failurePolicy } = command.data;
5
+ const validation = validateGraph(jobs);
6
+ if (!validation.valid) {
7
+ return {
8
+ type: 'graph.failed',
9
+ data: { graphId, reason: validation.error },
10
+ };
11
+ }
12
+ const state = evolve(initialState(), {
13
+ type: 'GraphSubmitted',
14
+ data: { graphId, jobs, failurePolicy },
15
+ });
16
+ const jobById = {};
17
+ for (const job of jobs) {
18
+ jobById[job.id] = job;
19
+ }
20
+ const ready = getReadyJobs(state);
21
+ return ready.map((jobId) => ({
22
+ type: 'job.dispatched',
23
+ data: { graphId, jobId, target: jobById[jobId].target, payload: jobById[jobId].payload },
24
+ }));
25
+ }
26
+ //# sourceMappingURL=process-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-graph.js","sourceRoot":"","sources":["../../src/process-graph.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAWlD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAA4B;IACnE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAEtD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE;SAC5C,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE;QACnC,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE;KACvC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACxB,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3B,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;KACzF,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process-graph.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-graph.specs.d.ts","sourceRoot":"","sources":["../../src/process-graph.specs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { handleProcessGraph } from './process-graph.js';
3
+ describe('handleProcessGraph', () => {
4
+ it('returns graph.failed when graph validation fails', async () => {
5
+ const result = await handleProcessGraph({
6
+ type: 'ProcessGraph',
7
+ data: {
8
+ graphId: 'g1',
9
+ jobs: [],
10
+ failurePolicy: 'halt',
11
+ },
12
+ });
13
+ expect(result).toEqual({
14
+ type: 'graph.failed',
15
+ data: {
16
+ graphId: 'g1',
17
+ reason: 'Graph must contain at least one job',
18
+ },
19
+ });
20
+ });
21
+ it('dispatches ready jobs for a valid graph', async () => {
22
+ const result = await handleProcessGraph({
23
+ type: 'ProcessGraph',
24
+ data: {
25
+ graphId: 'g1',
26
+ jobs: [
27
+ { id: 'a', dependsOn: [], target: 'build', payload: { src: './app' } },
28
+ { id: 'b', dependsOn: ['a'], target: 'test', payload: {} },
29
+ ],
30
+ failurePolicy: 'halt',
31
+ },
32
+ });
33
+ expect(result).toEqual([
34
+ {
35
+ type: 'job.dispatched',
36
+ data: { graphId: 'g1', jobId: 'a', target: 'build', payload: { src: './app' } },
37
+ },
38
+ ]);
39
+ });
40
+ });
41
+ //# sourceMappingURL=process-graph.specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-graph.specs.js","sourceRoot":"","sources":["../../src/process-graph.specs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;YACtC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE;gBACJ,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,EAAE;gBACR,aAAa,EAAE,MAAM;aACtB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE;gBACJ,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,qCAAqC;aAC9C;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;YACtC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE;gBACJ,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;oBACtE,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;iBAC3D;gBACD,aAAa,EAAE,MAAM;aACtB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB;gBACE,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;aAChF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process-job-graph.e2e.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-job-graph.e2e.specs.d.ts","sourceRoot":"","sources":["../../src/process-job-graph.e2e.specs.ts"],"names":[],"mappings":""}