@bjoernrochel/sevro 1.0.0 → 1.1.1

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 (405) hide show
  1. package/CONTRIBUTING.md +34 -4
  2. package/README.md +7 -6
  3. package/dist/examples/basic/graded.json +13 -0
  4. package/dist/examples/basic/host.js +9 -0
  5. package/dist/examples/basic/host.js.map +1 -0
  6. package/dist/examples/basic/prompt-only.json +7 -0
  7. package/dist/examples/recipes/candidate.js +23 -0
  8. package/dist/examples/recipes/candidate.js.map +1 -0
  9. package/dist/examples/recipes/cases/coding-change.json +21 -0
  10. package/dist/examples/recipes/cases/host-tools.json +21 -0
  11. package/dist/examples/recipes/cases/mise.json +21 -0
  12. package/dist/examples/recipes/cases/node.json +21 -0
  13. package/dist/examples/recipes/cases/python-uv.json +21 -0
  14. package/dist/examples/recipes/cases/semantic.json +17 -0
  15. package/dist/examples/recipes/coding-change/check.js +16 -0
  16. package/dist/examples/recipes/coding-change/check.js.map +1 -0
  17. package/dist/examples/recipes/executable.js +20 -0
  18. package/dist/examples/recipes/executable.js.map +1 -0
  19. package/dist/examples/recipes/extension-artifacts.js +56 -0
  20. package/dist/examples/recipes/extension-artifacts.js.map +1 -0
  21. package/dist/examples/recipes/extension-methods.js +167 -0
  22. package/dist/examples/recipes/extension-methods.js.map +1 -0
  23. package/dist/examples/recipes/extension.js +28 -0
  24. package/dist/examples/recipes/extension.js.map +1 -0
  25. package/dist/examples/recipes/modules.js +9 -0
  26. package/dist/examples/recipes/modules.js.map +1 -0
  27. package/dist/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
  28. package/dist/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
  29. package/dist/examples/recipes/repository-skill/README.md +3 -0
  30. package/dist/examples/recipes/run-inputs.js +144 -0
  31. package/dist/examples/recipes/run-inputs.js.map +1 -0
  32. package/dist/examples/recipes/run-options.js +103 -0
  33. package/dist/examples/recipes/run-options.js.map +1 -0
  34. package/dist/examples/recipes/run.js +62 -0
  35. package/dist/examples/recipes/run.js.map +1 -0
  36. package/dist/examples/recipes/runtime/empty.json +1 -0
  37. package/dist/examples/recipes/runtime/goals.json +1 -0
  38. package/dist/examples/recipes/runtime/mise.json +6 -0
  39. package/dist/examples/recipes/runtime/path.json +1 -0
  40. package/dist/examples/recipes/runtime/plugins.json +4 -0
  41. package/dist/examples/recipes/runtime/python-uv.json +10 -0
  42. package/dist/examples/recipes/semantic-judge.js +27 -0
  43. package/dist/examples/recipes/semantic-judge.js.map +1 -0
  44. package/dist/examples/templates/coding/adapter.js +14 -0
  45. package/dist/examples/templates/coding/adapter.js.map +1 -0
  46. package/dist/examples/templates/coding/case.json +15 -0
  47. package/dist/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
  48. package/dist/examples/templates/repository-skill/extension-data.js +61 -0
  49. package/dist/examples/templates/repository-skill/extension-data.js.map +1 -0
  50. package/dist/examples/templates/repository-skill/extension.js +29 -0
  51. package/dist/examples/templates/repository-skill/extension.js.map +1 -0
  52. package/dist/examples/templates/response/adapter.js +13 -0
  53. package/dist/examples/templates/response/adapter.js.map +1 -0
  54. package/dist/examples/templates/response/case.json +13 -0
  55. package/dist/src/advisory.js +86 -0
  56. package/dist/src/advisory.js.map +1 -0
  57. package/dist/src/candidate-artifacts.js +139 -0
  58. package/dist/src/candidate-artifacts.js.map +1 -0
  59. package/dist/src/candidate-codex-state.js +110 -0
  60. package/dist/src/candidate-codex-state.js.map +1 -0
  61. package/dist/src/case-validation.js +92 -0
  62. package/dist/src/case-validation.js.map +1 -0
  63. package/dist/src/cli/cancellation.js +21 -0
  64. package/dist/src/cli/cancellation.js.map +1 -0
  65. package/dist/src/cli/command.js +60 -0
  66. package/dist/src/cli/command.js.map +1 -0
  67. package/dist/src/cli/completion.js +14 -0
  68. package/dist/src/cli/completion.js.map +1 -0
  69. package/dist/src/cli/demo.js +45 -0
  70. package/dist/src/cli/demo.js.map +1 -0
  71. package/dist/src/cli/evaluation.js +40 -0
  72. package/dist/src/cli/evaluation.js.map +1 -0
  73. package/dist/src/cli/extension.js +54 -0
  74. package/dist/src/cli/extension.js.map +1 -0
  75. package/dist/src/cli/help.js +190 -0
  76. package/dist/src/cli/help.js.map +1 -0
  77. package/dist/src/cli/hosts.js +33 -0
  78. package/dist/src/cli/hosts.js.map +1 -0
  79. package/dist/src/cli/init-settings.js +29 -0
  80. package/dist/src/cli/init-settings.js.map +1 -0
  81. package/dist/src/cli/init.js +82 -0
  82. package/dist/src/cli/init.js.map +1 -0
  83. package/dist/src/cli/invocation.js +431 -0
  84. package/dist/src/cli/invocation.js.map +1 -0
  85. package/dist/src/cli/loading.js +110 -0
  86. package/dist/src/cli/loading.js.map +1 -0
  87. package/dist/src/cli/preparation.js +88 -0
  88. package/dist/src/cli/preparation.js.map +1 -0
  89. package/dist/src/cli/presentation.js +61 -0
  90. package/dist/src/cli/presentation.js.map +1 -0
  91. package/dist/src/cli/progress.js +5 -0
  92. package/dist/src/cli/progress.js.map +1 -0
  93. package/dist/src/cli/run-manifest.js +108 -0
  94. package/dist/src/cli/run-manifest.js.map +1 -0
  95. package/dist/src/cli/run-options.js +367 -0
  96. package/dist/src/cli/run-options.js.map +1 -0
  97. package/dist/src/cli/run-overrides.js +51 -0
  98. package/dist/src/cli/run-overrides.js.map +1 -0
  99. package/dist/src/cli/settings.js +127 -0
  100. package/dist/src/cli/settings.js.map +1 -0
  101. package/dist/src/cli/summary.js +28 -0
  102. package/dist/src/cli/summary.js.map +1 -0
  103. package/dist/src/cli.js +20 -0
  104. package/dist/src/cli.js.map +1 -0
  105. package/dist/src/contract-types.js +2 -0
  106. package/dist/src/contract-types.js.map +1 -0
  107. package/dist/src/engine.js +4 -0
  108. package/dist/src/engine.js.map +1 -0
  109. package/dist/src/evaluation/advisory.js +85 -0
  110. package/dist/src/evaluation/advisory.js.map +1 -0
  111. package/dist/src/evaluation/check-plan.js +292 -0
  112. package/dist/src/evaluation/check-plan.js.map +1 -0
  113. package/dist/src/evaluation/collection.js +61 -0
  114. package/dist/src/evaluation/collection.js.map +1 -0
  115. package/dist/src/evaluation/context.js +2 -0
  116. package/dist/src/evaluation/context.js.map +1 -0
  117. package/dist/src/evaluation/grading-host.js +28 -0
  118. package/dist/src/evaluation/grading-host.js.map +1 -0
  119. package/dist/src/evaluation/grading.js +154 -0
  120. package/dist/src/evaluation/grading.js.map +1 -0
  121. package/dist/src/evaluation/invocation-plan.js +312 -0
  122. package/dist/src/evaluation/invocation-plan.js.map +1 -0
  123. package/dist/src/evaluation/plan.js +376 -0
  124. package/dist/src/evaluation/plan.js.map +1 -0
  125. package/dist/src/evaluation/progress.js +14 -0
  126. package/dist/src/evaluation/progress.js.map +1 -0
  127. package/dist/src/evaluation/resources.js +159 -0
  128. package/dist/src/evaluation/resources.js.map +1 -0
  129. package/dist/src/evaluation/run.js +148 -0
  130. package/dist/src/evaluation/run.js.map +1 -0
  131. package/dist/src/evaluation/scheduler.js +27 -0
  132. package/dist/src/evaluation/scheduler.js.map +1 -0
  133. package/dist/src/evaluation/semantic.js +183 -0
  134. package/dist/src/evaluation/semantic.js.map +1 -0
  135. package/dist/src/evaluation/trial.js +593 -0
  136. package/dist/src/evaluation/trial.js.map +1 -0
  137. package/dist/src/evaluation/types.js +20 -0
  138. package/dist/src/evaluation/types.js.map +1 -0
  139. package/dist/src/evidence/host-results.js +67 -0
  140. package/dist/src/evidence/host-results.js.map +1 -0
  141. package/dist/src/evidence/retained-artifacts.js +17 -0
  142. package/dist/src/evidence/retained-artifacts.js.map +1 -0
  143. package/dist/src/evidence/trial-writer.js +131 -0
  144. package/dist/src/evidence/trial-writer.js.map +1 -0
  145. package/dist/src/evidence/usage.js +14 -0
  146. package/dist/src/evidence/usage.js.map +1 -0
  147. package/dist/src/executable.js +20 -0
  148. package/dist/src/executable.js.map +1 -0
  149. package/dist/src/extension-client.js +212 -0
  150. package/dist/src/extension-client.js.map +1 -0
  151. package/dist/src/extension-session.js +236 -0
  152. package/dist/src/extension-session.js.map +1 -0
  153. package/dist/src/fixtures/advisory.js +206 -0
  154. package/dist/src/fixtures/advisory.js.map +1 -0
  155. package/dist/src/fixtures/bin.js +41 -0
  156. package/dist/src/fixtures/bin.js.map +1 -0
  157. package/dist/src/fixtures/cleanup.js +43 -0
  158. package/dist/src/fixtures/cleanup.js.map +1 -0
  159. package/dist/src/fixtures/create.js +94 -0
  160. package/dist/src/fixtures/create.js.map +1 -0
  161. package/dist/src/fixtures/generated.js +181 -0
  162. package/dist/src/fixtures/generated.js.map +1 -0
  163. package/dist/src/fixtures/git-hooks.js +16 -0
  164. package/dist/src/fixtures/git-hooks.js.map +1 -0
  165. package/dist/src/fixtures/preparation.js +201 -0
  166. package/dist/src/fixtures/preparation.js.map +1 -0
  167. package/dist/src/fixtures/repository.js +255 -0
  168. package/dist/src/fixtures/repository.js.map +1 -0
  169. package/dist/src/fixtures/setup.js +175 -0
  170. package/dist/src/fixtures/setup.js.map +1 -0
  171. package/dist/src/fixtures/tools.js +57 -0
  172. package/dist/src/fixtures/tools.js.map +1 -0
  173. package/dist/src/fixtures/workspace-state.js +155 -0
  174. package/dist/src/fixtures/workspace-state.js.map +1 -0
  175. package/dist/src/generated/cli-result.cjs +2 -0
  176. package/dist/src/generated/extension.cjs +2 -0
  177. package/dist/src/generated/report.cjs +2 -0
  178. package/dist/src/generated/run-evidence.cjs +2 -0
  179. package/dist/src/generated/runtime.cjs +2 -0
  180. package/dist/src/git.js +72 -0
  181. package/dist/src/git.js.map +1 -0
  182. package/dist/src/graders/artifact.js +68 -0
  183. package/dist/src/graders/artifact.js.map +1 -0
  184. package/dist/src/graders/git-head.js +112 -0
  185. package/dist/src/graders/git-head.js.map +1 -0
  186. package/dist/src/graders/output.js +345 -0
  187. package/dist/src/graders/output.js.map +1 -0
  188. package/dist/src/graders/semantic.js +132 -0
  189. package/dist/src/graders/semantic.js.map +1 -0
  190. package/dist/src/graders/shell.js +321 -0
  191. package/dist/src/graders/shell.js.map +1 -0
  192. package/dist/src/host-diagnostic-redaction.js +52 -0
  193. package/dist/src/host-diagnostic-redaction.js.map +1 -0
  194. package/dist/src/host-diagnostics.js +248 -0
  195. package/dist/src/host-diagnostics.js.map +1 -0
  196. package/dist/src/hosts/claude-continuation.js +89 -0
  197. package/dist/src/hosts/claude-continuation.js.map +1 -0
  198. package/dist/src/hosts/claude-credential.js +121 -0
  199. package/dist/src/hosts/claude-credential.js.map +1 -0
  200. package/dist/src/hosts/claude-events.js +136 -0
  201. package/dist/src/hosts/claude-events.js.map +1 -0
  202. package/dist/src/hosts/claude-keychain.js +100 -0
  203. package/dist/src/hosts/claude-keychain.js.map +1 -0
  204. package/dist/src/hosts/claude-login-recovery.js +67 -0
  205. package/dist/src/hosts/claude-login-recovery.js.map +1 -0
  206. package/dist/src/hosts/claude-login-refresh.js +146 -0
  207. package/dist/src/hosts/claude-login-refresh.js.map +1 -0
  208. package/dist/src/hosts/claude-login-store.js +124 -0
  209. package/dist/src/hosts/claude-login-store.js.map +1 -0
  210. package/dist/src/hosts/claude-login.js +74 -0
  211. package/dist/src/hosts/claude-login.js.map +1 -0
  212. package/dist/src/hosts/claude-native-goal.js +138 -0
  213. package/dist/src/hosts/claude-native-goal.js.map +1 -0
  214. package/dist/src/hosts/claude-process.js +10 -0
  215. package/dist/src/hosts/claude-process.js.map +1 -0
  216. package/dist/src/hosts/claude-refresh-lock.js +76 -0
  217. package/dist/src/hosts/claude-refresh-lock.js.map +1 -0
  218. package/dist/src/hosts/claude-repository-invocation.js +229 -0
  219. package/dist/src/hosts/claude-repository-invocation.js.map +1 -0
  220. package/dist/src/hosts/claude-settings.js +158 -0
  221. package/dist/src/hosts/claude-settings.js.map +1 -0
  222. package/dist/src/hosts/claude-skill-activations.js +131 -0
  223. package/dist/src/hosts/claude-skill-activations.js.map +1 -0
  224. package/dist/src/hosts/claude-state.js +237 -0
  225. package/dist/src/hosts/claude-state.js.map +1 -0
  226. package/dist/src/hosts/claude-tool-calls.js +150 -0
  227. package/dist/src/hosts/claude-tool-calls.js.map +1 -0
  228. package/dist/src/hosts/claude.js +373 -0
  229. package/dist/src/hosts/claude.js.map +1 -0
  230. package/dist/src/hosts/codex-app-server.js +764 -0
  231. package/dist/src/hosts/codex-app-server.js.map +1 -0
  232. package/dist/src/hosts/codex-configuration.js +91 -0
  233. package/dist/src/hosts/codex-configuration.js.map +1 -0
  234. package/dist/src/hosts/codex-events.js +104 -0
  235. package/dist/src/hosts/codex-events.js.map +1 -0
  236. package/dist/src/hosts/codex-exec-controls.js +434 -0
  237. package/dist/src/hosts/codex-exec-controls.js.map +1 -0
  238. package/dist/src/hosts/codex-invocation.js +54 -0
  239. package/dist/src/hosts/codex-invocation.js.map +1 -0
  240. package/dist/src/hosts/codex-marketplace.js +185 -0
  241. package/dist/src/hosts/codex-marketplace.js.map +1 -0
  242. package/dist/src/hosts/codex-native-calls.js +516 -0
  243. package/dist/src/hosts/codex-native-calls.js.map +1 -0
  244. package/dist/src/hosts/codex-process.js +10 -0
  245. package/dist/src/hosts/codex-process.js.map +1 -0
  246. package/dist/src/hosts/codex-profile.js +206 -0
  247. package/dist/src/hosts/codex-profile.js.map +1 -0
  248. package/dist/src/hosts/codex-session-files.js +89 -0
  249. package/dist/src/hosts/codex-session-files.js.map +1 -0
  250. package/dist/src/hosts/codex-state.js +310 -0
  251. package/dist/src/hosts/codex-state.js.map +1 -0
  252. package/dist/src/hosts/codex.js +527 -0
  253. package/dist/src/hosts/codex.js.map +1 -0
  254. package/dist/src/hosts/isolation-common.js +43 -0
  255. package/dist/src/hosts/isolation-common.js.map +1 -0
  256. package/dist/src/hosts/isolation-roots.js +64 -0
  257. package/dist/src/hosts/isolation-roots.js.map +1 -0
  258. package/dist/src/hosts/isolation.js +12 -0
  259. package/dist/src/hosts/isolation.js.map +1 -0
  260. package/dist/src/hosts/linux-sandbox.js +127 -0
  261. package/dist/src/hosts/linux-sandbox.js.map +1 -0
  262. package/dist/src/hosts/mac-sandbox.js +137 -0
  263. package/dist/src/hosts/mac-sandbox.js.map +1 -0
  264. package/dist/src/hosts/native-controls.js +151 -0
  265. package/dist/src/hosts/native-controls.js.map +1 -0
  266. package/dist/src/hosts/native-request.js +33 -0
  267. package/dist/src/hosts/native-request.js.map +1 -0
  268. package/dist/src/hosts/process-lifecycle.js +167 -0
  269. package/dist/src/hosts/process-lifecycle.js.map +1 -0
  270. package/dist/src/hosts/protected-worktrees.js +81 -0
  271. package/dist/src/hosts/protected-worktrees.js.map +1 -0
  272. package/dist/src/hosts/skill-hook-catalog.js +100 -0
  273. package/dist/src/hosts/skill-hook-catalog.js.map +1 -0
  274. package/dist/src/hosts/skill-hook-handler.js +228 -0
  275. package/dist/src/hosts/skill-hook-handler.js.map +1 -0
  276. package/dist/src/hosts/skill-hooks.js +423 -0
  277. package/dist/src/hosts/skill-hooks.js.map +1 -0
  278. package/dist/src/hosts/workspace-fingerprint.js +72 -0
  279. package/dist/src/hosts/workspace-fingerprint.js.map +1 -0
  280. package/dist/src/identity.js +167 -0
  281. package/dist/src/identity.js.map +1 -0
  282. package/dist/src/instrumentation.js +83 -0
  283. package/dist/src/instrumentation.js.map +1 -0
  284. package/dist/src/native-transcript-state.js +85 -0
  285. package/dist/src/native-transcript-state.js.map +1 -0
  286. package/dist/src/native-transcript-view.js +65 -0
  287. package/dist/src/native-transcript-view.js.map +1 -0
  288. package/dist/src/native-transcripts.js +208 -0
  289. package/dist/src/native-transcripts.js.map +1 -0
  290. package/dist/src/paths.js +13 -0
  291. package/dist/src/paths.js.map +1 -0
  292. package/dist/src/process-lifecycle.js +101 -0
  293. package/dist/src/process-lifecycle.js.map +1 -0
  294. package/dist/src/provenance.js +263 -0
  295. package/dist/src/provenance.js.map +1 -0
  296. package/dist/src/prune.js +228 -0
  297. package/dist/src/prune.js.map +1 -0
  298. package/dist/src/report.js +276 -0
  299. package/dist/src/report.js.map +1 -0
  300. package/dist/src/resolved-case.js +29 -0
  301. package/dist/src/resolved-case.js.map +1 -0
  302. package/dist/src/results-lock.js +40 -0
  303. package/dist/src/results-lock.js.map +1 -0
  304. package/dist/src/results.js +127 -0
  305. package/dist/src/results.js.map +1 -0
  306. package/dist/src/run-owner.js +283 -0
  307. package/dist/src/run-owner.js.map +1 -0
  308. package/dist/src/runner-paths.js +11 -0
  309. package/dist/src/runner-paths.js.map +1 -0
  310. package/dist/src/runtime/config.js +323 -0
  311. package/dist/src/runtime/config.js.map +1 -0
  312. package/dist/src/runtime/discovery-apple.js +65 -0
  313. package/dist/src/runtime/discovery-apple.js.map +1 -0
  314. package/dist/src/runtime/discovery-providers.js +37 -0
  315. package/dist/src/runtime/discovery-providers.js.map +1 -0
  316. package/dist/src/runtime/discovery.js +40 -0
  317. package/dist/src/runtime/discovery.js.map +1 -0
  318. package/dist/src/runtime/hook-processes.js +81 -0
  319. package/dist/src/runtime/hook-processes.js.map +1 -0
  320. package/dist/src/runtime/hooks.js +304 -0
  321. package/dist/src/runtime/hooks.js.map +1 -0
  322. package/dist/src/runtime/paths.js +244 -0
  323. package/dist/src/runtime/paths.js.map +1 -0
  324. package/dist/src/runtime/query.js +76 -0
  325. package/dist/src/runtime/query.js.map +1 -0
  326. package/dist/src/runtime/seeds.js +98 -0
  327. package/dist/src/runtime/seeds.js.map +1 -0
  328. package/dist/src/runtime/shared-cache.js +81 -0
  329. package/dist/src/runtime/shared-cache.js.map +1 -0
  330. package/dist/src/runtime/state.js +106 -0
  331. package/dist/src/runtime/state.js.map +1 -0
  332. package/dist/src/runtime-process.js +148 -0
  333. package/dist/src/runtime-process.js.map +1 -0
  334. package/dist/src/schema-types.js +2 -0
  335. package/dist/src/schema-types.js.map +1 -0
  336. package/dist/src/schema.js +16 -0
  337. package/dist/src/schema.js.map +1 -0
  338. package/dist/src/shell.js +5 -0
  339. package/dist/src/shell.js.map +1 -0
  340. package/dist/src/sqlite-lock.js +18 -0
  341. package/dist/src/sqlite-lock.js.map +1 -0
  342. package/dist/src/storage.js +21 -0
  343. package/dist/src/storage.js.map +1 -0
  344. package/dist/src/transcript-retention.js +109 -0
  345. package/dist/src/transcript-retention.js.map +1 -0
  346. package/dist/src/value-guards.js +26 -0
  347. package/dist/src/value-guards.js.map +1 -0
  348. package/docs/architecture.md +5 -2
  349. package/docs/creating-cases.md +2 -3
  350. package/docs/development-cli.md +12 -7
  351. package/docs/documentation-quality.md +4 -3
  352. package/docs/evaluation-workflow.md +8 -8
  353. package/docs/getting-started.md +7 -6
  354. package/docs/guide-evaluation.md +1 -1
  355. package/docs/identity-v1.md +4 -1
  356. package/docs/installing.md +31 -13
  357. package/docs/licensing.md +2 -2
  358. package/docs/native-hosts.md +1 -1
  359. package/docs/recipes.md +41 -40
  360. package/docs/releases.md +20 -4
  361. package/docs/run-settings-v1.md +3 -3
  362. package/docs/specs/repository-guide.md +1 -1
  363. package/docs/troubleshooting.md +1 -1
  364. package/docs/typescript-quality.md +18 -1
  365. package/examples/recipes/executable.ts +19 -0
  366. package/examples/recipes/extension-artifacts.ts +1 -1
  367. package/examples/recipes/extension.ts +2 -1
  368. package/examples/recipes/modules.ts +9 -0
  369. package/examples/recipes/run-inputs.ts +14 -19
  370. package/examples/recipes/run-options.ts +9 -8
  371. package/examples/recipes/run.ts +21 -7
  372. package/examples/templates/repository-skill/extension-data.ts +1 -1
  373. package/examples/templates/repository-skill/extension.ts +2 -1
  374. package/package.json +14 -6
  375. package/src/cli/demo.ts +3 -2
  376. package/src/cli/help.ts +4 -3
  377. package/src/cli/init-settings.ts +5 -4
  378. package/src/cli/init.ts +9 -8
  379. package/src/cli/invocation.ts +2 -1
  380. package/src/cli/preparation.ts +2 -2
  381. package/src/cli.ts +1 -1
  382. package/src/executable.ts +19 -0
  383. package/src/extension-client.ts +6 -12
  384. package/src/fixtures/setup.ts +3 -2
  385. package/src/git.ts +2 -1
  386. package/src/graders/git-head.ts +3 -2
  387. package/src/graders/shell.ts +4 -3
  388. package/src/hosts/claude-keychain.ts +3 -2
  389. package/src/hosts/claude-login-refresh.ts +3 -2
  390. package/src/hosts/claude-refresh-lock.ts +2 -1
  391. package/src/hosts/claude-settings.ts +3 -1
  392. package/src/hosts/claude.ts +1 -1
  393. package/src/hosts/isolation-roots.ts +3 -2
  394. package/src/hosts/process-lifecycle.ts +4 -6
  395. package/src/hosts/protected-worktrees.ts +2 -1
  396. package/src/hosts/skill-hook-handler.ts +1 -1
  397. package/src/hosts/skill-hooks.ts +10 -2
  398. package/src/provenance.ts +7 -6
  399. package/src/results-lock.ts +4 -4
  400. package/src/run-owner.ts +15 -9
  401. package/src/runner-paths.ts +21 -0
  402. package/src/runtime/hook-processes.ts +2 -1
  403. package/src/runtime/hooks.ts +9 -7
  404. package/src/runtime-process.ts +194 -0
  405. package/src/sqlite-lock.ts +25 -0
