agent-hitch 0.2.9 → 0.2.11
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.
- package/README.md +208 -138
- package/README.zh-CN.md +195 -120
- package/dist/scripts/canary-native-training.js +221 -0
- package/dist/scripts/canary-native-training.js.map +1 -0
- package/dist/scripts/canary-remote-training.js +246 -0
- package/dist/scripts/canary-remote-training.js.map +1 -0
- package/dist/scripts/canary-remote-verifier.js +124 -0
- package/dist/scripts/canary-remote-verifier.js.map +1 -0
- package/dist/scripts/canary-worker-host.js +113 -0
- package/dist/scripts/canary-worker-host.js.map +1 -0
- package/dist/scripts/canary-worker-peer.js +188 -0
- package/dist/scripts/canary-worker-peer.js.map +1 -0
- package/dist/scripts/check-architecture.js +4 -3
- package/dist/scripts/check-architecture.js.map +1 -1
- package/dist/src/adapters/catalog.js +2 -1
- package/dist/src/adapters/catalog.js.map +1 -1
- package/dist/src/adapters/providers/codex.js +65 -2
- package/dist/src/adapters/providers/codex.js.map +1 -1
- package/dist/src/adapters/providers/model-call.js +17 -1
- package/dist/src/adapters/providers/model-call.js.map +1 -1
- package/dist/src/adapters/providers/training-tool.js +29 -0
- package/dist/src/adapters/providers/training-tool.js.map +1 -0
- package/dist/src/artifacts/index.js +1 -1
- package/dist/src/artifacts/index.js.map +1 -1
- package/dist/src/artifacts/store.js +15 -10
- package/dist/src/artifacts/store.js.map +1 -1
- package/dist/src/backends/harbor/backend.js +24 -15
- package/dist/src/backends/harbor/backend.js.map +1 -1
- package/dist/src/backends/harbor/bridge-environment.js +12 -0
- package/dist/src/backends/harbor/bridge-environment.js.map +1 -0
- package/dist/src/backends/harbor/environment-config.js +2 -2
- package/dist/src/backends/harbor/environment-config.js.map +1 -1
- package/dist/src/backends/harbor/host-credential-helper.js +81 -0
- package/dist/src/backends/harbor/host-credential-helper.js.map +1 -0
- package/dist/src/backends/harbor/index.js +3 -0
- package/dist/src/backends/harbor/index.js.map +1 -1
- package/dist/src/backends/harbor/model-proxy-config.js +18 -1
- package/dist/src/backends/harbor/model-proxy-config.js.map +1 -1
- package/dist/src/backends/harbor/observation.js +61 -0
- package/dist/src/backends/harbor/observation.js.map +1 -0
- package/dist/src/backends/harbor/portable-regrade.js +150 -0
- package/dist/src/backends/harbor/portable-regrade.js.map +1 -0
- package/dist/src/backends/harbor/process.js +26 -5
- package/dist/src/backends/harbor/process.js.map +1 -1
- package/dist/src/backends/harbor/regrade.js +4 -1
- package/dist/src/backends/harbor/regrade.js.map +1 -1
- package/dist/src/backends/harbor/supervisor.js +22 -0
- package/dist/src/backends/harbor/supervisor.js.map +1 -1
- package/dist/src/backends/harbor/tools.js +2 -0
- package/dist/src/backends/harbor/tools.js.map +1 -1
- package/dist/src/backends/index.js +3 -0
- package/dist/src/backends/index.js.map +1 -1
- package/dist/src/cli/arguments.js +33 -0
- package/dist/src/cli/arguments.js.map +1 -1
- package/dist/src/cli/commands/capabilities.js +15 -1
- package/dist/src/cli/commands/capabilities.js.map +1 -1
- package/dist/src/cli/commands/daemon.js +19 -0
- package/dist/src/cli/commands/daemon.js.map +1 -1
- package/dist/src/cli/commands/eval.js +38 -10
- package/dist/src/cli/commands/eval.js.map +1 -1
- package/dist/src/cli/commands/local.js +130 -0
- package/dist/src/cli/commands/local.js.map +1 -0
- package/dist/src/cli/commands/model-node.js +26 -0
- package/dist/src/cli/commands/model-node.js.map +1 -0
- package/dist/src/cli/commands/models.js +72 -0
- package/dist/src/cli/commands/models.js.map +1 -0
- package/dist/src/cli/commands/run.js +36 -1
- package/dist/src/cli/commands/run.js.map +1 -1
- package/dist/src/cli/commands/training.js +32 -0
- package/dist/src/cli/commands/training.js.map +1 -0
- package/dist/src/cli/commands/verifier.js +54 -3
- package/dist/src/cli/commands/verifier.js.map +1 -1
- package/dist/src/cli/commands/worker.js +30 -2
- package/dist/src/cli/commands/worker.js.map +1 -1
- package/dist/src/cli/main.js +8 -0
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/cli/output.js +26 -2
- package/dist/src/cli/output.js.map +1 -1
- package/dist/src/control-plane/eval-records.js +2 -0
- package/dist/src/control-plane/eval-records.js.map +1 -1
- package/dist/src/control-plane/eval-recovery.js +7 -1
- package/dist/src/control-plane/eval-recovery.js.map +1 -1
- package/dist/src/control-plane/eval-scheduler.js +24 -50
- package/dist/src/control-plane/eval-scheduler.js.map +1 -1
- package/dist/src/control-plane/eval-submission-persist.js +30 -0
- package/dist/src/control-plane/eval-submission-persist.js.map +1 -0
- package/dist/src/control-plane/execution-observation-contract.js +60 -0
- package/dist/src/control-plane/execution-observation-contract.js.map +1 -0
- package/dist/src/control-plane/index.js +10 -0
- package/dist/src/control-plane/index.js.map +1 -1
- package/dist/src/control-plane/inference-manager.js +357 -0
- package/dist/src/control-plane/inference-manager.js.map +1 -0
- package/dist/src/control-plane/managed-gateway-receipt.js +26 -0
- package/dist/src/control-plane/managed-gateway-receipt.js.map +1 -0
- package/dist/src/control-plane/managed-service-recovery.js +158 -0
- package/dist/src/control-plane/managed-service-recovery.js.map +1 -0
- package/dist/src/control-plane/model-capture-planning.js +15 -1
- package/dist/src/control-plane/model-capture-planning.js.map +1 -1
- package/dist/src/control-plane/ordered-eval-control.js +221 -0
- package/dist/src/control-plane/ordered-eval-control.js.map +1 -0
- package/dist/src/control-plane/remote-backend-result.js +18 -0
- package/dist/src/control-plane/remote-backend-result.js.map +1 -0
- package/dist/src/control-plane/remote-execution-lease.js +15 -0
- package/dist/src/control-plane/remote-execution-lease.js.map +1 -0
- package/dist/src/control-plane/remote-execution-observation.js +108 -0
- package/dist/src/control-plane/remote-execution-observation.js.map +1 -0
- package/dist/src/control-plane/remote-model-routes.js +107 -0
- package/dist/src/control-plane/remote-model-routes.js.map +1 -0
- package/dist/src/control-plane/remote-observation-reporter.js +37 -0
- package/dist/src/control-plane/remote-observation-reporter.js.map +1 -0
- package/dist/src/control-plane/remote-offer-contract.js +48 -0
- package/dist/src/control-plane/remote-offer-contract.js.map +1 -0
- package/dist/src/control-plane/remote-rerun-journal.js +61 -0
- package/dist/src/control-plane/remote-rerun-journal.js.map +1 -0
- package/dist/src/control-plane/remote-result-transport.js +55 -9
- package/dist/src/control-plane/remote-result-transport.js.map +1 -1
- package/dist/src/control-plane/remote-verifier-import.js +52 -0
- package/dist/src/control-plane/remote-verifier-import.js.map +1 -0
- package/dist/src/control-plane/remote-verifier-result.js +61 -0
- package/dist/src/control-plane/remote-verifier-result.js.map +1 -0
- package/dist/src/control-plane/remote-verifier-source-transport.js +68 -0
- package/dist/src/control-plane/remote-verifier-source-transport.js.map +1 -0
- package/dist/src/control-plane/remote-work-coordinator.js +103 -47
- package/dist/src/control-plane/remote-work-coordinator.js.map +1 -1
- package/dist/src/control-plane/remote-work-inputs.js +26 -5
- package/dist/src/control-plane/remote-work-inputs.js.map +1 -1
- package/dist/src/control-plane/remote-work-recovery.js +123 -34
- package/dist/src/control-plane/remote-work-recovery.js.map +1 -1
- package/dist/src/control-plane/remote-worker-artifacts.js +10 -7
- package/dist/src/control-plane/remote-worker-artifacts.js.map +1 -1
- package/dist/src/control-plane/remote-worker-cleanup.js +104 -0
- package/dist/src/control-plane/remote-worker-cleanup.js.map +1 -0
- package/dist/src/control-plane/remote-worker-client.js +156 -14
- package/dist/src/control-plane/remote-worker-client.js.map +1 -1
- package/dist/src/control-plane/remote-worker-codecs.js +160 -0
- package/dist/src/control-plane/remote-worker-codecs.js.map +1 -0
- package/dist/src/control-plane/remote-worker-generation-recovery.js +67 -0
- package/dist/src/control-plane/remote-worker-generation-recovery.js.map +1 -0
- package/dist/src/control-plane/remote-worker-ownership.js +51 -0
- package/dist/src/control-plane/remote-worker-ownership.js.map +1 -0
- package/dist/src/control-plane/remote-worker-protocol.js +85 -119
- package/dist/src/control-plane/remote-worker-protocol.js.map +1 -1
- package/dist/src/control-plane/remote-worker-runner.js +95 -18
- package/dist/src/control-plane/remote-worker-runner.js.map +1 -1
- package/dist/src/control-plane/remote-workers.js +33 -5
- package/dist/src/control-plane/remote-workers.js.map +1 -1
- package/dist/src/control-plane/rerun-recovery.js +89 -0
- package/dist/src/control-plane/rerun-recovery.js.map +1 -0
- package/dist/src/control-plane/rerun-scheduler.js +70 -96
- package/dist/src/control-plane/rerun-scheduler.js.map +1 -1
- package/dist/src/control-plane/rerun-source.js +57 -0
- package/dist/src/control-plane/rerun-source.js.map +1 -0
- package/dist/src/control-plane/worker-model-relay.js +76 -0
- package/dist/src/control-plane/worker-model-relay.js.map +1 -0
- package/dist/src/controller-runtime/hash.js +3 -0
- package/dist/src/controller-runtime/hash.js.map +1 -1
- package/dist/src/controller-runtime/index.js +2 -0
- package/dist/src/controller-runtime/index.js.map +1 -1
- package/dist/src/controller-runtime/observation.js +29 -0
- package/dist/src/controller-runtime/observation.js.map +1 -0
- package/dist/src/controller-runtime/resident.js +22 -0
- package/dist/src/controller-runtime/resident.js.map +1 -0
- package/dist/src/daemon/client.js +34 -1
- package/dist/src/daemon/client.js.map +1 -1
- package/dist/src/daemon/execution-observation.js +38 -0
- package/dist/src/daemon/execution-observation.js.map +1 -0
- package/dist/src/daemon/http.js +57 -0
- package/dist/src/daemon/http.js.map +1 -0
- package/dist/src/daemon/inference-prepare.js +47 -0
- package/dist/src/daemon/inference-prepare.js.map +1 -0
- package/dist/src/daemon/scheduler.js +4 -1
- package/dist/src/daemon/scheduler.js.map +1 -1
- package/dist/src/daemon/server.js +80 -82
- package/dist/src/daemon/server.js.map +1 -1
- package/dist/src/daemon/worker-observation.js +34 -0
- package/dist/src/daemon/worker-observation.js.map +1 -0
- package/dist/src/daemon/worker-ownership.js +71 -0
- package/dist/src/daemon/worker-ownership.js.map +1 -0
- package/dist/src/daemon/worker-routes.js +83 -15
- package/dist/src/daemon/worker-routes.js.map +1 -1
- package/dist/src/domain/execution-observation.js +2 -0
- package/dist/src/domain/execution-observation.js.map +1 -0
- package/dist/src/domain/index.js +1 -0
- package/dist/src/domain/index.js.map +1 -1
- package/dist/src/domain/inference.js +2 -0
- package/dist/src/domain/inference.js.map +1 -0
- package/dist/src/domain/runs.js.map +1 -1
- package/dist/src/domain/training.js +2 -0
- package/dist/src/domain/training.js.map +1 -0
- package/dist/src/domain/validation.js +11 -0
- package/dist/src/domain/validation.js.map +1 -1
- package/dist/src/domain/verifier-source.js +2 -0
- package/dist/src/domain/verifier-source.js.map +1 -0
- package/dist/src/domain/worker-recovery.js +2 -0
- package/dist/src/domain/worker-recovery.js.map +1 -0
- package/dist/src/evals/eval-logical-plan.js +8 -1
- package/dist/src/evals/eval-logical-plan.js.map +1 -1
- package/dist/src/evals/execution-leases.js +15 -2
- package/dist/src/evals/execution-leases.js.map +1 -1
- package/dist/src/evals/execution-plan.js +11 -1
- package/dist/src/evals/execution-plan.js.map +1 -1
- package/dist/src/evals/harbor-bridge-error.js +8 -0
- package/dist/src/evals/harbor-bridge-error.js.map +1 -1
- package/dist/src/evals/index.js +20 -0
- package/dist/src/evals/index.js.map +1 -1
- package/dist/src/evals/model-capture-plan.js +12 -0
- package/dist/src/evals/model-capture-plan.js.map +1 -1
- package/dist/src/evals/model-capture-runtime.js +25 -0
- package/dist/src/evals/model-capture-runtime.js.map +1 -1
- package/dist/src/evals/physical-work-plan.js +57 -0
- package/dist/src/evals/physical-work-plan.js.map +1 -0
- package/dist/src/evals/preparation-rerun.js +6 -0
- package/dist/src/evals/preparation-rerun.js.map +1 -1
- package/dist/src/evals/recovery.js +8 -1
- package/dist/src/evals/recovery.js.map +1 -1
- package/dist/src/evals/regrade-evidence.js +4 -4
- package/dist/src/evals/regrade-evidence.js.map +1 -1
- package/dist/src/evals/remote-execution-ownership.js +50 -0
- package/dist/src/evals/remote-execution-ownership.js.map +1 -0
- package/dist/src/evals/remote-infrastructure-retry.js +2 -0
- package/dist/src/evals/remote-infrastructure-retry.js.map +1 -1
- package/dist/src/evals/remote-lease-release.js +58 -0
- package/dist/src/evals/remote-lease-release.js.map +1 -0
- package/dist/src/evals/remote-rerun-execution.js +85 -0
- package/dist/src/evals/remote-rerun-execution.js.map +1 -0
- package/dist/src/evals/remote-trial.js +6 -0
- package/dist/src/evals/remote-trial.js.map +1 -0
- package/dist/src/evals/remote-verifier-assessment.js +85 -0
- package/dist/src/evals/remote-verifier-assessment.js.map +1 -0
- package/dist/src/evals/remote-verifier-contract.js +43 -0
- package/dist/src/evals/remote-verifier-contract.js.map +1 -0
- package/dist/src/evals/remote-verifier-execution.js +105 -0
- package/dist/src/evals/remote-verifier-execution.js.map +1 -0
- package/dist/src/evals/remote-verifier-journal.js +21 -0
- package/dist/src/evals/remote-verifier-journal.js.map +1 -0
- package/dist/src/evals/remote-verifier-outcome.js +51 -0
- package/dist/src/evals/remote-verifier-outcome.js.map +1 -0
- package/dist/src/evals/remote-verifier-rerun.js +134 -0
- package/dist/src/evals/remote-verifier-rerun.js.map +1 -0
- package/dist/src/evals/remote-verifier-selection.js +61 -0
- package/dist/src/evals/remote-verifier-selection.js.map +1 -0
- package/dist/src/evals/remote-verifier-source.js +33 -0
- package/dist/src/evals/remote-verifier-source.js.map +1 -0
- package/dist/src/evals/remote-worker-cleanup.js +46 -0
- package/dist/src/evals/remote-worker-cleanup.js.map +1 -0
- package/dist/src/evals/request.js +58 -1
- package/dist/src/evals/request.js.map +1 -1
- package/dist/src/evals/rerun-completion.js +39 -0
- package/dist/src/evals/rerun-completion.js.map +1 -0
- package/dist/src/evals/rerun-resume.js +70 -0
- package/dist/src/evals/rerun-resume.js.map +1 -0
- package/dist/src/evals/rerun-state.js +25 -0
- package/dist/src/evals/rerun-state.js.map +1 -0
- package/dist/src/evals/rerun-types.js.map +1 -1
- package/dist/src/evals/rerun.js +90 -46
- package/dist/src/evals/rerun.js.map +1 -1
- package/dist/src/evals/service.js +59 -5
- package/dist/src/evals/service.js.map +1 -1
- package/dist/src/evals/verifier-artifacts.js +98 -153
- package/dist/src/evals/verifier-artifacts.js.map +1 -1
- package/dist/src/evals/verifier-diagnostic-repair.js +276 -0
- package/dist/src/evals/verifier-diagnostic-repair.js.map +1 -0
- package/dist/src/evals/verifier-only-rerun.js +2 -16
- package/dist/src/evals/verifier-only-rerun.js.map +1 -1
- package/dist/src/evals/verifier-rerun-result.js +24 -0
- package/dist/src/evals/verifier-rerun-result.js.map +1 -0
- package/dist/src/evals/verifier-source-import.js +48 -0
- package/dist/src/evals/verifier-source-import.js.map +1 -0
- package/dist/src/evals/verifier-source.js +139 -0
- package/dist/src/evals/verifier-source.js.map +1 -0
- package/dist/src/foundation/base64.js +19 -0
- package/dist/src/foundation/base64.js.map +1 -0
- package/dist/src/foundation/config.js +10 -0
- package/dist/src/foundation/config.js.map +1 -1
- package/dist/src/foundation/credential-redaction.js +22 -9
- package/dist/src/foundation/credential-redaction.js.map +1 -1
- package/dist/src/foundation/index.js +1 -0
- package/dist/src/foundation/index.js.map +1 -1
- package/dist/src/foundation/process-identity.js +13 -9
- package/dist/src/foundation/process-identity.js.map +1 -1
- package/dist/src/inference/daemon-capacity.js +41 -0
- package/dist/src/inference/daemon-capacity.js.map +1 -0
- package/dist/src/inference/device-reservation.js +58 -0
- package/dist/src/inference/device-reservation.js.map +1 -0
- package/dist/src/inference/doctor.js +95 -0
- package/dist/src/inference/doctor.js.map +1 -0
- package/dist/src/inference/generation-recovery.js +83 -0
- package/dist/src/inference/generation-recovery.js.map +1 -0
- package/dist/src/inference/index.js +24 -0
- package/dist/src/inference/index.js.map +1 -0
- package/dist/src/inference/lock.js +331 -0
- package/dist/src/inference/lock.js.map +1 -0
- package/dist/src/inference/managed-launcher.js +35 -0
- package/dist/src/inference/managed-launcher.js.map +1 -0
- package/dist/src/inference/manifest.js +262 -0
- package/dist/src/inference/manifest.js.map +1 -0
- package/dist/src/inference/materialize.js +66 -0
- package/dist/src/inference/materialize.js.map +1 -0
- package/dist/src/inference/model-location.js +34 -0
- package/dist/src/inference/model-location.js.map +1 -0
- package/dist/src/inference/model-store.js +439 -0
- package/dist/src/inference/model-store.js.map +1 -0
- package/dist/src/inference/node-client.js +167 -0
- package/dist/src/inference/node-client.js.map +1 -0
- package/dist/src/inference/node-registry.js +79 -0
- package/dist/src/inference/node-registry.js.map +1 -0
- package/dist/src/inference/observation.js +79 -0
- package/dist/src/inference/observation.js.map +1 -0
- package/dist/src/inference/preflight.js +132 -0
- package/dist/src/inference/preflight.js.map +1 -0
- package/dist/src/inference/process-sglang.js +169 -0
- package/dist/src/inference/process-sglang.js.map +1 -0
- package/dist/src/inference/protocol-probe.js +29 -0
- package/dist/src/inference/protocol-probe.js.map +1 -0
- package/dist/src/inference/remote-model-store.js +24 -0
- package/dist/src/inference/remote-model-store.js.map +1 -0
- package/dist/src/inference/runtime-catalog.js +41 -0
- package/dist/src/inference/runtime-catalog.js.map +1 -0
- package/dist/src/inference/runtime-store.js +93 -0
- package/dist/src/inference/runtime-store.js.map +1 -0
- package/dist/src/inference/service-attachment.js +46 -0
- package/dist/src/inference/service-attachment.js.map +1 -0
- package/dist/src/inference/service-inspection.js +38 -0
- package/dist/src/inference/service-inspection.js.map +1 -0
- package/dist/src/inference/sglang.js +279 -0
- package/dist/src/inference/sglang.js.map +1 -0
- package/dist/src/inference/supervisor.js +460 -0
- package/dist/src/inference/supervisor.js.map +1 -0
- package/dist/src/model-access/environment.js +28 -0
- package/dist/src/model-access/environment.js.map +1 -0
- package/dist/src/model-access/index.js +4 -0
- package/dist/src/model-access/index.js.map +1 -1
- package/dist/src/model-access/local-gateway-request.js +139 -0
- package/dist/src/model-access/local-gateway-request.js.map +1 -0
- package/dist/src/model-access/local-gateway.js +323 -0
- package/dist/src/model-access/local-gateway.js.map +1 -0
- package/dist/src/model-access/proxy.js +90 -5
- package/dist/src/model-access/proxy.js.map +1 -1
- package/dist/src/model-access/remote-model.js +58 -0
- package/dist/src/model-access/remote-model.js.map +1 -0
- package/dist/src/model-access/training.js +115 -0
- package/dist/src/model-access/training.js.map +1 -0
- package/dist/src/runs/adapter-process.js +2 -2
- package/dist/src/runs/adapter-process.js.map +1 -1
- package/dist/src/runs/executor-types.js +2 -0
- package/dist/src/runs/executor-types.js.map +1 -0
- package/dist/src/runs/executor.js +54 -34
- package/dist/src/runs/executor.js.map +1 -1
- package/dist/src/runs/index.js +4 -2
- package/dist/src/runs/index.js.map +1 -1
- package/dist/src/runs/local-inference-environment.js +59 -0
- package/dist/src/runs/local-inference-environment.js.map +1 -0
- package/dist/src/runs/local-inference-run.js +53 -0
- package/dist/src/runs/local-inference-run.js.map +1 -0
- package/dist/src/runs/outcome.js +22 -0
- package/dist/src/runs/outcome.js.map +1 -1
- package/dist/src/runs/records.js +9 -0
- package/dist/src/runs/records.js.map +1 -1
- package/dist/src/runs/request.js +58 -3
- package/dist/src/runs/request.js.map +1 -1
- package/dist/src/runs/training-evidence.js +22 -0
- package/dist/src/runs/training-evidence.js.map +1 -0
- package/dist/src/runs/training-runtime.js +20 -0
- package/dist/src/runs/training-runtime.js.map +1 -0
- package/dist/src/runs/verifier-diagnostic-storage.js +237 -0
- package/dist/src/runs/verifier-diagnostic-storage.js.map +1 -0
- package/dist/src/runs/verifier-diagnostic-supplement.js +228 -0
- package/dist/src/runs/verifier-diagnostic-supplement.js.map +1 -0
- package/dist/src/runs/verifier-evidence.js +119 -118
- package/dist/src/runs/verifier-evidence.js.map +1 -1
- package/dist/src/trajectories/providers/deepseek.js +52 -38
- package/dist/src/trajectories/providers/deepseek.js.map +1 -1
- package/dist/src/trajectories/store.js +17 -0
- package/dist/src/trajectories/store.js.map +1 -1
- package/dist/src/workers/execution-observation.js +32 -0
- package/dist/src/workers/execution-observation.js.map +1 -0
- package/dist/src/workers/index.js +2 -0
- package/dist/src/workers/index.js.map +1 -1
- package/dist/src/workers/remote-harbor-ownership.js +266 -0
- package/dist/src/workers/remote-harbor-ownership.js.map +1 -0
- package/dist/src/workers/remote-harbor-verifier.js +76 -0
- package/dist/src/workers/remote-harbor-verifier.js.map +1 -0
- package/dist/src/workers/remote-harbor-work-spec.js +66 -10
- package/dist/src/workers/remote-harbor-work-spec.js.map +1 -1
- package/dist/src/workers/remote-harbor-worker.js +56 -49
- package/dist/src/workers/remote-harbor-worker.js.map +1 -1
- package/dist/src/workers/remote-worker-host.js +33 -0
- package/dist/src/workers/remote-worker-host.js.map +1 -0
- package/docs/local-model-inference-spec.zh-CN.md +666 -0
- package/docs/schemas/controller-runtime-observation.schema.json +21 -0
- package/docs/schemas/eval-execution-plan.schema.json +1 -0
- package/docs/schemas/eval-request.schema.json +3 -1
- package/docs/schemas/execution-lease.schema.json +95 -1
- package/docs/schemas/execution-provider-status.schema.json +162 -28
- package/docs/schemas/inference-execution-evidence.schema.json +487 -0
- package/docs/schemas/inference-lock.schema.json +487 -0
- package/docs/schemas/inference-runtime-manifest.schema.json +156 -0
- package/docs/schemas/inference-service-record.schema.json +227 -0
- package/docs/schemas/local-inference-selection.schema.json +98 -0
- package/docs/schemas/local-model-manifest.schema.json +43 -0
- package/docs/schemas/model-node-binding.schema.json +34 -0
- package/docs/schemas/model-node-generation-release.schema.json +46 -0
- package/docs/schemas/ordered-eval-control.schema.json +39 -0
- package/docs/schemas/remote-execution-lease-grant.schema.json +45 -0
- package/docs/schemas/remote-harbor-work-spec.schema.json +325 -0
- package/docs/schemas/remote-model-binding.schema.json +21 -0
- package/docs/schemas/remote-physical-execution.schema.json +108 -0
- package/docs/schemas/remote-result-envelope.schema.json +9 -3
- package/docs/schemas/remote-tree-envelope.schema.json +17 -3
- package/docs/schemas/remote-verifier-result.schema.json +203 -0
- package/docs/schemas/remote-verifier-source.schema.json +52 -0
- package/docs/schemas/remote-verifier-work.schema.json +125 -0
- package/docs/schemas/remote-work-offer.schema.json +170 -34
- package/docs/schemas/remote-worker-execution-admission.schema.json +214 -0
- package/docs/schemas/remote-worker-generation-cleanup.schema.json +199 -0
- package/docs/schemas/remote-worker-registration.schema.json +226 -25
- package/docs/schemas/run-manifest.schema.json +211 -44
- package/docs/schemas/run-request.schema.json +2 -1
- package/docs/schemas/training-external-binding.schema.json +26 -0
- package/docs/schemas/verifier-diagnostic-page.schema.json +97 -0
- package/integrations/harbor/hitch_harbor_agent.py +241 -13
- package/integrations/harbor/hitch_harbor_environment.py +22 -1
- package/integrations/harbor/hitch_host_credentials.py +354 -0
- package/integrations/harbor/hitch_private_exec.py +150 -0
- package/integrations/model-call/cli.js +13 -5
- package/integrations/training-tool/cli.js +72 -0
- package/package.json +8 -2
|
@@ -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"}
|