@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
package/dist/status.js ADDED
@@ -0,0 +1,261 @@
1
+ import { unlinkSync } from 'node:fs';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { join } from 'node:path';
4
+ import { getRunLockState } from './lock.js';
5
+ import { fileExists, readJson, runDir, taskDir, writeJson } from './storage.js';
6
+ import { TransitionError, validateRunTransition, validateTaskTransition } from './transitions.js';
7
+ import { loadCosts } from './cost.js';
8
+ function runEventsPath(stwRoot, runId) {
9
+ return join(runDir(stwRoot, runId), 'events.json');
10
+ }
11
+ function runMetricsPath(stwRoot, runId) {
12
+ return join(runDir(stwRoot, runId), 'metrics.json');
13
+ }
14
+ export function writeTaskStatus(stwRoot, runId, taskId, input) {
15
+ const status = {
16
+ schema_version: 1,
17
+ task_id: taskId,
18
+ agent_id: input.agent_id,
19
+ status: input.status,
20
+ completed_at: new Date().toISOString(),
21
+ notes: input.notes,
22
+ question_number: input.question_number,
23
+ preserved_worktree_path: input.preserved_worktree_path,
24
+ preserved_worktree_paths: input.preserved_worktree_paths,
25
+ stop_reason: input.stop_reason,
26
+ stopped_at: input.stopped_at,
27
+ stopped_by: input.stopped_by,
28
+ execution_mode: input.execution_mode,
29
+ failure_class: input.failure_class,
30
+ };
31
+ writeJson(join(taskDir(stwRoot, runId, taskId), 'status.json'), status);
32
+ return status;
33
+ }
34
+ export function readTaskStatus(stwRoot, runId, taskId) {
35
+ const statusPath = join(taskDir(stwRoot, runId, taskId), 'status.json');
36
+ if (!fileExists(statusPath)) {
37
+ return null;
38
+ }
39
+ return readJson(statusPath);
40
+ }
41
+ export function writeTaskState(stwRoot, runId, taskId, state, updatedBy) {
42
+ const statePath = join(taskDir(stwRoot, runId, taskId), 'state.json');
43
+ const currentRecord = fileExists(statePath) ? readJson(statePath) : null;
44
+ const from = currentRecord?.state ?? 'pending';
45
+ if (!validateTaskTransition(from, state)) {
46
+ throw new TransitionError(from, state, 'task');
47
+ }
48
+ const record = {
49
+ schema_version: 1,
50
+ task_id: taskId,
51
+ state,
52
+ updated_at: new Date().toISOString(),
53
+ updated_by: updatedBy,
54
+ previous_state: currentRecord?.state ?? null,
55
+ };
56
+ writeJson(statePath, record);
57
+ return record;
58
+ }
59
+ export function writeRunState(stwRoot, runId, state, options) {
60
+ const manifestPath = join(runDir(stwRoot, runId), 'manifest.json');
61
+ const manifest = readJson(manifestPath);
62
+ if (!validateRunTransition(manifest.status, state)) {
63
+ throw new TransitionError(manifest.status, state, 'run');
64
+ }
65
+ manifest.status = state;
66
+ if (state === 'paused') {
67
+ if (options?.pause_reason) {
68
+ manifest.pause_reason = options.pause_reason;
69
+ }
70
+ if (options?.drift_detected !== undefined) {
71
+ manifest.drift_detected = options.drift_detected;
72
+ }
73
+ }
74
+ else {
75
+ delete manifest.pause_reason;
76
+ delete manifest.drift_detected;
77
+ }
78
+ writeJson(manifestPath, manifest);
79
+ return manifest;
80
+ }
81
+ export function readRunStatus(stwRoot, runId, taskIds) {
82
+ const summary = {};
83
+ for (const taskId of taskIds) {
84
+ summary[taskId] = readTaskStatus(stwRoot, runId, taskId)?.status ?? 'pending';
85
+ }
86
+ return summary;
87
+ }
88
+ export function readTaskState(stwRoot, runId, taskId) {
89
+ const statePath = join(taskDir(stwRoot, runId, taskId), 'state.json');
90
+ if (!fileExists(statePath)) {
91
+ return null;
92
+ }
93
+ return readJson(statePath);
94
+ }
95
+ export function buildRunRecoveryReport(stwRoot, runId, taskIds) {
96
+ const manifestPath = join(runDir(stwRoot, runId), 'manifest.json');
97
+ const manifest = readJson(manifestPath);
98
+ const lockState = getRunLockState(stwRoot, runId);
99
+ const staleTasks = taskIds
100
+ .map((taskId) => {
101
+ const taskStatus = readTaskStatus(stwRoot, runId, taskId);
102
+ if (!taskStatus || taskStatus.status !== 'in_progress') {
103
+ return null;
104
+ }
105
+ return {
106
+ taskId,
107
+ taskStatus,
108
+ taskState: readTaskState(stwRoot, runId, taskId),
109
+ };
110
+ })
111
+ .filter((entry) => entry !== null);
112
+ const persistedInProgressWithoutLiveLock = staleTasks.length > 0 && !lockState.hasLiveLock;
113
+ const staleLock = lockState.hasStaleLock;
114
+ const stale = staleLock || persistedInProgressWithoutLiveLock;
115
+ const reason = staleLock
116
+ ? 'stale_lock'
117
+ : persistedInProgressWithoutLiveLock
118
+ ? 'persisted_in_progress_without_live_lock'
119
+ : 'none';
120
+ const guidance = [];
121
+ if (staleLock) {
122
+ guidance.push(`Lock file for run ${runId} is stale. Inspect status output, then run 'stw unlock' before retrying or resuming if recovery is confirmed.`);
123
+ guidance.push(`A stale lock is advisory recovery evidence; no run or task files have been rewritten automatically.`);
124
+ }
125
+ if (persistedInProgressWithoutLiveLock) {
126
+ guidance.push(`Run ${runId} has persisted task status marked in_progress but no live lock for this run. Treat this as an interrupted run.`);
127
+ guidance.push(`Inspect the affected task directories and checkpoints before making any manual changes.`);
128
+ guidance.push(`Status output should be treated as advisory stale-state reporting only; no automatic status mutation has been applied.`);
129
+ guidance.push(`Use 'stw retry ${runId} <task-id>' to requeue a failed/escalated task, or 'stw resume ${runId} [task-id]' if checkpoint recovery is appropriate.`);
130
+ guidance.push(`If a stale lock file is still present for this run, run 'stw unlock' after confirming the prior worker is dead.`);
131
+ guidance.push(`Do not rewrite status files automatically; operator confirmation is required.`);
132
+ }
133
+ return {
134
+ manifest,
135
+ stale,
136
+ reason,
137
+ staleTasks,
138
+ guidance,
139
+ };
140
+ }
141
+ export function readRunEvents(stwRoot, runId) {
142
+ const path = runEventsPath(stwRoot, runId);
143
+ if (!fileExists(path)) {
144
+ return {
145
+ schema_version: 1,
146
+ run_id: runId,
147
+ events: [],
148
+ };
149
+ }
150
+ return readJson(path);
151
+ }
152
+ export function recordRunEvent(stwRoot, runId, input) {
153
+ const artifact = readRunEvents(stwRoot, runId);
154
+ const event = {
155
+ schema_version: 1,
156
+ event_id: randomUUID(),
157
+ run_id: runId,
158
+ event_type: input.event_type,
159
+ created_at: new Date().toISOString(),
160
+ actor: input.actor,
161
+ task_id: input.task_id,
162
+ summary: input.summary,
163
+ details: input.details,
164
+ escalation_category: input.escalation_category,
165
+ metadata: input.metadata,
166
+ };
167
+ artifact.events.push(event);
168
+ writeJson(runEventsPath(stwRoot, runId), artifact);
169
+ return event;
170
+ }
171
+ export function readRunMetrics(stwRoot, runId) {
172
+ const path = runMetricsPath(stwRoot, runId);
173
+ if (!fileExists(path)) {
174
+ return null;
175
+ }
176
+ return readJson(path);
177
+ }
178
+ export function writeRunMetrics(stwRoot, runId, input) {
179
+ const artifact = {
180
+ schema_version: 1,
181
+ run_id: runId,
182
+ machine: input.machine,
183
+ operator: input.operator,
184
+ updated_at: new Date().toISOString(),
185
+ };
186
+ writeJson(runMetricsPath(stwRoot, runId), artifact);
187
+ return artifact;
188
+ }
189
+ export function resetTaskToPending(stwRoot, runId, taskId) {
190
+ const statePath = join(taskDir(stwRoot, runId, taskId), 'state.json');
191
+ if (fileExists(statePath)) {
192
+ unlinkSync(statePath);
193
+ }
194
+ }
195
+ export function markTaskSkipped(stwRoot, runId, taskId, reason) {
196
+ const agentId = 'system';
197
+ const statePath = join(taskDir(stwRoot, runId, taskId), 'state.json');
198
+ const currentRecord = readTaskState(stwRoot, runId, taskId);
199
+ const record = {
200
+ schema_version: 1,
201
+ task_id: taskId,
202
+ state: 'skipped',
203
+ updated_at: new Date().toISOString(),
204
+ updated_by: agentId,
205
+ previous_state: currentRecord?.state ?? null,
206
+ };
207
+ writeJson(statePath, record);
208
+ writeTaskStatus(stwRoot, runId, taskId, {
209
+ agent_id: agentId,
210
+ status: 'skipped',
211
+ notes: reason,
212
+ });
213
+ }
214
+ export function markTaskComplete(stwRoot, runId, taskId) {
215
+ const agentId = 'system';
216
+ const statePath = join(taskDir(stwRoot, runId, taskId), 'state.json');
217
+ const currentRecord = readTaskState(stwRoot, runId, taskId);
218
+ const record = {
219
+ schema_version: 1,
220
+ task_id: taskId,
221
+ state: 'complete',
222
+ updated_at: new Date().toISOString(),
223
+ updated_by: agentId,
224
+ previous_state: currentRecord?.state ?? null,
225
+ };
226
+ writeJson(statePath, record);
227
+ writeTaskStatus(stwRoot, runId, taskId, {
228
+ agent_id: agentId,
229
+ status: 'complete',
230
+ notes: '',
231
+ });
232
+ }
233
+ export function getStatusData(stwRoot, runId) {
234
+ const manifestPath = join(runDir(stwRoot, runId), 'manifest.json');
235
+ const manifest = readJson(manifestPath);
236
+ const graphPath = join(runDir(stwRoot, runId), 'task_graph.json');
237
+ const graph = readJson(graphPath);
238
+ const costs = loadCosts(stwRoot, runId);
239
+ const tasks = graph.tasks.map((task) => {
240
+ const taskStatus = readTaskStatus(stwRoot, runId, task.id);
241
+ const taskCost = costs?.task_costs[task.id];
242
+ return {
243
+ id: task.id,
244
+ description: task.description,
245
+ task_type: task.task_type,
246
+ state: task.state,
247
+ status: taskStatus?.status ?? null,
248
+ agent_id: taskStatus?.agent_id ?? null,
249
+ notes: taskStatus?.notes ?? null,
250
+ completed_at: taskStatus?.completed_at ?? null,
251
+ cost_usd: taskCost ?? null,
252
+ };
253
+ });
254
+ return {
255
+ runId,
256
+ manifest,
257
+ tasks,
258
+ total_cost_usd: costs?.total_cost_usd ?? 0,
259
+ };
260
+ }
261
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function ensureDir(dir: string): void;
2
+ export declare function writeAtomic(filePath: string, data: string): void;
3
+ export declare function writeJson(filePath: string, obj: unknown): void;
4
+ export declare function readJson<T>(filePath: string): T;
5
+ export declare function readText(filePath: string): string;
6
+ export declare function fileExists(filePath: string): boolean;
7
+ export declare function runDir(stwRoot: string, runId: string): string;
8
+ export declare function taskDir(stwRoot: string, runId: string, taskId: string): string;
9
+ export declare function pollerCheckpointPath(stwRoot: string, runId: string, mrIid: number | string): string;
@@ -0,0 +1,35 @@
1
+ import { mkdirSync, writeFileSync, readFileSync, renameSync, existsSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ export function ensureDir(dir) {
5
+ mkdirSync(dir, { recursive: true });
6
+ }
7
+ export function writeAtomic(filePath, data) {
8
+ ensureDir(dirname(filePath));
9
+ const tmp = filePath + '.tmp.' + randomUUID().slice(0, 8);
10
+ writeFileSync(tmp, data, 'utf-8');
11
+ renameSync(tmp, filePath);
12
+ }
13
+ export function writeJson(filePath, obj) {
14
+ writeAtomic(filePath, JSON.stringify(obj, null, 2) + '\n');
15
+ }
16
+ export function readJson(filePath) {
17
+ const raw = readFileSync(filePath, 'utf-8');
18
+ return JSON.parse(raw);
19
+ }
20
+ export function readText(filePath) {
21
+ return readFileSync(filePath, 'utf-8');
22
+ }
23
+ export function fileExists(filePath) {
24
+ return existsSync(filePath);
25
+ }
26
+ export function runDir(stwRoot, runId) {
27
+ return join(stwRoot, 'runs', runId);
28
+ }
29
+ export function taskDir(stwRoot, runId, taskId) {
30
+ return join(stwRoot, 'runs', runId, 'tasks', taskId);
31
+ }
32
+ export function pollerCheckpointPath(stwRoot, runId, mrIid) {
33
+ return join(runDir(stwRoot, runId), 'gitlab', `mr-${mrIid}-poller-checkpoint.json`);
34
+ }
35
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,IAAY;IACxD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,GAAY;IACtD,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,QAAgB;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE,KAAa;IACnD,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,KAAa,EAAE,MAAc;IACpE,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,KAAa,EAAE,KAAsB;IACzF,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,KAAK,yBAAyB,CAAC,CAAC;AACtF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Logger } from './logger.js';
2
+ import type { ExecuteTaskResult } from './task-executor.js';
3
+ export declare function finalizeTaskResult(input: {
4
+ taskId: string;
5
+ taskDescription: string;
6
+ runBranch: string;
7
+ repoRoot: string;
8
+ worktreePath: string;
9
+ taskDir: string;
10
+ result: ExecuteTaskResult;
11
+ logger?: Logger;
12
+ }): ExecuteTaskResult;
@@ -0,0 +1,67 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { applyPatchToBranch } from './git-utils.js';
5
+ import { cleanupWorktree } from './worktree.js';
6
+ export function finalizeTaskResult(input) {
7
+ const { taskId, taskDescription, runBranch, repoRoot, worktreePath, taskDir, result, logger } = input;
8
+ if (result.finalState === 'complete') {
9
+ const gitOpts = { cwd: worktreePath, encoding: 'utf-8', stdio: 'pipe' };
10
+ try {
11
+ execFileSync('git', ['add', '-A'], gitOpts);
12
+ execFileSync('git', ['commit', '--allow-empty', '-m', `feat(${taskId}): ${taskDescription}`], gitOpts);
13
+ const taskBranch = `${runBranch}-${taskId}`;
14
+ execFileSync('git', ['fetch', '.', `${taskBranch}:${runBranch}`], {
15
+ cwd: repoRoot,
16
+ encoding: 'utf-8',
17
+ stdio: 'pipe',
18
+ });
19
+ logger?.info('Task output committed and merged to run branch', {
20
+ execution_mode: result.executionMode,
21
+ failure_class: result.failureClass,
22
+ });
23
+ }
24
+ catch (err) {
25
+ logger?.warn('Failed to commit/merge task output', {
26
+ error: err instanceof Error ? err.message : String(err),
27
+ });
28
+ }
29
+ const patchPath = join(taskDir, 'diff.patch');
30
+ if (existsSync(patchPath)) {
31
+ const applyResult = applyPatchToBranch({
32
+ repoRoot,
33
+ branch: runBranch,
34
+ patchPath,
35
+ commitMessage: `stw(${taskId}): apply task changes`,
36
+ });
37
+ if (applyResult.success) {
38
+ logger?.info('Applied task diff to run branch');
39
+ }
40
+ else {
41
+ logger?.warn('Failed to apply task diff to run branch', {
42
+ error: applyResult.error,
43
+ });
44
+ }
45
+ }
46
+ cleanupWorktree(worktreePath, repoRoot);
47
+ try {
48
+ execFileSync('git', ['branch', '-D', `${runBranch}-${taskId}`], {
49
+ cwd: repoRoot,
50
+ encoding: 'utf-8',
51
+ stdio: 'pipe',
52
+ });
53
+ }
54
+ catch {
55
+ // Branch already gone.
56
+ }
57
+ return result;
58
+ }
59
+ result.preservedWorktreePath = worktreePath;
60
+ logger?.info('Worktree preserved for inspection', {
61
+ worktreePath,
62
+ execution_mode: result.executionMode,
63
+ failure_class: result.failureClass,
64
+ });
65
+ return result;
66
+ }
67
+ //# sourceMappingURL=task-executor-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-executor-completion.js","sourceRoot":"","sources":["../src/task-executor-completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { StwConfig, Task } from './types.js';
2
+ export declare function maybeSwitchToAgenticFallback(input: {
3
+ effectiveTask: Task;
4
+ config: StwConfig;
5
+ usedAgenticFallback: boolean;
6
+ retryReasonMessage: string;
7
+ diagnosticInput?: {
8
+ stderr: string;
9
+ stdout?: string;
10
+ diff?: string;
11
+ };
12
+ setEffectiveTask: (task: Task) => void;
13
+ markUsed: () => void;
14
+ resetAttempts: () => void;
15
+ doRetry: (reason: string, diagnosticInput?: {
16
+ stderr: string;
17
+ stdout?: string;
18
+ diff?: string;
19
+ }) => Promise<void>;
20
+ }): Promise<boolean>;
@@ -0,0 +1,12 @@
1
+ import { buildAgenticFallbackTask, shouldFallbackToAgentic } from './agentic-fallback.js';
2
+ export async function maybeSwitchToAgenticFallback(input) {
3
+ if (input.usedAgenticFallback || !shouldFallbackToAgentic(input.effectiveTask, input.config)) {
4
+ return false;
5
+ }
6
+ input.setEffectiveTask(buildAgenticFallbackTask(input.effectiveTask, input.config));
7
+ input.markUsed();
8
+ input.resetAttempts();
9
+ await input.doRetry(input.retryReasonMessage, input.diagnosticInput);
10
+ return true;
11
+ }
12
+ //# sourceMappingURL=task-executor-fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-executor-fallback.js","sourceRoot":"","sources":["../src/task-executor-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAG1F,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,KAUlD;IACC,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7F,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpF,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjB,KAAK,CAAC,aAAa,EAAE,CAAC;IACtB,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type ActionableFailureClass, type ExecutionObservabilityMode, type Task, type StwConfig, type PricingConfig, type BudgetConfig, type PhaseChangeState } from './types.js';
2
+ import type { Logger } from './logger.js';
3
+ export interface ExecuteTaskOptions {
4
+ taskDir: string;
5
+ repoRoot: string;
6
+ runBranch: string;
7
+ resume?: boolean;
8
+ stwRoot?: string;
9
+ runId?: string;
10
+ logger?: Logger;
11
+ pricing?: PricingConfig;
12
+ budget?: BudgetConfig;
13
+ onPhaseChange?: (taskId: string, phase: string, state: PhaseChangeState) => void;
14
+ stopCheck?: () => boolean;
15
+ verbose?: boolean;
16
+ deferMerge?: boolean;
17
+ greenfield?: boolean;
18
+ seedDir?: string;
19
+ }
20
+ export interface ExecuteTaskResult {
21
+ finalState: 'complete' | 'escalated' | 'rejected' | 'stopped';
22
+ attempts: number;
23
+ totalTokens: {
24
+ input_tokens: number;
25
+ output_tokens: number;
26
+ };
27
+ preservedWorktreePath?: string;
28
+ worktreePath?: string;
29
+ taskBranch?: string;
30
+ executionMode?: ExecutionObservabilityMode;
31
+ failureClass?: ActionableFailureClass;
32
+ events?: string[];
33
+ }
34
+ export declare function executeTask(task: Task, config: StwConfig, options: ExecuteTaskOptions): Promise<ExecuteTaskResult>;