@jinn-network/client 0.1.6 → 0.1.7-canary.17a8ecb8
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/CHANGELOG.md +33 -0
- package/README.md +67 -1
- package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +23 -4
- package/deployments/deployment-jinn-mvi-l1-sepolia.json +23 -4
- package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +5 -4
- package/dist/adapters/mech/adapter.d.ts +38 -1
- package/dist/adapters/mech/adapter.js +268 -57
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +17 -4
- package/dist/adapters/mech/contracts.js +8 -2
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/safe-revert.d.ts +20 -0
- package/dist/adapters/mech/safe-revert.js +12 -4
- package/dist/adapters/mech/safe-revert.js.map +1 -1
- package/dist/adapters/mech/safe.d.ts +6 -2
- package/dist/adapters/mech/safe.js +32 -11
- package/dist/adapters/mech/safe.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +6 -1
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/adapters/mech/verdict-code.d.ts +1 -0
- package/dist/adapters/mech/verdict-code.js +18 -0
- package/dist/adapters/mech/verdict-code.js.map +1 -1
- package/dist/api/activity-events-endpoint.d.ts +14 -0
- package/dist/api/activity-events-endpoint.js +59 -0
- package/dist/api/activity-events-endpoint.js.map +1 -0
- package/dist/api/admin-endpoint.d.ts +15 -3
- package/dist/api/admin-endpoint.js +24 -2
- package/dist/api/admin-endpoint.js.map +1 -1
- package/dist/api/bootstrap-endpoint.d.ts +1 -2
- package/dist/api/bootstrap-endpoint.js +49 -1
- package/dist/api/bootstrap-endpoint.js.map +1 -1
- package/dist/api/codex-doctor-endpoint.d.ts +73 -0
- package/dist/api/codex-doctor-endpoint.js +177 -0
- package/dist/api/codex-doctor-endpoint.js.map +1 -0
- package/dist/api/discovery-endpoint.d.ts +1 -0
- package/dist/api/discovery-endpoint.js +26 -0
- package/dist/api/discovery-endpoint.js.map +1 -1
- package/dist/api/fleet-build.d.ts +1 -0
- package/dist/api/fleet-build.js +2 -1
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/gather-status.d.ts +14 -0
- package/dist/api/gather-status.js +494 -19
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/hermes-doctor-endpoint.d.ts +117 -0
- package/dist/api/hermes-doctor-endpoint.js +229 -23
- package/dist/api/hermes-doctor-endpoint.js.map +1 -1
- package/dist/api/launcher-status.d.ts +22 -17
- package/dist/api/launcher-status.js +13 -11
- package/dist/api/launcher-status.js.map +1 -1
- package/dist/api/launcher-tasks.d.ts +1 -1
- package/dist/api/launcher-tasks.js +12 -8
- package/dist/api/launcher-tasks.js.map +1 -1
- package/dist/api/portfolio-v0-build.d.ts +10 -0
- package/dist/api/portfolio-v0-build.js +24 -5
- package/dist/api/portfolio-v0-build.js.map +1 -1
- package/dist/api/prediction-v1-build.d.ts +10 -0
- package/dist/api/prediction-v1-build.js +7 -1
- package/dist/api/prediction-v1-build.js.map +1 -1
- package/dist/api/server.d.ts +31 -1
- package/dist/api/server.js +72 -1
- package/dist/api/server.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +16 -0
- package/dist/api/setup-endpoints.js +89 -135
- package/dist/api/setup-endpoints.js.map +1 -1
- package/dist/api/setup-retry-endpoint.d.ts +19 -0
- package/dist/api/setup-retry-endpoint.js +32 -0
- package/dist/api/setup-retry-endpoint.js.map +1 -0
- package/dist/api/solvernets-endpoints.d.ts +8 -0
- package/dist/api/solvernets-endpoints.js +71 -43
- package/dist/api/solvernets-endpoints.js.map +1 -1
- package/dist/api/status-build.d.ts +112 -0
- package/dist/api/status-build.js +98 -18
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/task-run-routing.d.ts +7 -0
- package/dist/api/task-run-routing.js +12 -0
- package/dist/api/task-run-routing.js.map +1 -0
- package/dist/api/task-runs-build.d.ts +21 -0
- package/dist/api/task-runs-build.js +14 -1
- package/dist/api/task-runs-build.js.map +1 -1
- package/dist/build-info.json +4 -4
- package/dist/build-meta.json +1 -1
- package/dist/chain-read-errors.d.ts +10 -0
- package/dist/chain-read-errors.js +15 -0
- package/dist/chain-read-errors.js.map +1 -1
- package/dist/cli/commands/auth.js +1 -1
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/create.js +3 -2
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +2 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/rewards.js +11 -7
- package/dist/cli/commands/rewards.js.map +1 -1
- package/dist/cli/commands/solver-nets.js +101 -15
- package/dist/cli/commands/solver-nets.js.map +1 -1
- package/dist/cli/commands/solver-plugins-block.d.ts +33 -0
- package/dist/cli/commands/solver-plugins-block.js +118 -0
- package/dist/cli/commands/solver-plugins-block.js.map +1 -0
- package/dist/cli/commands/solver-plugins-feedback.d.ts +72 -0
- package/dist/cli/commands/solver-plugins-feedback.js +262 -0
- package/dist/cli/commands/solver-plugins-feedback.js.map +1 -0
- package/dist/cli/commands/solver-plugins-read.d.ts +54 -0
- package/dist/cli/commands/solver-plugins-read.js +259 -0
- package/dist/cli/commands/solver-plugins-read.js.map +1 -0
- package/dist/cli/commands/solver-plugins.d.ts +35 -0
- package/dist/cli/commands/solver-plugins.js +399 -2
- package/dist/cli/commands/solver-plugins.js.map +1 -1
- package/dist/cli/commands/status.js +1 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/tasks.js +101 -11
- package/dist/cli/commands/tasks.js.map +1 -1
- package/dist/cli/commands/update.d.ts +10 -0
- package/dist/cli/commands/update.js +36 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/introspection-context.js +5 -0
- package/dist/cli/introspection-context.js.map +1 -1
- package/dist/cli/task-native-readiness.d.ts +10 -1
- package/dist/cli/task-native-readiness.js +30 -6
- package/dist/cli/task-native-readiness.js.map +1 -1
- package/dist/config.d.ts +273 -235
- package/dist/config.js +305 -114
- package/dist/config.js.map +1 -1
- package/dist/daemon/checkpoint-loop.d.ts +48 -0
- package/dist/daemon/checkpoint-loop.js +76 -0
- package/dist/daemon/checkpoint-loop.js.map +1 -0
- package/dist/daemon/creator.d.ts +1 -1
- package/dist/daemon/creator.js +7 -3
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +22 -0
- package/dist/daemon/daemon.js +156 -23
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/eviction-loop.d.ts +40 -0
- package/dist/daemon/eviction-loop.js +67 -0
- package/dist/daemon/eviction-loop.js.map +1 -0
- package/dist/daemon/gate-logger.d.ts +9 -0
- package/dist/daemon/gate-logger.js +2 -0
- package/dist/daemon/gate-logger.js.map +1 -0
- package/dist/daemon/jinn-claim-loop-wiring.d.ts +33 -0
- package/dist/daemon/jinn-claim-loop-wiring.js +40 -0
- package/dist/daemon/jinn-claim-loop-wiring.js.map +1 -0
- package/dist/daemon/jinn-claim-loop.d.ts +24 -17
- package/dist/daemon/jinn-claim-loop.js +77 -23
- package/dist/daemon/jinn-claim-loop.js.map +1 -1
- package/dist/daemon/readiness-gate.d.ts +1 -4
- package/dist/daemon/readiness-gate.js.map +1 -1
- package/dist/daemon/skip-log-dedup.d.ts +69 -0
- package/dist/daemon/skip-log-dedup.js +106 -0
- package/dist/daemon/skip-log-dedup.js.map +1 -0
- package/dist/daemon/spend-cap-gate.d.ts +40 -0
- package/dist/daemon/spend-cap-gate.js +46 -0
- package/dist/daemon/spend-cap-gate.js.map +1 -0
- package/dist/dashboard/assets/index-8yHQgi7p.js +345 -0
- package/dist/dashboard/assets/index-BOBhJ76-.css +32 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/discovery/factory.d.ts +17 -5
- package/dist/discovery/factory.js +46 -18
- package/dist/discovery/factory.js.map +1 -1
- package/dist/discovery/http.js +142 -3
- package/dist/discovery/http.js.map +1 -1
- package/dist/discovery/onchain.d.ts +5 -0
- package/dist/discovery/onchain.js +407 -15
- package/dist/discovery/onchain.js.map +1 -1
- package/dist/discovery/types.d.ts +45 -1
- package/dist/discovery/types.js +8 -10
- package/dist/discovery/types.js.map +1 -1
- package/dist/discovery/with-fallback.d.ts +7 -0
- package/dist/discovery/with-fallback.js +10 -0
- package/dist/discovery/with-fallback.js.map +1 -1
- package/dist/earning/bootstrap.d.ts +92 -1
- package/dist/earning/bootstrap.js +203 -63
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +14 -0
- package/dist/earning/contracts.js +17 -5
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/funding-plan.js +27 -18
- package/dist/earning/funding-plan.js.map +1 -1
- package/dist/earning/jinn-rewards.d.ts +46 -0
- package/dist/earning/jinn-rewards.js +32 -0
- package/dist/earning/jinn-rewards.js.map +1 -1
- package/dist/earning/safe-adapter.d.ts +2 -0
- package/dist/earning/safe-adapter.js +37 -11
- package/dist/earning/safe-adapter.js.map +1 -1
- package/dist/earning/store.d.ts +8 -0
- package/dist/earning/store.js.map +1 -1
- package/dist/earning/testnet-setup-migration.d.ts +12 -0
- package/dist/earning/testnet-setup-migration.js +27 -1
- package/dist/earning/testnet-setup-migration.js.map +1 -1
- package/dist/earning/types.d.ts +21 -6
- package/dist/earning/viem-clients.d.ts +11 -4
- package/dist/earning/viem-clients.js +14 -5
- package/dist/earning/viem-clients.js.map +1 -1
- package/dist/erc8004/reputation.d.ts +8 -0
- package/dist/erc8004/reputation.js +22 -3
- package/dist/erc8004/reputation.js.map +1 -1
- package/dist/events/types.d.ts +2 -2
- package/dist/harnesses/cost-estimates.d.ts +145 -0
- package/dist/harnesses/cost-estimates.js +297 -0
- package/dist/harnesses/cost-estimates.js.map +1 -0
- package/dist/harnesses/engine/engine.d.ts +72 -0
- package/dist/harnesses/engine/engine.js +118 -8
- package/dist/harnesses/engine/engine.js.map +1 -1
- package/dist/harnesses/engine/persistence.d.ts +51 -1
- package/dist/harnesses/engine/persistence.js +118 -5
- package/dist/harnesses/engine/persistence.js.map +1 -1
- package/dist/harnesses/engine/work-dir-reaper.d.ts +65 -0
- package/dist/harnesses/engine/work-dir-reaper.js +100 -0
- package/dist/harnesses/engine/work-dir-reaper.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js +40 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +20 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js +40 -6
- package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/harness.d.ts +59 -1
- package/dist/harnesses/impls/hermes-agent/harness.js +104 -0
- package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
- package/dist/harnesses/impls/index.d.ts +7 -0
- package/dist/harnesses/impls/index.js +16 -1
- package/dist/harnesses/impls/index.js.map +1 -1
- package/dist/harnesses/impls/learner/harness.d.ts +38 -4
- package/dist/harnesses/impls/learner/harness.js +96 -2
- package/dist/harnesses/impls/learner/harness.js.map +1 -1
- package/dist/harnesses/impls/learner/plugin-path.d.ts +0 -13
- package/dist/harnesses/impls/learner/plugin-path.js +35 -15
- package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
- package/dist/harnesses/impls/learner/types.d.ts +11 -0
- package/dist/harnesses/impls/stub.d.ts +58 -0
- package/dist/harnesses/impls/stub.js +89 -0
- package/dist/harnesses/impls/stub.js.map +1 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.d.ts +69 -50
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +178 -93
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.d.ts +12 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +121 -7
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.d.ts +88 -4
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +143 -22
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +6 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
- package/dist/harnesses/readiness-registry.js +9 -1
- package/dist/harnesses/readiness-registry.js.map +1 -1
- package/dist/main.js +413 -111
- package/dist/main.js.map +1 -1
- package/dist/observability/emit-event.d.ts +3 -2
- package/dist/observability/emit-event.js +22 -1
- package/dist/observability/emit-event.js.map +1 -1
- package/dist/operator-errors.d.ts +7 -0
- package/dist/operator-errors.js +13 -1
- package/dist/operator-errors.js.map +1 -1
- package/dist/plugins/learner/.claude-plugin/plugin.json +9 -0
- package/dist/plugins/learner/.codex-plugin/plugin.json +39 -0
- package/dist/plugins/learner/AGENTS.md +40 -0
- package/dist/plugins/learner/CLAUDE.md +33 -0
- package/dist/plugins/learner/README.md +59 -0
- package/dist/plugins/learner/hooks/hooks.json +16 -0
- package/dist/plugins/learner/hooks/session-start +38 -0
- package/dist/plugins/learner/skills/learn/SKILL.md +412 -0
- package/dist/plugins/learner/skills/learn/analyst-prompt.md +68 -0
- package/dist/plugins/learner/skills/learn/consolidator-prompt.md +94 -0
- package/dist/plugins/learner/skills/learn/explorer-prompt.md +53 -0
- package/dist/plugins/learner/skills/learn/planner-prompt.md +87 -0
- package/dist/plugins/learner/skills/learn/promoter-prompt.md +113 -0
- package/dist/plugins/learner/skills/learn/step-worker-prompt.md +47 -0
- package/dist/plugins/learner/skills/learn/strategist-prompt.md +85 -0
- package/dist/preflight/rpc-network.d.ts +40 -0
- package/dist/preflight/rpc-network.js +67 -1
- package/dist/preflight/rpc-network.js.map +1 -1
- package/dist/restart-daemon.d.ts +90 -0
- package/dist/restart-daemon.js +95 -0
- package/dist/restart-daemon.js.map +1 -0
- package/dist/rpc/transport.d.ts +109 -0
- package/dist/rpc/transport.js +220 -0
- package/dist/rpc/transport.js.map +1 -0
- package/dist/scripts/donation-consumption-acceptance.js +7 -28
- package/dist/scripts/donation-consumption-acceptance.js.map +1 -1
- package/dist/setup/halt-mode.d.ts +14 -0
- package/dist/setup/halt-mode.js +17 -0
- package/dist/setup/halt-mode.js.map +1 -0
- package/dist/solver-nets/prediction-operator-ux.d.ts +1 -2
- package/dist/solver-nets/prediction-operator-ux.js +90 -47
- package/dist/solver-nets/prediction-operator-ux.js.map +1 -1
- package/dist/solver-nets/registry.d.ts +20 -1
- package/dist/solver-nets/registry.js +38 -25
- package/dist/solver-nets/registry.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-pool-cache.d.ts +58 -0
- package/dist/solver-types/_swe-rebench-v2-pool-cache.js +87 -0
- package/dist/solver-types/_swe-rebench-v2-pool-cache.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-pool.d.ts +9 -2
- package/dist/solver-types/_swe-rebench-v2-pool.js +15 -20
- package/dist/solver-types/_swe-rebench-v2-pool.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-substrate.d.ts +1 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.js +10 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +94 -1
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js +305 -39
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
- package/dist/solver-types/swe-rebench-v2-auto.d.ts +22 -7
- package/dist/solver-types/swe-rebench-v2-auto.js +45 -20
- package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
- package/dist/solver-types/swe-rebench-v2.d.ts +13 -2
- package/dist/solver-types/swe-rebench-v2.js +237 -95
- package/dist/solver-types/swe-rebench-v2.js.map +1 -1
- package/dist/solvernets/daemon-init.d.ts +10 -2
- package/dist/solvernets/daemon-init.js +22 -2
- package/dist/solvernets/daemon-init.js.map +1 -1
- package/dist/solvernets/launched-record-dispatcher.js +35 -7
- package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
- package/dist/solvernets/store.d.ts +5 -0
- package/dist/solvernets/store.js +1 -0
- package/dist/solvernets/store.js.map +1 -1
- package/dist/spend/credential.d.ts +8 -0
- package/dist/spend/credential.js +30 -0
- package/dist/spend/credential.js.map +1 -0
- package/dist/spend/daemon-config.d.ts +13 -0
- package/dist/spend/daemon-config.js +24 -0
- package/dist/spend/daemon-config.js.map +1 -0
- package/dist/spend/pricing.d.ts +16 -0
- package/dist/spend/pricing.js +26 -0
- package/dist/spend/pricing.js.map +1 -0
- package/dist/spend/record.d.ts +13 -0
- package/dist/spend/record.js +30 -0
- package/dist/spend/record.js.map +1 -0
- package/dist/spend/usage.d.ts +27 -0
- package/dist/spend/usage.js +113 -0
- package/dist/spend/usage.js.map +1 -0
- package/dist/store/store.d.ts +43 -0
- package/dist/store/store.js +236 -7
- package/dist/store/store.js.map +1 -1
- package/dist/tasks/sources.d.ts +18 -1
- package/dist/tasks/sources.js +33 -5
- package/dist/tasks/sources.js.map +1 -1
- package/dist/trajectory/transcript-parsers/types.d.ts +8 -8
- package/dist/tx-retry.d.ts +166 -19
- package/dist/tx-retry.js +310 -32
- package/dist/tx-retry.js.map +1 -1
- package/dist/types/payloads/prediction-apy-v0.d.ts +5 -5
- package/dist/types/payloads/prediction-v0.d.ts +5 -5
- package/dist/types/task-document.d.ts +392 -0
- package/dist/types/task-document.js +10 -0
- package/dist/types/task-document.js.map +1 -1
- package/dist/types/task.d.ts +28 -0
- package/dist/util/extract-tx-hash.d.ts +14 -0
- package/dist/util/extract-tx-hash.js +19 -0
- package/dist/util/extract-tx-hash.js.map +1 -0
- package/dist/vendor/@jinn-network/sdk/dist/contracts.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +3 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -0
- package/package.json +30 -12
- package/dist/dashboard/assets/index-DOlzFN8a.css +0 -32
- package/dist/dashboard/assets/index-NkZ7CTAT.js +0 -140
|
@@ -1,4 +1,24 @@
|
|
|
1
1
|
import { type ConfigBuilderEnv } from './config-builder.js';
|
|
2
|
+
/**
|
|
3
|
+
* Per-task `max_tokens` cap (Jinn-enforced, OpenRouter-bound).
|
|
4
|
+
*
|
|
5
|
+
* OpenRouter pre-bills on `max_tokens` rather than actual output tokens:
|
|
6
|
+
* the model invocation reserves credit for `max_tokens × output-cost` at
|
|
7
|
+
* request time. An operator who sets `max_tokens=64000` (Hermes's stock
|
|
8
|
+
* default for frontier models) against the priciest models needs ~$0.30+
|
|
9
|
+
* of unspent credit *per request* just to start the call — even if the
|
|
10
|
+
* actual solve uses 6k tokens. Production bug, 2026-05-23: every Hermes
|
|
11
|
+
* solve attempt returned HTTP 402 with "You requested up to 64000 tokens,
|
|
12
|
+
* but can only afford 52975."
|
|
13
|
+
*
|
|
14
|
+
* 32000 is generous for a SWE-rebench patch (whole patches typically come
|
|
15
|
+
* in well under 10k output tokens) and fits under the OpenRouter affordable
|
|
16
|
+
* cap across the model classes used in 2026-05 production. The Jinn-managed
|
|
17
|
+
* value is `min(operator_value, JINN_HERMES_MAX_TOKENS_CAP)` — operators
|
|
18
|
+
* who want a lower cap (e.g. tighter budget) keep their value; operators
|
|
19
|
+
* who set a higher cap get clamped to 32000.
|
|
20
|
+
*/
|
|
21
|
+
export declare const JINN_HERMES_MAX_TOKENS_CAP = 32000;
|
|
2
22
|
export interface WritePerTaskConfigInputs {
|
|
3
23
|
hermesHome: string;
|
|
4
24
|
workingDir: string;
|
|
@@ -27,6 +27,26 @@ const TOOLSET_ALLOWLIST = [
|
|
|
27
27
|
'todo',
|
|
28
28
|
'code_execution',
|
|
29
29
|
];
|
|
30
|
+
/**
|
|
31
|
+
* Per-task `max_tokens` cap (Jinn-enforced, OpenRouter-bound).
|
|
32
|
+
*
|
|
33
|
+
* OpenRouter pre-bills on `max_tokens` rather than actual output tokens:
|
|
34
|
+
* the model invocation reserves credit for `max_tokens × output-cost` at
|
|
35
|
+
* request time. An operator who sets `max_tokens=64000` (Hermes's stock
|
|
36
|
+
* default for frontier models) against the priciest models needs ~$0.30+
|
|
37
|
+
* of unspent credit *per request* just to start the call — even if the
|
|
38
|
+
* actual solve uses 6k tokens. Production bug, 2026-05-23: every Hermes
|
|
39
|
+
* solve attempt returned HTTP 402 with "You requested up to 64000 tokens,
|
|
40
|
+
* but can only afford 52975."
|
|
41
|
+
*
|
|
42
|
+
* 32000 is generous for a SWE-rebench patch (whole patches typically come
|
|
43
|
+
* in well under 10k output tokens) and fits under the OpenRouter affordable
|
|
44
|
+
* cap across the model classes used in 2026-05 production. The Jinn-managed
|
|
45
|
+
* value is `min(operator_value, JINN_HERMES_MAX_TOKENS_CAP)` — operators
|
|
46
|
+
* who want a lower cap (e.g. tighter budget) keep their value; operators
|
|
47
|
+
* who set a higher cap get clamped to 32000.
|
|
48
|
+
*/
|
|
49
|
+
export const JINN_HERMES_MAX_TOKENS_CAP = 32000;
|
|
30
50
|
/**
|
|
31
51
|
* Files copied verbatim from the operator's real Hermes home into the per-Task
|
|
32
52
|
* `$HERMES_HOME`. Hermes resolves OAuth creds from `$HERMES_HOME/auth/...` and
|
|
@@ -78,6 +98,9 @@ function seedOperatorState(hermesHome, seedFrom) {
|
|
|
78
98
|
// Jinn-managed keys (per-Task authoritative; Jinn writes these every Task):
|
|
79
99
|
// - model.default — if a daemon/SolverNet override was provided
|
|
80
100
|
// - model.provider — if a daemon/SolverNet override was provided
|
|
101
|
+
// - model.max_tokens — capped at JINN_HERMES_MAX_TOKENS_CAP (operators
|
|
102
|
+
// may pin lower, never higher — OpenRouter
|
|
103
|
+
// pre-billing footgun, see the constant docstring)
|
|
81
104
|
// - terminal.backend — forced to `local` (the per-Task workingDir is a
|
|
82
105
|
// host filesystem path; remote backends would need
|
|
83
106
|
// additional setup Jinn doesn't yet do)
|
|
@@ -92,8 +115,6 @@ function seedOperatorState(hermesHome, seedFrom) {
|
|
|
92
115
|
// Everything else from the operator's config.yaml passes through unchanged.
|
|
93
116
|
//
|
|
94
117
|
// Operator-set keys that DO inherit and matter for budget-capped providers:
|
|
95
|
-
// - model.max_tokens — OpenRouter pre-bills on max_tokens; operators
|
|
96
|
-
// with low monthly caps must lower this to fit.
|
|
97
118
|
// - model.context_length — total context window cap.
|
|
98
119
|
// - provider_routing — OpenRouter routing knobs (sort by price, etc.).
|
|
99
120
|
// - providers.<name> — per-provider timeout / model-specific overrides.
|
|
@@ -117,9 +138,12 @@ function readOperatorConfigYaml(seedFrom) {
|
|
|
117
138
|
}
|
|
118
139
|
function mergePerTaskConfig(operator, jinn, opts) {
|
|
119
140
|
const out = { ...operator };
|
|
120
|
-
// model: deep-merge — operator's
|
|
121
|
-
//
|
|
122
|
-
//
|
|
141
|
+
// model: deep-merge — operator's context_length/base_url/provider_routing/
|
|
142
|
+
// etc. preserved; Jinn overrides default+provider only if specified by
|
|
143
|
+
// daemon/SolverNet config; Jinn ALWAYS caps `max_tokens` at
|
|
144
|
+
// JINN_HERMES_MAX_TOKENS_CAP (operators may pin lower, never higher).
|
|
145
|
+
// See the JINN_HERMES_MAX_TOKENS_CAP docstring for the OpenRouter
|
|
146
|
+
// pre-billing rationale (production bug, 2026-05-23).
|
|
123
147
|
if (opts.model || opts.provider || isObj(out.model)) {
|
|
124
148
|
const opModel = isObj(out.model) ? out.model : {};
|
|
125
149
|
const jinnModel = {};
|
|
@@ -127,7 +151,17 @@ function mergePerTaskConfig(operator, jinn, opts) {
|
|
|
127
151
|
jinnModel.default = opts.model;
|
|
128
152
|
if (opts.provider)
|
|
129
153
|
jinnModel.provider = opts.provider;
|
|
130
|
-
|
|
154
|
+
const merged = { ...opModel, ...jinnModel };
|
|
155
|
+
const opMaxTokens = typeof opModel.max_tokens === 'number' ? opModel.max_tokens : undefined;
|
|
156
|
+
merged.max_tokens = opMaxTokens != null
|
|
157
|
+
? Math.min(opMaxTokens, JINN_HERMES_MAX_TOKENS_CAP)
|
|
158
|
+
: JINN_HERMES_MAX_TOKENS_CAP;
|
|
159
|
+
out.model = merged;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// No model block from either side — still pin the cap so a stock Hermes
|
|
163
|
+
// install (with its 64000 default) cannot ship over-budget requests.
|
|
164
|
+
out.model = { max_tokens: JINN_HERMES_MAX_TOKENS_CAP };
|
|
131
165
|
}
|
|
132
166
|
// terminal: Jinn forces backend + cwd; operator's timeout / lifetime /
|
|
133
167
|
// sudo_password / docker_* fields preserved (the docker_* fields are inert
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/hermes-agent/bootstrap.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AACtE,OAAO,EACL,6BAA6B,GAG9B,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;GAaG;AACH,MAAM,iBAAiB,GAAG;IACxB,UAAU;IACV,MAAM;IACN,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,gBAAgB;IAChB,MAAM;IACN,gBAAgB;CACR,CAAC;AAEX;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAU,CAAC;AAmBrE,SAAS,iBAAiB,CAAC,UAAkB,EAAE,QAAgB;IAC7D,IAAI,QAAQ,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IAC7D,KAAK,MAAM,IAAI,IAAI,sBAAsB,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,yDAAyD;AACzD,+EAA+E;AAC/E,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,2EAA2E;AAC3E,0EAA0E;AAC1E,4EAA4E;AAC5E,uEAAuE;AACvE,sEAAsE;AACtE,4EAA4E;AAC5E,iBAAiB;AACjB,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,yEAAyE;AACzE,6EAA6E;AAC7E,8EAA8E;AAC9E,mEAAmE;AACnE,qDAAqD;AACrD,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,8EAA8E;AAC9E,yEAAyE;AACzE,qDAAqD;AACrD,EAAE;AACF,4EAA4E;AAC5E,EAAE;AACF,4EAA4E;AAC5E,
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/hermes-agent/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,26 @@
|
|
|
1
|
-
import type { Harness, HarnessContext, Solution } from '../../types.js';
|
|
1
|
+
import type { Harness, HarnessContext, ReadyStatus, Solution } from '../../types.js';
|
|
2
2
|
import type { HermesHarnessAdapter } from './adapter.js';
|
|
3
|
+
import { probeOpenRouterCredit, type OpenRouterCreditConfig } from '../../../api/hermes-doctor-endpoint.js';
|
|
3
4
|
export interface HermesHarnessConfig {
|
|
4
5
|
adapter: HermesHarnessAdapter;
|
|
5
6
|
version?: string;
|
|
7
|
+
/** Hermes binary path used by `isReady()`. Defaults to `hermes` (PATH lookup). */
|
|
8
|
+
hermesPath?: string;
|
|
9
|
+
/** Timeout for the `hermes doctor` probe. Defaults to 30s. */
|
|
10
|
+
hermesDoctorTimeoutMs?: number;
|
|
11
|
+
/**
|
|
12
|
+
* Per-task OpenRouter credit floor in USD. Below this, `isReady()` reports
|
|
13
|
+
* not-ready with a top-up nextStep. Defaults to
|
|
14
|
+
* {@link DEFAULT_OPENROUTER_CREDIT_FLOOR_USD}. Tests can inject a custom
|
|
15
|
+
* `creditProbe` to bypass the network probe entirely.
|
|
16
|
+
*/
|
|
17
|
+
openrouterCreditFloorUsd?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Optional injection point for the OpenRouter credit probe — tests use this
|
|
20
|
+
* to mock the network round-trip. Production code lets the harness call the
|
|
21
|
+
* exported `probeOpenRouterCredit` directly.
|
|
22
|
+
*/
|
|
23
|
+
creditProbe?: (config: OpenRouterCreditConfig) => Promise<Awaited<ReturnType<typeof probeOpenRouterCredit>>>;
|
|
6
24
|
}
|
|
7
25
|
/**
|
|
8
26
|
* Hermes Agent harness.
|
|
@@ -21,7 +39,47 @@ export declare class HermesHarness implements Harness {
|
|
|
21
39
|
readonly version: string;
|
|
22
40
|
readonly freezeStateHashIgnore: readonly ["auth", "auth.json", "bin/tirith", ".env", "config.yaml"];
|
|
23
41
|
private readonly adapter;
|
|
42
|
+
private readonly hermesPath;
|
|
43
|
+
private readonly hermesDoctorTimeoutMs;
|
|
44
|
+
private readonly openrouterCreditFloorUsd;
|
|
45
|
+
private readonly creditProbe;
|
|
24
46
|
constructor(config: HermesHarnessConfig);
|
|
47
|
+
/**
|
|
48
|
+
* Readiness probe — shells out to `hermes doctor` via the shared
|
|
49
|
+
* `probeHermesDoctor` helper (same logic the SPA precheck endpoint
|
|
50
|
+
* uses). Reports:
|
|
51
|
+
* - `installed: false` → binary not on PATH → ready=false with install
|
|
52
|
+
* nextStep so the operator sees an actionable message instead of
|
|
53
|
+
* N/N failed claims (#330).
|
|
54
|
+
* - `exitCode !== 0` → binary exists but `hermes doctor` reports a
|
|
55
|
+
* configuration problem (e.g. provider not signed in) → ready=false
|
|
56
|
+
* with a nextStep that points at the SPA precheck panel.
|
|
57
|
+
* - OpenRouter has no usable credential → ready=false. `hermes doctor`
|
|
58
|
+
* exits 0 even when every provider is logged out (it treats missing
|
|
59
|
+
* providers as warnings), so this third gate probes `hermes auth list
|
|
60
|
+
* openrouter` directly. `auth list` reads the credential pool, so it
|
|
61
|
+
* recognises API-key credentials (the normal `OPENROUTER_API_KEY`
|
|
62
|
+
* setup) as well as OAuth — unlike `auth status`, which only reflects
|
|
63
|
+
* interactive-OAuth-login state. Hermes is OpenRouter-only, so an
|
|
64
|
+
* OpenRouter with no usable credential means Hermes has no model
|
|
65
|
+
* provider and every claim would burn (#332/#330/#348).
|
|
66
|
+
* - OpenRouter credential is present but credit is exhausted → ready=false.
|
|
67
|
+
* Production bug, 2026-05-23: `auth list openrouter` reported the
|
|
68
|
+
* api_key credential as healthy, but every solve attempt for the day
|
|
69
|
+
* returned HTTP 402 ("This request requires more credits, or fewer
|
|
70
|
+
* max_tokens.") and the harness silently burned 12 claims. The fourth
|
|
71
|
+
* gate probes `GET https://openrouter.ai/api/v1/key` to verify the
|
|
72
|
+
* credential has spendable credit at or above the per-task floor.
|
|
73
|
+
* Fail-safe: network errors and non-200 responses are treated as
|
|
74
|
+
* unknown (ready), not exhausted, so a transient OpenRouter outage
|
|
75
|
+
* doesn't shut every operator down. Only a clearly-confirmed
|
|
76
|
+
* insufficient-credit signal flips ready=false.
|
|
77
|
+
* - all four gates pass → ready=true.
|
|
78
|
+
*/
|
|
79
|
+
isReady(_ctx?: {
|
|
80
|
+
solverType: string;
|
|
81
|
+
role?: 'restoration' | 'evaluation';
|
|
82
|
+
}): Promise<ReadyStatus>;
|
|
25
83
|
supports(spec: {
|
|
26
84
|
solverType: string;
|
|
27
85
|
role?: 'restoration' | 'evaluation';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { HERMES_AGENT_HARNESS } from '../../names.js';
|
|
2
2
|
import { harvestOutput } from '../learner/harvest.js';
|
|
3
|
+
import { probeHermesDoctor, probeHermesAuthStatus, probeOpenRouterCredit, DEFAULT_OPENROUTER_CREDIT_FLOOR_USD, } from '../../../api/hermes-doctor-endpoint.js';
|
|
3
4
|
/**
|
|
4
5
|
* Hermes Agent harness.
|
|
5
6
|
*
|
|
@@ -17,9 +18,112 @@ export class HermesHarness {
|
|
|
17
18
|
version;
|
|
18
19
|
freezeStateHashIgnore = ['auth', 'auth.json', 'bin/tirith', '.env', 'config.yaml'];
|
|
19
20
|
adapter;
|
|
21
|
+
hermesPath;
|
|
22
|
+
hermesDoctorTimeoutMs;
|
|
23
|
+
openrouterCreditFloorUsd;
|
|
24
|
+
creditProbe;
|
|
20
25
|
constructor(config) {
|
|
21
26
|
this.adapter = config.adapter;
|
|
22
27
|
this.version = config.version ?? '0.1.0';
|
|
28
|
+
this.hermesPath = config.hermesPath;
|
|
29
|
+
this.hermesDoctorTimeoutMs = config.hermesDoctorTimeoutMs;
|
|
30
|
+
this.openrouterCreditFloorUsd = config.openrouterCreditFloorUsd ?? DEFAULT_OPENROUTER_CREDIT_FLOOR_USD;
|
|
31
|
+
this.creditProbe = config.creditProbe ?? probeOpenRouterCredit;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Readiness probe — shells out to `hermes doctor` via the shared
|
|
35
|
+
* `probeHermesDoctor` helper (same logic the SPA precheck endpoint
|
|
36
|
+
* uses). Reports:
|
|
37
|
+
* - `installed: false` → binary not on PATH → ready=false with install
|
|
38
|
+
* nextStep so the operator sees an actionable message instead of
|
|
39
|
+
* N/N failed claims (#330).
|
|
40
|
+
* - `exitCode !== 0` → binary exists but `hermes doctor` reports a
|
|
41
|
+
* configuration problem (e.g. provider not signed in) → ready=false
|
|
42
|
+
* with a nextStep that points at the SPA precheck panel.
|
|
43
|
+
* - OpenRouter has no usable credential → ready=false. `hermes doctor`
|
|
44
|
+
* exits 0 even when every provider is logged out (it treats missing
|
|
45
|
+
* providers as warnings), so this third gate probes `hermes auth list
|
|
46
|
+
* openrouter` directly. `auth list` reads the credential pool, so it
|
|
47
|
+
* recognises API-key credentials (the normal `OPENROUTER_API_KEY`
|
|
48
|
+
* setup) as well as OAuth — unlike `auth status`, which only reflects
|
|
49
|
+
* interactive-OAuth-login state. Hermes is OpenRouter-only, so an
|
|
50
|
+
* OpenRouter with no usable credential means Hermes has no model
|
|
51
|
+
* provider and every claim would burn (#332/#330/#348).
|
|
52
|
+
* - OpenRouter credential is present but credit is exhausted → ready=false.
|
|
53
|
+
* Production bug, 2026-05-23: `auth list openrouter` reported the
|
|
54
|
+
* api_key credential as healthy, but every solve attempt for the day
|
|
55
|
+
* returned HTTP 402 ("This request requires more credits, or fewer
|
|
56
|
+
* max_tokens.") and the harness silently burned 12 claims. The fourth
|
|
57
|
+
* gate probes `GET https://openrouter.ai/api/v1/key` to verify the
|
|
58
|
+
* credential has spendable credit at or above the per-task floor.
|
|
59
|
+
* Fail-safe: network errors and non-200 responses are treated as
|
|
60
|
+
* unknown (ready), not exhausted, so a transient OpenRouter outage
|
|
61
|
+
* doesn't shut every operator down. Only a clearly-confirmed
|
|
62
|
+
* insufficient-credit signal flips ready=false.
|
|
63
|
+
* - all four gates pass → ready=true.
|
|
64
|
+
*/
|
|
65
|
+
async isReady(_ctx) {
|
|
66
|
+
const config = {};
|
|
67
|
+
if (this.hermesPath !== undefined)
|
|
68
|
+
config.hermesPath = this.hermesPath;
|
|
69
|
+
if (this.hermesDoctorTimeoutMs !== undefined)
|
|
70
|
+
config.hermesDoctorTimeoutMs = this.hermesDoctorTimeoutMs;
|
|
71
|
+
const result = probeHermesDoctor(config);
|
|
72
|
+
if (!result.installed) {
|
|
73
|
+
return {
|
|
74
|
+
ready: false,
|
|
75
|
+
reason: 'hermes binary not installed',
|
|
76
|
+
nextStep: {
|
|
77
|
+
description: 'Install the Hermes agent runner — see the Hermes precheck panel in the operator dashboard for the install command.',
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (result.exitCode !== 0) {
|
|
82
|
+
const stderr = result.stderr.trim();
|
|
83
|
+
const stdout = result.stdout.trim();
|
|
84
|
+
const detail = stderr.length > 0 ? stderr : stdout;
|
|
85
|
+
return {
|
|
86
|
+
ready: false,
|
|
87
|
+
reason: `hermes doctor exit ${result.exitCode}${detail ? `: ${detail}` : ''}`,
|
|
88
|
+
nextStep: {
|
|
89
|
+
description: 'Run `hermes doctor` locally to surface the configuration problem, or open the Hermes precheck panel in the operator dashboard to sign in / select a provider.',
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Third gate: `hermes doctor` exits 0 even when every model provider is
|
|
94
|
+
// logged out. Hermes is OpenRouter-only, so probe OpenRouter auth
|
|
95
|
+
// directly — a logged-out OpenRouter means Hermes cannot run a task.
|
|
96
|
+
const auth = probeHermesAuthStatus('openrouter', config);
|
|
97
|
+
if (!auth.authed) {
|
|
98
|
+
return {
|
|
99
|
+
ready: false,
|
|
100
|
+
reason: 'OpenRouter not connected — Hermes has no usable model provider',
|
|
101
|
+
nextStep: {
|
|
102
|
+
description: 'Connect OpenRouter — sign in via the Hermes precheck panel in the operator dashboard, or run `hermes login` locally.',
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// Fourth gate: probe OpenRouter's `/api/v1/key` for spendable credit.
|
|
107
|
+
// Catches the case where the credential is present and pool-healthy but
|
|
108
|
+
// the account is out of money — without this, the harness burns claims
|
|
109
|
+
// on 402 responses (production bug, 2026-05-23). Fail-safe: only a
|
|
110
|
+
// clearly-confirmed exhausted state flips ready=false.
|
|
111
|
+
const credit = await this.creditProbe({ floorUsd: this.openrouterCreditFloorUsd });
|
|
112
|
+
if (credit.state === 'exhausted') {
|
|
113
|
+
const remaining = typeof credit.remainingUsd === 'number'
|
|
114
|
+
? `$${credit.remainingUsd.toFixed(2)}`
|
|
115
|
+
: 'below floor';
|
|
116
|
+
const floor = `$${credit.floorUsd.toFixed(2)}`;
|
|
117
|
+
return {
|
|
118
|
+
ready: false,
|
|
119
|
+
reason: `OpenRouter credit insufficient for the next solve — remaining ${remaining} < floor ${floor}`,
|
|
120
|
+
nextStep: {
|
|
121
|
+
description: 'OpenRouter credit insufficient for the next solve — top up at https://openrouter.ai/credits, then re-check readiness.',
|
|
122
|
+
url: 'https://openrouter.ai/credits',
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return { ready: true };
|
|
23
127
|
}
|
|
24
128
|
supports(spec) {
|
|
25
129
|
// Hermes currently ships a SWE-rebench v2 task prompt and runtime plugin.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/hermes-agent/harness.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/hermes-agent/harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,6 +46,11 @@ export interface HarnessEnv {
|
|
|
46
46
|
codexPath?: string;
|
|
47
47
|
/** Default Codex model when a SolverNet does not specify one. */
|
|
48
48
|
codexModel?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Timeout (ms) for the `codex --version` probe in the Codex variant of
|
|
51
|
+
* `LearnerHarness.isReady`.
|
|
52
|
+
*/
|
|
53
|
+
codexDoctorTimeoutMs?: number;
|
|
49
54
|
/** Optional Polymarket Gamma API override for acceptance or private mirrors. */
|
|
50
55
|
polymarketGammaBaseUrl?: string;
|
|
51
56
|
/** Optional Polymarket CLOB API override for acceptance or private mirrors. */
|
|
@@ -82,6 +87,8 @@ export interface HarnessEnv {
|
|
|
82
87
|
hermesModel?: string;
|
|
83
88
|
/** Hermes provider (e.g. 'anthropic'). */
|
|
84
89
|
hermesProvider?: string;
|
|
90
|
+
/** Timeout (ms) for the `hermes doctor` probe in HermesHarness.isReady. */
|
|
91
|
+
hermesDoctorTimeoutMs?: number;
|
|
85
92
|
}
|
|
86
93
|
/**
|
|
87
94
|
* Build the canonical ordered list of first-party restoration/evaluation Harnesses.
|
|
@@ -15,6 +15,7 @@ import { LearnerHarness, } from './learner/index.js';
|
|
|
15
15
|
import { ClaudeCodeHarnessAdapter, CodexCodeHarnessAdapter } from './learner/index.js';
|
|
16
16
|
import { SweRebenchV2EvaluatorHarness } from './swe-rebench-v2-evaluator/harness.js';
|
|
17
17
|
import { HermesHarness, HermesHarnessAdapter } from './hermes-agent/index.js';
|
|
18
|
+
import { maybeCreateStubHarnessFromEnv } from './stub.js';
|
|
18
19
|
import { canonicalHarnessName, canonicalHarnessNameSet, CODEX_HARNESS, } from '../names.js';
|
|
19
20
|
/**
|
|
20
21
|
* Build the canonical ordered list of first-party restoration/evaluation Harnesses.
|
|
@@ -98,6 +99,12 @@ export function buildHarnesses(env) {
|
|
|
98
99
|
: undefined,
|
|
99
100
|
ipfsRegistryUrl: env.ipfsRegistryUrl,
|
|
100
101
|
}));
|
|
102
|
+
// Env-gated stub harness for T2.2 release gate. Active only when
|
|
103
|
+
// JINN_HARNESS_STUB_INSTANCE is set; no-op otherwise.
|
|
104
|
+
const stub = maybeCreateStubHarnessFromEnv();
|
|
105
|
+
if (stub) {
|
|
106
|
+
out.push(stub);
|
|
107
|
+
}
|
|
101
108
|
// Operator-supplied external Harnesses are appended before the default learner
|
|
102
109
|
// so explicit SolverNet harness settings can select them.
|
|
103
110
|
if (env.externalImpls && env.externalImpls.length > 0) {
|
|
@@ -132,6 +139,10 @@ export function buildHarnesses(env) {
|
|
|
132
139
|
name: CODEX_HARNESS,
|
|
133
140
|
adapter: codexLearnerAdapter,
|
|
134
141
|
claudePath: env.claudePath,
|
|
142
|
+
...(env.codexPath !== undefined ? { codexPath: env.codexPath } : {}),
|
|
143
|
+
...(env.codexDoctorTimeoutMs !== undefined
|
|
144
|
+
? { codexDoctorTimeoutMs: env.codexDoctorTimeoutMs }
|
|
145
|
+
: {}),
|
|
135
146
|
}));
|
|
136
147
|
const hermesAdapter = new HermesHarnessAdapter({
|
|
137
148
|
hermesPath: env.hermesPath,
|
|
@@ -142,7 +153,11 @@ export function buildHarnesses(env) {
|
|
|
142
153
|
storePath: env.storePath,
|
|
143
154
|
corpusEnv: env.corpusEnv ?? {},
|
|
144
155
|
});
|
|
145
|
-
out.push(new HermesHarness({
|
|
156
|
+
out.push(new HermesHarness({
|
|
157
|
+
adapter: hermesAdapter,
|
|
158
|
+
...(env.hermesPath !== undefined ? { hermesPath: env.hermesPath } : {}),
|
|
159
|
+
...(env.hermesDoctorTimeoutMs !== undefined ? { hermesDoctorTimeoutMs: env.hermesDoctorTimeoutMs } : {}),
|
|
160
|
+
}));
|
|
146
161
|
if (env.disabledNames && env.disabledNames.length > 0) {
|
|
147
162
|
const disabled = canonicalHarnessNameSet(env.disabledNames);
|
|
148
163
|
return out.filter((impl) => !disabled.has(canonicalHarnessName(impl.name)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/harnesses/impls/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EACL,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,aAAa,GACd,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/harnesses/impls/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Harness, HarnessContext, Solution } from '../../types.js';
|
|
1
|
+
import type { Harness, HarnessContext, ReadyStatus, Solution } from '../../types.js';
|
|
2
2
|
import type { LearnerHarnessConfig } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* `Harness` shell. Bridges the engine's dispatch contract
|
|
@@ -14,12 +14,46 @@ export declare class LearnerHarness implements Harness {
|
|
|
14
14
|
private readonly adapter;
|
|
15
15
|
private readonly pluginRoot;
|
|
16
16
|
private readonly claudePath;
|
|
17
|
+
private readonly codexPath;
|
|
18
|
+
private readonly codexDoctorTimeoutMs;
|
|
17
19
|
private readonly runtimeMode;
|
|
18
20
|
constructor(config: LearnerHarnessConfig);
|
|
19
|
-
|
|
21
|
+
private readonly claudeIsReady;
|
|
22
|
+
/**
|
|
23
|
+
* Readiness probe.
|
|
24
|
+
*
|
|
25
|
+
* The `LearnerHarness` shell backs two distinct CLIs: claude-code (the
|
|
26
|
+
* default) and Codex (`name === CODEX_HARNESS`). The probe MUST match the
|
|
27
|
+
* CLI actually invoked — delegating the Codex variant to the claude auth
|
|
28
|
+
* probe makes a missing/unconfigured `codex` install look always-ready and
|
|
29
|
+
* burns N/N failed claims (#348, the same-shape bug as #330).
|
|
30
|
+
*
|
|
31
|
+
* - claude-code → `buildClaudeIsReady` (shells `claude auth status`).
|
|
32
|
+
* - Codex → `probeCodexDoctor` (shells `codex --version`, then
|
|
33
|
+
* checks for `OPENAI_API_KEY` / a `codex login` auth file).
|
|
34
|
+
*/
|
|
35
|
+
isReady(ctx?: {
|
|
20
36
|
solverType: string;
|
|
21
|
-
role?:
|
|
22
|
-
})
|
|
37
|
+
role?: 'restoration' | 'evaluation';
|
|
38
|
+
}): Promise<ReadyStatus>;
|
|
39
|
+
/**
|
|
40
|
+
* Codex-specific readiness probe. Shells `codex --version` via the shared
|
|
41
|
+
* `probeCodexDoctor` helper (same logic the SPA precheck endpoint uses).
|
|
42
|
+
* Reports:
|
|
43
|
+
* - `installed: false` → binary not on PATH → ready=false with an install
|
|
44
|
+
* nextStep so the operator sees an actionable message instead of N/N
|
|
45
|
+
* failed claims (#348).
|
|
46
|
+
* - `exitCode !== 0` → binary exists but `codex --version` failed →
|
|
47
|
+
* ready=false pointing at the Codex precheck panel.
|
|
48
|
+
* - `authStatus: 'not_configured'` → binary runs but no `OPENAI_API_KEY`
|
|
49
|
+
* and no `codex login` session → ready=false with a sign-in nextStep.
|
|
50
|
+
* - `authStatus: 'expired'` → an `auth.json` is present but its OAuth
|
|
51
|
+
* session has expired (or the file is malformed) → ready=false with a
|
|
52
|
+
* re-login nextStep. Distinct from `not_configured` so a logged-out
|
|
53
|
+
* operator with a leftover file is not treated as ready (#366).
|
|
54
|
+
* - otherwise → ready=true.
|
|
55
|
+
*/
|
|
56
|
+
private codexIsReady;
|
|
23
57
|
supports(spec: {
|
|
24
58
|
solverType: string;
|
|
25
59
|
role?: 'restoration' | 'evaluation';
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { CLAUDE_CODE_HARNESS } from '../../names.js';
|
|
1
|
+
import { CLAUDE_CODE_HARNESS, CODEX_HARNESS, canonicalHarnessName } from '../../names.js';
|
|
2
2
|
import { resolvePluginRoot } from './plugin-path.js';
|
|
3
3
|
import { harvestOutput } from './harvest.js';
|
|
4
4
|
import { buildClaudeIsReady } from '../../../preflight/claude-auth.js';
|
|
5
|
+
import { probeCodexDoctor } from '../../../api/codex-doctor-endpoint.js';
|
|
5
6
|
/**
|
|
6
7
|
* `Harness` shell. Bridges the engine's dispatch contract
|
|
7
8
|
* (`await impl.run(ctx)`) into the harness adapter + markdown plugin.
|
|
@@ -16,6 +17,8 @@ export class LearnerHarness {
|
|
|
16
17
|
adapter;
|
|
17
18
|
pluginRoot;
|
|
18
19
|
claudePath;
|
|
20
|
+
codexPath;
|
|
21
|
+
codexDoctorTimeoutMs;
|
|
19
22
|
runtimeMode;
|
|
20
23
|
constructor(config) {
|
|
21
24
|
this.adapter = config.adapter;
|
|
@@ -23,12 +26,103 @@ export class LearnerHarness {
|
|
|
23
26
|
this.version = config.version ?? '0.1.0-shim';
|
|
24
27
|
this.pluginRoot = config.pluginRoot ?? resolvePluginRoot();
|
|
25
28
|
this.claudePath = config.claudePath ?? 'claude';
|
|
29
|
+
this.codexPath = config.codexPath;
|
|
30
|
+
this.codexDoctorTimeoutMs = config.codexDoctorTimeoutMs;
|
|
26
31
|
this.runtimeMode = config.runtimeMode ?? 'bare';
|
|
27
32
|
}
|
|
28
|
-
|
|
33
|
+
claudeIsReady = buildClaudeIsReady({
|
|
29
34
|
getClaudePath: () => this.claudePath,
|
|
30
35
|
getContext: () => this.runtimeMode,
|
|
31
36
|
});
|
|
37
|
+
/**
|
|
38
|
+
* Readiness probe.
|
|
39
|
+
*
|
|
40
|
+
* The `LearnerHarness` shell backs two distinct CLIs: claude-code (the
|
|
41
|
+
* default) and Codex (`name === CODEX_HARNESS`). The probe MUST match the
|
|
42
|
+
* CLI actually invoked — delegating the Codex variant to the claude auth
|
|
43
|
+
* probe makes a missing/unconfigured `codex` install look always-ready and
|
|
44
|
+
* burns N/N failed claims (#348, the same-shape bug as #330).
|
|
45
|
+
*
|
|
46
|
+
* - claude-code → `buildClaudeIsReady` (shells `claude auth status`).
|
|
47
|
+
* - Codex → `probeCodexDoctor` (shells `codex --version`, then
|
|
48
|
+
* checks for `OPENAI_API_KEY` / a `codex login` auth file).
|
|
49
|
+
*/
|
|
50
|
+
async isReady(ctx) {
|
|
51
|
+
if (canonicalHarnessName(this.name) === CODEX_HARNESS) {
|
|
52
|
+
return this.codexIsReady();
|
|
53
|
+
}
|
|
54
|
+
return this.claudeIsReady(ctx);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Codex-specific readiness probe. Shells `codex --version` via the shared
|
|
58
|
+
* `probeCodexDoctor` helper (same logic the SPA precheck endpoint uses).
|
|
59
|
+
* Reports:
|
|
60
|
+
* - `installed: false` → binary not on PATH → ready=false with an install
|
|
61
|
+
* nextStep so the operator sees an actionable message instead of N/N
|
|
62
|
+
* failed claims (#348).
|
|
63
|
+
* - `exitCode !== 0` → binary exists but `codex --version` failed →
|
|
64
|
+
* ready=false pointing at the Codex precheck panel.
|
|
65
|
+
* - `authStatus: 'not_configured'` → binary runs but no `OPENAI_API_KEY`
|
|
66
|
+
* and no `codex login` session → ready=false with a sign-in nextStep.
|
|
67
|
+
* - `authStatus: 'expired'` → an `auth.json` is present but its OAuth
|
|
68
|
+
* session has expired (or the file is malformed) → ready=false with a
|
|
69
|
+
* re-login nextStep. Distinct from `not_configured` so a logged-out
|
|
70
|
+
* operator with a leftover file is not treated as ready (#366).
|
|
71
|
+
* - otherwise → ready=true.
|
|
72
|
+
*/
|
|
73
|
+
codexIsReady() {
|
|
74
|
+
const config = {};
|
|
75
|
+
if (this.codexPath !== undefined)
|
|
76
|
+
config.codexPath = this.codexPath;
|
|
77
|
+
if (this.codexDoctorTimeoutMs !== undefined) {
|
|
78
|
+
config.codexDoctorTimeoutMs = this.codexDoctorTimeoutMs;
|
|
79
|
+
}
|
|
80
|
+
const result = probeCodexDoctor(config);
|
|
81
|
+
if (!result.installed) {
|
|
82
|
+
return {
|
|
83
|
+
ready: false,
|
|
84
|
+
reason: 'codex binary not installed',
|
|
85
|
+
nextStep: {
|
|
86
|
+
description: 'Install the Codex CLI — see the Codex precheck panel in the operator dashboard for the install command.',
|
|
87
|
+
url: '/api/codex/doctor',
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (result.exitCode !== 0) {
|
|
92
|
+
const stderr = result.stderr.trim();
|
|
93
|
+
const stdout = result.stdout.trim();
|
|
94
|
+
const detail = stderr.length > 0 ? stderr : stdout;
|
|
95
|
+
return {
|
|
96
|
+
ready: false,
|
|
97
|
+
reason: `codex --version exit ${result.exitCode}${detail ? `: ${detail}` : ''}`,
|
|
98
|
+
nextStep: {
|
|
99
|
+
description: 'Run `codex --version` locally to surface the problem, or open the Codex precheck panel in the operator dashboard.',
|
|
100
|
+
url: '/api/codex/doctor',
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if (result.authStatus === 'expired') {
|
|
105
|
+
return {
|
|
106
|
+
ready: false,
|
|
107
|
+
reason: 'codex auth expired',
|
|
108
|
+
nextStep: {
|
|
109
|
+
description: 'Codex sign-in has expired — run `codex login` to refresh the session (or set OPENAI_API_KEY), then re-check the Codex precheck panel in the operator dashboard.',
|
|
110
|
+
url: '/api/codex/doctor',
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (result.authStatus !== 'ok') {
|
|
115
|
+
return {
|
|
116
|
+
ready: false,
|
|
117
|
+
reason: 'codex auth not configured',
|
|
118
|
+
nextStep: {
|
|
119
|
+
description: 'Sign in to Codex — set OPENAI_API_KEY or run `codex login`, then re-check the Codex precheck panel in the operator dashboard.',
|
|
120
|
+
url: '/api/codex/doctor',
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return { ready: true };
|
|
125
|
+
}
|
|
32
126
|
supports(spec) {
|
|
33
127
|
if (spec.role === 'evaluation')
|
|
34
128
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/learner/harness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/learner/harness.ts"],"names":[],"mappings":"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"}
|