voratiq 0.1.0-beta.2 → 0.1.0-beta.21

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 (527) hide show
  1. package/README.md +41 -29
  2. package/dist/agents/launch/chat.d.ts +23 -0
  3. package/dist/agents/launch/chat.js +44 -0
  4. package/dist/agents/launch/environment.d.ts +8 -0
  5. package/dist/{commands/run/agents/workspace-prep.js → agents/launch/environment.js} +5 -27
  6. package/dist/agents/launch/prompt.d.ts +6 -0
  7. package/dist/agents/launch/prompt.js +12 -0
  8. package/dist/agents/launch/provider-state.d.ts +39 -0
  9. package/dist/agents/launch/provider-state.js +103 -0
  10. package/dist/agents/runtime/auth.d.ts +27 -0
  11. package/dist/agents/runtime/auth.js +72 -0
  12. package/dist/agents/runtime/chat.d.ts +5 -0
  13. package/dist/agents/runtime/chat.js +7 -0
  14. package/dist/agents/runtime/errors.d.ts +27 -0
  15. package/dist/agents/runtime/errors.js +51 -0
  16. package/dist/{commands/run/agents → agents/runtime}/failures.d.ts +0 -1
  17. package/dist/agents/runtime/failures.js +136 -0
  18. package/dist/agents/runtime/harness.d.ts +2 -0
  19. package/dist/agents/runtime/harness.js +119 -0
  20. package/dist/{commands/run/agents/sandbox-launcher.d.ts → agents/runtime/launcher.d.ts} +18 -6
  21. package/dist/{commands/run/agents/sandbox-launcher.js → agents/runtime/launcher.js} +17 -39
  22. package/dist/{commands/run/agents/workspace-prep.d.ts → agents/runtime/manifest.d.ts} +6 -6
  23. package/dist/agents/runtime/manifest.js +34 -0
  24. package/dist/agents/runtime/policy.d.ts +32 -0
  25. package/dist/agents/runtime/policy.js +240 -0
  26. package/dist/agents/runtime/registry.d.ts +4 -0
  27. package/dist/agents/runtime/registry.js +54 -0
  28. package/dist/{commands/run → agents/runtime}/sandbox.d.ts +8 -2
  29. package/dist/{commands/run → agents/runtime}/sandbox.js +28 -67
  30. package/dist/agents/runtime/shim/run-agent-shim.d.ts +1 -0
  31. package/dist/agents/runtime/shim/run-agent-shim.js +276 -0
  32. package/dist/agents/runtime/types.d.ts +91 -0
  33. package/dist/{commands/run/agents → agents/runtime}/watchdog.d.ts +4 -3
  34. package/dist/{commands/run/agents → agents/runtime}/watchdog.js +155 -26
  35. package/dist/auth/providers/codex.js +7 -2
  36. package/dist/auth/providers/gemini.js +14 -6
  37. package/dist/auth/providers/types.d.ts +1 -0
  38. package/dist/auth/providers/utils.d.ts +0 -1
  39. package/dist/auth/providers/utils.js +1 -49
  40. package/dist/bin.js +369 -71
  41. package/dist/cli/apply.d.ts +4 -0
  42. package/dist/cli/apply.js +28 -9
  43. package/dist/cli/auto.d.ts +32 -0
  44. package/dist/cli/auto.js +232 -0
  45. package/dist/cli/contract.d.ts +328 -0
  46. package/dist/cli/contract.js +480 -0
  47. package/dist/cli/errors.d.ts +3 -0
  48. package/dist/cli/errors.js +21 -3
  49. package/dist/cli/init.d.ts +5 -0
  50. package/dist/cli/init.js +34 -6
  51. package/dist/cli/list.d.ts +6 -4
  52. package/dist/cli/list.js +39 -16
  53. package/dist/cli/mcp.d.ts +2 -0
  54. package/dist/cli/mcp.js +16 -0
  55. package/dist/cli/message.d.ts +28 -0
  56. package/dist/cli/message.js +147 -0
  57. package/dist/cli/operator-envelope.d.ts +180 -0
  58. package/dist/cli/operator-envelope.js +425 -0
  59. package/dist/cli/output.d.ts +15 -1
  60. package/dist/cli/output.js +153 -5
  61. package/dist/cli/prune.d.ts +7 -3
  62. package/dist/cli/prune.js +57 -12
  63. package/dist/cli/reduce.d.ts +29 -0
  64. package/dist/cli/reduce.js +211 -0
  65. package/dist/cli/root-launcher.d.ts +4 -0
  66. package/dist/cli/root-launcher.js +15 -0
  67. package/dist/cli/run.d.ts +27 -1
  68. package/dist/cli/run.js +108 -16
  69. package/dist/cli/spec.d.ts +31 -0
  70. package/dist/cli/spec.js +180 -0
  71. package/dist/cli/verify.d.ts +35 -0
  72. package/dist/cli/verify.js +297 -0
  73. package/dist/commands/apply/command.d.ts +2 -0
  74. package/dist/commands/apply/command.js +145 -6
  75. package/dist/commands/apply/errors.d.ts +43 -4
  76. package/dist/commands/apply/errors.js +100 -22
  77. package/dist/commands/apply/types.d.ts +2 -1
  78. package/dist/commands/auto/command.d.ts +145 -0
  79. package/dist/commands/auto/command.js +433 -0
  80. package/dist/commands/auto/errors.d.ts +19 -0
  81. package/dist/commands/auto/errors.js +19 -0
  82. package/dist/commands/auto/validation.d.ts +14 -0
  83. package/dist/commands/auto/validation.js +90 -0
  84. package/dist/commands/fetch.d.ts +2 -2
  85. package/dist/commands/fetch.js +4 -4
  86. package/dist/commands/init/agents.d.ts +2 -1
  87. package/dist/commands/init/agents.js +66 -63
  88. package/dist/commands/init/command.js +300 -16
  89. package/dist/commands/init/types.d.ts +18 -7
  90. package/dist/commands/interactive/lifecycle.d.ts +15 -0
  91. package/dist/commands/interactive/lifecycle.js +141 -0
  92. package/dist/commands/list/command.d.ts +10 -3
  93. package/dist/commands/list/command.js +597 -40
  94. package/dist/commands/message/command.d.ts +23 -0
  95. package/dist/commands/message/command.js +215 -0
  96. package/dist/commands/message/errors.d.ts +9 -0
  97. package/dist/commands/message/errors.js +20 -0
  98. package/dist/commands/message/lifecycle.d.ts +14 -0
  99. package/dist/commands/message/lifecycle.js +128 -0
  100. package/dist/commands/prune/command.d.ts +2 -1
  101. package/dist/commands/prune/command.js +61 -10
  102. package/dist/commands/prune/errors.d.ts +1 -1
  103. package/dist/commands/prune/errors.js +5 -5
  104. package/dist/commands/prune/types.d.ts +21 -0
  105. package/dist/commands/reduce/command.d.ts +26 -0
  106. package/dist/commands/reduce/command.js +145 -0
  107. package/dist/commands/reduce/errors.d.ts +17 -0
  108. package/dist/commands/reduce/errors.js +32 -0
  109. package/dist/commands/reduce/targets.d.ts +11 -0
  110. package/dist/commands/reduce/targets.js +271 -0
  111. package/dist/commands/root-launcher/command.d.ts +31 -0
  112. package/dist/commands/root-launcher/command.js +233 -0
  113. package/dist/commands/run/command.d.ts +6 -1
  114. package/dist/commands/run/command.js +70 -40
  115. package/dist/commands/run/lifecycle.d.ts +7 -5
  116. package/dist/commands/run/lifecycle.js +45 -23
  117. package/dist/commands/run/record-init.d.ts +4 -1
  118. package/dist/commands/run/record-init.js +5 -2
  119. package/dist/commands/run/shim/run-agent-shim.d.ts +2 -1
  120. package/dist/commands/run/shim/run-agent-shim.js +4 -219
  121. package/dist/commands/run/validation.d.ts +2 -3
  122. package/dist/commands/run/validation.js +54 -25
  123. package/dist/commands/shared/max-parallel.d.ts +5 -0
  124. package/dist/commands/shared/max-parallel.js +15 -0
  125. package/dist/commands/shared/preview.d.ts +10 -0
  126. package/dist/commands/shared/preview.js +60 -0
  127. package/dist/commands/shared/resolve-reduction-competitors.d.ts +15 -0
  128. package/dist/commands/shared/resolve-reduction-competitors.js +13 -0
  129. package/dist/commands/shared/resolve-stage-competitors.d.ts +19 -0
  130. package/dist/commands/shared/resolve-stage-competitors.js +171 -0
  131. package/dist/commands/shared/session-id.d.ts +1 -0
  132. package/dist/commands/shared/session-id.js +1 -0
  133. package/dist/commands/spec/command.d.ts +22 -0
  134. package/dist/commands/spec/command.js +330 -0
  135. package/dist/commands/spec/errors.d.ts +11 -0
  136. package/dist/commands/spec/errors.js +23 -0
  137. package/dist/commands/verify/agents.d.ts +8 -0
  138. package/dist/commands/verify/agents.js +29 -0
  139. package/dist/commands/verify/command.d.ts +23 -0
  140. package/dist/commands/verify/command.js +168 -0
  141. package/dist/commands/verify/lifecycle.d.ts +14 -0
  142. package/dist/commands/verify/lifecycle.js +229 -0
  143. package/dist/commands/verify/max-parallel.d.ts +7 -0
  144. package/dist/commands/verify/max-parallel.js +15 -0
  145. package/dist/commands/verify/targets.d.ts +18 -0
  146. package/dist/commands/verify/targets.js +420 -0
  147. package/dist/competition/command-adapter.d.ts +35 -0
  148. package/dist/competition/command-adapter.js +20 -0
  149. package/dist/competition/core.d.ts +41 -0
  150. package/dist/competition/core.js +181 -0
  151. package/dist/competition/shared/extra-context.d.ts +14 -0
  152. package/dist/competition/shared/extra-context.js +100 -0
  153. package/dist/competition/shared/preflight.d.ts +11 -0
  154. package/dist/competition/shared/preflight.js +39 -0
  155. package/dist/competition/shared/prompt-helpers.d.ts +16 -0
  156. package/dist/competition/shared/prompt-helpers.js +27 -0
  157. package/dist/competition/shared/prune.d.ts +1 -0
  158. package/dist/competition/shared/prune.js +4 -0
  159. package/dist/competition/shared/sandbox-policy.d.ts +9 -0
  160. package/dist/competition/shared/sandbox-policy.js +7 -0
  161. package/dist/competition/shared/teardown.d.ts +36 -0
  162. package/dist/competition/shared/teardown.js +101 -0
  163. package/dist/configs/agents/defaults.d.ts +31 -2
  164. package/dist/configs/agents/defaults.js +346 -30
  165. package/dist/configs/agents/errors.js +14 -11
  166. package/dist/configs/agents/loader.d.ts +11 -1
  167. package/dist/configs/agents/loader.js +71 -4
  168. package/dist/configs/agents/types.js +2 -2
  169. package/dist/configs/environment/detect.js +9 -4
  170. package/dist/configs/environment/errors.js +4 -4
  171. package/dist/configs/environment/loader.d.ts +1 -1
  172. package/dist/configs/environment/loader.js +3 -3
  173. package/dist/configs/orchestration/bootstrap.d.ts +16 -0
  174. package/dist/configs/orchestration/bootstrap.js +122 -0
  175. package/dist/configs/orchestration/errors.d.ts +15 -0
  176. package/dist/configs/orchestration/errors.js +28 -0
  177. package/dist/configs/orchestration/loader.d.ts +9 -0
  178. package/dist/configs/orchestration/loader.js +148 -0
  179. package/dist/configs/orchestration/types.d.ts +102 -0
  180. package/dist/configs/orchestration/types.js +65 -0
  181. package/dist/configs/sandbox/defaults.js +14 -4
  182. package/dist/configs/sandbox/errors.d.ts +1 -1
  183. package/dist/configs/sandbox/errors.js +1 -1
  184. package/dist/configs/sandbox/loader.js +6 -4
  185. package/dist/configs/sandbox/schemas.js +4 -2
  186. package/dist/configs/settings/loader.d.ts +7 -0
  187. package/dist/configs/settings/loader.js +81 -0
  188. package/dist/configs/settings/types.d.ts +47 -0
  189. package/dist/configs/settings/types.js +23 -0
  190. package/dist/configs/verification/errors.d.ts +11 -0
  191. package/dist/configs/verification/errors.js +21 -0
  192. package/dist/configs/verification/loader.d.ts +8 -0
  193. package/dist/configs/verification/loader.js +43 -0
  194. package/dist/configs/verification/methods.d.ts +35 -0
  195. package/dist/configs/verification/methods.js +41 -0
  196. package/dist/configs/verification/programmatic-defaults.d.ts +10 -0
  197. package/dist/configs/verification/programmatic-defaults.js +42 -0
  198. package/dist/configs/verification/programmatic-detect.d.ts +10 -0
  199. package/dist/configs/{evals/detect.js → verification/programmatic-detect.js} +22 -33
  200. package/dist/configs/verification/types.d.ts +49 -0
  201. package/dist/configs/verification/types.js +45 -0
  202. package/dist/contracts/list.d.ts +207 -0
  203. package/dist/contracts/list.js +154 -0
  204. package/dist/domain/interactive/model/types.d.ts +104 -0
  205. package/dist/domain/interactive/model/types.js +83 -0
  206. package/dist/domain/interactive/persistence/adapter.d.ts +39 -0
  207. package/dist/domain/interactive/persistence/adapter.js +144 -0
  208. package/dist/domain/interactive/prompt.d.ts +3 -0
  209. package/dist/domain/interactive/prompt.js +7 -0
  210. package/dist/domain/message/competition/adapter.d.ts +36 -0
  211. package/dist/domain/message/competition/adapter.js +197 -0
  212. package/dist/domain/message/competition/prompt.d.ts +8 -0
  213. package/dist/domain/message/competition/prompt.js +29 -0
  214. package/dist/domain/message/model/mutators.d.ts +17 -0
  215. package/dist/domain/message/model/mutators.js +107 -0
  216. package/dist/domain/message/model/types.d.ts +100 -0
  217. package/dist/domain/message/model/types.js +87 -0
  218. package/dist/domain/message/persistence/adapter.d.ts +43 -0
  219. package/dist/domain/message/persistence/adapter.js +124 -0
  220. package/dist/domain/reduce/competition/adapter.d.ts +42 -0
  221. package/dist/domain/reduce/competition/adapter.js +826 -0
  222. package/dist/domain/reduce/competition/output-validation.d.ts +4 -0
  223. package/dist/domain/reduce/competition/output-validation.js +18 -0
  224. package/dist/domain/reduce/competition/prompt.d.ts +10 -0
  225. package/dist/domain/reduce/competition/prompt.js +96 -0
  226. package/dist/domain/reduce/competition/reduction.d.ts +9 -0
  227. package/dist/domain/reduce/competition/reduction.js +32 -0
  228. package/dist/domain/reduce/model/types.d.ts +122 -0
  229. package/dist/domain/reduce/model/types.js +84 -0
  230. package/dist/domain/reduce/persistence/adapter.d.ts +43 -0
  231. package/dist/domain/reduce/persistence/adapter.js +126 -0
  232. package/dist/domain/run/competition/adapter.d.ts +30 -0
  233. package/dist/domain/run/competition/adapter.js +39 -0
  234. package/dist/domain/run/competition/agent-execution.d.ts +20 -0
  235. package/dist/domain/run/competition/agent-execution.js +45 -0
  236. package/dist/domain/run/competition/agent-preparation.d.ts +12 -0
  237. package/dist/domain/run/competition/agent-preparation.js +24 -0
  238. package/dist/domain/run/competition/agents/artifacts.d.ts +17 -0
  239. package/dist/domain/run/competition/agents/artifacts.js +173 -0
  240. package/dist/{commands/run → domain/run/competition}/agents/lifecycle.d.ts +3 -3
  241. package/dist/{commands/run → domain/run/competition}/agents/lifecycle.js +84 -64
  242. package/dist/domain/run/competition/agents/post-processing.d.ts +12 -0
  243. package/dist/domain/run/competition/agents/post-processing.js +4 -0
  244. package/dist/domain/run/competition/agents/preparation.js +64 -0
  245. package/dist/{commands/run → domain/run/competition}/agents/run-context.d.ts +9 -16
  246. package/dist/{commands/run → domain/run/competition}/agents/run-context.js +22 -70
  247. package/dist/{commands/run → domain/run/competition}/agents/types.d.ts +10 -13
  248. package/dist/domain/run/competition/agents/workspace.d.ts +21 -0
  249. package/dist/domain/run/competition/agents/workspace.js +47 -0
  250. package/dist/{commands/run → domain/run/competition}/errors.d.ts +8 -1
  251. package/dist/{commands/run → domain/run/competition}/errors.js +39 -9
  252. package/dist/{commands/run → domain/run/competition}/phases.d.ts +1 -2
  253. package/dist/domain/run/competition/phases.js +1 -0
  254. package/dist/domain/run/competition/prompt.d.ts +7 -0
  255. package/dist/domain/run/competition/prompt.js +27 -0
  256. package/dist/{commands/run → domain/run/competition}/reports.d.ts +5 -3
  257. package/dist/{commands/run → domain/run/competition}/reports.js +7 -19
  258. package/dist/domain/run/competition/termination-state.d.ts +4 -0
  259. package/dist/domain/run/competition/termination-state.js +12 -0
  260. package/dist/{records → domain/run/model}/enhanced.d.ts +6 -7
  261. package/dist/{records → domain/run/model}/enhanced.js +11 -11
  262. package/dist/{records → domain/run/model}/errors.d.ts +1 -1
  263. package/dist/{records → domain/run/model}/errors.js +5 -5
  264. package/dist/{records → domain/run/model}/mutators.d.ts +4 -3
  265. package/dist/{records → domain/run/model}/mutators.js +58 -36
  266. package/dist/domain/run/model/types.d.ts +376 -0
  267. package/dist/domain/run/model/types.js +192 -0
  268. package/dist/{records/persistence.d.ts → domain/run/persistence/adapter.d.ts} +9 -3
  269. package/dist/domain/run/persistence/adapter.js +340 -0
  270. package/dist/domain/run/persistence/error-mapping.d.ts +2 -0
  271. package/dist/domain/run/persistence/error-mapping.js +17 -0
  272. package/dist/domain/shared/lifecycle.d.ts +54 -0
  273. package/dist/domain/shared/lifecycle.js +165 -0
  274. package/dist/domain/shared/token-usage.d.ts +21 -0
  275. package/dist/domain/shared/token-usage.js +38 -0
  276. package/dist/domain/spec/competition/adapter.d.ts +31 -0
  277. package/dist/domain/spec/competition/adapter.js +196 -0
  278. package/dist/domain/spec/competition/prompt.d.ts +11 -0
  279. package/dist/domain/spec/competition/prompt.js +44 -0
  280. package/dist/domain/spec/model/output.d.ts +13 -0
  281. package/dist/domain/spec/model/output.js +36 -0
  282. package/dist/domain/spec/model/types.d.ts +98 -0
  283. package/dist/domain/spec/model/types.js +84 -0
  284. package/dist/domain/spec/persistence/adapter.d.ts +51 -0
  285. package/dist/domain/spec/persistence/adapter.js +140 -0
  286. package/dist/domain/verify/blinding/aliases.d.ts +7 -0
  287. package/dist/domain/verify/blinding/aliases.js +23 -0
  288. package/dist/domain/verify/competition/adapter.d.ts +54 -0
  289. package/dist/domain/verify/competition/adapter.js +444 -0
  290. package/dist/domain/verify/competition/artifacts.d.ts +6 -0
  291. package/dist/domain/verify/competition/artifacts.js +7 -0
  292. package/dist/domain/verify/competition/blinding.d.ts +24 -0
  293. package/dist/domain/verify/competition/blinding.js +109 -0
  294. package/dist/domain/verify/competition/finalize.d.ts +11 -0
  295. package/dist/domain/verify/competition/finalize.js +65 -0
  296. package/dist/domain/verify/competition/programmatic.d.ts +15 -0
  297. package/dist/domain/verify/competition/programmatic.js +352 -0
  298. package/dist/domain/verify/competition/prompt.d.ts +19 -0
  299. package/dist/domain/verify/competition/prompt.js +63 -0
  300. package/dist/domain/verify/competition/rubric.d.ts +23 -0
  301. package/dist/domain/verify/competition/rubric.js +77 -0
  302. package/dist/domain/verify/competition/shared-layout.d.ts +121 -0
  303. package/dist/domain/verify/competition/shared-layout.js +365 -0
  304. package/dist/domain/verify/competition/target.d.ts +47 -0
  305. package/dist/domain/verify/competition/target.js +1 -0
  306. package/dist/domain/verify/model/mutators.d.ts +16 -0
  307. package/dist/domain/verify/model/mutators.js +126 -0
  308. package/dist/domain/verify/model/types.d.ts +408 -0
  309. package/dist/domain/verify/model/types.js +289 -0
  310. package/dist/domain/verify/persistence/adapter.d.ts +43 -0
  311. package/dist/domain/verify/persistence/adapter.js +126 -0
  312. package/dist/domain/verify/programmatic/runner.d.ts +22 -0
  313. package/dist/domain/verify/programmatic/runner.js +209 -0
  314. package/dist/domain/verify/rubric-result.d.ts +28 -0
  315. package/dist/domain/verify/rubric-result.js +121 -0
  316. package/dist/extra-context/contract.d.ts +17 -0
  317. package/dist/extra-context/contract.js +60 -0
  318. package/dist/interactive/index.d.ts +2 -0
  319. package/dist/interactive/index.js +1 -0
  320. package/dist/interactive/providers/launch.d.ts +23 -0
  321. package/dist/interactive/providers/launch.js +203 -0
  322. package/dist/interactive/providers/mcp.d.ts +13 -0
  323. package/dist/interactive/providers/mcp.js +547 -0
  324. package/dist/interactive/providers/shared.d.ts +2 -0
  325. package/dist/interactive/providers/shared.js +1 -0
  326. package/dist/interactive/providers.d.ts +3 -0
  327. package/dist/interactive/providers.js +3 -0
  328. package/dist/interactive/records.d.ts +2 -0
  329. package/dist/interactive/records.js +1 -0
  330. package/dist/interactive/substrate.d.ts +21 -0
  331. package/dist/interactive/substrate.js +522 -0
  332. package/dist/interactive/types.d.ts +101 -0
  333. package/dist/interactive/types.js +1 -0
  334. package/dist/mcp/server.d.ts +88 -0
  335. package/dist/mcp/server.js +790 -0
  336. package/dist/persistence/error-mapping.d.ts +19 -0
  337. package/dist/persistence/error-mapping.js +44 -0
  338. package/dist/persistence/errors.d.ts +26 -0
  339. package/dist/persistence/errors.js +49 -0
  340. package/dist/persistence/extra-context.d.ts +9 -0
  341. package/dist/persistence/extra-context.js +60 -0
  342. package/dist/{records → persistence}/history-lock.js +2 -2
  343. package/dist/persistence/record-path-schema.d.ts +3 -0
  344. package/dist/persistence/record-path-schema.js +16 -0
  345. package/dist/persistence/session-store.d.ts +92 -0
  346. package/dist/persistence/session-store.js +412 -0
  347. package/dist/policy/auto.d.ts +13 -0
  348. package/dist/policy/auto.js +22 -0
  349. package/dist/policy/index.d.ts +5 -0
  350. package/dist/policy/index.js +5 -0
  351. package/dist/policy/resolution.d.ts +6 -0
  352. package/dist/policy/resolution.js +23 -0
  353. package/dist/policy/result.d.ts +53 -0
  354. package/dist/policy/result.js +15 -0
  355. package/dist/policy/selector.d.ts +11 -0
  356. package/dist/policy/selector.js +57 -0
  357. package/dist/policy/verification.d.ts +77 -0
  358. package/dist/policy/verification.js +365 -0
  359. package/dist/policy/verifier-selection.d.ts +13 -0
  360. package/dist/policy/verifier-selection.js +78 -0
  361. package/dist/preflight/branch.d.ts +9 -0
  362. package/dist/preflight/branch.js +48 -0
  363. package/dist/preflight/errors.d.ts +3 -0
  364. package/dist/preflight/errors.js +10 -3
  365. package/dist/preflight/index.d.ts +13 -0
  366. package/dist/preflight/index.js +43 -8
  367. package/dist/render/interactions/confirmation.js +4 -2
  368. package/dist/render/transcripts/apply.js +9 -10
  369. package/dist/render/transcripts/auto.d.ts +27 -0
  370. package/dist/render/transcripts/auto.js +21 -0
  371. package/dist/render/transcripts/init.d.ts +4 -15
  372. package/dist/render/transcripts/init.js +71 -72
  373. package/dist/render/transcripts/list.d.ts +10 -1
  374. package/dist/render/transcripts/list.js +121 -15
  375. package/dist/render/transcripts/message.d.ts +72 -0
  376. package/dist/render/transcripts/message.js +362 -0
  377. package/dist/render/transcripts/prune.d.ts +7 -2
  378. package/dist/render/transcripts/prune.js +64 -17
  379. package/dist/render/transcripts/reduce.d.ts +74 -0
  380. package/dist/render/transcripts/reduce.js +395 -0
  381. package/dist/render/transcripts/root-launcher.d.ts +19 -0
  382. package/dist/render/transcripts/root-launcher.js +40 -0
  383. package/dist/render/transcripts/run.d.ts +35 -6
  384. package/dist/render/transcripts/run.js +241 -165
  385. package/dist/render/transcripts/shared.d.ts +2 -0
  386. package/dist/render/transcripts/shared.js +11 -4
  387. package/dist/render/transcripts/spec.d.ts +74 -0
  388. package/dist/render/transcripts/spec.js +394 -0
  389. package/dist/render/transcripts/stage-progress.d.ts +22 -0
  390. package/dist/render/transcripts/stage-progress.js +6 -0
  391. package/dist/render/transcripts/update-check.d.ts +2 -0
  392. package/dist/render/transcripts/update-check.js +22 -0
  393. package/dist/render/transcripts/verify.d.ts +74 -0
  394. package/dist/render/transcripts/verify.js +409 -0
  395. package/dist/render/utils/agents.d.ts +10 -9
  396. package/dist/render/utils/agents.js +30 -82
  397. package/dist/render/utils/badges.d.ts +3 -20
  398. package/dist/render/utils/badges.js +3 -36
  399. package/dist/render/utils/duration.d.ts +12 -0
  400. package/dist/render/utils/duration.js +37 -0
  401. package/dist/render/utils/interactive-frame.d.ts +6 -0
  402. package/dist/render/utils/interactive-frame.js +38 -0
  403. package/dist/render/utils/records.js +4 -4
  404. package/dist/render/utils/runs.d.ts +3 -9
  405. package/dist/render/utils/runs.js +16 -48
  406. package/dist/render/utils/stage-output.d.ts +20 -0
  407. package/dist/render/utils/stage-output.js +44 -0
  408. package/dist/render/utils/timezone.d.ts +2 -0
  409. package/dist/render/utils/timezone.js +42 -0
  410. package/dist/render/utils/transcript-shell.d.ts +66 -0
  411. package/dist/render/utils/transcript-shell.js +155 -0
  412. package/dist/render/utils/transcript.d.ts +7 -1
  413. package/dist/render/utils/transcript.js +12 -2
  414. package/dist/render/utils/wrap.d.ts +1 -0
  415. package/dist/render/utils/wrap.js +20 -0
  416. package/dist/status/colors.d.ts +2 -3
  417. package/dist/status/colors.js +3 -3
  418. package/dist/status/index.d.ts +108 -8
  419. package/dist/status/index.js +164 -5
  420. package/dist/update-check/checker.d.ts +24 -0
  421. package/dist/update-check/checker.js +130 -0
  422. package/dist/update-check/prompt.d.ts +25 -0
  423. package/dist/update-check/prompt.js +62 -0
  424. package/dist/update-check/semver.d.ts +17 -0
  425. package/dist/update-check/semver.js +36 -0
  426. package/dist/update-check/state-path.d.ts +8 -0
  427. package/dist/update-check/state-path.js +18 -0
  428. package/dist/utils/binaries.js +14 -8
  429. package/dist/utils/errors.d.ts +3 -1
  430. package/dist/utils/errors.js +3 -1
  431. package/dist/utils/git.d.ts +10 -0
  432. package/dist/utils/git.js +15 -3
  433. package/dist/utils/output.d.ts +5 -1
  434. package/dist/utils/output.js +4 -2
  435. package/dist/utils/process.d.ts +2 -1
  436. package/dist/utils/process.js +7 -3
  437. package/dist/utils/session-id.d.ts +1 -0
  438. package/dist/utils/session-id.js +22 -0
  439. package/dist/utils/slug.d.ts +2 -0
  440. package/dist/utils/slug.js +15 -0
  441. package/dist/utils/voratiq-cli-target.d.ts +9 -0
  442. package/dist/utils/voratiq-cli-target.js +58 -0
  443. package/dist/workspace/agents.d.ts +13 -16
  444. package/dist/workspace/agents.js +22 -147
  445. package/dist/workspace/chat/artifacts.d.ts +9 -0
  446. package/dist/workspace/chat/artifacts.js +82 -12
  447. package/dist/workspace/chat/native-usage.d.ts +13 -0
  448. package/dist/workspace/chat/native-usage.js +60 -0
  449. package/dist/workspace/chat/sources.d.ts +9 -5
  450. package/dist/workspace/chat/sources.js +89 -23
  451. package/dist/workspace/chat/token-usage-result.d.ts +23 -0
  452. package/dist/workspace/chat/token-usage-result.js +7 -0
  453. package/dist/workspace/chat/usage-extractor.d.ts +30 -0
  454. package/dist/workspace/chat/usage-extractor.js +461 -0
  455. package/dist/workspace/chat/usage-mappings.d.ts +20 -0
  456. package/dist/workspace/chat/usage-mappings.js +136 -0
  457. package/dist/workspace/credential-guard.js +1 -1
  458. package/dist/workspace/dependencies.js +4 -4
  459. package/dist/workspace/errors.d.ts +5 -0
  460. package/dist/workspace/errors.js +13 -3
  461. package/dist/workspace/layout.d.ts +17 -6
  462. package/dist/workspace/layout.js +51 -32
  463. package/dist/workspace/promotion.d.ts +32 -0
  464. package/dist/workspace/promotion.js +34 -0
  465. package/dist/workspace/prune.d.ts +1 -1
  466. package/dist/workspace/run.d.ts +1 -3
  467. package/dist/workspace/run.js +6 -15
  468. package/dist/workspace/setup.d.ts +8 -0
  469. package/dist/workspace/setup.js +359 -56
  470. package/dist/workspace/shim.js +1 -1
  471. package/dist/workspace/structure.d.ts +91 -26
  472. package/dist/workspace/structure.js +227 -43
  473. package/dist/workspace/templates.d.ts +9 -3
  474. package/dist/workspace/templates.js +26 -15
  475. package/dist/workspace/verification-defaults.d.ts +12 -0
  476. package/dist/workspace/verification-defaults.js +1017 -0
  477. package/package.json +30 -24
  478. package/dist/cli/review.d.ts +0 -12
  479. package/dist/cli/review.js +0 -33
  480. package/dist/commands/errors.d.ts +0 -4
  481. package/dist/commands/errors.js +0 -7
  482. package/dist/commands/init/evals.d.ts +0 -4
  483. package/dist/commands/init/evals.js +0 -219
  484. package/dist/commands/review/command.d.ts +0 -10
  485. package/dist/commands/review/command.js +0 -26
  486. package/dist/commands/run/agent-execution.d.ts +0 -19
  487. package/dist/commands/run/agent-execution.js +0 -63
  488. package/dist/commands/run/agents/auth-stage.d.ts +0 -23
  489. package/dist/commands/run/agents/auth-stage.js +0 -108
  490. package/dist/commands/run/agents/chat-preserver.d.ts +0 -9
  491. package/dist/commands/run/agents/chat-preserver.js +0 -35
  492. package/dist/commands/run/agents/eval-runner.d.ts +0 -19
  493. package/dist/commands/run/agents/eval-runner.js +0 -27
  494. package/dist/commands/run/agents/failures.js +0 -32
  495. package/dist/commands/run/agents/preparation.js +0 -123
  496. package/dist/commands/run/agents.d.ts +0 -14
  497. package/dist/commands/run/agents.js +0 -47
  498. package/dist/commands/run/prompts.d.ts +0 -4
  499. package/dist/commands/run/prompts.js +0 -16
  500. package/dist/commands/run/sandbox-registry.d.ts +0 -4
  501. package/dist/commands/run/sandbox-registry.js +0 -54
  502. package/dist/configs/evals/defaults.d.ts +0 -8
  503. package/dist/configs/evals/defaults.js +0 -28
  504. package/dist/configs/evals/detect.d.ts +0 -10
  505. package/dist/configs/evals/errors.d.ts +0 -16
  506. package/dist/configs/evals/errors.js +0 -29
  507. package/dist/configs/evals/loader.d.ts +0 -9
  508. package/dist/configs/evals/loader.js +0 -46
  509. package/dist/configs/evals/types.d.ts +0 -42
  510. package/dist/configs/evals/types.js +0 -74
  511. package/dist/evals/runner.d.ts +0 -16
  512. package/dist/evals/runner.js +0 -132
  513. package/dist/records/persistence.js +0 -469
  514. package/dist/records/types.d.ts +0 -255
  515. package/dist/records/types.js +0 -160
  516. package/dist/render/transcripts/review.d.ts +0 -2
  517. package/dist/render/transcripts/review.js +0 -36
  518. /package/dist/{commands/run → agents/runtime}/shim/agent-manifest.d.ts +0 -0
  519. /package/dist/{commands/run → agents/runtime}/shim/agent-manifest.js +0 -0
  520. /package/dist/{commands/run → agents/runtime/shim}/argv.d.ts +0 -0
  521. /package/dist/{commands/run → agents/runtime/shim}/argv.js +0 -0
  522. /package/dist/{commands/run/agents → agents/runtime}/types.js +0 -0
  523. /package/dist/{commands/run → domain/run/competition}/agents/preparation.d.ts +0 -0
  524. /package/dist/{commands/run/phases.js → domain/run/competition/agents/types.js} +0 -0
  525. /package/dist/{commands/run → domain/run/model}/id.d.ts +0 -0
  526. /package/dist/{commands/run → domain/run/model}/id.js +0 -0
  527. /package/dist/{records → persistence}/history-lock.d.ts +0 -0
