agent-relay 4.0.35 → 4.0.36

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 (199) hide show
  1. package/README.md +3 -6
  2. package/dist/index.cjs +775 -40
  3. package/dist/src/cli/bootstrap.js.map +1 -1
  4. package/dist/src/cli/commands/cloud.js.map +1 -1
  5. package/dist/src/cli/commands/core.d.ts.map +1 -1
  6. package/dist/src/cli/commands/core.js.map +1 -1
  7. package/dist/src/cli/commands/messaging.d.ts.map +1 -1
  8. package/dist/src/cli/commands/messaging.js.map +1 -1
  9. package/dist/src/cli/commands/monitoring.d.ts.map +1 -1
  10. package/dist/src/cli/commands/monitoring.js.map +1 -1
  11. package/node_modules/@agent-relay/cloud/package.json +2 -2
  12. package/node_modules/@agent-relay/config/package.json +2 -2
  13. package/node_modules/@agent-relay/hooks/package.json +4 -4
  14. package/node_modules/@agent-relay/sdk/dist/relay.d.ts.map +1 -1
  15. package/node_modules/@agent-relay/sdk/dist/relay.js.map +1 -1
  16. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/budget-enforcement.test.d.ts +2 -0
  17. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/budget-enforcement.test.d.ts.map +1 -0
  18. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/budget-enforcement.test.js +437 -0
  19. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/budget-enforcement.test.js.map +1 -0
  20. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/budget-tracker.test.d.ts +2 -0
  21. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/budget-tracker.test.d.ts.map +1 -0
  22. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/budget-tracker.test.js +99 -0
  23. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/budget-tracker.test.js.map +1 -0
  24. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/proxy-env.test.d.ts +2 -0
  25. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/proxy-env.test.d.ts.map +1 -0
  26. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/proxy-env.test.js +135 -0
  27. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/proxy-env.test.js.map +1 -0
  28. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/verification-custom.test.d.ts +2 -0
  29. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/verification-custom.test.d.ts.map +1 -0
  30. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/verification-custom.test.js +236 -0
  31. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/verification-custom.test.js.map +1 -0
  32. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/verification-traceback.test.d.ts +2 -0
  33. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/verification-traceback.test.d.ts.map +1 -0
  34. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/verification-traceback.test.js +448 -0
  35. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/verification-traceback.test.js.map +1 -0
  36. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/verification.test.js +71 -4
  37. package/node_modules/@agent-relay/sdk/dist/workflows/__tests__/verification.test.js.map +1 -1
  38. package/node_modules/@agent-relay/sdk/dist/workflows/budget-tracker.d.ts +75 -0
  39. package/node_modules/@agent-relay/sdk/dist/workflows/budget-tracker.d.ts.map +1 -0
  40. package/node_modules/@agent-relay/sdk/dist/workflows/budget-tracker.js +180 -0
  41. package/node_modules/@agent-relay/sdk/dist/workflows/budget-tracker.js.map +1 -0
  42. package/node_modules/@agent-relay/sdk/dist/workflows/builder.d.ts +1 -0
  43. package/node_modules/@agent-relay/sdk/dist/workflows/builder.d.ts.map +1 -1
  44. package/node_modules/@agent-relay/sdk/dist/workflows/builder.js +17 -2
  45. package/node_modules/@agent-relay/sdk/dist/workflows/builder.js.map +1 -1
  46. package/node_modules/@agent-relay/sdk/dist/workflows/index.d.ts +2 -0
  47. package/node_modules/@agent-relay/sdk/dist/workflows/index.d.ts.map +1 -1
  48. package/node_modules/@agent-relay/sdk/dist/workflows/index.js +2 -0
  49. package/node_modules/@agent-relay/sdk/dist/workflows/index.js.map +1 -1
  50. package/node_modules/@agent-relay/sdk/dist/workflows/proxy-env.d.ts +52 -0
  51. package/node_modules/@agent-relay/sdk/dist/workflows/proxy-env.d.ts.map +1 -0
  52. package/node_modules/@agent-relay/sdk/dist/workflows/proxy-env.js +92 -0
  53. package/node_modules/@agent-relay/sdk/dist/workflows/proxy-env.js.map +1 -0
  54. package/node_modules/@agent-relay/sdk/dist/workflows/run-summary-table.d.ts +2 -1
  55. package/node_modules/@agent-relay/sdk/dist/workflows/run-summary-table.d.ts.map +1 -1
  56. package/node_modules/@agent-relay/sdk/dist/workflows/run-summary-table.js +41 -9
  57. package/node_modules/@agent-relay/sdk/dist/workflows/run-summary-table.js.map +1 -1
  58. package/node_modules/@agent-relay/sdk/dist/workflows/runner.d.ts +17 -0
  59. package/node_modules/@agent-relay/sdk/dist/workflows/runner.d.ts.map +1 -1
  60. package/node_modules/@agent-relay/sdk/dist/workflows/runner.js +390 -16
  61. package/node_modules/@agent-relay/sdk/dist/workflows/runner.js.map +1 -1
  62. package/node_modules/@agent-relay/sdk/dist/workflows/types.d.ts +47 -1
  63. package/node_modules/@agent-relay/sdk/dist/workflows/types.d.ts.map +1 -1
  64. package/node_modules/@agent-relay/sdk/dist/workflows/types.js.map +1 -1
  65. package/node_modules/@agent-relay/sdk/dist/workflows/verification.d.ts +9 -0
  66. package/node_modules/@agent-relay/sdk/dist/workflows/verification.d.ts.map +1 -1
  67. package/node_modules/@agent-relay/sdk/dist/workflows/verification.js +78 -2
  68. package/node_modules/@agent-relay/sdk/dist/workflows/verification.js.map +1 -1
  69. package/node_modules/@agent-relay/sdk/package.json +7 -3
  70. package/node_modules/@agent-relay/telemetry/dist/config.d.ts.map +1 -1
  71. package/node_modules/@agent-relay/telemetry/dist/config.js +2 -4
  72. package/node_modules/@agent-relay/telemetry/dist/config.js.map +1 -1
  73. package/node_modules/@agent-relay/telemetry/dist/events.d.ts +1 -2
  74. package/node_modules/@agent-relay/telemetry/dist/events.d.ts.map +1 -1
  75. package/node_modules/@agent-relay/telemetry/dist/index.d.ts +1 -1
  76. package/node_modules/@agent-relay/telemetry/dist/index.d.ts.map +1 -1
  77. package/node_modules/@agent-relay/telemetry/dist/index.js +1 -1
  78. package/node_modules/@agent-relay/telemetry/dist/index.js.map +1 -1
  79. package/node_modules/@agent-relay/telemetry/package.json +1 -1
  80. package/node_modules/@agent-relay/trajectory/package.json +2 -2
  81. package/node_modules/@agent-relay/user-directory/package.json +2 -2
  82. package/node_modules/@agent-relay/utils/package.json +2 -2
  83. package/node_modules/@aws-sdk/core/dist-cjs/index.js +2 -0
  84. package/node_modules/@aws-sdk/core/dist-cjs/submodules/client/index.js +3 -0
  85. package/node_modules/@aws-sdk/core/dist-es/submodules/client/setFeature.js +2 -0
  86. package/node_modules/@aws-sdk/core/dist-types/submodules/client/setFeature.d.ts +1 -1
  87. package/node_modules/@aws-sdk/core/package.json +6 -4
  88. package/node_modules/@aws-sdk/credential-provider-env/package.json +2 -2
  89. package/node_modules/@aws-sdk/credential-provider-http/package.json +5 -5
  90. package/node_modules/@aws-sdk/credential-provider-ini/package.json +9 -9
  91. package/node_modules/@aws-sdk/credential-provider-login/package.json +3 -3
  92. package/node_modules/@aws-sdk/credential-provider-node/package.json +7 -7
  93. package/node_modules/@aws-sdk/credential-provider-process/package.json +2 -2
  94. package/node_modules/@aws-sdk/credential-provider-sso/package.json +4 -4
  95. package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +3 -3
  96. package/node_modules/@aws-sdk/middleware-flexible-checksums/package.json +4 -4
  97. package/node_modules/@aws-sdk/middleware-sdk-s3/package.json +5 -5
  98. package/node_modules/@aws-sdk/middleware-user-agent/package.json +5 -5
  99. package/node_modules/@aws-sdk/nested-clients/package.json +18 -18
  100. package/node_modules/@aws-sdk/region-config-resolver/package.json +2 -2
  101. package/node_modules/@aws-sdk/signature-v4-multi-region/package.json +2 -2
  102. package/node_modules/@aws-sdk/token-providers/package.json +3 -3
  103. package/node_modules/@aws-sdk/util-endpoints/package.json +2 -2
  104. package/node_modules/@aws-sdk/util-user-agent-node/package.json +2 -2
  105. package/node_modules/axios/CHANGELOG.md +112 -44
  106. package/node_modules/axios/README.md +30 -0
  107. package/node_modules/axios/dist/axios.js +34 -11
  108. package/node_modules/axios/dist/axios.js.map +1 -1
  109. package/node_modules/axios/dist/axios.min.js +2 -2
  110. package/node_modules/axios/dist/axios.min.js.map +1 -1
  111. package/node_modules/axios/dist/browser/axios.cjs +32 -6
  112. package/node_modules/axios/dist/browser/axios.cjs.map +1 -1
  113. package/node_modules/axios/dist/esm/axios.js +32 -6
  114. package/node_modules/axios/dist/esm/axios.js.map +1 -1
  115. package/node_modules/axios/dist/esm/axios.min.js +2 -2
  116. package/node_modules/axios/dist/esm/axios.min.js.map +1 -1
  117. package/node_modules/axios/dist/node/axios.cjs +91 -37
  118. package/node_modules/axios/dist/node/axios.cjs.map +1 -1
  119. package/node_modules/axios/index.d.cts +1 -0
  120. package/node_modules/axios/index.d.ts +1 -0
  121. package/node_modules/axios/lib/adapters/http.js +69 -22
  122. package/node_modules/axios/lib/core/mergeConfig.js +13 -1
  123. package/node_modules/axios/lib/env/data.js +1 -1
  124. package/node_modules/axios/lib/helpers/resolveConfig.js +14 -2
  125. package/node_modules/axios/lib/helpers/validator.js +3 -1
  126. package/node_modules/axios/package.json +1 -1
  127. package/package.json +9 -9
  128. package/packages/cloud/package.json +2 -2
  129. package/packages/config/package.json +2 -2
  130. package/packages/hooks/package.json +4 -4
  131. package/packages/sdk/dist/relay.d.ts.map +1 -1
  132. package/packages/sdk/dist/relay.js.map +1 -1
  133. package/packages/sdk/dist/workflows/__tests__/budget-enforcement.test.d.ts +2 -0
  134. package/packages/sdk/dist/workflows/__tests__/budget-enforcement.test.d.ts.map +1 -0
  135. package/packages/sdk/dist/workflows/__tests__/budget-enforcement.test.js +437 -0
  136. package/packages/sdk/dist/workflows/__tests__/budget-enforcement.test.js.map +1 -0
  137. package/packages/sdk/dist/workflows/__tests__/budget-tracker.test.d.ts +2 -0
  138. package/packages/sdk/dist/workflows/__tests__/budget-tracker.test.d.ts.map +1 -0
  139. package/packages/sdk/dist/workflows/__tests__/budget-tracker.test.js +99 -0
  140. package/packages/sdk/dist/workflows/__tests__/budget-tracker.test.js.map +1 -0
  141. package/packages/sdk/dist/workflows/__tests__/proxy-env.test.d.ts +2 -0
  142. package/packages/sdk/dist/workflows/__tests__/proxy-env.test.d.ts.map +1 -0
  143. package/packages/sdk/dist/workflows/__tests__/proxy-env.test.js +135 -0
  144. package/packages/sdk/dist/workflows/__tests__/proxy-env.test.js.map +1 -0
  145. package/packages/sdk/dist/workflows/__tests__/verification-custom.test.d.ts +2 -0
  146. package/packages/sdk/dist/workflows/__tests__/verification-custom.test.d.ts.map +1 -0
  147. package/packages/sdk/dist/workflows/__tests__/verification-custom.test.js +236 -0
  148. package/packages/sdk/dist/workflows/__tests__/verification-custom.test.js.map +1 -0
  149. package/packages/sdk/dist/workflows/__tests__/verification-traceback.test.d.ts +2 -0
  150. package/packages/sdk/dist/workflows/__tests__/verification-traceback.test.d.ts.map +1 -0
  151. package/packages/sdk/dist/workflows/__tests__/verification-traceback.test.js +448 -0
  152. package/packages/sdk/dist/workflows/__tests__/verification-traceback.test.js.map +1 -0
  153. package/packages/sdk/dist/workflows/__tests__/verification.test.js +71 -4
  154. package/packages/sdk/dist/workflows/__tests__/verification.test.js.map +1 -1
  155. package/packages/sdk/dist/workflows/budget-tracker.d.ts +75 -0
  156. package/packages/sdk/dist/workflows/budget-tracker.d.ts.map +1 -0
  157. package/packages/sdk/dist/workflows/budget-tracker.js +180 -0
  158. package/packages/sdk/dist/workflows/budget-tracker.js.map +1 -0
  159. package/packages/sdk/dist/workflows/builder.d.ts +1 -0
  160. package/packages/sdk/dist/workflows/builder.d.ts.map +1 -1
  161. package/packages/sdk/dist/workflows/builder.js +17 -2
  162. package/packages/sdk/dist/workflows/builder.js.map +1 -1
  163. package/packages/sdk/dist/workflows/index.d.ts +2 -0
  164. package/packages/sdk/dist/workflows/index.d.ts.map +1 -1
  165. package/packages/sdk/dist/workflows/index.js +2 -0
  166. package/packages/sdk/dist/workflows/index.js.map +1 -1
  167. package/packages/sdk/dist/workflows/proxy-env.d.ts +52 -0
  168. package/packages/sdk/dist/workflows/proxy-env.d.ts.map +1 -0
  169. package/packages/sdk/dist/workflows/proxy-env.js +92 -0
  170. package/packages/sdk/dist/workflows/proxy-env.js.map +1 -0
  171. package/packages/sdk/dist/workflows/run-summary-table.d.ts +2 -1
  172. package/packages/sdk/dist/workflows/run-summary-table.d.ts.map +1 -1
  173. package/packages/sdk/dist/workflows/run-summary-table.js +41 -9
  174. package/packages/sdk/dist/workflows/run-summary-table.js.map +1 -1
  175. package/packages/sdk/dist/workflows/runner.d.ts +17 -0
  176. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  177. package/packages/sdk/dist/workflows/runner.js +390 -16
  178. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  179. package/packages/sdk/dist/workflows/types.d.ts +47 -1
  180. package/packages/sdk/dist/workflows/types.d.ts.map +1 -1
  181. package/packages/sdk/dist/workflows/types.js.map +1 -1
  182. package/packages/sdk/dist/workflows/verification.d.ts +9 -0
  183. package/packages/sdk/dist/workflows/verification.d.ts.map +1 -1
  184. package/packages/sdk/dist/workflows/verification.js +78 -2
  185. package/packages/sdk/dist/workflows/verification.js.map +1 -1
  186. package/packages/sdk/package.json +7 -3
  187. package/packages/telemetry/dist/config.d.ts.map +1 -1
  188. package/packages/telemetry/dist/config.js +2 -4
  189. package/packages/telemetry/dist/config.js.map +1 -1
  190. package/packages/telemetry/dist/events.d.ts +1 -2
  191. package/packages/telemetry/dist/events.d.ts.map +1 -1
  192. package/packages/telemetry/dist/index.d.ts +1 -1
  193. package/packages/telemetry/dist/index.d.ts.map +1 -1
  194. package/packages/telemetry/dist/index.js +1 -1
  195. package/packages/telemetry/dist/index.js.map +1 -1
  196. package/packages/telemetry/package.json +1 -1
  197. package/packages/trajectory/package.json +2 -2
  198. package/packages/user-directory/package.json +2 -2
  199. package/packages/utils/package.json +2 -2
