@ttfw/envoi 1.0.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 (283) hide show
  1. package/README.md +238 -0
  2. package/dist/commands/app.d.ts +2 -0
  3. package/dist/commands/app.d.ts.map +1 -0
  4. package/dist/commands/app.js +31 -0
  5. package/dist/commands/app.js.map +1 -0
  6. package/dist/commands/autonomy.d.ts +6 -0
  7. package/dist/commands/autonomy.d.ts.map +1 -0
  8. package/dist/commands/autonomy.js +89 -0
  9. package/dist/commands/autonomy.js.map +1 -0
  10. package/dist/commands/builder.d.ts +13 -0
  11. package/dist/commands/builder.d.ts.map +1 -0
  12. package/dist/commands/builder.js +142 -0
  13. package/dist/commands/builder.js.map +1 -0
  14. package/dist/commands/idea.d.ts +12 -0
  15. package/dist/commands/idea.d.ts.map +1 -0
  16. package/dist/commands/idea.js +79 -0
  17. package/dist/commands/idea.js.map +1 -0
  18. package/dist/commands/init.d.ts +18 -0
  19. package/dist/commands/init.d.ts.map +1 -0
  20. package/dist/commands/init.js +423 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/mode.d.ts +13 -0
  23. package/dist/commands/mode.d.ts.map +1 -0
  24. package/dist/commands/mode.js +96 -0
  25. package/dist/commands/mode.js.map +1 -0
  26. package/dist/commands/onboard.d.ts +37 -0
  27. package/dist/commands/onboard.d.ts.map +1 -0
  28. package/dist/commands/onboard.js +743 -0
  29. package/dist/commands/onboard.js.map +1 -0
  30. package/dist/commands/pr-note.d.ts +8 -0
  31. package/dist/commands/pr-note.d.ts.map +1 -0
  32. package/dist/commands/pr-note.js +27 -0
  33. package/dist/commands/pr-note.js.map +1 -0
  34. package/dist/commands/undo.d.ts +7 -0
  35. package/dist/commands/undo.d.ts.map +1 -0
  36. package/dist/commands/undo.js +59 -0
  37. package/dist/commands/undo.js.map +1 -0
  38. package/dist/commands/update.d.ts +24 -0
  39. package/dist/commands/update.d.ts.map +1 -0
  40. package/dist/commands/update.js +248 -0
  41. package/dist/commands/update.js.map +1 -0
  42. package/dist/constants/report_codes.d.ts +29 -0
  43. package/dist/constants/report_codes.d.ts.map +1 -0
  44. package/dist/constants/report_codes.js +69 -0
  45. package/dist/constants/report_codes.js.map +1 -0
  46. package/dist/index.d.ts +3 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +675 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/lib/autonomy.d.ts +16 -0
  51. package/dist/lib/autonomy.d.ts.map +1 -0
  52. package/dist/lib/autonomy.js +38 -0
  53. package/dist/lib/autonomy.js.map +1 -0
  54. package/dist/lib/blocked.d.ts +87 -0
  55. package/dist/lib/blocked.d.ts.map +1 -0
  56. package/dist/lib/blocked.js +134 -0
  57. package/dist/lib/blocked.js.map +1 -0
  58. package/dist/lib/branding.d.ts +13 -0
  59. package/dist/lib/branding.d.ts.map +1 -0
  60. package/dist/lib/branding.js +19 -0
  61. package/dist/lib/branding.js.map +1 -0
  62. package/dist/lib/claude.d.ts +42 -0
  63. package/dist/lib/claude.d.ts.map +1 -0
  64. package/dist/lib/claude.js +291 -0
  65. package/dist/lib/claude.js.map +1 -0
  66. package/dist/lib/config.d.ts +71 -0
  67. package/dist/lib/config.d.ts.map +1 -0
  68. package/dist/lib/config.js +410 -0
  69. package/dist/lib/config.js.map +1 -0
  70. package/dist/lib/diff.d.ts +150 -0
  71. package/dist/lib/diff.d.ts.map +1 -0
  72. package/dist/lib/diff.js +257 -0
  73. package/dist/lib/diff.js.map +1 -0
  74. package/dist/lib/doctor.d.ts +67 -0
  75. package/dist/lib/doctor.d.ts.map +1 -0
  76. package/dist/lib/doctor.js +211 -0
  77. package/dist/lib/doctor.js.map +1 -0
  78. package/dist/lib/fingerprint.d.ts +27 -0
  79. package/dist/lib/fingerprint.d.ts.map +1 -0
  80. package/dist/lib/fingerprint.js +116 -0
  81. package/dist/lib/fingerprint.js.map +1 -0
  82. package/dist/lib/fs.d.ts +93 -0
  83. package/dist/lib/fs.d.ts.map +1 -0
  84. package/dist/lib/fs.js +179 -0
  85. package/dist/lib/fs.js.map +1 -0
  86. package/dist/lib/git.d.ts +177 -0
  87. package/dist/lib/git.d.ts.map +1 -0
  88. package/dist/lib/git.js +355 -0
  89. package/dist/lib/git.js.map +1 -0
  90. package/dist/lib/git_branching.d.ts +84 -0
  91. package/dist/lib/git_branching.d.ts.map +1 -0
  92. package/dist/lib/git_branching.js +327 -0
  93. package/dist/lib/git_branching.js.map +1 -0
  94. package/dist/lib/gitignore.d.ts +26 -0
  95. package/dist/lib/gitignore.d.ts.map +1 -0
  96. package/dist/lib/gitignore.js +119 -0
  97. package/dist/lib/gitignore.js.map +1 -0
  98. package/dist/lib/guardrails.d.ts +232 -0
  99. package/dist/lib/guardrails.d.ts.map +1 -0
  100. package/dist/lib/guardrails.js +323 -0
  101. package/dist/lib/guardrails.js.map +1 -0
  102. package/dist/lib/history.d.ts +110 -0
  103. package/dist/lib/history.d.ts.map +1 -0
  104. package/dist/lib/history.js +236 -0
  105. package/dist/lib/history.js.map +1 -0
  106. package/dist/lib/index.d.ts +29 -0
  107. package/dist/lib/index.d.ts.map +1 -0
  108. package/dist/lib/index.js +29 -0
  109. package/dist/lib/index.js.map +1 -0
  110. package/dist/lib/json-extract.d.ts +42 -0
  111. package/dist/lib/json-extract.d.ts.map +1 -0
  112. package/dist/lib/json-extract.js +201 -0
  113. package/dist/lib/json-extract.js.map +1 -0
  114. package/dist/lib/judge.d.ts +237 -0
  115. package/dist/lib/judge.d.ts.map +1 -0
  116. package/dist/lib/judge.js +501 -0
  117. package/dist/lib/judge.js.map +1 -0
  118. package/dist/lib/lock.d.ts +79 -0
  119. package/dist/lib/lock.d.ts.map +1 -0
  120. package/dist/lib/lock.js +254 -0
  121. package/dist/lib/lock.js.map +1 -0
  122. package/dist/lib/migration.d.ts +9 -0
  123. package/dist/lib/migration.d.ts.map +1 -0
  124. package/dist/lib/migration.js +74 -0
  125. package/dist/lib/migration.js.map +1 -0
  126. package/dist/lib/paths.d.ts +18 -0
  127. package/dist/lib/paths.d.ts.map +1 -0
  128. package/dist/lib/paths.js +27 -0
  129. package/dist/lib/paths.js.map +1 -0
  130. package/dist/lib/preflight.d.ts +33 -0
  131. package/dist/lib/preflight.d.ts.map +1 -0
  132. package/dist/lib/preflight.js +177 -0
  133. package/dist/lib/preflight.js.map +1 -0
  134. package/dist/lib/prompt_budget.d.ts +18 -0
  135. package/dist/lib/prompt_budget.d.ts.map +1 -0
  136. package/dist/lib/prompt_budget.js +36 -0
  137. package/dist/lib/prompt_budget.js.map +1 -0
  138. package/dist/lib/report.d.ts +102 -0
  139. package/dist/lib/report.d.ts.map +1 -0
  140. package/dist/lib/report.js +347 -0
  141. package/dist/lib/report.js.map +1 -0
  142. package/dist/lib/reviewer-flow.d.ts +80 -0
  143. package/dist/lib/reviewer-flow.d.ts.map +1 -0
  144. package/dist/lib/reviewer-flow.js +138 -0
  145. package/dist/lib/reviewer-flow.js.map +1 -0
  146. package/dist/lib/reviewer.d.ts +53 -0
  147. package/dist/lib/reviewer.d.ts.map +1 -0
  148. package/dist/lib/reviewer.js +199 -0
  149. package/dist/lib/reviewer.js.map +1 -0
  150. package/dist/lib/risk.d.ts +127 -0
  151. package/dist/lib/risk.d.ts.map +1 -0
  152. package/dist/lib/risk.js +192 -0
  153. package/dist/lib/risk.js.map +1 -0
  154. package/dist/lib/rollback.d.ts +143 -0
  155. package/dist/lib/rollback.d.ts.map +1 -0
  156. package/dist/lib/rollback.js +244 -0
  157. package/dist/lib/rollback.js.map +1 -0
  158. package/dist/lib/schema.d.ts +47 -0
  159. package/dist/lib/schema.d.ts.map +1 -0
  160. package/dist/lib/schema.js +91 -0
  161. package/dist/lib/schema.js.map +1 -0
  162. package/dist/lib/scope.d.ts +89 -0
  163. package/dist/lib/scope.d.ts.map +1 -0
  164. package/dist/lib/scope.js +135 -0
  165. package/dist/lib/scope.js.map +1 -0
  166. package/dist/lib/self_update.d.ts +13 -0
  167. package/dist/lib/self_update.d.ts.map +1 -0
  168. package/dist/lib/self_update.js +172 -0
  169. package/dist/lib/self_update.js.map +1 -0
  170. package/dist/lib/state.d.ts +143 -0
  171. package/dist/lib/state.d.ts.map +1 -0
  172. package/dist/lib/state.js +258 -0
  173. package/dist/lib/state.js.map +1 -0
  174. package/dist/lib/tick.d.ts +310 -0
  175. package/dist/lib/tick.d.ts.map +1 -0
  176. package/dist/lib/tick.js +424 -0
  177. package/dist/lib/tick.js.map +1 -0
  178. package/dist/lib/transport.d.ts +145 -0
  179. package/dist/lib/transport.d.ts.map +1 -0
  180. package/dist/lib/transport.js +237 -0
  181. package/dist/lib/transport.js.map +1 -0
  182. package/dist/lib/verdict_labels.d.ts +5 -0
  183. package/dist/lib/verdict_labels.d.ts.map +1 -0
  184. package/dist/lib/verdict_labels.js +25 -0
  185. package/dist/lib/verdict_labels.js.map +1 -0
  186. package/dist/lib/verify-safety.d.ts +63 -0
  187. package/dist/lib/verify-safety.d.ts.map +1 -0
  188. package/dist/lib/verify-safety.js +123 -0
  189. package/dist/lib/verify-safety.js.map +1 -0
  190. package/dist/lib/verify.d.ts +139 -0
  191. package/dist/lib/verify.d.ts.map +1 -0
  192. package/dist/lib/verify.js +311 -0
  193. package/dist/lib/verify.js.map +1 -0
  194. package/dist/lib/workspace_state.d.ts +79 -0
  195. package/dist/lib/workspace_state.d.ts.map +1 -0
  196. package/dist/lib/workspace_state.js +283 -0
  197. package/dist/lib/workspace_state.js.map +1 -0
  198. package/dist/runner/builder.d.ts +58 -0
  199. package/dist/runner/builder.d.ts.map +1 -0
  200. package/dist/runner/builder.js +775 -0
  201. package/dist/runner/builder.js.map +1 -0
  202. package/dist/runner/builder_parse.d.ts +37 -0
  203. package/dist/runner/builder_parse.d.ts.map +1 -0
  204. package/dist/runner/builder_parse.js +76 -0
  205. package/dist/runner/builder_parse.js.map +1 -0
  206. package/dist/runner/index.d.ts +9 -0
  207. package/dist/runner/index.d.ts.map +1 -0
  208. package/dist/runner/index.js +7 -0
  209. package/dist/runner/index.js.map +1 -0
  210. package/dist/runner/loop.d.ts +51 -0
  211. package/dist/runner/loop.d.ts.map +1 -0
  212. package/dist/runner/loop.js +221 -0
  213. package/dist/runner/loop.js.map +1 -0
  214. package/dist/runner/orchestrator.d.ts +67 -0
  215. package/dist/runner/orchestrator.d.ts.map +1 -0
  216. package/dist/runner/orchestrator.js +376 -0
  217. package/dist/runner/orchestrator.js.map +1 -0
  218. package/dist/runner/tick.d.ts +10 -0
  219. package/dist/runner/tick.d.ts.map +1 -0
  220. package/dist/runner/tick.js +1639 -0
  221. package/dist/runner/tick.js.map +1 -0
  222. package/dist/types/blocked.d.ts +52 -0
  223. package/dist/types/blocked.d.ts.map +1 -0
  224. package/dist/types/blocked.js +8 -0
  225. package/dist/types/blocked.js.map +1 -0
  226. package/dist/types/builder.d.ts +25 -0
  227. package/dist/types/builder.d.ts.map +1 -0
  228. package/dist/types/builder.js +7 -0
  229. package/dist/types/builder.js.map +1 -0
  230. package/dist/types/claude.d.ts +86 -0
  231. package/dist/types/claude.d.ts.map +1 -0
  232. package/dist/types/claude.js +48 -0
  233. package/dist/types/claude.js.map +1 -0
  234. package/dist/types/config.d.ts +384 -0
  235. package/dist/types/config.d.ts.map +1 -0
  236. package/dist/types/config.js +7 -0
  237. package/dist/types/config.js.map +1 -0
  238. package/dist/types/index.d.ts +18 -0
  239. package/dist/types/index.d.ts.map +1 -0
  240. package/dist/types/index.js +8 -0
  241. package/dist/types/index.js.map +1 -0
  242. package/dist/types/lock.d.ts +21 -0
  243. package/dist/types/lock.d.ts.map +1 -0
  244. package/dist/types/lock.js +8 -0
  245. package/dist/types/lock.js.map +1 -0
  246. package/dist/types/preflight.d.ts +49 -0
  247. package/dist/types/preflight.d.ts.map +1 -0
  248. package/dist/types/preflight.js +8 -0
  249. package/dist/types/preflight.js.map +1 -0
  250. package/dist/types/report.d.ts +161 -0
  251. package/dist/types/report.d.ts.map +1 -0
  252. package/dist/types/report.js +8 -0
  253. package/dist/types/report.js.map +1 -0
  254. package/dist/types/reviewer.d.ts +66 -0
  255. package/dist/types/reviewer.d.ts.map +1 -0
  256. package/dist/types/reviewer.js +5 -0
  257. package/dist/types/reviewer.js.map +1 -0
  258. package/dist/types/state.d.ts +124 -0
  259. package/dist/types/state.d.ts.map +1 -0
  260. package/dist/types/state.js +20 -0
  261. package/dist/types/state.js.map +1 -0
  262. package/dist/types/task.d.ts +117 -0
  263. package/dist/types/task.d.ts.map +1 -0
  264. package/dist/types/task.js +7 -0
  265. package/dist/types/task.js.map +1 -0
  266. package/dist/types/workspace_state.d.ts +125 -0
  267. package/dist/types/workspace_state.d.ts.map +1 -0
  268. package/dist/types/workspace_state.js +10 -0
  269. package/dist/types/workspace_state.js.map +1 -0
  270. package/envoi.config.json +191 -0
  271. package/package.json +52 -0
  272. package/relais/prompts/.gitkeep +0 -0
  273. package/relais/prompts/builder.system.txt +13 -0
  274. package/relais/prompts/builder.user.txt +15 -0
  275. package/relais/prompts/orchestrator.system.txt +37 -0
  276. package/relais/prompts/orchestrator.user.txt +34 -0
  277. package/relais/prompts/reviewer.system.txt +33 -0
  278. package/relais/prompts/reviewer.user.txt +35 -0
  279. package/relais/schemas/.gitkeep +0 -0
  280. package/relais/schemas/builder_result.schema.json +29 -0
  281. package/relais/schemas/report.schema.json +195 -0
  282. package/relais/schemas/reviewer_result.schema.json +70 -0
  283. package/relais/schemas/task.schema.json +155 -0