@@ -0,0 +1,276 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { dirname, isAbsolute, join, resolve as resolvePath } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { composeRestrictedEnvironment } from "../../../utils/env.js";
6
+ import { GIT_AUTHOR_EMAIL, GIT_AUTHOR_NAME, GIT_COMMITTER_EMAIL, GIT_COMMITTER_NAME, } from "../../../utils/git.js";
7
+ import { injectPromptArg } from "./argv.js";
8
+ class ShimError extends Error {
9
+ exitCode;
10
+ constructor(message, exitCode = 1) {
11
+ super(message);
12
+ this.name = "ShimError";
13
+ this.exitCode = exitCode;
14
+ }
15
+ }
16
+ export async function main(argv = process.argv.slice(2)) {
17
+ try {
18
+ const { configPath } = parseArguments(argv);
19
+ const resolvedConfigPath = resolvePath(process.cwd(), configPath);
20
+ const manifest = await loadManifest(resolvedConfigPath);
21
+ const agentRoot = resolveAgentRoot(resolvedConfigPath);
22
+ const prompt = await loadPrompt(agentRoot, manifest.promptPath, resolvedConfigPath);
23
+ let agentArgv;
24
+ try {
25
+ agentArgv = injectPromptArg(manifest.argv, prompt);
26
+ }
27
+ catch (error) {
28
+ throw new ShimError(`Failed to inject prompt into argv: ${error instanceof Error ? error.message : String(error)}`);
29
+ }
30
+ const exitCode = await launchAgent({
31
+ manifest,
32
+ agentRoot,
33
+ argv: agentArgv,
34
+ });
35
+ return exitCode;
36
+ }
37
+ catch (error) {
38
+ if (error instanceof ShimError) {
39
+ logError(error.message);
40
+ return error.exitCode;
41
+ }
42
+ const message = error instanceof Error ? error.message : String(error);
43
+ logError(`Unexpected error: ${message}`);
44
+ return 1;
45
+ }
46
+ }
47
+ function parseArguments(args) {
48
+ let configPath;
49
+ for (let index = 0; index < args.length; index += 1) {
50
+ const token = args[index];
51
+ if (token === "--config") {
52
+ const next = args[index + 1];
53
+ if (!next) {
54
+ throw new ShimError("Missing value for --config option");
55
+ }
56
+ configPath = next;
57
+ index += 1;
58
+ continue;
59
+ }
60
+ throw new ShimError(`Unknown argument: ${token}`);
61
+ }
62
+ if (!configPath) {
63
+ throw new ShimError("Missing required --config <path> argument");
64
+ }
65
+ return { configPath };
66
+ }
67
+ async function loadManifest(configPath) {
68
+ let raw;
69
+ try {
70
+ raw = await readFile(configPath, "utf8");
71
+ }
72
+ catch (error) {
73
+ const detail = error instanceof Error ? error.message : String(error);
74
+ throw new ShimError(`Failed to read manifest at "${configPath}": ${detail}`);
75
+ }
76
+ let parsed;
77
+ try {
78
+ parsed = JSON.parse(raw);
79
+ }
80
+ catch (error) {
81
+ const detail = error instanceof Error ? error.message : String(error);
82
+ throw new ShimError(`Manifest JSON at "${configPath}" is invalid: ${detail}`);
83
+ }
84
+ return validateManifest(parsed, configPath);
85
+ }
86
+ function validateManifest(data, configPath) {
87
+ if (typeof data !== "object" || data === null) {
88
+ throw new ShimError(`Manifest at "${configPath}" must be a JSON object`);
89
+ }
90
+ const record = data;
91
+ const { binary, argv, promptPath, workspace, env } = record;
92
+ if (typeof binary !== "string" || binary.trim() === "") {
93
+ throw new ShimError(`Manifest at "${configPath}" is missing required string field "binary"`);
94
+ }
95
+ const manifestArgv = ensureStringArray({
96
+ value: argv,
97
+ field: "argv",
98
+ configPath,
99
+ });
100
+ if (typeof promptPath !== "string" || promptPath.trim() === "") {
101
+ throw new ShimError(`Manifest at "${configPath}" is missing required string field "promptPath"`);
102
+ }
103
+ if (typeof workspace !== "string" || workspace.trim() === "") {
104
+ throw new ShimError(`Manifest at "${configPath}" is missing required string field "workspace"`);
105
+ }
106
+ const manifestEnv = ensureEnvRecord({
107
+ value: env,
108
+ configPath,
109
+ });
110
+ return {
111
+ binary,
112
+ argv: manifestArgv,
113
+ promptPath,
114
+ workspace,
115
+ env: manifestEnv,
116
+ };
117
+ }
118
+ function ensureStringArray(options) {
119
+ const { value, field, configPath } = options;
120
+ if (!Array.isArray(value)) {
121
+ throw new ShimError(`Manifest at "${configPath}" must provide "${field}" as an array of strings`);
122
+ }
123
+ const result = [];
124
+ for (const token of value) {
125
+ if (typeof token !== "string") {
126
+ throw new ShimError(`Manifest at "${configPath}" must provide "${field}" as an array of strings`);
127
+ }
128
+ result.push(token);
129
+ }
130
+ return result;
131
+ }
132
+ function ensureEnvRecord(options) {
133
+ const { value, configPath } = options;
134
+ if (value === undefined) {
135
+ return {};
136
+ }
137
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
138
+ throw new ShimError(`Manifest at "${configPath}" must provide "env" as an object of string values`);
139
+ }
140
+ const result = {};
141
+ for (const [key, entry] of Object.entries(value)) {
142
+ if (typeof entry !== "string") {
143
+ throw new ShimError(`Manifest at "${configPath}" must provide "env" as an object of string values`);
144
+ }
145
+ result[key] = entry;
146
+ }
147
+ return result;
148
+ }
149
+ function resolveAgentRoot(configPath) {
150
+ return dirname(configPath);
151
+ }
152
+ async function loadPrompt(agentRoot, manifestPromptPath, configPath) {
153
+ const promptAbsolute = isAbsolute(manifestPromptPath)
154
+ ? manifestPromptPath
155
+ : resolvePath(agentRoot, manifestPromptPath);
156
+ try {
157
+ return await readFile(promptAbsolute, "utf8");
158
+ }
159
+ catch (error) {
160
+ const detail = error instanceof Error ? error.message : String(error);
161
+ throw new ShimError(`Failed to read prompt from "${promptAbsolute}" (manifest: "${configPath}", agentRoot: "${agentRoot}", promptPath: "${manifestPromptPath}"): ${detail}`);
162
+ }
163
+ }
164
+ async function launchAgent(options) {
165
+ const { manifest, agentRoot, argv } = options;
166
+ const binaryPath = isAbsolute(manifest.binary)
167
+ ? manifest.binary
168
+ : resolvePath(agentRoot, manifest.binary);
169
+ const workspacePath = isAbsolute(manifest.workspace)
170
+ ? manifest.workspace
171
+ : resolvePath(agentRoot, manifest.workspace);
172
+ await writeShellProfiles(manifest.env);
173
+ const launchEnv = composeRestrictedEnvironment(manifest.env);
174
+ // Agent commits generated outside the sandbox reuse this persona via
175
+ // resolveSandboxPersona in src/commands/run/agents/lifecycle.ts.
176
+ const personaEnv = {
177
+ GIT_AUTHOR_NAME,
178
+ GIT_AUTHOR_EMAIL,
179
+ GIT_COMMITTER_NAME,
180
+ GIT_COMMITTER_EMAIL,
181
+ GIT_TERMINAL_PROMPT: "0",
182
+ };
183
+ for (const [key, value] of Object.entries(personaEnv)) {
184
+ if (launchEnv[key] === undefined) {
185
+ launchEnv[key] = value;
186
+ }
187
+ }
188
+ return await new Promise((resolve) => {
189
+ let resolved = false;
190
+ const child = spawn(binaryPath, argv, {
191
+ cwd: workspacePath,
192
+ env: launchEnv,
193
+ stdio: "inherit",
194
+ });
195
+ child.once("error", (error) => {
196
+ if (resolved) {
197
+ return;
198
+ }
199
+ resolved = true;
200
+ const detail = error instanceof Error ? error.message : String(error);
201
+ logError(`Failed to launch agent binary at "${binaryPath}": ${detail}`);
202
+ resolve(1);
203
+ });
204
+ child.once("exit", (code, signal) => {
205
+ if (resolved) {
206
+ return;
207
+ }
208
+ resolved = true;
209
+ if (signal) {
210
+ logError(`Agent terminated by signal ${signal}`);
211
+ resolve(1);
212
+ return;
213
+ }
214
+ resolve(code ?? 0);
215
+ });
216
+ });
217
+ }
218
+ async function writeShellProfiles(env) {
219
+ const homeDir = env.HOME;
220
+ if (!homeDir) {
221
+ return;
222
+ }
223
+ const bashrcPath = join(homeDir, ".bashrc");
224
+ const bashProfilePath = join(homeDir, ".bash_profile");
225
+ const exports = formatEnvExports(env);
226
+ const bashrcContents = `# Generated by Voratiq to preserve manifest env\n${exports}\n`;
227
+ const bashProfileContents = "# Generated by Voratiq to preserve manifest env\n" +
228
+ 'if [ -f "$HOME/.bashrc" ]; then\n' +
229
+ ' . "$HOME/.bashrc"\n' +
230
+ "fi\n";
231
+ try {
232
+ await mkdir(homeDir, { recursive: true });
233
+ await writeFile(bashrcPath, bashrcContents, { encoding: "utf8" });
234
+ await writeFile(bashProfilePath, bashProfileContents, {
235
+ encoding: "utf8",
236
+ });
237
+ }
238
+ catch {
239
+ // Best-effort: shell profiles should not block agent startup.
240
+ }
241
+ }
242
+ function formatEnvExports(env) {
243
+ const lines = [];
244
+ const keys = Object.keys(env).sort((a, b) => a.localeCompare(b));
245
+ for (const key of keys) {
246
+ const value = env[key];
247
+ if (value === undefined) {
248
+ continue;
249
+ }
250
+ lines.push(`export ${key}=${shellEscape(value)}`);
251
+ }
252
+ return lines.join("\n");
253
+ }
254
+ function shellEscape(value) {
255
+ if (value.length === 0) {
256
+ return "''";
257
+ }
258
+ const singleQuoteEscape = "'\"'\"'";
259
+ return `'${value.replace(/'/g, singleQuoteEscape)}'`;
260
+ }
261
+ function logError(message) {
262
+ console.error(`[voratiq] ${message}`);
263
+ }
264
+ const modulePath = fileURLToPath(import.meta.url);
265
+ const invokedScript = process.argv[1]
266
+ ? resolvePath(process.argv[1])
267
+ : undefined;
268
+ if (invokedScript && modulePath === invokedScript) {
269
+ void main().then((exitCode) => {
270
+ process.exit(exitCode);
271
+ }, (error) => {
272
+ const detail = error instanceof Error ? error.message : String(error);
273
+ logError(`Unexpected error: ${detail}`);
274
+ process.exit(1);
275
+ });
276
+ }
@@ -0,0 +1,91 @@
1
+ import type { SandboxRuntimeConfig } from "@voratiq/sandbox-runtime";
2
+ import type { AgentDefinition } from "../../configs/agents/types.js";
3
+ import type { EnvironmentConfig } from "../../configs/environment/types.js";
4
+ import type { DenialBackoffConfig } from "../../configs/sandbox/types.js";
5
+ import type { WatchdogMetadata } from "../../domain/run/model/types.js";
6
+ import type { SandboxStageId } from "./policy.js";
7
+ import type { SandboxFailFastInfo } from "./sandbox.js";
8
+ import type { WatchdogTrigger } from "./watchdog.js";
9
+ export interface SandboxPolicyOverrides {
10
+ readonly allowWrite?: readonly string[];
11
+ readonly denyWrite?: readonly string[];
12
+ readonly denyRead?: readonly string[];
13
+ }
14
+ export interface AgentRuntimePaths {
15
+ /** Base directory for the agent session (contains `runtime/` + `artifacts/`). */
16
+ readonly agentRoot: string;
17
+ /** Agent working directory (for example, a worktree or scratch workspace). */
18
+ readonly workspacePath: string;
19
+ /** Writable sandbox home directory for auth staging and HOME isolation. */
20
+ readonly sandboxHomePath: string;
21
+ /** Where to write runtime manifest (`runtime/manifest.json`). */
22
+ readonly runtimeManifestPath: string;
23
+ /** Where to write sandbox settings (`runtime/sandbox.json`). */
24
+ readonly sandboxSettingsPath: string;
25
+ /** Path to the runtime directory (`.../runtime`). Used for temp prompt. */
26
+ readonly runtimePath: string;
27
+ /** Path to the artifacts directory (`.../artifacts`). Used for read/write protection and stdout/stderr. */
28
+ readonly artifactsPath: string;
29
+ /** Process stdout capture. */
30
+ readonly stdoutPath: string;
31
+ /** Process stderr capture. */
32
+ readonly stderrPath: string;
33
+ }
34
+ export type SandboxSettings = SandboxRuntimeConfig;
35
+ export interface AgentRuntimeHarnessInput {
36
+ readonly root: string;
37
+ /** Optional caller-provided identifier for global teardown support. */
38
+ readonly sessionId?: string;
39
+ readonly agent: AgentDefinition;
40
+ readonly prompt: string;
41
+ readonly environment: EnvironmentConfig;
42
+ readonly paths: AgentRuntimePaths;
43
+ /** Stage intent used to compose shared baseline sandbox policy rules. */
44
+ readonly sandboxStageId?: SandboxStageId;
45
+ /**
46
+ * Override for sandbox provider used to load sandbox configuration. Defaults to `agent.provider`.
47
+ */
48
+ readonly sandboxProviderId?: string;
49
+ /**
50
+ * Filesystem policy overrides applied on top of the provider defaults.
51
+ * Reads are allowed by default; writes are restricted via allow/deny lists.
52
+ */
53
+ readonly sandboxPolicyOverrides?: SandboxPolicyOverrides;
54
+ /**
55
+ * Extra paths that must be write-protected from the sandboxed process (e.g., run-specific verification dirs).
56
+ */
57
+ readonly extraWriteProtectedPaths?: readonly string[];
58
+ /**
59
+ * Extra paths that must be read-protected from the sandboxed process (optional).
60
+ */
61
+ readonly extraReadProtectedPaths?: readonly string[];
62
+ /** Denial backoff config used by watchdog; falls back to provider config or defaults. */
63
+ readonly denialBackoff?: DenialBackoffConfig;
64
+ /** Disable chat capture entirely. */
65
+ readonly captureChat?: boolean;
66
+ /**
67
+ * When false, defer auth teardown to session-level cleanup.
68
+ * Defaults to true.
69
+ */
70
+ readonly teardownAuthOnExit?: boolean;
71
+ /** Optional hook for immediate watchdog UI updates. */
72
+ readonly onWatchdogTrigger?: (trigger: WatchdogTrigger, reason: string, failFast?: SandboxFailFastInfo) => void;
73
+ }
74
+ export interface AgentRuntimeChatResult {
75
+ readonly captured: boolean;
76
+ readonly format?: "json" | "jsonl";
77
+ readonly artifactPath?: string;
78
+ readonly sourceCount?: number;
79
+ readonly error?: unknown;
80
+ }
81
+ export interface AgentRuntimeHarnessResult {
82
+ readonly exitCode: number;
83
+ readonly errorMessage?: string;
84
+ readonly signal?: NodeJS.Signals | null;
85
+ readonly watchdog?: WatchdogMetadata;
86
+ readonly failFast?: SandboxFailFastInfo;
87
+ readonly sandboxSettings: SandboxSettings;
88
+ readonly chat?: AgentRuntimeChatResult;
89
+ /** The environment used by the sandboxed agent (includes PATH adjustments and staged auth vars). */
90
+ readonly manifestEnv: Record<string, string>;
91
+ }
@@ -1,7 +1,7 @@
1
1
  import type { ChildProcess } from "node:child_process";
