@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 @@
1
+ {"version":3,"file":"case-validation.js","sourceRoot":"","sources":["case-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ResolvedCase } from \"./engine\";\nimport { prepareGeneratedFixture } from \"./fixtures/generated\";\nimport { prepareRepositoryFixture } from \"./fixtures/repository\";\nimport { isOptionalNonblankString, isRecord } from \"./value-guards\";\n\nfunction fixtureDeclarationIssue(\n value: Record<string, unknown>,\n): string | undefined {\n try {\n if (value.kind === \"generated\") prepareGeneratedFixture(value);\n else prepareRepositoryFixture({ kind: \"repository\", ...value });\n return undefined;\n } catch (error) {\n const detail =\n error instanceof Error ? error.message : \"invalid declaration\";\n return `fixture: ${detail}; correct the fixture declaration`;\n }\n}\n\nexport function validInlineFixture(value: Record<string, unknown>): boolean {\n return (\n !Object.hasOwn(value, \"sourceRef\") &&\n Object.hasOwn(value, \"files\") &&\n isRecord(value.files) &&\n Object.values(value.files).every((content) => typeof content === \"string\")\n );\n}\n\nfunction inlineFixtureIssue(\n value: Record<string, unknown>,\n): string | undefined {\n if (!Object.hasOwn(value, \"files\") || !isRecord(value.files))\n return \"fixture.files: expected an object mapping file paths to string contents\";\n const entry = Object.entries(value.files).find(\n ([, content]) => typeof content !== \"string\",\n );\n return entry\n ? `fixture.files[${JSON.stringify(entry[0])}]: expected string contents`\n : undefined;\n}\n\nfunction fixtureIssue(value: unknown): string | undefined {\n if (!isRecord(value)) return \"fixture: expected an object\";\n if (value.kind === \"generated\") return fixtureDeclarationIssue(value);\n if (value.kind !== undefined)\n return \"fixture.kind: omit for inline/repository fixtures, or use generated\";\n if (Object.hasOwn(value, \"sourceRef\")) return fixtureDeclarationIssue(value);\n return inlineFixtureIssue(value);\n}\n\nfunction nonemptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction caseDetailsIssue(value: Record<string, unknown>): string | undefined {\n for (const field of [\"id\", \"prompt\"])\n if (!nonemptyString(value[field]))\n return `${field}: expected a nonempty string`;\n if (!isOptionalNonblankString(value.followUpPrompt))\n return \"followUpPrompt: omit or supply a nonblank string\";\n return fixtureIssue(value.fixture);\n}\n\nfunction checkIssue(value: unknown, location: string): string | undefined {\n if (!isRecord(value)) return `${location}: expected an object`;\n for (const field of [\"id\", \"grader\"])\n if (typeof value[field] !== \"string\")\n return `${location}.${field}: expected a string`;\n if (!isRecord(value.configuration))\n return `${location}.configuration: expected an object`;\n return undefined;\n}\n\nfunction checksIssue(value: unknown): string | undefined {\n if (!Array.isArray(value))\n return \"checks: expected an array of check objects\";\n for (const [index, check] of value.entries()) {\n const issue = checkIssue(check, `checks[${index}]`);\n if (issue) return issue;\n }\n return undefined;\n}\n\nfunction requiredEvidenceIssue(value: unknown): string | undefined {\n if (!Array.isArray(value))\n return \"requiredEvidence: expected an array of strings\";\n const index = value.findIndex((entry: unknown) => typeof entry !== \"string\");\n return index < 0\n ? undefined\n : `requiredEvidence[${index}]: expected a string`;\n}\n\n/** Explain the first invalid field using the same checks as the case type guard. */\nexport function resolvedCaseIssue(value: unknown): string | undefined {\n if (!isRecord(value)) return \"case: expected an object\";\n return (\n caseDetailsIssue(value) ??\n checksIssue(value.checks) ??\n requiredEvidenceIssue(value.requiredEvidence)\n );\n}\n\nexport function isResolvedCase(value: unknown): value is ResolvedCase {\n return resolvedCaseIssue(value) === undefined;\n}\n"]}
@@ -0,0 +1,21 @@
1
+ export class CommandCancellation {
2
+ controller = new AbortController();
3
+ interrupt = () => {
4
+ this.controller.abort("SIGINT");
5
+ };
6
+ terminate = () => {
7
+ this.controller.abort("SIGTERM");
8
+ };
9
+ get signal() {
10
+ return this.controller.signal;
11
+ }
12
+ constructor() {
13
+ process.on("SIGINT", this.interrupt);
14
+ process.on("SIGTERM", this.terminate);
15
+ }
16
+ dispose() {
17
+ process.off("SIGINT", this.interrupt);
18
+ process.off("SIGTERM", this.terminate);
19
+ }
20
+ }
21
+ //# sourceMappingURL=cancellation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.js","sourceRoot":"","sources":["cancellation.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAmB;IACb,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,SAAS,GAAG,GAAG,EAAE;QAChC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC;IACe,SAAS,GAAG,GAAG,EAAE;QAChC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC,CAAC;IACF,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAChC,CAAC;IACD;QACE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IACD,OAAO;QACL,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;CACF","sourcesContent":["export class CommandCancellation {\n private readonly controller = new AbortController();\n private readonly interrupt = () => {\n this.controller.abort(\"SIGINT\");\n };\n private readonly terminate = () => {\n this.controller.abort(\"SIGTERM\");\n };\n get signal(): AbortSignal {\n return this.controller.signal;\n }\n constructor() {\n process.on(\"SIGINT\", this.interrupt);\n process.on(\"SIGTERM\", this.terminate);\n }\n dispose(): void {\n process.off(\"SIGINT\", this.interrupt);\n process.off(\"SIGTERM\", this.terminate);\n }\n}\n"]}
@@ -0,0 +1,60 @@
1
+ import { prepareRunInvocation } from "./preparation.js";
2
+ import { evaluateInvocation } from "./evaluation.js";
3
+ import { CommandCancellation } from "./cancellation.js";
4
+ import { display, displayFailure, runnerFailureCategory } from "./presentation.js";
5
+ import { displayEffectiveSettings } from "./settings.js";
6
+ import { jsonOutputRequested } from "./run-options.js";
7
+ import { retainCliResult } from "./completion.js";
8
+ export async function main(argv, release) {
9
+ const json = jsonOutputRequested(argv);
10
+ let prepared;
11
+ try {
12
+ prepared = await prepareRunInvocation(argv);
13
+ }
14
+ catch (error) {
15
+ await releaseBeforeDisplay(release, 64);
16
+ displayFailure(error, json, 64, "invalid invocation", argv[0] === "run" ? "run" : "");
17
+ return;
18
+ }
19
+ const cancellation = new CommandCancellation();
20
+ try {
21
+ displayEffectiveSettings(prepared);
22
+ const { result } = await evaluateInvocation(prepared, cancellation.signal);
23
+ const completion = await retainCompletion(result, prepared.invocation.resultsRoot);
24
+ await releaseBeforeDisplay(release, result.exitCode);
25
+ display(result, prepared.invocation.json, completion);
26
+ process.exitCode = result.exitCode;
27
+ }
28
+ catch (error) {
29
+ await releaseBeforeDisplay(release, 70);
30
+ displayFailure(error, prepared.invocation.json, runnerFailureCategory(error), "runner failure");
31
+ }
32
+ finally {
33
+ cancellation.dispose();
34
+ }
35
+ }
36
+ async function retainCompletion(result, resultsRoot) {
37
+ try {
38
+ return await retainCliResult(result, resultsRoot);
39
+ }
40
+ catch (cause) {
41
+ if (result.exitCode === 0)
42
+ throw new Error("CLI result/latest could not be retained; check --results-root permissions", { cause });
43
+ process.stderr.write("sevro: CLI result/latest could not be retained; original run outcome preserved; inspect evidence directly\n");
44
+ return undefined;
45
+ }
46
+ }
47
+ async function releaseBeforeDisplay(release, exitCode) {
48
+ try {
49
+ await release?.();
50
+ }
51
+ catch (error) {
52
+ if (exitCode === 0)
53
+ throw error;
54
+ const detail = error instanceof Error
55
+ ? error.message
56
+ : "temporary project could not be removed";
57
+ process.stderr.write(`sevro: demo cleanup failed: ${detail}\n`);
58
+ }
59
+ }
60
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["command.ts"],"names":[],"mappings":"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","sourcesContent":["import { prepareRunInvocation, type PreparedInvocation } from \"./preparation\";\nimport { evaluateInvocation } from \"./evaluation\";\nimport { CommandCancellation } from \"./cancellation\";\nimport { display, displayFailure, runnerFailureCategory } from \"./presentation\";\nimport { displayEffectiveSettings } from \"./settings\";\nimport { jsonOutputRequested } from \"./run-options\";\nimport { retainCliResult } from \"./completion\";\n\ntype CommandRelease = (() => Promise<void>) | undefined;\n\nexport async function main(\n argv: string[],\n release?: () => Promise<void>,\n): Promise<void> {\n const json = jsonOutputRequested(argv);\n let prepared: PreparedInvocation;\n try {\n prepared = await prepareRunInvocation(argv);\n } catch (error) {\n await releaseBeforeDisplay(release, 64);\n displayFailure(\n error,\n json,\n 64,\n \"invalid invocation\",\n argv[0] === \"run\" ? \"run\" : \"\",\n );\n return;\n }\n const cancellation = new CommandCancellation();\n try {\n displayEffectiveSettings(prepared);\n const { result } = await evaluateInvocation(prepared, cancellation.signal);\n const completion = await retainCompletion(\n result,\n prepared.invocation.resultsRoot,\n );\n await releaseBeforeDisplay(release, result.exitCode);\n display(result, prepared.invocation.json, completion);\n process.exitCode = result.exitCode;\n } catch (error) {\n await releaseBeforeDisplay(release, 70);\n displayFailure(\n error,\n prepared.invocation.json,\n runnerFailureCategory(error),\n \"runner failure\",\n );\n } finally {\n cancellation.dispose();\n }\n}\n\nasync function retainCompletion(\n result: Parameters<typeof retainCliResult>[0],\n resultsRoot: string,\n) {\n try {\n return await retainCliResult(result, resultsRoot);\n } catch (cause) {\n if (result.exitCode === 0)\n throw new Error(\n \"CLI result/latest could not be retained; check --results-root permissions\",\n { cause },\n );\n process.stderr.write(\n \"sevro: CLI result/latest could not be retained; original run outcome preserved; inspect evidence directly\\n\",\n );\n return undefined;\n }\n}\n\nasync function releaseBeforeDisplay(\n release: CommandRelease,\n exitCode: number,\n): Promise<void> {\n try {\n await release?.();\n } catch (error) {\n if (exitCode === 0) throw error;\n const detail =\n error instanceof Error\n ? error.message\n : \"temporary project could not be removed\";\n process.stderr.write(`sevro: demo cleanup failed: ${detail}\\n`);\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { dirname, join } from "node:path";
2
+ import { atomicWriteJson } from "../storage.js";
3
+ import { createReport } from "../report.js";
4
+ import { withResultsLock } from "../results-lock.js";
5
+ /** Latest means the last successfully retained CLI result, including dry/failing runs. */
6
+ export async function retainCliResult(result, resultsRoot) {
7
+ return withResultsLock(resultsRoot, async () => {
8
+ const resultFile = join(dirname(result.evidencePath), "result.json");
9
+ await atomicWriteJson(resultFile, result);
10
+ await atomicWriteJson(join(resultsRoot, "latest.json"), result);
11
+ return { resultFile, report: await createReport([resultFile]) };
12
+ });
13
+ }
14
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB;AAC1C,OAAO,EAAE,eAAe,EAAE,sBAAmB;AAE7C,OAAO,EAAE,YAAY,EAAE,qBAAkB;AACzC,OAAO,EAAE,eAAe,EAAE,2BAAwB;AAElD,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAiB,EAAE,WAAmB;IAC1E,OAAO,eAAe,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { dirname, join } from \"node:path\";\nimport { atomicWriteJson } from \"../storage\";\nimport type { CliResult } from \"../engine\";\nimport { createReport } from \"../report\";\nimport { withResultsLock } from \"../results-lock\";\n\n/** Latest means the last successfully retained CLI result, including dry/failing runs. */\nexport async function retainCliResult(result: CliResult, resultsRoot: string) {\n return withResultsLock(resultsRoot, async () => {\n const resultFile = join(dirname(result.evidencePath), \"result.json\");\n await atomicWriteJson(resultFile, result);\n await atomicWriteJson(join(resultsRoot, \"latest.json\"), result);\n return { resultFile, report: await createReport([resultFile]) };\n });\n}\n"]}
@@ -0,0 +1,45 @@
1
+ import { examplePath } from "../runner-paths.js";
2
+ import { mkdtemp, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { main } from "./command.js";
6
+ import { InvocationError } from "./invocation.js";
7
+ import { displayFailure } from "./presentation.js";
8
+ /** Run the packaged deterministic case without inheriting a caller's project policy. */
9
+ export async function demoCommand(argv) {
10
+ const json = argv.includes("--json");
11
+ if (argv.some((arg) => arg !== "--json")) {
12
+ displayFailure(new InvocationError("demo accepts only --json; run sevro demo --help"), json, 64, "invalid demo invocation", "demo");
13
+ return;
14
+ }
15
+ let projectRoot;
16
+ try {
17
+ projectRoot = await mkdtemp(join(tmpdir(), "sevro-demo-"));
18
+ }
19
+ catch (cause) {
20
+ displayFailure(new Error(`demo temporary project could not be created under ${tmpdir()}; set TMPDIR to a writable directory`, { cause }), json, 70, "demo preparation failed");
21
+ return;
22
+ }
23
+ await main([
24
+ "run",
25
+ ...(json ? ["--json"] : []),
26
+ "--case-file",
27
+ examplePath("basic", "graded.json"),
28
+ "--adapter-module",
29
+ examplePath("basic", "host.ts"),
30
+ "--project-root",
31
+ projectRoot,
32
+ "--results-root",
33
+ join(process.cwd(), ".sevro", "results"),
34
+ ], demoCleanup(projectRoot));
35
+ }
36
+ function demoCleanup(projectRoot) {
37
+ let attempted = false;
38
+ return async () => {
39
+ if (attempted)
40
+ return;
41
+ attempted = true;
42
+ await rm(projectRoot, { recursive: true, force: true });
43
+ };
44
+ }
45
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,2BAAwB;AAC9C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,yBAAyB;AAC/C,OAAO,EAAE,MAAM,EAAE,gBAAgB;AACjC,OAAO,EAAE,IAAI,EAAE,kBAAkB;AACjC,OAAO,EAAE,IAAI,EAAE,qBAAkB;AACjC,OAAO,EAAE,eAAe,EAAE,wBAAqB;AAC/C,OAAO,EAAE,cAAc,EAAE,0BAAuB;AAEhD,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,EAAE,CAAC;QACzC,cAAc,CACZ,IAAI,eAAe,CAAC,iDAAiD,CAAC,EACtE,IAAI,EACJ,EAAE,EACF,yBAAyB,EACzB,MAAM,CACP,CAAC;QACF,OAAO;IACT,CAAC;IACD,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,CACZ,IAAI,KAAK,CACP,qDAAqD,MAAM,EAAE,sCAAsC,EACnG,EAAE,KAAK,EAAE,CACV,EACD,IAAI,EACJ,EAAE,EACF,yBAAyB,CAC1B,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,IAAI,CACR;QACE,KAAK;QACL,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,aAAa;QACb,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC;QACnC,kBAAkB;QAClB,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC;QAC/B,gBAAgB;QAChB,WAAW;QACX,gBAAgB;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC;KACzC,EACD,WAAW,CAAC,WAAW,CAAC,CACzB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,WAAmB;IACtC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO,KAAK,IAAI,EAAE;QAChB,IAAI,SAAS;YAAE,OAAO;QACtB,SAAS,GAAG,IAAI,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { examplePath } from \"../runner-paths\";\nimport { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { main } from \"./command\";\nimport { InvocationError } from \"./invocation\";\nimport { displayFailure } from \"./presentation\";\n\n/** Run the packaged deterministic case without inheriting a caller's project policy. */\nexport async function demoCommand(argv: string[]): Promise<void> {\n const json = argv.includes(\"--json\");\n if (argv.some((arg) => arg !== \"--json\")) {\n displayFailure(\n new InvocationError(\"demo accepts only --json; run sevro demo --help\"),\n json,\n 64,\n \"invalid demo invocation\",\n \"demo\",\n );\n return;\n }\n let projectRoot: string;\n try {\n projectRoot = await mkdtemp(join(tmpdir(), \"sevro-demo-\"));\n } catch (cause) {\n displayFailure(\n new Error(\n `demo temporary project could not be created under ${tmpdir()}; set TMPDIR to a writable directory`,\n { cause },\n ),\n json,\n 70,\n \"demo preparation failed\",\n );\n return;\n }\n await main(\n [\n \"run\",\n ...(json ? [\"--json\"] : []),\n \"--case-file\",\n examplePath(\"basic\", \"graded.json\"),\n \"--adapter-module\",\n examplePath(\"basic\", \"host.ts\"),\n \"--project-root\",\n projectRoot,\n \"--results-root\",\n join(process.cwd(), \".sevro\", \"results\"),\n ],\n demoCleanup(projectRoot),\n );\n}\n\nfunction demoCleanup(projectRoot: string): () => Promise<void> {\n let attempted = false;\n return async () => {\n if (attempted) return;\n attempted = true;\n await rm(projectRoot, { recursive: true, force: true });\n };\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import { runEvaluation } from "../engine.js";
2
+ import { packageBuildDigest, projectIdentityDigest, projectProvenance, } from "../provenance.js";
3
+ import { selectedCase } from "./extension.js";
4
+ import { assessmentSettings, effectiveSettings } from "./settings.js";
5
+ import { displayProgress } from "./progress.js";
6
+ export async function evaluateInvocation(prepared, signal) {
7
+ const { invocation, preparationSources, host, semanticHost, advisoryHost } = prepared;
8
+ const { caseData, extension } = await selectedCase(prepared, signal);
9
+ return runEvaluation({
10
+ onProgress: displayProgress,
11
+ resolvedRunSettings: effectiveSettings(prepared),
12
+ assessmentSettings: assessmentSettings(prepared),
13
+ runtimePolicy: prepared.runtimePolicy,
14
+ projectRoot: invocation.projectRoot,
15
+ resultsRoot: invocation.resultsRoot,
16
+ runStateRoot: invocation.runStateRoot,
17
+ case: caseData,
18
+ extension,
19
+ preparationSources,
20
+ host,
21
+ semanticHost,
22
+ advisoryHost,
23
+ advisoryExcludedPaths: invocation.advisoryExcludedPaths,
24
+ shellIsolation: invocation.shellIsolation,
25
+ runnerBuildDigest: invocation.runnerBuildDigest ?? (await packageBuildDigest()),
26
+ runnerCheckoutRoot: invocation.runnerCheckoutRoot,
27
+ projectDigest: invocation.projectDigest ??
28
+ (await projectIdentityDigest(invocation.projectRoot, await projectProvenance(invocation.projectRoot, [
29
+ invocation.resultsRoot,
30
+ invocation.runStateRoot,
31
+ ]), [invocation.resultsRoot, invocation.runStateRoot])),
32
+ condition: invocation.condition,
33
+ trialCount: invocation.trialCount,
34
+ jobs: invocation.jobs,
35
+ passThreshold: invocation.passThreshold,
36
+ dry: invocation.dry,
37
+ signal,
38
+ });
39
+ }
40
+ //# sourceMappingURL=evaluation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluation.js","sourceRoot":"","sources":["evaluation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAkB;AAC1C,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,yBAAsB;AACvB,OAAO,EAAE,YAAY,EAAE,uBAAoB;AAE3C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,sBAAmB;AACnE,OAAO,EAAE,eAAe,EAAE,sBAAmB;AAE7C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAA4B,EAC5B,MAAmB;IAEnB,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,GACxE,QAAQ,CAAC;IACX,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrE,OAAO,aAAa,CAAC;QACnB,UAAU,EAAE,eAAe;QAC3B,mBAAmB,EAAE,iBAAiB,CAAC,QAAQ,CAAC;QAChD,kBAAkB,EAAE,kBAAkB,CAAC,QAAQ,CAAC;QAChD,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,IAAI,EAAE,QAAQ;QACd,SAAS;QACT,kBAAkB;QAClB,IAAI;QACJ,YAAY;QACZ,YAAY;QACZ,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;QACvD,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,iBAAiB,EACf,UAAU,CAAC,iBAAiB,IAAI,CAAC,MAAM,kBAAkB,EAAE,CAAC;QAC9D,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;QACjD,aAAa,EACX,UAAU,CAAC,aAAa;YACxB,CAAC,MAAM,qBAAqB,CAC1B,UAAU,CAAC,WAAW,EACtB,MAAM,iBAAiB,CAAC,UAAU,CAAC,WAAW,EAAE;gBAC9C,UAAU,CAAC,WAAW;gBACtB,UAAU,CAAC,YAAY;aACxB,CAAC,EACF,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,YAAY,CAAC,CAClD,CAAC;QACJ,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,MAAM;KACP,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { runEvaluation } from \"../engine\";\nimport {\n packageBuildDigest,\n projectIdentityDigest,\n projectProvenance,\n} from \"../provenance\";\nimport { selectedCase } from \"./extension\";\nimport type { PreparedInvocation } from \"./preparation\";\nimport { assessmentSettings, effectiveSettings } from \"./settings\";\nimport { displayProgress } from \"./progress\";\n\nexport async function evaluateInvocation(\n prepared: PreparedInvocation,\n signal: AbortSignal,\n) {\n const { invocation, preparationSources, host, semanticHost, advisoryHost } =\n prepared;\n const { caseData, extension } = await selectedCase(prepared, signal);\n return runEvaluation({\n onProgress: displayProgress,\n resolvedRunSettings: effectiveSettings(prepared),\n assessmentSettings: assessmentSettings(prepared),\n runtimePolicy: prepared.runtimePolicy,\n projectRoot: invocation.projectRoot,\n resultsRoot: invocation.resultsRoot,\n runStateRoot: invocation.runStateRoot,\n case: caseData,\n extension,\n preparationSources,\n host,\n semanticHost,\n advisoryHost,\n advisoryExcludedPaths: invocation.advisoryExcludedPaths,\n shellIsolation: invocation.shellIsolation,\n runnerBuildDigest:\n invocation.runnerBuildDigest ?? (await packageBuildDigest()),\n runnerCheckoutRoot: invocation.runnerCheckoutRoot,\n projectDigest:\n invocation.projectDigest ??\n (await projectIdentityDigest(\n invocation.projectRoot,\n await projectProvenance(invocation.projectRoot, [\n invocation.resultsRoot,\n invocation.runStateRoot,\n ]),\n [invocation.resultsRoot, invocation.runStateRoot],\n )),\n condition: invocation.condition,\n trialCount: invocation.trialCount,\n jobs: invocation.jobs,\n passThreshold: invocation.passThreshold,\n dry: invocation.dry,\n signal,\n });\n}\n"]}
@@ -0,0 +1,54 @@
1
+ import { pathToFileURL } from "node:url";
2
+ import { openExtensionSession } from "../extension-session.js";
3
+ import { resolvedFixture } from "../resolved-case.js";
4
+ import { InvocationError } from "./invocation.js";
5
+ import { parseCase, loadExtensionOptions } from "./loading.js";
6
+ function selectExtensionCase(cases, caseId) {
7
+ const resolvedCase = cases.find((item) => item.id === caseId);
8
+ if (!resolvedCase)
9
+ throw new InvocationError("extension did not resolve the selected case");
10
+ const caseData = parseCase({
11
+ ...resolvedCase,
12
+ fixture: resolvedFixture(resolvedCase.fixture),
13
+ });
14
+ return { caseData, resolvedCase };
15
+ }
16
+ async function resolveSelectedExtension(prepared, selected, signal) {
17
+ const { invocation, host } = prepared;
18
+ const options = await loadExtensionOptions(selected);
19
+ const hostCapabilities = [
20
+ ...(host.instrumentation ?? []).map((item) => item.id),
21
+ ...(host.hostCapabilities ?? []),
22
+ ];
23
+ const session = await openExtensionSession({
24
+ ...options,
25
+ sourceFiles: selected.sourceFiles,
26
+ engineCapabilities: [
27
+ "sevro.host.exec",
28
+ "sevro.fixture.setup",
29
+ "sevro.case.host-route",
30
+ ],
31
+ hostCapabilities,
32
+ taskVerdictPolicy: selected.taskVerdictPolicy,
33
+ replaceBuiltinGraders: selected.replaceBuiltinGraders,
34
+ signal,
35
+ });
36
+ const chosen = selectExtensionCase(await session.resolve(pathToFileURL(invocation.projectRoot).href, { caseIds: [selected.caseId] }, {
37
+ id: host.id,
38
+ model: host.model,
39
+ effort: host.effort,
40
+ capabilities: hostCapabilities,
41
+ }), selected.caseId);
42
+ return {
43
+ caseData: chosen.caseData,
44
+ extension: { session, resolvedCase: chosen.resolvedCase },
45
+ };
46
+ }
47
+ export async function selectedCase(prepared, signal) {
48
+ if (prepared.invocation.extension)
49
+ return resolveSelectedExtension(prepared, prepared.invocation.extension, signal);
50
+ if (!prepared.caseData)
51
+ throw new InvocationError("invalid resolved case file");
52
+ return { caseData: prepared.caseData, extension: undefined };
53
+ }
54
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB;AAEzC,OAAO,EAAE,oBAAoB,EAAsB,gCAA6B;AAChF,OAAO,EAAE,eAAe,EAAE,4BAAyB;AACnD,OAAO,EAAE,eAAe,EAAmB,wBAAqB;AAChE,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,qBAAkB;AAG5D,SAAS,mBAAmB,CAC1B,KAAsB,EACtB,MAAc;IAEd,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAC9D,IAAI,CAAC,YAAY;QACf,MAAM,IAAI,eAAe,CAAC,6CAA6C,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,SAAS,CAAC;QACzB,GAAG,YAAY;QACf,OAAO,EAAE,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,QAA4B,EAC5B,QAA8C,EAC9C,MAAmB;IAEnB,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG;QACvB,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;KACjC,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC;QACzC,GAAG,OAAO;QACV,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,kBAAkB,EAAE;YAClB,iBAAiB;YACjB,qBAAqB;YACrB,uBAAuB;SACxB;QACD,gBAAgB;QAChB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC7C,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB;QACrD,MAAM;KACP,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,mBAAmB,CAChC,MAAM,OAAO,CAAC,OAAO,CACnB,aAAa,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,IAAI,EAC1C,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAC9B;QACE,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,YAAY,EAAE,gBAAgB;KAC/B,CACF,EACD,QAAQ,CAAC,MAAM,CAChB,CAAC;IACF,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE;KAC1D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA4B,EAC5B,MAAmB;IAEnB,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS;QAC/B,OAAO,wBAAwB,CAC7B,QAAQ,EACR,QAAQ,CAAC,UAAU,CAAC,SAAS,EAC7B,MAAM,CACP,CAAC;IACJ,IAAI,CAAC,QAAQ,CAAC,QAAQ;QACpB,MAAM,IAAI,eAAe,CAAC,4BAA4B,CAAC,CAAC;IAC1D,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC/D,CAAC","sourcesContent":["import { pathToFileURL } from \"node:url\";\nimport type { ResolvedCase } from \"../engine\";\nimport { openExtensionSession, type ExtensionCase } from \"../extension-session\";\nimport { resolvedFixture } from \"../resolved-case\";\nimport { InvocationError, type Invocation } from \"./invocation\";\nimport { parseCase, loadExtensionOptions } from \"./loading\";\nimport type { PreparedInvocation } from \"./preparation\";\n\nfunction selectExtensionCase(\n cases: ExtensionCase[],\n caseId: string,\n): { caseData: ResolvedCase; resolvedCase: ExtensionCase } {\n const resolvedCase = cases.find((item) => item.id === caseId);\n if (!resolvedCase)\n throw new InvocationError(\"extension did not resolve the selected case\");\n const caseData = parseCase({\n ...resolvedCase,\n fixture: resolvedFixture(resolvedCase.fixture),\n });\n return { caseData, resolvedCase };\n}\n\nasync function resolveSelectedExtension(\n prepared: PreparedInvocation,\n selected: NonNullable<Invocation[\"extension\"]>,\n signal: AbortSignal,\n) {\n const { invocation, host } = prepared;\n const options = await loadExtensionOptions(selected);\n const hostCapabilities = [\n ...(host.instrumentation ?? []).map((item) => item.id),\n ...(host.hostCapabilities ?? []),\n ];\n const session = await openExtensionSession({\n ...options,\n sourceFiles: selected.sourceFiles,\n engineCapabilities: [\n \"sevro.host.exec\",\n \"sevro.fixture.setup\",\n \"sevro.case.host-route\",\n ],\n hostCapabilities,\n taskVerdictPolicy: selected.taskVerdictPolicy,\n replaceBuiltinGraders: selected.replaceBuiltinGraders,\n signal,\n });\n const chosen = selectExtensionCase(\n await session.resolve(\n pathToFileURL(invocation.projectRoot).href,\n { caseIds: [selected.caseId] },\n {\n id: host.id,\n model: host.model,\n effort: host.effort,\n capabilities: hostCapabilities,\n },\n ),\n selected.caseId,\n );\n return {\n caseData: chosen.caseData,\n extension: { session, resolvedCase: chosen.resolvedCase },\n };\n}\n\nexport async function selectedCase(\n prepared: PreparedInvocation,\n signal: AbortSignal,\n) {\n if (prepared.invocation.extension)\n return resolveSelectedExtension(\n prepared,\n prepared.invocation.extension,\n signal,\n );\n if (!prepared.caseData)\n throw new InvocationError(\"invalid resolved case file\");\n return { caseData: prepared.caseData, extension: undefined };\n}\n"]}
@@ -0,0 +1,190 @@
1
+ import { RUN_OPTIONS, optionsWith } from "./run-options.js";
2
+ import packageJson from "../../../package.json" with { type: "json" };
3
+ const { version } = packageJson;
4
+ const TOP_LEVEL_HELP = `Usage: sevro <command> [options]
5
+
6
+ Examples:
7
+ sevro demo
8
+ sevro init --template response --directory ./my-evaluation
9
+ sevro run --case-file /absolute/case.json --adapter-module /absolute/adapter.js \\
10
+ --project-root /absolute/project --results-root /absolute/results \\
11
+ --condition passive --trials 1 --threshold 1
12
+ sevro run --help
13
+ sevro report --result-file /absolute/results/run/result.json
14
+ sevro prune
15
+
16
+ Commands:
17
+ demo Run the packaged credential-free assessed example; use demo --help.
18
+ init Create a new evaluation project; use init --help.
19
+ run Evaluate one resolved case or extension case; use run --help.
20
+ report Summarize retained results; use report --help.
21
+ prune Remove retained results using a retention policy; use prune --help.
22
+
23
+ Options:
24
+ -h, --help Show help without preparing a run.
25
+ -v, --version Print the installed Sevro package version.
26
+ `;
27
+ const RUN_HELP = `Usage: sevro run [options]
28
+
29
+ Examples:
30
+ sevro run --case-file /absolute/case.json --adapter-module /absolute/adapter.js \\
31
+ --project-root /absolute/project --results-root /absolute/results \\
32
+ --condition passive --trials 1 --threshold 1
33
+ Add --dry to prepare without calling the candidate or graders.
34
+ Add --json to save a sevro.cli-result.v1 result from stdout.
35
+
36
+ Required:
37
+ ${runOptionHelp("required")}
38
+
39
+ Common options and defaults:
40
+ ${runOptionHelp("common")}
41
+ Precedence: built-in defaults, saved settings, then explicit CLI options.
42
+ Manifest paths use its own directory; CLI paths use the current directory.
43
+ --no-dry, --no-shell-isolation and other --no-<boolean> flags override saved true.
44
+ Relative run paths resolve from the current directory and are canonicalized before protection checks.
45
+
46
+ Bundled hosts:
47
+ ${runOptionHelp("native")}
48
+ Native timeout defaults to 600000 ms; shell checks expect exit 0 within 30000 ms.
49
+
50
+ Extension cases:
51
+ ${runOptionHelp("extension")}
52
+
53
+ Optional grading routes (none selected by default):
54
+ ${runOptionHelp("grading")}
55
+
56
+ Provenance overrides (normally derived automatically):
57
+ ${runOptionHelp("provenance")}
58
+
59
+ Deprecated runtime options:
60
+ ${runOptionHelp("deprecated")}
61
+
62
+ -h, --help Show this help without preparing a run.
63
+ Reference: docs/development-cli.md, docs/run-settings-v1.md and docs/results-v1.md in the installed package.
64
+ `;
65
+ function runOptionHelp(section) {
66
+ return optionsWith("section", section)
67
+ .map((name) => ` --${name} ${RUN_OPTIONS[name].help}`)
68
+ .join("\n");
69
+ }
70
+ const DEMO_HELP = `Usage: sevro demo [--json]
71
+
72
+ Examples:
73
+ sevro demo
74
+ sevro demo --json
75
+
76
+ Run the packaged deterministic fixture and adapter without model credentials.
77
+ Shows an assessed verdict and retains evidence in .sevro/results beneath the current directory.
78
+ Caller project files, sevro.json and native configuration are not loaded.
79
+
80
+ Options:
81
+ --json Emit one sevro.cli-result.v1 document on stdout.
82
+ -h, --help Show this help without preparing a run.
83
+ `;
84
+ const REPORT_HELP = `Usage: sevro report [options]
85
+
86
+ Examples:
87
+ sevro report --latest
88
+ sevro report --result-file /absolute/results/run/result.json
89
+ sevro report --result-file /absolute/results/first/result.json \\
90
+ --result-file /absolute/results/second/result.json --json
91
+
92
+ Required:
93
+ --latest OR --result-file <path> A retained result; repeat paths for distinct runs.
94
+ Relative or absolute paths use the current directory.
95
+ Keep each result's referenced evidence available and unchanged.
96
+
97
+ Options and defaults:
98
+ --latest Read the last retained CLI result, including dry or failed runs.
99
+ --results-root <path> With --latest, override <cwd>/.sevro/results.
100
+ --json Emit sevro.report.v1 JSON; Markdown by default.
101
+ -h, --help Show this help without reading result files.
102
+ `;
103
+ const PRUNE_HELP = `Usage: sevro prune [options]
104
+
105
+ Examples:
106
+ sevro prune
107
+ sevro prune --results-root ./other-results --keep 5
108
+ sevro prune --older-than 30d
109
+ sevro prune --latest
110
+ sevro prune --native-transcripts --older-than 30d
111
+
112
+ Defaults: keep the newest 10 completed results under <cwd>/.sevro/results.
113
+ Select at most one explicit retention policy:
114
+ --keep <positive-integer> Keep this many newest results.
115
+ --latest Keep only the newest result (same as --keep 1).
116
+ --older-than <duration> Remove results older than a positive integer plus ms, s, m, h, d or w.
117
+ --results-root <path> Relative or absolute results root, resolved from cwd.
118
+ --native-transcripts Remove only native transcript bundles; keep results and hashes.
119
+ -h, --help Show help without reading or deleting results.
120
+
121
+ Age and ordering use result.json modification times; equal times sort by path.
122
+ Each retained attempt counts separately, including dry, failed and interrupted runs.
123
+ Active/unrecognized attempts and directories without result.json are preserved.
124
+ Evidence is permanently deleted. Remaining results stay usable by sevro report;
125
+ latest.json is updated, or removed when no completed results remain.
126
+ With --native-transcripts, no policy removes bundles from all completed results;
127
+ --keep/--latest preserve bundles for the newest results, and --older-than selects older results.
128
+ Result/evidence files and latest.json stay unchanged. Reports label removed bundles as pruned.
129
+ Missing or empty results roots are a successful no-op. Invalid or unreadable inputs exit 64.
130
+ Reference: docs/reading-results.md in the installed package.
131
+ `;
132
+ const INIT_HELP = `Usage: sevro init [options]
133
+
134
+ Examples:
135
+ sevro init --template response --directory ./my-evaluation
136
+ cd my-evaluation
137
+ sevro run --run-manifest-file run.json --dry
138
+ sevro run --run-manifest-file run.json
139
+ sevro report --latest
140
+
141
+ Options and defaults:
142
+ --template <response|repository-skill|coding> Default: response.
143
+ --directory <new-path> Default: ./sevro-evaluation; refuses existing paths.
144
+ -h, --help Show this help without creating files.
145
+
146
+ Response and coding use deterministic adapters and real assertions, including negative controls.
147
+ Coding checks need sandbox-exec (macOS) or bubblewrap/socat (Linux).
148
+ Repository-skill uses native Codex and requires explicit --model, --effort and --codex-auth-file.
149
+ Read the generated README.md for prerequisites and live commands; dry preparation is not an assessment.
150
+ Reference: docs/evaluation-workflow.md in the installed package.
151
+ `;
152
+ const HELP_REQUESTS = {
153
+ "": TOP_LEVEL_HELP,
154
+ "--help": TOP_LEVEL_HELP,
155
+ "-h": TOP_LEVEL_HELP,
156
+ help: TOP_LEVEL_HELP,
157
+ "run --help": RUN_HELP,
158
+ "run -h": RUN_HELP,
159
+ "help run": RUN_HELP,
160
+ "demo --help": DEMO_HELP,
161
+ "demo -h": DEMO_HELP,
162
+ "help demo": DEMO_HELP,
163
+ "init --help": INIT_HELP,
164
+ "init -h": INIT_HELP,
165
+ "help init": INIT_HELP,
166
+ "report --help": REPORT_HELP,
167
+ "report -h": REPORT_HELP,
168
+ "help report": REPORT_HELP,
169
+ "prune --help": PRUNE_HELP,
170
+ "prune -h": PRUNE_HELP,
171
+ "help prune": PRUNE_HELP,
172
+ };
173
+ /** Handle informational commands before loading inputs or creating run state. */
174
+ export function informationCommand(argv) {
175
+ const request = argv.slice(1).some((arg) => ["--help", "-h"].includes(arg))
176
+ ? [argv[0], "--help"].join(" ")
177
+ : argv.join(" ");
178
+ if (["--version", "-v"].includes(request)) {
179
+ process.stdout.write(`sevro ${version}\n`);
180
+ return true;
181
+ }
182
+ const help = Object.hasOwn(HELP_REQUESTS, request)
183
+ ? HELP_REQUESTS[request]
184
+ : undefined;
185
+ if (help === undefined)
186
+ return false;
187
+ process.stdout.write(help);
188
+ return true;
189
+ }
190
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["help.ts"],"names":[],"mappings":"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","sourcesContent":["import { RUN_OPTIONS, optionsWith, type RunOptionName } from \"./run-options\";\nimport packageJson from \"../../package.json\" with { type: \"json\" };\nconst { version } = packageJson;\n\nconst TOP_LEVEL_HELP = `Usage: sevro <command> [options]\n\nExamples:\n sevro demo\n sevro init --template response --directory ./my-evaluation\n sevro run --case-file /absolute/case.json --adapter-module /absolute/adapter.js \\\\\n --project-root /absolute/project --results-root /absolute/results \\\\\n --condition passive --trials 1 --threshold 1\n sevro run --help\n sevro report --result-file /absolute/results/run/result.json\n sevro prune\n\nCommands:\n demo Run the packaged credential-free assessed example; use demo --help.\n init Create a new evaluation project; use init --help.\n run Evaluate one resolved case or extension case; use run --help.\n report Summarize retained results; use report --help.\n prune Remove retained results using a retention policy; use prune --help.\n\nOptions:\n -h, --help Show help without preparing a run.\n -v, --version Print the installed Sevro package version.\n`;\n\nconst RUN_HELP = `Usage: sevro run [options]\n\nExamples:\n sevro run --case-file /absolute/case.json --adapter-module /absolute/adapter.js \\\\\n --project-root /absolute/project --results-root /absolute/results \\\\\n --condition passive --trials 1 --threshold 1\n Add --dry to prepare without calling the candidate or graders.\n Add --json to save a sevro.cli-result.v1 result from stdout.\n\nRequired:\n${runOptionHelp(\"required\")}\n\nCommon options and defaults:\n${runOptionHelp(\"common\")}\n Precedence: built-in defaults, saved settings, then explicit CLI options.\n Manifest paths use its own directory; CLI paths use the current directory.\n --no-dry, --no-shell-isolation and other --no-<boolean> flags override saved true.\n Relative run paths resolve from the current directory and are canonicalized before protection checks.\n\nBundled hosts:\n${runOptionHelp(\"native\")}\n Native timeout defaults to 600000 ms; shell checks expect exit 0 within 30000 ms.\n\nExtension cases:\n${runOptionHelp(\"extension\")}\n\nOptional grading routes (none selected by default):\n${runOptionHelp(\"grading\")}\n\nProvenance overrides (normally derived automatically):\n${runOptionHelp(\"provenance\")}\n\nDeprecated runtime options:\n${runOptionHelp(\"deprecated\")}\n\n -h, --help Show this help without preparing a run.\nReference: docs/development-cli.md, docs/run-settings-v1.md and docs/results-v1.md in the installed package.\n`;\n\nfunction runOptionHelp(\n section: (typeof RUN_OPTIONS)[RunOptionName][\"section\"],\n): string {\n return optionsWith(\"section\", section)\n .map((name) => ` --${name} ${RUN_OPTIONS[name].help}`)\n .join(\"\\n\");\n}\n\nconst DEMO_HELP = `Usage: sevro demo [--json]\n\nExamples:\n sevro demo\n sevro demo --json\n\nRun the packaged deterministic fixture and adapter without model credentials.\nShows an assessed verdict and retains evidence in .sevro/results beneath the current directory.\nCaller project files, sevro.json and native configuration are not loaded.\n\nOptions:\n --json Emit one sevro.cli-result.v1 document on stdout.\n -h, --help Show this help without preparing a run.\n`;\n\nconst REPORT_HELP = `Usage: sevro report [options]\n\nExamples:\n sevro report --latest\n sevro report --result-file /absolute/results/run/result.json\n sevro report --result-file /absolute/results/first/result.json \\\\\n --result-file /absolute/results/second/result.json --json\n\nRequired:\n --latest OR --result-file <path> A retained result; repeat paths for distinct runs.\n Relative or absolute paths use the current directory.\n Keep each result's referenced evidence available and unchanged.\n\nOptions and defaults:\n --latest Read the last retained CLI result, including dry or failed runs.\n --results-root <path> With --latest, override <cwd>/.sevro/results.\n --json Emit sevro.report.v1 JSON; Markdown by default.\n -h, --help Show this help without reading result files.\n`;\n\nconst PRUNE_HELP = `Usage: sevro prune [options]\n\nExamples:\n sevro prune\n sevro prune --results-root ./other-results --keep 5\n sevro prune --older-than 30d\n sevro prune --latest\n sevro prune --native-transcripts --older-than 30d\n\nDefaults: keep the newest 10 completed results under <cwd>/.sevro/results.\nSelect at most one explicit retention policy:\n --keep <positive-integer> Keep this many newest results.\n --latest Keep only the newest result (same as --keep 1).\n --older-than <duration> Remove results older than a positive integer plus ms, s, m, h, d or w.\n --results-root <path> Relative or absolute results root, resolved from cwd.\n --native-transcripts Remove only native transcript bundles; keep results and hashes.\n -h, --help Show help without reading or deleting results.\n\nAge and ordering use result.json modification times; equal times sort by path.\nEach retained attempt counts separately, including dry, failed and interrupted runs.\nActive/unrecognized attempts and directories without result.json are preserved.\nEvidence is permanently deleted. Remaining results stay usable by sevro report;\nlatest.json is updated, or removed when no completed results remain.\nWith --native-transcripts, no policy removes bundles from all completed results;\n--keep/--latest preserve bundles for the newest results, and --older-than selects older results.\nResult/evidence files and latest.json stay unchanged. Reports label removed bundles as pruned.\nMissing or empty results roots are a successful no-op. Invalid or unreadable inputs exit 64.\nReference: docs/reading-results.md in the installed package.\n`;\n\nconst INIT_HELP = `Usage: sevro init [options]\n\nExamples:\n sevro init --template response --directory ./my-evaluation\n cd my-evaluation\n sevro run --run-manifest-file run.json --dry\n sevro run --run-manifest-file run.json\n sevro report --latest\n\nOptions and defaults:\n --template <response|repository-skill|coding> Default: response.\n --directory <new-path> Default: ./sevro-evaluation; refuses existing paths.\n -h, --help Show this help without creating files.\n\nResponse and coding use deterministic adapters and real assertions, including negative controls.\nCoding checks need sandbox-exec (macOS) or bubblewrap/socat (Linux).\nRepository-skill uses native Codex and requires explicit --model, --effort and --codex-auth-file.\nRead the generated README.md for prerequisites and live commands; dry preparation is not an assessment.\nReference: docs/evaluation-workflow.md in the installed package.\n`;\n\nconst HELP_REQUESTS: Record<string, string> = {\n \"\": TOP_LEVEL_HELP,\n \"--help\": TOP_LEVEL_HELP,\n \"-h\": TOP_LEVEL_HELP,\n help: TOP_LEVEL_HELP,\n \"run --help\": RUN_HELP,\n \"run -h\": RUN_HELP,\n \"help run\": RUN_HELP,\n \"demo --help\": DEMO_HELP,\n \"demo -h\": DEMO_HELP,\n \"help demo\": DEMO_HELP,\n \"init --help\": INIT_HELP,\n \"init -h\": INIT_HELP,\n \"help init\": INIT_HELP,\n \"report --help\": REPORT_HELP,\n \"report -h\": REPORT_HELP,\n \"help report\": REPORT_HELP,\n \"prune --help\": PRUNE_HELP,\n \"prune -h\": PRUNE_HELP,\n \"help prune\": PRUNE_HELP,\n};\n\n/** Handle informational commands before loading inputs or creating run state. */\nexport function informationCommand(argv: string[]): boolean {\n const request = argv.slice(1).some((arg) => [\"--help\", \"-h\"].includes(arg))\n ? [argv[0], \"--help\"].join(\" \")\n : argv.join(\" \");\n if ([\"--version\", \"-v\"].includes(request)) {\n process.stdout.write(`sevro ${version}\\n`);\n return true;\n }\n const help = Object.hasOwn(HELP_REQUESTS, request)\n ? HELP_REQUESTS[request]\n : undefined;\n if (help === undefined) return false;\n process.stdout.write(help);\n return true;\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import { createClaudeHost } from "../hosts/claude.js";
2
+ import { createCodexHost } from "../hosts/codex.js";
3
+ import { codexAgentConcurrency } from "../hosts/codex-configuration.js";
4
+ import { InvocationError, nativeRoutes } from "./invocation.js";
5
+ import { loadHost } from "./loading.js";
6
+ export async function selectedConcurrency(invocation, configRoot) {
7
+ return nativeRoutes({ ...invocation, claude: undefined }).length
8
+ ? codexAgentConcurrency(configRoot)
9
+ : null;
10
+ }
11
+ export async function candidateHost(invocation, agentConcurrencyLimit) {
12
+ if (invocation.codex)
13
+ return retainExecutable(createCodexHost({ ...invocation.codex, agentConcurrencyLimit }), invocation.codex.binary);
14
+ if (invocation.claude)
15
+ return retainExecutable(createClaudeHost(invocation.claude), invocation.claude.binary);
16
+ if (!invocation.adapterModule)
17
+ throw new InvocationError("missing --adapter-module or --host");
18
+ return loadHost(invocation.adapterModule);
19
+ }
20
+ export async function secondaryHost(module, codex, agentConcurrencyLimit) {
21
+ if (module)
22
+ return loadHost(module);
23
+ if (codex)
24
+ return retainExecutable(createCodexHost({ ...codex, agentConcurrencyLimit }), codex.binary);
25
+ return undefined;
26
+ }
27
+ function retainExecutable(host, binary) {
28
+ return {
29
+ ...host,
30
+ configuration: { ...host.configuration, "sevro.host.executable": binary },
31
+ };
32
+ }
33
+ //# sourceMappingURL=hosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosts.js","sourceRoot":"","sources":["hosts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,2BAAwB;AACnD,OAAO,EAAE,eAAe,EAAE,0BAAuB;AACjD,OAAO,EAAE,qBAAqB,EAAE,wCAAqC;AACrE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAmB,wBAAqB;AAC9E,OAAO,EAAE,QAAQ,EAAE,qBAAkB;AAErC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAsB,EACtB,UAAkB;IAElB,OAAO,YAAY,CAAC,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM;QAC9D,CAAC,CAAC,qBAAqB,CAAC,UAAU,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAsB,EACtB,qBAAoC;IAEpC,IAAI,UAAU,CAAC,KAAK;QAClB,OAAO,gBAAgB,CACrB,eAAe,CAAC,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,qBAAqB,EAAE,CAAC,EAC/D,UAAU,CAAC,KAAK,CAAC,MAAM,CACxB,CAAC;IACJ,IAAI,UAAU,CAAC,MAAM;QACnB,OAAO,gBAAgB,CACrB,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,EACnC,UAAU,CAAC,MAAM,CAAC,MAAM,CACzB,CAAC;IACJ,IAAI,CAAC,UAAU,CAAC,aAAa;QAC3B,MAAM,IAAI,eAAe,CAAC,oCAAoC,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAA0B,EAC1B,KAAkC,EAClC,qBAAoC;IAEpC,IAAI,MAAM;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,KAAK;QACP,OAAO,gBAAgB,CACrB,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,qBAAqB,EAAE,CAAC,EACpD,KAAK,CAAC,MAAM,CACb,CAAC;IACJ,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAiB,EAAE,MAAc;IACzD,OAAO;QACL,GAAG,IAAI;QACP,aAAa,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,uBAAuB,EAAE,MAAM,EAAE;KAC1E,CAAC;AACJ,CAAC","sourcesContent":["import type { HostAdapter } from \"../engine\";\nimport { createClaudeHost } from \"../hosts/claude\";\nimport { createCodexHost } from \"../hosts/codex\";\nimport { codexAgentConcurrency } from \"../hosts/codex-configuration\";\nimport { InvocationError, nativeRoutes, type Invocation } from \"./invocation\";\nimport { loadHost } from \"./loading\";\n\nexport async function selectedConcurrency(\n invocation: Invocation,\n configRoot: string,\n): Promise<number | null> {\n return nativeRoutes({ ...invocation, claude: undefined }).length\n ? codexAgentConcurrency(configRoot)\n : null;\n}\n\nexport async function candidateHost(\n invocation: Invocation,\n agentConcurrencyLimit: number | null,\n): Promise<HostAdapter> {\n if (invocation.codex)\n return retainExecutable(\n createCodexHost({ ...invocation.codex, agentConcurrencyLimit }),\n invocation.codex.binary,\n );\n if (invocation.claude)\n return retainExecutable(\n createClaudeHost(invocation.claude),\n invocation.claude.binary,\n );\n if (!invocation.adapterModule)\n throw new InvocationError(\"missing --adapter-module or --host\");\n return loadHost(invocation.adapterModule);\n}\n\nexport async function secondaryHost(\n module: string | undefined,\n codex: Invocation[\"semanticCodex\"],\n agentConcurrencyLimit: number | null,\n): Promise<HostAdapter | undefined> {\n if (module) return loadHost(module);\n if (codex)\n return retainExecutable(\n createCodexHost({ ...codex, agentConcurrencyLimit }),\n codex.binary,\n );\n return undefined;\n}\n\nfunction retainExecutable(host: HostAdapter, binary: string): HostAdapter {\n return {\n ...host,\n configuration: { ...host.configuration, \"sevro.host.executable\": binary },\n };\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import { join } from "node:path";
2
+ import { runtimeModule } from "../runner-paths.js";
3
+ export function templateSettings(template) {
4
+ if (template === "repository-skill")
5
+ return {
6
+ "project-root": ".",
7
+ "extension-command-file": "command.json",
8
+ "extension-source-file": [
9
+ "extension.ts",
10
+ "extension-data.ts",
11
+ ".agents/skills/startup-guide/SKILL.md",
12
+ ].map(runtimeModule),
13
+ "case-id": "repository-skill",
14
+ host: "codex",
15
+ };
16
+ return {
17
+ "case-file": "case.json",
18
+ "adapter-module": runtimeModule("adapter.ts"),
19
+ "project-root": ".",
20
+ ...(template === "coding" ? { "shell-isolation": true } : {}),
21
+ };
22
+ }
23
+ export function templateCommand(destination) {
24
+ return [process.execPath, join(destination, runtimeModule("extension.ts"))];
25
+ }
26
+ export function nativeReadme() {
27
+ return `# Repository skill evaluation\n\nThis template mounts the actual startup-guide skill and requires Codex's explicit invocation evidence plus assertions for the start command and port. Missing evidence remains not_assessed.\n\nPrerequisites: Node.js 24.13.0 or newer, or Bun 1.3.13, plus Git, Codex on PATH, supported native isolation (sandbox-exec on macOS or bubblewrap/socat on Linux), and a readable Codex authentication file. Choose the exact model and effort explicitly. Do not store credentials in run.json.\n\n\`\`\`sh\nsevro run --run-manifest-file run.json --model YOUR_MODEL --effort YOUR_EFFORT --codex-auth-file /absolute/auth.json --dry\nsevro run --run-manifest-file run.json --model YOUR_MODEL --effort YOUR_EFFORT --codex-auth-file /absolute/auth.json\nsevro report --latest\n\`\`\`\n\nDry preparation checks mounts and declarations without calling the model. No authenticated model execution or skill dispatch is established by dry preparation. Live execution may incur provider charges. To create a negative control, change the expected port in the extension data file to 9000 while leaving the fixture at 3000; rerun and inspect the failed port assertion. Model compliance and measurements are unknown until actually executed.\n\nEdit the copied skill and assertions, prepare again, then rerun the same model/effort/condition. Keep private .sevro evidence out of Git. command.json uses the initializer's absolute selected runtime and extension paths; regenerate it after moving this project.\n`;
28
+ }
29
+ //# sourceMappingURL=init-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-settings.js","sourceRoot":"","sources":["init-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,kBAAkB;AACjC,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAEhD,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,IAAI,QAAQ,KAAK,kBAAkB;QACjC,OAAO;YACL,cAAc,EAAE,GAAG;YACnB,wBAAwB,EAAE,cAAc;YACxC,uBAAuB,EAAE;gBACvB,cAAc;gBACd,mBAAmB;gBACnB,uCAAuC;aACxC,CAAC,GAAG,CAAC,aAAa,CAAC;YACpB,SAAS,EAAE,kBAAkB;YAC7B,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,OAAO;QACL,WAAW,EAAE,WAAW;QACxB,gBAAgB,EAAE,aAAa,CAAC,YAAY,CAAC;QAC7C,cAAc,EAAE,GAAG;QACnB,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,y+CAAy+C,CAAC;AACn/C,CAAC","sourcesContent":["import { join } from \"node:path\";\nimport { runtimeModule } from \"../runner-paths\";\n\nexport function templateSettings(template: string) {\n if (template === \"repository-skill\")\n return {\n \"project-root\": \".\",\n \"extension-command-file\": \"command.json\",\n \"extension-source-file\": [\n \"extension.ts\",\n \"extension-data.ts\",\n \".agents/skills/startup-guide/SKILL.md\",\n ].map(runtimeModule),\n \"case-id\": \"repository-skill\",\n host: \"codex\",\n };\n return {\n \"case-file\": \"case.json\",\n \"adapter-module\": runtimeModule(\"adapter.ts\"),\n \"project-root\": \".\",\n ...(template === \"coding\" ? { \"shell-isolation\": true } : {}),\n };\n}\n\nexport function templateCommand(destination: string) {\n return [process.execPath, join(destination, runtimeModule(\"extension.ts\"))];\n}\n\nexport function nativeReadme() {\n return `# Repository skill evaluation\\n\\nThis template mounts the actual startup-guide skill and requires Codex's explicit invocation evidence plus assertions for the start command and port. Missing evidence remains not_assessed.\\n\\nPrerequisites: Node.js 24.13.0 or newer, or Bun 1.3.13, plus Git, Codex on PATH, supported native isolation (sandbox-exec on macOS or bubblewrap/socat on Linux), and a readable Codex authentication file. Choose the exact model and effort explicitly. Do not store credentials in run.json.\\n\\n\\`\\`\\`sh\\nsevro run --run-manifest-file run.json --model YOUR_MODEL --effort YOUR_EFFORT --codex-auth-file /absolute/auth.json --dry\\nsevro run --run-manifest-file run.json --model YOUR_MODEL --effort YOUR_EFFORT --codex-auth-file /absolute/auth.json\\nsevro report --latest\\n\\`\\`\\`\\n\\nDry preparation checks mounts and declarations without calling the model. No authenticated model execution or skill dispatch is established by dry preparation. Live execution may incur provider charges. To create a negative control, change the expected port in the extension data file to 9000 while leaving the fixture at 3000; rerun and inspect the failed port assertion. Model compliance and measurements are unknown until actually executed.\\n\\nEdit the copied skill and assertions, prepare again, then rerun the same model/effort/condition. Keep private .sevro evidence out of Git. command.json uses the initializer's absolute selected runtime and extension paths; regenerate it after moving this project.\\n`;\n}\n"]}