agent-hitch 0.2.5 → 0.2.7

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 (395) hide show
  1. package/README.md +14 -1
  2. package/dist/scripts/canary-buildkit-secrets.js +166 -0
  3. package/dist/scripts/canary-buildkit-secrets.js.map +1 -0
  4. package/dist/scripts/canary-collision-domains.js +77 -0
  5. package/dist/scripts/canary-collision-domains.js.map +1 -0
  6. package/dist/scripts/canary-docker-image-observation.js +181 -0
  7. package/dist/scripts/canary-docker-image-observation.js.map +1 -0
  8. package/dist/scripts/canary-gpu-hardware.js +95 -0
  9. package/dist/scripts/canary-gpu-hardware.js.map +1 -0
  10. package/dist/scripts/canary-harbor-load.js +365 -0
  11. package/dist/scripts/canary-harbor-load.js.map +1 -0
  12. package/dist/scripts/canary-packaged-harness.js +75 -0
  13. package/dist/scripts/canary-packaged-harness.js.map +1 -0
  14. package/dist/scripts/canary-resource-load.js +188 -0
  15. package/dist/scripts/canary-resource-load.js.map +1 -0
  16. package/dist/scripts/check-architecture.js +8 -4
  17. package/dist/scripts/check-architecture.js.map +1 -1
  18. package/dist/scripts/docker-reaper-crash-child.js +21 -0
  19. package/dist/scripts/docker-reaper-crash-child.js.map +1 -0
  20. package/dist/src/adapters/catalog.js +1 -0
  21. package/dist/src/adapters/catalog.js.map +1 -1
  22. package/dist/src/adapters/discovery.js +1 -1
  23. package/dist/src/adapters/discovery.js.map +1 -1
  24. package/dist/src/adapters/providers/claude.js +6 -0
  25. package/dist/src/adapters/providers/claude.js.map +1 -1
  26. package/dist/src/adapters/providers/codex.js +6 -0
  27. package/dist/src/adapters/providers/codex.js.map +1 -1
  28. package/dist/src/adapters/providers/deepseek.js +6 -0
  29. package/dist/src/adapters/providers/deepseek.js.map +1 -1
  30. package/dist/src/adapters/providers/opencode.js +6 -0
  31. package/dist/src/adapters/providers/opencode.js.map +1 -1
  32. package/dist/src/adapters/providers/pi.js +6 -0
  33. package/dist/src/adapters/providers/pi.js.map +1 -1
  34. package/dist/src/artifacts/index.js +1 -0
  35. package/dist/src/artifacts/index.js.map +1 -1
  36. package/dist/src/backends/harbor/backend.js +55 -104
  37. package/dist/src/backends/harbor/backend.js.map +1 -1
  38. package/dist/src/backends/harbor/environment-config.js +92 -0
  39. package/dist/src/backends/harbor/environment-config.js.map +1 -0
  40. package/dist/src/backends/harbor/index.js +5 -1
  41. package/dist/src/backends/harbor/index.js.map +1 -1
  42. package/dist/src/backends/harbor/model-proxy-config.js +23 -0
  43. package/dist/src/backends/harbor/model-proxy-config.js.map +1 -0
  44. package/dist/src/backends/harbor/process.js +177 -0
  45. package/dist/src/backends/harbor/process.js.map +1 -0
  46. package/dist/src/backends/harbor/runtime-toolchain.js +30 -0
  47. package/dist/src/backends/harbor/runtime-toolchain.js.map +1 -0
  48. package/dist/src/backends/harbor/supervisor.js +74 -0
  49. package/dist/src/backends/harbor/supervisor.js.map +1 -0
  50. package/dist/src/backends/harbor/task-resources.js +206 -0
  51. package/dist/src/backends/harbor/task-resources.js.map +1 -0
  52. package/dist/src/backends/harbor/tools.js +6 -29
  53. package/dist/src/backends/harbor/tools.js.map +1 -1
  54. package/dist/src/backends/harbor/verifier-config.js +11 -0
  55. package/dist/src/backends/harbor/verifier-config.js.map +1 -0
  56. package/dist/src/backends/index.js +4 -1
  57. package/dist/src/backends/index.js.map +1 -1
  58. package/dist/src/cli/arguments.js +14 -0
  59. package/dist/src/cli/arguments.js.map +1 -1
  60. package/dist/src/cli/commands/daemon.js +135 -8
  61. package/dist/src/cli/commands/daemon.js.map +1 -1
  62. package/dist/src/cli/commands/eval.js +214 -4
  63. package/dist/src/cli/commands/eval.js.map +1 -1
  64. package/dist/src/cli/commands/images.js +40 -0
  65. package/dist/src/cli/commands/images.js.map +1 -0
  66. package/dist/src/cli/commands/run.js +6 -3
  67. package/dist/src/cli/commands/run.js.map +1 -1
  68. package/dist/src/cli/commands/runs.js +25 -3
  69. package/dist/src/cli/commands/runs.js.map +1 -1
  70. package/dist/src/cli/commands/worker.js +79 -0
  71. package/dist/src/cli/commands/worker.js.map +1 -0
  72. package/dist/src/cli/main.js +4 -0
  73. package/dist/src/cli/main.js.map +1 -1
  74. package/dist/src/cli/output.js +72 -3
  75. package/dist/src/cli/output.js.map +1 -1
  76. package/dist/src/control-plane/build-admission.js +69 -0
  77. package/dist/src/control-plane/build-admission.js.map +1 -0
  78. package/dist/src/control-plane/build-records.js +6 -0
  79. package/dist/src/control-plane/build-records.js.map +1 -0
  80. package/dist/src/control-plane/collisions.js +40 -0
  81. package/dist/src/control-plane/collisions.js.map +1 -0
  82. package/dist/src/control-plane/eval-control-state.js +22 -0
  83. package/dist/src/control-plane/eval-control-state.js.map +1 -0
  84. package/dist/src/control-plane/eval-control-work.js +39 -0
  85. package/dist/src/control-plane/eval-control-work.js.map +1 -0
  86. package/dist/src/control-plane/eval-image-resolution.js +52 -0
  87. package/dist/src/control-plane/eval-image-resolution.js.map +1 -0
  88. package/dist/src/control-plane/eval-image-services.js +30 -0
  89. package/dist/src/control-plane/eval-image-services.js.map +1 -0
  90. package/dist/src/control-plane/eval-records.js +252 -0
  91. package/dist/src/control-plane/eval-records.js.map +1 -0
  92. package/dist/src/control-plane/eval-recovery.js +181 -0
  93. package/dist/src/control-plane/eval-recovery.js.map +1 -0
  94. package/dist/src/control-plane/eval-scheduler.js +447 -0
  95. package/dist/src/control-plane/eval-scheduler.js.map +1 -0
  96. package/dist/src/control-plane/index.js +20 -0
  97. package/dist/src/control-plane/index.js.map +1 -0
  98. package/dist/src/control-plane/local-worker.js +49 -0
  99. package/dist/src/control-plane/local-worker.js.map +1 -0
  100. package/dist/src/control-plane/model-capture-planning.js +12 -0
  101. package/dist/src/control-plane/model-capture-planning.js.map +1 -0
  102. package/dist/src/control-plane/remote-result-transport.js +172 -0
  103. package/dist/src/control-plane/remote-result-transport.js.map +1 -0
  104. package/dist/src/control-plane/remote-work-coordinator.js +332 -0
  105. package/dist/src/control-plane/remote-work-coordinator.js.map +1 -0
  106. package/dist/src/control-plane/remote-work-inputs.js +266 -0
  107. package/dist/src/control-plane/remote-work-inputs.js.map +1 -0
  108. package/dist/src/control-plane/remote-work-recovery.js +181 -0
  109. package/dist/src/control-plane/remote-work-recovery.js.map +1 -0
  110. package/dist/src/control-plane/remote-worker-artifacts.js +135 -0
  111. package/dist/src/control-plane/remote-worker-artifacts.js.map +1 -0
  112. package/dist/src/control-plane/remote-worker-client.js +202 -0
  113. package/dist/src/control-plane/remote-worker-client.js.map +1 -0
  114. package/dist/src/control-plane/remote-worker-configuration.js +34 -0
  115. package/dist/src/control-plane/remote-worker-configuration.js.map +1 -0
  116. package/dist/src/control-plane/remote-worker-credentials.js +58 -0
  117. package/dist/src/control-plane/remote-worker-credentials.js.map +1 -0
  118. package/dist/src/control-plane/remote-worker-protocol.js +510 -0
  119. package/dist/src/control-plane/remote-worker-protocol.js.map +1 -0
  120. package/dist/src/control-plane/remote-worker-runner.js +214 -0
  121. package/dist/src/control-plane/remote-worker-runner.js.map +1 -0
  122. package/dist/src/control-plane/remote-workers.js +377 -0
  123. package/dist/src/control-plane/remote-workers.js.map +1 -0
  124. package/dist/src/control-plane/rerun-scheduler.js +411 -0
  125. package/dist/src/control-plane/rerun-scheduler.js.map +1 -0
  126. package/dist/src/control-plane/rerun-submission.js +56 -0
  127. package/dist/src/control-plane/rerun-submission.js.map +1 -0
  128. package/dist/src/control-plane/resources.js +182 -0
  129. package/dist/src/control-plane/resources.js.map +1 -0
  130. package/dist/src/control-plane/scheduler-eval-entry.js +32 -0
  131. package/dist/src/control-plane/scheduler-eval-entry.js.map +1 -0
  132. package/dist/src/control-plane/synthetic-result.js +21 -0
  133. package/dist/src/control-plane/synthetic-result.js.map +1 -0
  134. package/dist/src/control-plane/work-admission.js +21 -0
  135. package/dist/src/control-plane/work-admission.js.map +1 -0
  136. package/dist/src/control-plane/work-dispatcher.js +229 -0
  137. package/dist/src/control-plane/work-dispatcher.js.map +1 -0
  138. package/dist/src/controller-runtime/hash.js +12 -1
  139. package/dist/src/controller-runtime/hash.js.map +1 -1
  140. package/dist/src/controller-runtime/index.js +1 -1
  141. package/dist/src/controller-runtime/index.js.map +1 -1
  142. package/dist/src/controller-runtime/store.js +15 -6
  143. package/dist/src/controller-runtime/store.js.map +1 -1
  144. package/dist/src/daemon/client.js.map +1 -1
  145. package/dist/src/daemon/event-stream.js +46 -0
  146. package/dist/src/daemon/event-stream.js.map +1 -0
  147. package/dist/src/daemon/health.js +66 -0
  148. package/dist/src/daemon/health.js.map +1 -0
  149. package/dist/src/daemon/launcher.js +28 -1
  150. package/dist/src/daemon/launcher.js.map +1 -1
  151. package/dist/src/daemon/logging.js +23 -0
  152. package/dist/src/daemon/logging.js.map +1 -0
  153. package/dist/src/daemon/scheduler.js +26 -5
  154. package/dist/src/daemon/scheduler.js.map +1 -1
  155. package/dist/src/daemon/server.js +255 -98
  156. package/dist/src/daemon/server.js.map +1 -1
  157. package/dist/src/daemon/telemetry.js +163 -0
  158. package/dist/src/daemon/telemetry.js.map +1 -0
  159. package/dist/src/daemon/worker-routes.js +219 -0
  160. package/dist/src/daemon/worker-routes.js.map +1 -0
  161. package/dist/src/domain/bundles.js +2 -0
  162. package/dist/src/domain/bundles.js.map +1 -0
  163. package/dist/src/domain/control-plane.js +2 -0
  164. package/dist/src/domain/control-plane.js.map +1 -0
  165. package/dist/src/domain/execution-evidence.js +2 -0
  166. package/dist/src/domain/execution-evidence.js.map +1 -0
  167. package/dist/src/domain/execution-plan.js +2 -0
  168. package/dist/src/domain/execution-plan.js.map +1 -0
  169. package/dist/src/domain/images.js +2 -0
  170. package/dist/src/domain/images.js.map +1 -0
  171. package/dist/src/domain/index.js +9 -0
  172. package/dist/src/domain/index.js.map +1 -1
  173. package/dist/src/domain/interactions.js +2 -0
  174. package/dist/src/domain/interactions.js.map +1 -0
  175. package/dist/src/domain/providers.js +2 -0
  176. package/dist/src/domain/providers.js.map +1 -0
  177. package/dist/src/domain/resources.js +2 -0
  178. package/dist/src/domain/resources.js.map +1 -0
  179. package/dist/src/domain/workers.js +2 -0
  180. package/dist/src/domain/workers.js.map +1 -0
  181. package/dist/src/evals/collect-only-rerun.js +182 -0
  182. package/dist/src/evals/collect-only-rerun.js.map +1 -0
  183. package/dist/src/evals/directory.js +30 -0
  184. package/dist/src/evals/directory.js.map +1 -0
  185. package/dist/src/evals/docker-engine-stats.js +89 -0
  186. package/dist/src/evals/docker-engine-stats.js.map +1 -0
  187. package/dist/src/evals/docker-ownership.js +51 -0
  188. package/dist/src/evals/docker-ownership.js.map +1 -0
  189. package/dist/src/evals/docker-reaper.js +144 -0
  190. package/dist/src/evals/docker-reaper.js.map +1 -0
  191. package/dist/src/evals/docker-resource-observer.js +207 -0
  192. package/dist/src/evals/docker-resource-observer.js.map +1 -0
  193. package/dist/src/evals/environment-image-planning.js +164 -0
  194. package/dist/src/evals/environment-image-planning.js.map +1 -0
  195. package/dist/src/evals/eval-artifact-planning.js +56 -0
  196. package/dist/src/evals/eval-artifact-planning.js.map +1 -0
  197. package/dist/src/evals/eval-finalization.js +10 -0
  198. package/dist/src/evals/eval-finalization.js.map +1 -0
  199. package/dist/src/evals/eval-lifecycle-events.js +16 -0
  200. package/dist/src/evals/eval-lifecycle-events.js.map +1 -0
  201. package/dist/src/evals/events.js +53 -5
  202. package/dist/src/evals/events.js.map +1 -1
  203. package/dist/src/evals/execution-evidence.js +116 -0
  204. package/dist/src/evals/execution-evidence.js.map +1 -0
  205. package/dist/src/evals/execution-leases.js +342 -0
  206. package/dist/src/evals/execution-leases.js.map +1 -0
  207. package/dist/src/evals/execution-plan-artifacts.js +72 -0
  208. package/dist/src/evals/execution-plan-artifacts.js.map +1 -0
  209. package/dist/src/evals/execution-plan-images.js +69 -0
  210. package/dist/src/evals/execution-plan-images.js.map +1 -0
  211. package/dist/src/evals/execution-plan-resources.js +174 -0
  212. package/dist/src/evals/execution-plan-resources.js.map +1 -0
  213. package/dist/src/evals/execution-plan.js +415 -0
  214. package/dist/src/evals/execution-plan.js.map +1 -0
  215. package/dist/src/evals/harbor-artifact-builder-image.js +99 -0
  216. package/dist/src/evals/harbor-artifact-builder-image.js.map +1 -0
  217. package/dist/src/evals/harbor-artifact-builder.js +354 -0
  218. package/dist/src/evals/harbor-artifact-builder.js.map +1 -0
  219. package/dist/src/evals/harbor-bridge-error.js +39 -3
  220. package/dist/src/evals/harbor-bridge-error.js.map +1 -1
  221. package/dist/src/evals/harbor-phase-timings.js +60 -0
  222. package/dist/src/evals/harbor-phase-timings.js.map +1 -0
  223. package/dist/src/evals/index.js +26 -3
  224. package/dist/src/evals/index.js.map +1 -1
  225. package/dist/src/evals/infrastructure-retry.js +218 -0
  226. package/dist/src/evals/infrastructure-retry.js.map +1 -0
  227. package/dist/src/evals/interaction-capture-import.js +49 -0
  228. package/dist/src/evals/interaction-capture-import.js.map +1 -0
  229. package/dist/src/evals/local-docker-provider.js +372 -0
  230. package/dist/src/evals/local-docker-provider.js.map +1 -0
  231. package/dist/src/evals/local-eval-planning.js +80 -0
  232. package/dist/src/evals/local-eval-planning.js.map +1 -0
  233. package/dist/src/evals/model-capture-plan.js +22 -0
  234. package/dist/src/evals/model-capture-plan.js.map +1 -0
  235. package/dist/src/evals/model-capture-runtime.js +114 -0
  236. package/dist/src/evals/model-capture-runtime.js.map +1 -0
  237. package/dist/src/evals/model-proxy-runtime-state.js +53 -0
  238. package/dist/src/evals/model-proxy-runtime-state.js.map +1 -0
  239. package/dist/src/evals/planned-execution-support.js +54 -0
  240. package/dist/src/evals/planned-execution-support.js.map +1 -0
  241. package/dist/src/evals/planned-execution.js +461 -0
  242. package/dist/src/evals/planned-execution.js.map +1 -0
  243. package/dist/src/evals/planned-remote-execution.js +40 -0
  244. package/dist/src/evals/planned-remote-execution.js.map +1 -0
  245. package/dist/src/evals/planned-retry-lifecycle.js +186 -0
  246. package/dist/src/evals/planned-retry-lifecycle.js.map +1 -0
  247. package/dist/src/evals/prepared-harness.js +76 -0
  248. package/dist/src/evals/prepared-harness.js.map +1 -0
  249. package/dist/src/evals/progress.js +4 -4
  250. package/dist/src/evals/progress.js.map +1 -1
  251. package/dist/src/evals/records.js +20 -3
  252. package/dist/src/evals/records.js.map +1 -1
  253. package/dist/src/evals/recovery.js +192 -0
  254. package/dist/src/evals/recovery.js.map +1 -0
  255. package/dist/src/evals/remote-infrastructure-retry.js +99 -0
  256. package/dist/src/evals/remote-infrastructure-retry.js.map +1 -0
  257. package/dist/src/evals/request.js +14 -1
  258. package/dist/src/evals/request.js.map +1 -1
  259. package/dist/src/evals/rerun-inputs.js +89 -0
  260. package/dist/src/evals/rerun-inputs.js.map +1 -0
  261. package/dist/src/evals/rerun-slots.js +12 -3
  262. package/dist/src/evals/rerun-slots.js.map +1 -1
  263. package/dist/src/evals/rerun-types.js +49 -0
  264. package/dist/src/evals/rerun-types.js.map +1 -0
  265. package/dist/src/evals/rerun.js +113 -75
  266. package/dist/src/evals/rerun.js.map +1 -1
  267. package/dist/src/evals/result-helpers.js +65 -0
  268. package/dist/src/evals/result-helpers.js.map +1 -0
  269. package/dist/src/evals/resume-state.js +36 -0
  270. package/dist/src/evals/resume-state.js.map +1 -0
  271. package/dist/src/evals/service-types.js +2 -0
  272. package/dist/src/evals/service-types.js.map +1 -0
  273. package/dist/src/evals/service.js +327 -237
  274. package/dist/src/evals/service.js.map +1 -1
  275. package/dist/src/evals/task-resources.js +209 -0
  276. package/dist/src/evals/task-resources.js.map +1 -0
  277. package/dist/src/evals/trial-environment-evidence.js +87 -0
  278. package/dist/src/evals/trial-environment-evidence.js.map +1 -0
  279. package/dist/src/evals/trial-execution-evidence.js +13 -0
  280. package/dist/src/evals/trial-execution-evidence.js.map +1 -0
  281. package/dist/src/evals/trial-import-identity.js +31 -0
  282. package/dist/src/evals/trial-import-identity.js.map +1 -0
  283. package/dist/src/evals/trial-import.js +166 -168
  284. package/dist/src/evals/trial-import.js.map +1 -1
  285. package/dist/src/evals/trial-publication-recovery.js +104 -0
  286. package/dist/src/evals/trial-publication-recovery.js.map +1 -0
  287. package/dist/src/evals/trial-publication.js +25 -0
  288. package/dist/src/evals/trial-publication.js.map +1 -0
  289. package/dist/src/evals/verifier-diagnostics.js +235 -0
  290. package/dist/src/evals/verifier-diagnostics.js.map +1 -0
  291. package/dist/src/evals/work-item-artifacts.js +23 -0
  292. package/dist/src/evals/work-item-artifacts.js.map +1 -0
  293. package/dist/src/foundation/config.js +17 -0
  294. package/dist/src/foundation/config.js.map +1 -1
  295. package/dist/src/foundation/credential-redaction.js +137 -0
  296. package/dist/src/foundation/credential-redaction.js.map +1 -0
  297. package/dist/src/foundation/environment-image-references.js +59 -0
  298. package/dist/src/foundation/environment-image-references.js.map +1 -0
  299. package/dist/src/foundation/executable.js +45 -5
  300. package/dist/src/foundation/executable.js.map +1 -1
  301. package/dist/src/foundation/index.js +5 -2
  302. package/dist/src/foundation/index.js.map +1 -1
  303. package/dist/src/foundation/process-identity.js +69 -0
  304. package/dist/src/foundation/process-identity.js.map +1 -0
  305. package/dist/src/images/context.js +47 -0
  306. package/dist/src/images/context.js.map +1 -0
  307. package/dist/src/images/docker-buildkit.js +137 -0
  308. package/dist/src/images/docker-buildkit.js.map +1 -0
  309. package/dist/src/images/dockerfile.js +67 -0
  310. package/dist/src/images/dockerfile.js.map +1 -0
  311. package/dist/src/images/gc.js +261 -0
  312. package/dist/src/images/gc.js.map +1 -0
  313. package/dist/src/images/index.js +10 -0
  314. package/dist/src/images/index.js.map +1 -0
  315. package/dist/src/images/manifest.js +109 -0
  316. package/dist/src/images/manifest.js.map +1 -0
  317. package/dist/src/images/ownership.js +5 -0
  318. package/dist/src/images/ownership.js.map +1 -0
  319. package/dist/src/images/records.js +32 -0
  320. package/dist/src/images/records.js.map +1 -0
  321. package/dist/src/images/registry.js +154 -0
  322. package/dist/src/images/registry.js.map +1 -0
  323. package/dist/src/images/service.js +224 -0
  324. package/dist/src/images/service.js.map +1 -0
  325. package/dist/src/model-access/capture.js +255 -0
  326. package/dist/src/model-access/capture.js.map +1 -0
  327. package/dist/src/model-access/index.js +5 -0
  328. package/dist/src/model-access/index.js.map +1 -0
  329. package/dist/src/model-access/policy.js +49 -0
  330. package/dist/src/model-access/policy.js.map +1 -0
  331. package/dist/src/model-access/proxy.js +336 -0
  332. package/dist/src/model-access/proxy.js.map +1 -0
  333. package/dist/src/model-access/records.js +167 -0
  334. package/dist/src/model-access/records.js.map +1 -0
  335. package/dist/src/runs/bundle.js +450 -0
  336. package/dist/src/runs/bundle.js.map +1 -0
  337. package/dist/src/runs/events.js +12 -1
  338. package/dist/src/runs/events.js.map +1 -1
  339. package/dist/src/runs/executor.js +24 -17
  340. package/dist/src/runs/executor.js.map +1 -1
  341. package/dist/src/runs/index.js +3 -1
  342. package/dist/src/runs/index.js.map +1 -1
  343. package/dist/src/runs/manifest.js +5 -5
  344. package/dist/src/runs/manifest.js.map +1 -1
  345. package/dist/src/runs/request.js +6 -1
  346. package/dist/src/runs/request.js.map +1 -1
  347. package/dist/src/runs/training-candidate.js +161 -0
  348. package/dist/src/runs/training-candidate.js.map +1 -0
  349. package/dist/src/trajectories/provider-capture.js +15 -24
  350. package/dist/src/trajectories/provider-capture.js.map +1 -1
  351. package/dist/src/trajectories/providers/deepseek.js +3 -3
  352. package/dist/src/trajectories/providers/deepseek.js.map +1 -1
  353. package/dist/src/workers/index.js +3 -0
  354. package/dist/src/workers/index.js.map +1 -0
  355. package/dist/src/workers/remote-harbor-work-spec.js +97 -0
  356. package/dist/src/workers/remote-harbor-work-spec.js.map +1 -0
  357. package/dist/src/workers/remote-harbor-worker.js +220 -0
  358. package/dist/src/workers/remote-harbor-worker.js.map +1 -0
  359. package/docs/schemas/environment-build-index.schema.json +13 -0
  360. package/docs/schemas/environment-build-record.schema.json +25 -0
  361. package/docs/schemas/environment-image-manifest.schema.json +62 -0
  362. package/docs/schemas/eval-control.schema.json +36 -0
  363. package/docs/schemas/eval-execution-plan.schema.json +216 -0
  364. package/docs/schemas/eval-request.schema.json +2 -0
  365. package/docs/schemas/eval-rerun-result.schema.json +53 -0
  366. package/docs/schemas/eval-rerun-state.schema.json +61 -0
  367. package/docs/schemas/eval-rerun-submission.schema.json +58 -0
  368. package/docs/schemas/eval-result.schema.json +34 -1
  369. package/docs/schemas/eval-submission-input.schema.json +14 -0
  370. package/docs/schemas/eval-submission.schema.json +68 -0
  371. package/docs/schemas/eval-trial-publication.schema.json +39 -0
  372. package/docs/schemas/execution-evidence.schema.json +96 -0
  373. package/docs/schemas/execution-lease.schema.json +50 -0
  374. package/docs/schemas/execution-provider-status.schema.json +65 -0
  375. package/docs/schemas/execution-worker.schema.json +53 -0
  376. package/docs/schemas/harbor-process-exit.schema.json +14 -0
  377. package/docs/schemas/interaction-capture-ref.schema.json +45 -0
  378. package/docs/schemas/local-provider-execution.schema.json +33 -0
  379. package/docs/schemas/model-interaction.schema.json +41 -0
  380. package/docs/schemas/remote-result-envelope.schema.json +32 -0
  381. package/docs/schemas/remote-tree-envelope.schema.json +25 -0
  382. package/docs/schemas/remote-work-offer.schema.json +58 -0
  383. package/docs/schemas/remote-work-receipt.schema.json +50 -0
  384. package/docs/schemas/remote-worker-artifact.schema.json +17 -0
  385. package/docs/schemas/remote-worker-event.schema.json +18 -0
  386. package/docs/schemas/remote-worker-heartbeat.schema.json +37 -0
  387. package/docs/schemas/remote-worker-registration.schema.json +52 -0
  388. package/docs/schemas/result-bundle-index.schema.json +133 -0
  389. package/docs/schemas/run-environment-images.schema.json +39 -0
  390. package/docs/schemas/training-data-candidate.schema.json +46 -0
  391. package/integrations/harbor/hitch_harbor_agent.py +300 -547
  392. package/integrations/harbor/hitch_harbor_environment.py +331 -0
  393. package/integrations/harbor/hitch_harbor_task_resources.py +275 -0
  394. package/integrations/harbor/hitch_harbor_verifier.py +337 -0
  395. package/package.json +16 -2
