@jinn-network/client 0.1.6 → 0.1.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/CHANGELOG.md +33 -0
- 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 +241 -54
- 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 +5 -1
- package/dist/adapters/mech/safe.js +27 -8
- package/dist/adapters/mech/safe.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/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.js +49 -0
- 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 +11 -0
- package/dist/api/gather-status.js +400 -4
- 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 +21 -16
- package/dist/api/launcher-status.js +2 -1
- package/dist/api/launcher-status.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 +68 -1
- package/dist/api/server.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +16 -0
- package/dist/api/setup-endpoints.js +78 -4
- 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 +72 -0
- package/dist/api/status-build.js +73 -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 +24 -9
- package/dist/cli/commands/solver-nets.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 +86 -9
- 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 +3 -1
- package/dist/cli/task-native-readiness.js +28 -6
- package/dist/cli/task-native-readiness.js.map +1 -1
- package/dist/config.d.ts +106 -5
- package/dist/config.js +97 -18
- 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 +19 -0
- package/dist/daemon/daemon.js +68 -1
- 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/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/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/dashboard/assets/index-BUlE8F3Y.js +330 -0
- package/dist/dashboard/assets/index-blqc7eqq.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 +26 -12
- 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 +15 -0
- 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/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 +105 -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 +15 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +54 -4
- 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 +371 -82
- package/dist/main.js.map +1 -1
- package/dist/observability/emit-event.d.ts +1 -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/restart-daemon.d.ts +90 -0
- package/dist/restart-daemon.js +95 -0
- package/dist/restart-daemon.js.map +1 -0
- 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.js +43 -3
- package/dist/solver-nets/prediction-operator-ux.js.map +1 -1
- package/dist/solver-nets/registry.d.ts +1 -0
- package/dist/solver-nets/registry.js +1 -1
- 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-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 +65 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js +243 -26
- 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 +233 -94
- 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/store/store.d.ts +15 -0
- package/dist/store/store.js +118 -3
- 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/tx-retry.d.ts +151 -19
- package/dist/tx-retry.js +286 -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 +29 -12
- package/dist/dashboard/assets/index-DOlzFN8a.css +0 -32
- package/dist/dashboard/assets/index-NkZ7CTAT.js +0 -140
|
@@ -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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"}
|
|
@@ -1,14 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolve the learner plugin root from the impl directory's
|
|
3
|
-
* runtime location.
|
|
4
|
-
*
|
|
5
|
-
* Layout assumption: this file lives at
|
|
6
|
-
* <package>/<src-or-dist>/harnesses/impls/learner/plugin-path.{ts,js}
|
|
7
|
-
* and the plugin lives at
|
|
8
|
-
* <package>/plugins/learner/
|
|
9
|
-
*
|
|
10
|
-
* Walks up four directories from this file (impls → harness → src/dist →
|
|
11
|
-
* package root) then descends into plugins/learner/. Verifies the
|
|
12
|
-
* expected layout exists and throws with a clear message if not.
|
|
13
|
-
*/
|
|
14
1
|
export declare function resolvePluginRoot(): string;
|
|
@@ -2,29 +2,49 @@ import { existsSync } from 'node:fs';
|
|
|
2
2
|
import { dirname, join, resolve } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
/**
|
|
5
|
-
* Resolve the learner plugin root from the impl directory's
|
|
6
|
-
* runtime location.
|
|
5
|
+
* Resolve the learner plugin root from the impl directory's runtime location.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
* <package
|
|
10
|
-
* and the plugin
|
|
11
|
-
* <package>/plugins/learner/
|
|
7
|
+
* Canonical layout (compiled): this file lives at
|
|
8
|
+
* <package>/dist/harnesses/impls/learner/plugin-path.js
|
|
9
|
+
* and the plugin tree is co-located inside dist/:
|
|
10
|
+
* <package>/dist/plugins/learner/
|
|
12
11
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
12
|
+
* The build step copies plugins/learner → dist/plugins/learner so the
|
|
13
|
+
* compiled code and the plugin runtime assets are always version-locked
|
|
14
|
+
* within the same dist/ tree — for published npm installs and source
|
|
15
|
+
* checkouts alike (after `yarn build`).
|
|
16
|
+
*
|
|
17
|
+
* Source-checkout / tsx path (e.g. vitest): this file lives at
|
|
18
|
+
* <package>/src/harnesses/impls/learner/plugin-path.ts
|
|
19
|
+
* Walking up four directories reaches the package root, and the plugin
|
|
20
|
+
* lives at <package>/plugins/learner/.
|
|
21
|
+
*
|
|
22
|
+
* Detection: if the resolved path three levels up ends with `/dist` the
|
|
23
|
+
* runtime is inside a compiled dist tree; otherwise fall back to the
|
|
24
|
+
* package-root layout (four levels up).
|
|
16
25
|
*/
|
|
26
|
+
function requireAsset(pluginRoot, relative, hint) {
|
|
27
|
+
if (!existsSync(join(pluginRoot, relative))) {
|
|
28
|
+
const suffix = hint ? ` — ${hint}` : '';
|
|
29
|
+
throw new Error(`learner plugin at ${pluginRoot} is missing ${relative}${suffix}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
17
32
|
export function resolvePluginRoot() {
|
|
18
33
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
19
|
-
const
|
|
20
|
-
|
|
34
|
+
const threeUp = resolve(here, '..', '..', '..');
|
|
35
|
+
// Compiled dist layout: dist/harnesses/impls/learner → dist/ → dist/plugins/learner
|
|
36
|
+
const isDistTree = threeUp.endsWith('/dist');
|
|
37
|
+
const pluginRoot = isDistTree
|
|
38
|
+
? join(threeUp, 'plugins', 'learner')
|
|
39
|
+
: join(resolve(here, '..', '..', '..', '..'), 'plugins', 'learner');
|
|
21
40
|
if (!existsSync(pluginRoot)) {
|
|
22
41
|
throw new Error(`learner plugin not found at expected path: ${pluginRoot}. ` +
|
|
23
|
-
`Resolved from impl dir: ${here}
|
|
24
|
-
|
|
25
|
-
if (!existsSync(join(pluginRoot, 'skills', 'learn', 'SKILL.md'))) {
|
|
26
|
-
throw new Error(`learner plugin at ${pluginRoot} is missing skills/learn/SKILL.md`);
|
|
42
|
+
`Resolved from impl dir: ${here}. ` +
|
|
43
|
+
`Run \`yarn build\` to copy plugins/learner into dist/plugins/learner.`);
|
|
27
44
|
}
|
|
45
|
+
requireAsset(pluginRoot, 'skills/learn/SKILL.md');
|
|
46
|
+
requireAsset(pluginRoot, 'hooks/session-start', 'plugin assets may be stale or incomplete; rebuild the plugin');
|
|
47
|
+
requireAsset(pluginRoot, 'hooks/hooks.json', 'plugin assets may be stale or incomplete; rebuild the plugin');
|
|
28
48
|
return pluginRoot;
|
|
29
49
|
}
|
|
30
50
|
//# sourceMappingURL=plugin-path.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-path.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/learner/plugin-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC
|
|
1
|
+
{"version":3,"file":"plugin-path.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/learner/plugin-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAS,YAAY,CAAC,UAAkB,EAAE,QAAgB,EAAE,IAAa;IACvE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,eAAe,QAAQ,GAAG,MAAM,EAAE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAEhD,oFAAoF;IACpF,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,UAAU;QAC3B,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;QACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAEtE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,8CAA8C,UAAU,IAAI;YAC1D,2BAA2B,IAAI,IAAI;YACnC,uEAAuE,CAC1E,CAAC;IACJ,CAAC;IACD,YAAY,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;IAClD,YAAY,CAAC,UAAU,EAAE,qBAAqB,EAAE,8DAA8D,CAAC,CAAC;IAChH,YAAY,CAAC,UAAU,EAAE,kBAAkB,EAAE,8DAA8D,CAAC,CAAC;IAC7G,OAAO,UAAU,CAAC;AACpB,CAAC"}
|