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
|
@@ -2,7 +2,7 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { sha256JSON } from "./hash.js";
|
|
3
3
|
export async function captureProcessIdentity(pid) {
|
|
4
4
|
const snapshot = await processSnapshot(pid);
|
|
5
|
-
if (!snapshot || terminalState(snapshot.state))
|
|
5
|
+
if (!snapshot || snapshot === "unavailable" || terminalState(snapshot.state))
|
|
6
6
|
return null;
|
|
7
7
|
return {
|
|
8
8
|
pid,
|
|
@@ -13,6 +13,8 @@ export async function captureProcessIdentity(pid) {
|
|
|
13
13
|
export async function inspectProcessIdentity(identity) {
|
|
14
14
|
validateProcessIdentity(identity);
|
|
15
15
|
const snapshot = await processSnapshot(identity.pid);
|
|
16
|
+
if (snapshot === "unavailable")
|
|
17
|
+
return "unavailable";
|
|
16
18
|
if (!snapshot)
|
|
17
19
|
return "terminal";
|
|
18
20
|
const current = sha256JSON({ pid: identity.pid, started: snapshot.started, command: snapshot.command });
|
|
@@ -36,31 +38,33 @@ async function processSnapshot(pid) {
|
|
|
36
38
|
if (!Number.isSafeInteger(pid) || pid < 1)
|
|
37
39
|
throw new TypeError("process pid must be a positive safe integer");
|
|
38
40
|
if (process.platform === "win32")
|
|
39
|
-
return
|
|
41
|
+
return "unavailable";
|
|
40
42
|
const output = await runPs(pid);
|
|
41
|
-
if (output.code === 1 && output.stdout.trim() === "")
|
|
43
|
+
if (output.code === 1 && output.stdout.trim() === "" && output.stderr.trim() === "")
|
|
42
44
|
return null;
|
|
43
45
|
if (output.code !== 0)
|
|
44
|
-
return
|
|
46
|
+
return "unavailable";
|
|
45
47
|
const fields = output.stdout.trim().split(/\s+/);
|
|
46
48
|
if (fields.length < 7)
|
|
47
|
-
return
|
|
49
|
+
return "unavailable";
|
|
48
50
|
const state = fields.at(-1);
|
|
49
51
|
const command = fields.at(-2);
|
|
50
52
|
const started = fields.slice(0, -2).join(" ");
|
|
51
|
-
return started && command && state ? { started, command, state } :
|
|
53
|
+
return started && command && state ? { started, command, state } : "unavailable";
|
|
52
54
|
}
|
|
53
55
|
function runPs(pid) {
|
|
54
56
|
return new Promise((resolve) => {
|
|
55
57
|
const child = spawn("/bin/ps", ["-o", "lstart=", "-o", "comm=", "-o", "stat=", "-p", String(pid)], {
|
|
56
58
|
env: { PATH: "/usr/bin:/bin", LC_ALL: "C" },
|
|
57
|
-
stdio: ["ignore", "pipe", "
|
|
59
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
58
60
|
windowsHide: true,
|
|
59
61
|
});
|
|
60
62
|
let stdout = "";
|
|
63
|
+
let stderr = "";
|
|
61
64
|
child.stdout.on("data", (chunk) => { stdout = `${stdout}${chunk.toString("utf8")}`.slice(-8_192); });
|
|
62
|
-
child.
|
|
63
|
-
child.once("
|
|
65
|
+
child.stderr.on("data", (chunk) => { stderr = `${stderr}${chunk.toString("utf8")}`.slice(-8_192); });
|
|
66
|
+
child.once("error", () => resolve({ code: null, stdout: "", stderr: "process observation failed" }));
|
|
67
|
+
child.once("close", (code) => resolve({ code, stdout, stderr }));
|
|
64
68
|
});
|
|
65
69
|
}
|
|
66
70
|
function terminalState(state) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-identity.js","sourceRoot":"","sources":["../../../src/foundation/process-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAUvC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAAW;IACtD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"process-identity.js","sourceRoot":"","sources":["../../../src/foundation/process-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { statfs } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { runCommand } from "../foundation/index.js";
|
|
4
|
+
/** Supply optional resource dimensions for the automatically started daemon.
|
|
5
|
+
* Explicit user limits, including zero, always take precedence. */
|
|
6
|
+
export async function localInferenceDaemonEnvironment(root, env = process.env, options = {}) {
|
|
7
|
+
const result = { ...env };
|
|
8
|
+
if (result.HITCH_CAPACITY_EPHEMERAL_DISK_MIB === undefined) {
|
|
9
|
+
const bytes = await (options.freeDiskBytes ?? availableDiskBytes)(root);
|
|
10
|
+
result.HITCH_CAPACITY_EPHEMERAL_DISK_MIB = String(Math.floor(bytes / 1024 ** 2));
|
|
11
|
+
}
|
|
12
|
+
if (result.HITCH_CAPACITY_GPUS === undefined) {
|
|
13
|
+
try {
|
|
14
|
+
const invoke = options.run ?? ((executable, args) => runCommand(executable, args, {
|
|
15
|
+
env, timeoutMs: 5_000, failureCode: "gpu_detection_failed",
|
|
16
|
+
}));
|
|
17
|
+
const observed = await invoke(env.HITCH_NVIDIA_SMI_PATH || "nvidia-smi", ["-L"]);
|
|
18
|
+
const count = observed.stdout.split(/\r?\n/).filter((line) => /^GPU \d+:/.test(line)).length;
|
|
19
|
+
if (count > 0)
|
|
20
|
+
result.HITCH_CAPACITY_GPUS = String(count);
|
|
21
|
+
}
|
|
22
|
+
catch { /* CPU-only daemon capacity remains valid. */ }
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
async function availableDiskBytes(directory) {
|
|
27
|
+
let current = path.resolve(directory);
|
|
28
|
+
for (;;) {
|
|
29
|
+
try {
|
|
30
|
+
const info = await statfs(current, { bigint: true });
|
|
31
|
+
return Number(info.bavail * info.bsize);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const parent = path.dirname(current);
|
|
35
|
+
if (error.code !== "ENOENT" || parent === current)
|
|
36
|
+
throw error;
|
|
37
|
+
current = parent;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=daemon-capacity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-capacity.js","sourceRoot":"","sources":["../../../src/inference/daemon-capacity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD;mEACmE;AACnE,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,IAAY,EAAE,MAAyB,OAAO,CAAC,GAAG,EAAE,UAGtG,EAAE;IACJ,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IAC1B,IAAI,MAAM,CAAC,iCAAiC,KAAK,SAAS,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,CAAC,iCAAiC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,MAAM,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,UAAkB,EAAE,IAAc,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE;gBAClG,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB;aAC3D,CAAC,CAAC,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,IAAI,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACjF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7F,IAAI,KAAK,GAAG,CAAC;gBAAE,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC,CAAC,6CAA6C,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACjD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACtC,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO;gBAAE,MAAM,KAAK,CAAC;YAC1F,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { mkdir, readdir, rm } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { HitchError, atomicWriteJSON, hitchRootId, readJSON, sha256JSON, withFileLock } from "../foundation/index.js";
|
|
5
|
+
export const defaultDeviceReservationDirectory = () => path.join(homedir(), ".cache", "agent-hitch", "inference-devices");
|
|
6
|
+
export async function reservedInferenceDevices(directory = defaultDeviceReservationDirectory()) {
|
|
7
|
+
let files;
|
|
8
|
+
try {
|
|
9
|
+
files = await readdir(directory);
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (error.code === "ENOENT")
|
|
13
|
+
return [];
|
|
14
|
+
throw error;
|
|
15
|
+
}
|
|
16
|
+
const devices = [];
|
|
17
|
+
for (const name of files.filter((name) => /^[a-f0-9]{64}\.json$/.test(name))) {
|
|
18
|
+
const record = await readJSON(path.join(directory, name), null);
|
|
19
|
+
if (record?.gpu_uuid)
|
|
20
|
+
devices.push(record.gpu_uuid);
|
|
21
|
+
}
|
|
22
|
+
return devices;
|
|
23
|
+
}
|
|
24
|
+
/** Survives daemon death. Only confirmed container cleanup releases a reservation;
|
|
25
|
+
* a dead PID alone is never evidence that a GPU is free. Shared across Hitch roots. */
|
|
26
|
+
export async function reserveInferenceDevice(directory, root, serviceId, gpuUuid) {
|
|
27
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
28
|
+
const key = sha256JSON(gpuUuid).slice(7);
|
|
29
|
+
await withFileLock(directory, key, async () => {
|
|
30
|
+
const file = path.join(directory, `${key}.json`);
|
|
31
|
+
const existing = await readJSON(file, null);
|
|
32
|
+
if (existing)
|
|
33
|
+
throw new HitchError(`GPU ${gpuUuid} is reserved by another inference service; stop or recover its owning Hitch daemon first`, {
|
|
34
|
+
code: "inference_device_in_use", exitCode: 12,
|
|
35
|
+
});
|
|
36
|
+
await atomicWriteJSON(file, { root_id: hitchRootId(root), service_id: serviceId, gpu_uuid: gpuUuid });
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export async function releaseInferenceDevice(directory, root, serviceId) {
|
|
40
|
+
let files;
|
|
41
|
+
try {
|
|
42
|
+
files = await readdir(directory);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error.code === "ENOENT")
|
|
46
|
+
return;
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
for (const name of files.filter((name) => /^[a-f0-9]{64}\.json$/.test(name))) {
|
|
50
|
+
await withFileLock(directory, name.slice(0, -5), async () => {
|
|
51
|
+
const file = path.join(directory, name);
|
|
52
|
+
const record = await readJSON(file, null);
|
|
53
|
+
if (record?.root_id === hitchRootId(root) && record.service_id === serviceId)
|
|
54
|
+
await rm(file);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=device-reservation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-reservation.js","sourceRoot":"","sources":["../../../src/inference/device-reservation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { HitchError, runCommand } from "../foundation/index.js";
|
|
3
|
+
/** Static eligibility only. Loading, CUDA visibility and the protocol are verified by prepare. */
|
|
4
|
+
export async function doctorLocalInference(backend, options = {}) {
|
|
5
|
+
const platform = options.platform ?? process.platform;
|
|
6
|
+
const architecture = options.architecture ?? process.arch;
|
|
7
|
+
const env = options.env ?? process.env;
|
|
8
|
+
const invoke = options.run ?? ((executable, args) => runCommand(executable, args, {
|
|
9
|
+
env, timeoutMs: 10_000, failureCode: "inference_runtime_unavailable", failureExitCode: 3,
|
|
10
|
+
}));
|
|
11
|
+
const checks = {};
|
|
12
|
+
checks.platform = platform === "linux" && architecture === "x64"
|
|
13
|
+
? pass("linux/amd64") : fail(`P0 requires linux/amd64; detected ${platform}/${architecture}`);
|
|
14
|
+
if (backend === "metal") {
|
|
15
|
+
checks.catalog = fail("Metal/MLX is a P1 backend and has no P0 runtime catalog entry");
|
|
16
|
+
return result(backend, checks);
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const docker = options.dockerExecutable || env.HITCH_DOCKER_PATH || "docker";
|
|
20
|
+
const server = await invoke(docker, ["info", "--format", "{{json .}}"]);
|
|
21
|
+
const info = JSON.parse(server.stdout);
|
|
22
|
+
checks.docker = info.OSType === "linux" && ["x86_64", "amd64"].includes(String(info.Architecture))
|
|
23
|
+
? pass(`Docker ${String(info.ServerVersion)}`) : fail("Docker Engine must run linux/amd64");
|
|
24
|
+
const context = await invoke(docker, ["context", "inspect", "--format", "{{json .Endpoints.docker.Host}}"]);
|
|
25
|
+
const endpoint = env.DOCKER_CONTEXT ? JSON.parse(context.stdout) : env.DOCKER_HOST || JSON.parse(context.stdout);
|
|
26
|
+
checks.docker_endpoint = typeof endpoint === "string" && endpoint.startsWith("unix:///")
|
|
27
|
+
? pass("local Unix socket") : fail("managed inference requires a local Docker Unix socket");
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
checks.docker = fail(`Docker is unavailable: ${error.message}`);
|
|
31
|
+
}
|
|
32
|
+
if (backend === "cpu") {
|
|
33
|
+
let info = "";
|
|
34
|
+
try {
|
|
35
|
+
info = await (options.readCpuInfo ?? (() => readFile("/proc/cpuinfo", "utf8")))();
|
|
36
|
+
}
|
|
37
|
+
catch { }
|
|
38
|
+
const flags = new Set(info.toLowerCase().split(/[^a-z0-9_]+/));
|
|
39
|
+
const missing = ["amx_tile", "amx_int8", "amx_bf16"].filter((flag) => !flags.has(flag));
|
|
40
|
+
checks.amx = missing.length ? fail(`missing CPU flags: ${missing.join(", ")}`) : pass("AMX tile/int8/bf16");
|
|
41
|
+
return result(backend, checks);
|
|
42
|
+
}
|
|
43
|
+
let gpu;
|
|
44
|
+
try {
|
|
45
|
+
const observed = await invoke(options.nvidiaSmiExecutable || env.HITCH_NVIDIA_SMI_PATH || "nvidia-smi", [
|
|
46
|
+
"--query-gpu=uuid,name,memory.total,memory.free,driver_version,compute_cap", "--format=csv,noheader,nounits",
|
|
47
|
+
]);
|
|
48
|
+
const candidates = observed.stdout.trim().split(/\r?\n/).map(parseGpu);
|
|
49
|
+
// The pinned image uses CUDA 13.0. Require the native driver floor; do not
|
|
50
|
+
// assume forward-compat packages work on an arbitrary device/driver pair.
|
|
51
|
+
const eligible = candidates.filter((entry) => Number(entry.driver_version.split(".")[0]) >= 580
|
|
52
|
+
&& [8.0, 8.6, 8.9, 9.0, 10.0, 10.3, 12.0].includes(Number(entry.compute_capability))
|
|
53
|
+
&& entry.free_memory_mib >= (options.requiredMemoryMiB ?? 0)
|
|
54
|
+
&& !options.excludedDeviceUuids?.includes(entry.uuid)
|
|
55
|
+
&& (!options.deviceConstraint || entry.uuid === options.deviceConstraint));
|
|
56
|
+
gpu = eligible[0];
|
|
57
|
+
checks.cuda = gpu ? pass(`${gpu.name} (${gpu.uuid}), ${gpu.free_memory_mib} MiB free, driver ${gpu.driver_version}`)
|
|
58
|
+
: fail(`no eligible CUDA 13 GPU: require driver >=580, supported SM, ${options.requiredMemoryMiB ?? 0} MiB free${options.deviceConstraint ? ` on ${options.deviceConstraint}` : ""}`);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
checks.cuda = fail(`NVIDIA CUDA device is unavailable: ${error.message}`);
|
|
62
|
+
}
|
|
63
|
+
return { ...result(backend, checks), ...(gpu ? { gpu } : {}) };
|
|
64
|
+
}
|
|
65
|
+
export async function resolveLocalInferenceDevice(requested, options = {}) {
|
|
66
|
+
for (const backend of requested === "auto" ? ["cuda", "cpu"] : [requested]) {
|
|
67
|
+
const doctor = await doctorLocalInference(backend, options);
|
|
68
|
+
if (doctor.ready)
|
|
69
|
+
return { backend, doctor };
|
|
70
|
+
if (requested !== "auto")
|
|
71
|
+
throw unavailable(doctor);
|
|
72
|
+
}
|
|
73
|
+
throw new HitchError("no eligible local inference device is available; run hitch local doctor for diagnostics", {
|
|
74
|
+
code: "inference_device_unsupported", exitCode: 3,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function parseGpu(line) {
|
|
78
|
+
const [uuid, name, total, free, driver, sm] = line.split(",").map((part) => part.trim());
|
|
79
|
+
if (!uuid?.startsWith("GPU-") || !name || !driver || !sm || !Number.isFinite(Number(sm))
|
|
80
|
+
|| !Number.isFinite(Number(total)) || Number(total) <= 0 || !Number.isFinite(Number(free)) || Number(free) < 0) {
|
|
81
|
+
throw new TypeError("nvidia-smi returned an invalid GPU record");
|
|
82
|
+
}
|
|
83
|
+
return { uuid, name, memory_mib: Number(total), free_memory_mib: Number(free), driver_version: driver, compute_capability: sm };
|
|
84
|
+
}
|
|
85
|
+
function result(backend, checks) {
|
|
86
|
+
return { schema_version: "1", backend, ready: Object.values(checks).every((check) => check.status === "pass"), checks };
|
|
87
|
+
}
|
|
88
|
+
function pass(message) { return { status: "pass", message }; }
|
|
89
|
+
function fail(message) { return { status: "fail", message }; }
|
|
90
|
+
function unavailable(doctor) {
|
|
91
|
+
return new HitchError(`${doctor.backend} local inference is unavailable: ${Object.values(doctor.checks).filter((c) => c.status === "fail").map((c) => c.message).join("; ")}`, {
|
|
92
|
+
code: "inference_device_unsupported", exitCode: 3,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/inference/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { HitchError, atomicWriteJSON, hitchRootId, readJSON, sha256JSON, statePaths, withFileLock } from "../foundation/index.js";
|
|
3
|
+
import { parseInferenceServiceHandle, parseInferenceServiceRecord, parseModelNodeBinding } from "./manifest.js";
|
|
4
|
+
import { loadModelNodeClient, observeModelNode } from "./node-registry.js";
|
|
5
|
+
const SHA = /^sha256:[a-f0-9]{64}$/;
|
|
6
|
+
const directory = (root, id) => path.join(statePaths(root).inferenceServices, id);
|
|
7
|
+
function serviceDigest(record) {
|
|
8
|
+
// A delayed startup projection may fill in an initially unknown handle.
|
|
9
|
+
// The sealed node receipt owns that handle and validates every later projection.
|
|
10
|
+
return sha256JSON({ service_id: record.service_id, inference_id: record.inference_id, model_node: record.model_node,
|
|
11
|
+
epoch: record.epoch, isolation_key: record.isolation_key, owner_id: record.owner_id });
|
|
12
|
+
}
|
|
13
|
+
export function validateInferenceGenerationRelease(root, record, current, value) {
|
|
14
|
+
const source = record.model_node;
|
|
15
|
+
const r = value;
|
|
16
|
+
const keys = ["schemaVersion", "kind", "serviceId", "ownerId", "inferenceId", "previousNode", "node", "sourceIdentityDigest", "handle",
|
|
17
|
+
"admissionOnly", "state", "resourcesReleased", "gpuSeconds", "devices", "previousBootDigest", "currentBootDigest"];
|
|
18
|
+
if (!source || source.node_id !== current.node_id || source.generation === current.generation || record.container_id
|
|
19
|
+
|| !r || Object.keys(r).sort().join(",") !== keys.sort().join(",") || r.schemaVersion !== 2 || r.kind !== "inference-generation-release"
|
|
20
|
+
|| r.serviceId !== record.service_id || r.ownerId !== hitchRootId(root) || r.inferenceId !== record.inference_id
|
|
21
|
+
|| sha256JSON(r.previousNode) !== sha256JSON({ nodeId: source.node_id, generation: source.generation })
|
|
22
|
+
|| sha256JSON(r.node) !== sha256JSON({ nodeId: current.node_id, generation: current.generation })
|
|
23
|
+
|| ![r.sourceIdentityDigest, r.previousBootDigest, r.currentBootDigest].every(v => typeof v === "string" && SHA.test(v))
|
|
24
|
+
|| r.previousBootDigest === r.currentBootDigest || r.state !== "stopped" || r.resourcesReleased !== true
|
|
25
|
+
|| typeof r.admissionOnly !== "boolean" || typeof r.gpuSeconds !== "number" || !Number.isFinite(r.gpuSeconds) || r.gpuSeconds < 0
|
|
26
|
+
|| !Array.isArray(r.devices) || r.devices.some(v => typeof v !== "string" || !/^GPU-[a-fA-F0-9-]+$/.test(v)) || new Set(r.devices).size !== r.devices.length
|
|
27
|
+
|| r.admissionOnly && (r.handle !== null || r.gpuSeconds !== 0 || r.devices.length !== 0))
|
|
28
|
+
throw ambiguous();
|
|
29
|
+
if (r.handle !== null) {
|
|
30
|
+
const handle = parseInferenceServiceHandle(r.handle);
|
|
31
|
+
if (handle.kind !== "process" || handle.node_id !== source.node_id || handle.generation !== source.generation
|
|
32
|
+
|| handle.service_id !== record.service_id)
|
|
33
|
+
throw ambiguous();
|
|
34
|
+
}
|
|
35
|
+
if (record.service_handle && sha256JSON(record.service_handle) !== sha256JSON(r.handle))
|
|
36
|
+
throw ambiguous();
|
|
37
|
+
return structuredClone(r);
|
|
38
|
+
}
|
|
39
|
+
/** A confirmed release remains valid if the original node generation is no longer reachable. */
|
|
40
|
+
export async function readInferenceGenerationRelease(root, record) {
|
|
41
|
+
const value = await readJSON(path.join(directory(root, record.service_id), "generation-release.json"), null);
|
|
42
|
+
if (!value)
|
|
43
|
+
return null;
|
|
44
|
+
if (Object.keys(value).sort().join(",") !== "model_node,receipt,receipt_digest,schema_version,service_digest"
|
|
45
|
+
|| value.schema_version !== "2" || value.service_digest !== serviceDigest(record) || value.receipt_digest !== sha256JSON(value.receipt))
|
|
46
|
+
throw ambiguous();
|
|
47
|
+
const node = parseModelNodeBinding(value.model_node);
|
|
48
|
+
validateInferenceGenerationRelease(root, record, node, value.receipt);
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
/** Explicitly drain an old generation. No service or experiment is rebound to the new generation. */
|
|
52
|
+
export async function reconcileModelNodeService(root, serviceId, binding) {
|
|
53
|
+
if (!/^inference_[a-f0-9]{32}$/.test(serviceId))
|
|
54
|
+
throw ambiguous();
|
|
55
|
+
const current = parseModelNodeBinding(binding);
|
|
56
|
+
return withFileLock(statePaths(root).inferenceOperationLocks, sha256JSON({ kind: "generation-recovery", serviceId }), async () => {
|
|
57
|
+
const stateFile = path.join(directory(root, serviceId), "state.json");
|
|
58
|
+
const record = parseInferenceServiceRecord(await readJSON(stateFile));
|
|
59
|
+
if (record.service_id !== serviceId || !record.model_node || record.model_node.node_id !== current.node_id
|
|
60
|
+
|| record.model_node.generation === current.generation)
|
|
61
|
+
throw ambiguous();
|
|
62
|
+
let stored = await readInferenceGenerationRelease(root, record);
|
|
63
|
+
if (!stored) {
|
|
64
|
+
const client = await loadModelNodeClient(root, current);
|
|
65
|
+
await observeModelNode(client, current);
|
|
66
|
+
const receipt = validateInferenceGenerationRelease(root, record, current, await client.call("inference.recover", {
|
|
67
|
+
serviceId, ownerId: hitchRootId(root), inferenceId: record.inference_id,
|
|
68
|
+
previousNode: { nodeId: record.model_node.node_id, generation: record.model_node.generation }, expectedHandle: record.service_handle ?? null,
|
|
69
|
+
}));
|
|
70
|
+
stored = { schema_version: "2", service_digest: serviceDigest(record), model_node: current, receipt_digest: sha256JSON(receipt), receipt };
|
|
71
|
+
await atomicWriteJSON(path.join(directory(root, serviceId), "generation-release.json"), stored);
|
|
72
|
+
}
|
|
73
|
+
const latest = parseInferenceServiceRecord(await readJSON(stateFile));
|
|
74
|
+
if (serviceDigest(latest) !== serviceDigest(record))
|
|
75
|
+
throw ambiguous();
|
|
76
|
+
validateInferenceGenerationRelease(root, latest, stored.model_node, stored.receipt);
|
|
77
|
+
await atomicWriteJSON(stateFile, { ...latest, state: "stopped", lease_owner_ids: [], updated_at: new Date().toISOString() });
|
|
78
|
+
return { schema_version: "2", service_id: serviceId, inference_id: record.inference_id, model_node: record.model_node,
|
|
79
|
+
state: "stopped", resources_released: true, gpu_seconds: stored.receipt.gpuSeconds, generation_release: stored };
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function ambiguous() { return new HitchError("prior model-node generation has no matching confirmed service release", { code: "inference_recovery_ambiguous", exitCode: 12 }); }
|
|
83
|
+
//# sourceMappingURL=generation-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-recovery.js","sourceRoot":"","sources":["../../../src/inference/generation-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAClI,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAY3E,MAAM,GAAG,GAAG,uBAAuB,CAAC;AACpC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAClG,SAAS,aAAa,CAAC,MAAgC;IACrD,wEAAwE;IACxE,iFAAiF;IACjF,OAAO,UAAU,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU;QACjH,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,IAAY,EAAE,MAAgC,EAAE,OAA2B,EAAE,KAAc;IAC5I,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;IACjC,MAAM,CAAC,GAAG,KAA4C,CAAC;IACvD,MAAM,IAAI,GAAG,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,sBAAsB,EAAE,QAAQ;QACpI,eAAe,EAAE,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IACrH,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,YAAY;WAC/G,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,8BAA8B;WACrI,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,YAAY;WAC7G,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;WACpG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;WAC9F,CAAC,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;WACrH,CAAC,CAAC,kBAAkB,KAAK,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,iBAAiB,KAAK,IAAI;WACrG,OAAO,CAAC,CAAC,aAAa,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC;WAC9H,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM;WACzJ,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;QAAE,MAAM,SAAS,EAAE,CAAC;IAC/G,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,2BAA2B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU;eACxG,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU;YAAE,MAAM,SAAS,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,IAAI,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,MAAM,SAAS,EAAE,CAAC;IAC3G,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,IAAY,EAAE,MAAgC;IACjG,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAuB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,yBAAyB,CAAC,EAAE,IAAI,CAAC,CAAC;IACnI,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,iEAAiE;WACxG,KAAK,CAAC,cAAc,KAAK,GAAG,IAAI,KAAK,CAAC,cAAc,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,KAAK,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,MAAM,SAAS,EAAE,CAAC;IAC7J,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACrD,kCAAkC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACtE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAY,EAAE,SAAiB,EAAE,OAA2B;IAC1G,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,MAAM,SAAS,EAAE,CAAC;IACnE,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,uBAAuB,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE;QAC/H,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;eACrG,MAAM,CAAC,UAAU,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU;YAAE,MAAM,SAAS,EAAE,CAAC;QAC5E,IAAI,MAAM,GAAG,MAAM,8BAA8B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,kCAAkC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC/G,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,YAAY;gBACvE,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;aAC7I,CAAC,CAAC,CAAC;YACJ,MAAM,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;YAC3I,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,yBAAyB,CAAC,EAAE,MAAM,CAAC,CAAC;QAClG,CAAC;QACD,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACtE,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC;YAAE,MAAM,SAAS,EAAE,CAAC;QACvE,kCAAkC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACpF,MAAM,eAAe,CAAC,SAAS,EAAE,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC7H,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU;YACnH,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IACrH,CAAC,CAAC,CAAC;AACL,CAAC;AACD,SAAS,SAAS,KAAiB,OAAO,IAAI,UAAU,CAAC,uEAAuE,EAAE,EAAE,IAAI,EAAE,8BAA8B,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export { inferenceLockIdentity, inferenceRuntimeIdentity, localModelIdentity, parseInferenceRuntimeManifest, parseInferenceServiceRecord, parseInferenceServiceHandle, parseLocalModelManifest } from "./manifest.js";
|
|
2
|
+
export { addLocalModel, gcLocalModels, resolveLocalModel, verifyLocalModel } from "./model-store.js";
|
|
3
|
+
export { listRuntimeCatalog, runtimeCatalogEntry } from "./runtime-catalog.js";
|
|
4
|
+
export { validateRuntimeObservation, validateProcessRuntimeObservation } from "./observation.js";
|
|
5
|
+
export { doctorLocalInference, resolveLocalInferenceDevice } from "./doctor.js";
|
|
6
|
+
export { localInferenceDaemonEnvironment } from "./daemon-capacity.js";
|
|
7
|
+
export { loadInferenceRuntime, prepareInferenceRuntime } from "./runtime-store.js";
|
|
8
|
+
export { buildInferenceLock, loadInferenceLock, persistInferenceLock, validateInferenceLockShape } from "./lock.js";
|
|
9
|
+
export { prepareLocalInference } from "./preflight.js";
|
|
10
|
+
export { materializeLocalModel } from "./materialize.js";
|
|
11
|
+
export { DockerSGLangLauncher } from "./sglang.js";
|
|
12
|
+
export { ProcessSGLangLauncher } from "./process-sglang.js";
|
|
13
|
+
export { ManagedSGLangLauncher } from "./managed-launcher.js";
|
|
14
|
+
export { parseModelNodeBinding } from "./manifest.js";
|
|
15
|
+
export { parseModelNodeRegistration, registerModelNode, loadModelNodeClient, observeModelNode, runtimeFromModelNode } from "./node-registry.js";
|
|
16
|
+
export { PythonInferenceNodeClient } from "./node-client.js";
|
|
17
|
+
export { SGLangServiceSupervisor } from "./supervisor.js";
|
|
18
|
+
export { readModelNodeRegistration, readModelNodeBinding } from "./node-registry.js";
|
|
19
|
+
export { inspectModelNodeService } from "./service-inspection.js";
|
|
20
|
+
export { readServiceRecords } from "./supervisor.js";
|
|
21
|
+
export { reconcileModelNodeService } from "./generation-recovery.js";
|
|
22
|
+
export { addModelFromNode, verifyModelOnNode } from "./remote-model-store.js";
|
|
23
|
+
export { parseModelSnapshotRef } from "./model-location.js";
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/inference/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACtN,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAErG,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAEpH,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEhJ,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAG7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
|