@bjoernrochel/sevro 1.0.0 → 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 (403) hide show
  1. package/CONTRIBUTING.md +34 -4
  2. package/README.md +7 -6
  3. package/dist/examples/basic/graded.json +13 -0
  4. package/dist/examples/basic/host.js +9 -0
  5. package/dist/examples/basic/host.js.map +1 -0
  6. package/dist/examples/basic/prompt-only.json +7 -0
  7. package/dist/examples/recipes/candidate.js +23 -0
  8. package/dist/examples/recipes/candidate.js.map +1 -0
  9. package/dist/examples/recipes/cases/coding-change.json +21 -0
  10. package/dist/examples/recipes/cases/host-tools.json +21 -0
  11. package/dist/examples/recipes/cases/mise.json +21 -0
  12. package/dist/examples/recipes/cases/node.json +21 -0
  13. package/dist/examples/recipes/cases/python-uv.json +21 -0
  14. package/dist/examples/recipes/cases/semantic.json +17 -0
  15. package/dist/examples/recipes/coding-change/check.js +16 -0
  16. package/dist/examples/recipes/coding-change/check.js.map +1 -0
  17. package/dist/examples/recipes/executable.js +20 -0
  18. package/dist/examples/recipes/executable.js.map +1 -0
  19. package/dist/examples/recipes/extension-artifacts.js +56 -0
  20. package/dist/examples/recipes/extension-artifacts.js.map +1 -0
  21. package/dist/examples/recipes/extension-methods.js +167 -0
  22. package/dist/examples/recipes/extension-methods.js.map +1 -0
  23. package/dist/examples/recipes/extension.js +28 -0
  24. package/dist/examples/recipes/extension.js.map +1 -0
  25. package/dist/examples/recipes/modules.js +9 -0
  26. package/dist/examples/recipes/modules.js.map +1 -0
  27. package/dist/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
  28. package/dist/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
  29. package/dist/examples/recipes/repository-skill/README.md +3 -0
  30. package/dist/examples/recipes/run-inputs.js +144 -0
  31. package/dist/examples/recipes/run-inputs.js.map +1 -0
  32. package/dist/examples/recipes/run-options.js +103 -0
  33. package/dist/examples/recipes/run-options.js.map +1 -0
  34. package/dist/examples/recipes/run.js +62 -0
  35. package/dist/examples/recipes/run.js.map +1 -0
  36. package/dist/examples/recipes/runtime/empty.json +1 -0
  37. package/dist/examples/recipes/runtime/goals.json +1 -0
  38. package/dist/examples/recipes/runtime/mise.json +6 -0
  39. package/dist/examples/recipes/runtime/path.json +1 -0
  40. package/dist/examples/recipes/runtime/plugins.json +4 -0
  41. package/dist/examples/recipes/runtime/python-uv.json +10 -0
  42. package/dist/examples/recipes/semantic-judge.js +27 -0
  43. package/dist/examples/recipes/semantic-judge.js.map +1 -0
  44. package/dist/examples/templates/coding/adapter.js +14 -0
  45. package/dist/examples/templates/coding/adapter.js.map +1 -0
  46. package/dist/examples/templates/coding/case.json +15 -0
  47. package/dist/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
  48. package/dist/examples/templates/repository-skill/extension-data.js +61 -0
  49. package/dist/examples/templates/repository-skill/extension-data.js.map +1 -0
  50. package/dist/examples/templates/repository-skill/extension.js +29 -0
  51. package/dist/examples/templates/repository-skill/extension.js.map +1 -0
  52. package/dist/examples/templates/response/adapter.js +13 -0
  53. package/dist/examples/templates/response/adapter.js.map +1 -0
  54. package/dist/examples/templates/response/case.json +13 -0
  55. package/dist/src/advisory.js +86 -0
  56. package/dist/src/advisory.js.map +1 -0
  57. package/dist/src/candidate-artifacts.js +139 -0
  58. package/dist/src/candidate-artifacts.js.map +1 -0
  59. package/dist/src/candidate-codex-state.js +110 -0
  60. package/dist/src/candidate-codex-state.js.map +1 -0
  61. package/dist/src/case-validation.js +92 -0
  62. package/dist/src/case-validation.js.map +1 -0
  63. package/dist/src/cli/cancellation.js +21 -0
  64. package/dist/src/cli/cancellation.js.map +1 -0
  65. package/dist/src/cli/command.js +60 -0
  66. package/dist/src/cli/command.js.map +1 -0
  67. package/dist/src/cli/completion.js +14 -0
  68. package/dist/src/cli/completion.js.map +1 -0
  69. package/dist/src/cli/demo.js +45 -0
  70. package/dist/src/cli/demo.js.map +1 -0
  71. package/dist/src/cli/evaluation.js +40 -0
  72. package/dist/src/cli/evaluation.js.map +1 -0
  73. package/dist/src/cli/extension.js +54 -0
  74. package/dist/src/cli/extension.js.map +1 -0
  75. package/dist/src/cli/help.js +190 -0
  76. package/dist/src/cli/help.js.map +1 -0
  77. package/dist/src/cli/hosts.js +33 -0
  78. package/dist/src/cli/hosts.js.map +1 -0
  79. package/dist/src/cli/init-settings.js +29 -0
  80. package/dist/src/cli/init-settings.js.map +1 -0
  81. package/dist/src/cli/init.js +82 -0
  82. package/dist/src/cli/init.js.map +1 -0
  83. package/dist/src/cli/invocation.js +431 -0
  84. package/dist/src/cli/invocation.js.map +1 -0
  85. package/dist/src/cli/loading.js +110 -0
  86. package/dist/src/cli/loading.js.map +1 -0
  87. package/dist/src/cli/preparation.js +88 -0
  88. package/dist/src/cli/preparation.js.map +1 -0
  89. package/dist/src/cli/presentation.js +61 -0
  90. package/dist/src/cli/presentation.js.map +1 -0
  91. package/dist/src/cli/progress.js +5 -0
  92. package/dist/src/cli/progress.js.map +1 -0
  93. package/dist/src/cli/run-manifest.js +108 -0
  94. package/dist/src/cli/run-manifest.js.map +1 -0
  95. package/dist/src/cli/run-options.js +367 -0
  96. package/dist/src/cli/run-options.js.map +1 -0
  97. package/dist/src/cli/run-overrides.js +51 -0
  98. package/dist/src/cli/run-overrides.js.map +1 -0
  99. package/dist/src/cli/settings.js +127 -0
  100. package/dist/src/cli/settings.js.map +1 -0
  101. package/dist/src/cli/summary.js +28 -0
  102. package/dist/src/cli/summary.js.map +1 -0
  103. package/dist/src/cli.js +20 -0
  104. package/dist/src/cli.js.map +1 -0
  105. package/dist/src/contract-types.js +2 -0
  106. package/dist/src/contract-types.js.map +1 -0
  107. package/dist/src/engine.js +4 -0
  108. package/dist/src/engine.js.map +1 -0
  109. package/dist/src/evaluation/advisory.js +85 -0
  110. package/dist/src/evaluation/advisory.js.map +1 -0
  111. package/dist/src/evaluation/check-plan.js +292 -0
  112. package/dist/src/evaluation/check-plan.js.map +1 -0
  113. package/dist/src/evaluation/collection.js +61 -0
  114. package/dist/src/evaluation/collection.js.map +1 -0
  115. package/dist/src/evaluation/context.js +2 -0
  116. package/dist/src/evaluation/context.js.map +1 -0
  117. package/dist/src/evaluation/grading-host.js +28 -0
  118. package/dist/src/evaluation/grading-host.js.map +1 -0
  119. package/dist/src/evaluation/grading.js +154 -0
  120. package/dist/src/evaluation/grading.js.map +1 -0
  121. package/dist/src/evaluation/invocation-plan.js +312 -0
  122. package/dist/src/evaluation/invocation-plan.js.map +1 -0
  123. package/dist/src/evaluation/plan.js +376 -0
  124. package/dist/src/evaluation/plan.js.map +1 -0
  125. package/dist/src/evaluation/progress.js +14 -0
  126. package/dist/src/evaluation/progress.js.map +1 -0
  127. package/dist/src/evaluation/resources.js +159 -0
  128. package/dist/src/evaluation/resources.js.map +1 -0
  129. package/dist/src/evaluation/run.js +148 -0
  130. package/dist/src/evaluation/run.js.map +1 -0
  131. package/dist/src/evaluation/scheduler.js +27 -0
  132. package/dist/src/evaluation/scheduler.js.map +1 -0
  133. package/dist/src/evaluation/semantic.js +183 -0
  134. package/dist/src/evaluation/semantic.js.map +1 -0
  135. package/dist/src/evaluation/trial.js +593 -0
  136. package/dist/src/evaluation/trial.js.map +1 -0
  137. package/dist/src/evaluation/types.js +20 -0
  138. package/dist/src/evaluation/types.js.map +1 -0
  139. package/dist/src/evidence/host-results.js +67 -0
  140. package/dist/src/evidence/host-results.js.map +1 -0
  141. package/dist/src/evidence/retained-artifacts.js +17 -0
  142. package/dist/src/evidence/retained-artifacts.js.map +1 -0
  143. package/dist/src/evidence/trial-writer.js +131 -0
  144. package/dist/src/evidence/trial-writer.js.map +1 -0
  145. package/dist/src/evidence/usage.js +14 -0
  146. package/dist/src/evidence/usage.js.map +1 -0
  147. package/dist/src/executable.js +20 -0
  148. package/dist/src/executable.js.map +1 -0
  149. package/dist/src/extension-client.js +212 -0
  150. package/dist/src/extension-client.js.map +1 -0
  151. package/dist/src/extension-session.js +236 -0
  152. package/dist/src/extension-session.js.map +1 -0
  153. package/dist/src/fixtures/advisory.js +206 -0
  154. package/dist/src/fixtures/advisory.js.map +1 -0
  155. package/dist/src/fixtures/bin.js +41 -0
  156. package/dist/src/fixtures/bin.js.map +1 -0
  157. package/dist/src/fixtures/cleanup.js +43 -0
  158. package/dist/src/fixtures/cleanup.js.map +1 -0
  159. package/dist/src/fixtures/create.js +94 -0
  160. package/dist/src/fixtures/create.js.map +1 -0
  161. package/dist/src/fixtures/generated.js +181 -0
  162. package/dist/src/fixtures/generated.js.map +1 -0
  163. package/dist/src/fixtures/git-hooks.js +16 -0
  164. package/dist/src/fixtures/git-hooks.js.map +1 -0
  165. package/dist/src/fixtures/preparation.js +201 -0
  166. package/dist/src/fixtures/preparation.js.map +1 -0
  167. package/dist/src/fixtures/repository.js +255 -0
  168. package/dist/src/fixtures/repository.js.map +1 -0
  169. package/dist/src/fixtures/setup.js +175 -0
  170. package/dist/src/fixtures/setup.js.map +1 -0
  171. package/dist/src/fixtures/tools.js +57 -0
  172. package/dist/src/fixtures/tools.js.map +1 -0
  173. package/dist/src/fixtures/workspace-state.js +155 -0
  174. package/dist/src/fixtures/workspace-state.js.map +1 -0
  175. package/dist/src/generated/cli-result.cjs +2 -0
  176. package/dist/src/generated/extension.cjs +2 -0
  177. package/dist/src/generated/report.cjs +2 -0
  178. package/dist/src/generated/run-evidence.cjs +2 -0
  179. package/dist/src/generated/runtime.cjs +2 -0
  180. package/dist/src/git.js +72 -0
  181. package/dist/src/git.js.map +1 -0
  182. package/dist/src/graders/artifact.js +68 -0
  183. package/dist/src/graders/artifact.js.map +1 -0
  184. package/dist/src/graders/git-head.js +112 -0
  185. package/dist/src/graders/git-head.js.map +1 -0
  186. package/dist/src/graders/output.js +345 -0
  187. package/dist/src/graders/output.js.map +1 -0
  188. package/dist/src/graders/semantic.js +132 -0
  189. package/dist/src/graders/semantic.js.map +1 -0
  190. package/dist/src/graders/shell.js +321 -0
  191. package/dist/src/graders/shell.js.map +1 -0
  192. package/dist/src/host-diagnostic-redaction.js +52 -0
  193. package/dist/src/host-diagnostic-redaction.js.map +1 -0
  194. package/dist/src/host-diagnostics.js +248 -0
  195. package/dist/src/host-diagnostics.js.map +1 -0
  196. package/dist/src/hosts/claude-continuation.js +89 -0
  197. package/dist/src/hosts/claude-continuation.js.map +1 -0
  198. package/dist/src/hosts/claude-credential.js +121 -0
  199. package/dist/src/hosts/claude-credential.js.map +1 -0
  200. package/dist/src/hosts/claude-events.js +136 -0
  201. package/dist/src/hosts/claude-events.js.map +1 -0
  202. package/dist/src/hosts/claude-keychain.js +100 -0
  203. package/dist/src/hosts/claude-keychain.js.map +1 -0
  204. package/dist/src/hosts/claude-login-recovery.js +67 -0
  205. package/dist/src/hosts/claude-login-recovery.js.map +1 -0
  206. package/dist/src/hosts/claude-login-refresh.js +146 -0
  207. package/dist/src/hosts/claude-login-refresh.js.map +1 -0
  208. package/dist/src/hosts/claude-login-store.js +124 -0
  209. package/dist/src/hosts/claude-login-store.js.map +1 -0
  210. package/dist/src/hosts/claude-login.js +74 -0
  211. package/dist/src/hosts/claude-login.js.map +1 -0
  212. package/dist/src/hosts/claude-native-goal.js +138 -0
  213. package/dist/src/hosts/claude-native-goal.js.map +1 -0
  214. package/dist/src/hosts/claude-process.js +10 -0
  215. package/dist/src/hosts/claude-process.js.map +1 -0
  216. package/dist/src/hosts/claude-refresh-lock.js +76 -0
  217. package/dist/src/hosts/claude-refresh-lock.js.map +1 -0
  218. package/dist/src/hosts/claude-repository-invocation.js +229 -0
  219. package/dist/src/hosts/claude-repository-invocation.js.map +1 -0
  220. package/dist/src/hosts/claude-settings.js +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/architecture.md +5 -2
  349. package/docs/creating-cases.md +2 -3
  350. package/docs/development-cli.md +12 -7
  351. package/docs/documentation-quality.md +4 -3
  352. package/docs/evaluation-workflow.md +8 -8
  353. package/docs/getting-started.md +7 -6
  354. package/docs/guide-evaluation.md +1 -1
  355. package/docs/identity-v1.md +4 -1
  356. package/docs/installing.md +31 -13
  357. package/docs/licensing.md +2 -2
  358. package/docs/native-hosts.md +1 -1
  359. package/docs/recipes.md +41 -40
  360. package/docs/releases.md +20 -4
  361. package/docs/run-settings-v1.md +3 -3
  362. package/docs/specs/repository-guide.md +1 -1
  363. package/docs/troubleshooting.md +1 -1
  364. package/docs/typescript-quality.md +18 -1
  365. package/examples/recipes/executable.ts +19 -0
  366. package/examples/recipes/extension-artifacts.ts +1 -1
  367. package/examples/recipes/extension.ts +2 -1
  368. package/examples/recipes/modules.ts +9 -0
  369. package/examples/recipes/run-inputs.ts +14 -19
  370. package/examples/recipes/run-options.ts +9 -8
  371. package/examples/recipes/run.ts +21 -7
  372. package/examples/templates/repository-skill/extension-data.ts +1 -1
  373. package/examples/templates/repository-skill/extension.ts +2 -1
  374. package/package.json +14 -6
  375. package/src/cli/demo.ts +3 -2
  376. package/src/cli/help.ts +4 -3
  377. package/src/cli/init-settings.ts +5 -4
  378. package/src/cli/init.ts +9 -8
  379. package/src/cli/invocation.ts +2 -1
  380. package/src/cli/preparation.ts +2 -2
  381. package/src/cli.ts +1 -1
  382. package/src/executable.ts +19 -0
  383. package/src/extension-client.ts +6 -12
  384. package/src/fixtures/setup.ts +3 -2
  385. package/src/git.ts +2 -1
  386. package/src/graders/git-head.ts +3 -2
  387. package/src/graders/shell.ts +4 -3
  388. package/src/hosts/claude-keychain.ts +3 -2
  389. package/src/hosts/claude-login-refresh.ts +3 -2
  390. package/src/hosts/claude-refresh-lock.ts +2 -1
  391. package/src/hosts/isolation-roots.ts +3 -2
  392. package/src/hosts/process-lifecycle.ts +4 -6
  393. package/src/hosts/protected-worktrees.ts +2 -1
  394. package/src/hosts/skill-hook-handler.ts +1 -1
  395. package/src/hosts/skill-hooks.ts +10 -2
  396. package/src/provenance.ts +7 -6
  397. package/src/results-lock.ts +4 -4
  398. package/src/run-owner.ts +15 -9
  399. package/src/runner-paths.ts +21 -0
  400. package/src/runtime/hook-processes.ts +2 -1
  401. package/src/runtime/hooks.ts +9 -7
  402. package/src/runtime-process.ts +194 -0
  403. package/src/sqlite-lock.ts +25 -0
