@mknightzzz/stw 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +277 -0
  3. package/dist/agentic-fallback.d.ts +3 -0
  4. package/dist/agentic-fallback.js +32 -0
  5. package/dist/agentic-fallback.js.map +1 -0
  6. package/dist/agentic-prompt.d.ts +2 -0
  7. package/dist/agentic-prompt.js +68 -0
  8. package/dist/agentic-prompt.js.map +1 -0
  9. package/dist/agentic-runtime.d.ts +48 -0
  10. package/dist/agentic-runtime.js +149 -0
  11. package/dist/agentic-runtime.js.map +1 -0
  12. package/dist/agentic-types.d.ts +37 -0
  13. package/dist/agentic-types.js +2 -0
  14. package/dist/agentic-types.js.map +1 -0
  15. package/dist/agents.d.ts +7 -0
  16. package/dist/agents.js +2 -0
  17. package/dist/agents.js.map +1 -0
  18. package/dist/assignments.d.ts +7 -0
  19. package/dist/assignments.js +125 -0
  20. package/dist/assignments.js.map +1 -0
  21. package/dist/checkpoint.d.ts +35 -0
  22. package/dist/checkpoint.js +78 -0
  23. package/dist/checkpoint.js.map +1 -0
  24. package/dist/circuit-breaker.d.ts +17 -0
  25. package/dist/circuit-breaker.js +65 -0
  26. package/dist/circuit-breaker.js.map +1 -0
  27. package/dist/claim.d.ts +6 -0
  28. package/dist/claim.js +135 -0
  29. package/dist/claim.js.map +1 -0
  30. package/dist/clarity-gate.d.ts +12 -0
  31. package/dist/clarity-gate.js +83 -0
  32. package/dist/clarity-gate.js.map +1 -0
  33. package/dist/cli.d.ts +2 -0
  34. package/dist/cli.js +38 -0
  35. package/dist/cli.js.map +1 -0
  36. package/dist/command-dispatch.d.ts +45 -0
  37. package/dist/command-dispatch.js +206 -0
  38. package/dist/command-dispatch.js.map +1 -0
  39. package/dist/command-parser.d.ts +11 -0
  40. package/dist/command-parser.js +101 -0
  41. package/dist/command-parser.js.map +1 -0
  42. package/dist/commands/clean.d.ts +10 -0
  43. package/dist/commands/clean.js +133 -0
  44. package/dist/commands/clean.js.map +1 -0
  45. package/dist/commands/execution.d.ts +2 -0
  46. package/dist/commands/execution.js +327 -0
  47. package/dist/commands/execution.js.map +1 -0
  48. package/dist/commands/go.d.ts +2 -0
  49. package/dist/commands/go.js +197 -0
  50. package/dist/commands/go.js.map +1 -0
  51. package/dist/commands/helpers.d.ts +44 -0
  52. package/dist/commands/helpers.js +231 -0
  53. package/dist/commands/helpers.js.map +1 -0
  54. package/dist/commands/idea.d.ts +2 -0
  55. package/dist/commands/idea.js +89 -0
  56. package/dist/commands/idea.js.map +1 -0
  57. package/dist/commands/init.d.ts +2 -0
  58. package/dist/commands/init.js +94 -0
  59. package/dist/commands/init.js.map +1 -0
  60. package/dist/commands/integration.d.ts +7 -0
  61. package/dist/commands/integration.js +139 -0
  62. package/dist/commands/integration.js.map +1 -0
  63. package/dist/commands/maintenance.d.ts +2 -0
  64. package/dist/commands/maintenance.js +301 -0
  65. package/dist/commands/maintenance.js.map +1 -0
  66. package/dist/commands/run.d.ts +2 -0
  67. package/dist/commands/run.js +356 -0
  68. package/dist/commands/run.js.map +1 -0
  69. package/dist/commands/setup.d.ts +2 -0
  70. package/dist/commands/setup.js +198 -0
  71. package/dist/commands/setup.js.map +1 -0
  72. package/dist/commands/spec.d.ts +2 -0
  73. package/dist/commands/spec.js +35 -0
  74. package/dist/commands/spec.js.map +1 -0
  75. package/dist/commands/stats.d.ts +2 -0
  76. package/dist/commands/stats.js +80 -0
  77. package/dist/commands/stats.js.map +1 -0
  78. package/dist/commands/task-ops.d.ts +2 -0
  79. package/dist/commands/task-ops.js +406 -0
  80. package/dist/commands/task-ops.js.map +1 -0
  81. package/dist/config.d.ts +18 -0
  82. package/dist/config.js +338 -0
  83. package/dist/config.js.map +1 -0
  84. package/dist/cost.d.ts +30 -0
  85. package/dist/cost.js +167 -0
  86. package/dist/cost.js.map +1 -0
  87. package/dist/crash-recovery.d.ts +9 -0
  88. package/dist/crash-recovery.js +42 -0
  89. package/dist/crash-recovery.js.map +1 -0
  90. package/dist/diagnostic.d.ts +48 -0
  91. package/dist/diagnostic.js +328 -0
  92. package/dist/diagnostic.js.map +1 -0
  93. package/dist/doctor.d.ts +31 -0
  94. package/dist/doctor.js +225 -0
  95. package/dist/doctor.js.map +1 -0
  96. package/dist/drift.d.ts +11 -0
  97. package/dist/drift.js +57 -0
  98. package/dist/drift.js.map +1 -0
  99. package/dist/git-utils.d.ts +20 -0
  100. package/dist/git-utils.js +206 -0
  101. package/dist/git-utils.js.map +1 -0
  102. package/dist/gitlab.d.ts +54 -0
  103. package/dist/gitlab.js +101 -0
  104. package/dist/gitlab.js.map +1 -0
  105. package/dist/idea.d.ts +35 -0
  106. package/dist/idea.js +251 -0
  107. package/dist/idea.js.map +1 -0
  108. package/dist/import-resolution.d.ts +13 -0
  109. package/dist/import-resolution.js +111 -0
  110. package/dist/import-resolution.js.map +1 -0
  111. package/dist/inbox-renderer.d.ts +2 -0
  112. package/dist/inbox-renderer.js +67 -0
  113. package/dist/inbox-renderer.js.map +1 -0
  114. package/dist/init.d.ts +105 -0
  115. package/dist/init.js +235 -0
  116. package/dist/init.js.map +1 -0
  117. package/dist/llm-reviewer.d.ts +14 -0
  118. package/dist/llm-reviewer.js +109 -0
  119. package/dist/llm-reviewer.js.map +1 -0
  120. package/dist/lock.d.ts +26 -0
  121. package/dist/lock.js +76 -0
  122. package/dist/lock.js.map +1 -0
  123. package/dist/logger.d.ts +24 -0
  124. package/dist/logger.js +40 -0
  125. package/dist/logger.js.map +1 -0
  126. package/dist/math-utils.d.ts +2 -0
  127. package/dist/math-utils.js +7 -0
  128. package/dist/math-utils.js.map +1 -0
  129. package/dist/mechanical-review.d.ts +30 -0
  130. package/dist/mechanical-review.js +76 -0
  131. package/dist/mechanical-review.js.map +1 -0
  132. package/dist/merge.d.ts +83 -0
  133. package/dist/merge.js +363 -0
  134. package/dist/merge.js.map +1 -0
  135. package/dist/parallel.d.ts +35 -0
  136. package/dist/parallel.js +214 -0
  137. package/dist/parallel.js.map +1 -0
  138. package/dist/plan-validation.d.ts +19 -0
  139. package/dist/plan-validation.js +253 -0
  140. package/dist/plan-validation.js.map +1 -0
  141. package/dist/planner-prompt.d.ts +33 -0
  142. package/dist/planner-prompt.js +244 -0
  143. package/dist/planner-prompt.js.map +1 -0
  144. package/dist/planner.d.ts +29 -0
  145. package/dist/planner.js +511 -0
  146. package/dist/planner.js.map +1 -0
  147. package/dist/poller.d.ts +34 -0
  148. package/dist/poller.js +91 -0
  149. package/dist/poller.js.map +1 -0
  150. package/dist/progress.d.ts +34 -0
  151. package/dist/progress.js +122 -0
  152. package/dist/progress.js.map +1 -0
  153. package/dist/prompt-builder.d.ts +51 -0
  154. package/dist/prompt-builder.js +481 -0
  155. package/dist/prompt-builder.js.map +1 -0
  156. package/dist/provider.d.ts +14 -0
  157. package/dist/provider.js +278 -0
  158. package/dist/provider.js.map +1 -0
  159. package/dist/question-handler.d.ts +18 -0
  160. package/dist/question-handler.js +154 -0
  161. package/dist/question-handler.js.map +1 -0
  162. package/dist/question-triage.d.ts +31 -0
  163. package/dist/question-triage.js +175 -0
  164. package/dist/question-triage.js.map +1 -0
  165. package/dist/repo-detection.d.ts +8 -0
  166. package/dist/repo-detection.js +18 -0
  167. package/dist/repo-detection.js.map +1 -0
  168. package/dist/retry-context.d.ts +2 -0
  169. package/dist/retry-context.js +196 -0
  170. package/dist/retry-context.js.map +1 -0
  171. package/dist/router.d.ts +18 -0
  172. package/dist/router.js +137 -0
  173. package/dist/router.js.map +1 -0
  174. package/dist/run-artifact-types.d.ts +43 -0
  175. package/dist/run-artifact-types.js +2 -0
  176. package/dist/run-artifact-types.js.map +1 -0
  177. package/dist/run-summary.d.ts +14 -0
  178. package/dist/run-summary.js +347 -0
  179. package/dist/run-summary.js.map +1 -0
  180. package/dist/run-sync.d.ts +11 -0
  181. package/dist/run-sync.js +110 -0
  182. package/dist/run-sync.js.map +1 -0
  183. package/dist/run.d.ts +26 -0
  184. package/dist/run.js +150 -0
  185. package/dist/run.js.map +1 -0
  186. package/dist/scope-expansion.d.ts +10 -0
  187. package/dist/scope-expansion.js +117 -0
  188. package/dist/scope-expansion.js.map +1 -0
  189. package/dist/scope.d.ts +4 -0
  190. package/dist/scope.js +37 -0
  191. package/dist/scope.js.map +1 -0
  192. package/dist/scorecard.d.ts +18 -0
  193. package/dist/scorecard.js +128 -0
  194. package/dist/scorecard.js.map +1 -0
  195. package/dist/spec-templates.d.ts +2 -0
  196. package/dist/spec-templates.js +285 -0
  197. package/dist/spec-templates.js.map +1 -0
  198. package/dist/spec-validator.d.ts +8 -0
  199. package/dist/spec-validator.js +144 -0
  200. package/dist/spec-validator.js.map +1 -0
  201. package/dist/status.d.ts +68 -0
  202. package/dist/status.js +261 -0
  203. package/dist/status.js.map +1 -0
  204. package/dist/storage.d.ts +9 -0
  205. package/dist/storage.js +35 -0
  206. package/dist/storage.js.map +1 -0
  207. package/dist/task-executor-completion.d.ts +12 -0
  208. package/dist/task-executor-completion.js +67 -0
  209. package/dist/task-executor-completion.js.map +1 -0
  210. package/dist/task-executor-fallback.d.ts +20 -0
  211. package/dist/task-executor-fallback.js +12 -0
  212. package/dist/task-executor-fallback.js.map +1 -0
  213. package/dist/task-executor.d.ts +34 -0
  214. package/dist/task-executor.js +521 -0
  215. package/dist/task-executor.js.map +1 -0
  216. package/dist/task-graph.d.ts +11 -0
  217. package/dist/task-graph.js +226 -0
  218. package/dist/task-graph.js.map +1 -0
  219. package/dist/task-pipeline-helpers.d.ts +45 -0
  220. package/dist/task-pipeline-helpers.js +160 -0
  221. package/dist/task-pipeline-helpers.js.map +1 -0
  222. package/dist/task-review.d.ts +51 -0
  223. package/dist/task-review.js +410 -0
  224. package/dist/task-review.js.map +1 -0
  225. package/dist/transitions.d.ts +13 -0
  226. package/dist/transitions.js +104 -0
  227. package/dist/transitions.js.map +1 -0
  228. package/dist/types.d.ts +405 -0
  229. package/dist/types.js +101 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/utils.d.ts +1 -0
  232. package/dist/utils.js +23 -0
  233. package/dist/utils.js.map +1 -0
  234. package/dist/validation.d.ts +19 -0
  235. package/dist/validation.js +73 -0
  236. package/dist/validation.js.map +1 -0
  237. package/dist/worker-response.d.ts +12 -0
  238. package/dist/worker-response.js +60 -0
  239. package/dist/worker-response.js.map +1 -0
  240. package/dist/worker-runner.d.ts +19 -0
  241. package/dist/worker-runner.js +347 -0
  242. package/dist/worker-runner.js.map +1 -0
  243. package/dist/worktree-cleanup.d.ts +44 -0
  244. package/dist/worktree-cleanup.js +325 -0
  245. package/dist/worktree-cleanup.js.map +1 -0
  246. package/dist/worktree.d.ts +22 -0
  247. package/dist/worktree.js +213 -0
  248. package/dist/worktree.js.map +1 -0
  249. package/examples/spec.md +58 -0
  250. package/package.json +66 -0
