steroids-cli 0.9.42 → 0.10.13

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 (232) hide show
  1. package/dist/cli/base-command.d.ts +16 -0
  2. package/dist/cli/base-command.d.ts.map +1 -0
  3. package/dist/cli/base-command.js +42 -0
  4. package/dist/cli/base-command.js.map +1 -0
  5. package/dist/cli/version-check.d.ts.map +1 -1
  6. package/dist/cli/version-check.js +28 -2
  7. package/dist/cli/version-check.js.map +1 -1
  8. package/dist/commands/disputes.js +15 -30
  9. package/dist/commands/disputes.js.map +1 -1
  10. package/dist/commands/gc.d.ts +1 -1
  11. package/dist/commands/gc.d.ts.map +1 -1
  12. package/dist/commands/gc.js +49 -64
  13. package/dist/commands/gc.js.map +1 -1
  14. package/dist/commands/git.d.ts.map +1 -1
  15. package/dist/commands/git.js +5 -8
  16. package/dist/commands/git.js.map +1 -1
  17. package/dist/commands/health-stuck.js +2 -6
  18. package/dist/commands/health-stuck.js.map +1 -1
  19. package/dist/commands/health.d.ts.map +1 -1
  20. package/dist/commands/health.js +2 -6
  21. package/dist/commands/health.js.map +1 -1
  22. package/dist/commands/llm.d.ts.map +1 -1
  23. package/dist/commands/llm.js +4 -12
  24. package/dist/commands/llm.js.map +1 -1
  25. package/dist/commands/locks.js +12 -24
  26. package/dist/commands/locks.js.map +1 -1
  27. package/dist/commands/loop-phases.d.ts +12 -4
  28. package/dist/commands/loop-phases.d.ts.map +1 -1
  29. package/dist/commands/loop-phases.js +163 -111
  30. package/dist/commands/loop-phases.js.map +1 -1
  31. package/dist/commands/purge.d.ts.map +1 -1
  32. package/dist/commands/purge.js +11 -22
  33. package/dist/commands/purge.js.map +1 -1
  34. package/dist/commands/runners-list.d.ts.map +1 -1
  35. package/dist/commands/runners-list.js +11 -30
  36. package/dist/commands/runners-list.js.map +1 -1
  37. package/dist/commands/runners-parallel.d.ts.map +1 -1
  38. package/dist/commands/runners-parallel.js +3 -7
  39. package/dist/commands/runners-parallel.js.map +1 -1
  40. package/dist/commands/runners.js +2 -9
  41. package/dist/commands/runners.js.map +1 -1
  42. package/dist/commands/scan.d.ts.map +1 -1
  43. package/dist/commands/scan.js +5 -8
  44. package/dist/commands/scan.js.map +1 -1
  45. package/dist/commands/sections-commands.d.ts.map +1 -1
  46. package/dist/commands/sections-commands.js +12 -24
  47. package/dist/commands/sections-commands.js.map +1 -1
  48. package/dist/commands/sections.js +6 -12
  49. package/dist/commands/sections.js.map +1 -1
  50. package/dist/commands/skills.d.ts +11 -0
  51. package/dist/commands/skills.d.ts.map +1 -0
  52. package/dist/commands/skills.js +181 -0
  53. package/dist/commands/skills.js.map +1 -0
  54. package/dist/commands/tasks-reset.d.ts +3 -0
  55. package/dist/commands/tasks-reset.d.ts.map +1 -0
  56. package/dist/commands/tasks-reset.js +200 -0
  57. package/dist/commands/tasks-reset.js.map +1 -0
  58. package/dist/commands/tasks.d.ts.map +1 -1
  59. package/dist/commands/tasks.js +57 -67
  60. package/dist/commands/tasks.js.map +1 -1
  61. package/dist/commands/web.d.ts.map +1 -1
  62. package/dist/commands/web.js +3 -1
  63. package/dist/commands/web.js.map +1 -1
  64. package/dist/config/loader.d.ts +1 -0
  65. package/dist/config/loader.d.ts.map +1 -1
  66. package/dist/config/loader.js.map +1 -1
  67. package/dist/database/connection.d.ts +10 -1
  68. package/dist/database/connection.d.ts.map +1 -1
  69. package/dist/database/connection.js +32 -6
  70. package/dist/database/connection.js.map +1 -1
  71. package/dist/database/queries.d.ts +18 -0
  72. package/dist/database/queries.d.ts.map +1 -1
  73. package/dist/database/queries.js +91 -20
  74. package/dist/database/queries.js.map +1 -1
  75. package/dist/database/schema.d.ts +2 -2
  76. package/dist/database/schema.d.ts.map +1 -1
  77. package/dist/database/schema.js +8 -0
  78. package/dist/database/schema.js.map +1 -1
  79. package/dist/git/status.d.ts.map +1 -1
  80. package/dist/git/status.js +13 -2
  81. package/dist/git/status.js.map +1 -1
  82. package/dist/git/submission-resolution.d.ts.map +1 -1
  83. package/dist/git/submission-resolution.js +3 -7
  84. package/dist/git/submission-resolution.js.map +1 -1
  85. package/dist/index.js +5 -0
  86. package/dist/index.js.map +1 -1
  87. package/dist/migrations/backfill.d.ts +3 -0
  88. package/dist/migrations/backfill.d.ts.map +1 -0
  89. package/dist/migrations/backfill.js +53 -0
  90. package/dist/migrations/backfill.js.map +1 -0
  91. package/dist/migrations/runner.d.ts.map +1 -1
  92. package/dist/migrations/runner.js +9 -0
  93. package/dist/migrations/runner.js.map +1 -1
  94. package/dist/orchestrator/base-runner.d.ts +14 -0
  95. package/dist/orchestrator/base-runner.d.ts.map +1 -0
  96. package/dist/orchestrator/base-runner.js +57 -0
  97. package/dist/orchestrator/base-runner.js.map +1 -0
  98. package/dist/orchestrator/coder.d.ts +4 -22
  99. package/dist/orchestrator/coder.d.ts.map +1 -1
  100. package/dist/orchestrator/coder.js +136 -183
  101. package/dist/orchestrator/coder.js.map +1 -1
  102. package/dist/orchestrator/coordinator.d.ts.map +1 -1
  103. package/dist/orchestrator/coordinator.js +1 -0
  104. package/dist/orchestrator/coordinator.js.map +1 -1
  105. package/dist/orchestrator/fallback-handler.d.ts +3 -23
  106. package/dist/orchestrator/fallback-handler.d.ts.map +1 -1
  107. package/dist/orchestrator/fallback-handler.js +40 -357
  108. package/dist/orchestrator/fallback-handler.js.map +1 -1
  109. package/dist/orchestrator/history-manager.d.ts +15 -0
  110. package/dist/orchestrator/history-manager.d.ts.map +1 -0
  111. package/dist/orchestrator/history-manager.js +93 -0
  112. package/dist/orchestrator/history-manager.js.map +1 -0
  113. package/dist/orchestrator/post-coder.d.ts.map +1 -1
  114. package/dist/orchestrator/post-coder.js +16 -24
  115. package/dist/orchestrator/post-coder.js.map +1 -1
  116. package/dist/orchestrator/post-reviewer.d.ts.map +1 -1
  117. package/dist/orchestrator/post-reviewer.js +25 -37
  118. package/dist/orchestrator/post-reviewer.js.map +1 -1
  119. package/dist/orchestrator/reviewer.d.ts +5 -29
  120. package/dist/orchestrator/reviewer.d.ts.map +1 -1
  121. package/dist/orchestrator/reviewer.js +193 -255
  122. package/dist/orchestrator/reviewer.js.map +1 -1
  123. package/dist/orchestrator/signal-parser.d.ts +32 -0
  124. package/dist/orchestrator/signal-parser.d.ts.map +1 -0
  125. package/dist/orchestrator/signal-parser.js +73 -0
  126. package/dist/orchestrator/signal-parser.js.map +1 -0
  127. package/dist/orchestrator/types.d.ts +9 -13
  128. package/dist/orchestrator/types.d.ts.map +1 -1
  129. package/dist/parallel/clone.d.ts.map +1 -1
  130. package/dist/parallel/clone.js +37 -2
  131. package/dist/parallel/clone.js.map +1 -1
  132. package/dist/parallel/merge-conflict-attempts.d.ts.map +1 -1
  133. package/dist/parallel/merge-conflict-attempts.js +4 -12
  134. package/dist/parallel/merge-conflict-attempts.js.map +1 -1
  135. package/dist/parallel/merge-conflict.d.ts.map +1 -1
  136. package/dist/parallel/merge-conflict.js +3 -10
  137. package/dist/parallel/merge-conflict.js.map +1 -1
  138. package/dist/parallel/merge-sealing.d.ts +0 -3
  139. package/dist/parallel/merge-sealing.d.ts.map +1 -1
  140. package/dist/parallel/merge-sealing.js +5 -9
  141. package/dist/parallel/merge-sealing.js.map +1 -1
  142. package/dist/prompts/coder.d.ts +1 -1
  143. package/dist/prompts/coder.d.ts.map +1 -1
  144. package/dist/prompts/coder.js +66 -119
  145. package/dist/prompts/coder.js.map +1 -1
  146. package/dist/prompts/prompt-helpers.d.ts +4 -0
  147. package/dist/prompts/prompt-helpers.d.ts.map +1 -1
  148. package/dist/prompts/prompt-helpers.js +35 -0
  149. package/dist/prompts/prompt-helpers.js.map +1 -1
  150. package/dist/prompts/reviewer.d.ts.map +1 -1
  151. package/dist/prompts/reviewer.js +1 -3
  152. package/dist/prompts/reviewer.js.map +1 -1
  153. package/dist/providers/claude.d.ts.map +1 -1
  154. package/dist/providers/claude.js +9 -1
  155. package/dist/providers/claude.js.map +1 -1
  156. package/dist/providers/codex.d.ts.map +1 -1
  157. package/dist/providers/codex.js +10 -1
  158. package/dist/providers/codex.js.map +1 -1
  159. package/dist/providers/gemini.d.ts +9 -48
  160. package/dist/providers/gemini.d.ts.map +1 -1
  161. package/dist/providers/gemini.js +133 -101
  162. package/dist/providers/gemini.js.map +1 -1
  163. package/dist/providers/interface.d.ts +9 -1
  164. package/dist/providers/interface.d.ts.map +1 -1
  165. package/dist/providers/interface.js +11 -1
  166. package/dist/providers/interface.js.map +1 -1
  167. package/dist/providers/invocation-logger.d.ts +2 -0
  168. package/dist/providers/invocation-logger.d.ts.map +1 -1
  169. package/dist/providers/invocation-logger.js +3 -3
  170. package/dist/providers/invocation-logger.js.map +1 -1
  171. package/dist/providers/mistral.d.ts.map +1 -1
  172. package/dist/providers/mistral.js +12 -1
  173. package/dist/providers/mistral.js.map +1 -1
  174. package/dist/providers/ping.d.ts +5 -0
  175. package/dist/providers/ping.d.ts.map +1 -0
  176. package/dist/providers/ping.js +35 -0
  177. package/dist/providers/ping.js.map +1 -0
  178. package/dist/providers/registry.d.ts +4 -0
  179. package/dist/providers/registry.d.ts.map +1 -1
  180. package/dist/providers/registry.js +18 -0
  181. package/dist/providers/registry.js.map +1 -1
  182. package/dist/runners/activity-log.d.ts.map +1 -1
  183. package/dist/runners/activity-log.js +12 -36
  184. package/dist/runners/activity-log.js.map +1 -1
  185. package/dist/runners/credit-pause.d.ts +2 -3
  186. package/dist/runners/credit-pause.d.ts.map +1 -1
  187. package/dist/runners/credit-pause.js +25 -40
  188. package/dist/runners/credit-pause.js.map +1 -1
  189. package/dist/runners/daemon.d.ts +0 -8
  190. package/dist/runners/daemon.d.ts.map +1 -1
  191. package/dist/runners/daemon.js +23 -76
  192. package/dist/runners/daemon.js.map +1 -1
  193. package/dist/runners/global-db.d.ts +14 -1
  194. package/dist/runners/global-db.d.ts.map +1 -1
  195. package/dist/runners/global-db.js +123 -59
  196. package/dist/runners/global-db.js.map +1 -1
  197. package/dist/runners/orchestrator-loop.d.ts.map +1 -1
  198. package/dist/runners/orchestrator-loop.js +2 -6
  199. package/dist/runners/orchestrator-loop.js.map +1 -1
  200. package/dist/runners/projects.d.ts +2 -32
  201. package/dist/runners/projects.d.ts.map +1 -1
  202. package/dist/runners/projects.js +23 -103
  203. package/dist/runners/projects.js.map +1 -1
  204. package/dist/runners/wakeup-checks.d.ts +0 -3
  205. package/dist/runners/wakeup-checks.d.ts.map +1 -1
  206. package/dist/runners/wakeup-checks.js +13 -26
  207. package/dist/runners/wakeup-checks.js.map +1 -1
  208. package/dist/runners/wakeup-timing.d.ts.map +1 -1
  209. package/dist/runners/wakeup-timing.js +4 -12
  210. package/dist/runners/wakeup-timing.js.map +1 -1
  211. package/dist/runners/wakeup.d.ts +1 -1
  212. package/dist/runners/wakeup.d.ts.map +1 -1
  213. package/dist/runners/wakeup.js +394 -359
  214. package/dist/runners/wakeup.js.map +1 -1
  215. package/dist/utils/tokens.d.ts +14 -0
  216. package/dist/utils/tokens.d.ts.map +1 -0
  217. package/dist/utils/tokens.js +62 -0
  218. package/dist/utils/tokens.js.map +1 -0
  219. package/migrations/004_add_section_dependencies.sql +1 -1
  220. package/migrations/017_add_invocation_runner_id.sql +8 -0
  221. package/migrations/018_expand_audit_columns.sql +13 -0
  222. package/migrations/019_add_task_start_sha.sql +9 -0
  223. package/migrations/manifest.json +25 -1
  224. package/package.json +4 -3
  225. package/dist/orchestrator/schemas.d.ts +0 -26
  226. package/dist/orchestrator/schemas.d.ts.map +0 -1
  227. package/dist/orchestrator/schemas.js +0 -154
  228. package/dist/orchestrator/schemas.js.map +0 -1
  229. package/dist/parallel/merge.test.d.ts +0 -5
  230. package/dist/parallel/merge.test.d.ts.map +0 -1
  231. package/dist/parallel/merge.test.js +0 -322
  232. package/dist/parallel/merge.test.js.map +0 -1
