agent-hitch 0.2.16 → 0.2.17

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 (361) hide show
  1. package/README.md +7 -28
  2. package/README.zh-CN.md +6 -26
  3. package/dist/scripts/benchmark-dataset-verification.js +118 -0
  4. package/dist/scripts/benchmark-dataset-verification.js.map +1 -0
  5. package/dist/scripts/canary-external-endpoint.js +56 -0
  6. package/dist/scripts/canary-external-endpoint.js.map +1 -0
  7. package/dist/scripts/canary-native-training.js +8 -6
  8. package/dist/scripts/canary-native-training.js.map +1 -1
  9. package/dist/scripts/canary-remote-training.js +8 -6
  10. package/dist/scripts/canary-remote-training.js.map +1 -1
  11. package/dist/scripts/check-architecture.js +1 -1
  12. package/dist/scripts/check-architecture.js.map +1 -1
  13. package/dist/src/adapters/providers/codex.js +5 -2
  14. package/dist/src/adapters/providers/codex.js.map +1 -1
  15. package/dist/src/adapters/providers/model-call.js +1 -2
  16. package/dist/src/adapters/providers/model-call.js.map +1 -1
  17. package/dist/src/adapters/providers/training-tool.js +2 -0
  18. package/dist/src/adapters/providers/training-tool.js.map +1 -1
  19. package/dist/src/backends/harbor/artifact-pins.js +42 -0
  20. package/dist/src/backends/harbor/artifact-pins.js.map +1 -0
  21. package/dist/src/backends/harbor/backend.js +16 -8
  22. package/dist/src/backends/harbor/backend.js.map +1 -1
  23. package/dist/src/backends/harbor/bound-credential-helper.js +24 -0
  24. package/dist/src/backends/harbor/bound-credential-helper.js.map +1 -0
  25. package/dist/src/backends/harbor/credential-snapshot.js +71 -0
  26. package/dist/src/backends/harbor/credential-snapshot.js.map +1 -0
  27. package/dist/src/backends/harbor/environment-config.js +25 -2
  28. package/dist/src/backends/harbor/environment-config.js.map +1 -1
  29. package/dist/src/backends/harbor/environment-files.js +143 -0
  30. package/dist/src/backends/harbor/environment-files.js.map +1 -0
  31. package/dist/src/backends/harbor/evaluation-binding.js +160 -0
  32. package/dist/src/backends/harbor/evaluation-binding.js.map +1 -0
  33. package/dist/src/backends/harbor/host-credential-helper.js +5 -0
  34. package/dist/src/backends/harbor/host-credential-helper.js.map +1 -1
  35. package/dist/src/backends/harbor/index.js +2 -0
  36. package/dist/src/backends/harbor/index.js.map +1 -1
  37. package/dist/src/backends/harbor/model-proxy-config.js +3 -18
  38. package/dist/src/backends/harbor/model-proxy-config.js.map +1 -1
  39. package/dist/src/backends/harbor/portable-regrade.js +15 -3
  40. package/dist/src/backends/harbor/portable-regrade.js.map +1 -1
  41. package/dist/src/backends/harbor/python-runtime.js +71 -0
  42. package/dist/src/backends/harbor/python-runtime.js.map +1 -0
  43. package/dist/src/backends/harbor/tools.js +6 -4
  44. package/dist/src/backends/harbor/tools.js.map +1 -1
  45. package/dist/src/backends/index.js +3 -0
  46. package/dist/src/backends/index.js.map +1 -1
  47. package/dist/src/cli/arguments.js +30 -30
  48. package/dist/src/cli/arguments.js.map +1 -1
  49. package/dist/src/cli/commands/capabilities.js +7 -3
  50. package/dist/src/cli/commands/capabilities.js.map +1 -1
  51. package/dist/src/cli/commands/daemon.js +0 -17
  52. package/dist/src/cli/commands/daemon.js.map +1 -1
  53. package/dist/src/cli/commands/eval-binding.js +32 -0
  54. package/dist/src/cli/commands/eval-binding.js.map +1 -0
  55. package/dist/src/cli/commands/eval.js +21 -15
  56. package/dist/src/cli/commands/eval.js.map +1 -1
  57. package/dist/src/cli/commands/models.js +32 -45
  58. package/dist/src/cli/commands/models.js.map +1 -1
  59. package/dist/src/cli/commands/run.js +0 -35
  60. package/dist/src/cli/commands/run.js.map +1 -1
  61. package/dist/src/cli/main.js +0 -4
  62. package/dist/src/cli/main.js.map +1 -1
  63. package/dist/src/cli/output.js +5 -16
  64. package/dist/src/cli/output.js.map +1 -1
  65. package/dist/src/control-plane/eval-records.js +3 -1
  66. package/dist/src/control-plane/eval-records.js.map +1 -1
  67. package/dist/src/control-plane/eval-recovery.js +4 -1
  68. package/dist/src/control-plane/eval-recovery.js.map +1 -1
  69. package/dist/src/control-plane/eval-scheduler.js +16 -8
  70. package/dist/src/control-plane/eval-scheduler.js.map +1 -1
  71. package/dist/src/control-plane/index.js +0 -2
  72. package/dist/src/control-plane/index.js.map +1 -1
  73. package/dist/src/control-plane/model-capture-planning.js +3 -4
  74. package/dist/src/control-plane/model-capture-planning.js.map +1 -1
  75. package/dist/src/control-plane/remote-model-routes.js +4 -24
  76. package/dist/src/control-plane/remote-model-routes.js.map +1 -1
  77. package/dist/src/control-plane/remote-offer-contract.js +2 -2
  78. package/dist/src/control-plane/remote-offer-contract.js.map +1 -1
  79. package/dist/src/control-plane/remote-result-transport.js +7 -8
  80. package/dist/src/control-plane/remote-result-transport.js.map +1 -1
  81. package/dist/src/control-plane/remote-work-coordinator.js +2 -2
  82. package/dist/src/control-plane/remote-work-coordinator.js.map +1 -1
  83. package/dist/src/control-plane/remote-work-recovery.js +2 -2
  84. package/dist/src/control-plane/remote-work-recovery.js.map +1 -1
  85. package/dist/src/control-plane/remote-worker-protocol.js +1 -1
  86. package/dist/src/control-plane/remote-worker-protocol.js.map +1 -1
  87. package/dist/src/control-plane/remote-worker-runner.js +21 -6
  88. package/dist/src/control-plane/remote-worker-runner.js.map +1 -1
  89. package/dist/src/control-plane/remote-workers.js +2 -2
  90. package/dist/src/control-plane/remote-workers.js.map +1 -1
  91. package/dist/src/control-plane/rerun-recovery.js +1 -1
  92. package/dist/src/control-plane/rerun-recovery.js.map +1 -1
  93. package/dist/src/control-plane/rerun-scheduler.js +21 -14
  94. package/dist/src/control-plane/rerun-scheduler.js.map +1 -1
  95. package/dist/src/control-plane/rerun-source.js +5 -2
  96. package/dist/src/control-plane/rerun-source.js.map +1 -1
  97. package/dist/src/control-plane/rerun-submission.js +7 -5
  98. package/dist/src/control-plane/rerun-submission.js.map +1 -1
  99. package/dist/src/control-plane/synthetic-result.js +3 -2
  100. package/dist/src/control-plane/synthetic-result.js.map +1 -1
  101. package/dist/src/control-plane/worker-model-relay.js +1 -1
  102. package/dist/src/control-plane/worker-model-relay.js.map +1 -1
  103. package/dist/src/controller-runtime/hash.js +6 -0
  104. package/dist/src/controller-runtime/hash.js.map +1 -1
  105. package/dist/src/daemon/client.js +12 -35
  106. package/dist/src/daemon/client.js.map +1 -1
  107. package/dist/src/daemon/evaluation-binding.js +33 -0
  108. package/dist/src/daemon/evaluation-binding.js.map +1 -0
  109. package/dist/src/daemon/evaluation-submission.js +27 -0
  110. package/dist/src/daemon/evaluation-submission.js.map +1 -0
  111. package/dist/src/daemon/index.js +1 -0
  112. package/dist/src/daemon/index.js.map +1 -1
  113. package/dist/src/daemon/json-stream.js +98 -0
  114. package/dist/src/daemon/json-stream.js.map +1 -0
  115. package/dist/src/daemon/scheduler.js +1 -4
  116. package/dist/src/daemon/scheduler.js.map +1 -1
  117. package/dist/src/daemon/server.js +14 -54
  118. package/dist/src/daemon/server.js.map +1 -1
  119. package/dist/src/domain/endpoints.js +2 -0
  120. package/dist/src/domain/endpoints.js.map +1 -0
  121. package/dist/src/domain/evaluation-binding.js +5 -0
  122. package/dist/src/domain/evaluation-binding.js.map +1 -0
  123. package/dist/src/domain/index.js +2 -0
  124. package/dist/src/domain/index.js.map +1 -1
  125. package/dist/src/domain/runs.js.map +1 -1
  126. package/dist/src/evals/benchmark-adapter-manifest.js +95 -32
  127. package/dist/src/evals/benchmark-adapter-manifest.js.map +1 -1
  128. package/dist/src/evals/benchmark-verification.js +106 -0
  129. package/dist/src/evals/benchmark-verification.js.map +1 -0
  130. package/dist/src/evals/collect-only-rerun.js +3 -2
  131. package/dist/src/evals/collect-only-rerun.js.map +1 -1
  132. package/dist/src/evals/directory.js +9 -1
  133. package/dist/src/evals/directory.js.map +1 -1
  134. package/dist/src/evals/endpoint-attempts.js +112 -0
  135. package/dist/src/evals/endpoint-attempts.js.map +1 -0
  136. package/dist/src/evals/endpoint-usage.js +8 -0
  137. package/dist/src/evals/endpoint-usage.js.map +1 -0
  138. package/dist/src/evals/environment-binding.js +9 -0
  139. package/dist/src/evals/environment-binding.js.map +1 -0
  140. package/dist/src/evals/eval-artifact-planning.js +10 -1
  141. package/dist/src/evals/eval-artifact-planning.js.map +1 -1
  142. package/dist/src/evals/eval-finalization.js +2 -3
  143. package/dist/src/evals/eval-finalization.js.map +1 -1
  144. package/dist/src/evals/eval-logical-plan.js +2 -0
  145. package/dist/src/evals/eval-logical-plan.js.map +1 -1
  146. package/dist/src/evals/eval-result-builder.js +4 -0
  147. package/dist/src/evals/eval-result-builder.js.map +1 -1
  148. package/dist/src/evals/eval-state.js +22 -0
  149. package/dist/src/evals/eval-state.js.map +1 -0
  150. package/dist/src/evals/execution-plan.js +6 -2
  151. package/dist/src/evals/execution-plan.js.map +1 -1
  152. package/dist/src/evals/index.js +5 -1
  153. package/dist/src/evals/index.js.map +1 -1
  154. package/dist/src/evals/infrastructure-retry.js +2 -0
  155. package/dist/src/evals/infrastructure-retry.js.map +1 -1
  156. package/dist/src/evals/model-capture-runtime.js +9 -13
  157. package/dist/src/evals/model-capture-runtime.js.map +1 -1
  158. package/dist/src/evals/native-phase-evidence.js +8 -2
  159. package/dist/src/evals/native-phase-evidence.js.map +1 -1
  160. package/dist/src/evals/planned-execution.js +7 -2
  161. package/dist/src/evals/planned-execution.js.map +1 -1
  162. package/dist/src/evals/planned-progress-publisher.js +18 -5
  163. package/dist/src/evals/planned-progress-publisher.js.map +1 -1
  164. package/dist/src/evals/planned-retry-execution.js +1 -0
  165. package/dist/src/evals/planned-retry-execution.js.map +1 -1
  166. package/dist/src/evals/preparation-rerun.js +0 -1
  167. package/dist/src/evals/preparation-rerun.js.map +1 -1
  168. package/dist/src/evals/progress.js +92 -7
  169. package/dist/src/evals/progress.js.map +1 -1
  170. package/dist/src/evals/records.js +12 -2
  171. package/dist/src/evals/records.js.map +1 -1
  172. package/dist/src/evals/recovery.js +2 -0
  173. package/dist/src/evals/recovery.js.map +1 -1
  174. package/dist/src/evals/remote-rerun-execution.js +1 -3
  175. package/dist/src/evals/remote-rerun-execution.js.map +1 -1
  176. package/dist/src/evals/remote-verifier-rerun.js +1 -1
  177. package/dist/src/evals/remote-verifier-rerun.js.map +1 -1
  178. package/dist/src/evals/request.js +14 -45
  179. package/dist/src/evals/request.js.map +1 -1
  180. package/dist/src/evals/rerun-observation.js +31 -0
  181. package/dist/src/evals/rerun-observation.js.map +1 -0
  182. package/dist/src/evals/rerun.js +23 -28
  183. package/dist/src/evals/rerun.js.map +1 -1
  184. package/dist/src/evals/service.js +45 -42
  185. package/dist/src/evals/service.js.map +1 -1
  186. package/dist/src/evals/shared-runtime.js +125 -0
  187. package/dist/src/evals/shared-runtime.js.map +1 -0
  188. package/dist/src/evals/trial-import.js +10 -2
  189. package/dist/src/evals/trial-import.js.map +1 -1
  190. package/dist/src/evals/trial-publication-recovery.js +1 -1
  191. package/dist/src/evals/trial-publication-recovery.js.map +1 -1
  192. package/dist/src/evals/verifier-artifacts.js +1 -0
  193. package/dist/src/evals/verifier-artifacts.js.map +1 -1
  194. package/dist/src/evals/verifier-only-rerun.js +1 -1
  195. package/dist/src/evals/verifier-only-rerun.js.map +1 -1
  196. package/dist/src/evals/verifier-rerun-result.js +3 -2
  197. package/dist/src/evals/verifier-rerun-result.js.map +1 -1
  198. package/dist/src/evals/verifier-score-artifacts.js +9 -1
  199. package/dist/src/evals/verifier-score-artifacts.js.map +1 -1
  200. package/dist/src/foundation/config.js +0 -5
  201. package/dist/src/foundation/config.js.map +1 -1
  202. package/dist/src/inference/index.js +3 -22
  203. package/dist/src/inference/index.js.map +1 -1
  204. package/dist/src/inference/lock.js +44 -130
  205. package/dist/src/inference/lock.js.map +1 -1
  206. package/dist/src/model-access/endpoint-contract.js +127 -0
  207. package/dist/src/model-access/endpoint-contract.js.map +1 -0
  208. package/dist/src/model-access/endpoint-credentials.js +54 -0
  209. package/dist/src/model-access/endpoint-credentials.js.map +1 -0
  210. package/dist/src/model-access/endpoint-probe-stream.js +66 -0
  211. package/dist/src/model-access/endpoint-probe-stream.js.map +1 -0
  212. package/dist/src/model-access/endpoint-verification.js +76 -0
  213. package/dist/src/model-access/endpoint-verification.js.map +1 -0
  214. package/dist/src/model-access/endpoints.js +105 -0
  215. package/dist/src/model-access/endpoints.js.map +1 -0
  216. package/dist/src/model-access/index.js +5 -1
  217. package/dist/src/model-access/index.js.map +1 -1
  218. package/dist/src/model-access/proxy.js +57 -14
  219. package/dist/src/model-access/proxy.js.map +1 -1
  220. package/dist/src/model-access/remote-model.js +21 -29
  221. package/dist/src/model-access/remote-model.js.map +1 -1
  222. package/dist/src/model-access/usage.js +30 -0
  223. package/dist/src/model-access/usage.js.map +1 -0
  224. package/dist/src/runs/endpoint-runtime.js +40 -0
  225. package/dist/src/runs/endpoint-runtime.js.map +1 -0
  226. package/dist/src/runs/executor.js +28 -42
  227. package/dist/src/runs/executor.js.map +1 -1
  228. package/dist/src/runs/local-inference-environment.js +5 -53
  229. package/dist/src/runs/local-inference-environment.js.map +1 -1
  230. package/dist/src/runs/manifest.js +1 -0
  231. package/dist/src/runs/manifest.js.map +1 -1
  232. package/dist/src/runs/outcome.js +3 -10
  233. package/dist/src/runs/outcome.js.map +1 -1
  234. package/dist/src/runs/queued.js +3 -2
  235. package/dist/src/runs/queued.js.map +1 -1
  236. package/dist/src/runs/records.js +3 -0
  237. package/dist/src/runs/records.js.map +1 -1
  238. package/dist/src/runs/request.js +10 -38
  239. package/dist/src/runs/request.js.map +1 -1
  240. package/dist/src/workers/remote-harbor-work-spec.js +8 -10
  241. package/dist/src/workers/remote-harbor-work-spec.js.map +1 -1
  242. package/dist/src/workers/remote-harbor-worker.js +3 -0
  243. package/dist/src/workers/remote-harbor-worker.js.map +1 -1
  244. package/docs/evidence/eval-preparation-2026-10-09.json +393 -0
  245. package/docs/evidence/eval-preparation-2026-10-09.md +178 -0
  246. package/docs/local-model-inference-spec.zh-CN.md +4 -663
  247. package/docs/resource-storage.zh-CN.md +116 -0
  248. package/docs/schemas/endpoint-evaluation-attempt.schema.json +29 -0
  249. package/docs/schemas/eval-artifact-pin.schema.json +14 -0
  250. package/docs/schemas/eval-execution-plan.schema.json +486 -105
  251. package/docs/schemas/eval-progress.schema.json +1 -1
  252. package/docs/schemas/eval-request.schema.json +149 -18
  253. package/docs/schemas/eval-rerun-submission.schema.json +8 -1
  254. package/docs/schemas/eval-result.schema.json +310 -56
  255. package/docs/schemas/evaluation-binding.schema.json +15 -0
  256. package/docs/schemas/external-endpoint-binding.schema.json +153 -0
  257. package/docs/schemas/external-endpoint-config.schema.json +93 -0
  258. package/docs/schemas/inference-execution-evidence.schema.json +253 -3
  259. package/docs/schemas/inference-lock-v3.schema.json +6 -0
  260. package/docs/schemas/inference-lock.schema.json +842 -341
  261. package/docs/schemas/ordered-eval-control.schema.json +7 -1
  262. package/docs/schemas/ready-endpoint-binding.schema.json +201 -0
  263. package/docs/schemas/run-manifest.schema.json +6 -0
  264. package/docs/schemas/run-request.schema.json +122 -20
  265. package/examples/external-inference/.env.example +16 -0
  266. package/examples/external-inference/README.md +203 -0
  267. package/examples/external-inference/accept.mjs +297 -0
  268. package/examples/external-inference/compose.gateway.yaml +119 -0
  269. package/examples/external-inference/compose.single.yaml +64 -0
  270. package/examples/external-inference/compose.tp2.yaml +15 -0
  271. package/examples/external-inference/deployment.example.json +58 -0
  272. package/examples/external-inference/endpoint.chat-completions.example.json +13 -0
  273. package/examples/external-inference/endpoint.responses.example.json +13 -0
  274. package/integrations/harbor/hitch_build_inputs.py +213 -0
  275. package/integrations/harbor/hitch_build_process.py +126 -0
  276. package/integrations/harbor/hitch_compose_preparation.py +274 -0
  277. package/integrations/harbor/hitch_harbor_agent.py +25 -39
  278. package/integrations/harbor/hitch_harbor_environment.py +96 -3
  279. package/integrations/harbor/hitch_image_cache.py +357 -0
  280. package/integrations/harbor/hitch_python_runtime.py +303 -0
  281. package/integrations/harbor/hitch_shared_runtime.py +123 -0
  282. package/integrations/model-call/cli.js +11 -10
  283. package/integrations/training-tool/cli.js +5 -3
  284. package/node_modules/smol-toml/LICENSE +24 -0
  285. package/node_modules/smol-toml/README.md +418 -0
  286. package/node_modules/smol-toml/dist/date.d.ts +41 -0
  287. package/node_modules/smol-toml/dist/date.js +127 -0
  288. package/node_modules/smol-toml/dist/error.d.ts +38 -0
  289. package/node_modules/smol-toml/dist/error.js +63 -0
  290. package/node_modules/smol-toml/dist/extract.js +69 -0
  291. package/node_modules/smol-toml/dist/index.cjs +734 -0
  292. package/node_modules/smol-toml/dist/index.d.ts +43 -0
  293. package/node_modules/smol-toml/dist/index.js +33 -0
  294. package/node_modules/smol-toml/dist/parse.d.ts +36 -0
  295. package/node_modules/smol-toml/dist/parse.js +149 -0
  296. package/node_modules/smol-toml/dist/primitive.js +238 -0
  297. package/node_modules/smol-toml/dist/stringify.d.ts +31 -0
  298. package/node_modules/smol-toml/dist/stringify.js +181 -0
  299. package/node_modules/smol-toml/dist/struct.js +179 -0
  300. package/node_modules/smol-toml/dist/util.d.ts +38 -0
  301. package/node_modules/smol-toml/dist/util.js +89 -0
  302. package/node_modules/smol-toml/package.json +68 -0
  303. package/package.json +15 -4
  304. package/dist/src/cli/commands/local.js +0 -130
  305. package/dist/src/cli/commands/local.js.map +0 -1
  306. package/dist/src/cli/commands/model-node.js +0 -26
  307. package/dist/src/cli/commands/model-node.js.map +0 -1
  308. package/dist/src/control-plane/inference-manager.js +0 -357
  309. package/dist/src/control-plane/inference-manager.js.map +0 -1
  310. package/dist/src/control-plane/managed-gateway-receipt.js +0 -26
  311. package/dist/src/control-plane/managed-gateway-receipt.js.map +0 -1
  312. package/dist/src/control-plane/managed-service-recovery.js +0 -158
  313. package/dist/src/control-plane/managed-service-recovery.js.map +0 -1
  314. package/dist/src/daemon/inference-prepare.js +0 -47
  315. package/dist/src/daemon/inference-prepare.js.map +0 -1
  316. package/dist/src/inference/daemon-capacity.js +0 -41
  317. package/dist/src/inference/daemon-capacity.js.map +0 -1
  318. package/dist/src/inference/device-reservation.js +0 -58
  319. package/dist/src/inference/device-reservation.js.map +0 -1
  320. package/dist/src/inference/doctor.js +0 -95
  321. package/dist/src/inference/doctor.js.map +0 -1
  322. package/dist/src/inference/generation-recovery.js +0 -83
  323. package/dist/src/inference/generation-recovery.js.map +0 -1
  324. package/dist/src/inference/managed-launcher.js +0 -35
  325. package/dist/src/inference/managed-launcher.js.map +0 -1
  326. package/dist/src/inference/materialize.js +0 -66
  327. package/dist/src/inference/materialize.js.map +0 -1
  328. package/dist/src/inference/model-location.js +0 -34
  329. package/dist/src/inference/model-location.js.map +0 -1
  330. package/dist/src/inference/node-client.js +0 -167
  331. package/dist/src/inference/node-client.js.map +0 -1
  332. package/dist/src/inference/node-registry.js +0 -79
  333. package/dist/src/inference/node-registry.js.map +0 -1
  334. package/dist/src/inference/observation.js +0 -79
  335. package/dist/src/inference/observation.js.map +0 -1
  336. package/dist/src/inference/preflight.js +0 -132
  337. package/dist/src/inference/preflight.js.map +0 -1
  338. package/dist/src/inference/process-sglang.js +0 -169
  339. package/dist/src/inference/process-sglang.js.map +0 -1
  340. package/dist/src/inference/protocol-probe.js +0 -29
  341. package/dist/src/inference/protocol-probe.js.map +0 -1
  342. package/dist/src/inference/remote-model-store.js +0 -24
  343. package/dist/src/inference/remote-model-store.js.map +0 -1
  344. package/dist/src/inference/runtime-catalog.js +0 -41
  345. package/dist/src/inference/runtime-catalog.js.map +0 -1
  346. package/dist/src/inference/runtime-store.js +0 -93
  347. package/dist/src/inference/runtime-store.js.map +0 -1
  348. package/dist/src/inference/service-attachment.js +0 -46
  349. package/dist/src/inference/service-attachment.js.map +0 -1
  350. package/dist/src/inference/service-inspection.js +0 -38
  351. package/dist/src/inference/service-inspection.js.map +0 -1
  352. package/dist/src/inference/sglang.js +0 -279
  353. package/dist/src/inference/sglang.js.map +0 -1
  354. package/dist/src/inference/supervisor.js +0 -460
  355. package/dist/src/inference/supervisor.js.map +0 -1
  356. package/dist/src/model-access/local-gateway-request.js +0 -139
  357. package/dist/src/model-access/local-gateway-request.js.map +0 -1
  358. package/dist/src/model-access/local-gateway.js +0 -323
  359. package/dist/src/model-access/local-gateway.js.map +0 -1
  360. package/dist/src/runs/local-inference-run.js +0 -53
  361. package/dist/src/runs/local-inference-run.js.map +0 -1
