@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,36 @@
1
+ /**
2
+ * Prompt budgeting helpers to keep context payloads bounded and deterministic.
3
+ */
4
+ /**
5
+ * Truncates a prompt section to a max size with a deterministic marker.
6
+ *
7
+ * Strategy:
8
+ * - keep the beginning (usually most structural context)
9
+ * - keep the tail (usually latest status/error detail)
10
+ * - insert a deterministic marker between both
11
+ */
12
+ export function truncatePromptSection(sectionName, value, maxChars) {
13
+ const effectiveMax = Math.max(0, maxChars);
14
+ if (value.length <= effectiveMax) {
15
+ return { text: value, truncated: false, originalChars: value.length };
16
+ }
17
+ const marker = `\n\n[TRUNCATED ${sectionName}: kept head+tail within ${effectiveMax} of ${value.length} chars]\n\n`;
18
+ const keep = Math.max(0, effectiveMax - marker.length);
19
+ if (keep === 0) {
20
+ return {
21
+ text: marker.slice(0, effectiveMax),
22
+ truncated: true,
23
+ originalChars: value.length,
24
+ };
25
+ }
26
+ const headKeep = Math.max(1, Math.floor(keep * 0.7));
27
+ const tailKeep = Math.max(0, keep - headKeep);
28
+ const head = value.slice(0, headKeep);
29
+ const tail = tailKeep > 0 ? value.slice(value.length - tailKeep) : '';
30
+ return {
31
+ text: head + marker + tail,
32
+ truncated: true,
33
+ originalChars: value.length,
34
+ };
35
+ }
36
+ //# sourceMappingURL=prompt_budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt_budget.js","sourceRoot":"","sources":["../../src/lib/prompt_budget.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAAmB,EACnB,KAAa,EACb,QAAgB;IAEhB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,WAAW,2BAA2B,YAAY,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;IACpH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC;YACnC,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,KAAK,CAAC,MAAM;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtE,OAAO;QACL,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;QAC1B,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,KAAK,CAAC,MAAM;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Report generation module for envoi tick execution results.
3
+ *
4
+ * Provides functions to generate REPORT.json containing complete tick data:
5
+ * run_id, timestamps, task info, verdict, code, blast_radius, scope check,
6
+ * diff, verification results, and budgets.
7
+ */
8
+ import type { ReportData, Verdict, ReportCode, BudgetInfo } from '../types/report.js';
9
+ import type { TickState } from '../types/state.js';
10
+ import type { DiffAnalysis } from './diff.js';
11
+ import type { ScopeCheckResult } from './scope.js';
12
+ import type { VerificationRun as VerifyRun } from './verify.js';
13
+ import type { VerificationTemplate } from '../types/config.js';
14
+ /**
15
+ * Generates a unique run ID for a tick.
16
+ *
17
+ * Format: timestamp + random suffix (hex encoded)
18
+ * Example: "20250128T123456Z-a1b2c3d4e5f6..."
19
+ *
20
+ * @returns A unique identifier string
21
+ */
22
+ export declare function generateRunId(): string;
23
+ /**
24
+ * Tick data required to build a complete report.
25
+ */
26
+ export interface TickReportData {
27
+ /** Tick state */
28
+ state: TickState;
29
+ /** Verdict */
30
+ verdict: Verdict;
31
+ /** Report code */
32
+ code: ReportCode;
33
+ /** Head commit SHA (may differ from base_commit if HEAD moved) */
34
+ head_commit: string;
35
+ /** Diff analysis results */
36
+ diff_analysis?: DiffAnalysis;
37
+ /** Scope check results */
38
+ scope_check?: ScopeCheckResult;
39
+ /** Verification runs (from verify.ts) */
40
+ verification_runs?: VerifyRun[];
41
+ /** Verification templates map (for transforming verification runs) */
42
+ verification_templates?: Map<string, VerificationTemplate>;
43
+ /** Verification log file path */
44
+ verify_log_path?: string;
45
+ /** Diff patch file path */
46
+ diff_patch_path?: string;
47
+ /** Budget information */
48
+ budgets?: BudgetInfo;
49
+ }
50
+ /**
51
+ * Builds a complete report from tick execution data.
52
+ *
53
+ * @param tickData - Complete tick data including state, verdict, diff, scope, verification, budgets
54
+ * @returns Complete ReportData matching report.schema.json
55
+ */
56
+ export declare function buildReport(tickData: TickReportData): ReportData;
57
+ /**
58
+ * Writes a report to a file atomically.
59
+ *
60
+ * Uses atomicWriteJson from fs.ts to ensure crash-safe writes.
61
+ *
62
+ * @param report - Report data to write
63
+ * @param filePath - Path to write the report file
64
+ * @returns Promise that resolves when write completes
65
+ * @throws {Error} If the write operation fails
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const report = buildReport(tickData);
70
+ * await writeReport(report, '/path/to/REPORT.json');
71
+ * ```
72
+ */
73
+ export declare function writeReport(report: ReportData, filePath: string): Promise<void>;
74
+ /**
75
+ * Renders report data as markdown.
76
+ *
77
+ * Generates a deterministic, human-readable markdown representation
78
+ * of the report data. Same input always produces same output.
79
+ *
80
+ * @param report - Report data to render
81
+ * @returns Markdown string
82
+ */
83
+ export declare function renderReportMarkdown(report: ReportData): string;
84
+ /**
85
+ * Atomically writes markdown content to a file.
86
+ *
87
+ * Uses the same write-tmp-fsync-rename pattern as atomicWriteJson
88
+ * to ensure crash-safe writes.
89
+ *
90
+ * @param content - Markdown content to write
91
+ * @param filePath - Path to write the markdown file
92
+ * @returns Promise that resolves when write completes
93
+ * @throws {AtomicFsError} If the write operation fails
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const markdown = renderReportMarkdown(report);
98
+ * await writeReportMarkdown(markdown, '/path/to/REPORT.md');
99
+ * ```
100
+ */
101
+ export declare function writeReportMarkdown(content: string, filePath: string): Promise<void>;
102
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/lib/report.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAA0D,UAAU,EAAyD,MAAM,oBAAoB,CAAC;AACrM,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAK/D;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAQtC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iBAAiB;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,0BAA0B;IAC1B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC;IAChC,sEAAsE;IACtE,sBAAsB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC3D,iCAAiC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yBAAyB;IACzB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAqDD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,UAAU,CAqGhE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErF;AAaD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA+F/D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C1F"}
@@ -0,0 +1,347 @@
1
+ /**
2
+ * Report generation module for envoi tick execution results.
3
+ *
4
+ * Provides functions to generate REPORT.json containing complete tick data:
5
+ * run_id, timestamps, task info, verdict, code, blast_radius, scope check,
6
+ * diff, verification results, and budgets.
7
+ */
8
+ import { randomBytes } from 'node:crypto';
9
+ import { open, rename, unlink } from 'node:fs/promises';
10
+ import { atomicWriteJson, AtomicFsError } from './fs.js';
11
+ import { formatDisplayState } from './verdict_labels.js';
12
+ /**
13
+ * Generates a unique run ID for a tick.
14
+ *
15
+ * Format: timestamp + random suffix (hex encoded)
16
+ * Example: "20250128T123456Z-a1b2c3d4e5f6..."
17
+ *
18
+ * @returns A unique identifier string
19
+ */
20
+ export function generateRunId() {
21
+ // Generate timestamp prefix (ISO format without colons)
22
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').replace('T', 'T').substring(0, 19) + 'Z';
23
+ // Generate 8 random bytes and encode as hex (16 chars)
24
+ const randomSuffix = randomBytes(8).toString('hex');
25
+ return `${timestamp}-${randomSuffix}`;
26
+ }
27
+ /**
28
+ * Transforms verification runs from verify.ts format to report format.
29
+ *
30
+ * @param runs - Verification runs from verify.ts
31
+ * @param templates - Map of verification templates
32
+ * @param task - Task containing verification configuration
33
+ * @returns Array of verification runs in report format
34
+ */
35
+ function transformVerificationRuns(runs, templates, task) {
36
+ if (!task) {
37
+ return [];
38
+ }
39
+ const result = [];
40
+ const fastSet = new Set(task.verification.fast);
41
+ const slowSet = new Set(task.verification.slow);
42
+ for (const run of runs) {
43
+ const template = templates.get(run.template_id);
44
+ if (!template) {
45
+ // Skip runs without templates
46
+ continue;
47
+ }
48
+ // Determine phase based on task verification config
49
+ const phase = fastSet.has(run.template_id) ? 'fast' : slowSet.has(run.template_id) ? 'slow' : 'fast';
50
+ // Get args from template (they may have been interpolated, but we store original)
51
+ const args = template.args || [];
52
+ // Determine if timed out (exit code 124 is standard timeout code)
53
+ const timed_out = run.exit_code === 124;
54
+ result.push({
55
+ template_id: run.template_id,
56
+ phase,
57
+ cmd: template.cmd,
58
+ args,
59
+ exit_code: run.exit_code,
60
+ duration_ms: run.duration_ms,
61
+ timed_out,
62
+ });
63
+ }
64
+ return result;
65
+ }
66
+ /**
67
+ * Builds a complete report from tick execution data.
68
+ *
69
+ * @param tickData - Complete tick data including state, verdict, diff, scope, verification, budgets
70
+ * @returns Complete ReportData matching report.schema.json
71
+ */
72
+ export function buildReport(tickData) {
73
+ const { state, verdict, code, head_commit, diff_analysis, scope_check, verification_runs, verification_templates, verify_log_path, diff_patch_path, budgets } = tickData;
74
+ const ended_at = new Date().toISOString();
75
+ const started_at = new Date(state.started_at);
76
+ const ended_at_date = new Date(ended_at);
77
+ const duration_ms = Math.max(0, ended_at_date.getTime() - started_at.getTime());
78
+ // Build task summary
79
+ const task = state.task
80
+ ? {
81
+ task_id: state.task.task_id,
82
+ milestone_id: state.task.milestone_id,
83
+ task_kind: state.task.task_kind,
84
+ intent: state.task.intent,
85
+ }
86
+ : {
87
+ task_id: 'none',
88
+ milestone_id: 'none',
89
+ task_kind: 'execute',
90
+ intent: 'No task assigned',
91
+ };
92
+ // Build blast radius from diff analysis
93
+ const blast_radius = diff_analysis
94
+ ? {
95
+ files_touched: diff_analysis.files_touched,
96
+ lines_added: diff_analysis.lines_added,
97
+ lines_deleted: diff_analysis.lines_deleted,
98
+ new_files: diff_analysis.new_files,
99
+ }
100
+ : {
101
+ files_touched: 0,
102
+ lines_added: 0,
103
+ lines_deleted: 0,
104
+ new_files: 0,
105
+ };
106
+ // Build scope result
107
+ const scope = scope_check
108
+ ? {
109
+ ok: scope_check.ok,
110
+ violations: scope_check.violations.map((v) => v.detail),
111
+ touched_paths: scope_check.touched_paths,
112
+ }
113
+ : {
114
+ ok: true,
115
+ violations: [],
116
+ touched_paths: [],
117
+ };
118
+ // Build diff info
119
+ const diff = diff_analysis
120
+ ? {
121
+ files_changed: diff_analysis.files_touched,
122
+ lines_changed: diff_analysis.lines_added + diff_analysis.lines_deleted,
123
+ diff_patch_path: diff_patch_path || '',
124
+ }
125
+ : {
126
+ files_changed: 0,
127
+ lines_changed: 0,
128
+ diff_patch_path: diff_patch_path || '',
129
+ };
130
+ // Build verification result
131
+ const verification = {
132
+ exec_mode: 'argv_no_shell',
133
+ runs: verification_runs && verification_templates && state.task
134
+ ? transformVerificationRuns(verification_runs, verification_templates, state.task)
135
+ : [],
136
+ verify_log_path: verify_log_path || '',
137
+ };
138
+ // Build budgets
139
+ const budgets_data = budgets || {
140
+ milestone_id: state.task?.milestone_id || 'none',
141
+ ticks: 0,
142
+ orchestrator_calls: 0,
143
+ builder_calls: 0,
144
+ verify_runs: verification_runs?.length || 0,
145
+ estimated_cost_usd: 0,
146
+ warnings: [],
147
+ };
148
+ return {
149
+ run_id: state.run_id,
150
+ started_at: state.started_at,
151
+ ended_at,
152
+ duration_ms,
153
+ base_commit: state.base_commit,
154
+ head_commit,
155
+ task,
156
+ verdict,
157
+ code,
158
+ blast_radius,
159
+ scope,
160
+ diff,
161
+ verification,
162
+ budgets: budgets_data,
163
+ };
164
+ }
165
+ /**
166
+ * Writes a report to a file atomically.
167
+ *
168
+ * Uses atomicWriteJson from fs.ts to ensure crash-safe writes.
169
+ *
170
+ * @param report - Report data to write
171
+ * @param filePath - Path to write the report file
172
+ * @returns Promise that resolves when write completes
173
+ * @throws {Error} If the write operation fails
174
+ *
175
+ * @example
176
+ * ```typescript
177
+ * const report = buildReport(tickData);
178
+ * await writeReport(report, '/path/to/REPORT.json');
179
+ * ```
180
+ */
181
+ export async function writeReport(report, filePath) {
182
+ await atomicWriteJson(filePath, report);
183
+ }
184
+ /**
185
+ * Formats verdict and code for markdown display.
186
+ *
187
+ * @param verdict - The verdict value
188
+ * @param code - The report code
189
+ * @returns Formatted verdict string
190
+ */
191
+ function formatVerdict(verdict, code) {
192
+ return formatDisplayState(verdict, code);
193
+ }
194
+ /**
195
+ * Renders report data as markdown.
196
+ *
197
+ * Generates a deterministic, human-readable markdown representation
198
+ * of the report data. Same input always produces same output.
199
+ *
200
+ * @param report - Report data to render
201
+ * @returns Markdown string
202
+ */
203
+ export function renderReportMarkdown(report) {
204
+ const lines = [];
205
+ // Header
206
+ lines.push('# Envoi Run Report');
207
+ lines.push('');
208
+ // Summary section
209
+ lines.push('## Summary');
210
+ lines.push('');
211
+ lines.push(`- **Run ID**: ${report.run_id}`);
212
+ lines.push(`- **Started**: ${report.started_at}`);
213
+ lines.push(`- **Ended**: ${report.ended_at}`);
214
+ lines.push(`- **Duration**: ${report.duration_ms}ms`);
215
+ lines.push(`- **Verdict**: ${formatVerdict(report.verdict, report.code)}`);
216
+ lines.push(`- **Base Commit**: ${report.base_commit}`);
217
+ lines.push(`- **Head Commit**: ${report.head_commit}`);
218
+ lines.push('');
219
+ // Task section
220
+ lines.push('## Task');
221
+ lines.push('');
222
+ lines.push(`- **Task ID**: ${report.task.task_id}`);
223
+ lines.push(`- **Milestone**: ${report.task.milestone_id}`);
224
+ lines.push(`- **Kind**: ${report.task.task_kind}`);
225
+ lines.push(`- **Intent**: ${report.task.intent}`);
226
+ lines.push('');
227
+ // Blast Radius section
228
+ lines.push('## Blast Radius');
229
+ lines.push('');
230
+ lines.push(`- **Files Touched**: ${report.blast_radius.files_touched}`);
231
+ lines.push(`- **Lines Added**: ${report.blast_radius.lines_added}`);
232
+ lines.push(`- **Lines Deleted**: ${report.blast_radius.lines_deleted}`);
233
+ lines.push(`- **New Files**: ${report.blast_radius.new_files}`);
234
+ lines.push('');
235
+ // Scope section
236
+ lines.push('## Scope');
237
+ lines.push('');
238
+ if (report.scope.ok) {
239
+ lines.push('✓ **OK** - No violations');
240
+ }
241
+ else {
242
+ lines.push('✗ **Violations**:');
243
+ for (const violation of report.scope.violations) {
244
+ lines.push(` - ${violation}`);
245
+ }
246
+ }
247
+ if (report.scope.touched_paths.length > 0) {
248
+ lines.push('');
249
+ lines.push('**Touched Paths**:');
250
+ for (const path of report.scope.touched_paths) {
251
+ lines.push(` - ${path}`);
252
+ }
253
+ }
254
+ lines.push('');
255
+ // Verification section
256
+ lines.push('## Verification');
257
+ lines.push('');
258
+ if (report.verification.runs.length === 0) {
259
+ lines.push('No verification runs.');
260
+ }
261
+ else {
262
+ lines.push('| Template ID | Phase | Exit Code | Duration (ms) |');
263
+ lines.push('|-------------|-------|-----------|---------------|');
264
+ for (const run of report.verification.runs) {
265
+ const status = run.exit_code === 0 ? '✓' : '✗';
266
+ lines.push(`| ${run.template_id} | ${run.phase} | ${status} ${run.exit_code} | ${run.duration_ms} |`);
267
+ }
268
+ }
269
+ if (report.verification.verify_log_path) {
270
+ lines.push('');
271
+ lines.push(`**Log**: ${report.verification.verify_log_path}`);
272
+ }
273
+ lines.push('');
274
+ // Budgets section
275
+ lines.push('## Budgets');
276
+ lines.push('');
277
+ lines.push(`- **Milestone**: ${report.budgets.milestone_id}`);
278
+ lines.push(`- **Ticks**: ${report.budgets.ticks}`);
279
+ lines.push(`- **Orchestrator Calls**: ${report.budgets.orchestrator_calls}`);
280
+ lines.push(`- **Builder Calls**: ${report.budgets.builder_calls}`);
281
+ lines.push(`- **Verification Runs**: ${report.budgets.verify_runs}`);
282
+ lines.push(`- **Estimated Cost**: $${report.budgets.estimated_cost_usd.toFixed(4)}`);
283
+ if (report.budgets.warnings.length > 0) {
284
+ lines.push('');
285
+ lines.push('**Warnings**:');
286
+ for (const warning of report.budgets.warnings) {
287
+ lines.push(` - ${warning}`);
288
+ }
289
+ }
290
+ lines.push('');
291
+ return lines.join('\n');
292
+ }
293
+ /**
294
+ * Atomically writes markdown content to a file.
295
+ *
296
+ * Uses the same write-tmp-fsync-rename pattern as atomicWriteJson
297
+ * to ensure crash-safe writes.
298
+ *
299
+ * @param content - Markdown content to write
300
+ * @param filePath - Path to write the markdown file
301
+ * @returns Promise that resolves when write completes
302
+ * @throws {AtomicFsError} If the write operation fails
303
+ *
304
+ * @example
305
+ * ```typescript
306
+ * const markdown = renderReportMarkdown(report);
307
+ * await writeReportMarkdown(markdown, '/path/to/REPORT.md');
308
+ * ```
309
+ */
310
+ export async function writeReportMarkdown(content, filePath) {
311
+ const tmpPath = `${filePath}.tmp`;
312
+ let fileHandle = null;
313
+ try {
314
+ // Ensure content ends with newline
315
+ const normalizedContent = content.endsWith('\n') ? content : content + '\n';
316
+ // Open file for writing, create if doesn't exist, truncate if exists
317
+ fileHandle = await open(tmpPath, 'w');
318
+ // Write the content
319
+ await fileHandle.writeFile(normalizedContent, 'utf-8');
320
+ // fsync to ensure data is flushed to disk
321
+ await fileHandle.sync();
322
+ // Close before rename
323
+ await fileHandle.close();
324
+ fileHandle = null;
325
+ // Atomic rename (POSIX guarantees atomicity)
326
+ await rename(tmpPath, filePath);
327
+ }
328
+ catch (error) {
329
+ // Attempt to clean up the tmp file on error
330
+ if (fileHandle) {
331
+ try {
332
+ await fileHandle.close();
333
+ }
334
+ catch {
335
+ // Ignore close errors during cleanup
336
+ }
337
+ }
338
+ try {
339
+ await unlink(tmpPath);
340
+ }
341
+ catch {
342
+ // Ignore unlink errors - file may not exist
343
+ }
344
+ throw new AtomicFsError(`Failed to atomically write markdown to ${filePath}: ${error instanceof Error ? error.message : String(error)}`, filePath, error instanceof Error ? error : undefined);
345
+ }
346
+ }
347
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/lib/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Reviewer flow integration for pre-builder risk checks.
3
+ *
4
+ * Integrates the reviewer into the tick flow to be called pre-builder when
5
+ * risk is detected. Handles reviewer decisions and returns appropriate stop
6
+ * codes or proceeds to builder.
7
+ */
8
+ import type { EnvoiConfig } from '../types/config.js';
9
+ import type { ReportCode } from '../types/report.js';
10
+ import type { RiskFlags } from '../types/reviewer.js';
11
+ import type { Task } from '../types/task.js';
12
+ import type { DiffAnalysis } from './diff.js';
13
+ import type { StopHistoryEntry } from './risk.js';
14
+ /**
15
+ * Context information for reviewer invocation.
16
+ */
17
+ export interface ReviewerFlowContext {
18
+ /** Risk flags that triggered the reviewer */
19
+ riskFlags: RiskFlags[];
20
+ /** Current task (if available) */
21
+ task: Task | null;
22
+ /** Diff analysis (if available) */
23
+ diffAnalysis?: DiffAnalysis;
24
+ /** Stop history entries */
25
+ stopHistory: StopHistoryEntry[];
26
+ /** Current tick number */
27
+ currentTick: number;
28
+ /** Whether verification failed */
29
+ verifyFailed: boolean;
30
+ /** Whether budget warning threshold reached */
31
+ budgetWarning: boolean;
32
+ /** Last report markdown (if available) */
33
+ lastReportMd?: string;
34
+ /** Diff patch content (if available) */
35
+ diffPatch?: string;
36
+ /** Verification log excerpt (if available) */
37
+ verifyLogExcerpt?: string;
38
+ /** Touched file paths */
39
+ touchedPaths: string[];
40
+ }
41
+ /**
42
+ * Result of reviewer flow execution.
43
+ */
44
+ export interface ReviewerFlowResult {
45
+ /** Stop code if reviewer decided to stop, null if proceed */
46
+ stopCode: ReportCode | null;
47
+ /** Question object if ask_question decision */
48
+ question?: {
49
+ prompt: string;
50
+ choices?: string[];
51
+ };
52
+ /** Reviewer error message if invocation failed */
53
+ reviewerError?: string;
54
+ }
55
+ /**
56
+ * Handles reviewer decision and returns appropriate stop code or null.
57
+ *
58
+ * @param decision - Reviewer decision object from parsed output
59
+ * @returns ReviewerFlowResult with stopCode or null (proceed)
60
+ */
61
+ export declare function handleReviewerDecision(decision: {
62
+ decision: 'proceed' | 'force_patch' | 'ask_question';
63
+ question?: {
64
+ prompt: string;
65
+ choices?: string[];
66
+ };
67
+ }): ReviewerFlowResult;
68
+ /**
69
+ * Runs reviewer if needed based on risk flags and configuration.
70
+ *
71
+ * This function should be called pre-builder when risk is detected.
72
+ * It checks if reviewer should be triggered, invokes it if needed, and
73
+ * handles the decision.
74
+ *
75
+ * @param config - Envoi configuration
76
+ * @param context - Reviewer flow context
77
+ * @returns Promise resolving to ReviewerFlowResult
78
+ */
79
+ export declare function runReviewerIfNeeded(config: EnvoiConfig, context: ReviewerFlowContext): Promise<ReviewerFlowResult>;
80
+ //# sourceMappingURL=reviewer-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer-flow.d.ts","sourceRoot":"","sources":["../../src/lib/reviewer-flow.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,kCAAkC;IAClC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,mCAAmC;IACnC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,2BAA2B;IAC3B,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,aAAa,EAAE,OAAO,CAAC;IACvB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE;IAC/C,QAAQ,EAAE,SAAS,GAAG,aAAa,GAAG,cAAc,CAAC;IACrD,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH,GAAG,kBAAkB,CAyBrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAiH7B"}