2
2
  import type { Writable } from "node:stream";
3
- import type { DenialBackoffConfig } from "../../../configs/sandbox/types.js";
4
- import { type SandboxFailFastInfo } from "../sandbox.js";
3
+ import type { DenialBackoffConfig } from "../../configs/sandbox/types.js";
4
+ import { type SandboxFailFastInfo } from "./sandbox.js";
5
5
  /**
6
6
  * Watchdog types and constants for enforcing per-agent process timeouts.
7
7
  *
@@ -9,6 +9,7 @@ import { type SandboxFailFastInfo } from "../sandbox.js";
9
9
  * voratiq run pipeline by enforcing silence, wall-clock, and fatal pattern limits.
10
10
  */
11
11
  export type WatchdogTrigger = "silence" | "wall-clock" | "fatal-pattern" | "sandbox-denial";
12
+ export type WatchdogOutputSource = "stdout" | "stderr";
12
13
  export declare const WATCHDOG_DEFAULTS: {
13
14
  readonly silenceTimeoutMs: number;
14
15
  readonly wallClockCapMs: number;
@@ -31,7 +32,7 @@ export interface WatchdogOptions {
31
32
  }
32
33
  export declare function createWatchdog(child: ChildProcess, stderrStream: Writable, options: WatchdogOptions): WatchdogController;
33
34
  export interface WatchdogController {
34
- handleOutput: (chunk: Buffer | string) => void;
35
+ handleOutput: (chunk: Buffer | string, source?: WatchdogOutputSource) => void;
35
36
  cleanup: () => void;
36
37
  getState: () => {
37
38
  triggered: WatchdogTrigger | null;
@@ -1,4 +1,4 @@
1
- import { DenialBackoffTracker, parseSandboxDenialLine, resolveDenialBackoffConfig, } from "../sandbox.js";
1
+ import { DenialBackoffTracker, parseSandboxDenialLine, resolveDenialBackoffConfig, } from "./sandbox.js";
2
2
  export const WATCHDOG_DEFAULTS = {
3
3
  silenceTimeoutMs: 15 * 60 * 1000,
4
4
  wallClockCapMs: 120 * 60 * 1000,
@@ -7,10 +7,92 @@ export const WATCHDOG_DEFAULTS = {
7
7
  /** Hard abort timeout after SIGKILL (ensures process promise resolves). */
8
8
  hardAbortMs: 10 * 1000,
9
9
  };
10
- export const FATAL_PATTERNS = new Map([
11
- ["gemini", [/You have exhausted your capacity on this model\./i]],
12
- ["codex", [/Connection failed: error sending request for url\./i]],
10
+ const FATAL_PATTERN_RULES = new Map([
11
+ [
12
+ "gemini",
13
+ [
14
+ { pattern: /PERMISSION_DENIED/i },
15
+ { pattern: /RESOURCE_EXHAUSTED/i },
16
+ { pattern: /MODEL_CAPACITY_EXHAUSTED/i },
17
+ { pattern: /No capacity available for model/i },
18
+ ],
19
+ ],
20
+ [
21
+ "codex",
22
+ [
23
+ { pattern: /invalid_request_error/i, requiresProviderErrorContext: true },
24
+ { pattern: /unsupported_value/i, requiresProviderErrorContext: true },
25
+ {
26
+ pattern: /^\s*thread\s+.+\s+panicked at\b/i,
27
+ allowedSources: ["stderr"],
28
+ },
29
+ ],
30
+ ],
31
+ [
32
+ "claude",
33
+ [
34
+ { pattern: /OAuth token revoked/i },
35
+ { pattern: /OAuth token has expired/i },
36
+ { pattern: /Please run \/login/i },
37
+ { pattern: /invalid.*api.*key/i },
38
+ { pattern: /insufficient_quota/i },
39
+ ],
40
+ ],
13
41
  ]);
42
+ export const FATAL_PATTERNS = new Map(Array.from(FATAL_PATTERN_RULES, ([providerId, rules]) => [
43
+ providerId,
44
+ rules.map((rule) => rule.pattern),
45
+ ]));
46
+ function hasCodexErrorContext(line) {
47
+ const trimmed = line.trim();
48
+ if (!trimmed) {
49
+ return false;
50
+ }
51
+ if (/^\s*(?:openai|codex)(?:\s+api)?\s+error\b/i.test(trimmed) ||
52
+ /^\s*api\s+error\b/i.test(trimmed)) {
53
+ return true;
54
+ }
55
+ if (/^\s*\{.*"error"\s*:/i.test(trimmed) ||
56
+ /^\s*"error"\s*:/i.test(trimmed)) {
57
+ return true;
58
+ }
59
+ if (/^\s*\{.*"type"\s*:\s*"invalid_request_error"/i.test(trimmed) ||
60
+ /^\s*"type"\s*:\s*"invalid_request_error"/i.test(trimmed)) {
61
+ return true;
62
+ }
63
+ if (/^\s*\{.*"code"\s*:\s*"unsupported_value"/i.test(trimmed) ||
64
+ /^\s*"code"\s*:\s*"unsupported_value"/i.test(trimmed)) {
65
+ return true;
66
+ }
67
+ return false;
68
+ }
69
+ function hasProviderErrorContext(providerId, line) {
70
+ if (providerId === "codex") {
71
+ return hasCodexErrorContext(line);
72
+ }
73
+ return true;
74
+ }
75
+ function findFatalPatternMatch(providerId, line, source, rules) {
76
+ const trimmedLine = line.trim();
77
+ if (!trimmedLine) {
78
+ return undefined;
79
+ }
80
+ for (const rule of rules) {
81
+ if (rule.allowedSources &&
82
+ !rule.allowedSources.some((allowedSource) => allowedSource === source)) {
83
+ continue;
84
+ }
85
+ if (!rule.pattern.test(trimmedLine)) {
86
+ continue;
87
+ }
88
+ if (rule.requiresProviderErrorContext &&
89
+ !hasProviderErrorContext(providerId, trimmedLine)) {
90
+ continue;
91
+ }
92
+ return rule.pattern;
93
+ }
94
+ return undefined;
95
+ }
14
96
  export function createWatchdog(child, stderrStream, options) {
15
97
  const { silenceTimeoutMs, wallClockCapMs, killGraceMs, hardAbortMs } = WATCHDOG_DEFAULTS;
16
98
  const denialBackoff = resolveDenialBackoffConfig(options.denialBackoff);
@@ -20,15 +102,26 @@ export function createWatchdog(child, stderrStream, options) {
20
102
  killGraceTimer: null,
21
103
  hardAbortTimer: null,
22
104
  fatalPatternFirstSeen: null,
105
+ fatalLineBufferBySource: {
106
+ stdout: "",
107
+ stderr: "",
108
+ },
109
+ fatalCurrentLineMatchedBySource: {
110
+ stdout: false,
111
+ stderr: false,
112
+ },
23
113
  triggered: null,
24
114
  triggeredReason: null,
25
115
  sandboxFailFast: null,
26
116
  denialBackoff: new DenialBackoffTracker(denialBackoff),
27
- lineBuffer: "",
117
+ sandboxLineBufferBySource: {
118
+ stdout: "",
119
+ stderr: "",
120
+ },
28
121
  delayInProgress: false,
29
122
  abortController: new AbortController(),
30
123
  };
31
- const fatalPatterns = FATAL_PATTERNS.get(options.providerId) ?? [];
124
+ const fatalPatternRules = FATAL_PATTERN_RULES.get(options.providerId) ?? [];
32
125
  const resetSilenceTimer = () => {
33
126
  if (state.silenceTimer) {
34
127
  clearTimeout(state.silenceTimer);
@@ -77,38 +170,74 @@ export function createWatchdog(child, stderrStream, options) {
77
170
  }
78
171
  terminateProcess(child, state, { killGraceMs, hardAbortMs });
79
172
  };
80
- const checkFatalPattern = (text) => {
81
- if (state.triggered || fatalPatterns.length === 0) {
173
+ const registerFatalPatternMatch = () => {
174
+ const now = Date.now();
175
+ if (state.fatalPatternFirstSeen === null) {
176
+ state.fatalPatternFirstSeen = now;
82
177
  return;
83
178
  }
84
- for (const pattern of fatalPatterns) {
85
- if (pattern.test(text)) {
86
- const now = Date.now();
87
- if (state.fatalPatternFirstSeen === null) {
88
- state.fatalPatternFirstSeen = now;
89
- return;
90
- }
91
- const elapsed = now - state.fatalPatternFirstSeen;
92
- if (elapsed <= WATCHDOG_DEFAULTS.fatalRetryWindowMs) {
93
- triggerWatchdog("fatal-pattern", `Fatal error pattern detected: ${pattern.source}`);
94
- }
179
+ const elapsed = now - state.fatalPatternFirstSeen;
180
+ if (elapsed <= WATCHDOG_DEFAULTS.fatalRetryWindowMs) {
181
+ triggerWatchdog("fatal-pattern", "Fatal provider error detected repeatedly. Inspect `stderr.log` for details.");
182
+ }
183
+ };
184
+ const checkFatalPatternLine = (line, source) => {
185
+ if (state.triggered || fatalPatternRules.length === 0) {
186
+ return false;
187
+ }
188
+ const pattern = findFatalPatternMatch(options.providerId, line, source, fatalPatternRules);
189
+ if (!pattern) {
190
+ return false;
191
+ }
192
+ registerFatalPatternMatch();
193
+ return true;
194
+ };
195
+ const checkFatalPattern = (text, source) => {
196
+ if (state.triggered || fatalPatternRules.length === 0) {
197
+ return;
198
+ }
199
+ state.fatalLineBufferBySource[source] += text;
200
+ const lines = state.fatalLineBufferBySource[source].split(/\r?\n/);
201
+ state.fatalLineBufferBySource[source] = lines.pop() ?? "";
202
+ const hadMatchedTrailingPartial = state.fatalCurrentLineMatchedBySource[source];
203
+ for (const [index, line] of lines.entries()) {
204
+ if (state.triggered) {
95
205
  return;
96
206
  }
207
+ // If the trailing partial line was already matched in a prior chunk,
208
+ // skip exactly its completed replay on this chunk boundary.
209
+ if (hadMatchedTrailingPartial && index === 0) {
210
+ continue;
211
+ }
212
+ checkFatalPatternLine(line, source);
213
+ }
214
+ if (lines.length > 0) {
215
+ state.fatalCurrentLineMatchedBySource[source] = false;
216
+ }
217
+ if (state.triggered) {
218
+ return;
219
+ }
220
+ if (!state.fatalLineBufferBySource[source]) {
221
+ state.fatalCurrentLineMatchedBySource[source] = false;
222
+ return;
223
+ }
224
+ if (!state.fatalCurrentLineMatchedBySource[source]) {
225
+ state.fatalCurrentLineMatchedBySource[source] = checkFatalPatternLine(state.fatalLineBufferBySource[source], source);
97
226
  }
98
227
  };
99
- const handleOutput = (chunk) => {
228
+ const handleOutput = (chunk, source = "stderr") => {
100
229
  resetSilenceTimer();
101
230
  const text = typeof chunk === "string" ? chunk : chunk.toString("utf8");
102
- checkFatalPattern(text);
103
- handleSandboxDenialText(text);
231
+ checkFatalPattern(text, source);
232
+ handleSandboxDenialText(text, source);
104
233
  };
105
- const handleSandboxDenialText = (text) => {
234
+ const handleSandboxDenialText = (text, source) => {
106
235
  if (state.triggered) {
107
236
  return;
108
237
  }
109
- state.lineBuffer += text;
110
- const lines = state.lineBuffer.split("\n");
111
- state.lineBuffer = lines.pop() ?? "";
238
+ state.sandboxLineBufferBySource[source] += text;
239
+ const lines = state.sandboxLineBufferBySource[source].split("\n");
240
+ state.sandboxLineBufferBySource[source] = lines.pop() ?? "";
112
241
  for (const line of lines) {
113
242
  if (state.triggered) {
114
243
  return;
@@ -29,6 +29,7 @@ export const codexAuthProvider = {
29
29
  codex: [".codex"],
30
30
  logs: ["Library", "Logs", "Codex"],
31
31
  support: ["Library", "Application Support", "Codex"],
32
+ tmp: ["tmp"],
32
33
  });
33
34
  await ensureDirectories(Object.values(sandboxPaths));
34
35
  const secretHandles = [];
@@ -42,7 +43,9 @@ export const codexAuthProvider = {
42
43
  fileLabel: CODEX_AUTH_FILENAME,
43
44
  });
44
45
  secretHandles.push(handle);
45
- await copyOptionalConfig(options, sandboxPaths.codex);
46
+ if (options.includeConfigToml !== false) {
47
+ await copyOptionalConfig(options, sandboxPaths.codex);
48
+ }
46
49
  }
47
50
  catch (error) {
48
51
  await disposeHandles(secretHandles);
@@ -51,7 +54,9 @@ export const codexAuthProvider = {
51
54
  registerSandboxSecrets(sandboxPaths.home, secretHandles);
52
55
  const envResult = composeSandboxEnvResult(sandboxPaths.home, {
53
56
  CODEX_HOME: sandboxPaths.codex,
54
- RUST_BACKTRACE: "1",
57
+ TMPDIR: sandboxPaths.tmp,
58
+ TEMP: sandboxPaths.tmp,
59
+ TMP: sandboxPaths.tmp,
55
60
  });
56
61
  return envResult;
57
62
  },