@@ -0,0 +1,337 @@
1
+ """Harbor verifier wrapper with conservative, verifier-only infra retries.
2
+
3
+ The wrapper retries the task's test script in the same live environment. It
4
+ never re-instantiates or calls the candidate agent, so the candidate workspace
5
+ and all other container state remain unchanged between verifier attempts.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import asyncio
11
+ import json
12
+ import re
13
+ import shutil
14
+ import time
15
+ from dataclasses import dataclass
16
+ from datetime import datetime, timezone
17
+ from pathlib import Path
18
+ from typing import Any
19
+
20
+ from harbor.models.trial.paths import EnvironmentPaths
21
+ from harbor.models.verifier.result import VerifierResult
22
+ from harbor.verifier.verifier import Verifier
23
+
24
+
25
+ MAX_LOG_BYTES = 256 * 1024
26
+ LOG_NAMES = ("test-stdout.txt", "test-stderr.txt", "stdout.txt", "stderr.txt")
27
+ OUTPUT_NAMES = (*LOG_NAMES, "reward.txt", "reward.json", "ctrf.json")
28
+ CONTROL_NAMES = ("infrastructure-error.json", "infrastructure-retry-history.json")
29
+
30
+ INFRASTRUCTURE_PATTERNS: tuple[tuple[str, tuple[re.Pattern[str], ...]], ...] = (
31
+ (
32
+ "dns_resolution_failed",
33
+ (
34
+ re.compile(r"curl:\s*\(\d+\)\s*Could not resolve host:", re.I),
35
+ re.compile(r"Temporary failure in name resolution", re.I),
36
+ re.compile(r"Name or service not known", re.I),
37
+ re.compile(r"getaddrinfo\s+(?:EAI_AGAIN|ENOTFOUND)", re.I),
38
+ re.compile(r"Could not resolve hostname", re.I),
39
+ ),
40
+ ),
41
+ (
42
+ "network_unreachable",
43
+ (
44
+ re.compile(r"Network is unreachable", re.I),
45
+ re.compile(
46
+ r"Failed to establish a new connection:[^\n]*(?:timed out|connection refused)",
47
+ re.I,
48
+ ),
49
+ re.compile(r"Could not connect to (?:host|server)", re.I),
50
+ ),
51
+ ),
52
+ (
53
+ "package_install_failed",
54
+ (
55
+ re.compile(r"Could not find a version that satisfies the requirement", re.I),
56
+ re.compile(r"No matching distribution found for", re.I),
57
+ re.compile(r"Failed to (?:download|fetch) [^\n]*(?:package|wheel|index)", re.I),
58
+ re.compile(r"error:\s*failed to (?:download|fetch|install)", re.I),
59
+ ),
60
+ ),
61
+ (
62
+ "test_runner_missing",
63
+ (
64
+ re.compile(r"(?:^|\n)[^\n]*(?:uvx|pytest|pipx|tox|nox): command not found(?:\n|$)", re.I),
65
+ re.compile(r"No module named ['\"]?(?:pytest|unittest|tox|nox)['\"]?", re.I),
66
+ ),
67
+ ),
68
+ (
69
+ "verifier_environment_missing",
70
+ (
71
+ re.compile(r"/(?:root|home/[^/]+)/\.local/bin/env: No such file or directory", re.I),
72
+ re.compile(
73
+ r"(?:^|\n)[^\n]*/bin/(?:python|python3|pytest|uv|uvx): No such file or directory(?:\n|$)",
74
+ re.I,
75
+ ),
76
+ ),
77
+ ),
78
+ )
79
+
80
+ TEST_EXECUTION_EVIDENCE = (
81
+ re.compile(r"test session starts", re.I),
82
+ re.compile(r"collected\s+\d+\s+items?", re.I),
83
+ re.compile(r"(?:^|\n)Ran\s+\d+\s+tests?", re.I),
84
+ re.compile(r"(?:^|\n)TAP version\s+\d+", re.I),
85
+ re.compile(r"={3,}[^\n]*(?:passed|failed|errors?|skipped)[^\n]*={3,}", re.I),
86
+ )
87
+
88
+
89
+ class VerifierInfrastructureError(RuntimeError):
90
+ """Raised after every verifier-only infrastructure retry is exhausted."""
91
+
92
+
93
+ @dataclass(frozen=True)
94
+ class InfrastructureObservation:
95
+ signals: tuple[str, ...]
96
+ source_files: tuple[str, ...]
97
+
98
+
99
+ class HitchRetryingVerifier(Verifier):
100
+ """Retry only masked verifier bootstrap failures in the live trial."""
101
+
102
+ def __init__(
103
+ self,
104
+ *args: Any,
105
+ infrastructure_retries: int = 1,
106
+ infrastructure_retry_backoff_ms: int = 1_000,
107
+ **kwargs: Any,
108
+ ) -> None:
109
+ if isinstance(infrastructure_retries, bool) or not isinstance(infrastructure_retries, int) or infrastructure_retries < 0:
110
+ raise ValueError("infrastructure_retries must be a non-negative integer")
111
+ if (
112
+ isinstance(infrastructure_retry_backoff_ms, bool)
113
+ or not isinstance(infrastructure_retry_backoff_ms, int)
114
+ or infrastructure_retry_backoff_ms < 0
115
+ ):
116
+ raise ValueError("infrastructure_retry_backoff_ms must be a non-negative integer")
117
+ super().__init__(*args, **kwargs)
118
+ self.infrastructure_retries = infrastructure_retries
119
+ self.infrastructure_retry_backoff_ms = infrastructure_retry_backoff_ms
120
+
121
+ async def verify(self) -> VerifierResult:
122
+ started_ns = time.monotonic_ns()
123
+ try:
124
+ return await self._verify_with_retries()
125
+ finally:
126
+ self._write_phase_timing(started_ns)
127
+
128
+ async def _verify_with_retries(self) -> VerifierResult:
129
+ # Do not trust a control file left by the candidate or a prior phase.
130
+ await self._remove_files(CONTROL_NAMES)
131
+ attempts: list[dict[str, Any]] = []
132
+ for attempt in range(1, self.infrastructure_retries + 2):
133
+ result: VerifierResult | None = None
134
+ caught: Exception | None = None
135
+ try:
136
+ result = await super().verify()
137
+ except Exception as error:
138
+ caught = error
139
+
140
+ reward = _primary_reward(result)
141
+ observation = _detect_infrastructure(
142
+ self.trial_paths.verifier_dir,
143
+ reward,
144
+ allow_missing_reward=caught is not None,
145
+ )
146
+ if observation is None:
147
+ # The control namespace belongs to this wrapper. Remove files
148
+ # a task script may have created before returning/propagating.
149
+ await self._remove_files(CONTROL_NAMES)
150
+ if caught is not None:
151
+ raise caught
152
+ if attempts:
153
+ self._write_history("recovered", attempts)
154
+ assert result is not None
155
+ return result
156
+
157
+ attempts.append(
158
+ {
159
+ "attempt": attempt,
160
+ "signals": list(observation.signals),
161
+ "source_files": list(observation.source_files),
162
+ }
163
+ )
164
+ self._archive_attempt(attempt)
165
+ if attempt > self.infrastructure_retries:
166
+ diagnostic = {
167
+ "schema_version": "1",
168
+ "code": "verifier_infrastructure_failure",
169
+ "signals": list(observation.signals),
170
+ "source_files": list(observation.source_files),
171
+ "attempts": attempts,
172
+ "max_retries": self.infrastructure_retries,
173
+ "backoff_ms": self.infrastructure_retry_backoff_ms,
174
+ }
175
+ self._write_json("infrastructure-error.json", diagnostic)
176
+ self._write_history("exhausted", attempts)
177
+ signal_list = ", ".join(observation.signals)
178
+ raise VerifierInfrastructureError(
179
+ "verifier infrastructure retries exhausted "
180
+ f"after {attempt} attempt(s): {signal_list}"
181
+ ) from caught
182
+
183
+ self._write_history("retrying", attempts)
184
+ await self._clear_outputs()
185
+ backoff_seconds = (self.infrastructure_retry_backoff_ms * attempt) / 1_000
186
+ if backoff_seconds > 0:
187
+ await asyncio.sleep(backoff_seconds)
188
+
189
+ raise AssertionError("unreachable verifier retry state")
190
+
191
+ def _write_phase_timing(self, started_ns: int) -> None:
192
+ self._write_json(
193
+ "hitch-phase-timings.json",
194
+ {
195
+ "schema_version": "1",
196
+ "phases": {
197
+ "verifier": {
198
+ "duration_ms": max(0, (time.monotonic_ns() - started_ns) // 1_000_000),
199
+ "completed_at": datetime.now(timezone.utc).isoformat(),
200
+ }
201
+ },
202
+ },
203
+ )
204
+
205
+ async def _clear_outputs(self) -> None:
206
+ await self._remove_files(OUTPUT_NAMES)
207
+
208
+ async def _remove_files(self, names: tuple[str, ...]) -> None:
209
+ for name in names:
210
+ (self.trial_paths.verifier_dir / name).unlink(missing_ok=True)
211
+ env_paths = EnvironmentPaths.for_os(self.environment.os)
212
+ if self.environment.os.value == "windows":
213
+ targets = ",".join(
214
+ f"'{str(env_paths.verifier_dir / name)}'"
215
+ for name in names
216
+ )
217
+ command = (
218
+ "powershell -NoProfile -NonInteractive -Command "
219
+ f'"Remove-Item -Force -ErrorAction SilentlyContinue {targets}"'
220
+ )
221
+ else:
222
+ targets = " ".join(
223
+ _shell_quote(str(env_paths.verifier_dir / name))
224
+ for name in names
225
+ )
226
+ command = f"rm -f -- {targets}"
227
+ cleared = await self.environment.exec(
228
+ command=command,
229
+ user=None if self.environment.os.value == "windows" else "root",
230
+ )
231
+ if cleared.return_code != 0:
232
+ raise VerifierInfrastructureError(
233
+ "could not clear verifier control/output files: "
234
+ f"exit {cleared.return_code}"
235
+ )
236
+
237
+ def _archive_attempt(self, attempt: int) -> None:
238
+ archive = self.trial_paths.verifier_dir / "infrastructure-attempts" / f"attempt-{attempt:04d}"
239
+ archive.mkdir(parents=True, exist_ok=True)
240
+ for name in OUTPUT_NAMES:
241
+ source = self.trial_paths.verifier_dir / name
242
+ if source.is_file():
243
+ shutil.copy2(source, archive / name)
244
+
245
+ def _write_history(self, status: str, attempts: list[dict[str, Any]]) -> None:
246
+ self._write_json(
247
+ "infrastructure-retry-history.json",
248
+ {
249
+ "schema_version": "1",
250
+ "code": "verifier_infrastructure_retry_history",
251
+ "status": status,
252
+ "max_retries": self.infrastructure_retries,
253
+ "backoff_ms": self.infrastructure_retry_backoff_ms,
254
+ "attempts": attempts,
255
+ "candidate_rerun": False,
256
+ },
257
+ )
258
+
259
+ def _write_json(self, name: str, value: dict[str, Any]) -> None:
260
+ target = self.trial_paths.verifier_dir / name
261
+ target.parent.mkdir(parents=True, exist_ok=True)
262
+ target.write_text(json.dumps(value, indent=2, sort_keys=True) + "\n", encoding="utf-8")
263
+
264
+
265
+ def _primary_reward(result: VerifierResult | None) -> float | int | None:
266
+ if result is None:
267
+ return None
268
+ preferred = result.rewards.get("reward")
269
+ if isinstance(preferred, (int, float)) and not isinstance(preferred, bool):
270
+ return preferred
271
+ return next(
272
+ (
273
+ value
274
+ for value in result.rewards.values()
275
+ if isinstance(value, (int, float)) and not isinstance(value, bool)
276
+ ),
277
+ None,
278
+ )
279
+
280
+
281
+ def _detect_infrastructure(
282
+ verifier_dir: Path,
283
+ reward: float | int | None,
284
+ *,
285
+ allow_missing_reward: bool,
286
+ ) -> InfrastructureObservation | None:
287
+ if reward != 0 and not (allow_missing_reward and reward is None):
288
+ return None
289
+ ctrf = verifier_dir / "ctrf.json"
290
+ if ctrf.is_file() and ctrf.stat().st_size > 0:
291
+ return None
292
+
293
+ logs: list[str] = []
294
+ source_files: list[str] = []
295
+ for name in LOG_NAMES:
296
+ source = verifier_dir / name
297
+ value = _read_bounded(source)
298
+ if value is None:
299
+ continue
300
+ logs.append(value)
301
+ source_files.append(f"verifier/{name}")
302
+ if not logs:
303
+ return None
304
+ combined = "\n".join(logs)
305
+ if any(pattern.search(combined) for pattern in TEST_EXECUTION_EVIDENCE):
306
+ return None
307
+ signals = tuple(
308
+ signal
309
+ for signal, patterns in INFRASTRUCTURE_PATTERNS
310
+ if any(pattern.search(combined) for pattern in patterns)
311
+ )
312
+ if not signals:
313
+ return None
314
+ return InfrastructureObservation(signals=signals, source_files=tuple(source_files))
315
+
316
+
317
+ def _read_bounded(source: Path) -> str | None:
318
+ try:
319
+ size = source.stat().st_size
320
+ except FileNotFoundError:
321
+ return None
322
+ with source.open("rb") as handle:
323
+ if size <= MAX_LOG_BYTES:
324
+ return handle.read().decode("utf-8", errors="replace")
325
+ half = MAX_LOG_BYTES // 2
326
+ head = handle.read(half)
327
+ handle.seek(max(0, size - (MAX_LOG_BYTES - half)))
328
+ tail = handle.read(MAX_LOG_BYTES - half)
329
+ return (
330
+ head.decode("utf-8", errors="replace")
331
+ + "\n[... verifier log truncated ...]\n"
332
+ + tail.decode("utf-8", errors="replace")
333
+ )
334
+
335
+
336
+ def _shell_quote(value: str) -> str:
337
+ return "'" + value.replace("'", "'\"'\"'") + "'"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-hitch",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "Content-addressed version control and evidence storage for agent harnesses",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -23,10 +23,14 @@
23
23
  "./artifacts": "./dist/src/artifacts/index.js",
24
24
  "./backends": "./dist/src/backends/index.js",
25
25
  "./controller-runtime": "./dist/src/controller-runtime/index.js",
26
+ "./control-plane": "./dist/src/control-plane/index.js",
27
+ "./workers": "./dist/src/workers/index.js",
26
28
  "./daemon": "./dist/src/daemon/index.js",
27
29
  "./domain": "./dist/src/domain/index.js",
28
30
  "./evals": "./dist/src/evals/index.js",
29
31
  "./feedback": "./dist/src/feedback/index.js",
32
+ "./images": "./dist/src/images/index.js",
33
+ "./model-access": "./dist/src/model-access/index.js",
30
34
  "./foundation": "./dist/src/foundation/index.js",
31
35
  "./revisions": "./dist/src/revisions/index.js",
32
36
  "./runs": "./dist/src/runs/index.js",
@@ -43,13 +47,23 @@
43
47
  "dist/src/",
44
48
  "dist/scripts/",
45
49
  "docs/schemas/",
46
- "integrations/harbor/hitch_harbor_agent.py"
50
+ "integrations/harbor/hitch_harbor_agent.py",
51
+ "integrations/harbor/hitch_harbor_environment.py",
52
+ "integrations/harbor/hitch_harbor_task_resources.py",
53
+ "integrations/harbor/hitch_harbor_verifier.py"
47
54
  ],
48
55
  "scripts": {
49
56
  "typecheck": "tsc --noEmit",
50
57
  "build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.json",
51
58
  "test": "node --test \"dist/test/*.test.js\"",
52
59
  "coverage": "node --experimental-test-coverage --test-coverage-include=dist/src/**/*.js --test-coverage-lines=75 --test-coverage-branches=65 --test-coverage-functions=70 --test \"dist/test/*.test.js\"",
60
+ "canary:buildkit-secrets": "npm run build && node dist/scripts/canary-buildkit-secrets.js",
61
+ "canary:docker-images": "npm run build && node dist/scripts/canary-docker-image-observation.js",
62
+ "canary:resource-load": "npm run build && node dist/scripts/canary-resource-load.js",
63
+ "canary:harbor-load": "npm run build && node dist/scripts/canary-harbor-load.js",
64
+ "canary:packaged-harness": "npm run build && node dist/scripts/canary-packaged-harness.js",
65
+ "canary:collision-domains": "npm run build && node dist/scripts/canary-collision-domains.js",
66
+ "canary:gpu-hardware": "npm run build && node dist/scripts/canary-gpu-hardware.js",
53
67
  "check:architecture": "node dist/scripts/check-architecture.js",
54
68
  "check": "npm run typecheck && npm run build && npm run check:architecture && node dist/scripts/check-syntax.js && node --test \"dist/test/*.test.js\"",
55
69
  "prepublishOnly": "npm run check"