agent-hitch 0.2.9 → 0.2.10

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 (410) hide show
  1. package/README.md +206 -137
  2. package/README.zh-CN.md +193 -119
  3. package/dist/scripts/canary-native-training.js +221 -0
  4. package/dist/scripts/canary-native-training.js.map +1 -0
  5. package/dist/scripts/canary-remote-training.js +246 -0
  6. package/dist/scripts/canary-remote-training.js.map +1 -0
  7. package/dist/scripts/canary-remote-verifier.js +124 -0
  8. package/dist/scripts/canary-remote-verifier.js.map +1 -0
  9. package/dist/scripts/canary-worker-host.js +113 -0
  10. package/dist/scripts/canary-worker-host.js.map +1 -0
  11. package/dist/scripts/canary-worker-peer.js +188 -0
  12. package/dist/scripts/canary-worker-peer.js.map +1 -0
  13. package/dist/scripts/check-architecture.js +4 -3
  14. package/dist/scripts/check-architecture.js.map +1 -1
  15. package/dist/src/adapters/catalog.js +2 -1
  16. package/dist/src/adapters/catalog.js.map +1 -1
  17. package/dist/src/adapters/providers/codex.js +65 -2
  18. package/dist/src/adapters/providers/codex.js.map +1 -1
  19. package/dist/src/adapters/providers/model-call.js +17 -1
  20. package/dist/src/adapters/providers/model-call.js.map +1 -1
  21. package/dist/src/adapters/providers/training-tool.js +29 -0
  22. package/dist/src/adapters/providers/training-tool.js.map +1 -0
  23. package/dist/src/artifacts/index.js +1 -1
  24. package/dist/src/artifacts/index.js.map +1 -1
  25. package/dist/src/artifacts/store.js +15 -10
  26. package/dist/src/artifacts/store.js.map +1 -1
  27. package/dist/src/backends/harbor/backend.js +24 -15
  28. package/dist/src/backends/harbor/backend.js.map +1 -1
  29. package/dist/src/backends/harbor/bridge-environment.js +12 -0
  30. package/dist/src/backends/harbor/bridge-environment.js.map +1 -0
  31. package/dist/src/backends/harbor/environment-config.js +2 -2
  32. package/dist/src/backends/harbor/environment-config.js.map +1 -1
  33. package/dist/src/backends/harbor/host-credential-helper.js +81 -0
  34. package/dist/src/backends/harbor/host-credential-helper.js.map +1 -0
  35. package/dist/src/backends/harbor/index.js +3 -0
  36. package/dist/src/backends/harbor/index.js.map +1 -1
  37. package/dist/src/backends/harbor/model-proxy-config.js +18 -1
  38. package/dist/src/backends/harbor/model-proxy-config.js.map +1 -1
  39. package/dist/src/backends/harbor/observation.js +61 -0
  40. package/dist/src/backends/harbor/observation.js.map +1 -0
  41. package/dist/src/backends/harbor/portable-regrade.js +150 -0
  42. package/dist/src/backends/harbor/portable-regrade.js.map +1 -0
  43. package/dist/src/backends/harbor/process.js +26 -5
  44. package/dist/src/backends/harbor/process.js.map +1 -1
  45. package/dist/src/backends/harbor/regrade.js +4 -1
  46. package/dist/src/backends/harbor/regrade.js.map +1 -1
  47. package/dist/src/backends/harbor/supervisor.js +22 -0
  48. package/dist/src/backends/harbor/supervisor.js.map +1 -1
  49. package/dist/src/backends/harbor/tools.js +2 -0
  50. package/dist/src/backends/harbor/tools.js.map +1 -1
  51. package/dist/src/backends/index.js +3 -0
  52. package/dist/src/backends/index.js.map +1 -1
  53. package/dist/src/cli/arguments.js +33 -0
  54. package/dist/src/cli/arguments.js.map +1 -1
  55. package/dist/src/cli/commands/capabilities.js +14 -1
  56. package/dist/src/cli/commands/capabilities.js.map +1 -1
  57. package/dist/src/cli/commands/daemon.js +19 -0
  58. package/dist/src/cli/commands/daemon.js.map +1 -1
  59. package/dist/src/cli/commands/eval.js +38 -10
  60. package/dist/src/cli/commands/eval.js.map +1 -1
  61. package/dist/src/cli/commands/local.js +130 -0
  62. package/dist/src/cli/commands/local.js.map +1 -0
  63. package/dist/src/cli/commands/model-node.js +26 -0
  64. package/dist/src/cli/commands/model-node.js.map +1 -0
  65. package/dist/src/cli/commands/models.js +72 -0
  66. package/dist/src/cli/commands/models.js.map +1 -0
  67. package/dist/src/cli/commands/run.js +36 -1
  68. package/dist/src/cli/commands/run.js.map +1 -1
  69. package/dist/src/cli/commands/training.js +32 -0
  70. package/dist/src/cli/commands/training.js.map +1 -0
  71. package/dist/src/cli/commands/worker.js +30 -2
  72. package/dist/src/cli/commands/worker.js.map +1 -1
  73. package/dist/src/cli/main.js +8 -0
  74. package/dist/src/cli/main.js.map +1 -1
  75. package/dist/src/cli/output.js +24 -2
  76. package/dist/src/cli/output.js.map +1 -1
  77. package/dist/src/control-plane/eval-records.js +2 -0
  78. package/dist/src/control-plane/eval-records.js.map +1 -1
  79. package/dist/src/control-plane/eval-recovery.js +7 -1
  80. package/dist/src/control-plane/eval-recovery.js.map +1 -1
  81. package/dist/src/control-plane/eval-scheduler.js +24 -50
  82. package/dist/src/control-plane/eval-scheduler.js.map +1 -1
  83. package/dist/src/control-plane/eval-submission-persist.js +30 -0
  84. package/dist/src/control-plane/eval-submission-persist.js.map +1 -0
  85. package/dist/src/control-plane/execution-observation-contract.js +60 -0
  86. package/dist/src/control-plane/execution-observation-contract.js.map +1 -0
  87. package/dist/src/control-plane/index.js +10 -0
  88. package/dist/src/control-plane/index.js.map +1 -1
  89. package/dist/src/control-plane/inference-manager.js +357 -0
  90. package/dist/src/control-plane/inference-manager.js.map +1 -0
  91. package/dist/src/control-plane/managed-gateway-receipt.js +26 -0
  92. package/dist/src/control-plane/managed-gateway-receipt.js.map +1 -0
  93. package/dist/src/control-plane/managed-service-recovery.js +158 -0
  94. package/dist/src/control-plane/managed-service-recovery.js.map +1 -0
  95. package/dist/src/control-plane/model-capture-planning.js +15 -1
  96. package/dist/src/control-plane/model-capture-planning.js.map +1 -1
  97. package/dist/src/control-plane/ordered-eval-control.js +221 -0
  98. package/dist/src/control-plane/ordered-eval-control.js.map +1 -0
  99. package/dist/src/control-plane/remote-backend-result.js +18 -0
  100. package/dist/src/control-plane/remote-backend-result.js.map +1 -0
  101. package/dist/src/control-plane/remote-execution-lease.js +15 -0
  102. package/dist/src/control-plane/remote-execution-lease.js.map +1 -0
  103. package/dist/src/control-plane/remote-execution-observation.js +108 -0
  104. package/dist/src/control-plane/remote-execution-observation.js.map +1 -0
  105. package/dist/src/control-plane/remote-model-routes.js +107 -0
  106. package/dist/src/control-plane/remote-model-routes.js.map +1 -0
  107. package/dist/src/control-plane/remote-observation-reporter.js +37 -0
  108. package/dist/src/control-plane/remote-observation-reporter.js.map +1 -0
  109. package/dist/src/control-plane/remote-offer-contract.js +48 -0
  110. package/dist/src/control-plane/remote-offer-contract.js.map +1 -0
  111. package/dist/src/control-plane/remote-rerun-journal.js +61 -0
  112. package/dist/src/control-plane/remote-rerun-journal.js.map +1 -0
  113. package/dist/src/control-plane/remote-result-transport.js +55 -9
  114. package/dist/src/control-plane/remote-result-transport.js.map +1 -1
  115. package/dist/src/control-plane/remote-verifier-import.js +52 -0
  116. package/dist/src/control-plane/remote-verifier-import.js.map +1 -0
  117. package/dist/src/control-plane/remote-verifier-result.js +61 -0
  118. package/dist/src/control-plane/remote-verifier-result.js.map +1 -0
  119. package/dist/src/control-plane/remote-verifier-source-transport.js +68 -0
  120. package/dist/src/control-plane/remote-verifier-source-transport.js.map +1 -0
  121. package/dist/src/control-plane/remote-work-coordinator.js +103 -47
  122. package/dist/src/control-plane/remote-work-coordinator.js.map +1 -1
  123. package/dist/src/control-plane/remote-work-inputs.js +26 -5
  124. package/dist/src/control-plane/remote-work-inputs.js.map +1 -1
  125. package/dist/src/control-plane/remote-work-recovery.js +123 -34
  126. package/dist/src/control-plane/remote-work-recovery.js.map +1 -1
  127. package/dist/src/control-plane/remote-worker-artifacts.js +10 -7
  128. package/dist/src/control-plane/remote-worker-artifacts.js.map +1 -1
  129. package/dist/src/control-plane/remote-worker-cleanup.js +104 -0
  130. package/dist/src/control-plane/remote-worker-cleanup.js.map +1 -0
  131. package/dist/src/control-plane/remote-worker-client.js +156 -14
  132. package/dist/src/control-plane/remote-worker-client.js.map +1 -1
  133. package/dist/src/control-plane/remote-worker-codecs.js +160 -0
  134. package/dist/src/control-plane/remote-worker-codecs.js.map +1 -0
  135. package/dist/src/control-plane/remote-worker-generation-recovery.js +67 -0
  136. package/dist/src/control-plane/remote-worker-generation-recovery.js.map +1 -0
  137. package/dist/src/control-plane/remote-worker-ownership.js +51 -0
  138. package/dist/src/control-plane/remote-worker-ownership.js.map +1 -0
  139. package/dist/src/control-plane/remote-worker-protocol.js +85 -119
  140. package/dist/src/control-plane/remote-worker-protocol.js.map +1 -1
  141. package/dist/src/control-plane/remote-worker-runner.js +95 -18
  142. package/dist/src/control-plane/remote-worker-runner.js.map +1 -1
  143. package/dist/src/control-plane/remote-workers.js +33 -5
  144. package/dist/src/control-plane/remote-workers.js.map +1 -1
  145. package/dist/src/control-plane/rerun-recovery.js +89 -0
  146. package/dist/src/control-plane/rerun-recovery.js.map +1 -0
  147. package/dist/src/control-plane/rerun-scheduler.js +70 -96
  148. package/dist/src/control-plane/rerun-scheduler.js.map +1 -1
  149. package/dist/src/control-plane/rerun-source.js +57 -0
  150. package/dist/src/control-plane/rerun-source.js.map +1 -0
  151. package/dist/src/control-plane/worker-model-relay.js +76 -0
  152. package/dist/src/control-plane/worker-model-relay.js.map +1 -0
  153. package/dist/src/controller-runtime/hash.js +3 -0
  154. package/dist/src/controller-runtime/hash.js.map +1 -1
  155. package/dist/src/controller-runtime/index.js +2 -0
  156. package/dist/src/controller-runtime/index.js.map +1 -1
  157. package/dist/src/controller-runtime/observation.js +29 -0
  158. package/dist/src/controller-runtime/observation.js.map +1 -0
  159. package/dist/src/controller-runtime/resident.js +22 -0
  160. package/dist/src/controller-runtime/resident.js.map +1 -0
  161. package/dist/src/daemon/client.js +34 -1
  162. package/dist/src/daemon/client.js.map +1 -1
  163. package/dist/src/daemon/execution-observation.js +38 -0
  164. package/dist/src/daemon/execution-observation.js.map +1 -0
  165. package/dist/src/daemon/http.js +57 -0
  166. package/dist/src/daemon/http.js.map +1 -0
  167. package/dist/src/daemon/inference-prepare.js +47 -0
  168. package/dist/src/daemon/inference-prepare.js.map +1 -0
  169. package/dist/src/daemon/scheduler.js +4 -1
  170. package/dist/src/daemon/scheduler.js.map +1 -1
  171. package/dist/src/daemon/server.js +80 -82
  172. package/dist/src/daemon/server.js.map +1 -1
  173. package/dist/src/daemon/worker-observation.js +34 -0
  174. package/dist/src/daemon/worker-observation.js.map +1 -0
  175. package/dist/src/daemon/worker-ownership.js +71 -0
  176. package/dist/src/daemon/worker-ownership.js.map +1 -0
  177. package/dist/src/daemon/worker-routes.js +83 -15
  178. package/dist/src/daemon/worker-routes.js.map +1 -1
  179. package/dist/src/domain/execution-observation.js +2 -0
  180. package/dist/src/domain/execution-observation.js.map +1 -0
  181. package/dist/src/domain/index.js +1 -0
  182. package/dist/src/domain/index.js.map +1 -1
  183. package/dist/src/domain/inference.js +2 -0
  184. package/dist/src/domain/inference.js.map +1 -0
  185. package/dist/src/domain/runs.js.map +1 -1
  186. package/dist/src/domain/training.js +2 -0
  187. package/dist/src/domain/training.js.map +1 -0
  188. package/dist/src/domain/validation.js +11 -0
  189. package/dist/src/domain/validation.js.map +1 -1
  190. package/dist/src/domain/verifier-source.js +2 -0
  191. package/dist/src/domain/verifier-source.js.map +1 -0
  192. package/dist/src/domain/worker-recovery.js +2 -0
  193. package/dist/src/domain/worker-recovery.js.map +1 -0
  194. package/dist/src/evals/eval-logical-plan.js +8 -1
  195. package/dist/src/evals/eval-logical-plan.js.map +1 -1
  196. package/dist/src/evals/execution-leases.js +15 -2
  197. package/dist/src/evals/execution-leases.js.map +1 -1
  198. package/dist/src/evals/execution-plan.js +11 -1
  199. package/dist/src/evals/execution-plan.js.map +1 -1
  200. package/dist/src/evals/harbor-bridge-error.js +8 -0
  201. package/dist/src/evals/harbor-bridge-error.js.map +1 -1
  202. package/dist/src/evals/index.js +19 -0
  203. package/dist/src/evals/index.js.map +1 -1
  204. package/dist/src/evals/model-capture-plan.js +12 -0
  205. package/dist/src/evals/model-capture-plan.js.map +1 -1
  206. package/dist/src/evals/model-capture-runtime.js +25 -0
  207. package/dist/src/evals/model-capture-runtime.js.map +1 -1
  208. package/dist/src/evals/physical-work-plan.js +57 -0
  209. package/dist/src/evals/physical-work-plan.js.map +1 -0
  210. package/dist/src/evals/preparation-rerun.js +6 -0
  211. package/dist/src/evals/preparation-rerun.js.map +1 -1
  212. package/dist/src/evals/recovery.js +8 -1
  213. package/dist/src/evals/recovery.js.map +1 -1
  214. package/dist/src/evals/regrade-evidence.js +4 -4
  215. package/dist/src/evals/regrade-evidence.js.map +1 -1
  216. package/dist/src/evals/remote-execution-ownership.js +50 -0
  217. package/dist/src/evals/remote-execution-ownership.js.map +1 -0
  218. package/dist/src/evals/remote-infrastructure-retry.js +2 -0
  219. package/dist/src/evals/remote-infrastructure-retry.js.map +1 -1
  220. package/dist/src/evals/remote-lease-release.js +58 -0
  221. package/dist/src/evals/remote-lease-release.js.map +1 -0
  222. package/dist/src/evals/remote-rerun-execution.js +85 -0
  223. package/dist/src/evals/remote-rerun-execution.js.map +1 -0
  224. package/dist/src/evals/remote-trial.js +6 -0
  225. package/dist/src/evals/remote-trial.js.map +1 -0
  226. package/dist/src/evals/remote-verifier-assessment.js +85 -0
  227. package/dist/src/evals/remote-verifier-assessment.js.map +1 -0
  228. package/dist/src/evals/remote-verifier-contract.js +43 -0
  229. package/dist/src/evals/remote-verifier-contract.js.map +1 -0
  230. package/dist/src/evals/remote-verifier-execution.js +105 -0
  231. package/dist/src/evals/remote-verifier-execution.js.map +1 -0
  232. package/dist/src/evals/remote-verifier-journal.js +21 -0
  233. package/dist/src/evals/remote-verifier-journal.js.map +1 -0
  234. package/dist/src/evals/remote-verifier-outcome.js +51 -0
  235. package/dist/src/evals/remote-verifier-outcome.js.map +1 -0
  236. package/dist/src/evals/remote-verifier-rerun.js +134 -0
  237. package/dist/src/evals/remote-verifier-rerun.js.map +1 -0
  238. package/dist/src/evals/remote-verifier-selection.js +61 -0
  239. package/dist/src/evals/remote-verifier-selection.js.map +1 -0
  240. package/dist/src/evals/remote-verifier-source.js +33 -0
  241. package/dist/src/evals/remote-verifier-source.js.map +1 -0
  242. package/dist/src/evals/remote-worker-cleanup.js +46 -0
  243. package/dist/src/evals/remote-worker-cleanup.js.map +1 -0
  244. package/dist/src/evals/request.js +58 -1
  245. package/dist/src/evals/request.js.map +1 -1
  246. package/dist/src/evals/rerun-completion.js +39 -0
  247. package/dist/src/evals/rerun-completion.js.map +1 -0
  248. package/dist/src/evals/rerun-resume.js +70 -0
  249. package/dist/src/evals/rerun-resume.js.map +1 -0
  250. package/dist/src/evals/rerun-state.js +25 -0
  251. package/dist/src/evals/rerun-state.js.map +1 -0
  252. package/dist/src/evals/rerun-types.js.map +1 -1
  253. package/dist/src/evals/rerun.js +90 -46
  254. package/dist/src/evals/rerun.js.map +1 -1
  255. package/dist/src/evals/service.js +59 -5
  256. package/dist/src/evals/service.js.map +1 -1
  257. package/dist/src/evals/verifier-only-rerun.js +2 -16
  258. package/dist/src/evals/verifier-only-rerun.js.map +1 -1
  259. package/dist/src/evals/verifier-rerun-result.js +24 -0
  260. package/dist/src/evals/verifier-rerun-result.js.map +1 -0
  261. package/dist/src/evals/verifier-source-import.js +48 -0
  262. package/dist/src/evals/verifier-source-import.js.map +1 -0
  263. package/dist/src/evals/verifier-source.js +139 -0
  264. package/dist/src/evals/verifier-source.js.map +1 -0
  265. package/dist/src/foundation/base64.js +19 -0
  266. package/dist/src/foundation/base64.js.map +1 -0
  267. package/dist/src/foundation/config.js +10 -0
  268. package/dist/src/foundation/config.js.map +1 -1
  269. package/dist/src/foundation/credential-redaction.js +22 -9
  270. package/dist/src/foundation/credential-redaction.js.map +1 -1
  271. package/dist/src/foundation/index.js +1 -0
  272. package/dist/src/foundation/index.js.map +1 -1
  273. package/dist/src/foundation/process-identity.js +13 -9
  274. package/dist/src/foundation/process-identity.js.map +1 -1
  275. package/dist/src/inference/daemon-capacity.js +41 -0
  276. package/dist/src/inference/daemon-capacity.js.map +1 -0
  277. package/dist/src/inference/device-reservation.js +58 -0
  278. package/dist/src/inference/device-reservation.js.map +1 -0
  279. package/dist/src/inference/doctor.js +95 -0
  280. package/dist/src/inference/doctor.js.map +1 -0
  281. package/dist/src/inference/generation-recovery.js +83 -0
  282. package/dist/src/inference/generation-recovery.js.map +1 -0
  283. package/dist/src/inference/index.js +24 -0
  284. package/dist/src/inference/index.js.map +1 -0
  285. package/dist/src/inference/lock.js +331 -0
  286. package/dist/src/inference/lock.js.map +1 -0
  287. package/dist/src/inference/managed-launcher.js +35 -0
  288. package/dist/src/inference/managed-launcher.js.map +1 -0
  289. package/dist/src/inference/manifest.js +262 -0
  290. package/dist/src/inference/manifest.js.map +1 -0
  291. package/dist/src/inference/materialize.js +66 -0
  292. package/dist/src/inference/materialize.js.map +1 -0
  293. package/dist/src/inference/model-location.js +34 -0
  294. package/dist/src/inference/model-location.js.map +1 -0
  295. package/dist/src/inference/model-store.js +439 -0
  296. package/dist/src/inference/model-store.js.map +1 -0
  297. package/dist/src/inference/node-client.js +167 -0
  298. package/dist/src/inference/node-client.js.map +1 -0
  299. package/dist/src/inference/node-registry.js +79 -0
  300. package/dist/src/inference/node-registry.js.map +1 -0
  301. package/dist/src/inference/observation.js +79 -0
  302. package/dist/src/inference/observation.js.map +1 -0
  303. package/dist/src/inference/preflight.js +132 -0
  304. package/dist/src/inference/preflight.js.map +1 -0
  305. package/dist/src/inference/process-sglang.js +169 -0
  306. package/dist/src/inference/process-sglang.js.map +1 -0
  307. package/dist/src/inference/protocol-probe.js +29 -0
  308. package/dist/src/inference/protocol-probe.js.map +1 -0
  309. package/dist/src/inference/remote-model-store.js +24 -0
  310. package/dist/src/inference/remote-model-store.js.map +1 -0
  311. package/dist/src/inference/runtime-catalog.js +41 -0
  312. package/dist/src/inference/runtime-catalog.js.map +1 -0
  313. package/dist/src/inference/runtime-store.js +93 -0
  314. package/dist/src/inference/runtime-store.js.map +1 -0
  315. package/dist/src/inference/service-attachment.js +46 -0
  316. package/dist/src/inference/service-attachment.js.map +1 -0
  317. package/dist/src/inference/service-inspection.js +38 -0
  318. package/dist/src/inference/service-inspection.js.map +1 -0
  319. package/dist/src/inference/sglang.js +279 -0
  320. package/dist/src/inference/sglang.js.map +1 -0
  321. package/dist/src/inference/supervisor.js +460 -0
  322. package/dist/src/inference/supervisor.js.map +1 -0
  323. package/dist/src/model-access/environment.js +28 -0
  324. package/dist/src/model-access/environment.js.map +1 -0
  325. package/dist/src/model-access/index.js +4 -0
  326. package/dist/src/model-access/index.js.map +1 -1
  327. package/dist/src/model-access/local-gateway-request.js +139 -0
  328. package/dist/src/model-access/local-gateway-request.js.map +1 -0
  329. package/dist/src/model-access/local-gateway.js +323 -0
  330. package/dist/src/model-access/local-gateway.js.map +1 -0
  331. package/dist/src/model-access/proxy.js +90 -5
  332. package/dist/src/model-access/proxy.js.map +1 -1
  333. package/dist/src/model-access/remote-model.js +58 -0
  334. package/dist/src/model-access/remote-model.js.map +1 -0
  335. package/dist/src/model-access/training.js +115 -0
  336. package/dist/src/model-access/training.js.map +1 -0
  337. package/dist/src/runs/adapter-process.js +2 -2
  338. package/dist/src/runs/adapter-process.js.map +1 -1
  339. package/dist/src/runs/executor-types.js +2 -0
  340. package/dist/src/runs/executor-types.js.map +1 -0
  341. package/dist/src/runs/executor.js +54 -34
  342. package/dist/src/runs/executor.js.map +1 -1
  343. package/dist/src/runs/index.js +1 -0
  344. package/dist/src/runs/index.js.map +1 -1
  345. package/dist/src/runs/local-inference-environment.js +59 -0
  346. package/dist/src/runs/local-inference-environment.js.map +1 -0
  347. package/dist/src/runs/local-inference-run.js +53 -0
  348. package/dist/src/runs/local-inference-run.js.map +1 -0
  349. package/dist/src/runs/outcome.js +22 -0
  350. package/dist/src/runs/outcome.js.map +1 -1
  351. package/dist/src/runs/records.js +9 -0
  352. package/dist/src/runs/records.js.map +1 -1
  353. package/dist/src/runs/request.js +58 -3
  354. package/dist/src/runs/request.js.map +1 -1
  355. package/dist/src/runs/training-evidence.js +22 -0
  356. package/dist/src/runs/training-evidence.js.map +1 -0
  357. package/dist/src/runs/training-runtime.js +20 -0
  358. package/dist/src/runs/training-runtime.js.map +1 -0
  359. package/dist/src/workers/execution-observation.js +32 -0
  360. package/dist/src/workers/execution-observation.js.map +1 -0
  361. package/dist/src/workers/index.js +2 -0
  362. package/dist/src/workers/index.js.map +1 -1
  363. package/dist/src/workers/remote-harbor-ownership.js +266 -0
  364. package/dist/src/workers/remote-harbor-ownership.js.map +1 -0
  365. package/dist/src/workers/remote-harbor-verifier.js +76 -0
  366. package/dist/src/workers/remote-harbor-verifier.js.map +1 -0
  367. package/dist/src/workers/remote-harbor-work-spec.js +66 -10
  368. package/dist/src/workers/remote-harbor-work-spec.js.map +1 -1
  369. package/dist/src/workers/remote-harbor-worker.js +56 -49
  370. package/dist/src/workers/remote-harbor-worker.js.map +1 -1
  371. package/dist/src/workers/remote-worker-host.js +33 -0
  372. package/dist/src/workers/remote-worker-host.js.map +1 -0
  373. package/docs/local-model-inference-spec.zh-CN.md +666 -0
  374. package/docs/schemas/controller-runtime-observation.schema.json +21 -0
  375. package/docs/schemas/eval-execution-plan.schema.json +1 -0
  376. package/docs/schemas/eval-request.schema.json +3 -1
  377. package/docs/schemas/execution-lease.schema.json +95 -1
  378. package/docs/schemas/execution-provider-status.schema.json +162 -28
  379. package/docs/schemas/inference-execution-evidence.schema.json +487 -0
  380. package/docs/schemas/inference-lock.schema.json +487 -0
  381. package/docs/schemas/inference-runtime-manifest.schema.json +156 -0
  382. package/docs/schemas/inference-service-record.schema.json +227 -0
  383. package/docs/schemas/local-inference-selection.schema.json +98 -0
  384. package/docs/schemas/local-model-manifest.schema.json +43 -0
  385. package/docs/schemas/model-node-binding.schema.json +34 -0
  386. package/docs/schemas/model-node-generation-release.schema.json +46 -0
  387. package/docs/schemas/ordered-eval-control.schema.json +39 -0
  388. package/docs/schemas/remote-execution-lease-grant.schema.json +45 -0
  389. package/docs/schemas/remote-harbor-work-spec.schema.json +325 -0
  390. package/docs/schemas/remote-model-binding.schema.json +21 -0
  391. package/docs/schemas/remote-physical-execution.schema.json +108 -0
  392. package/docs/schemas/remote-result-envelope.schema.json +9 -3
  393. package/docs/schemas/remote-tree-envelope.schema.json +17 -3
  394. package/docs/schemas/remote-verifier-result.schema.json +203 -0
  395. package/docs/schemas/remote-verifier-source.schema.json +52 -0
  396. package/docs/schemas/remote-verifier-work.schema.json +125 -0
  397. package/docs/schemas/remote-work-offer.schema.json +170 -34
  398. package/docs/schemas/remote-worker-execution-admission.schema.json +214 -0
  399. package/docs/schemas/remote-worker-generation-cleanup.schema.json +199 -0
  400. package/docs/schemas/remote-worker-registration.schema.json +226 -25
  401. package/docs/schemas/run-manifest.schema.json +211 -44
  402. package/docs/schemas/run-request.schema.json +2 -1
  403. package/docs/schemas/training-external-binding.schema.json +26 -0
  404. package/integrations/harbor/hitch_harbor_agent.py +241 -13
  405. package/integrations/harbor/hitch_harbor_environment.py +22 -1
  406. package/integrations/harbor/hitch_host_credentials.py +354 -0
  407. package/integrations/harbor/hitch_private_exec.py +150 -0
  408. package/integrations/model-call/cli.js +13 -5
  409. package/integrations/training-tool/cli.js +72 -0
  410. package/package.json +8 -2
