agent-hitch 0.2.5 → 0.2.7
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 +14 -1
- package/dist/scripts/canary-buildkit-secrets.js +166 -0
- package/dist/scripts/canary-buildkit-secrets.js.map +1 -0
- package/dist/scripts/canary-collision-domains.js +77 -0
- package/dist/scripts/canary-collision-domains.js.map +1 -0
- package/dist/scripts/canary-docker-image-observation.js +181 -0
- package/dist/scripts/canary-docker-image-observation.js.map +1 -0
- package/dist/scripts/canary-gpu-hardware.js +95 -0
- package/dist/scripts/canary-gpu-hardware.js.map +1 -0
- package/dist/scripts/canary-harbor-load.js +365 -0
- package/dist/scripts/canary-harbor-load.js.map +1 -0
- package/dist/scripts/canary-packaged-harness.js +75 -0
- package/dist/scripts/canary-packaged-harness.js.map +1 -0
- package/dist/scripts/canary-resource-load.js +188 -0
- package/dist/scripts/canary-resource-load.js.map +1 -0
- package/dist/scripts/check-architecture.js +8 -4
- package/dist/scripts/check-architecture.js.map +1 -1
- package/dist/scripts/docker-reaper-crash-child.js +21 -0
- package/dist/scripts/docker-reaper-crash-child.js.map +1 -0
- package/dist/src/adapters/catalog.js +1 -0
- package/dist/src/adapters/catalog.js.map +1 -1
- package/dist/src/adapters/discovery.js +1 -1
- package/dist/src/adapters/discovery.js.map +1 -1
- package/dist/src/adapters/providers/claude.js +6 -0
- package/dist/src/adapters/providers/claude.js.map +1 -1
- package/dist/src/adapters/providers/codex.js +6 -0
- package/dist/src/adapters/providers/codex.js.map +1 -1
- package/dist/src/adapters/providers/deepseek.js +6 -0
- package/dist/src/adapters/providers/deepseek.js.map +1 -1
- package/dist/src/adapters/providers/opencode.js +6 -0
- package/dist/src/adapters/providers/opencode.js.map +1 -1
- package/dist/src/adapters/providers/pi.js +6 -0
- package/dist/src/adapters/providers/pi.js.map +1 -1
- package/dist/src/artifacts/index.js +1 -0
- package/dist/src/artifacts/index.js.map +1 -1
- package/dist/src/backends/harbor/backend.js +55 -104
- package/dist/src/backends/harbor/backend.js.map +1 -1
- package/dist/src/backends/harbor/environment-config.js +92 -0
- package/dist/src/backends/harbor/environment-config.js.map +1 -0
- package/dist/src/backends/harbor/index.js +5 -1
- package/dist/src/backends/harbor/index.js.map +1 -1
- package/dist/src/backends/harbor/model-proxy-config.js +23 -0
- package/dist/src/backends/harbor/model-proxy-config.js.map +1 -0
- package/dist/src/backends/harbor/process.js +177 -0
- package/dist/src/backends/harbor/process.js.map +1 -0
- package/dist/src/backends/harbor/runtime-toolchain.js +30 -0
- package/dist/src/backends/harbor/runtime-toolchain.js.map +1 -0
- package/dist/src/backends/harbor/supervisor.js +74 -0
- package/dist/src/backends/harbor/supervisor.js.map +1 -0
- package/dist/src/backends/harbor/task-resources.js +206 -0
- package/dist/src/backends/harbor/task-resources.js.map +1 -0
- package/dist/src/backends/harbor/tools.js +6 -29
- package/dist/src/backends/harbor/tools.js.map +1 -1
- package/dist/src/backends/harbor/verifier-config.js +11 -0
- package/dist/src/backends/harbor/verifier-config.js.map +1 -0
- package/dist/src/backends/index.js +4 -1
- package/dist/src/backends/index.js.map +1 -1
- package/dist/src/cli/arguments.js +14 -0
- package/dist/src/cli/arguments.js.map +1 -1
- package/dist/src/cli/commands/daemon.js +135 -8
- package/dist/src/cli/commands/daemon.js.map +1 -1
- package/dist/src/cli/commands/eval.js +214 -4
- package/dist/src/cli/commands/eval.js.map +1 -1
- package/dist/src/cli/commands/images.js +40 -0
- package/dist/src/cli/commands/images.js.map +1 -0
- package/dist/src/cli/commands/run.js +6 -3
- package/dist/src/cli/commands/run.js.map +1 -1
- package/dist/src/cli/commands/runs.js +25 -3
- package/dist/src/cli/commands/runs.js.map +1 -1
- package/dist/src/cli/commands/worker.js +79 -0
- package/dist/src/cli/commands/worker.js.map +1 -0
- package/dist/src/cli/main.js +4 -0
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/cli/output.js +72 -3
- package/dist/src/cli/output.js.map +1 -1
- package/dist/src/control-plane/build-admission.js +69 -0
- package/dist/src/control-plane/build-admission.js.map +1 -0
- package/dist/src/control-plane/build-records.js +6 -0
- package/dist/src/control-plane/build-records.js.map +1 -0
- package/dist/src/control-plane/collisions.js +40 -0
- package/dist/src/control-plane/collisions.js.map +1 -0
- package/dist/src/control-plane/eval-control-state.js +22 -0
- package/dist/src/control-plane/eval-control-state.js.map +1 -0
- package/dist/src/control-plane/eval-control-work.js +39 -0
- package/dist/src/control-plane/eval-control-work.js.map +1 -0
- package/dist/src/control-plane/eval-image-resolution.js +52 -0
- package/dist/src/control-plane/eval-image-resolution.js.map +1 -0
- package/dist/src/control-plane/eval-image-services.js +30 -0
- package/dist/src/control-plane/eval-image-services.js.map +1 -0
- package/dist/src/control-plane/eval-records.js +252 -0
- package/dist/src/control-plane/eval-records.js.map +1 -0
- package/dist/src/control-plane/eval-recovery.js +181 -0
- package/dist/src/control-plane/eval-recovery.js.map +1 -0
- package/dist/src/control-plane/eval-scheduler.js +447 -0
- package/dist/src/control-plane/eval-scheduler.js.map +1 -0
- package/dist/src/control-plane/index.js +20 -0
- package/dist/src/control-plane/index.js.map +1 -0
- package/dist/src/control-plane/local-worker.js +49 -0
- package/dist/src/control-plane/local-worker.js.map +1 -0
- package/dist/src/control-plane/model-capture-planning.js +12 -0
- package/dist/src/control-plane/model-capture-planning.js.map +1 -0
- package/dist/src/control-plane/remote-result-transport.js +172 -0
- package/dist/src/control-plane/remote-result-transport.js.map +1 -0
- package/dist/src/control-plane/remote-work-coordinator.js +332 -0
- package/dist/src/control-plane/remote-work-coordinator.js.map +1 -0
- package/dist/src/control-plane/remote-work-inputs.js +266 -0
- package/dist/src/control-plane/remote-work-inputs.js.map +1 -0
- package/dist/src/control-plane/remote-work-recovery.js +181 -0
- package/dist/src/control-plane/remote-work-recovery.js.map +1 -0
- package/dist/src/control-plane/remote-worker-artifacts.js +135 -0
- package/dist/src/control-plane/remote-worker-artifacts.js.map +1 -0
- package/dist/src/control-plane/remote-worker-client.js +202 -0
- package/dist/src/control-plane/remote-worker-client.js.map +1 -0
- package/dist/src/control-plane/remote-worker-configuration.js +34 -0
- package/dist/src/control-plane/remote-worker-configuration.js.map +1 -0
- package/dist/src/control-plane/remote-worker-credentials.js +58 -0
- package/dist/src/control-plane/remote-worker-credentials.js.map +1 -0
- package/dist/src/control-plane/remote-worker-protocol.js +510 -0
- package/dist/src/control-plane/remote-worker-protocol.js.map +1 -0
- package/dist/src/control-plane/remote-worker-runner.js +214 -0
- package/dist/src/control-plane/remote-worker-runner.js.map +1 -0
- package/dist/src/control-plane/remote-workers.js +377 -0
- package/dist/src/control-plane/remote-workers.js.map +1 -0
- package/dist/src/control-plane/rerun-scheduler.js +411 -0
- package/dist/src/control-plane/rerun-scheduler.js.map +1 -0
- package/dist/src/control-plane/rerun-submission.js +56 -0
- package/dist/src/control-plane/rerun-submission.js.map +1 -0
- package/dist/src/control-plane/resources.js +182 -0
- package/dist/src/control-plane/resources.js.map +1 -0
- package/dist/src/control-plane/scheduler-eval-entry.js +32 -0
- package/dist/src/control-plane/scheduler-eval-entry.js.map +1 -0
- package/dist/src/control-plane/synthetic-result.js +21 -0
- package/dist/src/control-plane/synthetic-result.js.map +1 -0
- package/dist/src/control-plane/work-admission.js +21 -0
- package/dist/src/control-plane/work-admission.js.map +1 -0
- package/dist/src/control-plane/work-dispatcher.js +229 -0
- package/dist/src/control-plane/work-dispatcher.js.map +1 -0
- package/dist/src/controller-runtime/hash.js +12 -1
- package/dist/src/controller-runtime/hash.js.map +1 -1
- package/dist/src/controller-runtime/index.js +1 -1
- package/dist/src/controller-runtime/index.js.map +1 -1
- package/dist/src/controller-runtime/store.js +15 -6
- package/dist/src/controller-runtime/store.js.map +1 -1
- package/dist/src/daemon/client.js.map +1 -1
- package/dist/src/daemon/event-stream.js +46 -0
- package/dist/src/daemon/event-stream.js.map +1 -0
- package/dist/src/daemon/health.js +66 -0
- package/dist/src/daemon/health.js.map +1 -0
- package/dist/src/daemon/launcher.js +28 -1
- package/dist/src/daemon/launcher.js.map +1 -1
- package/dist/src/daemon/logging.js +23 -0
- package/dist/src/daemon/logging.js.map +1 -0
- package/dist/src/daemon/scheduler.js +26 -5
- package/dist/src/daemon/scheduler.js.map +1 -1
- package/dist/src/daemon/server.js +255 -98
- package/dist/src/daemon/server.js.map +1 -1
- package/dist/src/daemon/telemetry.js +163 -0
- package/dist/src/daemon/telemetry.js.map +1 -0
- package/dist/src/daemon/worker-routes.js +219 -0
- package/dist/src/daemon/worker-routes.js.map +1 -0
- package/dist/src/domain/bundles.js +2 -0
- package/dist/src/domain/bundles.js.map +1 -0
- package/dist/src/domain/control-plane.js +2 -0
- package/dist/src/domain/control-plane.js.map +1 -0
- package/dist/src/domain/execution-evidence.js +2 -0
- package/dist/src/domain/execution-evidence.js.map +1 -0
- package/dist/src/domain/execution-plan.js +2 -0
- package/dist/src/domain/execution-plan.js.map +1 -0
- package/dist/src/domain/images.js +2 -0
- package/dist/src/domain/images.js.map +1 -0
- package/dist/src/domain/index.js +9 -0
- package/dist/src/domain/index.js.map +1 -1
- package/dist/src/domain/interactions.js +2 -0
- package/dist/src/domain/interactions.js.map +1 -0
- package/dist/src/domain/providers.js +2 -0
- package/dist/src/domain/providers.js.map +1 -0
- package/dist/src/domain/resources.js +2 -0
- package/dist/src/domain/resources.js.map +1 -0
- package/dist/src/domain/workers.js +2 -0
- package/dist/src/domain/workers.js.map +1 -0
- package/dist/src/evals/collect-only-rerun.js +182 -0
- package/dist/src/evals/collect-only-rerun.js.map +1 -0
- package/dist/src/evals/directory.js +30 -0
- package/dist/src/evals/directory.js.map +1 -0
- package/dist/src/evals/docker-engine-stats.js +89 -0
- package/dist/src/evals/docker-engine-stats.js.map +1 -0
- package/dist/src/evals/docker-ownership.js +51 -0
- package/dist/src/evals/docker-ownership.js.map +1 -0
- package/dist/src/evals/docker-reaper.js +144 -0
- package/dist/src/evals/docker-reaper.js.map +1 -0
- package/dist/src/evals/docker-resource-observer.js +207 -0
- package/dist/src/evals/docker-resource-observer.js.map +1 -0
- package/dist/src/evals/environment-image-planning.js +164 -0
- package/dist/src/evals/environment-image-planning.js.map +1 -0
- package/dist/src/evals/eval-artifact-planning.js +56 -0
- package/dist/src/evals/eval-artifact-planning.js.map +1 -0
- package/dist/src/evals/eval-finalization.js +10 -0
- package/dist/src/evals/eval-finalization.js.map +1 -0
- package/dist/src/evals/eval-lifecycle-events.js +16 -0
- package/dist/src/evals/eval-lifecycle-events.js.map +1 -0
- package/dist/src/evals/events.js +53 -5
- package/dist/src/evals/events.js.map +1 -1
- package/dist/src/evals/execution-evidence.js +116 -0
- package/dist/src/evals/execution-evidence.js.map +1 -0
- package/dist/src/evals/execution-leases.js +342 -0
- package/dist/src/evals/execution-leases.js.map +1 -0
- package/dist/src/evals/execution-plan-artifacts.js +72 -0
- package/dist/src/evals/execution-plan-artifacts.js.map +1 -0
- package/dist/src/evals/execution-plan-images.js +69 -0
- package/dist/src/evals/execution-plan-images.js.map +1 -0
- package/dist/src/evals/execution-plan-resources.js +174 -0
- package/dist/src/evals/execution-plan-resources.js.map +1 -0
- package/dist/src/evals/execution-plan.js +415 -0
- package/dist/src/evals/execution-plan.js.map +1 -0
- package/dist/src/evals/harbor-artifact-builder-image.js +99 -0
- package/dist/src/evals/harbor-artifact-builder-image.js.map +1 -0
- package/dist/src/evals/harbor-artifact-builder.js +354 -0
- package/dist/src/evals/harbor-artifact-builder.js.map +1 -0
- package/dist/src/evals/harbor-bridge-error.js +39 -3
- package/dist/src/evals/harbor-bridge-error.js.map +1 -1
- package/dist/src/evals/harbor-phase-timings.js +60 -0
- package/dist/src/evals/harbor-phase-timings.js.map +1 -0
- package/dist/src/evals/index.js +26 -3
- package/dist/src/evals/index.js.map +1 -1
- package/dist/src/evals/infrastructure-retry.js +218 -0
- package/dist/src/evals/infrastructure-retry.js.map +1 -0
- package/dist/src/evals/interaction-capture-import.js +49 -0
- package/dist/src/evals/interaction-capture-import.js.map +1 -0
- package/dist/src/evals/local-docker-provider.js +372 -0
- package/dist/src/evals/local-docker-provider.js.map +1 -0
- package/dist/src/evals/local-eval-planning.js +80 -0
- package/dist/src/evals/local-eval-planning.js.map +1 -0
- package/dist/src/evals/model-capture-plan.js +22 -0
- package/dist/src/evals/model-capture-plan.js.map +1 -0
- package/dist/src/evals/model-capture-runtime.js +114 -0
- package/dist/src/evals/model-capture-runtime.js.map +1 -0
- package/dist/src/evals/model-proxy-runtime-state.js +53 -0
- package/dist/src/evals/model-proxy-runtime-state.js.map +1 -0
- package/dist/src/evals/planned-execution-support.js +54 -0
- package/dist/src/evals/planned-execution-support.js.map +1 -0
- package/dist/src/evals/planned-execution.js +461 -0
- package/dist/src/evals/planned-execution.js.map +1 -0
- package/dist/src/evals/planned-remote-execution.js +40 -0
- package/dist/src/evals/planned-remote-execution.js.map +1 -0
- package/dist/src/evals/planned-retry-lifecycle.js +186 -0
- package/dist/src/evals/planned-retry-lifecycle.js.map +1 -0
- package/dist/src/evals/prepared-harness.js +76 -0
- package/dist/src/evals/prepared-harness.js.map +1 -0
- package/dist/src/evals/progress.js +4 -4
- package/dist/src/evals/progress.js.map +1 -1
- package/dist/src/evals/records.js +20 -3
- package/dist/src/evals/records.js.map +1 -1
- package/dist/src/evals/recovery.js +192 -0
- package/dist/src/evals/recovery.js.map +1 -0
- package/dist/src/evals/remote-infrastructure-retry.js +99 -0
- package/dist/src/evals/remote-infrastructure-retry.js.map +1 -0
- package/dist/src/evals/request.js +14 -1
- package/dist/src/evals/request.js.map +1 -1
- package/dist/src/evals/rerun-inputs.js +89 -0
- package/dist/src/evals/rerun-inputs.js.map +1 -0
- package/dist/src/evals/rerun-slots.js +12 -3
- package/dist/src/evals/rerun-slots.js.map +1 -1
- package/dist/src/evals/rerun-types.js +49 -0
- package/dist/src/evals/rerun-types.js.map +1 -0
- package/dist/src/evals/rerun.js +113 -75
- package/dist/src/evals/rerun.js.map +1 -1
- package/dist/src/evals/result-helpers.js +65 -0
- package/dist/src/evals/result-helpers.js.map +1 -0
- package/dist/src/evals/resume-state.js +36 -0
- package/dist/src/evals/resume-state.js.map +1 -0
- package/dist/src/evals/service-types.js +2 -0
- package/dist/src/evals/service-types.js.map +1 -0
- package/dist/src/evals/service.js +327 -237
- package/dist/src/evals/service.js.map +1 -1
- package/dist/src/evals/task-resources.js +209 -0
- package/dist/src/evals/task-resources.js.map +1 -0
- package/dist/src/evals/trial-environment-evidence.js +87 -0
- package/dist/src/evals/trial-environment-evidence.js.map +1 -0
- package/dist/src/evals/trial-execution-evidence.js +13 -0
- package/dist/src/evals/trial-execution-evidence.js.map +1 -0
- package/dist/src/evals/trial-import-identity.js +31 -0
- package/dist/src/evals/trial-import-identity.js.map +1 -0
- package/dist/src/evals/trial-import.js +166 -168
- package/dist/src/evals/trial-import.js.map +1 -1
- package/dist/src/evals/trial-publication-recovery.js +104 -0
- package/dist/src/evals/trial-publication-recovery.js.map +1 -0
- package/dist/src/evals/trial-publication.js +25 -0
- package/dist/src/evals/trial-publication.js.map +1 -0
- package/dist/src/evals/verifier-diagnostics.js +235 -0
- package/dist/src/evals/verifier-diagnostics.js.map +1 -0
- package/dist/src/evals/work-item-artifacts.js +23 -0
- package/dist/src/evals/work-item-artifacts.js.map +1 -0
- package/dist/src/foundation/config.js +17 -0
- package/dist/src/foundation/config.js.map +1 -1
- package/dist/src/foundation/credential-redaction.js +137 -0
- package/dist/src/foundation/credential-redaction.js.map +1 -0
- package/dist/src/foundation/environment-image-references.js +59 -0
- package/dist/src/foundation/environment-image-references.js.map +1 -0
- package/dist/src/foundation/executable.js +45 -5
- package/dist/src/foundation/executable.js.map +1 -1
- package/dist/src/foundation/index.js +5 -2
- package/dist/src/foundation/index.js.map +1 -1
- package/dist/src/foundation/process-identity.js +69 -0
- package/dist/src/foundation/process-identity.js.map +1 -0
- package/dist/src/images/context.js +47 -0
- package/dist/src/images/context.js.map +1 -0
- package/dist/src/images/docker-buildkit.js +137 -0
- package/dist/src/images/docker-buildkit.js.map +1 -0
- package/dist/src/images/dockerfile.js +67 -0
- package/dist/src/images/dockerfile.js.map +1 -0
- package/dist/src/images/gc.js +261 -0
- package/dist/src/images/gc.js.map +1 -0
- package/dist/src/images/index.js +10 -0
- package/dist/src/images/index.js.map +1 -0
- package/dist/src/images/manifest.js +109 -0
- package/dist/src/images/manifest.js.map +1 -0
- package/dist/src/images/ownership.js +5 -0
- package/dist/src/images/ownership.js.map +1 -0
- package/dist/src/images/records.js +32 -0
- package/dist/src/images/records.js.map +1 -0
- package/dist/src/images/registry.js +154 -0
- package/dist/src/images/registry.js.map +1 -0
- package/dist/src/images/service.js +224 -0
- package/dist/src/images/service.js.map +1 -0
- package/dist/src/model-access/capture.js +255 -0
- package/dist/src/model-access/capture.js.map +1 -0
- package/dist/src/model-access/index.js +5 -0
- package/dist/src/model-access/index.js.map +1 -0
- package/dist/src/model-access/policy.js +49 -0
- package/dist/src/model-access/policy.js.map +1 -0
- package/dist/src/model-access/proxy.js +336 -0
- package/dist/src/model-access/proxy.js.map +1 -0
- package/dist/src/model-access/records.js +167 -0
- package/dist/src/model-access/records.js.map +1 -0
- package/dist/src/runs/bundle.js +450 -0
- package/dist/src/runs/bundle.js.map +1 -0
- package/dist/src/runs/events.js +12 -1
- package/dist/src/runs/events.js.map +1 -1
- package/dist/src/runs/executor.js +24 -17
- package/dist/src/runs/executor.js.map +1 -1
- package/dist/src/runs/index.js +3 -1
- package/dist/src/runs/index.js.map +1 -1
- package/dist/src/runs/manifest.js +5 -5
- package/dist/src/runs/manifest.js.map +1 -1
- package/dist/src/runs/request.js +6 -1
- package/dist/src/runs/request.js.map +1 -1
- package/dist/src/runs/training-candidate.js +161 -0
- package/dist/src/runs/training-candidate.js.map +1 -0
- package/dist/src/trajectories/provider-capture.js +15 -24
- package/dist/src/trajectories/provider-capture.js.map +1 -1
- package/dist/src/trajectories/providers/deepseek.js +3 -3
- package/dist/src/trajectories/providers/deepseek.js.map +1 -1
- package/dist/src/workers/index.js +3 -0
- package/dist/src/workers/index.js.map +1 -0
- package/dist/src/workers/remote-harbor-work-spec.js +97 -0
- package/dist/src/workers/remote-harbor-work-spec.js.map +1 -0
- package/dist/src/workers/remote-harbor-worker.js +220 -0
- package/dist/src/workers/remote-harbor-worker.js.map +1 -0
- package/docs/schemas/environment-build-index.schema.json +13 -0
- package/docs/schemas/environment-build-record.schema.json +25 -0
- package/docs/schemas/environment-image-manifest.schema.json +62 -0
- package/docs/schemas/eval-control.schema.json +36 -0
- package/docs/schemas/eval-execution-plan.schema.json +216 -0
- package/docs/schemas/eval-request.schema.json +2 -0
- package/docs/schemas/eval-rerun-result.schema.json +53 -0
- package/docs/schemas/eval-rerun-state.schema.json +61 -0
- package/docs/schemas/eval-rerun-submission.schema.json +58 -0
- package/docs/schemas/eval-result.schema.json +34 -1
- package/docs/schemas/eval-submission-input.schema.json +14 -0
- package/docs/schemas/eval-submission.schema.json +68 -0
- package/docs/schemas/eval-trial-publication.schema.json +39 -0
- package/docs/schemas/execution-evidence.schema.json +96 -0
- package/docs/schemas/execution-lease.schema.json +50 -0
- package/docs/schemas/execution-provider-status.schema.json +65 -0
- package/docs/schemas/execution-worker.schema.json +53 -0
- package/docs/schemas/harbor-process-exit.schema.json +14 -0
- package/docs/schemas/interaction-capture-ref.schema.json +45 -0
- package/docs/schemas/local-provider-execution.schema.json +33 -0
- package/docs/schemas/model-interaction.schema.json +41 -0
- package/docs/schemas/remote-result-envelope.schema.json +32 -0
- package/docs/schemas/remote-tree-envelope.schema.json +25 -0
- package/docs/schemas/remote-work-offer.schema.json +58 -0
- package/docs/schemas/remote-work-receipt.schema.json +50 -0
- package/docs/schemas/remote-worker-artifact.schema.json +17 -0
- package/docs/schemas/remote-worker-event.schema.json +18 -0
- package/docs/schemas/remote-worker-heartbeat.schema.json +37 -0
- package/docs/schemas/remote-worker-registration.schema.json +52 -0
- package/docs/schemas/result-bundle-index.schema.json +133 -0
- package/docs/schemas/run-environment-images.schema.json +39 -0
- package/docs/schemas/training-data-candidate.schema.json +46 -0
- package/integrations/harbor/hitch_harbor_agent.py +300 -547
- package/integrations/harbor/hitch_harbor_environment.py +331 -0
- package/integrations/harbor/hitch_harbor_task_resources.py +275 -0
- package/integrations/harbor/hitch_harbor_verifier.py +337 -0
- package/package.json +16 -2
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"""Harbor verifier wrapper with conservative, verifier-only infra retries.
|
|
2
|
+
|
|
3
|
+
The wrapper retries the task's test script in the same live environment. It
|
|
4
|
+
never re-instantiates or calls the candidate agent, so the candidate workspace
|
|
5
|
+
and all other container state remain unchanged between verifier attempts.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import json
|
|
12
|
+
import re
|
|
13
|
+
import shutil
|
|
14
|
+
import time
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
from datetime import datetime, timezone
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
20
|
+
from harbor.models.trial.paths import EnvironmentPaths
|
|
21
|
+
from harbor.models.verifier.result import VerifierResult
|
|
22
|
+
from harbor.verifier.verifier import Verifier
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
MAX_LOG_BYTES = 256 * 1024
|
|
26
|
+
LOG_NAMES = ("test-stdout.txt", "test-stderr.txt", "stdout.txt", "stderr.txt")
|
|
27
|
+
OUTPUT_NAMES = (*LOG_NAMES, "reward.txt", "reward.json", "ctrf.json")
|
|
28
|
+
CONTROL_NAMES = ("infrastructure-error.json", "infrastructure-retry-history.json")
|
|
29
|
+
|
|
30
|
+
INFRASTRUCTURE_PATTERNS: tuple[tuple[str, tuple[re.Pattern[str], ...]], ...] = (
|
|
31
|
+
(
|
|
32
|
+
"dns_resolution_failed",
|
|
33
|
+
(
|
|
34
|
+
re.compile(r"curl:\s*\(\d+\)\s*Could not resolve host:", re.I),
|
|
35
|
+
re.compile(r"Temporary failure in name resolution", re.I),
|
|
36
|
+
re.compile(r"Name or service not known", re.I),
|
|
37
|
+
re.compile(r"getaddrinfo\s+(?:EAI_AGAIN|ENOTFOUND)", re.I),
|
|
38
|
+
re.compile(r"Could not resolve hostname", re.I),
|
|
39
|
+
),
|
|
40
|
+
),
|
|
41
|
+
(
|
|
42
|
+
"network_unreachable",
|
|
43
|
+
(
|
|
44
|
+
re.compile(r"Network is unreachable", re.I),
|
|
45
|
+
re.compile(
|
|
46
|
+
r"Failed to establish a new connection:[^\n]*(?:timed out|connection refused)",
|
|
47
|
+
re.I,
|
|
48
|
+
),
|
|
49
|
+
re.compile(r"Could not connect to (?:host|server)", re.I),
|
|
50
|
+
),
|
|
51
|
+
),
|
|
52
|
+
(
|
|
53
|
+
"package_install_failed",
|
|
54
|
+
(
|
|
55
|
+
re.compile(r"Could not find a version that satisfies the requirement", re.I),
|
|
56
|
+
re.compile(r"No matching distribution found for", re.I),
|
|
57
|
+
re.compile(r"Failed to (?:download|fetch) [^\n]*(?:package|wheel|index)", re.I),
|
|
58
|
+
re.compile(r"error:\s*failed to (?:download|fetch|install)", re.I),
|
|
59
|
+
),
|
|
60
|
+
),
|
|
61
|
+
(
|
|
62
|
+
"test_runner_missing",
|
|
63
|
+
(
|
|
64
|
+
re.compile(r"(?:^|\n)[^\n]*(?:uvx|pytest|pipx|tox|nox): command not found(?:\n|$)", re.I),
|
|
65
|
+
re.compile(r"No module named ['\"]?(?:pytest|unittest|tox|nox)['\"]?", re.I),
|
|
66
|
+
),
|
|
67
|
+
),
|
|
68
|
+
(
|
|
69
|
+
"verifier_environment_missing",
|
|
70
|
+
(
|
|
71
|
+
re.compile(r"/(?:root|home/[^/]+)/\.local/bin/env: No such file or directory", re.I),
|
|
72
|
+
re.compile(
|
|
73
|
+
r"(?:^|\n)[^\n]*/bin/(?:python|python3|pytest|uv|uvx): No such file or directory(?:\n|$)",
|
|
74
|
+
re.I,
|
|
75
|
+
),
|
|
76
|
+
),
|
|
77
|
+
),
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
TEST_EXECUTION_EVIDENCE = (
|
|
81
|
+
re.compile(r"test session starts", re.I),
|
|
82
|
+
re.compile(r"collected\s+\d+\s+items?", re.I),
|
|
83
|
+
re.compile(r"(?:^|\n)Ran\s+\d+\s+tests?", re.I),
|
|
84
|
+
re.compile(r"(?:^|\n)TAP version\s+\d+", re.I),
|
|
85
|
+
re.compile(r"={3,}[^\n]*(?:passed|failed|errors?|skipped)[^\n]*={3,}", re.I),
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class VerifierInfrastructureError(RuntimeError):
|
|
90
|
+
"""Raised after every verifier-only infrastructure retry is exhausted."""
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@dataclass(frozen=True)
|
|
94
|
+
class InfrastructureObservation:
|
|
95
|
+
signals: tuple[str, ...]
|
|
96
|
+
source_files: tuple[str, ...]
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class HitchRetryingVerifier(Verifier):
|
|
100
|
+
"""Retry only masked verifier bootstrap failures in the live trial."""
|
|
101
|
+
|
|
102
|
+
def __init__(
|
|
103
|
+
self,
|
|
104
|
+
*args: Any,
|
|
105
|
+
infrastructure_retries: int = 1,
|
|
106
|
+
infrastructure_retry_backoff_ms: int = 1_000,
|
|
107
|
+
**kwargs: Any,
|
|
108
|
+
) -> None:
|
|
109
|
+
if isinstance(infrastructure_retries, bool) or not isinstance(infrastructure_retries, int) or infrastructure_retries < 0:
|
|
110
|
+
raise ValueError("infrastructure_retries must be a non-negative integer")
|
|
111
|
+
if (
|
|
112
|
+
isinstance(infrastructure_retry_backoff_ms, bool)
|
|
113
|
+
or not isinstance(infrastructure_retry_backoff_ms, int)
|
|
114
|
+
or infrastructure_retry_backoff_ms < 0
|
|
115
|
+
):
|
|
116
|
+
raise ValueError("infrastructure_retry_backoff_ms must be a non-negative integer")
|
|
117
|
+
super().__init__(*args, **kwargs)
|
|
118
|
+
self.infrastructure_retries = infrastructure_retries
|
|
119
|
+
self.infrastructure_retry_backoff_ms = infrastructure_retry_backoff_ms
|
|
120
|
+
|
|
121
|
+
async def verify(self) -> VerifierResult:
|
|
122
|
+
started_ns = time.monotonic_ns()
|
|
123
|
+
try:
|
|
124
|
+
return await self._verify_with_retries()
|
|
125
|
+
finally:
|
|
126
|
+
self._write_phase_timing(started_ns)
|
|
127
|
+
|
|
128
|
+
async def _verify_with_retries(self) -> VerifierResult:
|
|
129
|
+
# Do not trust a control file left by the candidate or a prior phase.
|
|
130
|
+
await self._remove_files(CONTROL_NAMES)
|
|
131
|
+
attempts: list[dict[str, Any]] = []
|
|
132
|
+
for attempt in range(1, self.infrastructure_retries + 2):
|
|
133
|
+
result: VerifierResult | None = None
|
|
134
|
+
caught: Exception | None = None
|
|
135
|
+
try:
|
|
136
|
+
result = await super().verify()
|
|
137
|
+
except Exception as error:
|
|
138
|
+
caught = error
|
|
139
|
+
|
|
140
|
+
reward = _primary_reward(result)
|
|
141
|
+
observation = _detect_infrastructure(
|
|
142
|
+
self.trial_paths.verifier_dir,
|
|
143
|
+
reward,
|
|
144
|
+
allow_missing_reward=caught is not None,
|
|
145
|
+
)
|
|
146
|
+
if observation is None:
|
|
147
|
+
# The control namespace belongs to this wrapper. Remove files
|
|
148
|
+
# a task script may have created before returning/propagating.
|
|
149
|
+
await self._remove_files(CONTROL_NAMES)
|
|
150
|
+
if caught is not None:
|
|
151
|
+
raise caught
|
|
152
|
+
if attempts:
|
|
153
|
+
self._write_history("recovered", attempts)
|
|
154
|
+
assert result is not None
|
|
155
|
+
return result
|
|
156
|
+
|
|
157
|
+
attempts.append(
|
|
158
|
+
{
|
|
159
|
+
"attempt": attempt,
|
|
160
|
+
"signals": list(observation.signals),
|
|
161
|
+
"source_files": list(observation.source_files),
|
|
162
|
+
}
|
|
163
|
+
)
|
|
164
|
+
self._archive_attempt(attempt)
|
|
165
|
+
if attempt > self.infrastructure_retries:
|
|
166
|
+
diagnostic = {
|
|
167
|
+
"schema_version": "1",
|
|
168
|
+
"code": "verifier_infrastructure_failure",
|
|
169
|
+
"signals": list(observation.signals),
|
|
170
|
+
"source_files": list(observation.source_files),
|
|
171
|
+
"attempts": attempts,
|
|
172
|
+
"max_retries": self.infrastructure_retries,
|
|
173
|
+
"backoff_ms": self.infrastructure_retry_backoff_ms,
|
|
174
|
+
}
|
|
175
|
+
self._write_json("infrastructure-error.json", diagnostic)
|
|
176
|
+
self._write_history("exhausted", attempts)
|
|
177
|
+
signal_list = ", ".join(observation.signals)
|
|
178
|
+
raise VerifierInfrastructureError(
|
|
179
|
+
"verifier infrastructure retries exhausted "
|
|
180
|
+
f"after {attempt} attempt(s): {signal_list}"
|
|
181
|
+
) from caught
|
|
182
|
+
|
|
183
|
+
self._write_history("retrying", attempts)
|
|
184
|
+
await self._clear_outputs()
|
|
185
|
+
backoff_seconds = (self.infrastructure_retry_backoff_ms * attempt) / 1_000
|
|
186
|
+
if backoff_seconds > 0:
|
|
187
|
+
await asyncio.sleep(backoff_seconds)
|
|
188
|
+
|
|
189
|
+
raise AssertionError("unreachable verifier retry state")
|
|
190
|
+
|
|
191
|
+
def _write_phase_timing(self, started_ns: int) -> None:
|
|
192
|
+
self._write_json(
|
|
193
|
+
"hitch-phase-timings.json",
|
|
194
|
+
{
|
|
195
|
+
"schema_version": "1",
|
|
196
|
+
"phases": {
|
|
197
|
+
"verifier": {
|
|
198
|
+
"duration_ms": max(0, (time.monotonic_ns() - started_ns) // 1_000_000),
|
|
199
|
+
"completed_at": datetime.now(timezone.utc).isoformat(),
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
async def _clear_outputs(self) -> None:
|
|
206
|
+
await self._remove_files(OUTPUT_NAMES)
|
|
207
|
+
|
|
208
|
+
async def _remove_files(self, names: tuple[str, ...]) -> None:
|
|
209
|
+
for name in names:
|
|
210
|
+
(self.trial_paths.verifier_dir / name).unlink(missing_ok=True)
|
|
211
|
+
env_paths = EnvironmentPaths.for_os(self.environment.os)
|
|
212
|
+
if self.environment.os.value == "windows":
|
|
213
|
+
targets = ",".join(
|
|
214
|
+
f"'{str(env_paths.verifier_dir / name)}'"
|
|
215
|
+
for name in names
|
|
216
|
+
)
|
|
217
|
+
command = (
|
|
218
|
+
"powershell -NoProfile -NonInteractive -Command "
|
|
219
|
+
f'"Remove-Item -Force -ErrorAction SilentlyContinue {targets}"'
|
|
220
|
+
)
|
|
221
|
+
else:
|
|
222
|
+
targets = " ".join(
|
|
223
|
+
_shell_quote(str(env_paths.verifier_dir / name))
|
|
224
|
+
for name in names
|
|
225
|
+
)
|
|
226
|
+
command = f"rm -f -- {targets}"
|
|
227
|
+
cleared = await self.environment.exec(
|
|
228
|
+
command=command,
|
|
229
|
+
user=None if self.environment.os.value == "windows" else "root",
|
|
230
|
+
)
|
|
231
|
+
if cleared.return_code != 0:
|
|
232
|
+
raise VerifierInfrastructureError(
|
|
233
|
+
"could not clear verifier control/output files: "
|
|
234
|
+
f"exit {cleared.return_code}"
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
def _archive_attempt(self, attempt: int) -> None:
|
|
238
|
+
archive = self.trial_paths.verifier_dir / "infrastructure-attempts" / f"attempt-{attempt:04d}"
|
|
239
|
+
archive.mkdir(parents=True, exist_ok=True)
|
|
240
|
+
for name in OUTPUT_NAMES:
|
|
241
|
+
source = self.trial_paths.verifier_dir / name
|
|
242
|
+
if source.is_file():
|
|
243
|
+
shutil.copy2(source, archive / name)
|
|
244
|
+
|
|
245
|
+
def _write_history(self, status: str, attempts: list[dict[str, Any]]) -> None:
|
|
246
|
+
self._write_json(
|
|
247
|
+
"infrastructure-retry-history.json",
|
|
248
|
+
{
|
|
249
|
+
"schema_version": "1",
|
|
250
|
+
"code": "verifier_infrastructure_retry_history",
|
|
251
|
+
"status": status,
|
|
252
|
+
"max_retries": self.infrastructure_retries,
|
|
253
|
+
"backoff_ms": self.infrastructure_retry_backoff_ms,
|
|
254
|
+
"attempts": attempts,
|
|
255
|
+
"candidate_rerun": False,
|
|
256
|
+
},
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
def _write_json(self, name: str, value: dict[str, Any]) -> None:
|
|
260
|
+
target = self.trial_paths.verifier_dir / name
|
|
261
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
262
|
+
target.write_text(json.dumps(value, indent=2, sort_keys=True) + "\n", encoding="utf-8")
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def _primary_reward(result: VerifierResult | None) -> float | int | None:
|
|
266
|
+
if result is None:
|
|
267
|
+
return None
|
|
268
|
+
preferred = result.rewards.get("reward")
|
|
269
|
+
if isinstance(preferred, (int, float)) and not isinstance(preferred, bool):
|
|
270
|
+
return preferred
|
|
271
|
+
return next(
|
|
272
|
+
(
|
|
273
|
+
value
|
|
274
|
+
for value in result.rewards.values()
|
|
275
|
+
if isinstance(value, (int, float)) and not isinstance(value, bool)
|
|
276
|
+
),
|
|
277
|
+
None,
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def _detect_infrastructure(
|
|
282
|
+
verifier_dir: Path,
|
|
283
|
+
reward: float | int | None,
|
|
284
|
+
*,
|
|
285
|
+
allow_missing_reward: bool,
|
|
286
|
+
) -> InfrastructureObservation | None:
|
|
287
|
+
if reward != 0 and not (allow_missing_reward and reward is None):
|
|
288
|
+
return None
|
|
289
|
+
ctrf = verifier_dir / "ctrf.json"
|
|
290
|
+
if ctrf.is_file() and ctrf.stat().st_size > 0:
|
|
291
|
+
return None
|
|
292
|
+
|
|
293
|
+
logs: list[str] = []
|
|
294
|
+
source_files: list[str] = []
|
|
295
|
+
for name in LOG_NAMES:
|
|
296
|
+
source = verifier_dir / name
|
|
297
|
+
value = _read_bounded(source)
|
|
298
|
+
if value is None:
|
|
299
|
+
continue
|
|
300
|
+
logs.append(value)
|
|
301
|
+
source_files.append(f"verifier/{name}")
|
|
302
|
+
if not logs:
|
|
303
|
+
return None
|
|
304
|
+
combined = "\n".join(logs)
|
|
305
|
+
if any(pattern.search(combined) for pattern in TEST_EXECUTION_EVIDENCE):
|
|
306
|
+
return None
|
|
307
|
+
signals = tuple(
|
|
308
|
+
signal
|
|
309
|
+
for signal, patterns in INFRASTRUCTURE_PATTERNS
|
|
310
|
+
if any(pattern.search(combined) for pattern in patterns)
|
|
311
|
+
)
|
|
312
|
+
if not signals:
|
|
313
|
+
return None
|
|
314
|
+
return InfrastructureObservation(signals=signals, source_files=tuple(source_files))
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def _read_bounded(source: Path) -> str | None:
|
|
318
|
+
try:
|
|
319
|
+
size = source.stat().st_size
|
|
320
|
+
except FileNotFoundError:
|
|
321
|
+
return None
|
|
322
|
+
with source.open("rb") as handle:
|
|
323
|
+
if size <= MAX_LOG_BYTES:
|
|
324
|
+
return handle.read().decode("utf-8", errors="replace")
|
|
325
|
+
half = MAX_LOG_BYTES // 2
|
|
326
|
+
head = handle.read(half)
|
|
327
|
+
handle.seek(max(0, size - (MAX_LOG_BYTES - half)))
|
|
328
|
+
tail = handle.read(MAX_LOG_BYTES - half)
|
|
329
|
+
return (
|
|
330
|
+
head.decode("utf-8", errors="replace")
|
|
331
|
+
+ "\n[... verifier log truncated ...]\n"
|
|
332
|
+
+ tail.decode("utf-8", errors="replace")
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def _shell_quote(value: str) -> str:
|
|
337
|
+
return "'" + value.replace("'", "'\"'\"'") + "'"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-hitch",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "Content-addressed version control and evidence storage for agent harnesses",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-agents",
|
|
@@ -23,10 +23,14 @@
|
|
|
23
23
|
"./artifacts": "./dist/src/artifacts/index.js",
|
|
24
24
|
"./backends": "./dist/src/backends/index.js",
|
|
25
25
|
"./controller-runtime": "./dist/src/controller-runtime/index.js",
|
|
26
|
+
"./control-plane": "./dist/src/control-plane/index.js",
|
|
27
|
+
"./workers": "./dist/src/workers/index.js",
|
|
26
28
|
"./daemon": "./dist/src/daemon/index.js",
|
|
27
29
|
"./domain": "./dist/src/domain/index.js",
|
|
28
30
|
"./evals": "./dist/src/evals/index.js",
|
|
29
31
|
"./feedback": "./dist/src/feedback/index.js",
|
|
32
|
+
"./images": "./dist/src/images/index.js",
|
|
33
|
+
"./model-access": "./dist/src/model-access/index.js",
|
|
30
34
|
"./foundation": "./dist/src/foundation/index.js",
|
|
31
35
|
"./revisions": "./dist/src/revisions/index.js",
|
|
32
36
|
"./runs": "./dist/src/runs/index.js",
|
|
@@ -43,13 +47,23 @@
|
|
|
43
47
|
"dist/src/",
|
|
44
48
|
"dist/scripts/",
|
|
45
49
|
"docs/schemas/",
|
|
46
|
-
"integrations/harbor/hitch_harbor_agent.py"
|
|
50
|
+
"integrations/harbor/hitch_harbor_agent.py",
|
|
51
|
+
"integrations/harbor/hitch_harbor_environment.py",
|
|
52
|
+
"integrations/harbor/hitch_harbor_task_resources.py",
|
|
53
|
+
"integrations/harbor/hitch_harbor_verifier.py"
|
|
47
54
|
],
|
|
48
55
|
"scripts": {
|
|
49
56
|
"typecheck": "tsc --noEmit",
|
|
50
57
|
"build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.json",
|
|
51
58
|
"test": "node --test \"dist/test/*.test.js\"",
|
|
52
59
|
"coverage": "node --experimental-test-coverage --test-coverage-include=dist/src/**/*.js --test-coverage-lines=75 --test-coverage-branches=65 --test-coverage-functions=70 --test \"dist/test/*.test.js\"",
|
|
60
|
+
"canary:buildkit-secrets": "npm run build && node dist/scripts/canary-buildkit-secrets.js",
|
|
61
|
+
"canary:docker-images": "npm run build && node dist/scripts/canary-docker-image-observation.js",
|
|
62
|
+
"canary:resource-load": "npm run build && node dist/scripts/canary-resource-load.js",
|
|
63
|
+
"canary:harbor-load": "npm run build && node dist/scripts/canary-harbor-load.js",
|
|
64
|
+
"canary:packaged-harness": "npm run build && node dist/scripts/canary-packaged-harness.js",
|
|
65
|
+
"canary:collision-domains": "npm run build && node dist/scripts/canary-collision-domains.js",
|
|
66
|
+
"canary:gpu-hardware": "npm run build && node dist/scripts/canary-gpu-hardware.js",
|
|
53
67
|
"check:architecture": "node dist/scripts/check-architecture.js",
|
|
54
68
|
"check": "npm run typecheck && npm run build && npm run check:architecture && node dist/scripts/check-syntax.js && node --test \"dist/test/*.test.js\"",
|
|
55
69
|
"prepublishOnly": "npm run check"
|