@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,236 @@
1
+ /**
2
+ * History management utilities for preserving tick run artifacts.
3
+ *
4
+ * Each tick's artifacts (report.json, report.md, diff.patch, verify.log) are
5
+ * preserved in history/<run_id>/ to enable debugging and audit trails.
6
+ */
7
+ import { mkdir, readdir, open, rename, unlink } from 'node:fs/promises';
8
+ import { join } from 'node:path';
9
+ import { atomicWriteJson, AtomicFsError } from './fs.js';
10
+ import { resolveInWorkspace } from './paths.js';
11
+ /**
12
+ * Gets the full path to the history directory for a specific run.
13
+ *
14
+ * @param config - Envoi configuration
15
+ * @param runId - Run ID
16
+ * @returns Full path to the run's history directory
17
+ */
18
+ function getHistoryRunPath(config, runId) {
19
+ const historyDir = resolveInWorkspace(config.workspace_dir, config.history.dir);
20
+ return join(historyDir, runId);
21
+ }
22
+ /**
23
+ * Atomically writes text content to a file.
24
+ *
25
+ * Uses the write-tmp-fsync-rename pattern to ensure crash-safe writes.
26
+ *
27
+ * @param filePath - Path to write the file
28
+ * @param content - Text content to write
29
+ * @throws {AtomicFsError} If the write operation fails
30
+ */
31
+ async function atomicWriteText(filePath, content) {
32
+ const tmpPath = `${filePath}.tmp`;
33
+ let fileHandle = null;
34
+ try {
35
+ // Ensure content ends with newline
36
+ const normalizedContent = content.endsWith('\n') ? content : content + '\n';
37
+ // Open file for writing, create if doesn't exist, truncate if exists
38
+ fileHandle = await open(tmpPath, 'w');
39
+ // Write the content
40
+ await fileHandle.writeFile(normalizedContent, 'utf-8');
41
+ // fsync to ensure data is flushed to disk
42
+ await fileHandle.sync();
43
+ // Close before rename
44
+ await fileHandle.close();
45
+ fileHandle = null;
46
+ // Atomic rename (POSIX guarantees atomicity)
47
+ await rename(tmpPath, filePath);
48
+ }
49
+ catch (error) {
50
+ // Attempt to clean up the tmp file on error
51
+ if (fileHandle) {
52
+ try {
53
+ await fileHandle.close();
54
+ }
55
+ catch {
56
+ // Ignore close errors during cleanup
57
+ }
58
+ }
59
+ try {
60
+ await unlink(tmpPath);
61
+ }
62
+ catch {
63
+ // Ignore unlink errors - file may not exist
64
+ }
65
+ throw new AtomicFsError(`Failed to atomically write text to ${filePath}: ${error instanceof Error ? error.message : String(error)}`, filePath, error instanceof Error ? error : undefined);
66
+ }
67
+ }
68
+ /**
69
+ * Creates the history snapshot directory for a run.
70
+ *
71
+ * @param runId - Run ID
72
+ * @param config - Envoi configuration
73
+ * @returns Promise that resolves when directory is created
74
+ * @throws {Error} If directory creation fails
75
+ */
76
+ export async function createHistorySnapshot(runId, config) {
77
+ const runPath = getHistoryRunPath(config, runId);
78
+ await mkdir(runPath, { recursive: true });
79
+ }
80
+ /**
81
+ * Writes an artifact file to the history directory for a run.
82
+ *
83
+ * @param runId - Run ID
84
+ * @param filename - Name of the artifact file (e.g., 'report.json', 'diff.patch')
85
+ * @param content - Content to write (string for text files, object for JSON)
86
+ * @param config - Envoi configuration
87
+ * @returns Promise that resolves when write completes
88
+ * @throws {Error} If the write operation fails
89
+ */
90
+ export async function writeHistoryArtifact(runId, filename, content, config) {
91
+ const runPath = getHistoryRunPath(config, runId);
92
+ const filePath = join(runPath, filename);
93
+ if (typeof content === 'object') {
94
+ await atomicWriteJson(filePath, content);
95
+ }
96
+ else {
97
+ await atomicWriteText(filePath, content);
98
+ }
99
+ }
100
+ /**
101
+ * Creates a complete history snapshot for a tick run.
102
+ *
103
+ * Saves all artifacts (meta.json, report.json, report.md, and optionally
104
+ * diff.patch and verify.log) to history/<run_id>/.
105
+ *
106
+ * @param runId - Run ID
107
+ * @param report - Report data
108
+ * @param markdown - Markdown rendering of the report
109
+ * @param diffPatch - Optional diff patch content
110
+ * @param verifyLog - Optional verification log content
111
+ * @param config - Envoi configuration
112
+ * @returns Promise that resolves when all artifacts are saved
113
+ * @throws {Error} If any write operation fails
114
+ */
115
+ export async function snapshotRun(runId, report, markdown, diffPatch, verifyLog, config) {
116
+ // Create the history directory
117
+ await createHistorySnapshot(runId, config);
118
+ // Create meta.json with run metadata
119
+ const meta = {
120
+ run_id: runId,
121
+ created_at: report.ended_at,
122
+ verdict: report.verdict,
123
+ code: report.code,
124
+ };
125
+ await writeHistoryArtifact(runId, 'meta.json', meta, config);
126
+ // Write report.json (full report data)
127
+ await writeHistoryArtifact(runId, 'report.json', report, config);
128
+ // Write report.md (markdown rendering)
129
+ await writeHistoryArtifact(runId, 'report.md', markdown, config);
130
+ // Write optional diff.patch if provided and enabled
131
+ if (diffPatch !== null && diffPatch !== undefined && config.history.include_diff_patch) {
132
+ await writeHistoryArtifact(runId, 'diff.patch', diffPatch, config);
133
+ }
134
+ // Write optional verify.log if provided and enabled
135
+ if (verifyLog !== null && verifyLog !== undefined && config.history.include_verify_log) {
136
+ await writeHistoryArtifact(runId, 'verify.log', verifyLog, config);
137
+ }
138
+ }
139
+ /**
140
+ * Persists builder failure artifacts to history for debugging.
141
+ *
142
+ * Writes raw stdout, stderr (if available), and error info to
143
+ * history/<run_id>/ for post-mortem analysis.
144
+ *
145
+ * @param runId - Run ID
146
+ * @param stdout - Raw stdout from builder invocation
147
+ * @param stderr - Raw stderr from builder invocation (may be null)
148
+ * @param errorInfo - Structured error information
149
+ * @param config - Envoi configuration
150
+ * @returns Promise that resolves when all artifacts are saved
151
+ * @throws {Error} If any write operation fails
152
+ */
153
+ export async function persistBuilderFailure(runId, stdout, stderr, errorInfo, config) {
154
+ // Ensure history directory exists
155
+ await createHistorySnapshot(runId, config);
156
+ // Write raw stdout
157
+ await writeHistoryArtifact(runId, 'builder.stdout.raw.txt', stdout, config);
158
+ // Write raw stderr if available
159
+ if (stderr !== null && stderr.length > 0) {
160
+ await writeHistoryArtifact(runId, 'builder.stderr.raw.txt', stderr, config);
161
+ }
162
+ // Write structured error info
163
+ await writeHistoryArtifact(runId, 'builder.error.json', errorInfo, config);
164
+ }
165
+ /** Maximum size for stdout/stderr artifacts (200KB) */
166
+ const MAX_OUTPUT_SIZE = 200 * 1024;
167
+ /**
168
+ * Truncates content to max size with marker.
169
+ */
170
+ function truncateWithMarker(content, maxSize) {
171
+ if (content.length <= maxSize) {
172
+ return content;
173
+ }
174
+ return content.slice(0, maxSize - 12) + '\n[truncated]';
175
+ }
176
+ /**
177
+ * Persists orchestrator failure artifacts to history for debugging.
178
+ *
179
+ * Writes stdout, stderr, extracted JSON, schema errors, and meta to
180
+ * history/<run_id>/orchestrator/ for post-mortem analysis.
181
+ *
182
+ * @param runId - Run ID
183
+ * @param stdout - Raw stdout from orchestrator invocation
184
+ * @param stderr - Raw stderr from orchestrator invocation
185
+ * @param extractedJson - Extracted JSON candidate if extraction succeeded
186
+ * @param schemaErrors - Ajv errors array when validation fails
187
+ * @param meta - Invocation metadata
188
+ * @param config - Envoi configuration
189
+ * @returns Promise that resolves when all artifacts are saved
190
+ * @throws {Error} If any write operation fails
191
+ */
192
+ export async function persistOrchestratorFailure(runId, stdout, stderr, extractedJson, schemaErrors, meta, config) {
193
+ // Create orchestrator subdirectory under run history
194
+ const orchestratorPath = join(config.workspace_dir, config.history.dir, runId, 'orchestrator');
195
+ await mkdir(orchestratorPath, { recursive: true });
196
+ // Helper to write to orchestrator subdir
197
+ const writeArtifact = async (filename, content) => {
198
+ const filePath = join(orchestratorPath, filename);
199
+ if (typeof content === 'object') {
200
+ await atomicWriteJson(filePath, content);
201
+ }
202
+ else {
203
+ await atomicWriteText(filePath, content);
204
+ }
205
+ };
206
+ // Write stdout.txt (truncated to 200KB)
207
+ await writeArtifact('stdout.txt', truncateWithMarker(stdout, MAX_OUTPUT_SIZE));
208
+ // Write stderr.txt (truncated, create even if empty)
209
+ await writeArtifact('stderr.txt', truncateWithMarker(stderr || '', MAX_OUTPUT_SIZE));
210
+ // Write extracted.json if extraction succeeded
211
+ if (extractedJson !== null && extractedJson !== undefined) {
212
+ await writeArtifact('extracted.json', extractedJson);
213
+ }
214
+ // Write schema_error.json if validation failed
215
+ if (schemaErrors !== null && schemaErrors.length > 0) {
216
+ await writeArtifact('schema_error.json', schemaErrors);
217
+ }
218
+ // Write meta.json
219
+ await writeArtifact('meta.json', meta);
220
+ }
221
+ export async function getHistoryCount(config) {
222
+ const historyPath = resolveInWorkspace(config.workspace_dir, config.history.dir);
223
+ try {
224
+ const entries = await readdir(historyPath, { withFileTypes: true });
225
+ // Count only directories (each run_id is a directory)
226
+ return entries.filter((entry) => entry.isDirectory()).length;
227
+ }
228
+ catch (error) {
229
+ // If directory doesn't exist, return 0
230
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
231
+ return 0;
232
+ }
233
+ throw error;
234
+ }
235
+ }
236
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/lib/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Envoi library utilities.
3
+ *
4
+ * This module exports all public utilities for the Envoi project.
5
+ */
6
+ export { atomicWriteJson, atomicReadJson, cleanupTmpFiles, AtomicFsError, } from './fs.js';
7
+ export { loadConfig, findConfigFile, validateConfig, ConfigError, CONFIG_FILE_NAME, } from './config.js';
8
+ export { getBootId, isPidRunning, isLockStale, acquireLock, releaseLock, LockHeldError, } from './lock.js';
9
+ export { isGitRepo, isWorktreeClean, getHeadCommit, getDiffFiles, getUntrackedFiles, getCurrentBranch, stashPilotFiles, popPilotStash, } from './git.js';
10
+ export { runPreflight } from './preflight.js';
11
+ export { generateRunId, createInitialState, transitionPhase, addError, setTask, setBuilderResult, appendStopHistory, clearForcePatch, setForcePatch, updateTaskFingerprint, recordTaskFailure, resetFailureStreak, appendVerifyHistory, incrementRetryCount, recordTransportStall, resetRetryState, } from './state.js';
12
+ export { buildClaudeArgs, parseClaudeResponse, invokeClaudeCode, } from './claude.js';
13
+ export { loadSchema, validateWithSchema, type ValidationResult, } from './schema.js';
14
+ export { getTouchedTracked, getTouchedUntracked, getDiffStats, analyzeDiff, checkDiffLimits, formatBlastRadius, type DiffAnalysis, type DiffLimitCheckResult, } from './diff.js';
15
+ export { matchesGlob, checkScopeViolations, SCOPE_VIOLATION_FORBIDDEN, SCOPE_VIOLATION_OUTSIDE_ALLOWED, NEW_FILE_FORBIDDEN, LOCKFILE_CHANGE_FORBIDDEN, type ScopeCheckResult, type ScopeViolation, } from './scope.js';
16
+ export { interpolateArgs, executeVerification, runVerifications, validateParam, validateVerificationParams, type VerificationRun, type ParamValidationError, type ParamValidationResult, } from './verify.js';
17
+ export { rollbackTracked, removeUntrackedPaths, rollback, rollbackToCommit, verifyCleanWorktree, type RollbackResult, type RollbackResultNew, } from './rollback.js';
18
+ export { generateRunId as generateReportRunId, buildReport, writeReport, renderReportMarkdown, writeReportMarkdown, type TickReportData, } from './report.js';
19
+ export { createHistorySnapshot, writeHistoryArtifact, snapshotRun, getHistoryCount, } from './history.js';
20
+ export { buildBlockedData, writeBlocked, } from './blocked.js';
21
+ export { invokeReviewer, parseReviewerOutput, checkReviewerAuth, } from './reviewer.js';
22
+ export { checkHighRiskGlobs, checkDiffFraction, checkRepeatedStops, computeRiskFlags, shouldTriggerReviewer, type StopHistoryEntry, } from './risk.js';
23
+ export { runReviewerIfNeeded, handleReviewerDecision, type ReviewerFlowContext, type ReviewerFlowResult, } from './reviewer-flow.js';
24
+ export { checkCodexCli, type ReviewerDoctorResult, } from './doctor.js';
25
+ export { canonicalizeTask, computeFingerprint, } from './fingerprint.js';
26
+ export { checkBranchMatch, checkFingerprintMatch, checkWorktreeClean, runGuardrailPreflight, classifyVerifyResult, shouldEscalate, checkMergeEligibility, type GuardrailState, type PreflightResult as GuardrailPreflightResult, type VerifyResultType, type VerifyClassification, type EscalationDecision, type MergeEligibility, type MergeEligibilityReport, } from './guardrails.js';
27
+ export { isTransportStall, createTransportStallError, invokeWithStallDetection, normalizeTransportError, isTransportStallError, type StallDetectionResult, type InvokeResult, type NormalizedError, } from './transport.js';
28
+ export { handleTransportStall, checkAndHandleStall, formatStallResult, getRetryAction, computeRetryDecision, computeDegradedSettings, applyDegradedConfig, extractDegradationInputs, getDegradedConfigIfNeeded, canRetry, formatRetryDecision, getRecoveryPrompt, buildPromptWithRecovery, shouldResetRetryState, updateStateForOutcome, handleTickSuccess, handleTickStop, handleTickStall, MAX_RETRY_ATTEMPTS, RECOVERY_PROMPT, type StallHandlingResult, type StallHandlingOptions, type RetryAction, type DegradedSettings, type RetryDecision, type TickOutcome, } from './tick.js';
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Envoi library utilities.
3
+ *
4
+ * This module exports all public utilities for the Envoi project.
5
+ */
6
+ export { atomicWriteJson, atomicReadJson, cleanupTmpFiles, AtomicFsError, } from './fs.js';
7
+ export { loadConfig, findConfigFile, validateConfig, ConfigError, CONFIG_FILE_NAME, } from './config.js';
8
+ export { getBootId, isPidRunning, isLockStale, acquireLock, releaseLock, LockHeldError, } from './lock.js';
9
+ export { isGitRepo, isWorktreeClean, getHeadCommit, getDiffFiles, getUntrackedFiles, getCurrentBranch, stashPilotFiles, popPilotStash, } from './git.js';
10
+ export { runPreflight } from './preflight.js';
11
+ export { generateRunId, createInitialState, transitionPhase, addError, setTask, setBuilderResult, appendStopHistory, clearForcePatch, setForcePatch, updateTaskFingerprint, recordTaskFailure, resetFailureStreak, appendVerifyHistory, incrementRetryCount, recordTransportStall, resetRetryState, } from './state.js';
12
+ export { buildClaudeArgs, parseClaudeResponse, invokeClaudeCode, } from './claude.js';
13
+ export { loadSchema, validateWithSchema, } from './schema.js';
14
+ export { getTouchedTracked, getTouchedUntracked, getDiffStats, analyzeDiff, checkDiffLimits, formatBlastRadius, } from './diff.js';
15
+ export { matchesGlob, checkScopeViolations, SCOPE_VIOLATION_FORBIDDEN, SCOPE_VIOLATION_OUTSIDE_ALLOWED, NEW_FILE_FORBIDDEN, LOCKFILE_CHANGE_FORBIDDEN, } from './scope.js';
16
+ export { interpolateArgs, executeVerification, runVerifications, validateParam, validateVerificationParams, } from './verify.js';
17
+ export { rollbackTracked, removeUntrackedPaths, rollback, rollbackToCommit, verifyCleanWorktree, } from './rollback.js';
18
+ export { generateRunId as generateReportRunId, buildReport, writeReport, renderReportMarkdown, writeReportMarkdown, } from './report.js';
19
+ export { createHistorySnapshot, writeHistoryArtifact, snapshotRun, getHistoryCount, } from './history.js';
20
+ export { buildBlockedData, writeBlocked, } from './blocked.js';
21
+ export { invokeReviewer, parseReviewerOutput, checkReviewerAuth, } from './reviewer.js';
22
+ export { checkHighRiskGlobs, checkDiffFraction, checkRepeatedStops, computeRiskFlags, shouldTriggerReviewer, } from './risk.js';
23
+ export { runReviewerIfNeeded, handleReviewerDecision, } from './reviewer-flow.js';
24
+ export { checkCodexCli, } from './doctor.js';
25
+ export { canonicalizeTask, computeFingerprint, } from './fingerprint.js';
26
+ export { checkBranchMatch, checkFingerprintMatch, checkWorktreeClean, runGuardrailPreflight, classifyVerifyResult, shouldEscalate, checkMergeEligibility, } from './guardrails.js';
27
+ export { isTransportStall, createTransportStallError, invokeWithStallDetection, normalizeTransportError, isTransportStallError, } from './transport.js';
28
+ export { handleTransportStall, checkAndHandleStall, formatStallResult, getRetryAction, computeRetryDecision, computeDegradedSettings, applyDegradedConfig, extractDegradationInputs, getDegradedConfigIfNeeded, canRetry, formatRetryDecision, getRecoveryPrompt, buildPromptWithRecovery, shouldResetRetryState, updateStateForOutcome, handleTickSuccess, handleTickStop, handleTickStall, MAX_RETRY_ATTEMPTS, RECOVERY_PROMPT, } from './tick.js';
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * JSON extraction utilities for parsing LLM output.
3
+ *
4
+ * Handles common LLM output patterns:
5
+ * - Preamble text before JSON
6
+ * - Markdown code fences (```json ... ```)
7
+ * - Multiple JSON objects (takes first valid)
8
+ *
9
+ * @see F001, F002 in tests/lib/F001-json-extract.test.ts
10
+ */
11
+ /**
12
+ * Result of JSON extraction attempt.
13
+ */
14
+ export interface JsonExtractResult<T = unknown> {
15
+ /** Whether extraction succeeded */
16
+ success: boolean;
17
+ /** Parsed JSON data (null if failed) */
18
+ data: T | null;
19
+ /** Error message if failed */
20
+ error: string | null;
21
+ /** How the JSON was extracted: 'direct' | 'fence' | 'search' */
22
+ method: 'direct' | 'fence' | 'search' | null;
23
+ }
24
+ /**
25
+ * Attempts to extract JSON from text that may have preamble or code fences.
26
+ *
27
+ * Extraction strategies (in order):
28
+ * 1. Direct parse: Try JSON.parse on the entire string
29
+ * 2. Fence extraction: Look for ```json ... ``` blocks
30
+ * 3. Brace search: Find first { and matching } for object, or [ and ] for array
31
+ *
32
+ * @param text - Raw text that may contain JSON
33
+ * @returns Extraction result with parsed data or error
34
+ */
35
+ export declare function extractJson<T = unknown>(text: string): JsonExtractResult<T>;
36
+ /**
37
+ * Strict JSON extraction - only accepts direct parse.
38
+ *
39
+ * For cases where we need exact JSON output with no preamble.
40
+ */
41
+ export declare function extractJsonStrict<T = unknown>(text: string): JsonExtractResult<T>;
42
+ //# sourceMappingURL=json-extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-extract.d.ts","sourceRoot":"","sources":["../../src/lib/json-extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,8BAA8B;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gEAAgE;IAChE,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;CAC9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CA6B3E;AA+ID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAajF"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * JSON extraction utilities for parsing LLM output.
3
+ *
4
+ * Handles common LLM output patterns:
5
+ * - Preamble text before JSON
6
+ * - Markdown code fences (```json ... ```)
7
+ * - Multiple JSON objects (takes first valid)
8
+ *
9
+ * @see F001, F002 in tests/lib/F001-json-extract.test.ts
10
+ */
11
+ /**
12
+ * Attempts to extract JSON from text that may have preamble or code fences.
13
+ *
14
+ * Extraction strategies (in order):
15
+ * 1. Direct parse: Try JSON.parse on the entire string
16
+ * 2. Fence extraction: Look for ```json ... ``` blocks
17
+ * 3. Brace search: Find first { and matching } for object, or [ and ] for array
18
+ *
19
+ * @param text - Raw text that may contain JSON
20
+ * @returns Extraction result with parsed data or error
21
+ */
22
+ export function extractJson(text) {
23
+ const trimmed = text.trim();
24
+ // Strategy 1: Direct parse
25
+ try {
26
+ const data = JSON.parse(trimmed);
27
+ return { success: true, data, error: null, method: 'direct' };
28
+ }
29
+ catch {
30
+ // Continue to next strategy
31
+ }
32
+ // Strategy 2: Extract from code fence
33
+ const fenceResult = extractFromFence(trimmed);
34
+ if (fenceResult.success) {
35
+ return fenceResult;
36
+ }
37
+ // Strategy 3: Search for JSON object or array
38
+ const searchResult = extractByBraceSearch(trimmed);
39
+ if (searchResult.success) {
40
+ return searchResult;
41
+ }
42
+ return {
43
+ success: false,
44
+ data: null,
45
+ error: `Failed to extract JSON from text. Tried direct parse, fence extraction, and brace search.`,
46
+ method: null,
47
+ };
48
+ }
49
+ /**
50
+ * Extracts JSON from markdown code fences.
51
+ *
52
+ * Supports:
53
+ * - ```json ... ```
54
+ * - ``` ... ``` (no language specifier)
55
+ *
56
+ * Takes the first valid JSON found in any fence.
57
+ */
58
+ function extractFromFence(text) {
59
+ // Match ```json ... ``` or ``` ... ```
60
+ // Using non-greedy match and handling nested backticks
61
+ const fenceRegex = /```(?:json)?\s*\n?([\s\S]*?)\n?```/g;
62
+ let match;
63
+ while ((match = fenceRegex.exec(text)) !== null) {
64
+ const content = match[1].trim();
65
+ if (!content)
66
+ continue;
67
+ try {
68
+ const data = JSON.parse(content);
69
+ return { success: true, data, error: null, method: 'fence' };
70
+ }
71
+ catch {
72
+ // Try next fence
73
+ continue;
74
+ }
75
+ }
76
+ return {
77
+ success: false,
78
+ data: null,
79
+ error: 'No valid JSON found in code fences',
80
+ method: null,
81
+ };
82
+ }
83
+ /**
84
+ * Searches for JSON by finding balanced braces.
85
+ *
86
+ * Finds the first { or [ and its matching closing brace,
87
+ * respecting string escaping and nesting.
88
+ */
89
+ function extractByBraceSearch(text) {
90
+ // Find first { or [
91
+ const objectStart = text.indexOf('{');
92
+ const arrayStart = text.indexOf('[');
93
+ let start;
94
+ let openChar;
95
+ let closeChar;
96
+ if (objectStart === -1 && arrayStart === -1) {
97
+ return {
98
+ success: false,
99
+ data: null,
100
+ error: 'No JSON object or array found',
101
+ method: null,
102
+ };
103
+ }
104
+ if (objectStart === -1) {
105
+ start = arrayStart;
106
+ openChar = '[';
107
+ closeChar = ']';
108
+ }
109
+ else if (arrayStart === -1) {
110
+ start = objectStart;
111
+ openChar = '{';
112
+ closeChar = '}';
113
+ }
114
+ else {
115
+ // Take whichever comes first
116
+ if (objectStart < arrayStart) {
117
+ start = objectStart;
118
+ openChar = '{';
119
+ closeChar = '}';
120
+ }
121
+ else {
122
+ start = arrayStart;
123
+ openChar = '[';
124
+ closeChar = ']';
125
+ }
126
+ }
127
+ // Find matching close brace
128
+ let depth = 0;
129
+ let inString = false;
130
+ let escapeNext = false;
131
+ let end = -1;
132
+ for (let i = start; i < text.length; i++) {
133
+ const char = text[i];
134
+ if (escapeNext) {
135
+ escapeNext = false;
136
+ continue;
137
+ }
138
+ if (char === '\\' && inString) {
139
+ escapeNext = true;
140
+ continue;
141
+ }
142
+ if (char === '"') {
143
+ inString = !inString;
144
+ continue;
145
+ }
146
+ if (inString)
147
+ continue;
148
+ if (char === openChar) {
149
+ depth++;
150
+ }
151
+ else if (char === closeChar) {
152
+ depth--;
153
+ if (depth === 0) {
154
+ end = i;
155
+ break;
156
+ }
157
+ }
158
+ }
159
+ if (end === -1) {
160
+ return {
161
+ success: false,
162
+ data: null,
163
+ error: 'Unbalanced braces in JSON',
164
+ method: null,
165
+ };
166
+ }
167
+ const jsonStr = text.slice(start, end + 1);
168
+ try {
169
+ const data = JSON.parse(jsonStr);
170
+ return { success: true, data, error: null, method: 'search' };
171
+ }
172
+ catch (e) {
173
+ return {
174
+ success: false,
175
+ data: null,
176
+ error: `Found JSON-like structure but parse failed: ${e instanceof Error ? e.message : String(e)}`,
177
+ method: null,
178
+ };
179
+ }
180
+ }
181
+ /**
182
+ * Strict JSON extraction - only accepts direct parse.
183
+ *
184
+ * For cases where we need exact JSON output with no preamble.
185
+ */
186
+ export function extractJsonStrict(text) {
187
+ const trimmed = text.trim();
188
+ try {
189
+ const data = JSON.parse(trimmed);
190
+ return { success: true, data, error: null, method: 'direct' };
191
+ }
192
+ catch (e) {
193
+ return {
194
+ success: false,
195
+ data: null,
196
+ error: `JSON parse failed: ${e instanceof Error ? e.message : String(e)}`,
197
+ method: null,
198
+ };
199
+ }
200
+ }
201
+ //# sourceMappingURL=json-extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-extract.js","sourceRoot":"","sources":["../../src/lib/json-extract.ts"],"names":[],"mappings":"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"}