@@ -0,0 +1,95 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/inference/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation-recovery.js","sourceRoot":"","sources":["../../../src/inference/generation-recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export { inferenceLockIdentity, inferenceRuntimeIdentity, localModelIdentity, parseInferenceRuntimeManifest, parseInferenceServiceRecord, parseInferenceServiceHandle, parseLocalModelManifest } from "./manifest.js";
2
+ export { addLocalModel, gcLocalModels, resolveLocalModel, verifyLocalModel } from "./model-store.js";
3
+ export { listRuntimeCatalog, runtimeCatalogEntry } from "./runtime-catalog.js";
4
+ export { validateRuntimeObservation, validateProcessRuntimeObservation } from "./observation.js";
5
+ export { doctorLocalInference, resolveLocalInferenceDevice } from "./doctor.js";
6
+ export { localInferenceDaemonEnvironment } from "./daemon-capacity.js";
7
+ export { loadInferenceRuntime, prepareInferenceRuntime } from "./runtime-store.js";
8
+ export { buildInferenceLock, loadInferenceLock, persistInferenceLock, validateInferenceLockShape } from "./lock.js";
9
+ export { prepareLocalInference } from "./preflight.js";
10
+ export { materializeLocalModel } from "./materialize.js";
11
+ export { DockerSGLangLauncher } from "./sglang.js";
12
+ export { ProcessSGLangLauncher } from "./process-sglang.js";
13
+ export { ManagedSGLangLauncher } from "./managed-launcher.js";
14
+ export { parseModelNodeBinding } from "./manifest.js";
15
+ export { parseModelNodeRegistration, registerModelNode, loadModelNodeClient, observeModelNode, runtimeFromModelNode } from "./node-registry.js";
16
+ export { PythonInferenceNodeClient } from "./node-client.js";
17
+ export { SGLangServiceSupervisor } from "./supervisor.js";
18
+ export { readModelNodeRegistration, readModelNodeBinding } from "./node-registry.js";
19
+ export { inspectModelNodeService } from "./service-inspection.js";
20
+ export { readServiceRecords } from "./supervisor.js";
21
+ export { reconcileModelNodeService } from "./generation-recovery.js";
22
+ export { addModelFromNode, verifyModelOnNode } from "./remote-model-store.js";
23
+ export { parseModelSnapshotRef } from "./model-location.js";
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/inference/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACtN,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAErG,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAEpH,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEhJ,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAG7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,331 @@
1
+ import { availableParallelism } from "node:os";
2
+ import path from "node:path";
3
+ import { HitchError, atomicWriteJSON, readJSON, sha256JSON, statePaths } from "../foundation/index.js";
4
+ import { inferenceLockIdentity, parseModelNodeBinding } from "./manifest.js";
5
+ export function buildInferenceLock(model, runtime, options) {
6
+ if (runtime.backend !== options.backend || (runtime.package.kind !== "oci" && runtime.schema_version !== "2")) {
7
+ throw new TypeError("runtime backend does not match the lock request");
8
+ }
9
+ if (options.modelNode && (options.backend !== "cuda" || !options.deviceConstraint || runtime.schema_version !== "2"
10
+ || runtime.package.kind !== "python-env" || runtime.package.environment_digest !== options.modelNode.runtime_digest)) {
11
+ throw new TypeError("model node lock requires its observed Python CUDA runtime and explicit GPU");
12
+ }
13
+ if (model.dtype === "unknown") {
14
+ throw new HitchError("model config must declare torch_dtype", { code: "inference_model_unsupported", exitCode: 2 });
15
+ }
16
+ const throughput = options.profile === "throughput";
17
+ const context = Math.min(8_192, model.context_tokens ?? 8_192);
18
+ const maxRunning = throughput ? options.backend === "cuda" ? 8 : 2 : 1;
19
+ const weights = model.files.filter((file) => file.path.endsWith(".safetensors")).reduce((total, file) => total + file.size, 0);
20
+ const memoryBytes = Math.max(2 * 1024 ** 3, Math.ceil(weights * 1.25 + 1024 ** 3));
21
+ const parser = toolParserFor(model.model_type);
22
+ const cpuThreads = Math.max(1, Math.min(options.cpuThreads ?? availableParallelism(), 8));
23
+ const platform = options.backend === "cpu"
24
+ ? {
25
+ backend: "cpu",
26
+ cpu_threads: cpuThreads,
27
+ numa_policy: "single-node",
28
+ cpu_feature_requirement: "amx",
29
+ overlap_schedule: false,
30
+ }
31
+ : {
32
+ backend: "cuda",
33
+ ...(options.deviceConstraint ? { device_constraint: options.deviceConstraint } : {}),
34
+ mem_fraction_static: 0.8,
35
+ overlap_schedule: throughput,
36
+ cuda_graph: throughput ? "enabled" : "disabled",
37
+ };
38
+ const withoutIdentity = {
39
+ schema_version: options.modelNode ? "2" : "1",
40
+ ...(options.modelNode ? { model_node: parseModelNodeBinding(options.modelNode) } : {}),
41
+ engine: "sglang",
42
+ model_id: model.model_id,
43
+ runtime_id: runtime.runtime_id,
44
+ profile: options.profile,
45
+ execution: {
46
+ platform,
47
+ load_format: "safetensors",
48
+ dtype: model.dtype,
49
+ quantization: model.quantization,
50
+ tensor_parallel_size: 1,
51
+ data_parallel_size: 1,
52
+ pipeline_parallel_size: 1,
53
+ context_tokens_per_request: context,
54
+ max_running_requests: maxRunning,
55
+ max_queued_requests: maxRunning,
56
+ max_total_tokens: context * (maxRunning + 1),
57
+ chunked_prefill_size: throughput ? Math.min(4_096, context) : -1,
58
+ max_prefill_tokens: context,
59
+ kv_cache_dtype: model.dtype === "bfloat16" || model.dtype === "bf16" ? "bfloat16" : "auto",
60
+ attention_backend: options.backend === "cpu" ? "intel_amx" : "flashinfer",
61
+ sampling_backend: options.backend === "cpu" ? "pytorch" : "flashinfer",
62
+ deterministic_inference: false,
63
+ prefix_cache: {
64
+ mode: throughput ? "radix" : "disabled",
65
+ scope: "eval",
66
+ initial_state: "empty",
67
+ },
68
+ hicache: false,
69
+ speculative_decoding: false,
70
+ cpu_offload_gb: 0,
71
+ startup_timeout_ms: 600_000,
72
+ queue_timeout_ms: 60_000,
73
+ request_timeout_ms: 600_000,
74
+ idle_ttl_ms: 60_000,
75
+ },
76
+ generation: {
77
+ temperature: 0,
78
+ top_p: 1,
79
+ top_k: 0,
80
+ min_p: 0,
81
+ repetition_penalty: 1,
82
+ seed: 0,
83
+ max_output_tokens: Math.min(2_048, Math.max(1, Math.floor(context / 4))),
84
+ override_policy: "reject-conflicts",
85
+ },
86
+ protocol: {
87
+ api: options.api ?? "responses",
88
+ streaming: true,
89
+ tool_calls: parser !== null,
90
+ parallel_tool_calls: false,
91
+ input_modalities: ["text"],
92
+ tool_call_parser: parser,
93
+ reasoning_parser: null,
94
+ compatibility_profile_id: sha256JSON({
95
+ engine: "sglang",
96
+ runtime_id: runtime.runtime_id,
97
+ model_type: model.model_type,
98
+ template_digest: model.template_digest,
99
+ api: options.api ?? "responses",
100
+ tool_call_parser: parser,
101
+ }),
102
+ },
103
+ resources: {
104
+ cpu_millis: options.backend === "cpu" ? cpuThreads * 1_000 : 2_000,
105
+ memory_bytes: memoryBytes,
106
+ container_slots: options.modelNode ? 0 : 1,
107
+ build_slots: 0,
108
+ ...(options.backend === "cuda" ? { gpu_count: 1 } : {}),
109
+ ephemeral_disk_bytes: 4 * 1024 ** 3,
110
+ },
111
+ };
112
+ return { ...withoutIdentity, inference_id: inferenceLockIdentity(withoutIdentity) };
113
+ }
114
+ export async function persistInferenceLock(root, lock) {
115
+ const directory = path.join(statePaths(root).inferenceLocks, lock.inference_id.slice("sha256:".length));
116
+ await atomicWriteJSON(path.join(directory, "lock.json"), lock);
117
+ }
118
+ export async function loadInferenceLock(root, inferenceId) {
119
+ let value;
120
+ try {
121
+ value = await readJSON(path.join(statePaths(root).inferenceLocks, inferenceId.slice("sha256:".length), "lock.json"));
122
+ }
123
+ catch (error) {
124
+ throw new HitchError(`inference lock is unavailable: ${inferenceId}`, { code: "inference_lock_mismatch", exitCode: 2, cause: error });
125
+ }
126
+ const lock = validateInferenceLockShape(value);
127
+ if (lock.inference_id !== inferenceId) {
128
+ throw new HitchError("inference lock path and identity do not match", { code: "inference_lock_mismatch", exitCode: 5 });
129
+ }
130
+ return lock;
131
+ }
132
+ export function validateInferenceLockShape(value) {
133
+ const record = exact(value, ["schema_version", "engine", "model_id", "runtime_id", "inference_id", "profile", "execution", "generation", "protocol", "resources", "model_node"], "inference lock");
134
+ if (!["1", "2"].includes(String(record.schema_version)) || record.engine !== "sglang"
135
+ || !digest(record.model_id) || !digest(record.runtime_id) || !digest(record.inference_id)
136
+ || (record.profile !== "baseline" && record.profile !== "throughput"))
137
+ throw lockError("inference lock identity is invalid");
138
+ const execution = parseExecution(record.execution);
139
+ const generation = parseGeneration(record.generation);
140
+ const protocol = parseProtocol(record.protocol);
141
+ const modelNode = record.schema_version === "2" ? parseModelNodeBinding(record.model_node) : undefined;
142
+ if (!modelNode && record.model_node !== undefined)
143
+ throw lockError("legacy inference lock cannot contain a model node");
144
+ if (modelNode && (execution.platform.backend !== "cuda" || !execution.platform.device_constraint))
145
+ throw lockError("model node requires an explicit physical CUDA device");
146
+ const resources = parseResources(record.resources, execution.platform.backend, !!modelNode);
147
+ const lock = {
148
+ schema_version: modelNode ? "2" : "1", ...(modelNode ? { model_node: modelNode } : {}), engine: "sglang", model_id: record.model_id, runtime_id: record.runtime_id,
149
+ inference_id: record.inference_id, profile: record.profile, execution, generation, protocol, resources,
150
+ };
151
+ validateProfile(lock);
152
+ const { inference_id: _inferenceId, ...identity } = lock;
153
+ if (inferenceLockIdentity(identity) !== lock.inference_id)
154
+ throw lockError("inference lock identity mismatch");
155
+ return lock;
156
+ }
157
+ function parseExecution(value) {
158
+ const record = exact(value, [
159
+ "platform", "load_format", "dtype", "quantization", "tensor_parallel_size", "data_parallel_size", "pipeline_parallel_size",
160
+ "context_tokens_per_request", "max_running_requests", "max_queued_requests", "max_total_tokens", "chunked_prefill_size",
161
+ "max_prefill_tokens", "kv_cache_dtype", "attention_backend", "sampling_backend", "deterministic_inference", "prefix_cache",
162
+ "hicache", "speculative_decoding", "cpu_offload_gb", "startup_timeout_ms", "queue_timeout_ms", "request_timeout_ms", "idle_ttl_ms",
163
+ ], "inference execution");
164
+ if (record.load_format !== "safetensors" || record.tensor_parallel_size !== 1 || record.data_parallel_size !== 1
165
+ || record.pipeline_parallel_size !== 1 || typeof record.dtype !== "string" || !record.dtype
166
+ || record.quantization !== null && (typeof record.quantization !== "string" || !record.quantization)
167
+ || typeof record.deterministic_inference !== "boolean" || record.hicache !== false
168
+ || record.speculative_decoding !== false || record.cpu_offload_gb !== 0)
169
+ throw lockError("inference execution configuration is invalid");
170
+ const prefix = exact(record.prefix_cache, ["mode", "scope", "initial_state"], "inference prefix cache");
171
+ if ((prefix.mode !== "disabled" && prefix.mode !== "radix") || (prefix.scope !== "run" && prefix.scope !== "eval") || prefix.initial_state !== "empty") {
172
+ throw lockError("inference prefix cache configuration is invalid");
173
+ }
174
+ const positiveFields = [
175
+ "context_tokens_per_request", "max_running_requests", "max_total_tokens", "max_prefill_tokens",
176
+ "startup_timeout_ms", "queue_timeout_ms", "request_timeout_ms",
177
+ ];
178
+ for (const field of positiveFields)
179
+ positiveInteger(record[field], `inference execution ${field}`);
180
+ nonNegativeInteger(record.max_queued_requests, "inference execution max_queued_requests");
181
+ nonNegativeInteger(record.idle_ttl_ms, "inference execution idle_ttl_ms");
182
+ if (!Number.isSafeInteger(record.chunked_prefill_size) || record.chunked_prefill_size < -1)
183
+ throw lockError("inference chunked prefill size is invalid");
184
+ if (record.max_total_tokens < record.context_tokens_per_request
185
+ || record.max_prefill_tokens > record.context_tokens_per_request) {
186
+ throw lockError("inference token budgets are inconsistent");
187
+ }
188
+ const platform = parsePlatform(record.platform);
189
+ return {
190
+ platform,
191
+ load_format: "safetensors",
192
+ dtype: record.dtype,
193
+ quantization: record.quantization,
194
+ tensor_parallel_size: 1, data_parallel_size: 1, pipeline_parallel_size: 1,
195
+ context_tokens_per_request: record.context_tokens_per_request,
196
+ max_running_requests: record.max_running_requests,
197
+ max_queued_requests: record.max_queued_requests,
198
+ max_total_tokens: record.max_total_tokens,
199
+ chunked_prefill_size: record.chunked_prefill_size,
200
+ max_prefill_tokens: record.max_prefill_tokens,
201
+ kv_cache_dtype: nonEmptyString(record.kv_cache_dtype, "inference KV cache dtype"),
202
+ attention_backend: nonEmptyString(record.attention_backend, "inference attention backend"),
203
+ sampling_backend: nonEmptyString(record.sampling_backend, "inference sampling backend"),
204
+ deterministic_inference: record.deterministic_inference,
205
+ prefix_cache: { mode: prefix.mode, scope: prefix.scope, initial_state: "empty" },
206
+ hicache: false, speculative_decoding: false, cpu_offload_gb: 0,
207
+ startup_timeout_ms: record.startup_timeout_ms,
208
+ queue_timeout_ms: record.queue_timeout_ms,
209
+ request_timeout_ms: record.request_timeout_ms,
210
+ idle_ttl_ms: record.idle_ttl_ms,
211
+ };
212
+ }
213
+ function parsePlatform(value) {
214
+ const base = exactRecord(value, "inference platform");
215
+ if (base.backend === "cpu") {
216
+ const record = exact(base, ["backend", "cpu_threads", "numa_policy", "cpu_feature_requirement", "overlap_schedule"], "CPU inference platform");
217
+ if (record.numa_policy !== "single-node" || record.cpu_feature_requirement !== "amx" || record.overlap_schedule !== false)
218
+ throw lockError("CPU inference platform is invalid");
219
+ return { backend: "cpu", cpu_threads: positiveInteger(record.cpu_threads, "CPU inference threads"), numa_policy: "single-node", cpu_feature_requirement: "amx", overlap_schedule: false };
220
+ }
221
+ if (base.backend === "cuda") {
222
+ const record = exact(base, ["backend", "device_constraint", "mem_fraction_static", "overlap_schedule", "cuda_graph"], "CUDA inference platform");
223
+ if (record.device_constraint !== undefined && (typeof record.device_constraint !== "string" || !record.device_constraint)
224
+ || typeof record.mem_fraction_static !== "number" || !Number.isFinite(record.mem_fraction_static)
225
+ || record.mem_fraction_static <= 0 || record.mem_fraction_static > 1 || typeof record.overlap_schedule !== "boolean"
226
+ || record.cuda_graph !== "enabled" && record.cuda_graph !== "disabled")
227
+ throw lockError("CUDA inference platform is invalid");
228
+ return { backend: "cuda", ...(record.device_constraint ? { device_constraint: record.device_constraint } : {}), mem_fraction_static: record.mem_fraction_static, overlap_schedule: record.overlap_schedule, cuda_graph: record.cuda_graph };
229
+ }
230
+ if (base.backend === "metal") {
231
+ const record = exact(base, ["backend", "mlx_quantization", "overlap_schedule"], "Metal inference platform");
232
+ if (record.mlx_quantization !== "none" && record.mlx_quantization !== "prequantized" || typeof record.overlap_schedule !== "boolean")
233
+ throw lockError("Metal inference platform is invalid");
234
+ return { backend: "metal", mlx_quantization: record.mlx_quantization, overlap_schedule: record.overlap_schedule };
235
+ }
236
+ throw lockError("inference platform backend is invalid");
237
+ }
238
+ function parseGeneration(value) {
239
+ const record = exact(value, ["temperature", "top_p", "top_k", "min_p", "repetition_penalty", "seed", "max_output_tokens", "override_policy"], "inference generation");
240
+ const finite = (field) => {
241
+ const number = record[field];
242
+ if (typeof number !== "number" || !Number.isFinite(number))
243
+ throw lockError(`inference generation ${field} is invalid`);
244
+ return number;
245
+ };
246
+ const temperature = finite("temperature"), topP = finite("top_p"), minP = finite("min_p"), penalty = finite("repetition_penalty");
247
+ if (temperature < 0 || topP < 0 || topP > 1 || minP < 0 || minP > 1 || penalty <= 0
248
+ || !Number.isSafeInteger(record.top_k) || record.top_k < 0 || !Number.isSafeInteger(record.seed)
249
+ || record.override_policy !== "reject-conflicts")
250
+ throw lockError("inference generation configuration is invalid");
251
+ return { temperature, top_p: topP, top_k: record.top_k, min_p: minP, repetition_penalty: penalty,
252
+ seed: record.seed, max_output_tokens: positiveInteger(record.max_output_tokens, "inference max output tokens"), override_policy: "reject-conflicts" };
253
+ }
254
+ function parseProtocol(value) {
255
+ const record = exact(value, ["api", "streaming", "tool_calls", "parallel_tool_calls", "input_modalities", "tool_call_parser", "reasoning_parser", "compatibility_profile_id"], "inference protocol");
256
+ if (record.api !== "responses" && record.api !== "chat-completions" || typeof record.streaming !== "boolean"
257
+ || typeof record.tool_calls !== "boolean" || typeof record.parallel_tool_calls !== "boolean"
258
+ || !Array.isArray(record.input_modalities) || record.input_modalities.length !== 1 || record.input_modalities[0] !== "text"
259
+ || record.tool_call_parser !== null && (typeof record.tool_call_parser !== "string" || !record.tool_call_parser)
260
+ || record.reasoning_parser !== null && (typeof record.reasoning_parser !== "string" || !record.reasoning_parser)
261
+ || !digest(record.compatibility_profile_id) || record.parallel_tool_calls && !record.tool_calls)
262
+ throw lockError("inference protocol configuration is invalid");
263
+ return { api: record.api, streaming: record.streaming, tool_calls: record.tool_calls, parallel_tool_calls: record.parallel_tool_calls,
264
+ input_modalities: ["text"], tool_call_parser: record.tool_call_parser,
265
+ reasoning_parser: record.reasoning_parser, compatibility_profile_id: record.compatibility_profile_id };
266
+ }
267
+ function parseResources(value, backend, processNode) {
268
+ const record = exact(value, ["cpu_millis", "memory_bytes", "container_slots", "build_slots", "gpu_count", "ephemeral_disk_bytes"], "inference resources");
269
+ const resources = {
270
+ cpu_millis: positiveInteger(record.cpu_millis, "inference CPU reservation"),
271
+ memory_bytes: positiveInteger(record.memory_bytes, "inference memory reservation"),
272
+ container_slots: processNode ? nonNegativeInteger(record.container_slots, "inference container reservation") : positiveInteger(record.container_slots, "inference container reservation"),
273
+ build_slots: nonNegativeInteger(record.build_slots, "inference build reservation"),
274
+ ...(record.gpu_count === undefined ? {} : { gpu_count: nonNegativeInteger(record.gpu_count, "inference GPU reservation") }),
275
+ ...(record.ephemeral_disk_bytes === undefined ? {} : { ephemeral_disk_bytes: nonNegativeInteger(record.ephemeral_disk_bytes, "inference disk reservation") }),
276
+ };
277
+ if (resources.build_slots !== 0 || processNode && resources.container_slots !== 0 || backend === "cuda" && resources.gpu_count !== 1
278
+ || backend !== "cuda" && (resources.gpu_count ?? 0) !== 0)
279
+ throw lockError("inference resource/backend combination is invalid");
280
+ return resources;
281
+ }
282
+ function validateProfile(lock) {
283
+ const throughput = lock.profile === "throughput";
284
+ const expectedRunning = throughput ? lock.execution.platform.backend === "cuda" ? 8 : 2 : 1;
285
+ if (lock.execution.max_running_requests !== expectedRunning || lock.execution.max_queued_requests !== expectedRunning
286
+ || throughput !== (lock.execution.prefix_cache.mode === "radix") || lock.execution.prefix_cache.scope !== "eval") {
287
+ throw lockError("inference lock does not match its profile");
288
+ }
289
+ }
290
+ function exact(value, fields, label) {
291
+ const record = exactRecord(value, label);
292
+ const allowed = new Set(fields);
293
+ const unknown = Object.keys(record).find((field) => !allowed.has(field));
294
+ if (unknown)
295
+ throw lockError(`${label} has unknown field: ${unknown}`);
296
+ return record;
297
+ }
298
+ function exactRecord(value, label) {
299
+ if (!value || typeof value !== "object" || Array.isArray(value))
300
+ throw lockError(`${label} must be an object`);
301
+ return value;
302
+ }
303
+ function nonEmptyString(value, label) {
304
+ if (typeof value !== "string" || !value)
305
+ throw lockError(`${label} must be a non-empty string`);
306
+ return value;
307
+ }
308
+ function positiveInteger(value, label) {
309
+ if (!Number.isSafeInteger(value) || value < 1)
310
+ throw lockError(`${label} must be a positive safe integer`);
311
+ return value;
312
+ }
313
+ function nonNegativeInteger(value, label) {
314
+ if (!Number.isSafeInteger(value) || value < 0)
315
+ throw lockError(`${label} must be a non-negative safe integer`);
316
+ return value;
317
+ }
318
+ function toolParserFor(modelType) {
319
+ if (/^qwen(?:2|3)/.test(modelType))
320
+ return "qwen25";
321
+ if (/^llama/.test(modelType))
322
+ return "llama3";
323
+ return null;
324
+ }
325
+ function digest(value) {
326
+ return typeof value === "string" && /^sha256:[a-f0-9]{64}$/.test(value);
327
+ }
328
+ function lockError(message) {
329
+ return new HitchError(message, { code: "inference_lock_mismatch", exitCode: 5 });
330
+ }
331
+ //# sourceMappingURL=lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/inference/lock.ts"],"names":[],"mappings":"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"}