agent-hitch 0.2.6 → 0.2.8

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 (562) hide show
  1. package/README.md +30 -3
  2. package/README.zh-CN.md +14 -2
  3. package/dist/bin/hitch.js +25 -3
  4. package/dist/bin/hitch.js.map +1 -1
  5. package/dist/scripts/canary-benchmark.js +54 -0
  6. package/dist/scripts/canary-benchmark.js.map +1 -0
  7. package/dist/scripts/canary-buildkit-secrets.js +166 -0
  8. package/dist/scripts/canary-buildkit-secrets.js.map +1 -0
  9. package/dist/scripts/canary-collision-domains.js +77 -0
  10. package/dist/scripts/canary-collision-domains.js.map +1 -0
  11. package/dist/scripts/canary-docker-image-observation.js +181 -0
  12. package/dist/scripts/canary-docker-image-observation.js.map +1 -0
  13. package/dist/scripts/canary-eval-scheduler-throughput.js +47 -0
  14. package/dist/scripts/canary-eval-scheduler-throughput.js.map +1 -0
  15. package/dist/scripts/canary-gpu-hardware.js +95 -0
  16. package/dist/scripts/canary-gpu-hardware.js.map +1 -0
  17. package/dist/scripts/canary-harbor-load.js +365 -0
  18. package/dist/scripts/canary-harbor-load.js.map +1 -0
  19. package/dist/scripts/canary-packaged-harness.js +75 -0
  20. package/dist/scripts/canary-packaged-harness.js.map +1 -0
  21. package/dist/scripts/canary-resource-load.js +188 -0
  22. package/dist/scripts/canary-resource-load.js.map +1 -0
  23. package/dist/scripts/check-architecture.js +10 -5
  24. package/dist/scripts/check-architecture.js.map +1 -1
  25. package/dist/scripts/docker-reaper-crash-child.js +21 -0
  26. package/dist/scripts/docker-reaper-crash-child.js.map +1 -0
  27. package/dist/src/adapters/catalog.js +3 -1
  28. package/dist/src/adapters/catalog.js.map +1 -1
  29. package/dist/src/adapters/discovery.js +1 -1
  30. package/dist/src/adapters/discovery.js.map +1 -1
  31. package/dist/src/adapters/providers/claude.js +6 -0
  32. package/dist/src/adapters/providers/claude.js.map +1 -1
  33. package/dist/src/adapters/providers/codex-auth.js +29 -0
  34. package/dist/src/adapters/providers/codex-auth.js.map +1 -0
  35. package/dist/src/adapters/providers/codex.js +29 -6
  36. package/dist/src/adapters/providers/codex.js.map +1 -1
  37. package/dist/src/adapters/providers/deepseek.js +6 -0
  38. package/dist/src/adapters/providers/deepseek.js.map +1 -1
  39. package/dist/src/adapters/providers/model-call.js +26 -0
  40. package/dist/src/adapters/providers/model-call.js.map +1 -0
  41. package/dist/src/adapters/providers/opencode.js +6 -0
  42. package/dist/src/adapters/providers/opencode.js.map +1 -1
  43. package/dist/src/adapters/providers/pi.js +6 -0
  44. package/dist/src/adapters/providers/pi.js.map +1 -1
  45. package/dist/src/artifacts/index.js +1 -0
  46. package/dist/src/artifacts/index.js.map +1 -1
  47. package/dist/src/artifacts/preparer.js +7 -2
  48. package/dist/src/artifacts/preparer.js.map +1 -1
  49. package/dist/src/backends/harbor/agent-budget.js +31 -0
  50. package/dist/src/backends/harbor/agent-budget.js.map +1 -0
  51. package/dist/src/backends/harbor/backend.js +59 -107
  52. package/dist/src/backends/harbor/backend.js.map +1 -1
  53. package/dist/src/backends/harbor/environment-config.js +92 -0
  54. package/dist/src/backends/harbor/environment-config.js.map +1 -0
  55. package/dist/src/backends/harbor/index.js +6 -1
  56. package/dist/src/backends/harbor/index.js.map +1 -1
  57. package/dist/src/backends/harbor/model-proxy-config.js +23 -0
  58. package/dist/src/backends/harbor/model-proxy-config.js.map +1 -0
  59. package/dist/src/backends/harbor/process.js +177 -0
  60. package/dist/src/backends/harbor/process.js.map +1 -0
  61. package/dist/src/backends/harbor/regrade.js +77 -0
  62. package/dist/src/backends/harbor/regrade.js.map +1 -0
  63. package/dist/src/backends/harbor/runtime-toolchain.js +30 -0
  64. package/dist/src/backends/harbor/runtime-toolchain.js.map +1 -0
  65. package/dist/src/backends/harbor/supervisor.js +74 -0
  66. package/dist/src/backends/harbor/supervisor.js.map +1 -0
  67. package/dist/src/backends/harbor/task-resources.js +206 -0
  68. package/dist/src/backends/harbor/task-resources.js.map +1 -0
  69. package/dist/src/backends/harbor/tools.js +6 -29
  70. package/dist/src/backends/harbor/tools.js.map +1 -1
  71. package/dist/src/backends/index.js +5 -1
  72. package/dist/src/backends/index.js.map +1 -1
  73. package/dist/src/benchmarks/index.js +3 -0
  74. package/dist/src/benchmarks/index.js.map +1 -0
  75. package/dist/src/benchmarks/loader.js +271 -0
  76. package/dist/src/benchmarks/loader.js.map +1 -0
  77. package/dist/src/benchmarks/metrics.js +16 -0
  78. package/dist/src/benchmarks/metrics.js.map +1 -0
  79. package/dist/src/benchmarks/toml.js +13 -0
  80. package/dist/src/benchmarks/toml.js.map +1 -0
  81. package/dist/src/benchmarks/validation.js +242 -0
  82. package/dist/src/benchmarks/validation.js.map +1 -0
  83. package/dist/src/cli/arguments.js +6 -4
  84. package/dist/src/cli/arguments.js.map +1 -1
  85. package/dist/src/cli/commands/benchmark.js +22 -0
  86. package/dist/src/cli/commands/benchmark.js.map +1 -0
  87. package/dist/src/cli/commands/capabilities.js +18 -0
  88. package/dist/src/cli/commands/capabilities.js.map +1 -0
  89. package/dist/src/cli/commands/daemon.js +135 -8
  90. package/dist/src/cli/commands/daemon.js.map +1 -1
  91. package/dist/src/cli/commands/eval.js +228 -6
  92. package/dist/src/cli/commands/eval.js.map +1 -1
  93. package/dist/src/cli/commands/images.js +40 -0
  94. package/dist/src/cli/commands/images.js.map +1 -0
  95. package/dist/src/cli/commands/run.js +42 -17
  96. package/dist/src/cli/commands/run.js.map +1 -1
  97. package/dist/src/cli/commands/runs.js +25 -3
  98. package/dist/src/cli/commands/runs.js.map +1 -1
  99. package/dist/src/cli/commands/trajectory.js +96 -5
  100. package/dist/src/cli/commands/trajectory.js.map +1 -1
  101. package/dist/src/cli/commands/verifier.js +36 -0
  102. package/dist/src/cli/commands/verifier.js.map +1 -0
  103. package/dist/src/cli/commands/worker.js +79 -0
  104. package/dist/src/cli/commands/worker.js.map +1 -0
  105. package/dist/src/cli/main.js +10 -0
  106. package/dist/src/cli/main.js.map +1 -1
  107. package/dist/src/cli/output.js +84 -4
  108. package/dist/src/cli/output.js.map +1 -1
  109. package/dist/src/control-plane/build-admission.js +69 -0
  110. package/dist/src/control-plane/build-admission.js.map +1 -0
  111. package/dist/src/control-plane/build-records.js +6 -0
  112. package/dist/src/control-plane/build-records.js.map +1 -0
  113. package/dist/src/control-plane/collisions.js +40 -0
  114. package/dist/src/control-plane/collisions.js.map +1 -0
  115. package/dist/src/control-plane/eval-control-state.js +22 -0
  116. package/dist/src/control-plane/eval-control-state.js.map +1 -0
  117. package/dist/src/control-plane/eval-control-work.js +44 -0
  118. package/dist/src/control-plane/eval-control-work.js.map +1 -0
  119. package/dist/src/control-plane/eval-image-resolution.js +52 -0
  120. package/dist/src/control-plane/eval-image-resolution.js.map +1 -0
  121. package/dist/src/control-plane/eval-image-services.js +30 -0
  122. package/dist/src/control-plane/eval-image-services.js.map +1 -0
  123. package/dist/src/control-plane/eval-records.js +252 -0
  124. package/dist/src/control-plane/eval-records.js.map +1 -0
  125. package/dist/src/control-plane/eval-recovery.js +181 -0
  126. package/dist/src/control-plane/eval-recovery.js.map +1 -0
  127. package/dist/src/control-plane/eval-scheduler.js +450 -0
  128. package/dist/src/control-plane/eval-scheduler.js.map +1 -0
  129. package/dist/src/control-plane/index.js +20 -0
  130. package/dist/src/control-plane/index.js.map +1 -0
  131. package/dist/src/control-plane/local-worker.js +49 -0
  132. package/dist/src/control-plane/local-worker.js.map +1 -0
  133. package/dist/src/control-plane/model-capture-planning.js +12 -0
  134. package/dist/src/control-plane/model-capture-planning.js.map +1 -0
  135. package/dist/src/control-plane/remote-result-transport.js +175 -0
  136. package/dist/src/control-plane/remote-result-transport.js.map +1 -0
  137. package/dist/src/control-plane/remote-work-coordinator.js +333 -0
  138. package/dist/src/control-plane/remote-work-coordinator.js.map +1 -0
  139. package/dist/src/control-plane/remote-work-inputs.js +266 -0
  140. package/dist/src/control-plane/remote-work-inputs.js.map +1 -0
  141. package/dist/src/control-plane/remote-work-item.js +62 -0
  142. package/dist/src/control-plane/remote-work-item.js.map +1 -0
  143. package/dist/src/control-plane/remote-work-recovery.js +220 -0
  144. package/dist/src/control-plane/remote-work-recovery.js.map +1 -0
  145. package/dist/src/control-plane/remote-worker-artifacts.js +135 -0
  146. package/dist/src/control-plane/remote-worker-artifacts.js.map +1 -0
  147. package/dist/src/control-plane/remote-worker-client.js +202 -0
  148. package/dist/src/control-plane/remote-worker-client.js.map +1 -0
  149. package/dist/src/control-plane/remote-worker-configuration.js +34 -0
  150. package/dist/src/control-plane/remote-worker-configuration.js.map +1 -0
  151. package/dist/src/control-plane/remote-worker-credentials.js +58 -0
  152. package/dist/src/control-plane/remote-worker-credentials.js.map +1 -0
  153. package/dist/src/control-plane/remote-worker-protocol.js +489 -0
  154. package/dist/src/control-plane/remote-worker-protocol.js.map +1 -0
  155. package/dist/src/control-plane/remote-worker-runner.js +214 -0
  156. package/dist/src/control-plane/remote-worker-runner.js.map +1 -0
  157. package/dist/src/control-plane/remote-workers.js +377 -0
  158. package/dist/src/control-plane/remote-workers.js.map +1 -0
  159. package/dist/src/control-plane/rerun-scheduler.js +448 -0
  160. package/dist/src/control-plane/rerun-scheduler.js.map +1 -0
  161. package/dist/src/control-plane/rerun-submission.js +62 -0
  162. package/dist/src/control-plane/rerun-submission.js.map +1 -0
  163. package/dist/src/control-plane/resources.js +182 -0
  164. package/dist/src/control-plane/resources.js.map +1 -0
  165. package/dist/src/control-plane/scheduler-eval-entry.js +32 -0
  166. package/dist/src/control-plane/scheduler-eval-entry.js.map +1 -0
  167. package/dist/src/control-plane/synthetic-result.js +21 -0
  168. package/dist/src/control-plane/synthetic-result.js.map +1 -0
  169. package/dist/src/control-plane/work-admission.js +23 -0
  170. package/dist/src/control-plane/work-admission.js.map +1 -0
  171. package/dist/src/control-plane/work-dispatcher.js +237 -0
  172. package/dist/src/control-plane/work-dispatcher.js.map +1 -0
  173. package/dist/src/controller-runtime/hash.js +19 -3
  174. package/dist/src/controller-runtime/hash.js.map +1 -1
  175. package/dist/src/controller-runtime/index.js +1 -1
  176. package/dist/src/controller-runtime/index.js.map +1 -1
  177. package/dist/src/controller-runtime/store.js +15 -6
  178. package/dist/src/controller-runtime/store.js.map +1 -1
  179. package/dist/src/daemon/auth.js +5 -0
  180. package/dist/src/daemon/auth.js.map +1 -1
  181. package/dist/src/daemon/client.js.map +1 -1
  182. package/dist/src/daemon/event-stream.js +46 -0
  183. package/dist/src/daemon/event-stream.js.map +1 -0
  184. package/dist/src/daemon/health.js +66 -0
  185. package/dist/src/daemon/health.js.map +1 -0
  186. package/dist/src/daemon/launcher.js +28 -1
  187. package/dist/src/daemon/launcher.js.map +1 -1
  188. package/dist/src/daemon/logging.js +23 -0
  189. package/dist/src/daemon/logging.js.map +1 -0
  190. package/dist/src/daemon/scheduler.js +26 -5
  191. package/dist/src/daemon/scheduler.js.map +1 -1
  192. package/dist/src/daemon/server.js +255 -98
  193. package/dist/src/daemon/server.js.map +1 -1
  194. package/dist/src/daemon/telemetry.js +163 -0
  195. package/dist/src/daemon/telemetry.js.map +1 -0
  196. package/dist/src/daemon/worker-routes.js +219 -0
  197. package/dist/src/daemon/worker-routes.js.map +1 -0
  198. package/dist/src/domain/benchmarks.js +2 -0
  199. package/dist/src/domain/benchmarks.js.map +1 -0
  200. package/dist/src/domain/bundles.js +2 -0
  201. package/dist/src/domain/bundles.js.map +1 -0
  202. package/dist/src/domain/control-plane.js +2 -0
  203. package/dist/src/domain/control-plane.js.map +1 -0
  204. package/dist/src/domain/execution-evidence.js +2 -0
  205. package/dist/src/domain/execution-evidence.js.map +1 -0
  206. package/dist/src/domain/execution-plan.js +2 -0
  207. package/dist/src/domain/execution-plan.js.map +1 -0
  208. package/dist/src/domain/images.js +2 -0
  209. package/dist/src/domain/images.js.map +1 -0
  210. package/dist/src/domain/index.js +13 -0
  211. package/dist/src/domain/index.js.map +1 -1
  212. package/dist/src/domain/interactions.js +2 -0
  213. package/dist/src/domain/interactions.js.map +1 -0
  214. package/dist/src/domain/providers.js +2 -0
  215. package/dist/src/domain/providers.js.map +1 -0
  216. package/dist/src/domain/resources.js +2 -0
  217. package/dist/src/domain/resources.js.map +1 -0
  218. package/dist/src/domain/runs.js.map +1 -1
  219. package/dist/src/domain/validation.js +11 -4
  220. package/dist/src/domain/validation.js.map +1 -1
  221. package/dist/src/domain/verifier-evidence-validation.js +214 -0
  222. package/dist/src/domain/verifier-evidence-validation.js.map +1 -0
  223. package/dist/src/domain/verifier-evidence.js +3 -0
  224. package/dist/src/domain/verifier-evidence.js.map +1 -0
  225. package/dist/src/domain/verifier-score-contract.js +232 -0
  226. package/dist/src/domain/verifier-score-contract.js.map +1 -0
  227. package/dist/src/domain/workers.js +2 -0
  228. package/dist/src/domain/workers.js.map +1 -0
  229. package/dist/src/evals/benchmark-adapter-manifest.js +219 -0
  230. package/dist/src/evals/benchmark-adapter-manifest.js.map +1 -0
  231. package/dist/src/evals/benchmark-candidate.js +36 -0
  232. package/dist/src/evals/benchmark-candidate.js.map +1 -0
  233. package/dist/src/evals/benchmark-run.js +166 -0
  234. package/dist/src/evals/benchmark-run.js.map +1 -0
  235. package/dist/src/evals/collect-only-rerun.js +183 -0
  236. package/dist/src/evals/collect-only-rerun.js.map +1 -0
  237. package/dist/src/evals/directory.js +30 -0
  238. package/dist/src/evals/directory.js.map +1 -0
  239. package/dist/src/evals/docker-engine-stats.js +89 -0
  240. package/dist/src/evals/docker-engine-stats.js.map +1 -0
  241. package/dist/src/evals/docker-ownership.js +51 -0
  242. package/dist/src/evals/docker-ownership.js.map +1 -0
  243. package/dist/src/evals/docker-reaper.js +144 -0
  244. package/dist/src/evals/docker-reaper.js.map +1 -0
  245. package/dist/src/evals/docker-resource-observer.js +207 -0
  246. package/dist/src/evals/docker-resource-observer.js.map +1 -0
  247. package/dist/src/evals/duration-estimator.js +126 -0
  248. package/dist/src/evals/duration-estimator.js.map +1 -0
  249. package/dist/src/evals/environment-image-planning.js +164 -0
  250. package/dist/src/evals/environment-image-planning.js.map +1 -0
  251. package/dist/src/evals/eval-artifact-planning.js +56 -0
  252. package/dist/src/evals/eval-artifact-planning.js.map +1 -0
  253. package/dist/src/evals/eval-finalization.js +10 -0
  254. package/dist/src/evals/eval-finalization.js.map +1 -0
  255. package/dist/src/evals/eval-lifecycle-events.js +29 -0
  256. package/dist/src/evals/eval-lifecycle-events.js.map +1 -0
  257. package/dist/src/evals/eval-logical-plan.js +51 -0
  258. package/dist/src/evals/eval-logical-plan.js.map +1 -0
  259. package/dist/src/evals/eval-result-builder.js +81 -0
  260. package/dist/src/evals/eval-result-builder.js.map +1 -0
  261. package/dist/src/evals/events.js +53 -5
  262. package/dist/src/evals/events.js.map +1 -1
  263. package/dist/src/evals/evolution-baseline.js +191 -0
  264. package/dist/src/evals/evolution-baseline.js.map +1 -0
  265. package/dist/src/evals/execution-evidence.js +116 -0
  266. package/dist/src/evals/execution-evidence.js.map +1 -0
  267. package/dist/src/evals/execution-leases.js +342 -0
  268. package/dist/src/evals/execution-leases.js.map +1 -0
  269. package/dist/src/evals/execution-plan-artifacts.js +72 -0
  270. package/dist/src/evals/execution-plan-artifacts.js.map +1 -0
  271. package/dist/src/evals/execution-plan-images.js +69 -0
  272. package/dist/src/evals/execution-plan-images.js.map +1 -0
  273. package/dist/src/evals/execution-plan-resources.js +174 -0
  274. package/dist/src/evals/execution-plan-resources.js.map +1 -0
  275. package/dist/src/evals/execution-plan.js +451 -0
  276. package/dist/src/evals/execution-plan.js.map +1 -0
  277. package/dist/src/evals/failure-classifier.js +61 -0
  278. package/dist/src/evals/failure-classifier.js.map +1 -0
  279. package/dist/src/evals/harbor-artifact-builder-image.js +99 -0
  280. package/dist/src/evals/harbor-artifact-builder-image.js.map +1 -0
  281. package/dist/src/evals/harbor-artifact-builder.js +358 -0
  282. package/dist/src/evals/harbor-artifact-builder.js.map +1 -0
  283. package/dist/src/evals/harbor-bridge-error.js +58 -3
  284. package/dist/src/evals/harbor-bridge-error.js.map +1 -1
  285. package/dist/src/evals/harbor-node-runtime.js +146 -0
  286. package/dist/src/evals/harbor-node-runtime.js.map +1 -0
  287. package/dist/src/evals/harbor-phase-timings.js +60 -0
  288. package/dist/src/evals/harbor-phase-timings.js.map +1 -0
  289. package/dist/src/evals/index.js +40 -2
  290. package/dist/src/evals/index.js.map +1 -1
  291. package/dist/src/evals/infrastructure-retry.js +208 -84
  292. package/dist/src/evals/infrastructure-retry.js.map +1 -1
  293. package/dist/src/evals/interaction-capture-import.js +49 -0
  294. package/dist/src/evals/interaction-capture-import.js.map +1 -0
  295. package/dist/src/evals/local-docker-provider.js +372 -0
  296. package/dist/src/evals/local-docker-provider.js.map +1 -0
  297. package/dist/src/evals/local-eval-planning.js +80 -0
  298. package/dist/src/evals/local-eval-planning.js.map +1 -0
  299. package/dist/src/evals/model-capture-plan.js +22 -0
  300. package/dist/src/evals/model-capture-plan.js.map +1 -0
  301. package/dist/src/evals/model-capture-runtime.js +114 -0
  302. package/dist/src/evals/model-capture-runtime.js.map +1 -0
  303. package/dist/src/evals/model-proxy-runtime-state.js +53 -0
  304. package/dist/src/evals/model-proxy-runtime-state.js.map +1 -0
  305. package/dist/src/evals/native-phase-evidence.js +440 -0
  306. package/dist/src/evals/native-phase-evidence.js.map +1 -0
  307. package/dist/src/evals/physical-retry-work.js +31 -0
  308. package/dist/src/evals/physical-retry-work.js.map +1 -0
  309. package/dist/src/evals/planned-execution-support.js +66 -0
  310. package/dist/src/evals/planned-execution-support.js.map +1 -0
  311. package/dist/src/evals/planned-execution.js +469 -0
  312. package/dist/src/evals/planned-execution.js.map +1 -0
  313. package/dist/src/evals/planned-progress-publisher.js +62 -0
  314. package/dist/src/evals/planned-progress-publisher.js.map +1 -0
  315. package/dist/src/evals/planned-remote-execution.js +40 -0
  316. package/dist/src/evals/planned-remote-execution.js.map +1 -0
  317. package/dist/src/evals/planned-retry-execution.js +174 -0
  318. package/dist/src/evals/planned-retry-execution.js.map +1 -0
  319. package/dist/src/evals/planned-retry-lifecycle.js +188 -0
  320. package/dist/src/evals/planned-retry-lifecycle.js.map +1 -0
  321. package/dist/src/evals/preparation-rerun.js +225 -0
  322. package/dist/src/evals/preparation-rerun.js.map +1 -0
  323. package/dist/src/evals/prepared-harness.js +76 -0
  324. package/dist/src/evals/prepared-harness.js.map +1 -0
  325. package/dist/src/evals/progress.js +52 -12
  326. package/dist/src/evals/progress.js.map +1 -1
  327. package/dist/src/evals/records.js +20 -3
  328. package/dist/src/evals/records.js.map +1 -1
  329. package/dist/src/evals/recovery.js +242 -0
  330. package/dist/src/evals/recovery.js.map +1 -0
  331. package/dist/src/evals/regrade-evidence.js +77 -0
  332. package/dist/src/evals/regrade-evidence.js.map +1 -0
  333. package/dist/src/evals/remote-infrastructure-retry.js +165 -0
  334. package/dist/src/evals/remote-infrastructure-retry.js.map +1 -0
  335. package/dist/src/evals/request.js +21 -3
  336. package/dist/src/evals/request.js.map +1 -1
  337. package/dist/src/evals/rerun-inputs.js +108 -0
  338. package/dist/src/evals/rerun-inputs.js.map +1 -0
  339. package/dist/src/evals/rerun-slots.js +4 -3
  340. package/dist/src/evals/rerun-slots.js.map +1 -1
  341. package/dist/src/evals/rerun-types.js +45 -0
  342. package/dist/src/evals/rerun-types.js.map +1 -0
  343. package/dist/src/evals/rerun.js +133 -88
  344. package/dist/src/evals/rerun.js.map +1 -1
  345. package/dist/src/evals/result-helpers.js +78 -0
  346. package/dist/src/evals/result-helpers.js.map +1 -0
  347. package/dist/src/evals/resume-state.js +36 -0
  348. package/dist/src/evals/resume-state.js.map +1 -0
  349. package/dist/src/evals/retry-backoff.js +20 -0
  350. package/dist/src/evals/retry-backoff.js.map +1 -0
  351. package/dist/src/evals/retry-state.js +195 -0
  352. package/dist/src/evals/retry-state.js.map +1 -0
  353. package/dist/src/evals/scheduler-metrics.js +95 -0
  354. package/dist/src/evals/scheduler-metrics.js.map +1 -0
  355. package/dist/src/evals/scheduler-trace-replay.js +107 -0
  356. package/dist/src/evals/scheduler-trace-replay.js.map +1 -0
  357. package/dist/src/evals/service-types.js +2 -0
  358. package/dist/src/evals/service-types.js.map +1 -0
  359. package/dist/src/evals/service.js +331 -347
  360. package/dist/src/evals/service.js.map +1 -1
  361. package/dist/src/evals/task-resources.js +209 -0
  362. package/dist/src/evals/task-resources.js.map +1 -0
  363. package/dist/src/evals/trial-environment-evidence.js +87 -0
  364. package/dist/src/evals/trial-environment-evidence.js.map +1 -0
  365. package/dist/src/evals/trial-execution-evidence.js +13 -0
  366. package/dist/src/evals/trial-execution-evidence.js.map +1 -0
  367. package/dist/src/evals/trial-import-identity.js +31 -0
  368. package/dist/src/evals/trial-import-identity.js.map +1 -0
  369. package/dist/src/evals/trial-import.js +183 -188
  370. package/dist/src/evals/trial-import.js.map +1 -1
  371. package/dist/src/evals/trial-publication-recovery.js +144 -0
  372. package/dist/src/evals/trial-publication-recovery.js.map +1 -0
  373. package/dist/src/evals/trial-publication.js +25 -0
  374. package/dist/src/evals/trial-publication.js.map +1 -0
  375. package/dist/src/evals/trial-reference-validation.js +49 -0
  376. package/dist/src/evals/trial-reference-validation.js.map +1 -0
  377. package/dist/src/evals/verifier-artifacts.js +317 -0
  378. package/dist/src/evals/verifier-artifacts.js.map +1 -0
  379. package/dist/src/evals/verifier-eligibility.js +25 -0
  380. package/dist/src/evals/verifier-eligibility.js.map +1 -0
  381. package/dist/src/evals/verifier-only-rerun.js +210 -0
  382. package/dist/src/evals/verifier-only-rerun.js.map +1 -0
  383. package/dist/src/evals/verifier-runtime.js +61 -0
  384. package/dist/src/evals/verifier-runtime.js.map +1 -0
  385. package/dist/src/evals/verifier-score-artifacts.js +119 -0
  386. package/dist/src/evals/verifier-score-artifacts.js.map +1 -0
  387. package/dist/src/evals/work-item-artifacts.js +23 -0
  388. package/dist/src/evals/work-item-artifacts.js.map +1 -0
  389. package/dist/src/foundation/config.js +17 -0
  390. package/dist/src/foundation/config.js.map +1 -1
  391. package/dist/src/foundation/contained-file.js +85 -0
  392. package/dist/src/foundation/contained-file.js.map +1 -0
  393. package/dist/src/foundation/credential-redaction.js +162 -0
  394. package/dist/src/foundation/credential-redaction.js.map +1 -0
  395. package/dist/src/foundation/environment-image-references.js +59 -0
  396. package/dist/src/foundation/environment-image-references.js.map +1 -0
  397. package/dist/src/foundation/executable.js +45 -5
  398. package/dist/src/foundation/executable.js.map +1 -1
  399. package/dist/src/foundation/fs.js +2 -1
  400. package/dist/src/foundation/fs.js.map +1 -1
  401. package/dist/src/foundation/index.js +6 -2
  402. package/dist/src/foundation/index.js.map +1 -1
  403. package/dist/src/foundation/process-identity.js +69 -0
  404. package/dist/src/foundation/process-identity.js.map +1 -0
  405. package/dist/src/images/context.js +47 -0
  406. package/dist/src/images/context.js.map +1 -0
  407. package/dist/src/images/docker-buildkit.js +137 -0
  408. package/dist/src/images/docker-buildkit.js.map +1 -0
  409. package/dist/src/images/dockerfile.js +67 -0
  410. package/dist/src/images/dockerfile.js.map +1 -0
  411. package/dist/src/images/gc.js +261 -0
  412. package/dist/src/images/gc.js.map +1 -0
  413. package/dist/src/images/index.js +10 -0
  414. package/dist/src/images/index.js.map +1 -0
  415. package/dist/src/images/manifest.js +109 -0
  416. package/dist/src/images/manifest.js.map +1 -0
  417. package/dist/src/images/ownership.js +5 -0
  418. package/dist/src/images/ownership.js.map +1 -0
  419. package/dist/src/images/records.js +32 -0
  420. package/dist/src/images/records.js.map +1 -0
  421. package/dist/src/images/registry.js +154 -0
  422. package/dist/src/images/registry.js.map +1 -0
  423. package/dist/src/images/service.js +224 -0
  424. package/dist/src/images/service.js.map +1 -0
  425. package/dist/src/model-access/capture.js +255 -0
  426. package/dist/src/model-access/capture.js.map +1 -0
  427. package/dist/src/model-access/index.js +5 -0
  428. package/dist/src/model-access/index.js.map +1 -0
  429. package/dist/src/model-access/policy.js +49 -0
  430. package/dist/src/model-access/policy.js.map +1 -0
  431. package/dist/src/model-access/proxy.js +336 -0
  432. package/dist/src/model-access/proxy.js.map +1 -0
  433. package/dist/src/model-access/records.js +167 -0
  434. package/dist/src/model-access/records.js.map +1 -0
  435. package/dist/src/runs/adapter-process.js +12 -0
  436. package/dist/src/runs/adapter-process.js.map +1 -0
  437. package/dist/src/runs/bundle.js +450 -0
  438. package/dist/src/runs/bundle.js.map +1 -0
  439. package/dist/src/runs/events.js +12 -1
  440. package/dist/src/runs/events.js.map +1 -1
  441. package/dist/src/runs/executor.js +46 -45
  442. package/dist/src/runs/executor.js.map +1 -1
  443. package/dist/src/runs/finalizer.js +17 -0
  444. package/dist/src/runs/finalizer.js.map +1 -1
  445. package/dist/src/runs/index.js +8 -1
  446. package/dist/src/runs/index.js.map +1 -1
  447. package/dist/src/runs/manifest.js +5 -5
  448. package/dist/src/runs/manifest.js.map +1 -1
  449. package/dist/src/runs/phase-bundle.js +86 -0
  450. package/dist/src/runs/phase-bundle.js.map +1 -0
  451. package/dist/src/runs/phase-cancellation.js +107 -0
  452. package/dist/src/runs/phase-cancellation.js.map +1 -0
  453. package/dist/src/runs/phase-group.js +113 -0
  454. package/dist/src/runs/phase-group.js.map +1 -0
  455. package/dist/src/runs/query.js +1 -1
  456. package/dist/src/runs/query.js.map +1 -1
  457. package/dist/src/runs/records.js +3 -0
  458. package/dist/src/runs/records.js.map +1 -1
  459. package/dist/src/runs/request.js +10 -3
  460. package/dist/src/runs/request.js.map +1 -1
  461. package/dist/src/runs/training-candidate.js +161 -0
  462. package/dist/src/runs/training-candidate.js.map +1 -0
  463. package/dist/src/runs/verifier-evidence-redaction.js +61 -0
  464. package/dist/src/runs/verifier-evidence-redaction.js.map +1 -0
  465. package/dist/src/runs/verifier-evidence.js +459 -0
  466. package/dist/src/runs/verifier-evidence.js.map +1 -0
  467. package/dist/src/runs/verifier-structured-evidence.js +83 -0
  468. package/dist/src/runs/verifier-structured-evidence.js.map +1 -0
  469. package/dist/src/trajectories/analysis.js +288 -0
  470. package/dist/src/trajectories/analysis.js.map +1 -0
  471. package/dist/src/trajectories/chunk-projection.js +148 -0
  472. package/dist/src/trajectories/chunk-projection.js.map +1 -0
  473. package/dist/src/trajectories/content-projection.js +389 -0
  474. package/dist/src/trajectories/content-projection.js.map +1 -0
  475. package/dist/src/trajectories/dsh-chunk-contract.js +176 -0
  476. package/dist/src/trajectories/dsh-chunk-contract.js.map +1 -0
  477. package/dist/src/trajectories/dsh-contract.js +284 -0
  478. package/dist/src/trajectories/dsh-contract.js.map +1 -0
  479. package/dist/src/trajectories/events-chunk-drill.js +95 -0
  480. package/dist/src/trajectories/events-chunk-drill.js.map +1 -0
  481. package/dist/src/trajectories/events-page.js +367 -0
  482. package/dist/src/trajectories/events-page.js.map +1 -0
  483. package/dist/src/trajectories/index.js +3 -0
  484. package/dist/src/trajectories/index.js.map +1 -1
  485. package/dist/src/trajectories/provider-capture.js +15 -24
  486. package/dist/src/trajectories/provider-capture.js.map +1 -1
  487. package/dist/src/trajectories/providers/deepseek.js +3 -3
  488. package/dist/src/trajectories/providers/deepseek.js.map +1 -1
  489. package/dist/src/trajectories/request-attempt.js +47 -0
  490. package/dist/src/trajectories/request-attempt.js.map +1 -0
  491. package/dist/src/trajectories/stream-reader.js +311 -0
  492. package/dist/src/trajectories/stream-reader.js.map +1 -0
  493. package/dist/src/trajectories/surface-fold.js +126 -0
  494. package/dist/src/trajectories/surface-fold.js.map +1 -0
  495. package/dist/src/workers/index.js +3 -0
  496. package/dist/src/workers/index.js.map +1 -0
  497. package/dist/src/workers/remote-harbor-work-spec.js +97 -0
  498. package/dist/src/workers/remote-harbor-work-spec.js.map +1 -0
  499. package/dist/src/workers/remote-harbor-worker.js +223 -0
  500. package/dist/src/workers/remote-harbor-worker.js.map +1 -0
  501. package/docs/schemas/benchmark-hook-request-v1.schema.json +65 -0
  502. package/docs/schemas/benchmark-hook-response-v1.schema.json +75 -0
  503. package/docs/schemas/benchmark-hook-v1.schema.json +33 -0
  504. package/docs/schemas/benchmark-lock-v1.schema.json +351 -0
  505. package/docs/schemas/benchmark-metric-v1.schema.json +37 -0
  506. package/docs/schemas/benchmark-package-v1.schema.json +167 -0
  507. package/docs/schemas/benchmark-phase-group.schema.json +41 -0
  508. package/docs/schemas/benchmark-profile-v1.schema.json +141 -0
  509. package/docs/schemas/benchmark-task-v1.schema.json +384 -0
  510. package/docs/schemas/benchmark-tool-result-v1.schema.json +30 -0
  511. package/docs/schemas/environment-build-index.schema.json +13 -0
  512. package/docs/schemas/environment-build-record.schema.json +25 -0
  513. package/docs/schemas/environment-image-manifest.schema.json +62 -0
  514. package/docs/schemas/error.schema.json +22 -0
  515. package/docs/schemas/eval-control.schema.json +36 -0
  516. package/docs/schemas/eval-execution-plan.schema.json +216 -0
  517. package/docs/schemas/eval-progress.schema.json +1 -15
  518. package/docs/schemas/eval-rerun-result.schema.json +58 -0
  519. package/docs/schemas/eval-rerun-state.schema.json +61 -0
  520. package/docs/schemas/eval-rerun-submission.schema.json +60 -0
  521. package/docs/schemas/eval-result.schema.json +32 -13
  522. package/docs/schemas/eval-submission-input.schema.json +14 -0
  523. package/docs/schemas/eval-submission.schema.json +68 -0
  524. package/docs/schemas/eval-trial-publication.schema.json +15 -0
  525. package/docs/schemas/eval-trial-reference.schema.json +129 -0
  526. package/docs/schemas/execution-evidence.schema.json +96 -0
  527. package/docs/schemas/execution-lease.schema.json +50 -0
  528. package/docs/schemas/execution-provider-status.schema.json +65 -0
  529. package/docs/schemas/execution-worker.schema.json +53 -0
  530. package/docs/schemas/harbor-process-exit.schema.json +14 -0
  531. package/docs/schemas/interaction-capture-ref.schema.json +45 -0
  532. package/docs/schemas/local-provider-execution.schema.json +33 -0
  533. package/docs/schemas/model-interaction.schema.json +41 -0
  534. package/docs/schemas/regrade-assessment-reference.schema.json +11 -0
  535. package/docs/schemas/remote-result-envelope.schema.json +32 -0
  536. package/docs/schemas/remote-tree-envelope.schema.json +25 -0
  537. package/docs/schemas/remote-work-offer.schema.json +58 -0
  538. package/docs/schemas/remote-work-receipt.schema.json +50 -0
  539. package/docs/schemas/remote-worker-artifact.schema.json +17 -0
  540. package/docs/schemas/remote-worker-event.schema.json +18 -0
  541. package/docs/schemas/remote-worker-heartbeat.schema.json +37 -0
  542. package/docs/schemas/remote-worker-registration.schema.json +52 -0
  543. package/docs/schemas/result-bundle-index.schema.json +133 -0
  544. package/docs/schemas/run-context.schema.json +15 -0
  545. package/docs/schemas/run-environment-images.schema.json +39 -0
  546. package/docs/schemas/run-manifest.schema.json +4 -0
  547. package/docs/schemas/run-request.schema.json +4 -0
  548. package/docs/schemas/training-data-candidate.schema.json +46 -0
  549. package/docs/schemas/trajectory-analysis.schema.json +258 -0
  550. package/docs/schemas/trajectory-events-page.schema.json +40 -0
  551. package/docs/schemas/verifier-assessment.schema.json +77 -0
  552. package/docs/schemas/verifier-evidence.schema.json +276 -0
  553. package/integrations/harbor/hitch_benchmark.py +252 -0
  554. package/integrations/harbor/hitch_candidate_recycle.py +262 -0
  555. package/integrations/harbor/hitch_harbor_agent.py +698 -568
  556. package/integrations/harbor/hitch_harbor_environment.py +469 -0
  557. package/integrations/harbor/hitch_harbor_task_resources.py +275 -0
  558. package/integrations/harbor/hitch_harbor_verifier.py +83 -2
  559. package/integrations/harbor/hitch_phase_supervisor.py +452 -0
  560. package/integrations/harbor/hitch_tool_client.mjs +91 -0
  561. package/integrations/model-call/cli.js +57 -0
  562. package/package.json +30 -6