@@ -0,0 +1,516 @@
1
+ import { isRecord, isUnknownArray } from "../value-guards.js";
2
+ import { codexExecCallReceipts, } from "./codex-exec-controls.js";
3
+ import { readNativeSession, locateNativeSession as sessionPath, } from "./codex-session-files.js";
4
+ const MAX_SESSION_ENTRIES = 10_000;
5
+ const MAX_RETAINED_CALLS = 128;
6
+ const MAX_CHILD_SESSIONS = 8;
7
+ const GOAL_CONTROLS = new Set(["create_goal", "get_goal", "update_goal"]);
8
+ const COLLABORATION_CONTROLS = new Set([
9
+ "spawn_agent",
10
+ "list_agents",
11
+ "wait_agent",
12
+ "followup_task",
13
+ "send_message",
14
+ "interrupt_agent",
15
+ ]);
16
+ function unavailable(completeness) {
17
+ return {
18
+ id: "sevro.codex.native-calls",
19
+ completeness,
20
+ data: {
21
+ method: "native_session",
22
+ calls: [],
23
+ toolCalls: [],
24
+ submittedExecCalls: 0,
25
+ acceptedSpawns: [],
26
+ feedbackCalls: [],
27
+ childSessions: [],
28
+ childrenTruncated: false,
29
+ },
30
+ };
31
+ }
32
+ function nativeControlNamespace(payload) {
33
+ if (goalNamespace(payload.namespace) && GOAL_CONTROLS.has(payload.name))
34
+ return "functions";
35
+ if (payload.namespace === "collaboration" &&
36
+ COLLABORATION_CONTROLS.has(payload.name))
37
+ return "collaboration";
38
+ return null;
39
+ }
40
+ function goalNamespace(value) {
41
+ return value === "functions" || value === undefined;
42
+ }
43
+ function directCall(ordinal, payload) {
44
+ if (payload.type !== "function_call" || typeof payload.name !== "string")
45
+ return null;
46
+ const namespace = nativeControlNamespace({ ...payload, name: payload.name });
47
+ return namespace
48
+ ? { ordinal, namespace, name: payload.name, evidence: "invocation_attempt" }
49
+ : null;
50
+ }
51
+ const IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/;
52
+ const AGENT_REF = /^(?:\/root(?:\/[a-z0-9_]+)+|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/;
53
+ function bounded(value, pattern) {
54
+ return typeof value === "string" && value.length <= 128 && pattern.test(value)
55
+ ? value
56
+ : undefined;
57
+ }
58
+ function toolNamespace(value) {
59
+ return value === "functions" || value === "collaboration" || value === "clock"
60
+ ? value
61
+ : "other";
62
+ }
63
+ function parsedObject(text) {
64
+ if (typeof text !== "string")
65
+ return null;
66
+ try {
67
+ const value = JSON.parse(text);
68
+ return isRecord(value) ? value : null;
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ function feedbackTarget(args) {
75
+ if (!args)
76
+ return undefined;
77
+ return (bounded(args.target, AGENT_REF) ??
78
+ bounded(args.target, /^[a-z0-9][a-z0-9_]{0,63}$/));
79
+ }
80
+ function nativeToolTarget(payload, namespace, name) {
81
+ if (namespace !== "collaboration" ||
82
+ !["followup_task", "send_message", "interrupt_agent"].includes(name))
83
+ return undefined;
84
+ return feedbackTarget(parsedObject(payload.arguments));
85
+ }
86
+ function toolCallType(value) {
87
+ return value === "function_call" || value === "custom_tool_call";
88
+ }
89
+ function nativeToolCall(ordinal, payload) {
90
+ if (!toolCallType(payload.type))
91
+ return null;
92
+ const namespace = toolNamespace(payload.namespace);
93
+ const name = bounded(payload.name, /^[A-Za-z_][A-Za-z0-9_]{0,63}$/) ?? "other";
94
+ const target = nativeToolTarget(payload, namespace, name);
95
+ return { ordinal, namespace, name, ...(target ? { target } : {}) };
96
+ }
97
+ function spawnRequest(payload) {
98
+ return (payload.type === "function_call" &&
99
+ payload.namespace === "collaboration" &&
100
+ payload.name === "spawn_agent");
101
+ }
102
+ function acceptedSpawns(entries) {
103
+ const requests = entries.filter(({ payload }) => spawnRequest(payload));
104
+ const accepted = [];
105
+ for (const request of requests) {
106
+ const spawn = acceptedSpawn(request, requests, entries);
107
+ if (spawn)
108
+ accepted.push(spawn);
109
+ }
110
+ return accepted;
111
+ }
112
+ function spawnArguments(request, requests) {
113
+ const callId = bounded(request.payload.call_id, IDENTIFIER);
114
+ if (!callId ||
115
+ requests.filter(({ payload }) => payload.call_id === callId).length !== 1)
116
+ return null;
117
+ const args = parsedObject(request.payload.arguments);
118
+ return args ? { callId, args } : null;
119
+ }
120
+ function startedSpawn(payload, callId) {
121
+ const item = isRecord(payload.item) ? payload.item : {};
122
+ return (payload.type === "item_completed" &&
123
+ item.type === "SubAgentActivity" &&
124
+ item.id === callId &&
125
+ item.kind === "started");
126
+ }
127
+ function spawnBoundaries(entries, callId) {
128
+ const starts = entries.filter(({ payload }) => startedSpawn(payload, callId));
129
+ const outputs = entries.filter(({ payload }) => payload.type === "function_call_output" && payload.call_id === callId);
130
+ const [start] = starts, [result] = outputs;
131
+ if (starts.length !== 1 ||
132
+ outputs.length !== 1 ||
133
+ start === undefined ||
134
+ result === undefined)
135
+ return null;
136
+ return { start, result };
137
+ }
138
+ function spawnIdentity(request, start, result) {
139
+ const item = isRecord(start.payload.item) ? start.payload.item : {};
140
+ const agentRef = bounded(item.agent_path, AGENT_REF), threadId = bounded(item.agent_thread_id, IDENTIFIER);
141
+ if (!agentRef || !threadId || !spawnOrdered(request, start, result))
142
+ return null;
143
+ return { agentRef, threadId };
144
+ }
145
+ function spawnOrdered(request, start, result) {
146
+ return request.ordinal < start.ordinal && start.ordinal < result.ordinal;
147
+ }
148
+ function acceptedSpawn(request, requests, entries) {
149
+ const declaration = spawnArguments(request, requests);
150
+ if (!declaration)
151
+ return null;
152
+ const boundaries = spawnBoundaries(entries, declaration.callId);
153
+ if (!boundaries)
154
+ return null;
155
+ return correlatedSpawn(request, declaration, boundaries);
156
+ }
157
+ function correlatedSpawn(request, declaration, boundaries) {
158
+ const { start, result } = boundaries;
159
+ const identity = spawnIdentity(request, start, result);
160
+ if (!identity)
161
+ return null;
162
+ const output = parsedObject(result.payload.output);
163
+ if (!output || output.task_name !== identity.agentRef)
164
+ return null;
165
+ return {
166
+ callId: declaration.callId,
167
+ ...identity,
168
+ requestedOrdinal: request.ordinal,
169
+ startedOrdinal: start.ordinal,
170
+ acceptedOrdinal: result.ordinal,
171
+ ...requestFields(declaration.args),
172
+ };
173
+ }
174
+ function requestFields(args) {
175
+ const taskName = bounded(args.task_name, /^[a-z0-9][a-z0-9_]{0,63}$/);
176
+ const model = bounded(args.model, IDENTIFIER);
177
+ const reasoningEffort = bounded(args.reasoning_effort, /^(?:low|medium|high|xhigh|max|ultra)$/);
178
+ const forkTurns = bounded(args.fork_turns, /^(?:none|all|[1-9][0-9]*)$/);
179
+ return {
180
+ ...(taskName ? { taskName } : {}),
181
+ ...(model ? { model } : {}),
182
+ ...(reasoningEffort ? { reasoningEffort } : {}),
183
+ ...(forkTurns ? { forkTurns } : {}),
184
+ };
185
+ }
186
+ function feedbackRepresentation(message) {
187
+ if (typeof message !== "string")
188
+ return "unavailable";
189
+ return /^gAAAAA[A-Za-z0-9_-]+={0,2}$/.test(message)
190
+ ? "encrypted"
191
+ : "plaintext";
192
+ }
193
+ function feedbackMessageEvidence(payload, followUpPrompt) {
194
+ const message = parsedObject(payload.arguments)?.message;
195
+ const messageRepresentation = feedbackRepresentation(message);
196
+ return {
197
+ messageRepresentation,
198
+ messageMatchesFollowUpPrompt: messageRepresentation === "plaintext" && followUpPrompt !== undefined
199
+ ? message === followUpPrompt
200
+ : null,
201
+ };
202
+ }
203
+ function feedbackPayload(payload) {
204
+ return (payload.type === "function_call" &&
205
+ payload.namespace === "collaboration" &&
206
+ typeof payload.name === "string" &&
207
+ ["followup_task", "send_message", "interrupt_agent"].includes(payload.name));
208
+ }
209
+ function feedbackResponses(entries, callId, ordinal) {
210
+ return callId
211
+ ? entries.filter((entry) => entry.ordinal > ordinal &&
212
+ entry.payload.type === "function_call_output" &&
213
+ entry.payload.call_id === callId)
214
+ : [];
215
+ }
216
+ function responseObserved(outputs) {
217
+ return outputs.length === 1 && typeof outputs[0]?.payload.output === "string";
218
+ }
219
+ function nativeFeedbackCalls(entries, followUpPrompt) {
220
+ return entries.flatMap((entry) => feedbackCall(entry, entries, followUpPrompt));
221
+ }
222
+ function feedbackCall({ ordinal, payload }, entries, followUpPrompt) {
223
+ if (!feedbackPayload(payload))
224
+ return [];
225
+ const outputs = feedbackResponses(entries, bounded(payload.call_id, IDENTIFIER), ordinal);
226
+ return [
227
+ {
228
+ ordinal,
229
+ tool: payload.name,
230
+ target: nativeToolCall(ordinal, payload)?.target ?? null,
231
+ responseObserved: responseObserved(outputs),
232
+ ...feedbackMessageEvidence(payload, followUpPrompt),
233
+ },
234
+ ];
235
+ }
236
+ function parseSession(text, followUpPrompt) {
237
+ const state = {
238
+ calls: [],
239
+ toolCalls: [],
240
+ entries: [],
241
+ submittedExecCalls: 0,
242
+ lastOrdinal: -1,
243
+ malformed: false,
244
+ entryCount: 0,
245
+ };
246
+ for (const line of text.split("\n")) {
247
+ if (!line.trim())
248
+ continue;
249
+ if (!consumeSessionLine(line, state))
250
+ break;
251
+ }
252
+ return {
253
+ entries: state.entries,
254
+ observation: sessionObservation(state, followUpPrompt),
255
+ };
256
+ }
257
+ function consumeSessionLine(line, state) {
258
+ state.entryCount++;
259
+ if (state.entryCount > MAX_SESSION_ENTRIES) {
260
+ state.malformed = true;
261
+ return false;
262
+ }
263
+ const entry = parsedSessionEntry(line, state);
264
+ if (!entry)
265
+ return true;
266
+ state.lastOrdinal = entry.ordinal;
267
+ state.entries.push(entry);
268
+ retainSessionCalls(entry, state);
269
+ return !truncateSessionCalls(state);
270
+ }
271
+ function sessionOrdinal(entry, lastOrdinal) {
272
+ return (typeof entry.ordinal === "number" &&
273
+ Number.isSafeInteger(entry.ordinal) &&
274
+ entry.ordinal > lastOrdinal);
275
+ }
276
+ function parsedSessionEntry(line, state) {
277
+ let entry;
278
+ try {
279
+ entry = JSON.parse(line);
280
+ }
281
+ catch {
282
+ state.malformed = true;
283
+ return null;
284
+ }
285
+ if (!isRecord(entry) ||
286
+ !sessionOrdinal(entry, state.lastOrdinal) ||
287
+ !isRecord(entry.payload)) {
288
+ state.malformed = true;
289
+ return null;
290
+ }
291
+ return { ordinal: entry.ordinal, payload: entry.payload };
292
+ }
293
+ function retainSessionCalls(entry, state) {
294
+ if (entry.payload.type === "custom_tool_call" &&
295
+ entry.payload.name === "exec")
296
+ state.submittedExecCalls++;
297
+ const call = directCall(entry.ordinal, entry.payload);
298
+ if (call)
299
+ state.calls.push(call);
300
+ const tool = nativeToolCall(entry.ordinal, entry.payload);
301
+ if (tool)
302
+ state.toolCalls.push(tool);
303
+ }
304
+ function truncateSessionCalls(state) {
305
+ if (state.calls.length <= MAX_RETAINED_CALLS &&
306
+ state.toolCalls.length <= MAX_RETAINED_CALLS)
307
+ return false;
308
+ state.calls.length = MAX_RETAINED_CALLS;
309
+ state.toolCalls.length = MAX_RETAINED_CALLS;
310
+ state.malformed = true;
311
+ return true;
312
+ }
313
+ function sessionReceipts(state, followUpPrompt) {
314
+ if (state.malformed || state.entries.length === 0)
315
+ return { acceptedSpawns: [], feedbackCalls: [] };
316
+ return {
317
+ acceptedSpawns: acceptedSpawns(state.entries),
318
+ feedbackCalls: nativeFeedbackCalls(state.entries, followUpPrompt),
319
+ };
320
+ }
321
+ function sessionObservation(state, followUpPrompt) {
322
+ return {
323
+ id: "sevro.codex.native-calls",
324
+ completeness: state.malformed || state.entryCount === 0 ? "partial" : "complete",
325
+ data: {
326
+ method: "native_session",
327
+ calls: state.calls,
328
+ toolCalls: state.toolCalls,
329
+ submittedExecCalls: state.submittedExecCalls,
330
+ ...(state.submittedExecCalls > 0
331
+ ? { execCalls: codexExecCallReceipts(state.entries) }
332
+ : {}),
333
+ ...sessionReceipts(state, followUpPrompt),
334
+ childSessions: [],
335
+ childrenTruncated: false,
336
+ },
337
+ };
338
+ }
339
+ /** Bind a private final answer to the same turn's later native completion. */
340
+ function finalAgentMessage(payload) {
341
+ const item = isRecord(payload.item) ? payload.item : {};
342
+ return (payload.type === "item_completed" &&
343
+ item.type === "AgentMessage" &&
344
+ item.phase === "final_answer");
345
+ }
346
+ function childResultCompleted(entries) {
347
+ const finals = entries.filter(({ payload }) => finalAgentMessage(payload));
348
+ const completions = entries.filter(({ payload }) => payload.type === "task_complete");
349
+ const boundaries = childResultBoundaries(finals, completions, entries);
350
+ return (boundaries !== null &&
351
+ childFinalMatched(boundaries.final, boundaries.complete));
352
+ }
353
+ function childResultBoundaries(finals, completions, entries) {
354
+ if (!uniqueChildCompletion(finals, completions, entries))
355
+ return null;
356
+ const [final] = finals, [complete] = completions;
357
+ return final && complete ? { final, complete } : null;
358
+ }
359
+ function uniqueChildCompletion(finals, completions, entries) {
360
+ return (finals.length === 1 &&
361
+ completions.length === 1 &&
362
+ !entries.some(({ payload }) => payload.type === "turn_aborted" || payload.type === "turn_failed"));
363
+ }
364
+ function childFinalMatched(final, complete) {
365
+ if (!childCompletionOrdered(final, complete))
366
+ return false;
367
+ const item = isRecord(final.payload.item) ? final.payload.item : {};
368
+ const message = childMessage(item.content);
369
+ return (message !== null &&
370
+ message.trim().length > 0 &&
371
+ complete.payload.last_agent_message === message);
372
+ }
373
+ function childCompletionOrdered(final, complete) {
374
+ return (!!bounded(final.payload.turn_id, IDENTIFIER) &&
375
+ complete.payload.turn_id === final.payload.turn_id &&
376
+ final.ordinal < complete.ordinal);
377
+ }
378
+ function childTextBlock(part) {
379
+ return (isRecord(part) && part.type === "Text" && typeof part.text === "string");
380
+ }
381
+ function childMessage(content) {
382
+ if (!isUnknownArray(content) ||
383
+ content.length === 0 ||
384
+ !content.every(childTextBlock))
385
+ return null;
386
+ return content.map((part) => part.text).join("");
387
+ }
388
+ function nestedRequestFields(payload) {
389
+ const args = parsedObject(payload.arguments);
390
+ return args ? requestFields(args) : {};
391
+ }
392
+ async function nestedSpawnReceipts(home, rootThread, parentThread, entries) {
393
+ const requests = entries.filter(({ payload }) => payload.type === "function_call" &&
394
+ payload.namespace === "collaboration" &&
395
+ payload.name === "spawn_agent");
396
+ const accepted = acceptedSpawns(entries);
397
+ const nestedSpawns = await Promise.all(requests
398
+ .slice(0, MAX_CHILD_SESSIONS)
399
+ .map((request) => nestedSpawnReceipt(home, rootThread, parentThread, accepted, request)));
400
+ return {
401
+ nestedSpawns,
402
+ requestsTruncated: requests.length > MAX_CHILD_SESSIONS,
403
+ };
404
+ }
405
+ async function nestedSpawnReceipt(home, rootThread, parentThread, accepted, { ordinal, payload }) {
406
+ const receipt = accepted.find((spawn) => spawn.requestedOrdinal === ordinal);
407
+ const session = await nestedReaderSession(home, rootThread, parentThread, receipt);
408
+ return {
409
+ requestedOrdinal: ordinal,
410
+ status: receipt ? "accepted" : "unaccepted",
411
+ ...nestedRequestFields(payload),
412
+ ...(receipt
413
+ ? { agentRef: receipt.agentRef, threadId: receipt.threadId }
414
+ : {}),
415
+ ...nestedReaderStatus(session),
416
+ };
417
+ }
418
+ function nestedReaderStatus(session) {
419
+ return {
420
+ sessionStatus: session?.status ?? "unavailable",
421
+ readerResultStatus: session?.resultStatus ?? "unavailable",
422
+ };
423
+ }
424
+ async function nestedReaderSession(home, rootThread, parentThread, receipt) {
425
+ if (!receipt)
426
+ return null;
427
+ if (receipt.threadId === rootThread)
428
+ return { threadId: receipt.threadId, status: "partial" };
429
+ return childSessionStatus(home, parentThread, receipt.threadId);
430
+ }
431
+ async function childSessionStatus(home, parentThread, threadId, rootThread) {
432
+ if (threadId === parentThread)
433
+ return { threadId, status: "partial" };
434
+ const located = await sessionPath(home, threadId);
435
+ if (located.status !== "found")
436
+ return { threadId, status: located.status };
437
+ try {
438
+ const text = await readNativeSession(located.path);
439
+ if (text === null)
440
+ return { threadId, status: "partial" };
441
+ return await availableChildSession(home, threadId, text, rootThread);
442
+ }
443
+ catch {
444
+ return { threadId, status: "partial" };
445
+ }
446
+ }
447
+ async function availableChildSession(home, threadId, text, rootThread) {
448
+ const parsed = parseSession(text);
449
+ if (parsed.observation.completeness !== "complete")
450
+ return { threadId, status: "partial" };
451
+ const nested = rootThread
452
+ ? await nestedSpawnReceipts(home, rootThread, threadId, parsed.entries)
453
+ : undefined;
454
+ return {
455
+ threadId,
456
+ status: "available",
457
+ resultStatus: childResultCompleted(parsed.entries)
458
+ ? "completed"
459
+ : "unavailable",
460
+ ...nested,
461
+ };
462
+ }
463
+ /** Last validated native event before a follow-up prompt enters this thread. */
464
+ export async function codexNativeSessionLastOrdinal(home, threadId) {
465
+ const located = await sessionPath(home, threadId);
466
+ if (located.status !== "found")
467
+ return null;
468
+ try {
469
+ const text = await readNativeSession(located.path);
470
+ return text === null ? null : lastSessionOrdinal(text);
471
+ }
472
+ catch {
473
+ return null;
474
+ }
475
+ }
476
+ function lastSessionOrdinal(text) {
477
+ const parsed = parseSession(text);
478
+ if (parsed.observation.completeness !== "complete")
479
+ return null;
480
+ return parsed.entries.at(-1)?.ordinal ?? null;
481
+ }
482
+ /** Bind one private native session to the completed public thread. */
483
+ export async function codexNativeCallObservation(home, threadId, context) {
484
+ const located = await sessionPath(home, threadId);
485
+ if (located.status !== "found")
486
+ return unavailable(located.status === "ambiguous" ? "partial" : located.status);
487
+ try {
488
+ return await nativeSessionObservation(home, threadId, located.path, context);
489
+ }
490
+ catch {
491
+ return unavailable("partial");
492
+ }
493
+ }
494
+ async function nativeSessionObservation(home, threadId, path, context) {
495
+ const text = await readNativeSession(path);
496
+ if (text === null)
497
+ return unavailable("partial");
498
+ const { observation } = parseSession(text, context?.followUpPrompt);
499
+ if (observation.completeness !== "complete")
500
+ return observation;
501
+ const children = [
502
+ ...new Set(observation.data.acceptedSpawns.map((spawn) => spawn.threadId)),
503
+ ];
504
+ const childSessions = await Promise.all(children
505
+ .slice(0, MAX_CHILD_SESSIONS)
506
+ .map((child) => childSessionStatus(home, threadId, child, threadId)));
507
+ return {
508
+ ...observation,
509
+ data: {
510
+ ...observation.data,
511
+ childSessions,
512
+ childrenTruncated: children.length > MAX_CHILD_SESSIONS,
513
+ },
514
+ };
515
+ }
516
+ //# sourceMappingURL=codex-native-calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-native-calls.js","sourceRoot":"","sources":["codex-native-calls.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecord, isUnknownArray } from \"../value-guards\";\nimport {\n codexExecCallReceipts,\n type ExecCallReceipt,\n} from \"./codex-exec-controls\";\nimport {\n readNativeSession,\n locateNativeSession as sessionPath,\n} from \"./codex-session-files\";\n\nconst MAX_SESSION_ENTRIES = 10_000;\nconst MAX_RETAINED_CALLS = 128;\nconst MAX_CHILD_SESSIONS = 8;\nconst GOAL_CONTROLS = new Set([\"create_goal\", \"get_goal\", \"update_goal\"]);\nconst COLLABORATION_CONTROLS = new Set([\n \"spawn_agent\",\n \"list_agents\",\n \"wait_agent\",\n \"followup_task\",\n \"send_message\",\n \"interrupt_agent\",\n]);\n\ninterface NativeCall {\n ordinal: number;\n namespace: \"functions\" | \"collaboration\";\n name: string;\n evidence: \"invocation_attempt\";\n}\n\ninterface NativeToolCall {\n ordinal: number;\n namespace: \"functions\" | \"collaboration\" | \"clock\" | \"other\";\n name: string;\n target?: string;\n}\n\ninterface AcceptedSpawn {\n callId: string;\n agentRef: string;\n threadId: string;\n requestedOrdinal: number;\n startedOrdinal: number;\n acceptedOrdinal: number;\n taskName?: string;\n model?: string;\n reasoningEffort?: string;\n forkTurns?: string;\n}\n\ninterface NativeFeedbackCall {\n ordinal: number;\n tool: \"followup_task\" | \"send_message\" | \"interrupt_agent\";\n target: string | null;\n responseObserved: boolean;\n messageRepresentation: \"plaintext\" | \"encrypted\" | \"unavailable\";\n messageMatchesFollowUpPrompt: boolean | null;\n}\n\ninterface ChildSession {\n threadId: string;\n status: \"available\" | \"unavailable\" | \"ambiguous\" | \"partial\";\n resultStatus?: \"completed\" | \"unavailable\";\n nestedSpawns?: NestedSpawn[];\n requestsTruncated?: boolean;\n}\n\ninterface NestedSpawn {\n requestedOrdinal: number;\n status: \"accepted\" | \"unaccepted\";\n taskName?: string;\n model?: string;\n reasoningEffort?: string;\n forkTurns?: string;\n agentRef?: string;\n threadId?: string;\n sessionStatus: ChildSession[\"status\"];\n readerResultStatus: \"completed\" | \"unavailable\";\n}\n\ninterface NativeCallContext {\n followUpPrompt?: string;\n}\n\ninterface NativeCallObservation {\n id: \"sevro.codex.native-calls\";\n completeness: \"complete\" | \"partial\" | \"unavailable\";\n data: {\n method: \"native_session\";\n calls: NativeCall[];\n toolCalls: NativeToolCall[];\n submittedExecCalls: number;\n execCalls?: ExecCallReceipt[];\n acceptedSpawns: AcceptedSpawn[];\n feedbackCalls: NativeFeedbackCall[];\n childSessions: ChildSession[];\n childrenTruncated: boolean;\n };\n}\n\nfunction unavailable(\n completeness: NativeCallObservation[\"completeness\"],\n): NativeCallObservation {\n return {\n id: \"sevro.codex.native-calls\",\n completeness,\n data: {\n method: \"native_session\",\n calls: [],\n toolCalls: [],\n submittedExecCalls: 0,\n acceptedSpawns: [],\n feedbackCalls: [],\n childSessions: [],\n childrenTruncated: false,\n },\n };\n}\n\nfunction nativeControlNamespace(\n payload: Record<string, unknown> & { name: string },\n): NativeCall[\"namespace\"] | null {\n if (goalNamespace(payload.namespace) && GOAL_CONTROLS.has(payload.name))\n return \"functions\";\n if (\n payload.namespace === \"collaboration\" &&\n COLLABORATION_CONTROLS.has(payload.name)\n )\n return \"collaboration\";\n return null;\n}\nfunction goalNamespace(value: unknown): boolean {\n return value === \"functions\" || value === undefined;\n}\nfunction directCall(\n ordinal: number,\n payload: Record<string, unknown>,\n): NativeCall | null {\n if (payload.type !== \"function_call\" || typeof payload.name !== \"string\")\n return null;\n const namespace = nativeControlNamespace({ ...payload, name: payload.name });\n return namespace\n ? { ordinal, namespace, name: payload.name, evidence: \"invocation_attempt\" }\n : null;\n}\n\nconst IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/;\nconst AGENT_REF =\n /^(?:\\/root(?:\\/[a-z0-9_]+)+|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/;\n\nfunction bounded(value: unknown, pattern: RegExp): string | undefined {\n return typeof value === \"string\" && value.length <= 128 && pattern.test(value)\n ? value\n : undefined;\n}\n\nfunction toolNamespace(value: unknown): NativeToolCall[\"namespace\"] {\n return value === \"functions\" || value === \"collaboration\" || value === \"clock\"\n ? value\n : \"other\";\n}\nfunction parsedObject(text: unknown): Record<string, unknown> | null {\n if (typeof text !== \"string\") return null;\n try {\n const value: unknown = JSON.parse(text);\n return isRecord(value) ? value : null;\n } catch {\n return null;\n }\n}\nfunction feedbackTarget(\n args: Record<string, unknown> | null,\n): string | undefined {\n if (!args) return undefined;\n return (\n bounded(args.target, AGENT_REF) ??\n bounded(args.target, /^[a-z0-9][a-z0-9_]{0,63}$/)\n );\n}\nfunction nativeToolTarget(\n payload: Record<string, unknown>,\n namespace: NativeToolCall[\"namespace\"],\n name: string,\n): string | undefined {\n if (\n namespace !== \"collaboration\" ||\n ![\"followup_task\", \"send_message\", \"interrupt_agent\"].includes(name)\n )\n return undefined;\n return feedbackTarget(parsedObject(payload.arguments));\n}\nfunction toolCallType(value: unknown): boolean {\n return value === \"function_call\" || value === \"custom_tool_call\";\n}\nfunction nativeToolCall(\n ordinal: number,\n payload: Record<string, unknown>,\n): NativeToolCall | null {\n if (!toolCallType(payload.type)) return null;\n const namespace = toolNamespace(payload.namespace);\n const name =\n bounded(payload.name, /^[A-Za-z_][A-Za-z0-9_]{0,63}$/) ?? \"other\";\n const target = nativeToolTarget(payload, namespace, name);\n return { ordinal, namespace, name, ...(target ? { target } : {}) };\n}\n\ntype NativeEntry = { ordinal: number; payload: Record<string, unknown> };\nfunction spawnRequest(payload: Record<string, unknown>): boolean {\n return (\n payload.type === \"function_call\" &&\n payload.namespace === \"collaboration\" &&\n payload.name === \"spawn_agent\"\n );\n}\nfunction acceptedSpawns(entries: NativeEntry[]): AcceptedSpawn[] {\n const requests = entries.filter(({ payload }) => spawnRequest(payload));\n const accepted: AcceptedSpawn[] = [];\n for (const request of requests) {\n const spawn = acceptedSpawn(request, requests, entries);\n if (spawn) accepted.push(spawn);\n }\n return accepted;\n}\nfunction spawnArguments(request: NativeEntry, requests: NativeEntry[]) {\n const callId = bounded(request.payload.call_id, IDENTIFIER);\n if (\n !callId ||\n requests.filter(({ payload }) => payload.call_id === callId).length !== 1\n )\n return null;\n const args = parsedObject(request.payload.arguments);\n return args ? { callId, args } : null;\n}\nfunction startedSpawn(\n payload: Record<string, unknown>,\n callId: string,\n): boolean {\n const item = isRecord(payload.item) ? payload.item : {};\n return (\n payload.type === \"item_completed\" &&\n item.type === \"SubAgentActivity\" &&\n item.id === callId &&\n item.kind === \"started\"\n );\n}\nfunction spawnBoundaries(entries: NativeEntry[], callId: string) {\n const starts = entries.filter(({ payload }) => startedSpawn(payload, callId));\n const outputs = entries.filter(\n ({ payload }) =>\n payload.type === \"function_call_output\" && payload.call_id === callId,\n );\n const [start] = starts,\n [result] = outputs;\n if (\n starts.length !== 1 ||\n outputs.length !== 1 ||\n start === undefined ||\n result === undefined\n )\n return null;\n return { start, result };\n}\nfunction spawnIdentity(\n request: NativeEntry,\n start: NativeEntry,\n result: NativeEntry,\n) {\n const item = isRecord(start.payload.item) ? start.payload.item : {};\n const agentRef = bounded(item.agent_path, AGENT_REF),\n threadId = bounded(item.agent_thread_id, IDENTIFIER);\n if (!agentRef || !threadId || !spawnOrdered(request, start, result))\n return null;\n return { agentRef, threadId };\n}\nfunction spawnOrdered(\n request: NativeEntry,\n start: NativeEntry,\n result: NativeEntry,\n): boolean {\n return request.ordinal < start.ordinal && start.ordinal < result.ordinal;\n}\nfunction acceptedSpawn(\n request: NativeEntry,\n requests: NativeEntry[],\n entries: NativeEntry[],\n): AcceptedSpawn | null {\n const declaration = spawnArguments(request, requests);\n if (!declaration) return null;\n const boundaries = spawnBoundaries(entries, declaration.callId);\n if (!boundaries) return null;\n return correlatedSpawn(request, declaration, boundaries);\n}\nfunction correlatedSpawn(\n request: NativeEntry,\n declaration: { callId: string; args: Record<string, unknown> },\n boundaries: { start: NativeEntry; result: NativeEntry },\n): AcceptedSpawn | null {\n const { start, result } = boundaries;\n const identity = spawnIdentity(request, start, result);\n if (!identity) return null;\n const output = parsedObject(result.payload.output);\n if (!output || output.task_name !== identity.agentRef) return null;\n return {\n callId: declaration.callId,\n ...identity,\n requestedOrdinal: request.ordinal,\n startedOrdinal: start.ordinal,\n acceptedOrdinal: result.ordinal,\n ...requestFields(declaration.args),\n };\n}\nfunction requestFields(args: Record<string, unknown>) {\n const taskName = bounded(args.task_name, /^[a-z0-9][a-z0-9_]{0,63}$/);\n const model = bounded(args.model, IDENTIFIER);\n const reasoningEffort = bounded(\n args.reasoning_effort,\n /^(?:low|medium|high|xhigh|max|ultra)$/,\n );\n const forkTurns = bounded(args.fork_turns, /^(?:none|all|[1-9][0-9]*)$/);\n return {\n ...(taskName ? { taskName } : {}),\n ...(model ? { model } : {}),\n ...(reasoningEffort ? { reasoningEffort } : {}),\n ...(forkTurns ? { forkTurns } : {}),\n };\n}\n\nfunction feedbackRepresentation(\n message: unknown,\n): NativeFeedbackCall[\"messageRepresentation\"] {\n if (typeof message !== \"string\") return \"unavailable\";\n return /^gAAAAA[A-Za-z0-9_-]+={0,2}$/.test(message)\n ? \"encrypted\"\n : \"plaintext\";\n}\nfunction feedbackMessageEvidence(\n payload: Record<string, unknown>,\n followUpPrompt?: string,\n) {\n const message = parsedObject(payload.arguments)?.message;\n const messageRepresentation = feedbackRepresentation(message);\n return {\n messageRepresentation,\n messageMatchesFollowUpPrompt:\n messageRepresentation === \"plaintext\" && followUpPrompt !== undefined\n ? message === followUpPrompt\n : null,\n };\n}\n\nfunction feedbackPayload(\n payload: Record<string, unknown>,\n): payload is Record<string, unknown> & { name: NativeFeedbackCall[\"tool\"] } {\n return (\n payload.type === \"function_call\" &&\n payload.namespace === \"collaboration\" &&\n typeof payload.name === \"string\" &&\n [\"followup_task\", \"send_message\", \"interrupt_agent\"].includes(payload.name)\n );\n}\nfunction feedbackResponses(\n entries: NativeEntry[],\n callId: string | undefined,\n ordinal: number,\n) {\n return callId\n ? entries.filter(\n (entry) =>\n entry.ordinal > ordinal &&\n entry.payload.type === \"function_call_output\" &&\n entry.payload.call_id === callId,\n )\n : [];\n}\nfunction responseObserved(outputs: NativeEntry[]): boolean {\n return outputs.length === 1 && typeof outputs[0]?.payload.output === \"string\";\n}\nfunction nativeFeedbackCalls(\n entries: NativeEntry[],\n followUpPrompt?: string,\n): NativeFeedbackCall[] {\n return entries.flatMap((entry) =>\n feedbackCall(entry, entries, followUpPrompt),\n );\n}\nfunction feedbackCall(\n { ordinal, payload }: NativeEntry,\n entries: NativeEntry[],\n followUpPrompt: string | undefined,\n): NativeFeedbackCall[] {\n if (!feedbackPayload(payload)) return [];\n const outputs = feedbackResponses(\n entries,\n bounded(payload.call_id, IDENTIFIER),\n ordinal,\n );\n return [\n {\n ordinal,\n tool: payload.name,\n target: nativeToolCall(ordinal, payload)?.target ?? null,\n responseObserved: responseObserved(outputs),\n ...feedbackMessageEvidence(payload, followUpPrompt),\n },\n ];\n}\n\ninterface ParseState {\n calls: NativeCall[];\n toolCalls: NativeToolCall[];\n entries: NativeEntry[];\n submittedExecCalls: number;\n lastOrdinal: number;\n malformed: boolean;\n entryCount: number;\n}\nfunction parseSession(\n text: string,\n followUpPrompt?: string,\n): { observation: NativeCallObservation; entries: NativeEntry[] } {\n const state: ParseState = {\n calls: [],\n toolCalls: [],\n entries: [],\n submittedExecCalls: 0,\n lastOrdinal: -1,\n malformed: false,\n entryCount: 0,\n };\n for (const line of text.split(\"\\n\")) {\n if (!line.trim()) continue;\n if (!consumeSessionLine(line, state)) break;\n }\n return {\n entries: state.entries,\n observation: sessionObservation(state, followUpPrompt),\n };\n}\nfunction consumeSessionLine(line: string, state: ParseState): boolean {\n state.entryCount++;\n if (state.entryCount > MAX_SESSION_ENTRIES) {\n state.malformed = true;\n return false;\n }\n const entry = parsedSessionEntry(line, state);\n if (!entry) return true;\n state.lastOrdinal = entry.ordinal;\n state.entries.push(entry);\n retainSessionCalls(entry, state);\n return !truncateSessionCalls(state);\n}\nfunction sessionOrdinal(\n entry: Record<string, unknown>,\n lastOrdinal: number,\n): entry is Record<string, unknown> & { ordinal: number } {\n return (\n typeof entry.ordinal === \"number\" &&\n Number.isSafeInteger(entry.ordinal) &&\n entry.ordinal > lastOrdinal\n );\n}\nfunction parsedSessionEntry(\n line: string,\n state: ParseState,\n): NativeEntry | null {\n let entry: unknown;\n try {\n entry = JSON.parse(line);\n } catch {\n state.malformed = true;\n return null;\n }\n if (\n !isRecord(entry) ||\n !sessionOrdinal(entry, state.lastOrdinal) ||\n !isRecord(entry.payload)\n ) {\n state.malformed = true;\n return null;\n }\n return { ordinal: entry.ordinal, payload: entry.payload };\n}\nfunction retainSessionCalls(entry: NativeEntry, state: ParseState): void {\n if (\n entry.payload.type === \"custom_tool_call\" &&\n entry.payload.name === \"exec\"\n )\n state.submittedExecCalls++;\n const call = directCall(entry.ordinal, entry.payload);\n if (call) state.calls.push(call);\n const tool = nativeToolCall(entry.ordinal, entry.payload);\n if (tool) state.toolCalls.push(tool);\n}\nfunction truncateSessionCalls(state: ParseState): boolean {\n if (\n state.calls.length <= MAX_RETAINED_CALLS &&\n state.toolCalls.length <= MAX_RETAINED_CALLS\n )\n return false;\n state.calls.length = MAX_RETAINED_CALLS;\n state.toolCalls.length = MAX_RETAINED_CALLS;\n state.malformed = true;\n return true;\n}\nfunction sessionReceipts(\n state: ParseState,\n followUpPrompt: string | undefined,\n) {\n if (state.malformed || state.entries.length === 0)\n return { acceptedSpawns: [], feedbackCalls: [] };\n return {\n acceptedSpawns: acceptedSpawns(state.entries),\n feedbackCalls: nativeFeedbackCalls(state.entries, followUpPrompt),\n };\n}\nfunction sessionObservation(\n state: ParseState,\n followUpPrompt: string | undefined,\n): NativeCallObservation {\n return {\n id: \"sevro.codex.native-calls\",\n completeness:\n state.malformed || state.entryCount === 0 ? \"partial\" : \"complete\",\n data: {\n method: \"native_session\",\n calls: state.calls,\n toolCalls: state.toolCalls,\n submittedExecCalls: state.submittedExecCalls,\n ...(state.submittedExecCalls > 0\n ? { execCalls: codexExecCallReceipts(state.entries) }\n : {}),\n ...sessionReceipts(state, followUpPrompt),\n childSessions: [],\n childrenTruncated: false,\n },\n };\n}\n\n/** Bind a private final answer to the same turn's later native completion. */\n\nfunction finalAgentMessage(payload: Record<string, unknown>): boolean {\n const item = isRecord(payload.item) ? payload.item : {};\n return (\n payload.type === \"item_completed\" &&\n item.type === \"AgentMessage\" &&\n item.phase === \"final_answer\"\n );\n}\nfunction childResultCompleted(entries: NativeEntry[]): boolean {\n const finals = entries.filter(({ payload }) => finalAgentMessage(payload));\n const completions = entries.filter(\n ({ payload }) => payload.type === \"task_complete\",\n );\n const boundaries = childResultBoundaries(finals, completions, entries);\n return (\n boundaries !== null &&\n childFinalMatched(boundaries.final, boundaries.complete)\n );\n}\nfunction childResultBoundaries(\n finals: NativeEntry[],\n completions: NativeEntry[],\n entries: NativeEntry[],\n) {\n if (!uniqueChildCompletion(finals, completions, entries)) return null;\n const [final] = finals,\n [complete] = completions;\n return final && complete ? { final, complete } : null;\n}\n\nfunction uniqueChildCompletion(\n finals: NativeEntry[],\n completions: NativeEntry[],\n entries: NativeEntry[],\n): boolean {\n return (\n finals.length === 1 &&\n completions.length === 1 &&\n !entries.some(\n ({ payload }) =>\n payload.type === \"turn_aborted\" || payload.type === \"turn_failed\",\n )\n );\n}\nfunction childFinalMatched(final: NativeEntry, complete: NativeEntry): boolean {\n if (!childCompletionOrdered(final, complete)) return false;\n const item = isRecord(final.payload.item) ? final.payload.item : {};\n const message = childMessage(item.content);\n return (\n message !== null &&\n message.trim().length > 0 &&\n complete.payload.last_agent_message === message\n );\n}\nfunction childCompletionOrdered(\n final: NativeEntry,\n complete: NativeEntry,\n): boolean {\n return (\n !!bounded(final.payload.turn_id, IDENTIFIER) &&\n complete.payload.turn_id === final.payload.turn_id &&\n final.ordinal < complete.ordinal\n );\n}\nfunction childTextBlock(part: unknown): part is { type: \"Text\"; text: string } {\n return (\n isRecord(part) && part.type === \"Text\" && typeof part.text === \"string\"\n );\n}\nfunction childMessage(content: unknown): string | null {\n if (\n !isUnknownArray(content) ||\n content.length === 0 ||\n !content.every(childTextBlock)\n )\n return null;\n return content.map((part) => part.text).join(\"\");\n}\n\nfunction nestedRequestFields(payload: Record<string, unknown>) {\n const args = parsedObject(payload.arguments);\n return args ? requestFields(args) : {};\n}\n\nasync function nestedSpawnReceipts(\n home: string,\n rootThread: string,\n parentThread: string,\n entries: Array<{ ordinal: number; payload: Record<string, unknown> }>,\n) {\n const requests = entries.filter(\n ({ payload }) =>\n payload.type === \"function_call\" &&\n payload.namespace === \"collaboration\" &&\n payload.name === \"spawn_agent\",\n );\n const accepted = acceptedSpawns(entries);\n const nestedSpawns: NestedSpawn[] = await Promise.all(\n requests\n .slice(0, MAX_CHILD_SESSIONS)\n .map((request) =>\n nestedSpawnReceipt(home, rootThread, parentThread, accepted, request),\n ),\n );\n return {\n nestedSpawns,\n requestsTruncated: requests.length > MAX_CHILD_SESSIONS,\n };\n}\n\nasync function nestedSpawnReceipt(\n home: string,\n rootThread: string,\n parentThread: string,\n accepted: AcceptedSpawn[],\n { ordinal, payload }: NativeEntry,\n): Promise<NestedSpawn> {\n const receipt = accepted.find((spawn) => spawn.requestedOrdinal === ordinal);\n const session = await nestedReaderSession(\n home,\n rootThread,\n parentThread,\n receipt,\n );\n return {\n requestedOrdinal: ordinal,\n status: receipt ? \"accepted\" : \"unaccepted\",\n ...nestedRequestFields(payload),\n ...(receipt\n ? { agentRef: receipt.agentRef, threadId: receipt.threadId }\n : {}),\n ...nestedReaderStatus(session),\n };\n}\nfunction nestedReaderStatus(session: ChildSession | null) {\n return {\n sessionStatus: session?.status ?? \"unavailable\",\n readerResultStatus: session?.resultStatus ?? \"unavailable\",\n };\n}\nasync function nestedReaderSession(\n home: string,\n rootThread: string,\n parentThread: string,\n receipt: AcceptedSpawn | undefined,\n): Promise<ChildSession | null> {\n if (!receipt) return null;\n if (receipt.threadId === rootThread)\n return { threadId: receipt.threadId, status: \"partial\" };\n return childSessionStatus(home, parentThread, receipt.threadId);\n}\n\nasync function childSessionStatus(\n home: string,\n parentThread: string,\n threadId: string,\n rootThread?: string,\n): Promise<ChildSession> {\n if (threadId === parentThread) return { threadId, status: \"partial\" };\n const located = await sessionPath(home, threadId);\n if (located.status !== \"found\") return { threadId, status: located.status };\n try {\n const text = await readNativeSession(located.path);\n if (text === null) return { threadId, status: \"partial\" };\n return await availableChildSession(home, threadId, text, rootThread);\n } catch {\n return { threadId, status: \"partial\" };\n }\n}\n\nasync function availableChildSession(\n home: string,\n threadId: string,\n text: string,\n rootThread: string | undefined,\n): Promise<ChildSession> {\n const parsed = parseSession(text);\n if (parsed.observation.completeness !== \"complete\")\n return { threadId, status: \"partial\" };\n const nested = rootThread\n ? await nestedSpawnReceipts(home, rootThread, threadId, parsed.entries)\n : undefined;\n return {\n threadId,\n status: \"available\",\n resultStatus: childResultCompleted(parsed.entries)\n ? \"completed\"\n : \"unavailable\",\n ...nested,\n };\n}\n\n/** Last validated native event before a follow-up prompt enters this thread. */\nexport async function codexNativeSessionLastOrdinal(\n home: string,\n threadId: string,\n): Promise<number | null> {\n const located = await sessionPath(home, threadId);\n if (located.status !== \"found\") return null;\n try {\n const text = await readNativeSession(located.path);\n return text === null ? null : lastSessionOrdinal(text);\n } catch {\n return null;\n }\n}\n\nfunction lastSessionOrdinal(text: string): number | null {\n const parsed = parseSession(text);\n if (parsed.observation.completeness !== \"complete\") return null;\n return parsed.entries.at(-1)?.ordinal ?? null;\n}\n\n/** Bind one private native session to the completed public thread. */\nexport async function codexNativeCallObservation(\n home: string,\n threadId: string,\n context?: NativeCallContext,\n): Promise<NativeCallObservation> {\n const located = await sessionPath(home, threadId);\n if (located.status !== \"found\")\n return unavailable(\n located.status === \"ambiguous\" ? \"partial\" : located.status,\n );\n try {\n return await nativeSessionObservation(\n home,\n threadId,\n located.path,\n context,\n );\n } catch {\n return unavailable(\"partial\");\n }\n}\n\nasync function nativeSessionObservation(\n home: string,\n threadId: string,\n path: string,\n context: NativeCallContext | undefined,\n): Promise<NativeCallObservation> {\n const text = await readNativeSession(path);\n if (text === null) return unavailable(\"partial\");\n const { observation } = parseSession(text, context?.followUpPrompt);\n if (observation.completeness !== \"complete\") return observation;\n const children = [\n ...new Set(observation.data.acceptedSpawns.map((spawn) => spawn.threadId)),\n ];\n const childSessions = await Promise.all(\n children\n .slice(0, MAX_CHILD_SESSIONS)\n .map((child) => childSessionStatus(home, threadId, child, threadId)),\n );\n return {\n ...observation,\n data: {\n ...observation.data,\n childSessions,\n childrenTruncated: children.length > MAX_CHILD_SESSIONS,\n },\n };\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { HostProcessFailure, runHostProcess, } from "./process-lifecycle.js";
2
+ export class CodexProcessFailure extends HostProcessFailure {
3
+ constructor(phase, result) {
4
+ super("Codex", phase, result);
5
+ }
6
+ }
7
+ export function runCodexProcess(options) {
8
+ return runHostProcess({ ...options, host: "Codex" });
9
+ }
10
+ //# sourceMappingURL=codex-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-process.js","sourceRoot":"","sources":["codex-process.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,GAIf,+BAA4B;AAE7B,MAAM,OAAO,mBAAoB,SAAQ,kBAAkB;IACzD,YAAY,KAAY,EAAE,MAAyB;QACjD,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,OAAyC;IACvE,OAAO,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACvD,CAAC","sourcesContent":["import {\n HostProcessFailure,\n runHostProcess,\n type HostProcessOptions,\n type HostProcessResult,\n type Phase,\n} from \"./process-lifecycle\";\n\nexport class CodexProcessFailure extends HostProcessFailure {\n constructor(phase: Phase, result: HostProcessResult) {\n super(\"Codex\", phase, result);\n }\n}\n\nexport function runCodexProcess(options: Omit<HostProcessOptions, \"host\">) {\n return runHostProcess({ ...options, host: \"Codex\" });\n}\n"]}