@@ -0,0 +1,448 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest';
6
+ const tempDirs = [];
7
+ let queuedSubprocessResults = [];
8
+ let queuedCollectorResults = [];
9
+ const mockCollectCliSession = vi.fn(async (query) => {
10
+ const next = queuedCollectorResults.shift();
11
+ if (typeof next === 'function') {
12
+ return next(query);
13
+ }
14
+ return next ?? null;
15
+ });
16
+ vi.mock('../cli-session-collector.js', () => ({
17
+ collectCliSession: mockCollectCliSession,
18
+ }));
19
+ const mockSubprocessSpawn = vi.fn().mockImplementation((_cmd, _args, _options) => {
20
+ const result = queuedSubprocessResults.shift() ?? {
21
+ stdout: 'completed\n',
22
+ code: 0,
23
+ };
24
+ const child = new EventEmitter();
25
+ child.stdout = new EventEmitter();
26
+ child.stderr = new EventEmitter();
27
+ child.pid = 4321;
28
+ let closed = false;
29
+ let delayTimer;
30
+ const clearPending = () => {
31
+ if (delayTimer) {
32
+ clearTimeout(delayTimer);
33
+ delayTimer = undefined;
34
+ }
35
+ };
36
+ const closeChild = (code = result.code ?? 0, signal = result.signal ?? null) => {
37
+ if (closed)
38
+ return;
39
+ closed = true;
40
+ clearPending();
41
+ child.emit('close', code, signal);
42
+ };
43
+ child.kill = vi.fn((signal) => {
44
+ clearPending();
45
+ queueMicrotask(() => closeChild(null, typeof signal === 'string' ? signal : null));
46
+ return true;
47
+ });
48
+ const emitResult = () => {
49
+ if (closed)
50
+ return;
51
+ if (result.error) {
52
+ closed = true;
53
+ child.emit('error', result.error);
54
+ return;
55
+ }
56
+ if (result.stdout) {
57
+ child.stdout.emit('data', Buffer.from(result.stdout));
58
+ }
59
+ if (result.stderr) {
60
+ child.stderr.emit('data', Buffer.from(result.stderr));
61
+ }
62
+ result.beforeClose?.();
63
+ closeChild(result.code ?? 0, result.signal ?? null);
64
+ };
65
+ if (result.delayMs && result.delayMs > 0) {
66
+ delayTimer = setTimeout(emitResult, result.delayMs);
67
+ }
68
+ else {
69
+ queueMicrotask(emitResult);
70
+ }
71
+ return child;
72
+ });
73
+ vi.mock('node:child_process', async () => {
74
+ const actual = await vi.importActual('node:child_process');
75
+ return {
76
+ ...actual,
77
+ spawn: mockSubprocessSpawn,
78
+ };
79
+ });
80
+ const mockHuman = {
81
+ sendMessage: vi.fn().mockResolvedValue(undefined),
82
+ };
83
+ const mockRelayInstance = {
84
+ spawnPty: vi.fn(),
85
+ human: vi.fn().mockReturnValue(mockHuman),
86
+ shutdown: vi.fn().mockResolvedValue(undefined),
87
+ onBrokerStderr: vi.fn().mockReturnValue(() => { }),
88
+ listAgentsRaw: vi.fn().mockResolvedValue([]),
89
+ listAgents: vi.fn().mockResolvedValue([]),
90
+ onWorkerOutput: null,
91
+ onMessageReceived: null,
92
+ onAgentSpawned: null,
93
+ onAgentReleased: null,
94
+ onAgentExited: null,
95
+ onAgentIdle: null,
96
+ onDeliveryUpdate: null,
97
+ };
98
+ vi.mock('@relaycast/sdk', () => ({
99
+ RelayCast: vi.fn(),
100
+ RelayError: class RelayError extends Error {
101
+ },
102
+ }));
103
+ vi.mock('../../relay.js', () => ({
104
+ AgentRelay: vi.fn().mockImplementation(() => mockRelayInstance),
105
+ }));
106
+ const { workflow } = await import('../builder.js');
107
+ const { WorkflowRunner } = await import('../runner.js');
108
+ function makeDb() {
109
+ const runs = new Map();
110
+ const steps = new Map();
111
+ return {
112
+ insertRun: vi.fn(async (runRow) => {
113
+ runs.set(runRow.id, { ...runRow });
114
+ }),
115
+ updateRun: vi.fn(async (id, patch) => {
116
+ const existing = runs.get(id);
117
+ if (existing) {
118
+ runs.set(id, { ...existing, ...patch });
119
+ }
120
+ }),
121
+ getRun: vi.fn(async (id) => {
122
+ const run = runs.get(id);
123
+ return run ? { ...run } : null;
124
+ }),
125
+ insertStep: vi.fn(async (stepRow) => {
126
+ steps.set(stepRow.id, { ...stepRow });
127
+ }),
128
+ updateStep: vi.fn(async (id, patch) => {
129
+ const existing = steps.get(id);
130
+ if (existing) {
131
+ steps.set(id, { ...existing, ...patch });
132
+ }
133
+ }),
134
+ getStepsByRunId: vi.fn(async (runId) => {
135
+ return [...steps.values()].filter((step) => step.runId === runId).map((step) => ({ ...step }));
136
+ }),
137
+ };
138
+ }
139
+ function createWorkspace(subdirs = []) {
140
+ const dir = mkdtempSync(path.join(os.tmpdir(), 'relay-verification-traceback-'));
141
+ tempDirs.push(dir);
142
+ for (const subdir of subdirs) {
143
+ mkdirSync(path.join(dir, subdir), { recursive: true });
144
+ }
145
+ return dir;
146
+ }
147
+ function makeRunner(cwd) {
148
+ return new WorkflowRunner({
149
+ cwd,
150
+ db: makeDb(),
151
+ workspaceId: 'ws-test',
152
+ relay: {
153
+ env: {
154
+ AGENT_RELAY_WORKFLOW_DISABLE_RELAYCAST: '1',
155
+ },
156
+ },
157
+ });
158
+ }
159
+ function makeReport(tokens, overrides = {}) {
160
+ return {
161
+ cli: 'claude',
162
+ sessionId: 'session-1',
163
+ model: 'claude-sonnet-4',
164
+ provider: 'anthropic',
165
+ durationMs: 1_000,
166
+ cost: null,
167
+ tokens: {
168
+ input: tokens.input ?? 0,
169
+ output: tokens.output ?? 0,
170
+ cacheRead: tokens.cacheRead ?? 0,
171
+ },
172
+ turns: 1,
173
+ toolCalls: [],
174
+ errors: [],
175
+ finalStatus: 'completed',
176
+ summary: 'done',
177
+ ...overrides,
178
+ };
179
+ }
180
+ function makeConfig(input) {
181
+ const workerCwd = path.join(input.workspace, 'worker');
182
+ const diagCwd = path.join(input.workspace, 'diag');
183
+ return {
184
+ version: '1',
185
+ name: 'verification-traceback',
186
+ swarm: {
187
+ pattern: 'dag',
188
+ ...input.swarm,
189
+ },
190
+ errorHandling: {
191
+ strategy: 'retry',
192
+ retryDelayMs: 0,
193
+ },
194
+ agents: [
195
+ {
196
+ name: 'worker',
197
+ cli: 'claude',
198
+ interactive: false,
199
+ cwd: workerCwd,
200
+ },
201
+ ...(input.includeDiagnosticAgent === false
202
+ ? []
203
+ : [
204
+ {
205
+ name: 'diag',
206
+ cli: 'claude',
207
+ interactive: false,
208
+ cwd: diagCwd,
209
+ },
210
+ ]),
211
+ ],
212
+ workflows: [
213
+ {
214
+ name: 'default',
215
+ steps: [
216
+ {
217
+ name: 'implement',
218
+ agent: 'worker',
219
+ task: 'Implement the requested change',
220
+ retries: input.retries ?? 1,
221
+ verification: input.verification,
222
+ },
223
+ ],
224
+ },
225
+ ],
226
+ trajectories: false,
227
+ };
228
+ }
229
+ function verificationCommand() {
230
+ return (`sh -c 'if [ -f ready.txt ]; then exit 0; ` +
231
+ `else echo "compile error: missing semicolon" >&2; exit 1; fi'`);
232
+ }
233
+ function taskFromExecCall(execSpy, callIndex) {
234
+ const call = execSpy.mock.calls[callIndex];
235
+ return String(call?.[1]?.task ?? '');
236
+ }
237
+ function getBudgetTracker(runner) {
238
+ return runner.budgetTracker;
239
+ }
240
+ describe('verification traceback retry handling', () => {
241
+ beforeEach(() => {
242
+ vi.clearAllMocks();
243
+ queuedSubprocessResults = [];
244
+ queuedCollectorResults = [];
245
+ mockRelayInstance.shutdown.mockResolvedValue(undefined);
246
+ mockRelayInstance.onBrokerStderr.mockReturnValue(() => { });
247
+ mockRelayInstance.listAgents.mockResolvedValue([]);
248
+ mockRelayInstance.listAgentsRaw.mockResolvedValue([]);
249
+ });
250
+ afterAll(async () => {
251
+ await new Promise((resolve) => setTimeout(resolve, 250));
252
+ while (tempDirs.length > 0) {
253
+ rmSync(tempDirs.pop(), { recursive: true, force: true });
254
+ }
255
+ });
256
+ it('verification failure without diagnosticAgent uses standard retry', async () => {
257
+ const workspace = createWorkspace(['worker']);
258
+ const runner = makeRunner(workspace);
259
+ const execSpy = vi.spyOn(runner, 'execNonInteractive');
260
+ queuedSubprocessResults = [
261
+ { stdout: 'first attempt\n', code: 0 },
262
+ {
263
+ stdout: 'second attempt\n',
264
+ code: 0,
265
+ beforeClose: () => {
266
+ writeFileSync(path.join(workspace, 'ready.txt'), 'ok');
267
+ },
268
+ },
269
+ ];
270
+ const result = await runner.execute(makeConfig({
271
+ workspace,
272
+ includeDiagnosticAgent: false,
273
+ verification: {
274
+ type: 'custom',
275
+ value: verificationCommand(),
276
+ },
277
+ }), 'default');
278
+ expect(result.status, result.error).toBe('completed');
279
+ expect(execSpy).toHaveBeenCalledTimes(2);
280
+ const retryTask = taskFromExecCall(execSpy, 1);
281
+ expect(retryTask).toContain('[VERIFICATION FAILED]');
282
+ expect(retryTask).toContain(`Command: ${verificationCommand()}`);
283
+ expect(retryTask).toContain('compile error: missing semicolon');
284
+ expect(retryTask).not.toContain('Diagnostic analysis:');
285
+ });
286
+ it('verification failure with diagnosticAgent runs diagnostic before retry', async () => {
287
+ const workspace = createWorkspace(['worker', 'diag']);
288
+ const runner = makeRunner(workspace);
289
+ const execSpy = vi.spyOn(runner, 'execNonInteractive');
290
+ queuedSubprocessResults = [
291
+ { stdout: 'first attempt\n', code: 0 },
292
+ { stdout: 'The issue is in file X, line Y: missing semicolon\n', code: 0 },
293
+ { stdout: 'second attempt\n', code: 0 },
294
+ ];
295
+ const result = await runner.execute(makeConfig({
296
+ workspace,
297
+ verification: {
298
+ type: 'custom',
299
+ value: 'exit 1',
300
+ diagnosticAgent: 'diag',
301
+ },
302
+ }), 'default');
303
+ expect(result.status).toBe('failed');
304
+ expect(result.error).toContain('Step "implement" failed after 1 retries');
305
+ expect(execSpy).toHaveBeenCalledTimes(3);
306
+ const diagnosticCall = execSpy.mock.calls[1];
307
+ expect(diagnosticCall[0].name).toBe('diag');
308
+ expect(String(diagnosticCall[1].task)).toContain('Analyze what went wrong. Be specific. Do NOT fix the code.');
309
+ const retryTask = taskFromExecCall(execSpy, 2);
310
+ expect(retryTask).toContain('Diagnostic analysis:');
311
+ expect(retryTask).toContain('The issue is in file X, line Y: missing semicolon');
312
+ });
313
+ it('diagnostic agent timeout falls back to standard retry', async () => {
314
+ const workspace = createWorkspace(['worker', 'diag']);
315
+ const runner = makeRunner(workspace);
316
+ const execSpy = vi.spyOn(runner, 'execNonInteractive');
317
+ const logSpy = vi.spyOn(runner, 'log').mockImplementation(() => { });
318
+ queuedSubprocessResults = [
319
+ { stdout: 'first attempt\n', code: 0 },
320
+ { stdout: 'slow diagnostic\n', code: 0, delayMs: 5_000 },
321
+ {
322
+ stdout: 'second attempt\n',
323
+ code: 0,
324
+ beforeClose: () => {
325
+ writeFileSync(path.join(workspace, 'ready.txt'), 'ok');
326
+ },
327
+ },
328
+ ];
329
+ const result = await runner.execute(makeConfig({
330
+ workspace,
331
+ verification: {
332
+ type: 'custom',
333
+ value: verificationCommand(),
334
+ diagnosticAgent: 'diag',
335
+ diagnosticTimeout: 100,
336
+ },
337
+ }), 'default');
338
+ expect(result.status, result.error).toBe('completed');
339
+ expect(execSpy).toHaveBeenCalledTimes(3);
340
+ const retryTask = taskFromExecCall(execSpy, 2);
341
+ expect(retryTask).toContain('[VERIFICATION FAILED]');
342
+ expect(retryTask).toContain('compile error: missing semicolon');
343
+ expect(retryTask).not.toContain('Diagnostic analysis:');
344
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Diagnostic timed out'));
345
+ });
346
+ it('diagnostic agent failure falls back to standard retry', async () => {
347
+ const workspace = createWorkspace(['worker', 'diag']);
348
+ const runner = makeRunner(workspace);
349
+ const execSpy = vi.spyOn(runner, 'execNonInteractive');
350
+ const logSpy = vi.spyOn(runner, 'log').mockImplementation(() => { });
351
+ queuedSubprocessResults = [
352
+ { stdout: 'first attempt\n', code: 0 },
353
+ { error: new Error('diagnostic exploded') },
354
+ {
355
+ stdout: 'second attempt\n',
356
+ code: 0,
357
+ beforeClose: () => {
358
+ writeFileSync(path.join(workspace, 'ready.txt'), 'ok');
359
+ },
360
+ },
361
+ ];
362
+ const result = await runner.execute(makeConfig({
363
+ workspace,
364
+ verification: {
365
+ type: 'custom',
366
+ value: verificationCommand(),
367
+ diagnosticAgent: 'diag',
368
+ },
369
+ }), 'default');
370
+ expect(result.status, result.error).toBe('completed');
371
+ expect(execSpy).toHaveBeenCalledTimes(3);
372
+ const retryTask = taskFromExecCall(execSpy, 2);
373
+ expect(retryTask).toContain('[VERIFICATION FAILED]');
374
+ expect(retryTask).toContain('compile error: missing semicolon');
375
+ expect(retryTask).not.toContain('Diagnostic analysis:');
376
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Diagnostic failed'));
377
+ });
378
+ it('diagnosticAgent name validated against agent list', () => {
379
+ expect(() => {
380
+ workflow('traceback')
381
+ .agent('worker', { cli: 'claude' })
382
+ .step('implement', {
383
+ agent: 'worker',
384
+ task: 'Implement the requested change',
385
+ retries: 1,
386
+ verification: {
387
+ type: 'custom',
388
+ value: 'exit 1',
389
+ diagnosticAgent: 'nonexistent',
390
+ },
391
+ })
392
+ .toConfig();
393
+ }).toThrow('Step "implement" references unknown diagnosticAgent "nonexistent"');
394
+ });
395
+ it('diagnostic token usage recorded in budget tracker', async () => {
396
+ const workspace = createWorkspace(['worker', 'diag']);
397
+ const runner = makeRunner(workspace);
398
+ queuedSubprocessResults = [
399
+ { stdout: 'first attempt\n', code: 0 },
400
+ { stdout: 'The issue is in file X, line Y: missing semicolon\n', code: 0 },
401
+ {
402
+ stdout: 'second attempt\n',
403
+ code: 0,
404
+ beforeClose: () => {
405
+ writeFileSync(path.join(workspace, 'ready.txt'), 'ok');
406
+ },
407
+ },
408
+ ];
409
+ queuedCollectorResults = [null, makeReport({ input: 40, output: 10 }), null];
410
+ const result = await runner.execute(makeConfig({
411
+ workspace,
412
+ swarm: { tokenBudget: 1_000 },
413
+ verification: {
414
+ type: 'custom',
415
+ value: verificationCommand(),
416
+ diagnosticAgent: 'diag',
417
+ },
418
+ }), 'default');
419
+ const tracker = getBudgetTracker(runner);
420
+ expect(result.status, result.error).toBe('completed');
421
+ expect(mockCollectCliSession).toHaveBeenCalledTimes(3);
422
+ expect(tracker?.getTotalUsage()).toEqual({
423
+ input: 40,
424
+ output: 10,
425
+ cacheRead: 0,
426
+ total: 50,
427
+ });
428
+ });
429
+ it('no retries configured with diagnosticAgent logs warning', () => {
430
+ const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
431
+ workflow('traceback')
432
+ .agent('worker', { cli: 'claude' })
433
+ .agent('diag', { cli: 'claude' })
434
+ .step('implement', {
435
+ agent: 'worker',
436
+ task: 'Implement the requested change',
437
+ retries: 0,
438
+ verification: {
439
+ type: 'custom',
440
+ value: 'exit 1',
441
+ diagnosticAgent: 'diag',
442
+ },
443
+ })
444
+ .toConfig();
445
+ expect(warnSpy).toHaveBeenCalledWith('Step "implement": diagnosticAgent configured but no retries — diagnostic will never run');
446
+ });
447
+ });
448
+ //# sourceMappingURL=verification-traceback.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-traceback.test.js","sourceRoot":"","sources":["../../../src/workflows/__tests__/verification-traceback.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AASxE,MAAM,QAAQ,GAAa,EAAE,CAAC;AAiB9B,IAAI,uBAAuB,GAA6B,EAAE,CAAC;AAC3D,IAAI,sBAAsB,GAAsB,EAAE,CAAC;AAEnD,MAAM,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAsB,EAAoC,EAAE;IACrG,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,EAAE,CAAC;IAC5C,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,IAAI,IAAI,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5C,iBAAiB,EAAE,qBAAqB;CACzC,CAAC,CAAC,CAAC;AAEJ,MAAM,mBAAmB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAC/E,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,EAAE,IAAI;QAChD,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,CAAC;KACR,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,YAAY,EAK7B,CAAC;IAEF,KAAK,CAAC,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IAClC,KAAK,CAAC,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IAClC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;IAEjB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,UAAqD,CAAC;IAC1D,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,UAAU,EAAE,CAAC;YACf,YAAY,CAAC,UAAU,CAAC,CAAC;YACzB,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,OAAsB,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,SAAwB,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,EAAE;QAC3G,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,YAAY,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,MAAwB,EAAE,EAAE;QAC9C,YAAY,EAAE,CAAC;QACf,cAAc,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,MAAM;YAAE,OAAO;QACnB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,GAAG,IAAI,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC;IAEF,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACzC,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,cAAc,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;IACvC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAsC,oBAAoB,CAAC,CAAC;IAChG,OAAO;QACL,GAAG,MAAM;QACT,KAAK,EAAE,mBAAmB;KAC3B,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG;IAChB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;CAClD,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACxB,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;IACjB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC;IACzC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;IAC9C,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;IACjD,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC5C,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACzC,cAAc,EAAE,IAAiE;IACjF,iBAAiB,EAAE,IAAW;IAC9B,cAAc,EAAE,IAAW;IAC3B,eAAe,EAAE,IAAW;IAC5B,aAAa,EAAE,IAAW;IAC1B,WAAW,EAAE,IAAW;IACxB,gBAAgB,EAAE,IAAW;CAC9B,CAAC;AAEF,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;IAClB,UAAU,EAAE,MAAM,UAAW,SAAQ,KAAK;KAAG;CAC9C,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC;CAChE,CAAC,CAAC,CAAC;AAEJ,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;AACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;AAExD,SAAS,MAAM;IACb,MAAM,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEjD,OAAO;QACL,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,MAAsB,EAAE,EAAE;YAChD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC;QACF,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAU,EAAE,KAA8B,EAAE,EAAE;YACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC;QACF,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzB,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACjC,CAAC,CAAC;QACF,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,OAAwB,EAAE,EAAE;YACnD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC;QACF,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAU,EAAE,KAA+B,EAAE,EAAE;YACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC;QACF,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;YAC7C,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QACjG,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,UAAoB,EAAE;IAC7C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,+BAA+B,CAAC,CAAC,CAAC;IACjF,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,IAAI,cAAc,CAAC;QACxB,GAAG;QACH,EAAE,EAAE,MAAM,EAAE;QACZ,WAAW,EAAE,SAAS;QACtB,KAAK,EAAE;YACL,GAAG,EAAE;gBACH,sCAAsC,EAAE,GAAG;aAC5C;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CACjB,MAAwD,EACxD,YAAuC,EAAE;IAEzC,OAAO;QACL,GAAG,EAAE,QAAQ;QACb,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,WAAW;QACrB,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE,IAAI;QACV,MAAM,EAAE;YACN,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC;YAC1B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC;SACjC;QACD,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,EAAE;QACV,WAAW,EAAE,WAAW;QACxB,OAAO,EAAE,MAAM;QACf,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAMnB;IACC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEnD,OAAO;QACL,OAAO,EAAE,GAAG;QACZ,IAAI,EAAE,wBAAwB;QAC9B,KAAK,EAAE;YACL,OAAO,EAAE,KAAK;YACd,GAAG,KAAK,CAAC,KAAK;SACf;QACD,aAAa,EAAE;YACb,QAAQ,EAAE,OAAO;YACjB,YAAY,EAAE,CAAC;SAChB;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,QAAQ;gBACb,WAAW,EAAE,KAAK;gBAClB,GAAG,EAAE,SAAS;aACf;YACD,GAAG,CAAC,KAAK,CAAC,sBAAsB,KAAK,KAAK;gBACxC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,MAAM;wBACZ,GAAG,EAAE,QAAQ;wBACb,WAAW,EAAE,KAAK;wBAClB,GAAG,EAAE,OAAO;qBACa;iBAC5B,CAAC;SACP;QACD,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,WAAW;wBACjB,KAAK,EAAE,QAAQ;wBACf,IAAI,EAAE,gCAAgC;wBACtC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC;wBAC3B,YAAY,EAAE,KAAK,CAAC,YAAY;qBACjC;iBACF;aACF;SACF;QACD,YAAY,EAAE,KAAK;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,CACL,2CAA2C;QAC3C,+DAA+D,CAChE,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAoC,EACpC,SAAiB;IAEjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAqD,CAAC;IAC/F,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,gBAAgB,CAAC,MAA2C;IACnE,OAAQ,MAAc,CAAC,aAA0C,CAAC;AACpE,CAAC;AAED,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,uBAAuB,GAAG,EAAE,CAAC;QAC7B,sBAAsB,GAAG,EAAE,CAAC;QAC5B,iBAAiB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACxD,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC3D,iBAAiB,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACnD,iBAAiB,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAa,EAAE,oBAAoB,CAAC,CAAC;QAE9D,uBAAuB,GAAG;YACxB,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE;YACtC;gBACE,MAAM,EAAE,kBAAkB;gBAC1B,IAAI,EAAE,CAAC;gBACP,WAAW,EAAE,GAAG,EAAE;oBAChB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;gBACzD,CAAC;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CACjC,UAAU,CAAC;YACT,SAAS;YACT,sBAAsB,EAAE,KAAK;YAC7B,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB,EAAE;aAC7B;SACF,CAAC,EACF,SAAS,CACV,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,YAAY,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAa,EAAE,oBAAoB,CAAC,CAAC;QAE9D,uBAAuB,GAAG;YACxB,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE;YACtC,EAAE,MAAM,EAAE,qDAAqD,EAAE,IAAI,EAAE,CAAC,EAAE;YAC1E,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE;SACxC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CACjC,UAAU,CAAC;YACT,SAAS;YACT,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,QAAQ;gBACf,eAAe,EAAE,MAAM;aACxB;SACF,CAAC,EACF,SAAS,CACV,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;QAE1E,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAyC,CAAC;QACrF,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,4DAA4D,CAAC,CAAC;QAE/G,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,mDAAmD,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAa,EAAE,oBAAoB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,MAAa,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE3E,uBAAuB,GAAG;YACxB,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE;YACtC,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;YACxD;gBACE,MAAM,EAAE,kBAAkB;gBAC1B,IAAI,EAAE,CAAC;gBACP,WAAW,EAAE,GAAG,EAAE;oBAChB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;gBACzD,CAAC;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CACjC,UAAU,CAAC;YACT,SAAS;YACT,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB,EAAE;gBAC5B,eAAe,EAAE,MAAM;gBACvB,iBAAiB,EAAE,GAAG;aACvB;SACF,CAAC,EACF,SAAS,CACV,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAa,EAAE,oBAAoB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,MAAa,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE3E,uBAAuB,GAAG;YACxB,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE;YACtC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,qBAAqB,CAAC,EAAE;YAC3C;gBACE,MAAM,EAAE,kBAAkB;gBAC1B,IAAI,EAAE,CAAC;gBACP,WAAW,EAAE,GAAG,EAAE;oBAChB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;gBACzD,CAAC;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CACjC,UAAU,CAAC;YACT,SAAS;YACT,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB,EAAE;gBAC5B,eAAe,EAAE,MAAM;aACxB;SACF,CAAC,EACF,SAAS,CACV,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,GAAG,EAAE;YACV,QAAQ,CAAC,WAAW,CAAC;iBAClB,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;iBAClC,IAAI,CAAC,WAAW,EAAE;gBACjB,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,gCAAgC;gBACtC,OAAO,EAAE,CAAC;gBACV,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,QAAQ;oBACf,eAAe,EAAE,aAAa;iBAC/B;aACF,CAAC;iBACD,QAAQ,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAErC,uBAAuB,GAAG;YACxB,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE;YACtC,EAAE,MAAM,EAAE,qDAAqD,EAAE,IAAI,EAAE,CAAC,EAAE;YAC1E;gBACE,MAAM,EAAE,kBAAkB;gBAC1B,IAAI,EAAE,CAAC;gBACP,WAAW,EAAE,GAAG,EAAE;oBAChB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;gBACzD,CAAC;aACF;SACF,CAAC;QACF,sBAAsB,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAE7E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CACjC,UAAU,CAAC;YACT,SAAS;YACT,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE;YAC7B,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB,EAAE;gBAC5B,eAAe,EAAE,MAAM;aACxB;SACF,CAAC,EACF,SAAS,CACV,CAAC;QAEF,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,qBAAqB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC;YACvC,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEvE,QAAQ,CAAC,WAAW,CAAC;aAClB,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;aAClC,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;aAChC,IAAI,CAAC,WAAW,EAAE;YACjB,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,gCAAgC;YACtC,OAAO,EAAE,CAAC;YACV,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,QAAQ;gBACf,eAAe,EAAE,MAAM;aACxB;SACF,CAAC;aACD,QAAQ,EAAE,CAAC;QAEd,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAClC,yFAAyF,CAC1F,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -3,7 +3,7 @@ import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import os from 'node:os';
5
5
  // The module under test — does not exist yet (red phase).