@@ -0,0 +1,47 @@
1
+ /** Track DSH model request attempts incrementally so every projection uses the same retry boundary. */
2
+ export class IncrementalRequestAttemptTracker {
3
+ attempts = new Map();
4
+ accept(event) {
5
+ const identity = eventStep(event);
6
+ if (!identity)
7
+ return null;
8
+ if (event.type === "step/start") {
9
+ this.attempts.set(stepKey(identity.turn, identity.step), { attempt: 0 });
10
+ }
11
+ else if (event.type === "llm/retry-started") {
12
+ const current = this.current(identity.turn, identity.step);
13
+ const data = event.data;
14
+ this.attempts.set(stepKey(identity.turn, identity.step), {
15
+ attempt: current.attempt + 1,
16
+ retryId: data.retryId,
17
+ retrySeq: event.seq,
18
+ });
19
+ }
20
+ const current = this.current(identity.turn, identity.step);
21
+ if (event.type === "step/end")
22
+ this.attempts.delete(stepKey(identity.turn, identity.step));
23
+ return current;
24
+ }
25
+ current(turn, step) {
26
+ const key = stepKey(turn, step);
27
+ const existing = this.attempts.get(key);
28
+ if (existing)
29
+ return existing;
30
+ const initial = { attempt: 0 };
31
+ this.attempts.set(key, initial);
32
+ return initial;
33
+ }
34
+ }
35
+ function eventStep(event) {
36
+ const data = event.data;
37
+ return isNonNegativeInteger(data.turn) && isNonNegativeInteger(data.step)
38
+ ? { turn: data.turn, step: data.step }
39
+ : null;
40
+ }
41
+ function stepKey(turn, step) {
42
+ return `${turn}:${step}`;
43
+ }
44
+ function isNonNegativeInteger(value) {
45
+ return Number.isSafeInteger(value) && value >= 0;
46
+ }
47
+ //# sourceMappingURL=request-attempt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-attempt.js","sourceRoot":"","sources":["../../../src/trajectories/request-attempt.ts"],"names":[],"mappings":"AAQA,uGAAuG;AACvG,MAAM,OAAO,gCAAgC;IAC1B,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE9D,MAAM,CAAC,KAAmB;QACxB,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,IAA+B,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE;gBACvD,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,CAAC;gBAC5B,OAAO,EAAE,IAAI,CAAC,OAAiB;gBAC/B,QAAQ,EAAE,KAAK,CAAC,GAAG;aACpB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3F,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,IAAY;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,SAAS,SAAS,CAAC,KAAmB;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAA+B,CAAC;IACnD,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;QACvE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QACtC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,IAAY;IACzC,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAK,KAAgB,IAAI,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,311 @@
1
+ import { createHash } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { lstat, open } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { StringDecoder } from "node:string_decoder";
6
+ import { validateTrajectoryRef } from "../domain/index.js";
7
+ import { HitchError, readJSON, sha256JSON } from "../foundation/index.js";
8
+ import { IncrementalDshInvariant } from "./dsh-contract.js";
9
+ import { parseEventLine, parseHeaderLine } from "./format.js";
10
+ import { trajectoryRefPath } from "./store.js";
11
+ import { IncrementalSurfaceFold } from "./surface-fold.js";
12
+ /** Resolve one canonical session without reading its contents into memory. */
13
+ export async function loadCanonicalTrajectorySource(runDirectory, runId) {
14
+ const refPath = trajectoryRefPath(runDirectory);
15
+ let refBefore;
16
+ try {
17
+ refBefore = await lstat(refPath);
18
+ }
19
+ catch (error) {
20
+ if (error.code === "ENOENT")
21
+ return null;
22
+ throw trajectoryIntegrityError("trajectory ref cannot be inspected", error);
23
+ }
24
+ if (!refBefore.isFile() || refBefore.isSymbolicLink() || refBefore.nlink !== 1) {
25
+ throw trajectoryIntegrityError("trajectory ref is not a private regular file");
26
+ }
27
+ let raw;
28
+ let refAfter;
29
+ try {
30
+ raw = await readJSON(refPath, null);
31
+ if (!raw)
32
+ return null;
33
+ refAfter = await lstat(refPath);
34
+ }
35
+ catch (error) {
36
+ throw trajectoryIntegrityError("trajectory ref cannot be read", error);
37
+ }
38
+ assertUnchangedFile(refBefore, refAfter, "trajectory ref changed while loading");
39
+ const ref = validateTrajectoryRef(raw);
40
+ const refSha256 = sha256JSON(ref);
41
+ if (!/^run_[a-f0-9]{32}$/.test(runId) || !/^run_[a-f0-9]{32}$/.test(ref.run_id)) {
42
+ throw trajectoryIntegrityError("run ID is invalid");
43
+ }
44
+ if (ref.schema_version === "1" && !/^[A-Za-z0-9._:-]{1,256}$/.test(ref.session_id)) {
45
+ throw trajectoryIntegrityError("trajectory session ID is invalid");
46
+ }
47
+ if (ref.schema_version === "2" && ref.provider !== undefined && !/^[A-Za-z0-9._-]{1,128}$/.test(ref.provider)) {
48
+ throw trajectoryIntegrityError("trajectory provider ID is invalid");
49
+ }
50
+ if (ref.schema_version === "2" && ref.redactions?.some((entry) => !/^[a-z][a-z0-9._-]{0,127}$/.test(entry.rule_id))) {
51
+ throw trajectoryIntegrityError("trajectory redaction rule ID is invalid");
52
+ }
53
+ if (ref.run_id !== runId) {
54
+ throw trajectoryIntegrityError("trajectory ref run ID does not match the requested run");
55
+ }
56
+ if (ref.schema_version === "1") {
57
+ const absolute = containedPath(runDirectory, ref.path);
58
+ return {
59
+ ref,
60
+ refPath,
61
+ refSha256,
62
+ runId,
63
+ runDirectory: path.resolve(runDirectory),
64
+ path: absolute,
65
+ fidelity: ref.fidelity === "native" ? "provider_native" : ref.fidelity,
66
+ ...(ref.sha256 === undefined ? {} : { expectedSha256: ref.sha256 }),
67
+ };
68
+ }
69
+ const canonical = ref.files.find((file) => file.role === "canonical_session");
70
+ if (!canonical)
71
+ throw trajectoryIntegrityError("trajectory ref has no canonical_session file");
72
+ return {
73
+ ref,
74
+ refPath,
75
+ refSha256,
76
+ runId,
77
+ runDirectory: path.resolve(runDirectory),
78
+ path: containedPath(runDirectory, canonical.path),
79
+ fidelity: ref.fidelity,
80
+ ...(ref.provider === undefined ? {} : { provider: ref.provider }),
81
+ expectedSha256: canonical.sha256,
82
+ expectedBytes: canonical.bytes,
83
+ ...(ref.redactions === undefined ? {} : { redactions: ref.redactions }),
84
+ };
85
+ }
86
+ /**
87
+ * Scan canonical JSONL once. The callback sees one validated event at a time;
88
+ * raw events are never accumulated by this layer.
89
+ */
90
+ export async function scanCanonicalTrajectory(source, onEvent) {
91
+ if (source.expectedSha256 === undefined) {
92
+ throw trajectoryIntegrityError("canonical trajectory is not digest-pinned by its trajectory ref");
93
+ }
94
+ const pathSnapshot = await inspectContainedPath(source);
95
+ let handle;
96
+ try {
97
+ handle = await open(source.path, constants.O_RDONLY | constants.O_NOFOLLOW);
98
+ }
99
+ catch (error) {
100
+ const code = error.code;
101
+ throw trajectoryIntegrityError(`canonical trajectory is not a readable regular file${code ? ` (${code})` : ""}`, error);
102
+ }
103
+ try {
104
+ const before = await handle.stat();
105
+ assertSafeCanonicalFile(before);
106
+ assertSameFile(pathSnapshot.at(-1), identityOf(before), "canonical trajectory changed while opening");
107
+ if (source.expectedBytes !== undefined && before.size !== source.expectedBytes) {
108
+ throw trajectoryIntegrityError(`canonical trajectory byte count changed: expected ${source.expectedBytes}, got ${before.size}`);
109
+ }
110
+ const hash = createHash("sha256");
111
+ const decoder = new StringDecoder("utf8");
112
+ let buffer = "";
113
+ let bytes = 0;
114
+ let header;
115
+ let eventCount = 0;
116
+ const eventTypes = Object.create(null);
117
+ const invariant = new IncrementalDshInvariant();
118
+ const surface = new IncrementalSurfaceFold();
119
+ const acceptLine = (rawLine) => {
120
+ const line = rawLine.replace(/\r$/, "");
121
+ if (line.length === 0)
122
+ return;
123
+ let value;
124
+ try {
125
+ value = JSON.parse(line);
126
+ }
127
+ catch (error) {
128
+ throw trajectoryIntegrityError(`canonical trajectory contains invalid JSON at logical line ${eventCount + 2}`, error);
129
+ }
130
+ if (!header) {
131
+ try {
132
+ header = parseHeaderLine(value);
133
+ if (!/^[A-Za-z0-9._:-]{1,256}$/.test(header.id))
134
+ throw new Error("session header id is invalid");
135
+ }
136
+ catch (error) {
137
+ throw trajectoryIntegrityError(`canonical trajectory header is invalid: ${error.message}`, error);
138
+ }
139
+ return;
140
+ }
141
+ let event;
142
+ try {
143
+ event = parseEventLine(value);
144
+ }
145
+ catch (error) {
146
+ throw trajectoryIntegrityError(`canonical trajectory event ${eventCount} is invalid: ${error.message}`, error);
147
+ }
148
+ if (event.seq !== eventCount) {
149
+ throw trajectoryIntegrityError(`trajectory seq must be contiguous: expected ${eventCount}, got ${event.seq}`);
150
+ }
151
+ try {
152
+ invariant.accept(event, value);
153
+ surface.accept(event);
154
+ }
155
+ catch (error) {
156
+ throw trajectoryIntegrityError(`canonical trajectory event ${eventCount} violates the DSH contract: ${error.message}`, error);
157
+ }
158
+ eventCount += 1;
159
+ eventTypes[event.type] = (eventTypes[event.type] ?? 0) + 1;
160
+ onEvent(event);
161
+ };
162
+ for await (const rawChunk of handle.createReadStream({ autoClose: false })) {
163
+ const chunk = rawChunk;
164
+ bytes += chunk.byteLength;
165
+ hash.update(chunk);
166
+ buffer += decoder.write(chunk);
167
+ for (;;) {
168
+ const newline = buffer.indexOf("\n");
169
+ if (newline < 0)
170
+ break;
171
+ acceptLine(buffer.slice(0, newline));
172
+ buffer = buffer.slice(newline + 1);
173
+ }
174
+ }
175
+ buffer += decoder.end();
176
+ if (buffer.length > 0)
177
+ acceptLine(buffer);
178
+ if (!header)
179
+ throw trajectoryIntegrityError("canonical trajectory is empty");
180
+ if (header.id !== sourceHeaderId(source)) {
181
+ throw trajectoryIntegrityError("canonical session id does not match trajectory ref");
182
+ }
183
+ const sha256 = `sha256:${hash.digest("hex")}`;
184
+ if (source.expectedBytes !== undefined && bytes !== source.expectedBytes) {
185
+ throw trajectoryIntegrityError(`canonical trajectory byte count changed: expected ${source.expectedBytes}, got ${bytes}`);
186
+ }
187
+ if (source.expectedSha256 !== undefined && sha256 !== source.expectedSha256) {
188
+ throw trajectoryIntegrityError(`canonical trajectory digest changed: expected ${source.expectedSha256}, got ${sha256}`);
189
+ }
190
+ const after = await handle.stat();
191
+ assertSafeCanonicalFile(after);
192
+ assertUnchangedFile(before, after);
193
+ const finalPathSnapshot = await inspectContainedPath(source);
194
+ assertSamePathSnapshot(pathSnapshot, finalPathSnapshot);
195
+ assertSameFile(finalPathSnapshot.at(-1), identityOf(after), "canonical trajectory path changed during scan");
196
+ await assertTrajectoryRefUnchanged(source);
197
+ return { header, sha256, bytes, eventCount, eventTypes };
198
+ }
199
+ finally {
200
+ await handle.close();
201
+ }
202
+ }
203
+ function containedPath(runDirectory, declared) {
204
+ const runRoot = path.resolve(runDirectory);
205
+ const absolute = path.isAbsolute(declared) ? path.resolve(declared) : path.resolve(runRoot, ...declared.split("/"));
206
+ const relative = path.relative(runRoot, absolute);
207
+ if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) {
208
+ throw trajectoryIntegrityError("canonical trajectory path escapes its run directory");
209
+ }
210
+ return absolute;
211
+ }
212
+ function sourceHeaderId(source) {
213
+ return source.ref.schema_version === "1" ? source.ref.session_id : source.runId;
214
+ }
215
+ async function inspectContainedPath(source) {
216
+ const relative = path.relative(source.runDirectory, source.path);
217
+ let current = source.runDirectory;
218
+ const result = [];
219
+ try {
220
+ const segments = ["", ...relative.split(path.sep)];
221
+ for (let index = 0; index < segments.length; index += 1) {
222
+ if (index > 0)
223
+ current = path.join(current, segments[index]);
224
+ const info = await lstat(current);
225
+ if (info.isSymbolicLink())
226
+ throw trajectoryIntegrityError("canonical trajectory path contains a symbolic link");
227
+ if (index < segments.length - 1 && !info.isDirectory()) {
228
+ throw trajectoryIntegrityError("canonical trajectory parent is not a directory");
229
+ }
230
+ if (index === segments.length - 1 && !info.isFile()) {
231
+ throw trajectoryIntegrityError("canonical trajectory is not a regular file");
232
+ }
233
+ if (index === segments.length - 1 && info.nlink !== 1) {
234
+ throw trajectoryIntegrityError("canonical trajectory must not be hard-linked");
235
+ }
236
+ result.push(identityOf(info));
237
+ }
238
+ return result;
239
+ }
240
+ catch (error) {
241
+ if (error instanceof HitchError)
242
+ throw error;
243
+ const code = error.code;
244
+ throw trajectoryIntegrityError(`canonical trajectory path cannot be inspected${code ? ` (${code})` : ""}`, error);
245
+ }
246
+ }
247
+ function identityOf(info) {
248
+ return {
249
+ dev: info.dev,
250
+ ino: info.ino,
251
+ nlink: info.nlink,
252
+ size: info.size,
253
+ mtimeMs: info.mtimeMs,
254
+ ctimeMs: info.ctimeMs,
255
+ directory: info.isDirectory(),
256
+ };
257
+ }
258
+ function assertSafeCanonicalFile(info) {
259
+ if (!info.isFile())
260
+ throw trajectoryIntegrityError("canonical trajectory is not a regular file");
261
+ if (info.nlink !== 1)
262
+ throw trajectoryIntegrityError("canonical trajectory must not be hard-linked");
263
+ }
264
+ function assertSamePathSnapshot(before, after) {
265
+ if (before.length !== after.length)
266
+ throw trajectoryIntegrityError("canonical trajectory path changed during scan");
267
+ before.forEach((entry, index) => {
268
+ const final = after[index];
269
+ if (entry.dev !== final.dev || entry.ino !== final.ino || entry.directory !== final.directory) {
270
+ throw trajectoryIntegrityError("canonical trajectory path changed during scan");
271
+ }
272
+ if (!entry.directory && (entry.nlink !== final.nlink || entry.size !== final.size
273
+ || entry.mtimeMs !== final.mtimeMs || entry.ctimeMs !== final.ctimeMs)) {
274
+ throw trajectoryIntegrityError("canonical trajectory changed during scan");
275
+ }
276
+ });
277
+ }
278
+ function assertSameFile(before, after, message) {
279
+ if (before.dev !== after.dev || before.ino !== after.ino || before.nlink !== after.nlink || before.directory !== after.directory) {
280
+ throw trajectoryIntegrityError(message);
281
+ }
282
+ }
283
+ function assertUnchangedFile(before, after, message = "canonical trajectory changed during scan") {
284
+ if (before.dev !== after.dev || before.ino !== after.ino || before.nlink !== after.nlink
285
+ || before.size !== after.size || before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs) {
286
+ throw trajectoryIntegrityError(message);
287
+ }
288
+ }
289
+ async function assertTrajectoryRefUnchanged(source) {
290
+ try {
291
+ const before = await lstat(source.refPath);
292
+ if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1) {
293
+ throw trajectoryIntegrityError("trajectory ref is not a private regular file");
294
+ }
295
+ const raw = await readJSON(source.refPath, null);
296
+ const after = await lstat(source.refPath);
297
+ assertUnchangedFile(before, after, "trajectory ref changed during scan");
298
+ if (!raw || sha256JSON(validateTrajectoryRef(raw)) !== source.refSha256) {
299
+ throw trajectoryIntegrityError("trajectory ref changed during scan");
300
+ }
301
+ }
302
+ catch (error) {
303
+ if (error instanceof HitchError)
304
+ throw error;
305
+ throw trajectoryIntegrityError("trajectory ref cannot be revalidated", error);
306
+ }
307
+ }
308
+ function trajectoryIntegrityError(message, cause) {
309
+ return new HitchError(message, { code: "trajectory_integrity_mismatch", exitCode: 3, ...(cause === undefined ? {} : { cause }) });
310
+ }
311
+ //# sourceMappingURL=stream-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-reader.js","sourceRoot":"","sources":["../../../src/trajectories/stream-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ import { sha256JSON } from "../foundation/index.js";
2
+ const SURFACE_TYPES = new Set(["user/message", "assistant/message", "tool/result"]);
3
+ /** Incremental counterpart of DSH foldSurface(), without retaining the raw log. */
4
+ export class IncrementalSurfaceFold {
5
+ current = [];
6
+ nodeTypes = new Map();
7
+ toolResultSignatures = new Map();
8
+ operationCount = 0;
9
+ replacements = [];
10
+ get revision() {
11
+ return this.operationCount;
12
+ }
13
+ get currentNodeSeqs() {
14
+ return [...this.current];
15
+ }
16
+ accept(event) {
17
+ const eligible = SURFACE_TYPES.has(event.type);
18
+ if (!eligible) {
19
+ if (event.surfaceOp !== undefined || event.sourceEventSeqs !== undefined) {
20
+ throw new Error(`session event at seq ${event.seq} is not surface-eligible and cannot carry surface metadata`);
21
+ }
22
+ return;
23
+ }
24
+ if (event.surfaceOp === undefined) {
25
+ throw new Error(`surface-eligible event at seq ${event.seq} requires a surfaceOp marker`);
26
+ }
27
+ if (event.surfaceOp === "append") {
28
+ assertProvenance(event, []);
29
+ this.current.push(event.seq);
30
+ this.rememberNode(event);
31
+ this.operationCount += 1;
32
+ return;
33
+ }
34
+ const { start, end } = event.surfaceOp;
35
+ if (!isEventSeq(start) || !isEventSeq(end))
36
+ throw new Error(`invalid surface replacement at seq ${event.seq}`);
37
+ const startIndex = this.current.indexOf(start);
38
+ const endIndex = this.current.indexOf(end);
39
+ if (startIndex < 0)
40
+ throw new Error(`surface replace: start seq ${start} not found in surface`);
41
+ if (endIndex < 0)
42
+ throw new Error(`surface replace: end seq ${end} not found in surface`);
43
+ if (startIndex > endIndex)
44
+ throw new Error(`surface replace: start seq ${start} is after end seq ${end}`);
45
+ const shadowed = this.current.slice(startIndex, endIndex + 1);
46
+ assertProvenance(event, shadowed);
47
+ this.assertToolResultRewrite(event, shadowed);
48
+ for (const seq of shadowed) {
49
+ this.nodeTypes.delete(seq);
50
+ this.toolResultSignatures.delete(seq);
51
+ }
52
+ this.current.splice(startIndex, endIndex - startIndex + 1, event.seq);
53
+ this.rememberNode(event);
54
+ this.replacements.push({ seq: event.seq, start, end, shadowed_seqs: shadowed });
55
+ this.operationCount += 1;
56
+ }
57
+ rememberNode(event) {
58
+ this.nodeTypes.set(event.seq, event.type);
59
+ if (event.type === "tool/result")
60
+ this.toolResultSignatures.set(event.seq, toolResultSignature(event));
61
+ }
62
+ assertToolResultRewrite(event, shadowed) {
63
+ if (event.type !== "tool/result")
64
+ return;
65
+ if (shadowed.length !== 1 || this.nodeTypes.get(shadowed[0]) !== "tool/result") {
66
+ throw new Error("tool/result surface replacement must rewrite exactly one current tool/result");
67
+ }
68
+ const original = this.toolResultSignatures.get(shadowed[0]);
69
+ if (original === undefined || original !== toolResultSignature(event)) {
70
+ throw new Error("tool/result surface replacement may change only content");
71
+ }
72
+ }
73
+ }
74
+ export function deriveSurfaceMessage(event) {
75
+ const data = event.data;
76
+ if (event.type === "user/message")
77
+ return data;
78
+ if (event.type === "assistant/message") {
79
+ const message = data.message;
80
+ const content = message?.content;
81
+ return Array.isArray(content) && content.length === 0 ? null : message ?? null;
82
+ }
83
+ if (event.type === "tool/result")
84
+ return data.message ?? null;
85
+ return null;
86
+ }
87
+ export function isSurfaceEvent(event) {
88
+ return SURFACE_TYPES.has(event.type);
89
+ }
90
+ function assertProvenance(event, shadowed) {
91
+ const raw = event.sourceEventSeqs;
92
+ const sources = new Set();
93
+ if (raw !== undefined) {
94
+ if (raw.length === 0 && event.type !== "assistant/message") {
95
+ throw new Error("sourceEventSeqs must not be empty except on assistant/message");
96
+ }
97
+ for (const source of raw) {
98
+ if (!isEventSeq(source))
99
+ throw new Error(`invalid sourceEventSeqs on event at seq ${event.seq}`);
100
+ if (source >= event.seq)
101
+ throw new Error(`sourceEventSeqs must reference earlier events: ${source} >= ${event.seq}`);
102
+ if (sources.has(source))
103
+ throw new Error("sourceEventSeqs must not contain duplicates");
104
+ sources.add(source);
105
+ }
106
+ }
107
+ const missing = shadowed.filter((seq) => !sources.has(seq));
108
+ if (missing.length > 0) {
109
+ throw new Error(`surface replace: sourceEventSeqs must include every shadowed surface node; missing ${missing.join(", ")}`);
110
+ }
111
+ }
112
+ function toolResultSignature(event) {
113
+ const data = event.data;
114
+ const message = data.message && typeof data.message === "object" && !Array.isArray(data.message)
115
+ ? data.message
116
+ : {};
117
+ const content = Array.isArray(message.content) ? message.content : [];
118
+ const first = content[0] && typeof content[0] === "object" && !Array.isArray(content[0])
119
+ ? { ...content[0], content: null }
120
+ : content[0];
121
+ return sha256JSON({ ...data, message: { ...message, content: content.length > 0 ? [first, ...content.slice(1)] : [] } });
122
+ }
123
+ function isEventSeq(value) {
124
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
125
+ }
126
+ //# sourceMappingURL=surface-fold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-fold.js","sourceRoot":"","sources":["../../../src/trajectories/surface-fold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { releaseRemoteHarborOffer, remoteHarborWorker } from "./remote-harbor-worker.js";
2
+ export { parseRemoteHarborWorkSpec } from "./remote-harbor-work-spec.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/workers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { HitchError } from "../foundation/index.js";
2
+ import { parseEvalExecutionPlan } from "../evals/index.js";
3
+ export function parseRemoteHarborWorkSpec(value, offer) {
4
+ const spec = exact(value, [
5
+ "schema_version", "request", "plan", "work", "resolution", "harness_artifact", "controller_runtime", "task", "credential_names",
6
+ ], "remote Harbor work spec", ["credential_names"]);
7
+ if (spec.schema_version !== "1")
8
+ throw specError("remote Harbor work spec version is invalid");
9
+ const request = parseRequest(spec.request);
10
+ const plan = parseEvalExecutionPlan(spec.plan);
11
+ const work = plan.work_items.find((entry) => entry.work_id === offer.work.work_id);
12
+ if (!work || JSON.stringify(work) !== JSON.stringify(offer.work) || plan.eval_id !== offer.lease.eval_id
13
+ || plan.provider !== offer.lease.provider || request.backend !== "harbor")
14
+ throw specError("remote Harbor work graph does not match its offer");
15
+ const resolution = parseResolution(spec.resolution);
16
+ const harnessArtifact = parseArtifact(spec.harness_artifact);
17
+ const runtime = exact(spec.controller_runtime, ["runtime_id", "directory"], "remote controller runtime");
18
+ const task = exact(spec.task, ["task_id", "directory"], "remote task input");
19
+ const credentialNames = spec.credential_names === undefined && offer.credential_names === undefined
20
+ ? []
21
+ : environmentNames(spec.credential_names) ? [...spec.credential_names].sort() : (() => { throw specError("remote credential names are invalid"); })();
22
+ if (runtime.directory !== "controller-runtime" || typeof runtime.runtime_id !== "string" || !/^sha256:[a-f0-9]{64}$/.test(runtime.runtime_id)
23
+ || task.directory !== "task-input" || task.task_id !== work.task_ids[0] || work.task_ids.length !== 1
24
+ || harnessArtifact.directory !== "harness-artifact" || harnessArtifact.harness_id !== resolution.harness_id
25
+ || work.artifact_id !== undefined && harnessArtifact.artifact_id !== work.artifact_id
26
+ || harnessArtifact.revision_identity !== resolution.identity || request.harness_ref !== resolution.requested_ref
27
+ || request.benchmark_id !== plan.benchmark.id || request.benchmark_revision !== plan.benchmark.revision
28
+ || JSON.stringify(credentialNames) !== JSON.stringify(offer.credential_names ?? [])) {
29
+ throw specError("remote Harbor work inputs do not match their pinned identities");
30
+ }
31
+ return {
32
+ schema_version: "1", request, plan, work, resolution, harness_artifact: harnessArtifact,
33
+ controller_runtime: { runtime_id: runtime.runtime_id, directory: "controller-runtime" },
34
+ task: { task_id: task.task_id, directory: "task-input" },
35
+ credential_names: credentialNames,
36
+ };
37
+ }
38
+ function parseRequest(value) {
39
+ const request = exact(value, [
40
+ "schema_version", "backend", "dataset", "harness_ref", "model", "attempts", "max_concurrent",
41
+ "infrastructure_retries", "infrastructure_retry_backoff_ms", "timeout_ms", "setup_timeout_ms",
42
+ "agent_args", "pass_env", "benchmark_id", "benchmark_revision",
43
+ ], "remote eval request");
44
+ if (typeof request.schema_version !== "string" || request.backend !== "harbor" || request.dataset !== "task-input"
45
+ || !text(request.harness_ref) || typeof request.model !== "string"
46
+ || !positive(request.attempts) || !positive(request.max_concurrent)
47
+ || !nonnegative(request.infrastructure_retries) || !nonnegative(request.infrastructure_retry_backoff_ms)
48
+ || !nonnegative(request.timeout_ms) || !nonnegative(request.setup_timeout_ms)
49
+ || !stringArray(request.agent_args, 4_096) || !environmentNames(request.pass_env)
50
+ || !text(request.benchmark_id) || !text(request.benchmark_revision))
51
+ throw specError("remote eval request is invalid");
52
+ return request;
53
+ }
54
+ function parseResolution(value) {
55
+ const resolution = exact(value, [
56
+ "schema_version", "requested_ref", "canonical_ref", "harness_id", "selector", "source", "revision", "identity", "resolved_at",
57
+ ], "remote resolved revision");
58
+ if (typeof resolution.schema_version !== "string" || !text(resolution.requested_ref) || !text(resolution.canonical_ref)
59
+ || !text(resolution.harness_id) || typeof resolution.identity !== "string" || !/^sha256:[a-f0-9]{64}$/.test(resolution.identity)
60
+ || typeof resolution.resolved_at !== "string" || !Number.isFinite(Date.parse(resolution.resolved_at))
61
+ || !object(resolution.selector) || !object(resolution.source) || !object(resolution.revision))
62
+ throw specError("remote resolved revision is invalid");
63
+ return resolution;
64
+ }
65
+ function parseArtifact(value) {
66
+ const artifact = exact(value, [
67
+ "directory", "artifact_id", "artifact_integrity", "entrypoint_integrity", "harness_id", "revision_identity",
68
+ "adapter_version", "recipe_version", "platform", "node_version", "source_type",
69
+ ], "remote prepared artifact");
70
+ if (artifact.directory !== "harness-artifact"
71
+ || !digest(artifact.artifact_id) || !digest(artifact.artifact_integrity) || !digest(artifact.entrypoint_integrity)
72
+ || !text(artifact.harness_id) || !digest(artifact.revision_identity) || !text(artifact.adapter_version)
73
+ || !text(artifact.recipe_version) || !text(artifact.platform) || !text(artifact.node_version) || !text(artifact.source_type)) {
74
+ throw specError("remote prepared artifact is invalid");
75
+ }
76
+ return artifact;
77
+ }
78
+ function exact(value, keys, label, optional = []) {
79
+ if (!object(value))
80
+ throw specError(`${label} must be an object`);
81
+ if (keys.some((key) => !(key in value) && !optional.includes(key)) || Object.keys(value).some((key) => !keys.includes(key)))
82
+ throw specError(`${label} fields are invalid`);
83
+ return value;
84
+ }
85
+ function object(value) { return Boolean(value) && typeof value === "object" && !Array.isArray(value); }
86
+ function digest(value) { return typeof value === "string" && /^sha256:[a-f0-9]{64}$/.test(value); }
87
+ function positive(value) { return Number.isSafeInteger(value) && value >= 1; }
88
+ function nonnegative(value) { return Number.isSafeInteger(value) && value >= 0; }
89
+ function text(value) { return typeof value === "string" && value.length > 0 && value.length <= 4_096 && !/[\0\r\n]/.test(value); }
90
+ function stringArray(value, maximum) {
91
+ return Array.isArray(value) && value.length <= maximum && value.every((entry) => typeof entry === "string" && entry.length <= maximum && !/[\0]/.test(entry));
92
+ }
93
+ function environmentNames(value) {
94
+ return Array.isArray(value) && value.length <= 256 && value.every((entry) => typeof entry === "string" && /^[A-Za-z_][A-Za-z0-9_]*$/.test(entry)) && new Set(value).size === value.length;
95
+ }
96
+ function specError(message) { return new HitchError(message, { code: "remote_work_spec_invalid", exitCode: 12 }); }
97
+ //# sourceMappingURL=remote-harbor-work-spec.js.map