@bjoernrochel/sevro 0.1.0-rc.8 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (582) hide show
  1. package/CONTRIBUTING.md +52 -6
  2. package/README.md +12 -7
  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 +156 -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/README.md +19 -15
  349. package/docs/architecture.md +141 -17
  350. package/docs/assets/README.md +5 -4
  351. package/docs/builtin-graders-v1.md +9 -2
  352. package/docs/codex-host.md +155 -57
  353. package/docs/contracts.md +2 -1
  354. package/docs/creating-cases.md +10 -4
  355. package/docs/development-cli.md +197 -24
  356. package/docs/documentation-quality.md +16 -5
  357. package/docs/evaluation-workflow.md +110 -0
  358. package/docs/extension-protocol-v1.md +26 -3
  359. package/docs/getting-started.md +29 -7
  360. package/docs/guide-evaluation.md +34 -2
  361. package/docs/identity-v1.md +29 -3
  362. package/docs/installing.md +35 -17
  363. package/docs/licensing.md +2 -2
  364. package/docs/native-controls.md +76 -5
  365. package/docs/native-hosts.md +197 -8
  366. package/docs/reading-results.md +102 -0
  367. package/docs/recipes.md +490 -0
  368. package/docs/releases.md +48 -13
  369. package/docs/report-v1.md +29 -1
  370. package/docs/results-v1.md +122 -4
  371. package/docs/run-settings-v1.md +147 -0
  372. package/docs/runtime-v1.md +255 -22
  373. package/docs/specs/repository-guide.md +1 -1
  374. package/docs/troubleshooting.md +12 -12
  375. package/docs/typescript-quality.md +106 -26
  376. package/examples/recipes/candidate.ts +26 -0
  377. package/examples/recipes/cases/coding-change.json +21 -0
  378. package/examples/recipes/cases/host-tools.json +21 -0
  379. package/examples/recipes/cases/mise.json +21 -0
  380. package/examples/recipes/cases/node.json +21 -0
  381. package/examples/recipes/cases/python-uv.json +21 -0
  382. package/examples/recipes/cases/semantic.json +17 -0
  383. package/examples/recipes/coding-change/check.ts +23 -0
  384. package/examples/recipes/executable.ts +19 -0
  385. package/examples/recipes/extension-artifacts.ts +65 -0
  386. package/examples/recipes/extension-methods.ts +174 -0
  387. package/examples/recipes/extension.ts +38 -0
  388. package/examples/recipes/modules.ts +9 -0
  389. package/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
  390. package/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
  391. package/examples/recipes/repository-skill/README.md +3 -0
  392. package/examples/recipes/run-inputs.ts +183 -0
  393. package/examples/recipes/run-options.ts +132 -0
  394. package/examples/recipes/run.ts +77 -0
  395. package/examples/recipes/runtime/empty.json +1 -0
  396. package/examples/recipes/runtime/goals.json +1 -0
  397. package/examples/recipes/runtime/mise.json +6 -0
  398. package/examples/recipes/runtime/path.json +1 -0
  399. package/examples/recipes/runtime/plugins.json +4 -0
  400. package/examples/recipes/runtime/python-uv.json +10 -0
  401. package/examples/recipes/semantic-judge.ts +29 -0
  402. package/examples/templates/coding/adapter.ts +17 -0
  403. package/examples/templates/coding/case.json +15 -0
  404. package/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
  405. package/examples/templates/repository-skill/extension-data.ts +64 -0
  406. package/examples/templates/repository-skill/extension.ts +32 -0
  407. package/examples/templates/response/adapter.ts +12 -0
  408. package/examples/templates/response/case.json +13 -0
  409. package/package.json +23 -9
  410. package/schemas/report-v1.schema.json +9 -0
  411. package/schemas/run-evidence-v1.schema.json +2 -1
  412. package/schemas/runtime-v1.schema.json +43 -7
  413. package/src/advisory.ts +2 -2
  414. package/src/candidate-artifacts.ts +42 -11
  415. package/src/candidate-codex-state.ts +185 -0
  416. package/src/case-validation.ts +73 -50
  417. package/src/cli/cancellation.ts +20 -0
  418. package/src/cli/command.ts +87 -0
  419. package/src/cli/completion.ts +15 -0
  420. package/src/cli/demo.ts +61 -0
  421. package/src/cli/evaluation.ts +55 -0
  422. package/src/cli/extension.ts +79 -0
  423. package/src/cli/help.ts +199 -0
  424. package/src/cli/hosts.ts +55 -0
  425. package/src/cli/init-settings.ts +31 -0
  426. package/src/cli/init.ts +112 -0
  427. package/src/{cli-invocation.ts → cli/invocation.ts} +215 -218
  428. package/src/cli/loading.ts +151 -0
  429. package/src/cli/preparation.ts +154 -0
  430. package/src/cli/presentation.ts +93 -0
  431. package/src/cli/progress.ts +6 -0
  432. package/src/cli/run-manifest.ts +128 -0
  433. package/src/cli/run-options.ts +403 -0
  434. package/src/cli/run-overrides.ts +69 -0
  435. package/src/cli/settings.ts +154 -0
  436. package/src/cli/summary.ts +43 -0
  437. package/src/cli.ts +14 -592
  438. package/src/contract-types.ts +94 -0
  439. package/src/engine.ts +9 -5
  440. package/src/evaluation/advisory.ts +150 -0
  441. package/src/{evaluation-check-plan.ts → evaluation/check-plan.ts} +103 -67
  442. package/src/evaluation/collection.ts +88 -0
  443. package/src/evaluation/context.ts +10 -0
  444. package/src/{evaluation-grading-host.ts → evaluation/grading-host.ts} +5 -5
  445. package/src/evaluation/grading.ts +235 -0
  446. package/src/{evaluation-invocation-plan.ts → evaluation/invocation-plan.ts} +147 -58
  447. package/src/{evaluation-plan.ts → evaluation/plan.ts} +208 -141
  448. package/src/evaluation/progress.ts +19 -0
  449. package/src/evaluation/resources.ts +241 -0
  450. package/src/evaluation/run.ts +206 -0
  451. package/src/{evaluation-semantic.ts → evaluation/semantic.ts} +77 -87
  452. package/src/evaluation/trial.ts +800 -0
  453. package/src/{evaluation-types.ts → evaluation/types.ts} +79 -29
  454. package/src/evidence/host-results.ts +85 -0
  455. package/src/evidence/retained-artifacts.ts +18 -0
  456. package/src/evidence/trial-writer.ts +203 -0
  457. package/src/evidence/usage.ts +17 -0
  458. package/src/executable.ts +19 -0
  459. package/src/extension-client.ts +40 -108
  460. package/src/extension-session.ts +24 -48
  461. package/src/{advisory-fixture.ts → fixtures/advisory.ts} +12 -72
  462. package/src/{fixture-bin.ts → fixtures/bin.ts} +1 -1
  463. package/src/{fixture-cleanup.ts → fixtures/cleanup.ts} +13 -7
  464. package/src/fixtures/create.ts +183 -0
  465. package/src/{generated-fixture.ts → fixtures/generated.ts} +10 -53
  466. package/src/{git-hooks.ts → fixtures/git-hooks.ts} +1 -1
  467. package/src/{preparation.ts → fixtures/preparation.ts} +6 -16
  468. package/src/{repository-fixture.ts → fixtures/repository.ts} +30 -64
  469. package/src/{fixture-setup.ts → fixtures/setup.ts} +36 -53
  470. package/src/{fixture-tools.ts → fixtures/tools.ts} +1 -1
  471. package/src/{workspace-state.ts → fixtures/workspace-state.ts} +5 -5
  472. package/src/generated/cli-result.d.cts +2 -1
  473. package/src/generated/extension.d.cts +2 -1
  474. package/src/generated/report.cjs +1 -1
  475. package/src/generated/report.d.cts +2 -1
  476. package/src/generated/run-evidence.cjs +1 -1
  477. package/src/generated/run-evidence.d.cts +2 -1
  478. package/src/generated/runtime.cjs +1 -1
  479. package/src/generated/runtime.d.cts +2 -1
  480. package/src/git.ts +94 -0
  481. package/src/graders/git-head.ts +31 -85
  482. package/src/graders/shell.ts +54 -71
  483. package/src/host-diagnostic-redaction.ts +52 -0
  484. package/src/host-diagnostics.ts +331 -0
  485. package/src/hosts/claude-continuation.ts +57 -40
  486. package/src/hosts/claude-credential.ts +160 -63
  487. package/src/hosts/claude-events.ts +34 -18
  488. package/src/hosts/claude-keychain.ts +79 -21
  489. package/src/hosts/claude-login-recovery.ts +85 -0
  490. package/src/hosts/claude-login-refresh.ts +179 -0
  491. package/src/hosts/claude-login-store.ts +162 -0
  492. package/src/hosts/claude-login.ts +107 -0
  493. package/src/hosts/claude-native-goal.ts +15 -12
  494. package/src/hosts/claude-process.ts +10 -50
  495. package/src/hosts/claude-refresh-lock.ts +82 -0
  496. package/src/hosts/claude-repository-invocation.ts +9 -34
  497. package/src/hosts/claude-settings.ts +46 -9
  498. package/src/hosts/claude-skill-activations.ts +169 -0
  499. package/src/hosts/claude-state.ts +28 -15
  500. package/src/hosts/claude-tool-calls.ts +13 -10
  501. package/src/hosts/claude.ts +121 -81
  502. package/src/hosts/codex-app-server.ts +78 -52
  503. package/src/hosts/codex-configuration.ts +5 -10
  504. package/src/hosts/codex-exec-controls.ts +516 -0
  505. package/src/hosts/codex-marketplace.ts +12 -10
  506. package/src/hosts/codex-native-calls.ts +15 -122
  507. package/src/hosts/codex-process.ts +10 -183
  508. package/src/hosts/codex-profile.ts +36 -21
  509. package/src/hosts/codex-session-files.ts +1 -9
  510. package/src/hosts/codex-state.ts +134 -18
  511. package/src/hosts/codex.ts +210 -183
  512. package/src/hosts/isolation-common.ts +8 -11
  513. package/src/hosts/isolation-roots.ts +5 -4
  514. package/src/hosts/linux-sandbox.ts +15 -2
  515. package/src/hosts/mac-sandbox.ts +87 -18
  516. package/src/hosts/native-controls.ts +72 -22
  517. package/src/hosts/native-request.ts +55 -0
  518. package/src/hosts/process-lifecycle.ts +215 -49
  519. package/src/hosts/protected-worktrees.ts +3 -2
  520. package/src/hosts/skill-hook-catalog.ts +131 -0
  521. package/src/hosts/skill-hook-handler.ts +374 -0
  522. package/src/hosts/skill-hooks.ts +585 -0
  523. package/src/instrumentation.ts +7 -8
  524. package/src/native-transcript-state.ts +22 -3
  525. package/src/native-transcript-view.ts +52 -13
  526. package/src/native-transcripts.ts +26 -11
  527. package/src/paths.ts +22 -0
  528. package/src/process-lifecycle.ts +150 -0
  529. package/src/provenance.ts +34 -13
  530. package/src/prune.ts +300 -0
  531. package/src/report.ts +63 -36
  532. package/src/resolved-case.ts +1 -1
  533. package/src/results-lock.ts +42 -0
  534. package/src/results.ts +14 -18
  535. package/src/run-owner.ts +15 -9
  536. package/src/runner-paths.ts +21 -0
  537. package/src/{runtime-config.ts → runtime/config.ts} +160 -46
  538. package/src/{runtime-discovery-apple.ts → runtime/discovery-apple.ts} +3 -3
  539. package/src/{runtime-discovery-providers.ts → runtime/discovery-providers.ts} +3 -9
  540. package/src/{runtime-discovery.ts → runtime/discovery.ts} +4 -4
  541. package/src/{runtime-hook-processes.ts → runtime/hook-processes.ts} +3 -2
  542. package/src/{runtime-hooks.ts → runtime/hooks.ts} +40 -28
  543. package/src/{runtime-paths.ts → runtime/paths.ts} +5 -19
  544. package/src/{runtime-query.ts → runtime/query.ts} +5 -5
  545. package/src/{runtime-seeds.ts → runtime/seeds.ts} +3 -3
  546. package/src/runtime/shared-cache.ts +130 -0
  547. package/src/{runtime-state.ts → runtime/state.ts} +28 -11
  548. package/src/runtime-process.ts +194 -0
  549. package/src/schema-types.ts +73 -161
  550. package/src/shell.ts +4 -0
  551. package/src/sqlite-lock.ts +25 -0
  552. package/src/transcript-retention.ts +146 -0
  553. package/src/value-guards.ts +22 -0
  554. package/docs/assets/sevro-logo.png +0 -0
  555. package/docs/assets/sevro-symbol.svg +0 -1
  556. package/docs/assets/sevro-wordmark.svg +0 -1
  557. package/docs/cache-ownership-validation.md +0 -49
  558. package/docs/claude-continuation-validation.md +0 -47
  559. package/docs/concurrency-validation.md +0 -86
  560. package/docs/configuration-root-validation.md +0 -70
  561. package/docs/engine-slice.md +0 -114
  562. package/docs/evidence/runtime-startup-30/README.md +0 -185
  563. package/docs/evidence/runtime-startup-30/after.json +0 -319
  564. package/docs/evidence/runtime-startup-30/baseline-timeout.jsonl +0 -2
  565. package/docs/evidence/runtime-startup-30/before.json +0 -403
  566. package/docs/evidence/runtime-startup-30/consumer-smoke.json +0 -63
  567. package/docs/evidence/runtime-startup-30/full-policy-diagnostic.jsonl +0 -3
  568. package/docs/evidence/runtime-startup-30/minimal-policy-diagnostic.jsonl +0 -3
  569. package/docs/evidence/runtime-startup-30/plugin-template-assessment.json +0 -20
  570. package/docs/evidence/runtime-startup-30/seedless-timeout.jsonl +0 -2
  571. package/docs/evidence.md +0 -17
  572. package/docs/fixture-cleanup-validation.md +0 -73
  573. package/docs/guide-verification.json +0 -239
  574. package/src/evaluation-context.ts +0 -259
  575. package/src/evaluation-fixture.ts +0 -302
  576. package/src/evaluation-run.ts +0 -200
  577. package/src/evaluation-trial.ts +0 -1016
  578. package/src/hosts/claude-nested-skills.ts +0 -272
  579. package/src/hosts/codex-command-output.ts +0 -510
  580. package/src/hosts/codex-executor-command.ts +0 -291
  581. package/src/hosts/codex-skill-reads.ts +0 -783
  582. /package/src/{trial-scheduler.ts → evaluation/scheduler.ts} +0 -0