@@ -1,382 +1,65 @@
1
1
  "use strict";
2
2
  /**
3
- * Fallback handler for orchestrator output parsing
4
- * Multi-layer parsing strategy to handle invalid JSON
3
+ * Legacy fallback handler wrapping the new SignalParser.
4
+ * This file will be fully replaced in Task 5/6 when loop-phases is refactored,
5
+ * but for now it bridges the gap to allow deleting schemas.ts.
5
6
  */
6
7
  Object.defineProperty(exports, "__esModule", { value: true });
7
8
  exports.OrchestrationFallbackHandler = void 0;
8
- const schemas_js_1 = require("./schemas.js");
9
+ const signal_parser_js_1 = require("./signal-parser.js");
9
10
  class OrchestrationFallbackHandler {
10
- static UNQUOTED_KEY_REGEX = /([{,]\s*)([A-Za-z_][A-Za-z0-9_]*)(\s*:)/g;
11
- static SINGLE_QUOTED_STRING_REGEX = /'((?:\\.|[^'\\])*)'/g;
12
- hasCompletionIndicator(lowerOutput) {
13
- if (/\b(?:not|no|not yet|still not|cannot|can't|unable to)\s+(?:task\s+)?(?:is\s+)?(?:complete|complete[d]?|finished|done|ready)\b/.test(lowerOutput)) {
14
- return false;
15
- }
16
- return /\b(?:task\s+)?(?:is\s+)?(?:complete|complete[d]?|implemented|finished|done|ready for review|ready)\b/.test(lowerOutput);
17
- }
18
- hasCommitIndicator(lowerOutput) {
19
- if (/\b(commit|committed)\b.*\b(?:fail|failed|failure|error|unable|cannot|denied|rejected|blocked|aborted)\b/.test(lowerOutput)) {
20
- return false;
21
- }
22
- if (/\b(?:fail|failed|error|unable|cannot|denied|rejected|blocked|aborted)\b.*\b(commit|committed)\b/.test(lowerOutput)) {
23
- return false;
24
- }
25
- return /\b(committed|commit)\b/.test(lowerOutput);
26
- }
27
- hasErrorIndicator(lowerOutput) {
28
- return /\b(fatal|error|failed)\b/.test(lowerOutput);
29
- }
30
- normalizeJsonCandidate(raw) {
31
- let normalized = raw.trim();
32
- // Strip markdown fences if present
33
- const fencedMatch = normalized.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i);
34
- if (fencedMatch?.[1]) {
35
- normalized = fencedMatch[1].trim();
36
- }
37
- // Normalize smart quotes
38
- normalized = normalized
39
- .replace(/[“”]/g, '"')
40
- .replace(/[‘’]/g, "'");
41
- // Quote unquoted object keys: { action: "retry" } -> { "action": "retry" }
42
- normalized = normalized.replace(OrchestrationFallbackHandler.UNQUOTED_KEY_REGEX, '$1"$2"$3');
43
- // Convert single-quoted strings to JSON-safe double-quoted strings
44
- normalized = normalized.replace(OrchestrationFallbackHandler.SINGLE_QUOTED_STRING_REGEX, (_match, inner) => `"${inner.replace(/"/g, '\\"')}"`);
45
- // Remove trailing commas
46
- normalized = normalized.replace(/,\s*([}\]])/g, '$1');
47
- // Normalize python-ish literals that occasionally leak
48
- normalized = normalized
49
- .replace(/\bTrue\b/g, 'true')
50
- .replace(/\bFalse\b/g, 'false')
51
- .replace(/\bNone\b/g, 'null');
52
- return normalized;
53
- }
54
- tryRepairAndParse(rawOutput, validator, successLog) {
55
- const candidates = [rawOutput];
56
- const jsonBlock = rawOutput.match(/```json\s*([\s\S]*?)\s*```/i);
57
- if (jsonBlock?.[1]) {
58
- candidates.push(jsonBlock[1]);
59
- }
60
- const start = rawOutput.indexOf('{');
61
- const end = rawOutput.lastIndexOf('}');
62
- if (start !== -1 && end !== -1 && end > start) {
63
- candidates.push(rawOutput.substring(start, end + 1));
64
- }
65
- for (const candidate of candidates) {
66
- const normalized = this.normalizeJsonCandidate(candidate);
67
- try {
68
- const parsed = JSON.parse(normalized);
69
- const { valid, data } = validator(parsed);
70
- if (valid) {
71
- console.log(successLog);
72
- return data;
73
- }
74
- }
75
- catch {
76
- // Continue to next candidate
77
- }
78
- }
79
- return null;
80
- }
81
- /**
82
- * Parse coder orchestrator output with multi-layer fallback
83
- */
84
11
  parseCoderOutput(rawOutput) {
85
- // Layer 1: Direct JSON parse
86
- try {
87
- const parsed = JSON.parse(rawOutput);
88
- const { valid, data } = (0, schemas_js_1.validateCoderResultWithLogging)(parsed);
89
- if (valid) {
90
- console.log('[Orchestrator] ✓ Layer 1: Direct JSON parse succeeded');
91
- return data;
92
- }
93
- }
94
- catch (e) {
95
- // Continue to next layer
96
- }
97
- // Layer 2: Extract from markdown code block
98
- const jsonBlock = rawOutput.match(/```json\s*([\s\S]*?)\s*```/);
99
- if (jsonBlock) {
100
- try {
101
- const parsed = JSON.parse(jsonBlock[1]);
102
- const { valid, data } = (0, schemas_js_1.validateCoderResultWithLogging)(parsed);
103
- if (valid) {
104
- console.log('[Orchestrator] ✓ Layer 2: Markdown extraction succeeded');
105
- return data;
106
- }
107
- }
108
- catch (e) {
109
- // Continue to next layer
110
- }
111
- }
112
- // Layer 3: Find first { to last }
113
- const start = rawOutput.indexOf('{');
114
- const end = rawOutput.lastIndexOf('}');
115
- if (start !== -1 && end !== -1 && end > start) {
116
- try {
117
- const parsed = JSON.parse(rawOutput.substring(start, end + 1));
118
- const { valid, data } = (0, schemas_js_1.validateCoderResultWithLogging)(parsed);
119
- if (valid) {
120
- console.log('[Orchestrator] ✓ Layer 3: Substring extraction succeeded');
121
- return data;
122
- }
123
- }
124
- catch (e) {
125
- // Continue to next layer
126
- }
127
- }
128
- // Layer 4: Repair malformed JSON and validate
129
- const repaired = this.tryRepairAndParse(rawOutput, schemas_js_1.validateCoderResultWithLogging, '[Orchestrator] ✓ Layer 4: JSON repair succeeded');
130
- if (repaired) {
131
- return repaired;
132
- }
133
- // Layer 5: Keyword fallback
134
- console.warn('[Orchestrator] ⚠ Layer 5: Using keyword fallback (all parsing+repair failed)');
135
- return this.keywordFallbackCoder(rawOutput);
136
- }
137
- /**
138
- * Parse reviewer orchestrator output with multi-layer fallback
139
- */
140
- parseReviewerOutput(rawOutput) {
141
- // Layer 1: Direct JSON parse
142
- try {
143
- const parsed = JSON.parse(rawOutput);
144
- const { valid, data } = (0, schemas_js_1.validateReviewerResultWithLogging)(parsed);
145
- if (valid) {
146
- console.log('[Orchestrator] ✓ Layer 1: Direct JSON parse succeeded');
147
- return data;
148
- }
149
- }
150
- catch (e) {
151
- // Continue to next layer
152
- }
153
- // Layer 2: Extract from markdown code block
154
- const jsonBlock = rawOutput.match(/```json\s*([\s\S]*?)\s*```/);
155
- if (jsonBlock) {
156
- try {
157
- const parsed = JSON.parse(jsonBlock[1]);
158
- const { valid, data } = (0, schemas_js_1.validateReviewerResultWithLogging)(parsed);
159
- if (valid) {
160
- console.log('[Orchestrator] ✓ Layer 2: Markdown extraction succeeded');
161
- return data;
162
- }
163
- }
164
- catch (e) {
165
- // Continue to next layer
166
- }
167
- }
168
- // Layer 3: Find first { to last }
169
- const start = rawOutput.indexOf('{');
170
- const end = rawOutput.lastIndexOf('}');
171
- if (start !== -1 && end !== -1 && end > start) {
172
- try {
173
- const parsed = JSON.parse(rawOutput.substring(start, end + 1));
174
- const { valid, data } = (0, schemas_js_1.validateReviewerResultWithLogging)(parsed);
175
- if (valid) {
176
- console.log('[Orchestrator] ✓ Layer 3: Substring extraction succeeded');
177
- return data;
178
- }
179
- }
180
- catch (e) {
181
- // Continue to next layer
182
- }
183
- }
184
- // Layer 4: Repair malformed JSON and validate
185
- const repaired = this.tryRepairAndParse(rawOutput, schemas_js_1.validateReviewerResultWithLogging, '[Orchestrator] ✓ Layer 4: JSON repair succeeded');
186
- if (repaired) {
187
- return repaired;
188
- }
189
- // Layer 5: Explicit decision fallback
190
- console.warn('[Orchestrator] ⚠ Layer 5: Using explicit decision fallback (all parsing+repair failed)');
191
- return this.keywordFallbackReviewer(rawOutput);
192
- }
193
- extractExplicitReviewerDecision(output) {
194
- const map = {
195
- APPROVE: 'approve',
196
- REJECT: 'reject',
197
- DISPUTE: 'dispute',
198
- SKIP: 'skip',
199
- };
200
- // Use the LAST DECISION token in the output, not the first.
201
- // When a provider session is resumed, the full conversation history is replayed
202
- // and old DECISION tokens from previous reviews appear before the current one.
203
- const decisionPattern = /(?:^|[\n\r])\s*(?:\*\*)?DECISION(?:\*\*)?\s*(?::|-)\s*(APPROVE|REJECT|DISPUTE|SKIP)\b/gim;
204
- let lastMatch = null;
205
- let match;
206
- while ((match = decisionPattern.exec(output)) !== null) {
207
- lastMatch = match;
208
- }
209
- if (lastMatch?.[1]) {
210
- return map[lastMatch[1].toUpperCase()] ?? null;
211
- }
212
- // Fallback: last non-empty line starting with a bare decision token
213
- const lines = output.split(/[\n\r]+/);
214
- for (let i = lines.length - 1; i >= 0; i--) {
215
- const line = lines[i].trim();
216
- if (!line)
217
- continue;
218
- const token = line.match(/^(APPROVE|REJECT|DISPUTE|SKIP)\b/i)?.[1];
219
- if (token) {
220
- return map[token.toUpperCase()] ?? null;
221
- }
222
- break; // only check the last non-empty line
223
- }
224
- return null;
225
- }
226
- /**
227
- * Keyword-based fallback for coder orchestrator
228
- */
229
- keywordFallbackCoder(output) {
230
- const lower = output.toLowerCase();
231
- // Check for timeout
232
- if (/timeout|timed out/.test(lower)) {
233
- return {
234
- action: 'retry',
235
- reasoning: 'FALLBACK: Detected timeout',
236
- commits: [],
237
- next_status: 'in_progress',
238
- metadata: {
239
- files_changed: 0,
240
- confidence: 'low',
241
- exit_clean: false,
242
- has_commits: false
243
- }
244
- };
245
- }
246
- // Check for errors
247
- if (this.hasErrorIndicator(lower) && !this.hasCommitIndicator(lower)) {
248
- return {
249
- action: 'error',
250
- reasoning: 'FALLBACK: Detected error keywords',
251
- commits: [],
252
- next_status: 'failed',
253
- metadata: {
254
- files_changed: 0,
255
- confidence: 'low',
256
- exit_clean: false,
257
- has_commits: false
258
- }
259
- };
260
- }
261
- // Check for completion with commit
262
- if (this.hasCommitIndicator(lower) && !this.hasErrorIndicator(lower)) {
263
- return {
264
- action: 'submit',
265
- reasoning: 'FALLBACK: Detected commit keywords',
266
- commits: [],
267
- next_status: 'review',
268
- metadata: {
269
- files_changed: 0,
270
- confidence: 'low',
271
- exit_clean: true,
272
- has_commits: false
273
- }
274
- };
275
- }
276
- // Check for completion signals
277
- if (this.hasCompletionIndicator(lower)) {
12
+ const signal = signal_parser_js_1.SignalParser.parseCoderSignal(rawOutput);
13
+ if (signal === 'review') {
278
14
  return {
279
15
  action: 'submit',
280
- reasoning: 'FALLBACK: Detected completion keywords',
16
+ reasoning: 'SignalParser detected STATUS: REVIEW',
281
17
  commits: [],
282
18
  next_status: 'review',
283
- metadata: {
284
- files_changed: 0,
285
- confidence: 'low',
286
- exit_clean: true,
287
- has_commits: false
288
- }
19
+ files_changed: 1,
20
+ confidence: 'high',
21
+ exit_clean: true,
22
+ has_commits: false
289
23
  };
290
24
  }
291
- // Safe default: retry
292
25
  return {
293
26
  action: 'retry',
294
- reasoning: 'FALLBACK: Orchestrator failed, defaulting to retry',
27
+ reasoning: 'SignalParser detected unclear status',
295
28
  commits: [],
296
29
  next_status: 'in_progress',
297
- metadata: {
298
- files_changed: 0,
299
- confidence: 'low',
300
- exit_clean: true,
301
- has_commits: false
302
- }
30
+ files_changed: 0,
31
+ confidence: 'low',
32
+ exit_clean: true,
33
+ has_commits: false
303
34
  };
304
35
  }
305
- /**
306
- * Explicit-token fallback for reviewer orchestrator
307
- */
308
- keywordFallbackReviewer(output) {
309
- const decision = this.extractExplicitReviewerDecision(output);
310
- if (decision === 'approve') {
311
- return {
312
- decision: 'approve',
313
- reasoning: 'FALLBACK: Explicit DECISION token APPROVE',
314
- notes: 'Approved based on explicit reviewer decision token',
315
- next_status: 'completed',
316
- metadata: {
317
- rejection_count: 0,
318
- confidence: 'low',
319
- push_to_remote: true,
320
- repeated_issue: false
321
- }
322
- };
323
- }
324
- if (decision === 'reject') {
325
- return {
326
- decision: 'reject',
327
- reasoning: 'FALLBACK: Explicit DECISION token REJECT',
328
- notes: 'Rejected - see reviewer output for details',
329
- next_status: 'in_progress',
330
- metadata: {
331
- rejection_count: 0,
332
- confidence: 'low',
333
- push_to_remote: false,
334
- repeated_issue: false
335
- }
336
- };
337
- }
338
- if (decision === 'dispute') {
339
- return {
340
- decision: 'dispute',
341
- reasoning: 'FALLBACK: Explicit DECISION token DISPUTE',
342
- notes: 'Dispute detected - human decision needed',
343
- next_status: 'disputed',
344
- metadata: {
345
- rejection_count: 0,
346
- confidence: 'low',
347
- push_to_remote: false,
348
- repeated_issue: false
349
- }
350
- };
351
- }
352
- if (decision === 'skip') {
353
- return {
354
- decision: 'skip',
355
- reasoning: 'FALLBACK: Explicit DECISION token SKIP',
356
- notes: 'Task skipped',
357
- next_status: 'skipped',
358
- metadata: {
359
- rejection_count: 0,
360
- confidence: 'low',
361
- push_to_remote: true,
362
- repeated_issue: false
363
- }
364
- };
365
- }
366
- // Safe default: unclear
36
+ parseReviewerOutput(rawOutput) {
37
+ const result = signal_parser_js_1.SignalParser.parseReviewerSignal(rawOutput);
38
+ let nextStatus = 'review';
39
+ if (result.decision === 'approve')
40
+ nextStatus = 'completed';
41
+ if (result.decision === 'reject')
42
+ nextStatus = 'in_progress';
43
+ if (result.decision === 'dispute')
44
+ nextStatus = 'disputed';
45
+ if (result.decision === 'skip')
46
+ nextStatus = 'skipped';
367
47
  return {
368
- decision: 'unclear',
369
- reasoning: 'FALLBACK: Missing explicit reviewer decision token',
370
- notes: 'Review unclear, retrying with explicit decision requirement',
371
- next_status: 'review',
372
- metadata: {
373
- rejection_count: 0,
374
- confidence: 'low',
375
- push_to_remote: false,
376
- repeated_issue: false
377
- }
48
+ decision: result.decision,
49
+ reasoning: `SignalParser detected ${result.decision}`,
50
+ notes: result.notes,
51
+ follow_up_tasks: result.followUpTasks,
52
+ next_status: nextStatus,
53
+ rejection_count: 0,
54
+ confidence: 'high',
55
+ push_to_remote: false,
56
+ repeated_issue: false
378
57
  };
379
58
  }
59
+ extractExplicitReviewerDecision(output) {
60
+ const result = signal_parser_js_1.SignalParser.parseReviewerSignal(output);
61
+ return result.decision === 'unclear' ? null : result.decision;
62
+ }
380
63
  }
381
64
  exports.OrchestrationFallbackHandler = OrchestrationFallbackHandler;
382
65
  //# sourceMappingURL=fallback-handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fallback-handler.js","sourceRoot":"","sources":["../../src/orchestrator/fallback-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fallback-handler.js","sourceRoot":"","sources":["../../src/orchestrator/fallback-handler.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,yDAAkD;AAElD,MAAa,4BAA4B;IACvC,gBAAgB,CAAC,SAAiB;QAChC,MAAM,MAAM,GAAG,+BAAY,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAExD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,sCAAsC;gBACjD,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,QAAQ;gBACrB,aAAa,EAAE,CAAC;gBAChB,UAAU,EAAE,MAAM;gBAClB,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,KAAK;aACnB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,sCAAsC;YACjD,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,aAAa;YAC1B,aAAa,EAAE,CAAC;YAChB,UAAU,EAAE,KAAK;YACjB,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,SAAiB;QACnC,MAAM,MAAM,GAAG,+BAAY,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAE3D,IAAI,UAAU,GAAoE,QAAQ,CAAC;QAC3F,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;YAAE,UAAU,GAAG,WAAW,CAAC;QAC5D,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,UAAU,GAAG,aAAa,CAAC;QAC7D,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;YAAE,UAAU,GAAG,UAAU,CAAC;QAC3D,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM;YAAE,UAAU,GAAG,SAAS,CAAC;QAEvD,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,yBAAyB,MAAM,CAAC,QAAQ,EAAE;YACrD,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,eAAe,EAAE,MAAM,CAAC,aAAa;YACrC,WAAW,EAAE,UAAU;YACvB,eAAe,EAAE,CAAC;YAClB,UAAU,EAAE,MAAM;YAClB,cAAc,EAAE,KAAK;YACrB,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;IAED,+BAA+B,CAAC,MAAc;QAC5C,MAAM,MAAM,GAAG,+BAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;IAChE,CAAC;CACF;AAvDD,oEAuDC"}
@@ -0,0 +1,15 @@
1
+ export declare class HistoryManager {
2
+ /**
3
+ * Fetch invocations with explicit retry logic for SQLITE_BUSY
4
+ */
5
+ static fetchInvocationsWithRetry(projectPath: string, taskId: string, resumeSessionId: string, maxRetries?: number): import("../database/queries.js").TaskInvocation[];
6
+ /**
7
+ * Reconstruct session history and apply Token Guard pruning to fit within context limits.
8
+ * Throws an error if the base prompt alone exceeds the safe limit.
9
+ */
10
+ static reconstructHistoryWithTokenGuard(projectPath: string, taskId: string, resumeSessionId: string, basePrompt: string, modelName: string, safeLimit: number): {
11
+ finalPrompt: string;
12
+ finalHistoryText: string;
13
+ };
14
+ }
15
+ //# sourceMappingURL=history-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-manager.d.ts","sourceRoot":"","sources":["../../src/orchestrator/history-manager.ts"],"names":[],"mappings":"AAIA,qBAAa,cAAc;IACzB;;OAEG;WACW,yBAAyB,CACrC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,UAAU,SAAI;IAsBhB;;;OAGG;WACW,gCAAgC,CAC5C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE;CAgErD"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HistoryManager = void 0;
4
+ const tokens_js_1 = require("../utils/tokens.js");
5
+ const queries_js_1 = require("../database/queries.js");
6
+ const connection_js_1 = require("../database/connection.js");
7
+ class HistoryManager {
8
+ /**
9
+ * Fetch invocations with explicit retry logic for SQLITE_BUSY
10
+ */
11
+ static fetchInvocationsWithRetry(projectPath, taskId, resumeSessionId, maxRetries = 3) {
12
+ let attempt = 0;
13
+ while (attempt < maxRetries) {
14
+ try {
15
+ return (0, connection_js_1.withDatabase)(projectPath, (db) => (0, queries_js_1.getTaskInvocationsBySession)(db, taskId, resumeSessionId));
16
+ }
17
+ catch (error) {
18
+ if (error.code === 'SQLITE_BUSY' && attempt < maxRetries - 1) {
19
+ attempt++;
20
+ // Basic exponential backoff: 50ms, 100ms, ...
21
+ const delay = Math.pow(2, attempt) * 25;
22
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, delay);
23
+ continue;
24
+ }
25
+ throw error;
26
+ }
27
+ }
28
+ throw new Error('Unreachable');
29
+ }
30
+ /**
31
+ * Reconstruct session history and apply Token Guard pruning to fit within context limits.
32
+ * Throws an error if the base prompt alone exceeds the safe limit.
33
+ */
34
+ static reconstructHistoryWithTokenGuard(projectPath, taskId, resumeSessionId, basePrompt, modelName, safeLimit) {
35
+ const systemPromptSize = (0, tokens_js_1.countTokens)(basePrompt, modelName);
36
+ if (systemPromptSize > safeLimit) {
37
+ throw new Error(`Context Too Large: System Prompt and Task Spec alone exceed safe context limit (${systemPromptSize} > ${safeLimit} tokens). Task cannot be processed.`);
38
+ }
39
+ const invocations = HistoryManager.fetchInvocationsWithRetry(projectPath, taskId, resumeSessionId);
40
+ const buildHistory = (invs, pruneOlder) => {
41
+ let hist = '';
42
+ for (let i = 0; i < invs.length; i++) {
43
+ const inv = invs[i];
44
+ // Skip the base prompt of the session (always first in DB for this session)
45
+ const isOriginalFirst = inv.id === invocations[0].id;
46
+ if (inv.prompt && !isOriginalFirst) {
47
+ hist += `
48
+
49
+ --- USER CONTINUATION ---
50
+ ${inv.prompt}`;
51
+ }
52
+ if (inv.response) {
53
+ const isOlder = i < invs.length - 1;
54
+ const responseText = (pruneOlder && isOlder) ? (0, tokens_js_1.pruneResponseOutputs)(inv.response) : inv.response;
55
+ hist += `
56
+
57
+ --- ASSISTANT RESPONSE ---
58
+ ${responseText}`;
59
+ }
60
+ }
61
+ return hist;
62
+ };
63
+ let currentSize = (0, tokens_js_1.countTokens)(basePrompt + buildHistory(invocations, false), modelName);
64
+ let finalHistoryText = '';
65
+ const guardedInvocations = [...invocations];
66
+ if (currentSize <= safeLimit) {
67
+ finalHistoryText = buildHistory(guardedInvocations, false);
68
+ }
69
+ else {
70
+ // Token Guard: First attempt to selectively prune tool outputs and thought blocks
71
+ finalHistoryText = buildHistory(guardedInvocations, true);
72
+ currentSize = (0, tokens_js_1.countTokens)(basePrompt + finalHistoryText, modelName);
73
+ // Token Guard: Truncate history if still necessary by dropping oldest executions entirely
74
+ while (currentSize > safeLimit && guardedInvocations.length > 0) {
75
+ guardedInvocations.shift(); // Prune oldest entry
76
+ finalHistoryText = buildHistory(guardedInvocations, true);
77
+ currentSize = (0, tokens_js_1.countTokens)(basePrompt + finalHistoryText, modelName);
78
+ }
79
+ if (guardedInvocations.length < invocations.length) {
80
+ console.warn(`Token Guard: Pruned ${invocations.length - guardedInvocations.length} older execution(s) entirely to fit within ${safeLimit} token limit.`);
81
+ }
82
+ else {
83
+ console.warn(`Token Guard: Selectively pruned tool/thought blocks to fit within ${safeLimit} token limit.`);
84
+ }
85
+ }
86
+ return {
87
+ finalPrompt: basePrompt + finalHistoryText,
88
+ finalHistoryText
89
+ };
90
+ }
91
+ }
92
+ exports.HistoryManager = HistoryManager;
93
+ //# sourceMappingURL=history-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-manager.js","sourceRoot":"","sources":["../../src/orchestrator/history-manager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"post-coder.d.ts","sourceRoot":"","sources":["../../src/orchestrator/post-coder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAkB1C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA2QlE"}
1
+ {"version":3,"file":"post-coder.d.ts","sourceRoot":"","sources":["../../src/orchestrator/post-coder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAkB1C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAmQlE"}
@@ -180,12 +180,10 @@ ${filesSection}
180
180
  "contract_violation": "checklist_required" | "rejection_response_required" | null,
181
181
  "wont_fix_override_items": ["specific required fix", "another required fix"],
182
182
  "next_status": "review" | "in_progress" | "failed",
183
- "metadata": {
184
- "files_changed": 0,
185
- "confidence": "high" | "medium" | "low",
186
- "exit_clean": true,
187
- "has_commits": false
188
- }
183
+ "files_changed": 0,
184
+ "confidence": "high" | "medium" | "low",
185
+ "exit_clean": true,
186
+ "has_commits": false
189
187
  }