@@ -0,0 +1,521 @@
1
+ /* eslint-disable max-lines */
2
+ import { execFileSync } from 'node:child_process';
3
+ import { existsSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { createWorktree } from './worktree.js';
6
+ import { buildGreenfieldChecks } from './repo-detection.js';
7
+ import { runWorker } from './worker-runner.js';
8
+ import { writeCheckpoint, readCheckpoint, resumeFromCheckpoint, clearCheckpointsFrom, } from './checkpoint.js';
9
+ import { getNextTier } from './router.js';
10
+ import { expandScope } from './scope.js';
11
+ import { buildWorkerPromptWithBudget } from './prompt-builder.js';
12
+ import { readWorkerQuestionResponse, handleWorkerQuestion, loadPersistedQuestionAnswers } from './question-handler.js';
13
+ import { runReviewPhase, checkpointNotDone } from './task-review.js';
14
+ import { tryTransition, prepareRetryWithDiagnostic, transitionToRetrying, recordWorkerCost, } from './task-pipeline-helpers.js';
15
+ import { maybeSwitchToAgenticFallback } from './task-executor-fallback.js';
16
+ import { finalizeTaskResult } from './task-executor-completion.js';
17
+ import { getTaskExecutionObservabilityMode } from './agentic-runtime.js';
18
+ import { STRUCTURAL_FAILURE_CLASSES, } from './types.js';
19
+ export async function executeTask(task, config, options) {
20
+ const { taskDir, repoRoot, runBranch, resume = false, stwRoot, runId, logger } = options;
21
+ const log = logger?.withTask(task.id);
22
+ if (stwRoot && runId) {
23
+ tryTransition(stwRoot, runId, task.id, 'queued', 'task-executor');
24
+ log?.withPhase('queued').info('Task queued');
25
+ }
26
+ const startCheckpoint = resume ? resumeFromCheckpoint(taskDir) : 'pre_worker';
27
+ if (startCheckpoint === null) {
28
+ return {
29
+ finalState: 'complete',
30
+ attempts: 0,
31
+ totalTokens: { input_tokens: 0, output_tokens: 0 },
32
+ executionMode: getTaskExecutionObservabilityMode(task),
33
+ };
34
+ }
35
+ if (stwRoot && runId) {
36
+ tryTransition(stwRoot, runId, task.id, 'working', 'task-executor');
37
+ log?.withPhase('working').info('Task working');
38
+ }
39
+ const isGreenfieldRoot = options.greenfield === true && task.dependencies.length === 0;
40
+ if (isGreenfieldRoot) {
41
+ log?.info('Greenfield root task detected, creating empty worktree');
42
+ }
43
+ const { worktreePath } = createWorktree({
44
+ repoRoot,
45
+ runBranch,
46
+ taskId: task.id,
47
+ preserveExisting: resume,
48
+ emptyWorktree: isGreenfieldRoot,
49
+ ...(isGreenfieldRoot && options.seedDir ? { seedDir: options.seedDir } : {}),
50
+ });
51
+ // For greenfield non-root tasks, detect scaffolded project and inject acceptance checks
52
+ const isGreenfieldDependent = options.greenfield === true && task.dependencies.length > 0;
53
+ if (isGreenfieldDependent && task.acceptance_checks.length === 0) {
54
+ const checks = buildGreenfieldChecks(worktreePath);
55
+ if (checks.length > 0) {
56
+ task.acceptance_checks = checks;
57
+ log?.info('Injected greenfield acceptance checks from detected repo', { checks });
58
+ }
59
+ }
60
+ if (!resume || startCheckpoint === 'pre_worker') {
61
+ const hasPackageLock = existsSync(join(worktreePath, 'package-lock.json'));
62
+ if (hasPackageLock) {
63
+ log?.info('Installing dependencies in worktree');
64
+ execFileSync('npm', ['ci', '--ignore-scripts'], {
65
+ cwd: worktreePath,
66
+ encoding: 'utf-8',
67
+ stdio: 'pipe',
68
+ timeout: 60_000,
69
+ });
70
+ }
71
+ else {
72
+ log?.info('No package-lock.json found, skipping npm ci');
73
+ }
74
+ }
75
+ let result;
76
+ try {
77
+ result = await runPipeline(task, config, options, worktreePath, startCheckpoint);
78
+ }
79
+ catch (err) {
80
+ log?.warn('Pipeline threw unexpected error, preserving worktree', {
81
+ error: err instanceof Error ? err.message : String(err),
82
+ worktreePath,
83
+ });
84
+ throw err;
85
+ }
86
+ if (options.deferMerge) {
87
+ const taskBranch = `${runBranch}-${task.id}`;
88
+ result.worktreePath = worktreePath;
89
+ result.taskBranch = taskBranch;
90
+ if (result.finalState !== 'complete') {
91
+ result.preservedWorktreePath = worktreePath;
92
+ }
93
+ return result;
94
+ }
95
+ return finalizeTaskResult({
96
+ taskId: task.id,
97
+ taskDescription: task.description,
98
+ runBranch,
99
+ repoRoot,
100
+ worktreePath,
101
+ taskDir: options.taskDir,
102
+ result,
103
+ logger: log,
104
+ });
105
+ }
106
+ async function runPipeline(task, config, options, worktreePath, startCheckpoint) {
107
+ const { taskDir, stwRoot, runId, logger, pricing, budget, onPhaseChange } = options;
108
+ const log = logger?.withTask(task.id);
109
+ const effectivePricing = pricing ?? config.pricing;
110
+ const effectiveBudget = budget ?? config.budget;
111
+ const maxPromptTokens = config.defaults.max_prompt_tokens ?? 32000;
112
+ // Rescue events accumulator
113
+ const rescueEvents = [];
114
+ let attempts = 0;
115
+ const totalTokens = { input_tokens: 0, output_tokens: 0 };
116
+ const maxAttempts = task.max_retries + 1;
117
+ let consecutiveRejects = 0;
118
+ let currentTier = task.model_tier;
119
+ let effectiveTask = task;
120
+ let usedAgenticFallback = task.planner_metadata?.fallback_to_single_call === true;
121
+ let finalFailureClass;
122
+ let workerResult = null;
123
+ if (startCheckpoint !== 'pre_worker') {
124
+ const saved = readCheckpoint(taskDir, 'post_worker');
125
+ if (saved)
126
+ workerResult = saved.worker_result;
127
+ }
128
+ let currentCheckpoint = startCheckpoint;
129
+ let retryReason;
130
+ const retryCtx = () => ({
131
+ task,
132
+ worktreePath,
133
+ taskDir,
134
+ attempts,
135
+ stwRoot,
136
+ runId,
137
+ log,
138
+ });
139
+ const doRetry = async (reason, diagnosticInput) => {
140
+ const result = await prepareRetryWithDiagnostic(retryCtx(), reason, diagnosticInput);
141
+ retryReason = result.retryReason;
142
+ currentCheckpoint = result.currentCheckpoint;
143
+ };
144
+ while (attempts < maxAttempts) {
145
+ if (options.stopCheck?.()) {
146
+ log?.info('Stop requested, halting task');
147
+ return {
148
+ finalState: 'stopped',
149
+ attempts,
150
+ totalTokens,
151
+ executionMode: getTaskExecutionObservabilityMode(effectiveTask),
152
+ failureClass: finalFailureClass,
153
+ events: rescueEvents,
154
+ };
155
+ }
156
+ attempts++;
157
+ if (checkpointNotDone(currentCheckpoint, 'pre_worker')) {
158
+ log?.withPhase('pre_worker').info(`Starting attempt ${attempts}`, { retry_reason: retryReason });
159
+ const promptBudget = buildWorkerPromptWithBudget({
160
+ repoRoot: worktreePath,
161
+ task: effectiveTask,
162
+ taskDir,
163
+ retryReason,
164
+ retryContextLevel: config.defaults.retry_context,
165
+ questionAnswers: loadPersistedQuestionAnswers(taskDir, task.id),
166
+ }, maxPromptTokens);
167
+ if (retryReason) {
168
+ const includedRetrySections = [];
169
+ const droppedRetrySections = [];
170
+ for (const entry of promptBudget.trimLog) {
171
+ if (entry.step === 'drop_local_imports') {
172
+ droppedRetrySections.push('local_import_context');
173
+ }
174
+ if (entry.step === 'truncate_context_files') {
175
+ includedRetrySections.push('truncated_context');
176
+ }
177
+ if (entry.step === 'drop_scope_context') {
178
+ droppedRetrySections.push('scope_context');
179
+ }
180
+ }
181
+ if (includedRetrySections.length === 0) {
182
+ includedRetrySections.push('retry_context');
183
+ }
184
+ log?.info('Retry prompt sections evaluated', {
185
+ estimated_tokens: promptBudget.estimatedTokens,
186
+ included_sections: includedRetrySections,
187
+ dropped_sections: droppedRetrySections,
188
+ });
189
+ }
190
+ if (!promptBudget.fits) {
191
+ log?.warn('Prompt still exceeds budget after trimming', {
192
+ estimated_tokens: promptBudget.estimatedTokens,
193
+ max_tokens: promptBudget.maxTokens,
194
+ });
195
+ const nextTier = getNextTier(currentTier);
196
+ if (nextTier) {
197
+ const oldTier = currentTier;
198
+ currentTier = nextTier;
199
+ attempts = 0;
200
+ retryReason = `Tier escalated from ${oldTier} to ${nextTier} after oversized prompt (${promptBudget.estimatedTokens} > ${promptBudget.maxTokens})`;
201
+ transitionToRetrying(stwRoot, runId, task.id);
202
+ clearCheckpointsFrom(taskDir, 'pre_worker');
203
+ currentCheckpoint = 'pre_worker';
204
+ continue;
205
+ }
206
+ if (stwRoot && runId) {
207
+ tryTransition(stwRoot, runId, task.id, 'escalated', 'task-executor');
208
+ }
209
+ return {
210
+ finalState: 'escalated',
211
+ attempts,
212
+ totalTokens,
213
+ executionMode: getTaskExecutionObservabilityMode(effectiveTask),
214
+ failureClass: finalFailureClass,
215
+ events: rescueEvents,
216
+ };
217
+ }
218
+ if (promptBudget.trimmed) {
219
+ log?.info('Prompt trimmed to fit budget', {
220
+ estimated_tokens: promptBudget.estimatedTokens,
221
+ max_tokens: promptBudget.maxTokens,
222
+ });
223
+ }
224
+ const promptBudgetRatio = promptBudget.estimatedTokens / promptBudget.maxTokens;
225
+ if (promptBudgetRatio > 0.7 || promptBudgetRatio > 0.9) {
226
+ const originalTier = currentTier;
227
+ if (promptBudgetRatio > 0.9 && currentTier === 'medium') {
228
+ currentTier = 'strong';
229
+ log?.info('Pre-escalation: tier escalated from medium to strong due to high prompt budget usage', {
230
+ estimated_tokens: promptBudget.estimatedTokens,
231
+ max_tokens: promptBudget.maxTokens,
232
+ ratio: promptBudgetRatio.toFixed(2),
233
+ });
234
+ }
235
+ else if (promptBudgetRatio > 0.7 && currentTier === 'cheap') {
236
+ currentTier = 'medium';
237
+ log?.info('Pre-escalation: tier escalated from cheap to medium due to high prompt budget usage', {
238
+ estimated_tokens: promptBudget.estimatedTokens,
239
+ max_tokens: promptBudget.maxTokens,
240
+ ratio: promptBudgetRatio.toFixed(2),
241
+ });
242
+ }
243
+ if (currentTier !== originalTier) {
244
+ effectiveTask = { ...effectiveTask, model_tier: currentTier };
245
+ }
246
+ }
247
+ writeCheckpoint(taskDir, 'pre_worker', {
248
+ attempt: attempts,
249
+ retry_reason: retryReason,
250
+ model_tier: currentTier,
251
+ prompt_tokens_estimate: promptBudget.estimatedTokens,
252
+ prompt_trimmed: promptBudget.trimmed,
253
+ timestamp: new Date().toISOString(),
254
+ });
255
+ currentCheckpoint = 'post_worker';
256
+ }
257
+ if (checkpointNotDone(currentCheckpoint, 'post_worker')) {
258
+ log?.withPhase('post_worker').info('Calling worker');
259
+ onPhaseChange?.(task.id, `worker/${task.id}`, 'running');
260
+ try {
261
+ workerResult = await runWorker(effectiveTask, config, worktreePath, taskDir, currentTier, log, options.verbose);
262
+ finalFailureClass = workerResult.failure_class;
263
+ const questionResponse = readWorkerQuestionResponse(taskDir);
264
+ if (questionResponse) {
265
+ const handledQuestion = handleWorkerQuestion({
266
+ questionResponse,
267
+ task: effectiveTask,
268
+ config,
269
+ taskDir,
270
+ stwRoot,
271
+ runId,
272
+ log,
273
+ tryTransition,
274
+ });
275
+ if (handledQuestion === 'waiting_for_human') {
276
+ // Record manual_rescue when task required human intervention
277
+ rescueEvents.push('manual_rescue');
278
+ onPhaseChange?.(task.id, `worker/${task.id}`, 'failed');
279
+ return {
280
+ finalState: 'stopped',
281
+ attempts,
282
+ totalTokens,
283
+ executionMode: getTaskExecutionObservabilityMode(effectiveTask),
284
+ failureClass: finalFailureClass,
285
+ events: rescueEvents,
286
+ };
287
+ }
288
+ clearCheckpointsFrom(taskDir, 'pre_worker');
289
+ currentCheckpoint = 'pre_worker';
290
+ attempts--;
291
+ onPhaseChange?.(task.id, `worker/${task.id}`, 'success');
292
+ continue;
293
+ }
294
+ onPhaseChange?.(task.id, `worker/${task.id}`, 'success');
295
+ }
296
+ catch (error) {
297
+ onPhaseChange?.(task.id, `worker/${task.id}`, 'failed');
298
+ const errorMessage = error instanceof Error ? error.message : String(error);
299
+ const questionResponse = readWorkerQuestionResponse(taskDir);
300
+ if (questionResponse) {
301
+ const handledQuestion = handleWorkerQuestion({
302
+ questionResponse,
303
+ task: effectiveTask,
304
+ config,
305
+ taskDir,
306
+ stwRoot,
307
+ runId,
308
+ log,
309
+ tryTransition,
310
+ });
311
+ if (handledQuestion === 'waiting_for_human') {
312
+ // Record manual_rescue when task required human intervention
313
+ rescueEvents.push('manual_rescue');
314
+ return {
315
+ finalState: 'stopped',
316
+ attempts,
317
+ totalTokens,
318
+ executionMode: getTaskExecutionObservabilityMode(effectiveTask),
319
+ failureClass: finalFailureClass,
320
+ events: rescueEvents,
321
+ };
322
+ }
323
+ clearCheckpointsFrom(taskDir, 'pre_worker');
324
+ currentCheckpoint = 'pre_worker';
325
+ attempts--;
326
+ continue;
327
+ }
328
+ log?.warn('Worker failed, treating as retry-able', { error: errorMessage });
329
+ if (attempts >= maxAttempts) {
330
+ // Skip escalation for structural failures — more compute won't help
331
+ if (finalFailureClass && STRUCTURAL_FAILURE_CLASSES.has(finalFailureClass)) {
332
+ log?.info('Structural failure, skipping tier/mode escalation', { failure_class: finalFailureClass });
333
+ break;
334
+ }
335
+ const switchedToAgentic = await maybeSwitchToAgenticFallback({
336
+ effectiveTask,
337
+ config,
338
+ usedAgenticFallback,
339
+ retryReasonMessage: `Escalating from single_call to agentic fallback after worker error: ${errorMessage}`,
340
+ diagnosticInput: {
341
+ stderr: errorMessage,
342
+ diff: workerResult?.diff,
343
+ },
344
+ setEffectiveTask: (nextTask) => {
345
+ effectiveTask = nextTask;
346
+ },
347
+ markUsed: () => {
348
+ usedAgenticFallback = true;
349
+ },
350
+ resetAttempts: () => {
351
+ attempts = 0;
352
+ },
353
+ doRetry,
354
+ });
355
+ if (switchedToAgentic) {
356
+ // Record agentic_fallback when maybeSwitchToAgenticFallback returns true
357
+ rescueEvents.push('agentic_fallback');
358
+ continue;
359
+ }
360
+ const nextTier = getNextTier(currentTier);
361
+ if (nextTier) {
362
+ const oldTier = currentTier;
363
+ currentTier = nextTier;
364
+ attempts = 0;
365
+ await doRetry(`Tier escalated from ${oldTier} to ${nextTier} after worker error: ${errorMessage}`, {
366
+ stderr: errorMessage,
367
+ diff: workerResult?.diff,
368
+ });
369
+ continue;
370
+ }
371
+ }
372
+ await doRetry(`Worker error: ${errorMessage}`, {
373
+ stderr: errorMessage,
374
+ diff: workerResult?.diff,
375
+ });
376
+ continue;
377
+ }
378
+ totalTokens.input_tokens += workerResult.token_usage.input_tokens;
379
+ totalTokens.output_tokens += workerResult.token_usage.output_tokens;
380
+ writeCheckpoint(taskDir, 'post_worker', {
381
+ worker_result: workerResult,
382
+ timestamp: new Date().toISOString(),
383
+ });
384
+ if (stwRoot && runId && effectivePricing) {
385
+ recordWorkerCost({
386
+ stwRoot,
387
+ runId,
388
+ taskId: task.id,
389
+ workerResult,
390
+ currentTier,
391
+ pricing: effectivePricing,
392
+ budget: effectiveBudget,
393
+ log,
394
+ });
395
+ }
396
+ currentCheckpoint = 'post_write';
397
+ }
398
+ if (!workerResult) {
399
+ throw new Error('Cannot proceed to review phase: worker result is missing');
400
+ }
401
+ // Pre-review scope safety net: warn on undeclared files that slipped past trim
402
+ if (workerResult.files_written.length > 0) {
403
+ const declaredScope = new Set(expandScope(effectiveTask).map((f) => f.replace(/^\.\//, '')));
404
+ const undeclaredFiles = workerResult.files_written
405
+ .map((f) => f.replace(/^\.\//, ''))
406
+ .filter((f) => !declaredScope.has(f));
407
+ if (undeclaredFiles.length > 0) {
408
+ log?.warn('Pre-review scope safety net: undeclared files detected after trim', {
409
+ undeclared: undeclaredFiles,
410
+ task_id: effectiveTask.id,
411
+ });
412
+ }
413
+ }
414
+ const reviewPhase = await runReviewPhase({
415
+ task: effectiveTask,
416
+ config,
417
+ workerResult,
418
+ worktreePath,
419
+ taskDir,
420
+ runBranch: options.runBranch,
421
+ currentTier,
422
+ consecutiveRejects,
423
+ attempts,
424
+ maxAttempts,
425
+ totalTokens,
426
+ stwRoot,
427
+ runId,
428
+ log,
429
+ pricing: effectivePricing,
430
+ onPhaseChange,
431
+ tryTransition,
432
+ }, currentCheckpoint);
433
+ const { outcome } = reviewPhase;
434
+ if (outcome.type === 'complete') {
435
+ return {
436
+ finalState: 'complete',
437
+ attempts,
438
+ totalTokens,
439
+ executionMode: workerResult.execution_mode,
440
+ failureClass: finalFailureClass,
441
+ events: rescueEvents,
442
+ };
443
+ }
444
+ if (outcome.type === 'terminal') {
445
+ return {
446
+ finalState: outcome.finalState,
447
+ attempts,
448
+ totalTokens,
449
+ executionMode: workerResult.execution_mode,
450
+ failureClass: finalFailureClass,
451
+ events: rescueEvents,
452
+ };
453
+ }
454
+ if (outcome.type === 'retry') {
455
+ // Check if this is an acceptance gate retry (fast-fail from validation/mechanical review)
456
+ if (outcome.reason === 'Acceptance checks failed' ||
457
+ outcome.reason.includes('Validation failed') ||
458
+ outcome.reason.includes('Tests failed') ||
459
+ outcome.reason.includes('Typecheck failed') ||
460
+ outcome.reason.includes('Scope violation')) {
461
+ rescueEvents.push('acceptance_gate_retry');
462
+ }
463
+ if (outcome.escalateTo === null && attempts >= maxAttempts) {
464
+ // Skip escalation for structural failures — more compute won't help
465
+ if (finalFailureClass && STRUCTURAL_FAILURE_CLASSES.has(finalFailureClass)) {
466
+ log?.info('Structural failure, skipping tier/mode escalation', { failure_class: finalFailureClass });
467
+ break;
468
+ }
469
+ const switchedToAgentic = await maybeSwitchToAgenticFallback({
470
+ effectiveTask,
471
+ config,
472
+ usedAgenticFallback,
473
+ retryReasonMessage: `Escalating from single_call to agentic fallback after review outcome: ${outcome.reason}`,
474
+ diagnosticInput: outcome.diagnosticInput,
475
+ setEffectiveTask: (nextTask) => {
476
+ effectiveTask = nextTask;
477
+ },
478
+ markUsed: () => {
479
+ usedAgenticFallback = true;
480
+ },
481
+ resetAttempts: () => {
482
+ attempts = 0;
483
+ },
484
+ doRetry,
485
+ });
486
+ if (switchedToAgentic) {
487
+ // Record agentic_fallback when maybeSwitchToAgenticFallback returns true
488
+ rescueEvents.push('agentic_fallback');
489
+ continue;
490
+ }
491
+ }
492
+ if (outcome.transitionState && stwRoot && runId) {
493
+ tryTransition(stwRoot, runId, task.id, outcome.transitionState, 'task-executor');
494
+ }
495
+ if (outcome.escalateTo)
496
+ currentTier = outcome.escalateTo;
497
+ if (outcome.resetAttempts)
498
+ attempts = 0;
499
+ if (outcome.resetRejects)
500
+ consecutiveRejects = 0;
501
+ else if (outcome.incrementRejects)
502
+ consecutiveRejects++;
503
+ await doRetry(outcome.reason, outcome.diagnosticInput);
504
+ continue;
505
+ }
506
+ break;
507
+ }
508
+ if (stwRoot && runId) {
509
+ tryTransition(stwRoot, runId, task.id, 'escalated', 'task-executor');
510
+ log?.withPhase('escalated').info('Task escalated after exhausting retries');
511
+ }
512
+ return {
513
+ finalState: 'escalated',
514
+ attempts,
515
+ totalTokens,
516
+ executionMode: getTaskExecutionObservabilityMode(effectiveTask),
517
+ failureClass: finalFailureClass,
518
+ events: rescueEvents,
519
+ };
520
+ }
521
+ //# sourceMappingURL=task-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-executor.js","sourceRoot":"","sources":["../src/task-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { TaskGraph, TaskState } from './types.js';
2
+ export interface GraphValidationResult {
3
+ valid: boolean;
4
+ errors: string[];
5
+ warnings: string[];
6
+ executionOrder: string[];
7
+ }
8
+ export declare function validateTaskGraph(graph: TaskGraph): GraphValidationResult;
9
+ export declare function getDependentTaskIds(graph: TaskGraph, taskId: string): string[];
10
+ export declare function getSkippableDescendantTaskIds(graph: TaskGraph, taskId: string, states: ReadonlyMap<string, TaskState>): string[];
11
+ export declare function getResettableSkippedTaskIds(graph: TaskGraph, taskId: string, states: ReadonlyMap<string, TaskState>): string[];