@@ -1,158 +0,0 @@
1
- import { readdir } from "node:fs/promises";
2
- import path from "node:path";
3
- import { parseExecutionLease, parsePhysicalExecution, readExecutionLeases } from "../evals/index.js";
4
- import { HitchError, readJSON, sha256JSON, statePaths } from "../foundation/index.js";
5
- import { validateInferenceLockShape } from "../inference/index.js";
6
- import { remoteModelBinding } from "../model-access/index.js";
7
- import { parseEvalControl } from "./eval-records.js";
8
- import { RemoteWorkInputStore } from "./remote-work-inputs.js";
9
- import { verifyManagedGateway } from "./managed-gateway-receipt.js";
10
- import { orderedEvalCancelled } from "./ordered-eval-control.js";
11
- /** Private routes already seal the original gateway credentials before dispatch. */
12
- export class ManagedServiceRecovery {
13
- root;
14
- registry;
15
- protocol;
16
- constructor(root, registry, protocol) {
17
- this.root = root;
18
- this.registry = registry;
19
- this.protocol = protocol;
20
- }
21
- async select(records) {
22
- const groups = new Map();
23
- const evals = await readdir(statePaths(this.root).evals, { withFileTypes: true }).catch(error => {
24
- if (error.code === "ENOENT")
25
- return [];
26
- throw error;
27
- });
28
- const inputs = new RemoteWorkInputStore(this.root);
29
- for (const directory of evals) {
30
- if (!directory.isDirectory() || !/^eval_[a-f0-9]{32}$/.test(directory.name))
31
- continue;
32
- const evalDirectory = path.join(statePaths(this.root).evals, directory.name);
33
- for (const lease of await readExecutionLeases(evalDirectory)) {
34
- if (lease.provider === "local-docker" || !["offered", "accepted", "running"].includes(lease.state) || Date.parse(lease.expires_at) <= Date.now())
35
- continue;
36
- const offer = await this.protocol.findOfferForLease(lease.worker_id, lease.lease_id);
37
- if (!offer || offer.state !== "accepted")
38
- continue;
39
- const worker = await this.registry.get(offer.worker_id);
40
- if (!worker || worker.revoked_at || worker.generation !== offer.generation)
41
- continue;
42
- const ref = offer.inputs?.find(item => item.kind === "work-spec");
43
- if (!ref)
44
- continue;
45
- const spec = await readJSON((await inputs.verify(ref)).path);
46
- if (spec.model_binding?.kind !== "managed-inference")
47
- continue;
48
- const target = await this.protocol.modelRoutes.recoveryTarget(offer);
49
- if (!target || target.kind !== "managed-inference" || target.binding.kind !== "managed-node"
50
- || spec.schema_version !== "2" || sha256JSON(spec.work) !== sha256JSON(offer.work)
51
- || sha256JSON(spec.model_binding) !== sha256JSON(remoteModelBinding(target)))
52
- throw ambiguous("managed route differs from its sealed work input");
53
- const url = new URL(target.binding.base_url), match = url.pathname.match(/^\/runs\/(run_[a-f0-9]{32})\/v1\/$/);
54
- if (!match || url.protocol !== "http:" || url.hostname !== "127.0.0.1" || !url.port || url.username || url.password || url.search || url.hash
55
- || !/^[a-f0-9]{64}$/.test(target.credential))
56
- throw ambiguous("original private gateway address or credential is invalid");
57
- const ownerId = match[1];
58
- const physical = spec.physical_execution ? parsePhysicalExecution(spec.physical_execution) : undefined;
59
- if (physical?.kind === "verifier-only")
60
- throw ambiguous("verifier work cannot recover a model gateway");
61
- const rerunId = physical && physical.kind !== "physical-infrastructure-retry" ? physical.rerun_id : undefined;
62
- if (ownerId !== `run_${(rerunId ?? lease.eval_id).slice((rerunId ? "rerun_" : "eval_").length)}`)
63
- throw ambiguous("gateway owner differs from its original eval or rerun");
64
- const cacheScopeOwner = rerunId ? `${lease.eval_id}:${rerunId}` : lease.eval_id;
65
- const evidenceOwner = { kind: "eval", eval_id: lease.eval_id, ...(rerunId ? { rerun_id: rerunId } : {}) };
66
- if (await this.cancelled(evidenceOwner))
67
- continue;
68
- const candidates = records.filter(record => record.inference_id === target.binding.inference_id && record.lease_owner_ids.includes(ownerId)
69
- && sha256JSON(record.model_node ?? null) === sha256JSON(target.binding.model_node));
70
- if (candidates.length !== 1 || candidates[0].state !== "ready")
71
- throw ambiguous("accepted model work has no unique original ready service");
72
- const record = candidates[0];
73
- await verifyManagedGateway(this.root, { serviceId: record.service_id, epoch: record.epoch, inferenceId: record.inference_id,
74
- isolationKey: record.isolation_key, ownerId, cacheScopeOwner, evidenceOwner, binding: target.binding, credential: target.credential });
75
- const scopeDirectory = rerunId ? path.join(evalDirectory, "reruns", rerunId) : evalDirectory;
76
- const lock = validateInferenceLockShape(await readJSON(path.join(scopeDirectory, "inference", "lock.json")));
77
- const execution = await readJSON(path.join(scopeDirectory, "inference", "execution.json"));
78
- if (record.inference_id !== lock.inference_id || lock.model_id !== target.modelId
79
- || lock.protocol.api !== target.binding.api || lock.generation.max_output_tokens !== target.maxOutputTokens
80
- || sha256JSON(lock.model_node ?? null) !== sha256JSON(record.model_node)
81
- || record.isolation_key !== sha256JSON({ inference_id: lock.inference_id, cache_scope_owner: cacheScopeOwner })
82
- || execution.schema_version !== "2" || execution.run_id !== ownerId || execution.eval_id !== lease.eval_id || execution.rerun_id !== rerunId
83
- || sha256JSON(execution.service) !== sha256JSON({ service_id: record.service_id, epoch: record.epoch, isolation_key: record.isolation_key })) {
84
- throw ambiguous("original inference execution evidence differs from the active gateway");
85
- }
86
- const key = `${record.service_id}:${ownerId}`;
87
- const prior = groups.get(key);
88
- if (prior) {
89
- if (sha256JSON(prior.plan.target) !== sha256JSON(target))
90
- throw ambiguous("one model owner has conflicting private gateways");
91
- prior.seeds.push(offer);
92
- }
93
- else {
94
- const seeds = [offer];
95
- const plan = { record, ownerId, lock, cacheScopeOwner, evidenceOwner, target, port: Number(url.port),
96
- state: () => this.state(seeds, target, evidenceOwner) };
97
- groups.set(key, { plan, seeds });
98
- }
99
- }
100
- }
101
- const plans = [];
102
- for (const { plan } of groups.values())
103
- if (await plan.state() !== "finished")
104
- plans.push(plan);
105
- return plans;
106
- }
107
- async cancelled(owner) {
108
- if (await orderedEvalCancelled(this.root, owner.eval_id, owner.rerun_id))
109
- return true;
110
- const directory = path.join(statePaths(this.root).evals, owner.eval_id);
111
- if (owner.rerun_id) {
112
- const state = await readJSON(path.join(directory, "reruns", owner.rerun_id, "state.json"));
113
- if (state.schema_version !== "1" || state.eval_id !== owner.eval_id || state.rerun_id !== owner.rerun_id
114
- || !["queued", "running", "completed", "failed", "cancelled"].includes(String(state.status)))
115
- throw ambiguous("rerun state identity changed");
116
- const marker = await readJSON(path.join(directory, "reruns", owner.rerun_id, "cancellation.json"), null);
117
- if (marker && (marker.schema_version !== "1" || marker.eval_id !== owner.eval_id || marker.rerun_id !== owner.rerun_id))
118
- throw ambiguous("rerun cancellation identity changed");
119
- return !!marker || ["completed", "failed", "cancelled"].includes(String(state.status));
120
- }
121
- const control = parseEvalControl(await readJSON(path.join(directory, "control.json")));
122
- if (control.eval_id !== owner.eval_id)
123
- throw ambiguous("eval control identity changed");
124
- return !!control.cancel_requested_at || ["cancelling", "cancelled", "failed", "succeeded"].includes(control.state);
125
- }
126
- async state(seeds, target, owner) {
127
- if (await this.cancelled(owner))
128
- return "finished";
129
- let waiting = false;
130
- for (const seed of seeds) {
131
- const offer = await this.protocol.getOffer(seed.worker_id, seed.offer_id);
132
- if (!offer)
133
- throw ambiguous("accepted model offer disappeared during recovery");
134
- if (sha256JSON(identity(offer)) !== sha256JSON(identity(seed)))
135
- throw ambiguous("accepted model offer identity changed");
136
- if (offer.state !== "accepted")
137
- continue;
138
- const lease = parseExecutionLease(await readJSON(path.join(statePaths(this.root).evals, owner.eval_id, "leases", `${offer.lease.lease_id}.json`)));
139
- if (lease.epoch !== offer.lease.epoch || !["offered", "accepted", "running"].includes(lease.state) || Date.parse(lease.expires_at) <= Date.now())
140
- continue;
141
- const worker = await this.registry.get(offer.worker_id);
142
- if (!worker || worker.revoked_at || worker.generation !== offer.generation)
143
- continue;
144
- await this.protocol.modelRoutes.authorize(offer);
145
- if (sha256JSON(await this.protocol.modelRoutes.recoveryTarget(offer)) !== sha256JSON(target))
146
- throw ambiguous("private model route changed during recovery");
147
- if (worker.worker.status === "ready")
148
- return "active";
149
- waiting = true;
150
- }
151
- return waiting ? "waiting" : "finished";
152
- }
153
- }
154
- function identity(offer) {
155
- return { worker: offer.worker_id, generation: offer.generation, offer: offer.offer_id, nonce: offer.nonce, lease: offer.lease, work: offer.work, inputs: offer.inputs };
156
- }
157
- function ambiguous(message) { return new HitchError(message, { code: "inference_recovery_ambiguous", exitCode: 12 }); }
158
- //# sourceMappingURL=managed-service-recovery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"managed-service-recovery.js","sourceRoot":"","sources":["../../../src/control-plane/managed-service-recovery.ts"],"names":[],"mappings":"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"}
@@ -1,47 +0,0 @@
1
- import { HitchError, invalidInput } from "../foundation/index.js";
2
- import { readBodyJSON } from "./http.js";
3
- import { parseModelNodeBinding } from "../domain/index.js";
4
- export async function prepareInference(request, response, manager) {
5
- const value = await readBodyJSON(request);
6
- if (!value || typeof value !== "object" || Array.isArray(value))
7
- throw invalidInput("prepare requires an object");
8
- const body = value;
9
- if (Object.keys(body).some((key) => !["model", "device", "profile", "offline", "inference_id", "model_node"].includes(key))
10
- || typeof body.model !== "string" || !body.model.startsWith("local/")
11
- || !["auto", "cpu", "cuda", "metal"].includes(String(body.device))
12
- || !["baseline", "throughput"].includes(String(body.profile)) || typeof body.offline !== "boolean") {
13
- throw invalidInput("invalid local inference preparation selection");
14
- }
15
- if (body.model_node !== undefined)
16
- body.model_node = parseModelNodeBinding(body.model_node);
17
- if (body.inference_id !== undefined && (typeof body.inference_id !== "string" || !/^sha256:[a-f0-9]{64}$/.test(body.inference_id)))
18
- throw invalidInput("invalid inference lock digest");
19
- const controller = new AbortController();
20
- const abort = () => { if (!response.writableEnded)
21
- controller.abort(); };
22
- request.once("aborted", abort);
23
- response.once("close", abort);
24
- // OCI download plus cold model startup can exceed a regular HTTP header timeout.
25
- // Stream progress immediately; the final result/error is still structured JSON.
26
- response.writeHead(200, { "content-type": "application/x-ndjson", "cache-control": "no-store" });
27
- const emit = (event) => { if (!response.destroyed)
28
- response.write(`${JSON.stringify(event)}\n`); };
29
- emit({ type: "inference.preparing", message: "Preparing and validating local inference runtime" });
30
- const heartbeat = setInterval(() => emit({ type: "inference.progress" }), 15_000);
31
- heartbeat.unref();
32
- try {
33
- const prepared = await manager.prepare(body, controller.signal, emit);
34
- emit({ type: "inference.prepared", result: prepared });
35
- }
36
- catch (error) {
37
- emit({ type: "inference.prepare.failed", error: { message: error.message,
38
- code: error instanceof HitchError ? error.code : "inference_route_unavailable", exit_code: error instanceof HitchError ? error.exitCode : 12 } });
39
- }
40
- finally {
41
- clearInterval(heartbeat);
42
- request.removeListener("aborted", abort);
43
- response.removeListener("close", abort);
44
- response.end();
45
- }
46
- }
47
- //# sourceMappingURL=inference-prepare.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inference-prepare.js","sourceRoot":"","sources":["../../../src/daemon/inference-prepare.ts"],"names":[],"mappings":"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"}
@@ -1,41 +0,0 @@
1
- import { statfs } from "node:fs/promises";
2
- import path from "node:path";
3
- import { runCommand } from "../foundation/index.js";
4
- /** Supply optional resource dimensions for the automatically started daemon.
5
- * Explicit user limits, including zero, always take precedence. */
6
- export async function localInferenceDaemonEnvironment(root, env = process.env, options = {}) {
7
- const result = { ...env };
8
- if (result.HITCH_CAPACITY_EPHEMERAL_DISK_MIB === undefined) {
9
- const bytes = await (options.freeDiskBytes ?? availableDiskBytes)(root);
10
- result.HITCH_CAPACITY_EPHEMERAL_DISK_MIB = String(Math.floor(bytes / 1024 ** 2));
11
- }
12
- if (result.HITCH_CAPACITY_GPUS === undefined) {
13
- try {
14
- const invoke = options.run ?? ((executable, args) => runCommand(executable, args, {
15
- env, timeoutMs: 5_000, failureCode: "gpu_detection_failed",
16
- }));
17
- const observed = await invoke(env.HITCH_NVIDIA_SMI_PATH || "nvidia-smi", ["-L"]);
18
- const count = observed.stdout.split(/\r?\n/).filter((line) => /^GPU \d+:/.test(line)).length;
19
- if (count > 0)
20
- result.HITCH_CAPACITY_GPUS = String(count);
21
- }
22
- catch { /* CPU-only daemon capacity remains valid. */ }
23
- }
24
- return result;
25
- }
26
- async function availableDiskBytes(directory) {
27
- let current = path.resolve(directory);
28
- for (;;) {
29
- try {
30
- const info = await statfs(current, { bigint: true });
31
- return Number(info.bavail * info.bsize);
32
- }
33
- catch (error) {
34
- const parent = path.dirname(current);
35
- if (error.code !== "ENOENT" || parent === current)
36
- throw error;
37
- current = parent;
38
- }
39
- }
40
- }
41
- //# sourceMappingURL=daemon-capacity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"daemon-capacity.js","sourceRoot":"","sources":["../../../src/inference/daemon-capacity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD;mEACmE;AACnE,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,IAAY,EAAE,MAAyB,OAAO,CAAC,GAAG,EAAE,UAGtG,EAAE;IACJ,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IAC1B,IAAI,MAAM,CAAC,iCAAiC,KAAK,SAAS,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,CAAC,iCAAiC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,MAAM,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,UAAkB,EAAE,IAAc,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE;gBAClG,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB;aAC3D,CAAC,CAAC,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,IAAI,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACjF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7F,IAAI,KAAK,GAAG,CAAC;gBAAE,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC,CAAC,6CAA6C,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACjD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACtC,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO;gBAAE,MAAM,KAAK,CAAC;YAC1F,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,58 +0,0 @@
1
- import { mkdir, readdir, rm } from "node:fs/promises";
2
- import { homedir } from "node:os";
3
- import path from "node:path";
4
- import { HitchError, atomicWriteJSON, hitchRootId, readJSON, sha256JSON, withFileLock } from "../foundation/index.js";
5
- export const defaultDeviceReservationDirectory = () => path.join(homedir(), ".cache", "agent-hitch", "inference-devices");
6
- export async function reservedInferenceDevices(directory = defaultDeviceReservationDirectory()) {
7
- let files;
8
- try {
9
- files = await readdir(directory);
10
- }
11
- catch (error) {
12
- if (error.code === "ENOENT")
13
- return [];
14
- throw error;
15
- }
16
- const devices = [];
17
- for (const name of files.filter((name) => /^[a-f0-9]{64}\.json$/.test(name))) {
18
- const record = await readJSON(path.join(directory, name), null);
19
- if (record?.gpu_uuid)
20
- devices.push(record.gpu_uuid);
21
- }
22
- return devices;
23
- }
24
- /** Survives daemon death. Only confirmed container cleanup releases a reservation;
25
- * a dead PID alone is never evidence that a GPU is free. Shared across Hitch roots. */
26
- export async function reserveInferenceDevice(directory, root, serviceId, gpuUuid) {
27
- await mkdir(directory, { recursive: true, mode: 0o700 });
28
- const key = sha256JSON(gpuUuid).slice(7);
29
- await withFileLock(directory, key, async () => {
30
- const file = path.join(directory, `${key}.json`);
31
- const existing = await readJSON(file, null);
32
- if (existing)
33
- throw new HitchError(`GPU ${gpuUuid} is reserved by another inference service; stop or recover its owning Hitch daemon first`, {
34
- code: "inference_device_in_use", exitCode: 12,
35
- });
36
- await atomicWriteJSON(file, { root_id: hitchRootId(root), service_id: serviceId, gpu_uuid: gpuUuid });
37
- });
38
- }
39
- export async function releaseInferenceDevice(directory, root, serviceId) {
40
- let files;
41
- try {
42
- files = await readdir(directory);
43
- }
44
- catch (error) {
45
- if (error.code === "ENOENT")
46
- return;
47
- throw error;
48
- }
49
- for (const name of files.filter((name) => /^[a-f0-9]{64}\.json$/.test(name))) {
50
- await withFileLock(directory, name.slice(0, -5), async () => {
51
- const file = path.join(directory, name);
52
- const record = await readJSON(file, null);
53
- if (record?.root_id === hitchRootId(root) && record.service_id === serviceId)
54
- await rm(file);
55
- });
56
- }
57
- }
58
- //# sourceMappingURL=device-reservation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-reservation.js","sourceRoot":"","sources":["../../../src/inference/device-reservation.ts"],"names":[],"mappings":"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"}
@@ -1,95 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import { HitchError, runCommand } from "../foundation/index.js";
3
- /** Static eligibility only. Loading, CUDA visibility and the protocol are verified by prepare. */
4
- export async function doctorLocalInference(backend, options = {}) {
5
- const platform = options.platform ?? process.platform;
6
- const architecture = options.architecture ?? process.arch;
7
- const env = options.env ?? process.env;
8
- const invoke = options.run ?? ((executable, args) => runCommand(executable, args, {
9
- env, timeoutMs: 10_000, failureCode: "inference_runtime_unavailable", failureExitCode: 3,
10
- }));
11
- const checks = {};
12
- checks.platform = platform === "linux" && architecture === "x64"
13
- ? pass("linux/amd64") : fail(`P0 requires linux/amd64; detected ${platform}/${architecture}`);
14
- if (backend === "metal") {
15
- checks.catalog = fail("Metal/MLX is a P1 backend and has no P0 runtime catalog entry");
16
- return result(backend, checks);
17
- }
18
- try {
19
- const docker = options.dockerExecutable || env.HITCH_DOCKER_PATH || "docker";
20
- const server = await invoke(docker, ["info", "--format", "{{json .}}"]);
21
- const info = JSON.parse(server.stdout);
22
- checks.docker = info.OSType === "linux" && ["x86_64", "amd64"].includes(String(info.Architecture))
23
- ? pass(`Docker ${String(info.ServerVersion)}`) : fail("Docker Engine must run linux/amd64");
24
- const context = await invoke(docker, ["context", "inspect", "--format", "{{json .Endpoints.docker.Host}}"]);
25
- const endpoint = env.DOCKER_CONTEXT ? JSON.parse(context.stdout) : env.DOCKER_HOST || JSON.parse(context.stdout);
26
- checks.docker_endpoint = typeof endpoint === "string" && endpoint.startsWith("unix:///")
27
- ? pass("local Unix socket") : fail("managed inference requires a local Docker Unix socket");
28
- }
29
- catch (error) {
30
- checks.docker = fail(`Docker is unavailable: ${error.message}`);
31
- }
32
- if (backend === "cpu") {
33
- let info = "";
34
- try {
35
- info = await (options.readCpuInfo ?? (() => readFile("/proc/cpuinfo", "utf8")))();
36
- }
37
- catch { }
38
- const flags = new Set(info.toLowerCase().split(/[^a-z0-9_]+/));
39
- const missing = ["amx_tile", "amx_int8", "amx_bf16"].filter((flag) => !flags.has(flag));
40
- checks.amx = missing.length ? fail(`missing CPU flags: ${missing.join(", ")}`) : pass("AMX tile/int8/bf16");
41
- return result(backend, checks);
42
- }
43
- let gpu;
44
- try {
45
- const observed = await invoke(options.nvidiaSmiExecutable || env.HITCH_NVIDIA_SMI_PATH || "nvidia-smi", [
46
- "--query-gpu=uuid,name,memory.total,memory.free,driver_version,compute_cap", "--format=csv,noheader,nounits",
47
- ]);
48
- const candidates = observed.stdout.trim().split(/\r?\n/).map(parseGpu);
49
- // The pinned image uses CUDA 13.0. Require the native driver floor; do not
50
- // assume forward-compat packages work on an arbitrary device/driver pair.
51
- const eligible = candidates.filter((entry) => Number(entry.driver_version.split(".")[0]) >= 580
52
- && [8.0, 8.6, 8.9, 9.0, 10.0, 10.3, 12.0].includes(Number(entry.compute_capability))
53
- && entry.free_memory_mib >= (options.requiredMemoryMiB ?? 0)
54
- && !options.excludedDeviceUuids?.includes(entry.uuid)
55
- && (!options.deviceConstraint || entry.uuid === options.deviceConstraint));
56
- gpu = eligible[0];
57
- checks.cuda = gpu ? pass(`${gpu.name} (${gpu.uuid}), ${gpu.free_memory_mib} MiB free, driver ${gpu.driver_version}`)
58
- : fail(`no eligible CUDA 13 GPU: require driver >=580, supported SM, ${options.requiredMemoryMiB ?? 0} MiB free${options.deviceConstraint ? ` on ${options.deviceConstraint}` : ""}`);
59
- }
60
- catch (error) {
61
- checks.cuda = fail(`NVIDIA CUDA device is unavailable: ${error.message}`);
62
- }
63
- return { ...result(backend, checks), ...(gpu ? { gpu } : {}) };
64
- }
65
- export async function resolveLocalInferenceDevice(requested, options = {}) {
66
- for (const backend of requested === "auto" ? ["cuda", "cpu"] : [requested]) {
67
- const doctor = await doctorLocalInference(backend, options);
68
- if (doctor.ready)
69
- return { backend, doctor };
70
- if (requested !== "auto")
71
- throw unavailable(doctor);
72
- }
73
- throw new HitchError("no eligible local inference device is available; run hitch local doctor for diagnostics", {
74
- code: "inference_device_unsupported", exitCode: 3,
75
- });
76
- }
77
- function parseGpu(line) {
78
- const [uuid, name, total, free, driver, sm] = line.split(",").map((part) => part.trim());
79
- if (!uuid?.startsWith("GPU-") || !name || !driver || !sm || !Number.isFinite(Number(sm))
80
- || !Number.isFinite(Number(total)) || Number(total) <= 0 || !Number.isFinite(Number(free)) || Number(free) < 0) {
81
- throw new TypeError("nvidia-smi returned an invalid GPU record");
82
- }
83
- return { uuid, name, memory_mib: Number(total), free_memory_mib: Number(free), driver_version: driver, compute_capability: sm };
84
- }
85
- function result(backend, checks) {
86
- return { schema_version: "1", backend, ready: Object.values(checks).every((check) => check.status === "pass"), checks };
87
- }
88
- function pass(message) { return { status: "pass", message }; }
89
- function fail(message) { return { status: "fail", message }; }
90
- function unavailable(doctor) {
91
- return new HitchError(`${doctor.backend} local inference is unavailable: ${Object.values(doctor.checks).filter((c) => c.status === "fail").map((c) => c.message).join("; ")}`, {
92
- code: "inference_device_unsupported", exitCode: 3,
93
- });
94
- }
95
- //# sourceMappingURL=doctor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/inference/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,83 +0,0 @@
1
- import path from "node:path";
2
- import { HitchError, atomicWriteJSON, hitchRootId, readJSON, sha256JSON, statePaths, withFileLock } from "../foundation/index.js";
3
- import { parseInferenceServiceHandle, parseInferenceServiceRecord, parseModelNodeBinding } from "./manifest.js";
4
- import { loadModelNodeClient, observeModelNode } from "./node-registry.js";
5
- const SHA = /^sha256:[a-f0-9]{64}$/;
6
- const directory = (root, id) => path.join(statePaths(root).inferenceServices, id);
7
- function serviceDigest(record) {
8
- // A delayed startup projection may fill in an initially unknown handle.
9
- // The sealed node receipt owns that handle and validates every later projection.
10
- return sha256JSON({ service_id: record.service_id, inference_id: record.inference_id, model_node: record.model_node,
11
- epoch: record.epoch, isolation_key: record.isolation_key, owner_id: record.owner_id });
12
- }
13
- export function validateInferenceGenerationRelease(root, record, current, value) {
14
- const source = record.model_node;
15
- const r = value;
16
- const keys = ["schemaVersion", "kind", "serviceId", "ownerId", "inferenceId", "previousNode", "node", "sourceIdentityDigest", "handle",
17
- "admissionOnly", "state", "resourcesReleased", "gpuSeconds", "devices", "previousBootDigest", "currentBootDigest"];
18
- if (!source || source.node_id !== current.node_id || source.generation === current.generation || record.container_id
19
- || !r || Object.keys(r).sort().join(",") !== keys.sort().join(",") || r.schemaVersion !== 2 || r.kind !== "inference-generation-release"
20
- || r.serviceId !== record.service_id || r.ownerId !== hitchRootId(root) || r.inferenceId !== record.inference_id
21
- || sha256JSON(r.previousNode) !== sha256JSON({ nodeId: source.node_id, generation: source.generation })
22
- || sha256JSON(r.node) !== sha256JSON({ nodeId: current.node_id, generation: current.generation })
23
- || ![r.sourceIdentityDigest, r.previousBootDigest, r.currentBootDigest].every(v => typeof v === "string" && SHA.test(v))
24
- || r.previousBootDigest === r.currentBootDigest || r.state !== "stopped" || r.resourcesReleased !== true
25
- || typeof r.admissionOnly !== "boolean" || typeof r.gpuSeconds !== "number" || !Number.isFinite(r.gpuSeconds) || r.gpuSeconds < 0
26
- || !Array.isArray(r.devices) || r.devices.some(v => typeof v !== "string" || !/^GPU-[a-fA-F0-9-]+$/.test(v)) || new Set(r.devices).size !== r.devices.length
27
- || r.admissionOnly && (r.handle !== null || r.gpuSeconds !== 0 || r.devices.length !== 0))
28
- throw ambiguous();
29
- if (r.handle !== null) {
30
- const handle = parseInferenceServiceHandle(r.handle);
31
- if (handle.kind !== "process" || handle.node_id !== source.node_id || handle.generation !== source.generation
32
- || handle.service_id !== record.service_id)
33
- throw ambiguous();
34
- }
35
- if (record.service_handle && sha256JSON(record.service_handle) !== sha256JSON(r.handle))
36
- throw ambiguous();
37
- return structuredClone(r);
38
- }
39
- /** A confirmed release remains valid if the original node generation is no longer reachable. */
40
- export async function readInferenceGenerationRelease(root, record) {
41
- const value = await readJSON(path.join(directory(root, record.service_id), "generation-release.json"), null);
42
- if (!value)
43
- return null;
44
- if (Object.keys(value).sort().join(",") !== "model_node,receipt,receipt_digest,schema_version,service_digest"
45
- || value.schema_version !== "2" || value.service_digest !== serviceDigest(record) || value.receipt_digest !== sha256JSON(value.receipt))
46
- throw ambiguous();
47
- const node = parseModelNodeBinding(value.model_node);
48
- validateInferenceGenerationRelease(root, record, node, value.receipt);
49
- return value;
50
- }
51
- /** Explicitly drain an old generation. No service or experiment is rebound to the new generation. */
52
- export async function reconcileModelNodeService(root, serviceId, binding) {
53
- if (!/^inference_[a-f0-9]{32}$/.test(serviceId))
54
- throw ambiguous();
55
- const current = parseModelNodeBinding(binding);
56
- return withFileLock(statePaths(root).inferenceOperationLocks, sha256JSON({ kind: "generation-recovery", serviceId }), async () => {
57
- const stateFile = path.join(directory(root, serviceId), "state.json");
58
- const record = parseInferenceServiceRecord(await readJSON(stateFile));
59
- if (record.service_id !== serviceId || !record.model_node || record.model_node.node_id !== current.node_id
60
- || record.model_node.generation === current.generation)
61
- throw ambiguous();
62
- let stored = await readInferenceGenerationRelease(root, record);
63
- if (!stored) {
64
- const client = await loadModelNodeClient(root, current);
65
- await observeModelNode(client, current);
66
- const receipt = validateInferenceGenerationRelease(root, record, current, await client.call("inference.recover", {
67
- serviceId, ownerId: hitchRootId(root), inferenceId: record.inference_id,
68
- previousNode: { nodeId: record.model_node.node_id, generation: record.model_node.generation }, expectedHandle: record.service_handle ?? null,
69
- }));
70
- stored = { schema_version: "2", service_digest: serviceDigest(record), model_node: current, receipt_digest: sha256JSON(receipt), receipt };
71
- await atomicWriteJSON(path.join(directory(root, serviceId), "generation-release.json"), stored);
72
- }
73
- const latest = parseInferenceServiceRecord(await readJSON(stateFile));
74
- if (serviceDigest(latest) !== serviceDigest(record))
75
- throw ambiguous();
76
- validateInferenceGenerationRelease(root, latest, stored.model_node, stored.receipt);
77
- await atomicWriteJSON(stateFile, { ...latest, state: "stopped", lease_owner_ids: [], updated_at: new Date().toISOString() });
78
- return { schema_version: "2", service_id: serviceId, inference_id: record.inference_id, model_node: record.model_node,
79
- state: "stopped", resources_released: true, gpu_seconds: stored.receipt.gpuSeconds, generation_release: stored };
80
- });
81
- }
82
- function ambiguous() { return new HitchError("prior model-node generation has no matching confirmed service release", { code: "inference_recovery_ambiguous", exitCode: 12 }); }
83
- //# sourceMappingURL=generation-recovery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generation-recovery.js","sourceRoot":"","sources":["../../../src/inference/generation-recovery.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- import { loadModelNodeClient } from "./node-registry.js";
2
- import { ProcessSGLangLauncher } from "./process-sglang.js";
3
- import { DockerSGLangLauncher } from "./sglang.js";
4
- import { readInferenceGenerationRelease } from "./generation-recovery.js";
5
- /** Dispatch by the frozen model location; the Harbor provider is independent. */
6
- export class ManagedSGLangLauncher {
7
- docker;
8
- constructor(docker = new DockerSGLangLauncher()) {
9
- this.docker = docker;
10
- }
11
- async start(input) {
12
- if (!input.lock.model_node)
13
- return this.docker.start(input);
14
- return new ProcessSGLangLauncher(await loadModelNodeClient(input.root, input.lock.model_node)).start(input);
15
- }
16
- async attach(input) {
17
- if (!input.lock.model_node || await readInferenceGenerationRelease(input.root, input.record)) {
18
- throw new TypeError("only an unreleased model-node process supports attachment");
19
- }
20
- return new ProcessSGLangLauncher(await loadModelNodeClient(input.root, input.lock.model_node)).attach(input);
21
- }
22
- async stopOrphan(root, record) {
23
- if (!record.model_node)
24
- return this.docker.stopOrphan?.(root, record) ?? "ambiguous";
25
- try {
26
- if (await readInferenceGenerationRelease(root, record))
27
- return "stopped";
28
- return await new ProcessSGLangLauncher(await loadModelNodeClient(root, record.model_node)).stopOrphan(root, record);
29
- }
30
- catch {
31
- return "ambiguous";
32
- }
33
- }
34
- }
35
- //# sourceMappingURL=managed-launcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"managed-launcher.js","sourceRoot":"","sources":["../../../src/inference/managed-launcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAE1E,iFAAiF;AACjF,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,SAAyB,IAAI,oBAAoB,EAAE;QAAnD,WAAM,GAAN,MAAM,CAA6C;IAAG,CAAC;IACpF,KAAK,CAAC,KAAK,CAAC,KAAwB;QAClC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5D,OAAO,IAAI,qBAAqB,CAAC,MAAM,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9G,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,KAAwB;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,MAAM,8BAA8B,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7F,MAAM,IAAI,SAAS,CAAC,2DAA2D,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAI,qBAAqB,CAAC,MAAM,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/G,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,MAAgC;QAC7D,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,WAAW,CAAC;QACrF,IAAI,CAAC;YACH,IAAI,MAAM,8BAA8B,CAAC,IAAI,EAAE,MAAM,CAAC;gBAAE,OAAO,SAAS,CAAC;YACzE,OAAO,MAAM,IAAI,qBAAqB,CAAC,MAAM,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtH,CAAC;QACD,MAAM,CAAC;YAAC,OAAO,WAAW,CAAC;QAAC,CAAC;IAC/B,CAAC;CACF"}