6
- import { runVerification, stripInjectedTaskEcho, checkOutputContains, checkFileExists, WorkflowCompletionError, } from '../verification.js';
6
+ import { runVerification, stripInjectedTaskEcho, checkOutputContains, checkFileExists, checkCustom, execCustomVerification, WorkflowCompletionError, } from '../verification.js';
7
7
  // ── helpers ───────────────────────────────────────────────────────────────────
8
8
  const noopSideEffects = {
9
9
  recordStepToolSideEffect: vi.fn(),
@@ -76,11 +76,78 @@ describe('verification logic', () => {
76
76
  expect(() => run({ type: 'file_exists', value: path.join(tmpDir, 'nope.txt') }, '')).toThrow(WorkflowCompletionError);
77
77
  });
78
78
  });
79
- // 4. custom verification — returns { passed: false } (no-op in runner)
79
+ // 4. custom verification — shell command execution
80
80
  describe('custom', () => {
81
- it('should return passed: false (delegated to caller)', () => {
82
- const result = run({ type: 'custom', value: 'anything' }, 'output');
81
+ it('should pass when shell command exits 0', () => {
82
+ const result = run({ type: 'custom', value: 'true' }, 'output');
83
+ expect(result.passed).toBe(true);
84
+ expect(result.completionReason).toBe('completed_verified');
85
+ });
86
+ it('should fail when shell command exits non-zero', () => {
87
+ expect(() => run({ type: 'custom', value: 'false' }, 'output')).toThrow(WorkflowCompletionError);
88
+ });
89
+ it('should return failure with allowFailure', () => {
90
+ const result = run({ type: 'custom', value: 'false' }, 'output', 'test-step', {
91
+ allowFailure: true,
92
+ });
93
+ expect(result.passed).toBe(false);
94
+ expect(result.completionReason).toBe('failed_verification');
95
+ });
96
+ it('should preserve legacy no-op behavior when no command is provided', () => {
97
+ const result = run({ type: 'custom', value: '' }, 'output');
98
+ expect(result).toEqual({ passed: false });
99
+ });
100
+ it('should include command output in the failure message', () => {
101
+ const result = run({ type: 'custom', value: 'printf "compile failed" >&2; exit 1' }, 'output', 'test-step', {
102
+ allowFailure: true,
103
+ });
104
+ expect(result.error).toContain('custom check "printf "compile failed" >&2; exit 1" failed');
105
+ expect(result.error).toContain('compile failed');
106
+ });
107
+ });
108
+ describe('execCustomVerification', () => {
109
+ it('should return passed true for exit-0 command', () => {
110
+ expect(execCustomVerification('true', process.cwd())).toEqual({ passed: true, output: '' });
111
+ });
112
+ it('should return passed false for exit-1 command', () => {
113
+ const result = execCustomVerification('false', process.cwd());
114
+ expect(result.passed).toBe(false);
115
+ expect(result.output.length).toBeGreaterThanOrEqual(0);
116
+ });
117
+ it('should capture stdout from command', () => {
118
+ const result = execCustomVerification('echo hello', process.cwd());
119
+ expect(result.passed).toBe(true);
120
+ expect(result.output).toBe('hello');
121
+ });
122
+ it('should capture stderr from a failing command', () => {
123
+ const result = execCustomVerification('printf "boom" >&2; exit 1', process.cwd());
124
+ expect(result.passed).toBe(false);
125
+ expect(result.output).toContain('boom');
126
+ });
127
+ });
128
+ // 4b. checkCustom unit tests
129
+ describe('checkCustom', () => {
130
+ it('should return passed true for exit-0 command', () => {
131
+ expect(checkCustom('true', 'any')).toEqual({ passed: true, stdout: '' });
132
+ });
133
+ it('should return passed false for exit-1 command', () => {
134
+ const result = checkCustom('false', 'any');
135
+ expect(result.passed).toBe(false);
136
+ expect(result.error).toBeDefined();
137
+ });
138
+ it('should capture stdout from command', () => {
139
+ const result = checkCustom('echo hello', 'any');
140
+ expect(result.passed).toBe(true);
141
+ expect(result.stdout).toBe('hello');
142
+ });
143
+ it('should handle regex matching', () => {
144
+ expect(checkCustom('regex:^foo', 'foobar')).toEqual({ passed: true });
145
+ expect(checkCustom('regex:^foo', 'barfoo').passed).toBe(false);
146
+ });
147
+ it('should handle invalid regex gracefully', () => {
148
+ const result = checkCustom('regex:[', 'any');
83
149
  expect(result.passed).toBe(false);
150
+ expect(result.error).toContain('invalid regex');
84
151
  });
85
152
  });
86
153
  // 5. Invalid/unknown verification type — falls through gracefully
@@ -1 +1 @@
1
- {"version":3,"file":"verification.test.js","sourceRoot":"","sources":["../../../src/workflows/__tests__/verification.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verification.test.js","sourceRoot":"","sources":["../../../src/workflows/__tests__/verification.test.ts"],"names":[],"mappings":"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"}