190
188
  \`\`\`
191
189
 
@@ -228,12 +226,10 @@ ${filesSection}
228
226
  "commits": ["abc123", "def456"],
229
227
  "commit_message": null,
230
228
  "next_status": "review",
231
- "metadata": {
232
- "files_changed": 3,
233
- "confidence": "high",
234
- "exit_clean": true,
235
- "has_commits": true
236
- }
229
+ "files_changed": 3,
230
+ "confidence": "high",
231
+ "exit_clean": true,
232
+ "has_commits": true
237
233
  }
238
234
  \`\`\`
239
235
 
@@ -245,12 +241,10 @@ ${filesSection}
245
241
  "commits": [],
246
242
  "commit_message": "feat: implement task specification",
247
243
  "next_status": "review",
248
- "metadata": {
249
- "files_changed": 2,
250
- "confidence": "high",
251
- "exit_clean": true,
252
- "has_commits": false
253
- }
244
+ "files_changed": 2,
245
+ "confidence": "high",
246
+ "exit_clean": true,
247
+ "has_commits": false
254
248
  }
255
249
  \`\`\`
256
250
 
@@ -262,12 +256,10 @@ ${filesSection}
262
256
  "commits": [],
263
257
  "commit_message": null,
264
258
  "next_status": "in_progress",
265
- "metadata": {
266
- "files_changed": 0,
267
- "confidence": "high",
268
- "exit_clean": false,
269
- "has_commits": false
270
- }
259
+ "files_changed": 0,
260
+ "confidence": "high",
261
+ "exit_clean": false,
262
+ "has_commits": false
271
263
  }
272
264
  \`\`\`
273
265