@@ -0,0 +1,110 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { isAbsolute } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { isResolvedCase, resolvedCaseIssue } from "../case-validation.js";
5
+ import { prepareInstrumentation } from "../instrumentation.js";
6
+ import { isRecord, isStringArray, validQualifiedId } from "../value-guards.js";
7
+ import { InvocationError } from "./invocation.js";
8
+ export function parseCase(value) {
9
+ if (!isResolvedCase(value))
10
+ throw new InvocationError(`invalid resolved case file: ${resolvedCaseIssue(value) ?? "invalid case"}`);
11
+ return value;
12
+ }
13
+ export async function loadCase(path) {
14
+ try {
15
+ return parseCase(JSON.parse(await readFile(path, "utf8")));
16
+ }
17
+ catch (cause) {
18
+ const detail = cause instanceof InvocationError ? `: ${cause.message}` : "";
19
+ throw new InvocationError(`resolved case file is unreadable or invalid at ${path}${detail}; supply --case-file with readable JSON and correct the named field`, {
20
+ cause,
21
+ });
22
+ }
23
+ }
24
+ async function loadJson(path, label) {
25
+ try {
26
+ return JSON.parse(await readFile(path, "utf8"));
27
+ }
28
+ catch (cause) {
29
+ throw new InvocationError(`${label} is unreadable or invalid`, { cause });
30
+ }
31
+ }
32
+ function validExtensionCommand(value) {
33
+ return (isStringArray(value) &&
34
+ value.length > 0 &&
35
+ value.every((part) => part.length > 0) &&
36
+ isAbsolute(value[0] ?? ""));
37
+ }
38
+ async function loadExtensionCommand(path) {
39
+ const command = await loadJson(path, "extension command file");
40
+ if (!validExtensionCommand(command))
41
+ throw new InvocationError("extension command must be an absolute argv array");
42
+ return command;
43
+ }
44
+ export async function loadExtensionOptions(selected) {
45
+ const command = await loadExtensionCommand(selected.commandFile);
46
+ const configuration = selected.configurationFile
47
+ ? await loadJson(selected.configurationFile, "extension configuration file")
48
+ : {};
49
+ const redactedConfiguration = selected.redactedConfigurationFile
50
+ ? await loadJson(selected.redactedConfigurationFile, "redacted extension configuration file")
51
+ : {};
52
+ if (!isRecord(configuration) || !isRecord(redactedConfiguration))
53
+ throw new InvocationError("extension configuration must be JSON objects");
54
+ return { command, configuration, redactedConfiguration };
55
+ }
56
+ export async function loadPreparationSources(selected) {
57
+ if (!selected.caseSourceRoot || !selected.caseSourceMapFile)
58
+ return undefined;
59
+ const refs = await loadJson(selected.caseSourceMapFile, "case source map file");
60
+ if (!isRecord(refs) ||
61
+ !Object.values(refs).every((value) => typeof value === "string" && value.startsWith("file:///")))
62
+ throw new InvocationError("case source map must contain file URLs");
63
+ return {
64
+ root: selected.caseSourceRoot,
65
+ refs: refs,
66
+ };
67
+ }
68
+ async function adapterModule(path) {
69
+ try {
70
+ return await import(pathToFileURL(path).href);
71
+ }
72
+ catch (cause) {
73
+ throw new InvocationError(`host adapter module could not be loaded at ${path}; check that the module exists and imports successfully, then correct --adapter-module or the selected grading adapter option`, { cause });
74
+ }
75
+ }
76
+ export async function loadHost(path) {
77
+ const module = await adapterModule(path);
78
+ const host = isRecord(module) ? module.default : null;
79
+ if (!validHostAdapter(host))
80
+ throw new InvocationError(`host adapter module has no valid default adapter at ${path}; export a default adapter with string id, model, effort and a run function`);
81
+ validateHostInstrumentation(host);
82
+ validateHostCapabilities(host.hostCapabilities);
83
+ return host;
84
+ }
85
+ function validateHostInstrumentation(host) {
86
+ try {
87
+ prepareInstrumentation([], host.instrumentation ?? [], [], "passive");
88
+ }
89
+ catch (cause) {
90
+ throw new InvocationError("host adapter instrumentation is invalid", {
91
+ cause,
92
+ });
93
+ }
94
+ }
95
+ function validHostAdapter(value) {
96
+ return (isRecord(value) &&
97
+ typeof value.id === "string" &&
98
+ typeof value.model === "string" &&
99
+ typeof value.effort === "string" &&
100
+ typeof value.run === "function");
101
+ }
102
+ function validateHostCapabilities(value) {
103
+ if (value === undefined)
104
+ return;
105
+ if (!isStringArray(value) ||
106
+ value.some((id) => !validQualifiedId(id)) ||
107
+ new Set(value).size !== value.length)
108
+ throw new InvocationError("host adapter capabilities are invalid");
109
+ }
110
+ //# sourceMappingURL=loading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.js","sourceRoot":"","sources":["loading.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { isAbsolute } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { isResolvedCase, resolvedCaseIssue } from \"../case-validation\";\nimport type { HostAdapter, ResolvedCase } from \"../engine\";\nimport { prepareInstrumentation } from \"../instrumentation\";\nimport { isRecord, isStringArray, validQualifiedId } from \"../value-guards\";\nimport { InvocationError, type Invocation } from \"./invocation\";\n\nexport function parseCase(value: unknown): ResolvedCase {\n if (!isResolvedCase(value))\n throw new InvocationError(\n `invalid resolved case file: ${resolvedCaseIssue(value) ?? \"invalid case\"}`,\n );\n return value;\n}\n\nexport async function loadCase(path: string): Promise<ResolvedCase> {\n try {\n return parseCase(JSON.parse(await readFile(path, \"utf8\")));\n } catch (cause) {\n const detail = cause instanceof InvocationError ? `: ${cause.message}` : \"\";\n throw new InvocationError(\n `resolved case file is unreadable or invalid at ${path}${detail}; supply --case-file with readable JSON and correct the named field`,\n {\n cause,\n },\n );\n }\n}\n\nasync function loadJson(path: string, label: string): Promise<unknown> {\n try {\n return JSON.parse(await readFile(path, \"utf8\"));\n } catch (cause) {\n throw new InvocationError(`${label} is unreadable or invalid`, { cause });\n }\n}\n\nfunction validExtensionCommand(value: unknown): value is string[] {\n return (\n isStringArray(value) &&\n value.length > 0 &&\n value.every((part) => part.length > 0) &&\n isAbsolute(value[0] ?? \"\")\n );\n}\n\nasync function loadExtensionCommand(path: string): Promise<string[]> {\n const command = await loadJson(path, \"extension command file\");\n if (!validExtensionCommand(command))\n throw new InvocationError(\n \"extension command must be an absolute argv array\",\n );\n return command;\n}\n\nexport async function loadExtensionOptions(\n selected: NonNullable<Invocation[\"extension\"]>,\n) {\n const command = await loadExtensionCommand(selected.commandFile);\n const configuration = selected.configurationFile\n ? await loadJson(selected.configurationFile, \"extension configuration file\")\n : {};\n const redactedConfiguration = selected.redactedConfigurationFile\n ? await loadJson(\n selected.redactedConfigurationFile,\n \"redacted extension configuration file\",\n )\n : {};\n if (!isRecord(configuration) || !isRecord(redactedConfiguration))\n throw new InvocationError(\"extension configuration must be JSON objects\");\n return { command, configuration, redactedConfiguration };\n}\n\nexport async function loadPreparationSources(selected: Invocation) {\n if (!selected.caseSourceRoot || !selected.caseSourceMapFile) return undefined;\n const refs = await loadJson(\n selected.caseSourceMapFile,\n \"case source map file\",\n );\n if (\n !isRecord(refs) ||\n !Object.values(refs).every(\n (value) => typeof value === \"string\" && value.startsWith(\"file:///\"),\n )\n )\n throw new InvocationError(\"case source map must contain file URLs\");\n return {\n root: selected.caseSourceRoot,\n refs: refs as Record<string, string>,\n };\n}\n\nasync function adapterModule(path: string): Promise<unknown> {\n try {\n return await import(pathToFileURL(path).href);\n } catch (cause) {\n throw new InvocationError(\n `host adapter module could not be loaded at ${path}; check that the module exists and imports successfully, then correct --adapter-module or the selected grading adapter option`,\n { cause },\n );\n }\n}\n\nexport async function loadHost(path: string): Promise<HostAdapter> {\n const module = await adapterModule(path);\n const host = isRecord(module) ? module.default : null;\n if (!validHostAdapter(host))\n throw new InvocationError(\n `host adapter module has no valid default adapter at ${path}; export a default adapter with string id, model, effort and a run function`,\n );\n validateHostInstrumentation(host);\n validateHostCapabilities(host.hostCapabilities);\n return host as unknown as HostAdapter;\n}\n\nfunction validateHostInstrumentation(host: Record<string, unknown>): void {\n try {\n prepareInstrumentation(\n [],\n (host.instrumentation as HostAdapter[\"instrumentation\"]) ?? [],\n [],\n \"passive\",\n );\n } catch (cause) {\n throw new InvocationError(\"host adapter instrumentation is invalid\", {\n cause,\n });\n }\n}\n\nfunction validHostAdapter(value: unknown): value is Record<string, unknown> {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.model === \"string\" &&\n typeof value.effort === \"string\" &&\n typeof value.run === \"function\"\n );\n}\n\nfunction validateHostCapabilities(value: unknown): void {\n if (value === undefined) return;\n if (\n !isStringArray(value) ||\n value.some((id) => !validQualifiedId(id)) ||\n new Set(value).size !== value.length\n )\n throw new InvocationError(\"host adapter capabilities are invalid\");\n}\n"]}
@@ -0,0 +1,88 @@
1
+ import { runnerRoot } from "../runner-paths.js";
2
+ import { fileURLToPath } from "node:url";
3
+ import { configurationRoot } from "../hosts/codex-configuration.js";
4
+ import { InvocationError, parseInvocation, nativeRoutes, } from "./invocation.js";
5
+ import { loadRuntimeConfiguration, runtimeNativeGoalEnabled, } from "../runtime/config.js";
6
+ import { canonicalRuntimeRoot, requireRuntimeReadRoots, } from "../runtime/paths.js";
7
+ import { loadCase, loadPreparationSources } from "./loading.js";
8
+ import { candidateHost, secondaryHost, selectedConcurrency } from "./hosts.js";
9
+ function protectMappedSources(invocation, preparationSources) {
10
+ const sourceRoots = mappedSourceRoots(preparationSources);
11
+ for (const native of nativeRoutes(invocation)) {
12
+ native.additionalProtectedRoots = [
13
+ ...native.additionalProtectedRoots,
14
+ ...sourceRoots,
15
+ ];
16
+ }
17
+ invocation.shellIsolation?.protectedRoots.push(...sourceRoots);
18
+ }
19
+ export async function prepareRunInvocation(argv) {
20
+ const invocation = await parseInvocation(argv);
21
+ warnDeprecatedRuntimeOptions(invocation);
22
+ const preparationSources = await loadPreparationSources(invocation);
23
+ protectMappedSources(invocation, preparationSources);
24
+ const protectedRoots = await invocationProtectedRuntimeRoots(invocation);
25
+ const runtimePolicy = await loadRuntimeConfiguration(invocation.projectRoot, invocation.runtimeConfigFile, protectedRoots);
26
+ requireRuntimeOptionCompatibility(invocation, runtimePolicy);
27
+ selectRuntimeTransport(invocation, runtimePolicy);
28
+ const configRoot = await configurationRoot(invocation.configRoot);
29
+ validateInvocationRuntime(protectedRoots, runtimePolicy);
30
+ const agentConcurrencyLimit = await selectedConcurrency(invocation, configRoot);
31
+ const caseData = invocation.caseFile
32
+ ? await loadCase(invocation.caseFile)
33
+ : undefined;
34
+ const host = await candidateHost(invocation, agentConcurrencyLimit);
35
+ const semanticHost = await secondaryHost(invocation.semanticAdapterModule, invocation.semanticCodex, agentConcurrencyLimit);
36
+ const advisoryHost = await secondaryHost(invocation.advisoryAdapterModule, invocation.advisoryCodex, agentConcurrencyLimit);
37
+ return {
38
+ invocation,
39
+ runtimePolicy,
40
+ preparationSources,
41
+ caseData,
42
+ host,
43
+ semanticHost,
44
+ advisoryHost,
45
+ agentConcurrencyLimit,
46
+ };
47
+ }
48
+ function selectRuntimeTransport(invocation, policy) {
49
+ if (!runtimeNativeGoalEnabled(policy))
50
+ return;
51
+ if (invocation.codex)
52
+ selectCodexGoalTransport(invocation.codex);
53
+ }
54
+ function selectCodexGoalTransport(codex) {
55
+ if (codex.entrypoint === "exec")
56
+ throw new InvocationError("native-goal runtime policy requires Codex app-server");
57
+ codex.entrypoint = "app-server";
58
+ }
59
+ function warnDeprecatedRuntimeOptions(invocation) {
60
+ for (const option of invocation.deprecatedRuntimeOptions)
61
+ console.warn(`--${option} is deprecated; declare the runtime in sevro.json or --runtime-config-file instead`);
62
+ }
63
+ function requireRuntimeOptionCompatibility(invocation, policy) {
64
+ if (policy && invocation.deprecatedRuntimeOptions.length)
65
+ throw new InvocationError("runtime configuration cannot be combined with deprecated runtime options");
66
+ }
67
+ function validateInvocationRuntime(protectedRoots, policy) {
68
+ if (!policy)
69
+ return;
70
+ requireRuntimeReadRoots(policy.readOnlyRoots, protectedRoots);
71
+ requireRuntimeReadRoots((policy.seeds ?? []).map((seed) => seed.source), protectedRoots);
72
+ }
73
+ async function invocationProtectedRuntimeRoots(invocation) {
74
+ const protectedRoots = [
75
+ runnerRoot,
76
+ invocation.projectRoot,
77
+ invocation.configRoot,
78
+ invocation.resultsRoot,
79
+ invocation.runStateRoot,
80
+ ...nativeRoutes(invocation).flatMap((host) => host.additionalProtectedRoots),
81
+ ...(invocation.shellIsolation?.protectedRoots ?? []),
82
+ ];
83
+ return Promise.all(protectedRoots.map(canonicalRuntimeRoot));
84
+ }
85
+ function mappedSourceRoots(preparationSources) {
86
+ return Object.values(preparationSources?.refs ?? {}).map((url) => fileURLToPath(url));
87
+ }
88
+ //# sourceMappingURL=preparation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preparation.js","sourceRoot":"","sources":["preparation.ts"],"names":[],"mappings":"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","sourcesContent":["import { runnerRoot } from \"../runner-paths\";\nimport { fileURLToPath } from \"node:url\";\nimport { configurationRoot } from \"../hosts/codex-configuration\";\nimport {\n InvocationError,\n parseInvocation,\n nativeRoutes,\n type Invocation,\n} from \"./invocation\";\nimport {\n loadRuntimeConfiguration,\n runtimeNativeGoalEnabled,\n} from \"../runtime/config\";\nimport {\n canonicalRuntimeRoot,\n requireRuntimeReadRoots,\n} from \"../runtime/paths\";\nimport { loadCase, loadPreparationSources } from \"./loading\";\nimport { candidateHost, secondaryHost, selectedConcurrency } from \"./hosts\";\n\ntype PreparationSources = Awaited<ReturnType<typeof loadPreparationSources>>;\n\nfunction protectMappedSources(\n invocation: Invocation,\n preparationSources: PreparationSources,\n): void {\n const sourceRoots = mappedSourceRoots(preparationSources);\n for (const native of nativeRoutes(invocation)) {\n native.additionalProtectedRoots = [\n ...native.additionalProtectedRoots,\n ...sourceRoots,\n ];\n }\n invocation.shellIsolation?.protectedRoots.push(...sourceRoots);\n}\n\nexport async function prepareRunInvocation(argv: string[]) {\n const invocation = await parseInvocation(argv);\n warnDeprecatedRuntimeOptions(invocation);\n const preparationSources = await loadPreparationSources(invocation);\n protectMappedSources(invocation, preparationSources);\n const protectedRoots = await invocationProtectedRuntimeRoots(invocation);\n const runtimePolicy = await loadRuntimeConfiguration(\n invocation.projectRoot,\n invocation.runtimeConfigFile,\n protectedRoots,\n );\n requireRuntimeOptionCompatibility(invocation, runtimePolicy);\n selectRuntimeTransport(invocation, runtimePolicy);\n const configRoot = await configurationRoot(invocation.configRoot);\n validateInvocationRuntime(protectedRoots, runtimePolicy);\n const agentConcurrencyLimit = await selectedConcurrency(\n invocation,\n configRoot,\n );\n const caseData = invocation.caseFile\n ? await loadCase(invocation.caseFile)\n : undefined;\n const host = await candidateHost(invocation, agentConcurrencyLimit);\n const semanticHost = await secondaryHost(\n invocation.semanticAdapterModule,\n invocation.semanticCodex,\n agentConcurrencyLimit,\n );\n const advisoryHost = await secondaryHost(\n invocation.advisoryAdapterModule,\n invocation.advisoryCodex,\n agentConcurrencyLimit,\n );\n return {\n invocation,\n runtimePolicy,\n preparationSources,\n caseData,\n host,\n semanticHost,\n advisoryHost,\n agentConcurrencyLimit,\n };\n}\n\nfunction selectRuntimeTransport(\n invocation: Invocation,\n policy: Awaited<ReturnType<typeof loadRuntimeConfiguration>>,\n): void {\n if (!runtimeNativeGoalEnabled(policy)) return;\n if (invocation.codex) selectCodexGoalTransport(invocation.codex);\n}\n\nfunction selectCodexGoalTransport(\n codex: NonNullable<Invocation[\"codex\"]>,\n): void {\n if (codex.entrypoint === \"exec\")\n throw new InvocationError(\n \"native-goal runtime policy requires Codex app-server\",\n );\n codex.entrypoint = \"app-server\";\n}\n\nfunction warnDeprecatedRuntimeOptions(invocation: Invocation): void {\n for (const option of invocation.deprecatedRuntimeOptions)\n console.warn(\n `--${option} is deprecated; declare the runtime in sevro.json or --runtime-config-file instead`,\n );\n}\n\nfunction requireRuntimeOptionCompatibility(\n invocation: Invocation,\n policy: Awaited<ReturnType<typeof loadRuntimeConfiguration>>,\n): void {\n if (policy && invocation.deprecatedRuntimeOptions.length)\n throw new InvocationError(\n \"runtime configuration cannot be combined with deprecated runtime options\",\n );\n}\n\nexport type PreparedInvocation = Awaited<\n ReturnType<typeof prepareRunInvocation>\n>;\n\nfunction validateInvocationRuntime(\n protectedRoots: string[],\n policy: Awaited<ReturnType<typeof loadRuntimeConfiguration>>,\n): void {\n if (!policy) return;\n requireRuntimeReadRoots(policy.readOnlyRoots, protectedRoots);\n requireRuntimeReadRoots(\n (policy.seeds ?? []).map((seed) => seed.source),\n protectedRoots,\n );\n}\n\nasync function invocationProtectedRuntimeRoots(\n invocation: Invocation,\n): Promise<string[]> {\n const protectedRoots = [\n runnerRoot,\n invocation.projectRoot,\n invocation.configRoot,\n invocation.resultsRoot,\n invocation.runStateRoot,\n ...nativeRoutes(invocation).flatMap(\n (host) => host.additionalProtectedRoots,\n ),\n ...(invocation.shellIsolation?.protectedRoots ?? []),\n ];\n return Promise.all(protectedRoots.map(canonicalRuntimeRoot));\n}\n\nfunction mappedSourceRoots(preparationSources: PreparationSources): string[] {\n return Object.values(preparationSources?.refs ?? {}).map((url) =>\n fileURLToPath(url),\n );\n}\n"]}
@@ -0,0 +1,61 @@
1
+ import { EvaluationConfigurationError } from "../engine.js";
2
+ import { InvocationError } from "./invocation.js";
3
+ import { assertCliResult } from "../schema.js";
4
+ import { displayMeasurements, displayTrialSummary } from "./summary.js";
5
+ function failure(code, message) {
6
+ const result = {
7
+ format: "sevro.cli-result.v1",
8
+ runId: null,
9
+ execution: { status: "not_run" },
10
+ grading: { status: "not_requested" },
11
+ task: { verdict: "not_assessed" },
12
+ exitCode: code,
13
+ evidencePath: null,
14
+ cases: [],
15
+ diagnostic: {
16
+ code: code === 64 ? "sevro.invocation.invalid" : "sevro.runner.error",
17
+ message: message.slice(0, 4096),
18
+ },
19
+ };
20
+ assertCliResult(result);
21
+ return result;
22
+ }
23
+ export function display(result, json, completion) {
24
+ assertCliResult(result);
25
+ if (result.diagnostic)
26
+ process.stderr.write(`sevro: ${result.diagnostic.message}\n`);
27
+ if (json) {
28
+ process.stdout.write(`${JSON.stringify(result)}\n`);
29
+ return;
30
+ }
31
+ process.stdout.write(`execution=${result.execution.status} grading=${result.grading.status} task=${result.task.verdict}\n`);
32
+ displayTrialSummary(result);
33
+ displayDomainOutcomes(result.cases);
34
+ if (completion) {
35
+ displayMeasurements(completion.report);
36
+ process.stdout.write(`result=${completion.resultFile}\n`);
37
+ }
38
+ if (result.evidencePath)
39
+ process.stdout.write(`evidence=${result.evidencePath}\n`);
40
+ }
41
+ function displayDomainOutcomes(cases) {
42
+ for (const selected of cases)
43
+ for (const trial of selected.trials)
44
+ for (const outcome of trial.domainOutcomes ?? [])
45
+ process.stdout.write(`domain case=${selected.caseId} trial=${trial.trial} outcome=${outcome.id} status=${outcome.status}\n`);
46
+ }
47
+ export function runnerFailureCategory(error) {
48
+ return error instanceof EvaluationConfigurationError ||
49
+ error instanceof InvocationError
50
+ ? 64
51
+ : 70;
52
+ }
53
+ export function displayFailure(error, json, code, fallback, helpCommand = "run") {
54
+ display(failure(code, error instanceof Error ? error.message : fallback), json);
55
+ const help = helpCommand ? `sevro ${helpCommand} --help` : "sevro --help";
56
+ process.stderr.write(code === 64
57
+ ? `Correct the named option or input and retry. Run ${help} for examples and required options.\n`
58
+ : "Check the reported path and ensure --results-root and --run-state-root are writable directories, then retry.\n");
59
+ process.exitCode = code;
60
+ }
61
+ //# sourceMappingURL=presentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation.js","sourceRoot":"","sources":["presentation.ts"],"names":[],"mappings":"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","sourcesContent":["import { EvaluationConfigurationError } from \"../engine\";\nimport { InvocationError } from \"./invocation\";\nimport { assertCliResult } from \"../schema\";\nimport type { ReportData } from \"../schema-types\";\nimport { displayMeasurements, displayTrialSummary } from \"./summary\";\n\nfunction failure(code: 64 | 70, message: string) {\n const result = {\n format: \"sevro.cli-result.v1\",\n runId: null,\n execution: { status: \"not_run\" },\n grading: { status: \"not_requested\" },\n task: { verdict: \"not_assessed\" },\n exitCode: code,\n evidencePath: null,\n cases: [],\n diagnostic: {\n code: code === 64 ? \"sevro.invocation.invalid\" : \"sevro.runner.error\",\n message: message.slice(0, 4096),\n },\n };\n assertCliResult(result);\n return result;\n}\n\nexport function display(\n result: unknown,\n json: boolean,\n completion?: { resultFile: string; report: ReportData },\n): void {\n assertCliResult(result);\n if (result.diagnostic)\n process.stderr.write(`sevro: ${result.diagnostic.message}\\n`);\n if (json) {\n process.stdout.write(`${JSON.stringify(result)}\\n`);\n return;\n }\n process.stdout.write(\n `execution=${result.execution.status} grading=${result.grading.status} task=${result.task.verdict}\\n`,\n );\n displayTrialSummary(result);\n displayDomainOutcomes(result.cases);\n if (completion) {\n displayMeasurements(completion.report);\n process.stdout.write(`result=${completion.resultFile}\\n`);\n }\n if (result.evidencePath)\n process.stdout.write(`evidence=${result.evidencePath}\\n`);\n}\n\nfunction displayDomainOutcomes(\n cases: Array<{\n caseId: string;\n trials: Array<{\n trial: number;\n domainOutcomes?: Array<{ id: string; status: string }>;\n }>;\n }>,\n): void {\n for (const selected of cases)\n for (const trial of selected.trials)\n for (const outcome of trial.domainOutcomes ?? [])\n process.stdout.write(\n `domain case=${selected.caseId} trial=${trial.trial} outcome=${outcome.id} status=${outcome.status}\\n`,\n );\n}\n\nexport function runnerFailureCategory(error: unknown): 64 | 70 {\n return error instanceof EvaluationConfigurationError ||\n error instanceof InvocationError\n ? 64\n : 70;\n}\n\nexport function displayFailure(\n error: unknown,\n json: boolean,\n code: 64 | 70,\n fallback: string,\n helpCommand = \"run\",\n): void {\n display(\n failure(code, error instanceof Error ? error.message : fallback),\n json,\n );\n const help = helpCommand ? `sevro ${helpCommand} --help` : \"sevro --help\";\n process.stderr.write(\n code === 64\n ? `Correct the named option or input and retry. Run ${help} for examples and required options.\\n`\n : \"Check the reported path and ensure --results-root and --run-state-root are writable directories, then retry.\\n\",\n );\n process.exitCode = code;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export function displayProgress(event) {
2
+ const trial = event.trial === undefined ? "" : ` trial=${event.trial}`;
3
+ process.stderr.write(`sevro: ${event.stage} ${event.status}${trial}\n`);
4
+ }
5
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["progress.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,KAAyB;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,KAAK,EAAE,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC;AAC1E,CAAC","sourcesContent":["import type { EvaluationProgress } from \"../evaluation/types\";\n\nexport function displayProgress(event: EvaluationProgress): void {\n const trial = event.trial === undefined ? \"\" : ` trial=${event.trial}`;\n process.stderr.write(`sevro: ${event.stage} ${event.status}${trial}\\n`);\n}\n"]}
@@ -0,0 +1,108 @@
1
+ import { lstat, readFile, realpath } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import { isRecord, isStringArray } from "../value-guards.js";
4
+ import { CLI_ONLY, LIST_OPTIONS, NUMBER_OPTIONS, PATH_OPTIONS, PATH_LIST_OPTIONS, RUN_OPTIONS, } from "./run-options.js";
5
+ import { overrideRunSelections } from "./run-overrides.js";
6
+ const FILE_LIMIT = 64 * 1024;
7
+ function fieldError(field, requirement) {
8
+ throw new Error(`run manifest ${field}: ${requirement}`);
9
+ }
10
+ function manifestSettings(value) {
11
+ if (!isRecord(value))
12
+ fieldError("$", "expected an object");
13
+ validateManifestFields(value);
14
+ if (value.format !== "sevro.run.v1")
15
+ fieldError("format", 'expected "sevro.run.v1"');
16
+ if (!isRecord(value.settings))
17
+ fieldError("settings", "expected an object of run options");
18
+ return value.settings;
19
+ }
20
+ function validateManifestFields(value) {
21
+ for (const key of Object.keys(value))
22
+ if (!["format", "settings"].includes(key))
23
+ fieldError(key, "unknown field; use format and settings");
24
+ }
25
+ function finiteNumber(value) {
26
+ return typeof value === "number" && Number.isFinite(value);
27
+ }
28
+ function nonemptyString(value) {
29
+ return typeof value === "string" && Boolean(value.trim());
30
+ }
31
+ function nonemptyStringList(value) {
32
+ return isStringArray(value) && value.every(nonemptyString);
33
+ }
34
+ function validateSetting(name, value) {
35
+ if (!Object.hasOwn(RUN_OPTIONS, name) || CLI_ONLY.has(name))
36
+ fieldError(`settings.${name}`, "unknown saved option; see sevro run --help");
37
+ if (NUMBER_OPTIONS.has(name)) {
38
+ if (!finiteNumber(value))
39
+ fieldError(`settings.${name}`, "expected a finite number");
40
+ return;
41
+ }
42
+ validateOrdinarySetting(name, value);
43
+ }
44
+ function validateOrdinarySetting(name, value) {
45
+ if (LIST_OPTIONS.has(name)) {
46
+ if (!nonemptyStringList(value))
47
+ fieldError(`settings.${name}`, "expected an array of nonempty strings");
48
+ return;
49
+ }
50
+ const option = RUN_OPTIONS[name];
51
+ validateScalar(name, value, option.type);
52
+ }
53
+ function validateScalar(name, value, type) {
54
+ if (type === "boolean") {
55
+ if (typeof value !== "boolean")
56
+ fieldError(`settings.${name}`, "expected a boolean");
57
+ }
58
+ else if (!nonemptyString(value))
59
+ fieldError(`settings.${name}`, "expected a nonempty string");
60
+ }
61
+ function resolvedSetting(name, value, base) {
62
+ const pathOption = PATH_OPTIONS.includes(name);
63
+ if (pathOption)
64
+ return resolve(base, value);
65
+ if (PATH_LIST_OPTIONS.includes(name))
66
+ return value.map((path) => resolve(base, path));
67
+ return NUMBER_OPTIONS.has(name) ? String(value) : value;
68
+ }
69
+ async function readManifest(path) {
70
+ const stat = await lstat(path);
71
+ if (!stat.isFile() || stat.size > FILE_LIMIT)
72
+ fieldError("$", "use a regular, non-symlink JSON file of at most 64 KiB");
73
+ const source = await readFile(path, "utf8");
74
+ let value;
75
+ try {
76
+ value = JSON.parse(source);
77
+ }
78
+ catch (cause) {
79
+ throw new Error("run manifest $: invalid JSON; check the JSON syntax", {
80
+ cause,
81
+ });
82
+ }
83
+ const settings = manifestSettings(value);
84
+ const base = dirname(await realpath(path));
85
+ const resolved = {};
86
+ for (const [name, setting] of Object.entries(settings)) {
87
+ validateSetting(name, setting);
88
+ resolved[name] = resolvedSetting(name, setting, base);
89
+ }
90
+ return resolved;
91
+ }
92
+ /** Explicit flags replace saved selections and lists; defaults are applied later. */
93
+ export async function savedRunValues(explicit) {
94
+ const file = explicit["run-manifest-file"];
95
+ if (!file)
96
+ return explicit;
97
+ const path = resolve(file);
98
+ try {
99
+ const saved = await readManifest(path);
100
+ overrideRunSelections(saved, explicit);
101
+ return { ...saved, ...explicit };
102
+ }
103
+ catch (cause) {
104
+ const detail = cause instanceof Error ? cause.message : "cannot read file";
105
+ throw new Error(`--run-manifest-file ${path}: ${detail}; correct the named field or select a readable manifest`, { cause });
106
+ }
107
+ }
108
+ //# sourceMappingURL=run-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-manifest.js","sourceRoot":"","sources":["run-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstat, readFile, realpath } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { isRecord, isStringArray } from \"../value-guards\";\nimport {\n CLI_ONLY,\n LIST_OPTIONS,\n NUMBER_OPTIONS,\n PATH_OPTIONS,\n PATH_LIST_OPTIONS,\n RUN_OPTIONS,\n type RunValues,\n} from \"./run-options\";\nimport { overrideRunSelections } from \"./run-overrides\";\n\nconst FILE_LIMIT = 64 * 1024;\n\nfunction fieldError(field: string, requirement: string): never {\n throw new Error(`run manifest ${field}: ${requirement}`);\n}\n\nfunction manifestSettings(value: unknown): Record<string, unknown> {\n if (!isRecord(value)) fieldError(\"$\", \"expected an object\");\n validateManifestFields(value);\n if (value.format !== \"sevro.run.v1\")\n fieldError(\"format\", 'expected \"sevro.run.v1\"');\n if (!isRecord(value.settings))\n fieldError(\"settings\", \"expected an object of run options\");\n return value.settings;\n}\n\nfunction validateManifestFields(value: Record<string, unknown>): void {\n for (const key of Object.keys(value))\n if (![\"format\", \"settings\"].includes(key))\n fieldError(key, \"unknown field; use format and settings\");\n}\n\nfunction finiteNumber(value: unknown): boolean {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction nonemptyString(value: unknown): boolean {\n return typeof value === \"string\" && Boolean(value.trim());\n}\n\nfunction nonemptyStringList(value: unknown): boolean {\n return isStringArray(value) && value.every(nonemptyString);\n}\n\nfunction validateSetting(name: string, value: unknown): void {\n if (!Object.hasOwn(RUN_OPTIONS, name) || CLI_ONLY.has(name))\n fieldError(\n `settings.${name}`,\n \"unknown saved option; see sevro run --help\",\n );\n if (NUMBER_OPTIONS.has(name)) {\n if (!finiteNumber(value))\n fieldError(`settings.${name}`, \"expected a finite number\");\n return;\n }\n validateOrdinarySetting(name, value);\n}\n\nfunction validateOrdinarySetting(name: string, value: unknown): void {\n if (LIST_OPTIONS.has(name)) {\n if (!nonemptyStringList(value))\n fieldError(`settings.${name}`, \"expected an array of nonempty strings\");\n return;\n }\n const option = RUN_OPTIONS[name as keyof typeof RUN_OPTIONS];\n validateScalar(name, value, option.type);\n}\n\nfunction validateScalar(name: string, value: unknown, type: string): void {\n if (type === \"boolean\") {\n if (typeof value !== \"boolean\")\n fieldError(`settings.${name}`, \"expected a boolean\");\n } else if (!nonemptyString(value))\n fieldError(`settings.${name}`, \"expected a nonempty string\");\n}\n\nfunction resolvedSetting(name: string, value: unknown, base: string) {\n const pathOption = (PATH_OPTIONS as readonly string[]).includes(name);\n if (pathOption) return resolve(base, value as string);\n if ((PATH_LIST_OPTIONS as readonly string[]).includes(name))\n return (value as string[]).map((path) => resolve(base, path));\n return NUMBER_OPTIONS.has(name) ? String(value) : value;\n}\n\nasync function readManifest(path: string): Promise<RunValues> {\n const stat = await lstat(path);\n if (!stat.isFile() || stat.size > FILE_LIMIT)\n fieldError(\"$\", \"use a regular, non-symlink JSON file of at most 64 KiB\");\n const source = await readFile(path, \"utf8\");\n let value: unknown;\n try {\n value = JSON.parse(source);\n } catch (cause) {\n throw new Error(\"run manifest $: invalid JSON; check the JSON syntax\", {\n cause,\n });\n }\n const settings = manifestSettings(value);\n const base = dirname(await realpath(path));\n const resolved: Record<string, unknown> = {};\n for (const [name, setting] of Object.entries(settings)) {\n validateSetting(name, setting);\n resolved[name] = resolvedSetting(name, setting, base);\n }\n return resolved;\n}\n\n/** Explicit flags replace saved selections and lists; defaults are applied later. */\nexport async function savedRunValues(explicit: RunValues): Promise<RunValues> {\n const file = explicit[\"run-manifest-file\"];\n if (!file) return explicit;\n const path = resolve(file);\n try {\n const saved = await readManifest(path);\n overrideRunSelections(saved, explicit);\n return { ...saved, ...explicit };\n } catch (cause) {\n const detail = cause instanceof Error ? cause.message : \"cannot read file\";\n throw new Error(\n `--run-manifest-file ${path}: ${detail}; correct the named field or select a readable manifest`,\n { cause },\n );\n }\n}\n"]}