@@ -0,0 +1,376 @@
1
+ /**
2
+ * Orchestrator (Brain) implementation.
3
+ *
4
+ * Invokes Claude Code in plan mode to propose the next task.
5
+ */
6
+ import { readFile } from 'node:fs/promises';
7
+ import { readFileSync, existsSync } from 'node:fs';
8
+ import { execSync } from 'node:child_process';
9
+ import { join } from 'node:path';
10
+ import { invokeClaudeCode } from '../lib/claude.js';
11
+ import { loadSchema, validateWithSchema } from '../lib/schema.js';
12
+ import { readWorkspaceState } from '../lib/workspace_state.js';
13
+ import { truncatePromptSection } from '../lib/prompt_budget.js';
14
+ import { resolveOrchestratorPermissionMode } from '../lib/autonomy.js';
15
+ import { isInterruptedError, isTimeoutError } from '../types/claude.js';
16
+ import { resolveInWorkspace } from '../lib/paths.js';
17
+ const ORCHESTRATOR_PROMPT_CAPS = {
18
+ gitStatusChars: 2000,
19
+ factsChars: 7000,
20
+ prdChars: 14000,
21
+ lastReportChars: 6000,
22
+ pendingIdeasChars: 3000,
23
+ planningDigestChars: 2000,
24
+ openQuestionsChars: 2500,
25
+ };
26
+ function safeStringifyCliJson(raw) {
27
+ if (typeof raw !== 'object' || raw === null)
28
+ return '';
29
+ try {
30
+ return JSON.stringify(raw, null, 2);
31
+ }
32
+ catch {
33
+ return '';
34
+ }
35
+ }
36
+ /**
37
+ * Builds the orchestrator user prompt by loading the template and interpolating placeholders.
38
+ *
39
+ * @param config - Envoi configuration
40
+ * @param state - Current tick state
41
+ * @param retryReason - Optional error reason for retry attempts
42
+ * @returns The interpolated user prompt
43
+ */
44
+ export async function buildOrchestratorPrompt(config, state, retryReason) {
45
+ const workspaceDir = config.workspace_dir;
46
+ const userPromptPath = resolveInWorkspace(workspaceDir, config.orchestrator.user_prompt_file);
47
+ // Load user prompt template
48
+ let template;
49
+ try {
50
+ template = await readFile(userPromptPath, 'utf-8');
51
+ }
52
+ catch (error) {
53
+ throw new Error(`Failed to read orchestrator user prompt template from ${userPromptPath}: ${error instanceof Error ? error.message : String(error)}`);
54
+ }
55
+ // Get git status (tiny, shows uncommitted changes)
56
+ let gitStatus = '';
57
+ try {
58
+ gitStatus = execSync('git status --porcelain', {
59
+ encoding: 'utf-8',
60
+ maxBuffer: 50000,
61
+ cwd: workspaceDir,
62
+ }).trim();
63
+ }
64
+ catch {
65
+ gitStatus = '(git status unavailable)';
66
+ }
67
+ gitStatus = truncatePromptSection('REPO_SUMMARY', gitStatus, ORCHESTRATOR_PROMPT_CAPS.gitStatusChars).text;
68
+ // Read FACTS.md if exists
69
+ const factsPath = resolveInWorkspace(workspaceDir, 'FACTS.md');
70
+ const factsRaw = existsSync(factsPath) ? readFileSync(factsPath, 'utf-8') : '';
71
+ const facts = truncatePromptSection('FACTS_MD', factsRaw, ORCHESTRATOR_PROMPT_CAPS.factsChars).text;
72
+ // Read PRD.md if exists
73
+ const prdPath = resolveInWorkspace(workspaceDir, 'PRD.md');
74
+ const prdRaw = existsSync(prdPath) ? readFileSync(prdPath, 'utf-8') : '';
75
+ const prd = truncatePromptSection('PRD_MD', prdRaw, ORCHESTRATOR_PROMPT_CAPS.prdChars).text;
76
+ // Read REPORT.md if exists (last report)
77
+ const reportPath = join(workspaceDir, 'REPORT.md');
78
+ const lastReportRaw = existsSync(reportPath) ? readFileSync(reportPath, 'utf-8') : '';
79
+ const lastReport = truncatePromptSection('LAST_REPORT_MD', lastReportRaw, ORCHESTRATOR_PROMPT_CAPS.lastReportChars).text;
80
+ // Read STATE.json for milestone, budget summary, and planning context
81
+ let milestoneId = 'none';
82
+ let budgetSummary = 'Budgets: (unavailable)';
83
+ let pendingIdeasContext = '[]';
84
+ let planningDigestContext = '{}';
85
+ let openQuestionsContext = '[]';
86
+ try {
87
+ const wsState = await readWorkspaceState(workspaceDir);
88
+ milestoneId = wsState.milestone_id || 'none';
89
+ budgetSummary = `Milestone: ${milestoneId}, Ticks: ${wsState.budgets.ticks}, Orchestrator: ${wsState.budgets.orchestrator_calls}, Builder: ${wsState.budgets.builder_calls}, Verify: ${wsState.budgets.verify_runs}`;
90
+ const pendingIdeas = (wsState.idea_inbox ?? [])
91
+ .filter((idea) => idea.status === 'new' || idea.status === 'triaged')
92
+ .slice(-12);
93
+ pendingIdeasContext = truncatePromptSection('PENDING_IDEAS', JSON.stringify(pendingIdeas), ORCHESTRATOR_PROMPT_CAPS.pendingIdeasChars).text;
94
+ const planningDigest = wsState.planning_digest ?? {};
95
+ planningDigestContext = truncatePromptSection('PLANNING_DIGEST', JSON.stringify(planningDigest), ORCHESTRATOR_PROMPT_CAPS.planningDigestChars).text;
96
+ const openQuestions = (wsState.open_product_questions ?? [])
97
+ .filter((question) => !question.resolved)
98
+ .slice(-8);
99
+ openQuestionsContext = truncatePromptSection('OPEN_PRODUCT_QUESTIONS', JSON.stringify(openQuestions), ORCHESTRATOR_PROMPT_CAPS.openQuestionsChars).text;
100
+ }
101
+ catch {
102
+ // STATE.json may not exist yet
103
+ }
104
+ // Determine builder capabilities
105
+ const builderDefaultMode = config.builder.default_mode;
106
+ const cursorConfigured = config.builder.cursor !== undefined && config.builder.cursor !== null ? 'yes' : 'no';
107
+ // Interpolate placeholders with real values
108
+ const replacements = {
109
+ '{{PROJECT_GOAL}}': '[See FACTS.md for project context]',
110
+ '{{MILESTONE_ID}}': milestoneId,
111
+ '{{BUDGETS_SUMMARY}}': budgetSummary,
112
+ '{{VERIFY_TEMPLATE_IDS}}': config.verification.templates.map((t) => t.id).join(', ') || '[No templates]',
113
+ '{{REPO_SUMMARY}}': gitStatus || '(clean)',
114
+ '{{FACTS_MD}}': facts,
115
+ '{{PRD_MD}}': prd || '[No PRD provided yet]',
116
+ '{{LAST_REPORT_MD}}': lastReport,
117
+ '{{BLOCKED_JSON_OR_EMPTY}}': '',
118
+ '{{PENDING_IDEAS_JSON}}': pendingIdeasContext,
119
+ '{{PLANNING_DIGEST_JSON}}': planningDigestContext,
120
+ '{{OPEN_PRODUCT_QUESTIONS_JSON}}': openQuestionsContext,
121
+ '{{BUILDER_DEFAULT_MODE}}': builderDefaultMode,
122
+ '{{BUILDER_CURSOR_CONFIGURED}}': cursorConfigured,
123
+ };
124
+ let prompt = template;
125
+ for (const [placeholder, value] of Object.entries(replacements)) {
126
+ prompt = prompt.replace(new RegExp(placeholder.replace(/[{}]/g, '\\$&'), 'g'), value);
127
+ }
128
+ // Append retry reason if this is a retry attempt
129
+ if (retryReason) {
130
+ prompt += `\n\n=== RETRY ===\nYour previous output was invalid: ${retryReason}\nPlease output ONLY valid JSON matching the schema.`;
131
+ }
132
+ return prompt;
133
+ }
134
+ // Cache for loaded task schema
135
+ let taskSchemaCache = null;
136
+ /**
137
+ * Runs the orchestrator to propose the next task.
138
+ *
139
+ * Implements retry logic: if the first attempt fails due to invalid JSON or schema
140
+ * validation, retries once with the error reason appended to the prompt.
141
+ *
142
+ * @param state - Current tick state
143
+ * @param signal - Optional AbortSignal for cancellation
144
+ * @returns OrchestratorResult with task or error
145
+ */
146
+ export async function runOrchestrator(state, signal) {
147
+ const config = state.config;
148
+ const workspaceDir = config.workspace_dir;
149
+ // Load system prompt
150
+ const systemPromptPath = resolveInWorkspace(workspaceDir, config.orchestrator.system_prompt_file);
151
+ let systemPrompt;
152
+ try {
153
+ systemPrompt = await readFile(systemPromptPath, 'utf-8');
154
+ }
155
+ catch (error) {
156
+ return {
157
+ success: false,
158
+ task: null,
159
+ error: `Failed to read orchestrator system prompt from ${systemPromptPath}: ${error instanceof Error ? error.message : String(error)}`,
160
+ rawResponse: '',
161
+ rawStderr: '',
162
+ attempts: 0,
163
+ retryReason: null,
164
+ tokenUsage: null,
165
+ };
166
+ }
167
+ // Load task schema (cache after first load)
168
+ if (taskSchemaCache === null) {
169
+ const schemaPath = resolveInWorkspace(workspaceDir, config.orchestrator.task_schema_file);
170
+ try {
171
+ taskSchemaCache = await loadSchema(schemaPath);
172
+ }
173
+ catch (error) {
174
+ return {
175
+ success: false,
176
+ task: null,
177
+ error: `Failed to load task schema: ${error instanceof Error ? error.message : String(error)}`,
178
+ rawResponse: '',
179
+ rawStderr: '',
180
+ attempts: 0,
181
+ retryReason: null,
182
+ tokenUsage: null,
183
+ };
184
+ }
185
+ }
186
+ const model = config.models.orchestrator_model;
187
+ const timeout = (config.orchestrator.timeout_seconds ?? config.runner.max_tick_seconds) * 1000; // Convert to milliseconds
188
+ // First attempt
189
+ let retryReason = null;
190
+ let attempts = 0;
191
+ for (let attempt = 0; attempt < 2; attempt++) {
192
+ attempts++;
193
+ // Build user prompt (with retry reason if this is the second attempt)
194
+ let userPrompt;
195
+ try {
196
+ userPrompt = await buildOrchestratorPrompt(config, state, retryReason);
197
+ }
198
+ catch (error) {
199
+ return {
200
+ success: false,
201
+ task: null,
202
+ error: `Failed to build orchestrator prompt: ${error instanceof Error ? error.message : String(error)}`,
203
+ rawResponse: '',
204
+ rawStderr: '',
205
+ attempts,
206
+ retryReason,
207
+ tokenUsage: null,
208
+ };
209
+ }
210
+ try {
211
+ const response = await invokeClaudeCode(config.claude_code_cli, {
212
+ prompt: userPrompt,
213
+ maxTurns: config.orchestrator.max_turns,
214
+ permissionMode: resolveOrchestratorPermissionMode(config),
215
+ model,
216
+ systemPrompt,
217
+ timeout,
218
+ signal,
219
+ });
220
+ const rawObj = response.raw;
221
+ const rawCliStdout = safeStringifyCliJson(rawObj);
222
+ const cliSubtype = typeof rawObj?.subtype === 'string' ? String(rawObj.subtype) : null;
223
+ const hasResultField = Object.prototype.hasOwnProperty.call(rawObj ?? {}, 'result');
224
+ const modelOutput = response.result ?? '';
225
+ if (!response.success) {
226
+ // Non-retryable error (invocation failure)
227
+ return {
228
+ success: false,
229
+ task: null,
230
+ error: `Claude Code invocation failed (exit code ${response.exitCode})` +
231
+ (cliSubtype ? `, subtype=${cliSubtype}` : '') +
232
+ (!hasResultField ? ', missing result field' : ''),
233
+ rawResponse: modelOutput,
234
+ rawStderr: response.stderr,
235
+ rawCliStdout: rawCliStdout || undefined,
236
+ attempts,
237
+ retryReason,
238
+ tokenUsage: response.tokenUsage ?? null,
239
+ };
240
+ }
241
+ // Successful CLI call, but empty model output is not usable.
242
+ if (modelOutput.trim().length === 0) {
243
+ return {
244
+ success: false,
245
+ task: null,
246
+ error: `Claude Code returned empty output (exit code ${response.exitCode})` +
247
+ (cliSubtype ? `, subtype=${cliSubtype}` : '') +
248
+ (!hasResultField ? ', missing result field' : ''),
249
+ rawResponse: modelOutput,
250
+ rawStderr: response.stderr,
251
+ rawCliStdout: rawCliStdout || undefined,
252
+ attempts,
253
+ retryReason,
254
+ diagnostics: {
255
+ extractMethod: 'direct_parse',
256
+ extractedJson: rawObj ?? {},
257
+ },
258
+ tokenUsage: response.tokenUsage ?? null,
259
+ };
260
+ }
261
+ // Parse JSON response
262
+ let parsed;
263
+ try {
264
+ const raw = modelOutput.trim();
265
+ const unfenced = raw.startsWith("```")
266
+ ? raw.replace(/^```[a-zA-Z0-9_-]*\s*\n?/, "").replace(/```[\s]*$/, "").trim()
267
+ : raw;
268
+ parsed = JSON.parse(unfenced);
269
+ }
270
+ catch (error) {
271
+ // JSON parse error - retryable
272
+ retryReason = `Failed to parse orchestrator output as JSON: ${error instanceof Error ? error.message : String(error)}`;
273
+ console.log(`[ORCHESTRATOR] Attempt ${attempts} failed: ${retryReason}`);
274
+ if (attempt === 0) {
275
+ // Retry once
276
+ continue;
277
+ }
278
+ else {
279
+ // Second attempt also failed - include diagnostics
280
+ return {
281
+ success: false,
282
+ task: null,
283
+ error: retryReason,
284
+ rawResponse: modelOutput,
285
+ rawStderr: response.stderr,
286
+ rawCliStdout: rawCliStdout || undefined,
287
+ attempts,
288
+ retryReason,
289
+ diagnostics: {
290
+ extractMethod: 'direct_parse',
291
+ },
292
+ tokenUsage: response.tokenUsage ?? null,
293
+ };
294
+ }
295
+ }
296
+ // Validate task structure against schema
297
+ const validationResult = validateWithSchema(parsed, taskSchemaCache);
298
+ if (!validationResult.valid) {
299
+ // Schema validation error - retryable
300
+ const errorMessages = validationResult.errors.length > 0
301
+ ? validationResult.errors.join('; ')
302
+ : 'Orchestrator output does not match task schema';
303
+ retryReason = `Task validation failed: ${errorMessages}`;
304
+ console.log(`[ORCHESTRATOR] Attempt ${attempts} failed: ${retryReason}`);
305
+ if (attempt === 0) {
306
+ // Retry once
307
+ continue;
308
+ }
309
+ else {
310
+ // Second attempt also failed - include diagnostics
311
+ return {
312
+ success: false,
313
+ task: null,
314
+ error: retryReason,
315
+ rawResponse: modelOutput,
316
+ rawStderr: response.stderr,
317
+ rawCliStdout: rawCliStdout || undefined,
318
+ attempts,
319
+ retryReason,
320
+ diagnostics: {
321
+ schemaErrors: validationResult.rawErrors,
322
+ extractMethod: 'direct_parse',
323
+ extractedJson: parsed,
324
+ },
325
+ tokenUsage: response.tokenUsage ?? null,
326
+ };
327
+ }
328
+ }
329
+ // Success!
330
+ return {
331
+ success: true,
332
+ task: validationResult.data,
333
+ error: null,
334
+ rawResponse: modelOutput,
335
+ rawStderr: response.stderr,
336
+ rawCliStdout: rawCliStdout || undefined,
337
+ attempts,
338
+ retryReason: attempt === 1 ? retryReason : null,
339
+ tokenUsage: response.tokenUsage ?? null,
340
+ };
341
+ }
342
+ catch (error) {
343
+ // Re-throw InterruptedError to propagate to tick level
344
+ if (isInterruptedError(error)) {
345
+ throw error;
346
+ }
347
+ // Re-throw timeout errors to propagate to tick level for proper STOP_ORCHESTRATOR_TIMEOUT handling
348
+ if (isTimeoutError(error)) {
349
+ throw error;
350
+ }
351
+ // Non-retryable error (invocation exception)
352
+ return {
353
+ success: false,
354
+ task: null,
355
+ error: `Claude Code invocation error: ${error instanceof Error ? error.message : String(error)}`,
356
+ rawResponse: '',
357
+ rawStderr: '',
358
+ attempts,
359
+ retryReason,
360
+ tokenUsage: null,
361
+ };
362
+ }
363
+ }
364
+ // Should never reach here, but TypeScript needs this
365
+ return {
366
+ success: false,
367
+ task: null,
368
+ error: 'Unexpected error in orchestrator retry logic',
369
+ rawResponse: '',
370
+ rawStderr: '',
371
+ attempts,
372
+ retryReason,
373
+ tokenUsage: null,
374
+ };
375
+ }
376
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/runner/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Main tick execution runner.
3
+ *
4
+ * Implements the Envoi state machine:
5
+ * LOCK → PREFLIGHT → ORCHESTRATE → BUILD → JUDGE → REPORT → END
6
+ */
7
+ import type { EnvoiConfig } from '../types/config.js';
8
+ import type { ReportData } from '../types/report.js';
9
+ export declare function runTick(config: EnvoiConfig, signal?: AbortSignal): Promise<ReportData>;
10
+ //# sourceMappingURL=tick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../src/runner/tick.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,oBAAoB,CAAC;AAszBjE,wBAAsB,OAAO,CAC3B,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAyyCrB"}