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,35 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,262 @@
1
+ import { sha256JSON } from "../foundation/index.js";
2
+ import { parseModelNodeBinding } from "../domain/index.js";
3
+ export { parseModelNodeBinding } from "../domain/index.js";
4
+ const DIGEST = /^sha256:[a-f0-9]{64}$/;
5
+ export function localModelIdentity(value) {
6
+ return sha256JSON({
7
+ format: value.format,
8
+ files: value.files,
9
+ architecture: value.architecture,
10
+ model_type: value.model_type,
11
+ dtype: value.dtype,
12
+ quantization: value.quantization,
13
+ context_tokens: value.context_tokens,
14
+ tokenizer_digest: value.tokenizer_digest,
15
+ template_digest: value.template_digest,
16
+ });
17
+ }
18
+ export function inferenceRuntimeIdentity(value) {
19
+ return sha256JSON(value);
20
+ }
21
+ export function inferenceLockIdentity(value) {
22
+ return sha256JSON(value);
23
+ }
24
+ export function parseLocalModelManifest(value) {
25
+ const record = exact(value, [
26
+ "schema_version", "model_id", "format", "files", "architecture", "model_type", "dtype",
27
+ "quantization", "context_tokens", "tokenizer_digest", "template_digest", "source", "created_at",
28
+ ], "local model manifest");
29
+ if (record.schema_version !== "1" || record.format !== "hf-safetensors")
30
+ fail("unsupported local model manifest");
31
+ const files = array(record.files, "model files").map(parseModelFile);
32
+ if (files.length === 0 || files.some((file, index) => index > 0 && files[index - 1].path >= file.path)) {
33
+ fail("model files must be non-empty and strictly sorted");
34
+ }
35
+ const source = exact(record.source, ["kind", "label", "license"], "model source");
36
+ if (source.kind !== "local-directory")
37
+ fail("model source kind is invalid");
38
+ const manifest = {
39
+ schema_version: "1",
40
+ model_id: digest(record.model_id, "model_id"),
41
+ format: "hf-safetensors",
42
+ files,
43
+ architecture: text(record.architecture, "architecture"),
44
+ model_type: text(record.model_type, "model_type"),
45
+ dtype: text(record.dtype, "dtype"),
46
+ quantization: nullableText(record.quantization, "quantization"),
47
+ context_tokens: nullablePositiveInteger(record.context_tokens, "context_tokens"),
48
+ tokenizer_digest: digest(record.tokenizer_digest, "tokenizer_digest"),
49
+ template_digest: nullableDigest(record.template_digest, "template_digest"),
50
+ source: {
51
+ kind: "local-directory",
52
+ label: text(source.label, "source label"),
53
+ license: nullableText(source.license, "source license"),
54
+ },
55
+ created_at: timestamp(record.created_at, "created_at"),
56
+ };
57
+ const expected = localModelIdentity(manifest);
58
+ if (manifest.model_id !== expected)
59
+ fail("local model manifest identity mismatch");
60
+ return manifest;
61
+ }
62
+ export function parseInferenceRuntimeManifest(value) {
63
+ const record = exact(value, [
64
+ "schema_version", "runtime_id", "engine", "sglang_version", "sglang_commit", "backend", "package", "compatibility_profile",
65
+ ], "inference runtime manifest");
66
+ if ((record.schema_version !== "1" && record.schema_version !== "2") || record.engine !== "sglang")
67
+ fail("unsupported inference runtime manifest");
68
+ if (record.backend !== "cpu" && record.backend !== "cuda" && record.backend !== "metal")
69
+ fail("inference runtime backend is invalid");
70
+ const pythonPackage = record.backend === "metal" || (record.schema_version === "2" && !!record.package && typeof record.package === "object"
71
+ && record.package.kind === "python-env");
72
+ const packageRecord = exact(record.package, pythonPackage
73
+ ? ["kind", "environment_digest", "python_version", "packages_digest"]
74
+ : ["kind", "image", "image_digest", "platform"], "inference runtime package");
75
+ const runtimePackage = pythonPackage
76
+ ? {
77
+ kind: "python-env",
78
+ environment_digest: digest(packageRecord.environment_digest, "environment_digest"),
79
+ python_version: text(packageRecord.python_version, "python_version"),
80
+ packages_digest: digest(packageRecord.packages_digest, "packages_digest"),
81
+ }
82
+ : {
83
+ kind: "oci",
84
+ image: text(packageRecord.image, "runtime image"),
85
+ image_digest: digest(packageRecord.image_digest, "image_digest"),
86
+ platform: literal(packageRecord.platform, "linux/amd64", "runtime platform"),
87
+ };
88
+ if (packageRecord.kind !== runtimePackage.kind || (record.schema_version === "1" && (record.backend === "metal") !== (runtimePackage.kind === "python-env")))
89
+ fail("runtime package does not match backend");
90
+ const manifest = {
91
+ schema_version: record.schema_version,
92
+ runtime_id: digest(record.runtime_id, "runtime_id"),
93
+ engine: "sglang",
94
+ sglang_version: text(record.sglang_version, "sglang_version"),
95
+ sglang_commit: record.schema_version === "2" && runtimePackage.kind === "python-env"
96
+ ? nullableText(record.sglang_commit, "sglang_commit") : text(record.sglang_commit, "sglang_commit"),
97
+ backend: record.backend,
98
+ package: runtimePackage,
99
+ compatibility_profile: text(record.compatibility_profile, "compatibility_profile"),
100
+ };
101
+ const { runtime_id: _runtimeId, ...identity } = manifest;
102
+ if (manifest.runtime_id !== inferenceRuntimeIdentity(identity)) {
103
+ fail("inference runtime manifest identity mismatch");
104
+ }
105
+ return manifest;
106
+ }
107
+ export function parseInferenceServiceRecord(value) {
108
+ const record = exact(value, [
109
+ "schema_version", "service_id", "inference_id", "isolation_key", "state", "epoch", "owner_id",
110
+ "lease_owner_ids", "backend", "container_id", "service_handle", "model_node", "pid", "base_url", "started_at", "updated_at", "error",
111
+ ], "inference service record");
112
+ if (record.schema_version !== "1" || typeof record.service_id !== "string" || !/^inference_[a-f0-9]{32}$/.test(record.service_id)) {
113
+ fail("inference service identity is invalid");
114
+ }
115
+ if (!new Set(["starting", "ready", "draining", "stopped", "failed"]).has(String(record.state)))
116
+ fail("inference service state is invalid");
117
+ if (record.backend !== "cpu" && record.backend !== "cuda" && record.backend !== "metal")
118
+ fail("inference service backend is invalid");
119
+ if (!Number.isSafeInteger(record.epoch) || record.epoch < 1)
120
+ fail("inference service epoch is invalid");
121
+ const owners = array(record.lease_owner_ids, "inference lease owners").map((owner) => text(owner, "inference lease owner"));
122
+ if (new Set(owners).size !== owners.length)
123
+ fail("inference lease owners must be unique");
124
+ if (record.container_id !== undefined && (typeof record.container_id !== "string" || !/^[a-f0-9]{12,64}$/.test(record.container_id))) {
125
+ fail("inference container identity is invalid");
126
+ }
127
+ if (record.pid !== undefined && (!Number.isSafeInteger(record.pid) || record.pid < 1))
128
+ fail("inference process identity is invalid");
129
+ const serviceHandle = record.service_handle === undefined ? undefined : parseInferenceServiceHandle(record.service_handle);
130
+ const modelNode = record.model_node === undefined ? undefined : parseModelNodeBinding(record.model_node);
131
+ if (modelNode && (record.container_id !== undefined || record.pid !== undefined || serviceHandle?.kind === "docker"
132
+ || serviceHandle?.kind === "process" && (serviceHandle.node_id !== modelNode.node_id || serviceHandle.generation !== modelNode.generation))) {
133
+ fail("service handle differs from its frozen model node");
134
+ }
135
+ if (serviceHandle?.kind === "process" && (record.container_id !== undefined || record.pid !== undefined || serviceHandle.service_id !== record.service_id)) {
136
+ fail("process service handle cannot use local container/PID identity or another service ID");
137
+ }
138
+ if (serviceHandle?.kind === "docker" && record.container_id !== undefined && record.container_id !== serviceHandle.container_id)
139
+ fail("Docker service handle differs from container identity");
140
+ if (record.base_url !== undefined) {
141
+ let url;
142
+ try {
143
+ url = new URL(text(record.base_url, "inference base URL"));
144
+ }
145
+ catch {
146
+ fail("inference base URL is invalid");
147
+ }
148
+ if (url.protocol !== "http:" || url.hostname !== "127.0.0.1" || url.username || url.password || url.search || url.hash) {
149
+ fail("inference base URL must be loopback HTTP");
150
+ }
151
+ }
152
+ let error;
153
+ if (record.error !== undefined) {
154
+ const parsed = exact(record.error, ["code", "message"], "inference service error");
155
+ error = { code: text(parsed.code, "inference error code"), message: text(parsed.message, "inference error message") };
156
+ }
157
+ return {
158
+ schema_version: "1",
159
+ service_id: record.service_id,
160
+ inference_id: digest(record.inference_id, "inference_id"),
161
+ isolation_key: digest(record.isolation_key, "isolation_key"),
162
+ state: record.state,
163
+ epoch: record.epoch,
164
+ owner_id: text(record.owner_id, "inference owner"),
165
+ lease_owner_ids: owners,
166
+ backend: record.backend,
167
+ ...(record.container_id === undefined ? {} : { container_id: record.container_id }),
168
+ ...(serviceHandle ? { service_handle: serviceHandle } : {}),
169
+ ...(modelNode ? { model_node: modelNode } : {}),
170
+ ...(record.pid === undefined ? {} : { pid: record.pid }),
171
+ ...(record.base_url === undefined ? {} : { base_url: record.base_url }),
172
+ started_at: timestamp(record.started_at, "inference started_at"),
173
+ updated_at: timestamp(record.updated_at, "inference updated_at"),
174
+ ...(error ? { error } : {}),
175
+ };
176
+ }
177
+ export function parseInferenceServiceHandle(value) {
178
+ const input = value;
179
+ const process = input?.kind === "process";
180
+ const r = exact(input, process ? ["schema_version", "kind", "node_id", "generation", "service_id", "process"] : ["schema_version", "kind", "container_id"], "inference service handle");
181
+ if (r.schema_version !== "2")
182
+ fail("service handle version is invalid");
183
+ if (!process) {
184
+ if (r.kind !== "docker" || typeof r.container_id !== "string" || !/^[a-f0-9]{12,64}$/.test(r.container_id))
185
+ fail("Docker service handle is invalid");
186
+ return { schema_version: "2", kind: "docker", container_id: r.container_id };
187
+ }
188
+ const p = exact(r.process, ["pid", "created_at"], "model-node process identity");
189
+ for (const key of ["node_id", "generation"])
190
+ if (typeof r[key] !== "string" || !/^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$/.test(r[key]))
191
+ fail("model node identity/generation is invalid");
192
+ if (typeof r.service_id !== "string" || !/^inference_[a-f0-9]{32}$/.test(r.service_id)
193
+ || !Number.isSafeInteger(p.pid) || p.pid < 1 || typeof p.created_at !== "number" || !Number.isFinite(p.created_at) || p.created_at <= 0)
194
+ fail("model-node process handle is invalid");
195
+ return { schema_version: "2", kind: "process", node_id: r.node_id, generation: r.generation,
196
+ service_id: r.service_id, process: { pid: p.pid, created_at: p.created_at } };
197
+ }
198
+ function parseModelFile(value) {
199
+ const record = exact(value, ["path", "size", "sha256"], "model file");
200
+ const relative = text(record.path, "model file path");
201
+ if (relative.startsWith("/") || relative.includes("\\")
202
+ || relative.split("/").some((part) => !part || part === "." || part === ".."))
203
+ fail("model file path is unsafe");
204
+ if (!Number.isSafeInteger(record.size) || record.size < 0)
205
+ fail("model file size is invalid");
206
+ return { path: relative, size: record.size, sha256: digest(record.sha256, "model file digest") };
207
+ }
208
+ function exact(value, fields, label) {
209
+ if (!value || typeof value !== "object" || Array.isArray(value))
210
+ fail(`${label} must be an object`);
211
+ const record = value;
212
+ const allowed = new Set(fields);
213
+ const unknown = Object.keys(record).find((field) => !allowed.has(field));
214
+ if (unknown)
215
+ fail(`${label} has unknown field: ${unknown}`);
216
+ return record;
217
+ }
218
+ function array(value, label) {
219
+ if (!Array.isArray(value))
220
+ fail(`${label} must be an array`);
221
+ return value;
222
+ }
223
+ function text(value, label) {
224
+ if (typeof value !== "string" || !value.trim())
225
+ fail(`${label} must be a non-empty string`);
226
+ return value;
227
+ }
228
+ function nullableText(value, label) {
229
+ if (value === null)
230
+ return null;
231
+ return text(value, label);
232
+ }
233
+ function digest(value, label) {
234
+ if (typeof value !== "string" || !DIGEST.test(value))
235
+ fail(`${label} must be a SHA-256 digest`);
236
+ return value;
237
+ }
238
+ function nullableDigest(value, label) {
239
+ return value === null ? null : digest(value, label);
240
+ }
241
+ function nullablePositiveInteger(value, label) {
242
+ if (value === null)
243
+ return null;
244
+ if (!Number.isSafeInteger(value) || value <= 0)
245
+ fail(`${label} must be a positive integer or null`);
246
+ return value;
247
+ }
248
+ function timestamp(value, label) {
249
+ const result = text(value, label);
250
+ if (!Number.isFinite(Date.parse(result)))
251
+ fail(`${label} must be an ISO timestamp`);
252
+ return result;
253
+ }
254
+ function literal(value, expected, label) {
255
+ if (value !== expected)
256
+ fail(`${label} must be ${expected}`);
257
+ return expected;
258
+ }
259
+ function fail(message) {
260
+ throw new TypeError(message);
261
+ }
262
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/inference/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { chmod, link, lstat, mkdir, rename, rm, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { HitchError, ensureDir, statePaths } from "../foundation/index.js";
4
+ import { verifyLocalModel } from "./model-store.js";
5
+ export async function materializeLocalModel(root, manifest) {
6
+ await verifyLocalModel(root, manifest);
7
+ const paths = statePaths(root);
8
+ const target = path.join(paths.inferenceCache, "models", manifest.model_id.slice("sha256:".length));
9
+ if (await validMaterialization(target, manifest, paths.modelFiles))
10
+ return target;
11
+ const temporary = `${target}.tmp-${process.pid}-${Date.now()}`;
12
+ await rm(temporary, { recursive: true, force: true });
13
+ await ensureDir(temporary);
14
+ try {
15
+ for (const file of manifest.files) {
16
+ const destination = path.join(temporary, ...file.path.split("/"));
17
+ await mkdir(path.dirname(destination), { recursive: true });
18
+ await link(path.join(paths.modelFiles, file.sha256.slice("sha256:".length)), destination);
19
+ await chmod(destination, 0o444);
20
+ }
21
+ await ensureDir(path.dirname(target));
22
+ try {
23
+ await rename(temporary, target);
24
+ await chmodDirectories(target);
25
+ }
26
+ catch (error) {
27
+ if (error.code !== "EEXIST" && error.code !== "ENOTEMPTY")
28
+ throw error;
29
+ await rm(temporary, { recursive: true, force: true });
30
+ }
31
+ if (!await validMaterialization(target, manifest, paths.modelFiles)) {
32
+ throw new HitchError("materialized model failed integrity validation", { code: "local_model_integrity_failed", exitCode: 5 });
33
+ }
34
+ return target;
35
+ }
36
+ finally {
37
+ await rm(temporary, { recursive: true, force: true }).catch(() => { });
38
+ }
39
+ }
40
+ async function validMaterialization(directory, manifest, modelFiles) {
41
+ try {
42
+ const directoryStat = await stat(directory);
43
+ if (!directoryStat.isDirectory() || (directoryStat.mode & 0o222) !== 0)
44
+ return false;
45
+ for (const file of manifest.files) {
46
+ const candidate = path.join(directory, ...file.path.split("/"));
47
+ const observed = await lstat(candidate);
48
+ const stored = await lstat(path.join(modelFiles, file.sha256.slice("sha256:".length)));
49
+ if (!observed.isFile() || observed.isSymbolicLink() || observed.size !== file.size
50
+ || observed.dev !== stored.dev || observed.ino !== stored.ino)
51
+ return false;
52
+ }
53
+ return true;
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ async function chmodDirectories(root) {
60
+ const entries = await import("node:fs/promises").then(({ readdir }) => readdir(root, { withFileTypes: true }));
61
+ for (const entry of entries)
62
+ if (entry.isDirectory())
63
+ await chmodDirectories(path.join(root, entry.name));
64
+ await chmod(root, 0o555);
65
+ }
66
+ //# sourceMappingURL=materialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialize.js","sourceRoot":"","sources":["../../../src/inference/materialize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import path from "node:path";
2
+ import { atomicWriteJSON, readJSON, sha256JSON, statePaths } from "../foundation/index.js";
3
+ import { parseModelNodeBinding } from "./manifest.js";
4
+ export function parseModelSnapshotRef(value) {
5
+ const ref = value;
6
+ if (!ref || Object.keys(ref).sort().join(",") !== "digest,mediaType,uri" || !/^sha256:[a-f0-9]{64}$/.test(ref.digest)
7
+ || ref.uri !== `cas:${ref.digest}` || ref.mediaType !== "application/json")
8
+ throw new TypeError("model node requires a portable HF snapshot reference");
9
+ return ref;
10
+ }
11
+ function locationPath(root, model, binding) {
12
+ return path.join(statePaths(root).models, model.model_id.slice(7), "node-locations", sha256JSON(binding).slice(7) + ".json");
13
+ }
14
+ export async function rememberModelNodeSnapshot(root, model, binding, snapshotRef) {
15
+ parseModelNodeBinding(binding);
16
+ parseModelSnapshotRef(snapshotRef);
17
+ await atomicWriteJSON(locationPath(root, model, binding), { schema_version: "1", model_id: model.model_id, binding, snapshotRef });
18
+ }
19
+ export async function modelNodeSnapshot(root, model, binding) {
20
+ parseModelNodeBinding(binding);
21
+ let value;
22
+ try {
23
+ value = await readJSON(locationPath(root, model, binding));
24
+ }
25
+ catch (error) {
26
+ if (error.code === "ENOENT")
27
+ return null;
28
+ throw error;
29
+ }
30
+ if (value.schema_version !== "1" || value.model_id !== model.model_id || sha256JSON(value.binding) !== sha256JSON(binding))
31
+ throw new TypeError("stored model-node location changed identity");
32
+ return parseModelSnapshotRef(value.snapshotRef);
33
+ }
34
+ //# sourceMappingURL=model-location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-location.js","sourceRoot":"","sources":["../../../src/inference/model-location.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGtD,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,sBAAsB,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;WAChH,GAAG,CAAC,GAAG,KAAK,OAAO,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,KAAK,kBAAkB;QAAE,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAC1J,OAAO,GAAG,CAAC;AACb,CAAC;AACD,SAAS,YAAY,CAAC,IAAY,EAAE,KAA2B,EAAE,OAA2B;IAC1F,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;AAC/H,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAY,EAAE,KAA2B,EAAE,OAA2B,EAAE,WAA6B;IACnJ,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;AACrI,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAA2B,EAAE,OAA2B;IAC5G,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,KAAsG,CAAC;IAC3G,IAAI,CAAC;QAAC,KAAK,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IACnE,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;IACnG,IAAI,KAAK,CAAC,cAAc,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IAC/L,OAAO,qBAAqB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAClD,CAAC"}