@@ -0,0 +1,376 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { EvaluationConfigurationError, } from "./types.js";
3
+ import { prepareFixtureSetup } from "../fixtures/setup.js";
4
+ import { canonicalJson, createEvaluationIdentity, hashJson } from "../identity.js";
5
+ import { prepareInstrumentation, } from "../instrumentation.js";
6
+ import { fixtureParts, prepareArtifacts, } from "../fixtures/preparation.js";
7
+ import { projectProvenance, runnerProvenance } from "../provenance.js";
8
+ import { resolveRepositorySource } from "../fixtures/repository.js";
9
+ import { prepareEvaluationChecks, } from "./check-plan.js";
10
+ import { prepareInvocationPlan, } from "./invocation-plan.js";
11
+ async function prepareEvaluationEnvironment(options, source) {
12
+ const projectRoot = await realpath(options.projectRoot).catch(() => {
13
+ throw new EvaluationConfigurationError("project root is unreadable");
14
+ });
15
+ const resolvedSource = await resolveFixtureSource(options, source);
16
+ const [runner, project] = await Promise.all([
17
+ runnerProvenance(options.runnerBuildDigest, options.runnerCheckoutRoot).catch((error) => {
18
+ throw new EvaluationConfigurationError(error instanceof Error ? error.message : "invalid runner provenance");
19
+ }),
20
+ projectProvenance(projectRoot, evaluationStorageRoots(options)),
21
+ ]);
22
+ const extensionPreparation = options.extension
23
+ ? await options.extension.session.prepare(options.extension.resolvedCase, {
24
+ id: options.host.id,
25
+ capabilities: [
26
+ ...(options.host.instrumentation ?? []).map((item) => item.id),
27
+ ...(options.host.hostCapabilities ?? []),
28
+ ],
29
+ }, options.condition)
30
+ : null;
31
+ return {
32
+ projectRoot,
33
+ source: resolvedSource,
34
+ runner,
35
+ project,
36
+ extensionPreparation,
37
+ };
38
+ }
39
+ async function resolveFixtureSource(options, source) {
40
+ if (source.kind !== "repository")
41
+ return source;
42
+ const repository = await resolveRepositorySource(source.fixture.sourceRef, options.preparationSources).catch((error) => {
43
+ throw new EvaluationConfigurationError(error instanceof Error ? error.message : "invalid repository source");
44
+ });
45
+ return { ...source, repository };
46
+ }
47
+ function evaluationStorageRoots(options) {
48
+ return [options.resultsRoot, options.runStateRoot ?? options.resultsRoot];
49
+ }
50
+ function preparedFixtureSetup(preparation) {
51
+ try {
52
+ return prepareFixtureSetup(preparation?.fixtureSetup);
53
+ }
54
+ catch (cause) {
55
+ throw new EvaluationConfigurationError(cause instanceof Error ? cause.message : "invalid fixture setup", { cause });
56
+ }
57
+ }
58
+ function validateSetupCapability(options, setup) {
59
+ if (setup &&
60
+ !options.extension?.session.identity.capabilities.includes("sevro.fixture.setup"))
61
+ throw new EvaluationConfigurationError("fixture setup capability was not negotiated");
62
+ }
63
+ function validateSetupFixture(setup, source) {
64
+ if (setup && source.kind === "inline")
65
+ throw new EvaluationConfigurationError("fixture setup requires a Git fixture");
66
+ }
67
+ function negotiatedInstrumentationCapabilities(options) {
68
+ return options.extension?.session.identity.capabilities ?? [];
69
+ }
70
+ function configurationFailureMessage(cause, fallback) {
71
+ return cause instanceof Error ? cause.message : fallback;
72
+ }
73
+ function requestedInstrumentationPlan(options, preparation) {
74
+ try {
75
+ return prepareInstrumentation(preparation?.requestedInstrumentation ?? [], options.host.instrumentation ?? [], negotiatedInstrumentationCapabilities(options), options.condition);
76
+ }
77
+ catch (cause) {
78
+ throw new EvaluationConfigurationError(configurationFailureMessage(cause, "invalid instrumentation"), { cause });
79
+ }
80
+ }
81
+ function fixturePreparationPaths(source) {
82
+ switch (source.kind) {
83
+ case "inline":
84
+ return Object.keys(source.files ?? {});
85
+ case "repository":
86
+ return Object.keys(source.fixture.files ?? {});
87
+ case "generated":
88
+ return [
89
+ ...new Set([
90
+ ...source.fixture.commits.flatMap((commit) => Object.keys(commit.files)),
91
+ ...Object.keys(source.fixture.files ?? {}),
92
+ ]),
93
+ ];
94
+ }
95
+ }
96
+ async function preparedEvaluationArtifacts(options, context) {
97
+ try {
98
+ return await prepareArtifacts(context.extensionPreparation?.artifacts ?? [], fixturePreparationPaths(context.source), options.preparationSources);
99
+ }
100
+ catch (cause) {
101
+ throw new EvaluationConfigurationError(cause instanceof Error ? cause.message : "invalid preparation artifacts", { cause });
102
+ }
103
+ }
104
+ function validateArtifactMetadata(artifacts, source) {
105
+ if (source.kind !== "inline" &&
106
+ artifacts.some((artifact) => fixtureParts(artifact.relativePath).some((part) => part.toLowerCase() === ".git")))
107
+ throw new EvaluationConfigurationError("preparation artifacts cannot modify repository metadata");
108
+ }
109
+ function validateArtifactExclusions(artifacts, source) {
110
+ if (source.kind === "inline" &&
111
+ artifacts.some((artifact) => artifact.gitExclude))
112
+ throw new EvaluationConfigurationError("Git-excluded preparation artifacts require a Git fixture");
113
+ }
114
+ function validateSemanticArtifactId(artifacts, declarations) {
115
+ if (declarations.length &&
116
+ artifacts.some((item) => item.id === "sevro.semantic.verdicts"))
117
+ throw new EvaluationConfigurationError("preparation artifact uses a reserved semantic evidence ID");
118
+ }
119
+ async function prepareEvaluationArtifacts(options, state, checks) {
120
+ const fixtureSetup = preparedFixtureSetup(state.extensionPreparation);
121
+ validateSetupCapability(options, fixtureSetup);
122
+ validateSetupFixture(fixtureSetup, state.source);
123
+ const requestedInstrumentation = requestedInstrumentationPlan(options, state.extensionPreparation);
124
+ const inlineArtifacts = await preparedEvaluationArtifacts(options, state);
125
+ validateArtifactMetadata(inlineArtifacts, state.source);
126
+ validateArtifactExclusions(inlineArtifacts, state.source);
127
+ validateSemanticArtifactId(inlineArtifacts, checks.checks.semanticDeclarations);
128
+ return { fixtureSetup, requestedInstrumentation, inlineArtifacts };
129
+ }
130
+ function extensionPreparationData(options, preparation) {
131
+ return options.extension
132
+ ? {
133
+ ...options.extension.resolvedCase.extensionData,
134
+ ...preparation?.extensionData,
135
+ }
136
+ : {};
137
+ }
138
+ function evaluationRoute(host, role) {
139
+ return { role, host: host.id, model: host.model, effort: host.effort };
140
+ }
141
+ function semanticEvaluationRoute(host) {
142
+ if (!host)
143
+ throw new EvaluationConfigurationError("semantic checks require an explicit semantic host");
144
+ return evaluationRoute(host, "semantic");
145
+ }
146
+ function evaluationRoutes(options, semantic, candidate) {
147
+ return [
148
+ candidate,
149
+ ...(semantic ? [semanticEvaluationRoute(options.semanticHost)] : []),
150
+ ...(options.advisoryHost
151
+ ? [evaluationRoute(options.advisoryHost, "advisory")]
152
+ : []),
153
+ ];
154
+ }
155
+ function redactedHostConfiguration(options, semantic) {
156
+ const selections = [
157
+ { role: "candidate", host: options.host },
158
+ { role: "semantic", host: semantic ? options.semanticHost : undefined },
159
+ { role: "advisory", host: options.advisoryHost },
160
+ ];
161
+ const configuration = Object.fromEntries(selections.flatMap(({ role, host }) => {
162
+ if (host?.configuration === undefined)
163
+ return [];
164
+ return [[role, host.configuration]];
165
+ }));
166
+ return Object.keys(configuration).length
167
+ ? { hostConfiguration: configuration }
168
+ : {};
169
+ }
170
+ function redactedExtensionConfiguration(options) {
171
+ return {
172
+ extensionConfigurationDigest: options.extension?.session.identity.configurationDigest ?? null,
173
+ ...(options.extension
174
+ ? {
175
+ extensionConfiguration: options.extension.session.redactedConfiguration,
176
+ }
177
+ : {}),
178
+ };
179
+ }
180
+ function redactedPreparationConfiguration(state) {
181
+ return {
182
+ ...(state.fixture.fixtureSetup
183
+ ? { fixtureSetupDigest: hashJson(state.fixture.fixtureSetup) }
184
+ : {}),
185
+ ...(state.invocation.codexMarketplace
186
+ ? { codexMarketplace: state.invocation.codexMarketplace }
187
+ : {}),
188
+ ...(state.invocation.claudePluginDirs
189
+ ? { claudePluginDirs: state.invocation.claudePluginDirs }
190
+ : {}),
191
+ };
192
+ }
193
+ function redactedAdvisoryConfiguration(options) {
194
+ return options.advisoryHost
195
+ ? {
196
+ advisoryExcludedPaths: [
197
+ ...(options.advisoryExcludedPaths ?? []),
198
+ ].sort(),
199
+ }
200
+ : {};
201
+ }
202
+ function redactedEvaluationConfiguration(options, state) {
203
+ return {
204
+ condition: options.condition,
205
+ executionMode: options.dry ? "dry" : "executed",
206
+ ...(options.runtimePolicy ? { runtimePolicy: options.runtimePolicy } : {}),
207
+ trialCount: options.trialCount,
208
+ jobs: state.jobs,
209
+ passThreshold: options.passThreshold,
210
+ ...(options.assessmentSettings
211
+ ? { runSettings: options.assessmentSettings }
212
+ : {}),
213
+ ...redactedHostConfiguration(options, state.checks.preparedSemantic.length > 0),
214
+ ...redactedExtensionConfiguration(options),
215
+ ...redactedPreparationConfiguration(state),
216
+ ...state.invocation.configuration,
217
+ ...redactedAdvisoryConfiguration(options),
218
+ };
219
+ }
220
+ function activeEvaluationGraders(options, state) {
221
+ const graders = [
222
+ ...new Set([
223
+ ...state.builtinDeclarations,
224
+ ...state.shellDeclarations,
225
+ ...state.gitHeadDeclarations,
226
+ ...state.semanticDeclarations,
227
+ ].map((check) => check.grader)),
228
+ ]
229
+ .sort()
230
+ .map((id) => ({ id, source: "builtin", version: "1.0.0" }));
231
+ if (options.extension) {
232
+ for (const id of [
233
+ ...new Set(state.extensionDeclarations.map((check) => check.grader)),
234
+ ].sort())
235
+ graders.push({
236
+ id,
237
+ source: "extension",
238
+ version: options.extension.session.identity.version,
239
+ });
240
+ }
241
+ return graders;
242
+ }
243
+ function extensionIdentityDimensions(options) {
244
+ return {
245
+ extensionDigest: options.extension?.session.identity.sourceDigest ?? null,
246
+ extensionProtocol: options.extension?.session.identity.protocol ?? null,
247
+ };
248
+ }
249
+ function caseIdentityData(caseData, extensionData) {
250
+ return {
251
+ id: caseData.id,
252
+ prompt: caseData.prompt,
253
+ ...(caseData.followUpPrompt !== undefined
254
+ ? { followUpPrompt: caseData.followUpPrompt }
255
+ : {}),
256
+ extensionData,
257
+ };
258
+ }
259
+ function baseFixtureIdentity(source) {
260
+ switch (source.kind) {
261
+ case "generated":
262
+ return source.fixture;
263
+ case "repository":
264
+ return { ...source.fixture, revision: source.repository.revision };
265
+ case "inline":
266
+ return { files: source.files };
267
+ }
268
+ }
269
+ function artifactIdentityData(artifacts) {
270
+ return artifacts.map(({ id, relativePath, sha256, gitExclude, executable }) => ({
271
+ id,
272
+ relativePath,
273
+ sha256,
274
+ ...(gitExclude ? { gitExclude: true } : {}),
275
+ ...(executable ? { executable: true } : {}),
276
+ }));
277
+ }
278
+ function fixtureIdentityData(state) {
279
+ return {
280
+ ...baseFixtureIdentity(state.fixture.source),
281
+ artifacts: artifactIdentityData(state.fixture.inlineArtifacts),
282
+ ...(state.fixture.fixtureSetup
283
+ ? { fixtureSetup: state.fixture.fixtureSetup }
284
+ : {}),
285
+ ...(state.invocation.codexMarketplace
286
+ ? { codexMarketplace: state.invocation.codexMarketplace }
287
+ : {}),
288
+ ...(state.invocation.claudePluginDirs
289
+ ? { claudePluginDirs: state.invocation.claudePluginDirs }
290
+ : {}),
291
+ ...state.invocation.configuration,
292
+ };
293
+ }
294
+ function evaluatorIdentityData(options, extensionData) {
295
+ return {
296
+ policy: "sevro.builtin-output.v1",
297
+ extension: options.extension?.session.identity ?? null,
298
+ extensionData,
299
+ };
300
+ }
301
+ function evaluationComparisonIdentity(options, prepared, context) {
302
+ try {
303
+ return createEvaluationIdentity({
304
+ runnerBuildDigest: options.runnerBuildDigest,
305
+ projectDigest: options.projectDigest,
306
+ configurationDigest: hashJson(context.redactedConfig),
307
+ ...extensionIdentityDimensions(options),
308
+ caseDigest: hashJson(caseIdentityData(options.case, context.extensionData)),
309
+ fixtureDigest: hashJson(fixtureIdentityData(prepared)),
310
+ checksDigest: hashJson(options.case.checks),
311
+ requiredEvidenceDigest: hashJson(options.case.requiredEvidence),
312
+ evaluatorDigest: hashJson(evaluatorIdentityData(options, context.extensionData)),
313
+ graderDigest: hashJson(context.activeGraders),
314
+ instrumentationDigest: hashJson({
315
+ requested: prepared.requestedInstrumentation,
316
+ applied: prepared.requestedInstrumentation,
317
+ }),
318
+ routeDigest: hashJson(context.routes.length > 1 ? context.routes : context.route),
319
+ condition: options.condition,
320
+ trialCount: options.trialCount,
321
+ passThreshold: options.passThreshold,
322
+ });
323
+ }
324
+ catch (cause) {
325
+ throw new EvaluationConfigurationError("invalid evaluation identity inputs", { cause });
326
+ }
327
+ }
328
+ function prepareEvaluationIdentity(options, state, preparation) {
329
+ const extensionData = extensionPreparationData(options, preparation);
330
+ const route = evaluationRoute(options.host, "candidate");
331
+ const routes = evaluationRoutes(options, state.checks.preparedSemantic.length > 0, route);
332
+ const redactedConfig = snapshotEvaluationConfiguration(options, state);
333
+ const activeGraders = activeEvaluationGraders(options, state.checks);
334
+ const context = {
335
+ extensionData,
336
+ route,
337
+ routes,
338
+ redactedConfig,
339
+ activeGraders,
340
+ };
341
+ const evaluationIdentity = evaluationComparisonIdentity(options, state, context);
342
+ return { ...state, ...context, evaluationIdentity };
343
+ }
344
+ function snapshotEvaluationConfiguration(options, state) {
345
+ try {
346
+ return JSON.parse(canonicalJson(redactedEvaluationConfiguration(options, state)));
347
+ }
348
+ catch (cause) {
349
+ throw new EvaluationConfigurationError("invalid evaluation identity inputs", { cause });
350
+ }
351
+ }
352
+ export async function prepareEvaluation(options) {
353
+ const checks = prepareEvaluationChecks(options);
354
+ const environment = await prepareEvaluationEnvironment(options, checks.source);
355
+ const artifacts = await prepareEvaluationArtifacts(options, environment, checks);
356
+ const invocation = prepareInvocationPlan(options, {
357
+ extensionPreparation: environment.extensionPreparation,
358
+ inlineArtifacts: artifacts.inlineArtifacts,
359
+ });
360
+ const prepared = {
361
+ fixture: {
362
+ projectRoot: environment.projectRoot,
363
+ source: environment.source,
364
+ fixtureSetup: artifacts.fixtureSetup,
365
+ inlineArtifacts: artifacts.inlineArtifacts,
366
+ },
367
+ checks: checks.checks,
368
+ invocation,
369
+ jobs: checks.jobs,
370
+ requestedInstrumentation: artifacts.requestedInstrumentation,
371
+ runner: environment.runner,
372
+ project: environment.project,
373
+ };
374
+ return prepareEvaluationIdentity(options, prepared, environment.extensionPreparation);
375
+ }
376
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["plan.ts"],"names":[],"mappings":"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","sourcesContent":["import { realpath } from \"node:fs/promises\";\nimport {\n EvaluationConfigurationError,\n type EvaluationOptions,\n type HostAdapter,\n type ResolvedCase,\n} from \"./types\";\nimport { prepareFixtureSetup, type FixtureSetup } from \"../fixtures/setup\";\nimport type { FixtureSource } from \"../fixtures/create\";\nimport { type SemanticCheckDeclaration } from \"../graders/semantic\";\nimport { canonicalJson, createEvaluationIdentity, hashJson } from \"../identity\";\nimport {\n prepareInstrumentation,\n type InstrumentationRequest,\n} from \"../instrumentation\";\nimport {\n fixtureParts,\n prepareArtifacts,\n type InlineArtifact,\n} from \"../fixtures/preparation\";\nimport { projectProvenance, runnerProvenance } from \"../provenance\";\nimport { resolveRepositorySource } from \"../fixtures/repository\";\nimport {\n prepareEvaluationChecks,\n type EvaluationCheckPlan,\n type PreparedChecks,\n} from \"./check-plan\";\nimport {\n prepareInvocationPlan,\n type PreparedInvocation,\n} from \"./invocation-plan\";\nimport type { PreparationResult } from \"../extension-session\";\n\nexport type { PreparedChecks } from \"./check-plan\";\nexport type { PreparedInvocation } from \"./invocation-plan\";\n\ninterface EnvironmentPlan {\n readonly projectRoot: string;\n readonly source: FixtureSource;\n readonly runner: Awaited<ReturnType<typeof runnerProvenance>>;\n readonly project: Awaited<ReturnType<typeof projectProvenance>>;\n readonly extensionPreparation: PreparationResult | null;\n}\n\ninterface ArtifactPlan {\n readonly fixtureSetup: FixtureSetup | null;\n readonly requestedInstrumentation: InstrumentationRequest[];\n readonly inlineArtifacts: InlineArtifact[];\n}\n\nasync function prepareEvaluationEnvironment(\n options: EvaluationOptions,\n source: FixtureSource<null>,\n): Promise<EnvironmentPlan> {\n const projectRoot = await realpath(options.projectRoot).catch(() => {\n throw new EvaluationConfigurationError(\"project root is unreadable\");\n });\n const resolvedSource = await resolveFixtureSource(options, source);\n const [runner, project] = await Promise.all([\n runnerProvenance(\n options.runnerBuildDigest,\n options.runnerCheckoutRoot,\n ).catch((error: unknown) => {\n throw new EvaluationConfigurationError(\n error instanceof Error ? error.message : \"invalid runner provenance\",\n );\n }),\n projectProvenance(projectRoot, evaluationStorageRoots(options)),\n ]);\n const extensionPreparation = options.extension\n ? await options.extension.session.prepare(\n options.extension.resolvedCase,\n {\n id: options.host.id,\n capabilities: [\n ...(options.host.instrumentation ?? []).map((item) => item.id),\n ...(options.host.hostCapabilities ?? []),\n ],\n },\n options.condition,\n )\n : null;\n return {\n projectRoot,\n source: resolvedSource,\n runner,\n project,\n extensionPreparation,\n };\n}\n\nasync function resolveFixtureSource(\n options: EvaluationOptions,\n source: FixtureSource<null>,\n): Promise<FixtureSource> {\n if (source.kind !== \"repository\") return source;\n const repository = await resolveRepositorySource(\n source.fixture.sourceRef,\n options.preparationSources,\n ).catch((error: unknown) => {\n throw new EvaluationConfigurationError(\n error instanceof Error ? error.message : \"invalid repository source\",\n );\n });\n return { ...source, repository };\n}\n\nfunction evaluationStorageRoots(options: EvaluationOptions): string[] {\n return [options.resultsRoot, options.runStateRoot ?? options.resultsRoot];\n}\n\nfunction preparedFixtureSetup(\n preparation: EnvironmentPlan[\"extensionPreparation\"],\n): FixtureSetup | null {\n try {\n return prepareFixtureSetup(preparation?.fixtureSetup);\n } catch (cause) {\n throw new EvaluationConfigurationError(\n cause instanceof Error ? cause.message : \"invalid fixture setup\",\n { cause },\n );\n }\n}\n\nfunction validateSetupCapability(\n options: EvaluationOptions,\n setup: FixtureSetup | null,\n): void {\n if (\n setup &&\n !options.extension?.session.identity.capabilities.includes(\n \"sevro.fixture.setup\",\n )\n )\n throw new EvaluationConfigurationError(\n \"fixture setup capability was not negotiated\",\n );\n}\n\nfunction validateSetupFixture(\n setup: FixtureSetup | null,\n source: FixtureSource,\n): void {\n if (setup && source.kind === \"inline\")\n throw new EvaluationConfigurationError(\n \"fixture setup requires a Git fixture\",\n );\n}\n\nfunction negotiatedInstrumentationCapabilities(\n options: EvaluationOptions,\n): string[] {\n return options.extension?.session.identity.capabilities ?? [];\n}\n\nfunction configurationFailureMessage(cause: unknown, fallback: string): string {\n return cause instanceof Error ? cause.message : fallback;\n}\n\nfunction requestedInstrumentationPlan(\n options: EvaluationOptions,\n preparation: EnvironmentPlan[\"extensionPreparation\"],\n): InstrumentationRequest[] {\n try {\n return prepareInstrumentation(\n preparation?.requestedInstrumentation ?? [],\n options.host.instrumentation ?? [],\n negotiatedInstrumentationCapabilities(options),\n options.condition,\n );\n } catch (cause) {\n throw new EvaluationConfigurationError(\n configurationFailureMessage(cause, \"invalid instrumentation\"),\n { cause },\n );\n }\n}\n\nfunction fixturePreparationPaths(source: FixtureSource): string[] {\n switch (source.kind) {\n case \"inline\":\n return Object.keys(source.files ?? {});\n case \"repository\":\n return Object.keys(source.fixture.files ?? {});\n case \"generated\":\n return [\n ...new Set([\n ...source.fixture.commits.flatMap((commit) =>\n Object.keys(commit.files),\n ),\n ...Object.keys(source.fixture.files ?? {}),\n ]),\n ];\n }\n}\n\nasync function preparedEvaluationArtifacts(\n options: EvaluationOptions,\n context: EnvironmentPlan,\n): Promise<InlineArtifact[]> {\n try {\n return await prepareArtifacts(\n context.extensionPreparation?.artifacts ?? [],\n fixturePreparationPaths(context.source),\n options.preparationSources,\n );\n } catch (cause) {\n throw new EvaluationConfigurationError(\n cause instanceof Error ? cause.message : \"invalid preparation artifacts\",\n { cause },\n );\n }\n}\n\nfunction validateArtifactMetadata(\n artifacts: InlineArtifact[],\n source: FixtureSource,\n): void {\n if (\n source.kind !== \"inline\" &&\n artifacts.some((artifact) =>\n fixtureParts(artifact.relativePath).some(\n (part) => part.toLowerCase() === \".git\",\n ),\n )\n )\n throw new EvaluationConfigurationError(\n \"preparation artifacts cannot modify repository metadata\",\n );\n}\n\nfunction validateArtifactExclusions(\n artifacts: InlineArtifact[],\n source: FixtureSource,\n): void {\n if (\n source.kind === \"inline\" &&\n artifacts.some((artifact) => artifact.gitExclude)\n )\n throw new EvaluationConfigurationError(\n \"Git-excluded preparation artifacts require a Git fixture\",\n );\n}\n\nfunction validateSemanticArtifactId(\n artifacts: InlineArtifact[],\n declarations: SemanticCheckDeclaration[],\n): void {\n if (\n declarations.length &&\n artifacts.some((item) => item.id === \"sevro.semantic.verdicts\")\n )\n throw new EvaluationConfigurationError(\n \"preparation artifact uses a reserved semantic evidence ID\",\n );\n}\n\nasync function prepareEvaluationArtifacts(\n options: EvaluationOptions,\n state: EnvironmentPlan,\n checks: EvaluationCheckPlan,\n): Promise<ArtifactPlan> {\n const fixtureSetup = preparedFixtureSetup(state.extensionPreparation);\n validateSetupCapability(options, fixtureSetup);\n validateSetupFixture(fixtureSetup, state.source);\n const requestedInstrumentation = requestedInstrumentationPlan(\n options,\n state.extensionPreparation,\n );\n const inlineArtifacts = await preparedEvaluationArtifacts(options, state);\n validateArtifactMetadata(inlineArtifacts, state.source);\n validateArtifactExclusions(inlineArtifacts, state.source);\n validateSemanticArtifactId(\n inlineArtifacts,\n checks.checks.semanticDeclarations,\n );\n return { fixtureSetup, requestedInstrumentation, inlineArtifacts };\n}\n\ntype EvaluationRouteRole = \"candidate\" | \"semantic\" | \"advisory\";\ninterface ActiveGrader {\n id: string;\n source: \"builtin\" | \"extension\";\n version: string;\n}\n\nexport interface PreparedFixture {\n readonly projectRoot: string;\n readonly source: FixtureSource;\n readonly fixtureSetup: ArtifactPlan[\"fixtureSetup\"];\n readonly inlineArtifacts: InlineArtifact[];\n}\n\ninterface PreparedEvaluationInputs {\n readonly fixture: PreparedFixture;\n readonly checks: PreparedChecks;\n readonly invocation: PreparedInvocation;\n readonly jobs: number;\n readonly requestedInstrumentation: InstrumentationRequest[];\n readonly runner: EnvironmentPlan[\"runner\"];\n readonly project: EnvironmentPlan[\"project\"];\n}\n\nexport interface PreparedEvaluation extends PreparedEvaluationInputs {\n readonly extensionData: Record<string, unknown>;\n readonly route: ReturnType<typeof evaluationRoute>;\n readonly routes: ReturnType<typeof evaluationRoutes>;\n readonly redactedConfig: ReturnType<typeof redactedEvaluationConfiguration>;\n readonly activeGraders: ActiveGrader[];\n readonly evaluationIdentity: ReturnType<typeof createEvaluationIdentity>;\n}\n\nfunction extensionPreparationData(\n options: EvaluationOptions,\n preparation: EnvironmentPlan[\"extensionPreparation\"],\n): Record<string, unknown> {\n return options.extension\n ? {\n ...options.extension.resolvedCase.extensionData,\n ...preparation?.extensionData,\n }\n : {};\n}\n\nfunction evaluationRoute(host: HostAdapter, role: EvaluationRouteRole) {\n return { role, host: host.id, model: host.model, effort: host.effort };\n}\n\nfunction semanticEvaluationRoute(host: HostAdapter | undefined) {\n if (!host)\n throw new EvaluationConfigurationError(\n \"semantic checks require an explicit semantic host\",\n );\n return evaluationRoute(host, \"semantic\");\n}\n\nfunction evaluationRoutes(\n options: EvaluationOptions,\n semantic: boolean,\n candidate: ReturnType<typeof evaluationRoute>,\n) {\n return [\n candidate,\n ...(semantic ? [semanticEvaluationRoute(options.semanticHost)] : []),\n ...(options.advisoryHost\n ? [evaluationRoute(options.advisoryHost, \"advisory\")]\n : []),\n ];\n}\n\nfunction redactedHostConfiguration(\n options: EvaluationOptions,\n semantic: boolean,\n) {\n const selections = [\n { role: \"candidate\", host: options.host },\n { role: \"semantic\", host: semantic ? options.semanticHost : undefined },\n { role: \"advisory\", host: options.advisoryHost },\n ];\n const configuration = Object.fromEntries(\n selections.flatMap(({ role, host }) => {\n if (host?.configuration === undefined) return [];\n return [[role, host.configuration]];\n }),\n );\n return Object.keys(configuration).length\n ? { hostConfiguration: configuration }\n : {};\n}\n\nfunction redactedExtensionConfiguration(options: EvaluationOptions) {\n return {\n extensionConfigurationDigest:\n options.extension?.session.identity.configurationDigest ?? null,\n ...(options.extension\n ? {\n extensionConfiguration:\n options.extension.session.redactedConfiguration,\n }\n : {}),\n };\n}\n\nfunction redactedPreparationConfiguration(state: PreparedEvaluationInputs) {\n return {\n ...(state.fixture.fixtureSetup\n ? { fixtureSetupDigest: hashJson(state.fixture.fixtureSetup) }\n : {}),\n ...(state.invocation.codexMarketplace\n ? { codexMarketplace: state.invocation.codexMarketplace }\n : {}),\n ...(state.invocation.claudePluginDirs\n ? { claudePluginDirs: state.invocation.claudePluginDirs }\n : {}),\n };\n}\n\nfunction redactedAdvisoryConfiguration(options: EvaluationOptions) {\n return options.advisoryHost\n ? {\n advisoryExcludedPaths: [\n ...(options.advisoryExcludedPaths ?? []),\n ].sort(),\n }\n : {};\n}\n\nfunction redactedEvaluationConfiguration(\n options: EvaluationOptions,\n state: PreparedEvaluationInputs,\n) {\n return {\n condition: options.condition,\n executionMode: options.dry ? \"dry\" : \"executed\",\n ...(options.runtimePolicy ? { runtimePolicy: options.runtimePolicy } : {}),\n trialCount: options.trialCount,\n jobs: state.jobs,\n passThreshold: options.passThreshold,\n ...(options.assessmentSettings\n ? { runSettings: options.assessmentSettings }\n : {}),\n ...redactedHostConfiguration(\n options,\n state.checks.preparedSemantic.length > 0,\n ),\n ...redactedExtensionConfiguration(options),\n ...redactedPreparationConfiguration(state),\n ...state.invocation.configuration,\n ...redactedAdvisoryConfiguration(options),\n };\n}\n\nfunction activeEvaluationGraders(\n options: EvaluationOptions,\n state: PreparedChecks,\n): ActiveGrader[] {\n const graders: ActiveGrader[] = [\n ...new Set(\n [\n ...state.builtinDeclarations,\n ...state.shellDeclarations,\n ...state.gitHeadDeclarations,\n ...state.semanticDeclarations,\n ].map((check) => check.grader),\n ),\n ]\n .sort()\n .map((id) => ({ id, source: \"builtin\", version: \"1.0.0\" }));\n if (options.extension) {\n for (const id of [\n ...new Set(state.extensionDeclarations.map((check) => check.grader)),\n ].sort())\n graders.push({\n id,\n source: \"extension\",\n version: options.extension.session.identity.version,\n });\n }\n return graders;\n}\n\nfunction extensionIdentityDimensions(options: EvaluationOptions) {\n return {\n extensionDigest: options.extension?.session.identity.sourceDigest ?? null,\n extensionProtocol: options.extension?.session.identity.protocol ?? null,\n };\n}\n\nfunction caseIdentityData(\n caseData: ResolvedCase,\n extensionData: Record<string, unknown>,\n) {\n return {\n id: caseData.id,\n prompt: caseData.prompt,\n ...(caseData.followUpPrompt !== undefined\n ? { followUpPrompt: caseData.followUpPrompt }\n : {}),\n extensionData,\n };\n}\n\nfunction baseFixtureIdentity(source: FixtureSource) {\n switch (source.kind) {\n case \"generated\":\n return source.fixture;\n case \"repository\":\n return { ...source.fixture, revision: source.repository.revision };\n case \"inline\":\n return { files: source.files };\n }\n}\n\nfunction artifactIdentityData(artifacts: InlineArtifact[]) {\n return artifacts.map(\n ({ id, relativePath, sha256, gitExclude, executable }) => ({\n id,\n relativePath,\n sha256,\n ...(gitExclude ? { gitExclude: true } : {}),\n ...(executable ? { executable: true } : {}),\n }),\n );\n}\n\nfunction fixtureIdentityData(state: PreparedEvaluationInputs) {\n return {\n ...baseFixtureIdentity(state.fixture.source),\n artifacts: artifactIdentityData(state.fixture.inlineArtifacts),\n ...(state.fixture.fixtureSetup\n ? { fixtureSetup: state.fixture.fixtureSetup }\n : {}),\n ...(state.invocation.codexMarketplace\n ? { codexMarketplace: state.invocation.codexMarketplace }\n : {}),\n ...(state.invocation.claudePluginDirs\n ? { claudePluginDirs: state.invocation.claudePluginDirs }\n : {}),\n ...state.invocation.configuration,\n };\n}\n\nfunction evaluatorIdentityData(\n options: EvaluationOptions,\n extensionData: Record<string, unknown>,\n) {\n return {\n policy: \"sevro.builtin-output.v1\",\n extension: options.extension?.session.identity ?? null,\n extensionData,\n };\n}\n\ntype IdentityMetadata = {\n extensionData: Record<string, unknown>;\n route: ReturnType<typeof evaluationRoute>;\n routes: ReturnType<typeof evaluationRoutes>;\n redactedConfig: ReturnType<typeof redactedEvaluationConfiguration>;\n activeGraders: ActiveGrader[];\n};\n\nfunction evaluationComparisonIdentity(\n options: EvaluationOptions,\n prepared: PreparedEvaluationInputs,\n context: IdentityMetadata,\n) {\n try {\n return createEvaluationIdentity({\n runnerBuildDigest: options.runnerBuildDigest,\n projectDigest: options.projectDigest,\n configurationDigest: hashJson(context.redactedConfig),\n ...extensionIdentityDimensions(options),\n caseDigest: hashJson(\n caseIdentityData(options.case, context.extensionData),\n ),\n fixtureDigest: hashJson(fixtureIdentityData(prepared)),\n checksDigest: hashJson(options.case.checks),\n requiredEvidenceDigest: hashJson(options.case.requiredEvidence),\n evaluatorDigest: hashJson(\n evaluatorIdentityData(options, context.extensionData),\n ),\n graderDigest: hashJson(context.activeGraders),\n instrumentationDigest: hashJson({\n requested: prepared.requestedInstrumentation,\n applied: prepared.requestedInstrumentation,\n }),\n routeDigest: hashJson(\n context.routes.length > 1 ? context.routes : context.route,\n ),\n condition: options.condition,\n trialCount: options.trialCount,\n passThreshold: options.passThreshold,\n });\n } catch (cause) {\n throw new EvaluationConfigurationError(\n \"invalid evaluation identity inputs\",\n { cause },\n );\n }\n}\n\nfunction prepareEvaluationIdentity(\n options: EvaluationOptions,\n state: PreparedEvaluationInputs,\n preparation: EnvironmentPlan[\"extensionPreparation\"],\n): PreparedEvaluation {\n const extensionData = extensionPreparationData(options, preparation);\n const route = evaluationRoute(options.host, \"candidate\");\n const routes = evaluationRoutes(\n options,\n state.checks.preparedSemantic.length > 0,\n route,\n );\n const redactedConfig = snapshotEvaluationConfiguration(options, state);\n const activeGraders = activeEvaluationGraders(options, state.checks);\n const context = {\n extensionData,\n route,\n routes,\n redactedConfig,\n activeGraders,\n };\n const evaluationIdentity = evaluationComparisonIdentity(\n options,\n state,\n context,\n );\n return { ...state, ...context, evaluationIdentity };\n}\n\nfunction snapshotEvaluationConfiguration(\n options: EvaluationOptions,\n state: PreparedEvaluationInputs,\n): ReturnType<typeof redactedEvaluationConfiguration> {\n try {\n return JSON.parse(\n canonicalJson(redactedEvaluationConfiguration(options, state)),\n ) as ReturnType<typeof redactedEvaluationConfiguration>;\n } catch (cause) {\n throw new EvaluationConfigurationError(\n \"invalid evaluation identity inputs\",\n { cause },\n );\n }\n}\n\nexport async function prepareEvaluation(\n options: EvaluationOptions,\n): Promise<PreparedEvaluation> {\n const checks = prepareEvaluationChecks(options);\n const environment = await prepareEvaluationEnvironment(\n options,\n checks.source,\n );\n const artifacts = await prepareEvaluationArtifacts(\n options,\n environment,\n checks,\n );\n const invocation = prepareInvocationPlan(options, {\n extensionPreparation: environment.extensionPreparation,\n inlineArtifacts: artifacts.inlineArtifacts,\n });\n const prepared: PreparedEvaluationInputs = {\n fixture: {\n projectRoot: environment.projectRoot,\n source: environment.source,\n fixtureSetup: artifacts.fixtureSetup,\n inlineArtifacts: artifacts.inlineArtifacts,\n },\n checks: checks.checks,\n invocation,\n jobs: checks.jobs,\n requestedInstrumentation: artifacts.requestedInstrumentation,\n runner: environment.runner,\n project: environment.project,\n };\n return prepareEvaluationIdentity(\n options,\n prepared,\n environment.extensionPreparation,\n );\n}\n"]}
@@ -0,0 +1,14 @@
1
+ /** Observation is best-effort and cannot change assessment or persistence. */
2
+ export function evaluationProgress(options, stage, status, trial) {
3
+ try {
4
+ options.onProgress?.({
5
+ stage,
6
+ status,
7
+ ...(trial === undefined ? {} : { trial }),
8
+ });
9
+ }
10
+ catch {
11
+ // An observer has no authority over the evaluation lifecycle.
12
+ }
13
+ }
14
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["progress.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAChC,OAA0B,EAC1B,KAAkC,EAClC,MAAoC,EACpC,KAAc;IAEd,IAAI,CAAC;QACH,OAAO,CAAC,UAAU,EAAE,CAAC;YACnB,KAAK;YACL,MAAM;YACN,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;IAChE,CAAC;AACH,CAAC","sourcesContent":["import type { EvaluationOptions, EvaluationProgress } from \"./types\";\n\n/** Observation is best-effort and cannot change assessment or persistence. */\nexport function evaluationProgress(\n options: EvaluationOptions,\n stage: EvaluationProgress[\"stage\"],\n status: EvaluationProgress[\"status\"],\n trial?: number,\n): void {\n try {\n options.onProgress?.({\n stage,\n status,\n ...(trial === undefined ? {} : { trial }),\n });\n } catch {\n // An observer has no authority over the evaluation lifecycle.\n }\n}\n"]}
@@ -0,0 +1,159 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { mkdir, realpath, rm, writeFile } from "node:fs/promises";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+ import { allocateWorkspace, retainWorkspace, removeWorkspace, } from "../fixtures/workspace-state.js";
6
+ import { createFixture } from "../fixtures/create.js";
7
+ import { fixtureBinDirectory } from "../fixtures/bin.js";
8
+ import { fixtureParts } from "../fixtures/preparation.js";
9
+ import { startRunOwner } from "../run-owner.js";
10
+ import { EvaluationConfigurationError } from "./types.js";
11
+ import { INVOCATION_PLACEHOLDER, LEGACY_CODEX_PLACEHOLDER, } from "./invocation-plan.js";
12
+ /** Reservations outlive completed contents until all admitted trials drain. */
13
+ export class RunWorkspaceReservations {
14
+ candidates = [];
15
+ semantics = [];
16
+ retained = new Set();
17
+ async reserve(input) {
18
+ for (let trial = 1; trial <= input.count && !input.signal?.aborted; trial++) {
19
+ this.candidates.push(await allocateWorkspace());
20
+ if (input.semantic)
21
+ this.semantics.push(await allocateWorkspace());
22
+ }
23
+ }
24
+ candidate(trial) {
25
+ const reservation = this.candidates[trial - 1];
26
+ if (reservation === undefined)
27
+ throw new Error(`trial ${trial} workspace was not reserved`);
28
+ return reservation;
29
+ }
30
+ semantic(trial) {
31
+ return this.semantics[trial - 1];
32
+ }
33
+ retain(workspace) {
34
+ this.retained.add(workspace);
35
+ }
36
+ completed(reservation) {
37
+ this.retained.delete(reservation);
38
+ }
39
+ async cleanup() {
40
+ for (const workspace of this.retained)
41
+ await retainWorkspace(workspace);
42
+ await Promise.all([...this.candidates, ...this.semantics]
43
+ .filter((workspace) => !this.retained.has(workspace))
44
+ .map(async (workspace) => {
45
+ try {
46
+ await removeWorkspace(workspace);
47
+ }
48
+ catch {
49
+ console.warn(`fixture cleanup failed; retained at ${workspace}`);
50
+ }
51
+ }));
52
+ }
53
+ }
54
+ export async function allocateRunResources(options, evaluationDigest) {
55
+ const runId = randomUUID();
56
+ await mkdir(options.resultsRoot, { recursive: true, mode: 0o700 });
57
+ const runDir = resolve(await realpath(options.resultsRoot), runId);
58
+ await mkdir(runDir, { mode: 0o700 });
59
+ const runStateRoot = options.runStateRoot ?? options.resultsRoot;
60
+ await mkdir(runStateRoot, { recursive: true, mode: 0o700 });
61
+ const stateRoot = await realpath(runStateRoot);
62
+ const stateDir = join(stateRoot, runId);
63
+ if (stateDir !== runDir)
64
+ await mkdir(stateDir, { mode: 0o700 });
65
+ const activePath = join(stateRoot, "active", `${runId}.json`);
66
+ const checkpointPath = join(stateDir, "checkpoint.json");
67
+ const evidencePath = join(runDir, "run.json");
68
+ let owner;
69
+ try {
70
+ owner = startRunOwner({
71
+ stateRoot,
72
+ evaluationDigest,
73
+ attemptId: runId,
74
+ activeRunPath: activePath,
75
+ checkpointPath,
76
+ evidenceDirectory: stateDir,
77
+ artifactPath: evidencePath,
78
+ });
79
+ }
80
+ catch (error) {
81
+ await rm(runDir, { recursive: true, force: true });
82
+ if (stateDir !== runDir)
83
+ await rm(stateDir, { recursive: true, force: true });
84
+ throw error;
85
+ }
86
+ return {
87
+ runId,
88
+ runDir,
89
+ runStateRoot,
90
+ stateDir,
91
+ evidencePath,
92
+ owner,
93
+ workspaces: new RunWorkspaceReservations(),
94
+ };
95
+ }
96
+ export async function retainPreparationArtifacts(artifacts, runDir) {
97
+ const artifactRefs = [];
98
+ for (const artifact of artifacts) {
99
+ const retainedPath = join(runDir, "prepared", ...fixtureParts(artifact.relativePath));
100
+ await mkdir(dirname(retainedPath), { recursive: true, mode: 0o700 });
101
+ await writeFile(retainedPath, artifact.bytes, {
102
+ flag: "wx",
103
+ mode: artifact.executable ? 0o700 : 0o600,
104
+ });
105
+ artifactRefs.push({
106
+ id: artifact.id,
107
+ path: pathToFileURL(retainedPath).href,
108
+ sha256: artifact.sha256,
109
+ ...(artifact.gitExclude ? { gitExclude: true } : {}),
110
+ ...(artifact.executable ? { executable: true } : {}),
111
+ });
112
+ }
113
+ return artifactRefs;
114
+ }
115
+ function renderTrialPrompt(prompt, workspace, invocation) {
116
+ return prompt
117
+ .replaceAll("{{sevro.workspace}}", workspace)
118
+ .replaceAll(INVOCATION_PLACEHOLDER, invocation.invocationToken ?? INVOCATION_PLACEHOLDER)
119
+ .replaceAll(LEGACY_CODEX_PLACEHOLDER, invocation.invocationToken ?? LEGACY_CODEX_PLACEHOLDER);
120
+ }
121
+ export async function prepareTrialWorkspace(options, fixture, invocation, workspaces, trial, candidateRuntimeRoot) {
122
+ const reservation = workspaces.candidate(trial);
123
+ workspaces.retain(reservation);
124
+ const workspace = await createFixture(fixture.source, {
125
+ artifacts: fixture.inlineArtifacts,
126
+ sources: options.preparationSources,
127
+ setup: fixture.fixtureSetup,
128
+ projectRoot: fixture.projectRoot,
129
+ signal: options.signal,
130
+ reservedWorkspace: reservation,
131
+ candidateRuntimeRoot,
132
+ }).catch((error) => {
133
+ if (!options.signal?.aborted ||
134
+ error instanceof EvaluationConfigurationError)
135
+ throw error;
136
+ return null;
137
+ });
138
+ const details = await trialWorkspaceDetails(options.case, invocation, reservation, workspace);
139
+ return { ...details, candidateRuntimeRoot };
140
+ }
141
+ async function trialWorkspaceDetails(caseData, invocation, reservation, preparedWorkspace) {
142
+ const workspace = preparedWorkspace ?? reservation;
143
+ const fixtureBinDir = preparedWorkspace === null
144
+ ? undefined
145
+ : ((await fixtureBinDirectory(workspace)) ?? undefined);
146
+ const trialPrompt = renderTrialPrompt(caseData.prompt, workspace, invocation);
147
+ const trialFollowUpPrompt = caseData.followUpPrompt === undefined
148
+ ? undefined
149
+ : renderTrialPrompt(caseData.followUpPrompt, workspace, invocation);
150
+ return {
151
+ reservation,
152
+ workspace,
153
+ preparationCancelled: preparedWorkspace === null,
154
+ fixtureBinDir,
155
+ trialPrompt,
156
+ trialFollowUpPrompt,
157
+ };
158
+ }
159
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["resources.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, realpath, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport {\n allocateWorkspace,\n retainWorkspace,\n removeWorkspace,\n} from \"../fixtures/workspace-state\";\nimport { createFixture } from \"../fixtures/create\";\nimport { fixtureBinDirectory } from \"../fixtures/bin\";\nimport { fixtureParts } from \"../fixtures/preparation\";\nimport { startRunOwner, type RunOwner } from \"../run-owner\";\nimport { EvaluationConfigurationError, type EvaluationOptions } from \"./types\";\nimport type { PreparedFixture, PreparedInvocation } from \"./plan\";\nimport {\n INVOCATION_PLACEHOLDER,\n LEGACY_CODEX_PLACEHOLDER,\n} from \"./invocation-plan\";\nimport type { ArtifactReference as PreparationArtifactReference } from \"../contract-types\";\nexport type { ArtifactReference as PreparationArtifactReference } from \"../contract-types\";\n\n/** Reservations outlive completed contents until all admitted trials drain. */\nexport class RunWorkspaceReservations {\n private readonly candidates: string[] = [];\n private readonly semantics: string[] = [];\n private readonly retained = new Set<string>();\n\n async reserve(input: {\n count: number;\n semantic: boolean;\n signal?: AbortSignal;\n }): Promise<void> {\n for (\n let trial = 1;\n trial <= input.count && !input.signal?.aborted;\n trial++\n ) {\n this.candidates.push(await allocateWorkspace());\n if (input.semantic) this.semantics.push(await allocateWorkspace());\n }\n }\n\n candidate(trial: number): string {\n const reservation = this.candidates[trial - 1];\n if (reservation === undefined)\n throw new Error(`trial ${trial} workspace was not reserved`);\n return reservation;\n }\n\n semantic(trial: number): string | undefined {\n return this.semantics[trial - 1];\n }\n\n retain(workspace: string): void {\n this.retained.add(workspace);\n }\n\n completed(reservation: string): void {\n this.retained.delete(reservation);\n }\n\n async cleanup(): Promise<void> {\n for (const workspace of this.retained) await retainWorkspace(workspace);\n await Promise.all(\n [...this.candidates, ...this.semantics]\n .filter((workspace) => !this.retained.has(workspace))\n .map(async (workspace) => {\n try {\n await removeWorkspace(workspace);\n } catch {\n console.warn(`fixture cleanup failed; retained at ${workspace}`);\n }\n }),\n );\n }\n}\n\nexport interface RunResources {\n readonly runId: string;\n readonly runDir: string;\n readonly runStateRoot: string;\n readonly stateDir: string;\n readonly evidencePath: string;\n readonly owner: RunOwner;\n readonly workspaces: RunWorkspaceReservations;\n}\n\nexport async function allocateRunResources(\n options: Pick<EvaluationOptions, \"resultsRoot\" | \"runStateRoot\">,\n evaluationDigest: string,\n): Promise<RunResources> {\n const runId = randomUUID();\n await mkdir(options.resultsRoot, { recursive: true, mode: 0o700 });\n const runDir = resolve(await realpath(options.resultsRoot), runId);\n await mkdir(runDir, { mode: 0o700 });\n const runStateRoot = options.runStateRoot ?? options.resultsRoot;\n await mkdir(runStateRoot, { recursive: true, mode: 0o700 });\n const stateRoot = await realpath(runStateRoot);\n const stateDir = join(stateRoot, runId);\n if (stateDir !== runDir) await mkdir(stateDir, { mode: 0o700 });\n const activePath = join(stateRoot, \"active\", `${runId}.json`);\n const checkpointPath = join(stateDir, \"checkpoint.json\");\n const evidencePath = join(runDir, \"run.json\");\n let owner: RunOwner;\n try {\n owner = startRunOwner({\n stateRoot,\n evaluationDigest,\n attemptId: runId,\n activeRunPath: activePath,\n checkpointPath,\n evidenceDirectory: stateDir,\n artifactPath: evidencePath,\n });\n } catch (error) {\n await rm(runDir, { recursive: true, force: true });\n if (stateDir !== runDir)\n await rm(stateDir, { recursive: true, force: true });\n throw error;\n }\n return {\n runId,\n runDir,\n runStateRoot,\n stateDir,\n evidencePath,\n owner,\n workspaces: new RunWorkspaceReservations(),\n };\n}\n\nexport async function retainPreparationArtifacts(\n artifacts: PreparedFixture[\"inlineArtifacts\"],\n runDir: string,\n): Promise<PreparationArtifactReference[]> {\n const artifactRefs: PreparationArtifactReference[] = [];\n for (const artifact of artifacts) {\n const retainedPath = join(\n runDir,\n \"prepared\",\n ...fixtureParts(artifact.relativePath),\n );\n await mkdir(dirname(retainedPath), { recursive: true, mode: 0o700 });\n await writeFile(retainedPath, artifact.bytes, {\n flag: \"wx\",\n mode: artifact.executable ? 0o700 : 0o600,\n });\n artifactRefs.push({\n id: artifact.id,\n path: pathToFileURL(retainedPath).href,\n sha256: artifact.sha256,\n ...(artifact.gitExclude ? { gitExclude: true } : {}),\n ...(artifact.executable ? { executable: true } : {}),\n });\n }\n return artifactRefs;\n}\n\nfunction renderTrialPrompt(\n prompt: string,\n workspace: string,\n invocation: PreparedInvocation,\n): string {\n return prompt\n .replaceAll(\"{{sevro.workspace}}\", workspace)\n .replaceAll(\n INVOCATION_PLACEHOLDER,\n invocation.invocationToken ?? INVOCATION_PLACEHOLDER,\n )\n .replaceAll(\n LEGACY_CODEX_PLACEHOLDER,\n invocation.invocationToken ?? LEGACY_CODEX_PLACEHOLDER,\n );\n}\n\ntype TrialPreparationOptions = Pick<\n EvaluationOptions,\n \"case\" | \"preparationSources\" | \"signal\"\n>;\n\nexport async function prepareTrialWorkspace(\n options: TrialPreparationOptions,\n fixture: PreparedFixture,\n invocation: PreparedInvocation,\n workspaces: RunWorkspaceReservations,\n trial: number,\n candidateRuntimeRoot?: string,\n) {\n const reservation = workspaces.candidate(trial);\n workspaces.retain(reservation);\n const workspace = await createFixture(fixture.source, {\n artifacts: fixture.inlineArtifacts,\n sources: options.preparationSources,\n setup: fixture.fixtureSetup,\n projectRoot: fixture.projectRoot,\n signal: options.signal,\n reservedWorkspace: reservation,\n candidateRuntimeRoot,\n }).catch((error: unknown) => {\n if (\n !options.signal?.aborted ||\n error instanceof EvaluationConfigurationError\n )\n throw error;\n return null;\n });\n const details = await trialWorkspaceDetails(\n options.case,\n invocation,\n reservation,\n workspace,\n );\n return { ...details, candidateRuntimeRoot };\n}\n\nasync function trialWorkspaceDetails(\n caseData: EvaluationOptions[\"case\"],\n invocation: PreparedInvocation,\n reservation: string,\n preparedWorkspace: string | null,\n) {\n const workspace = preparedWorkspace ?? reservation;\n const fixtureBinDir =\n preparedWorkspace === null\n ? undefined\n : ((await fixtureBinDirectory(workspace)) ?? undefined);\n const trialPrompt = renderTrialPrompt(caseData.prompt, workspace, invocation);\n const trialFollowUpPrompt =\n caseData.followUpPrompt === undefined\n ? undefined\n : renderTrialPrompt(caseData.followUpPrompt, workspace, invocation);\n return {\n reservation,\n workspace,\n preparationCancelled: preparedWorkspace === null,\n fixtureBinDir,\n trialPrompt,\n trialFollowUpPrompt,\n };\n}\n"]}