@jinn-network/client 0.1.5 → 0.1.6-canary.118cd4d0
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 +98 -0
- package/dist/adapters/mech/adapter.js +7 -7
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/ipfs-pinfile.d.ts +22 -0
- package/dist/adapters/mech/ipfs-pinfile.js +54 -0
- package/dist/adapters/mech/ipfs-pinfile.js.map +1 -0
- package/dist/adapters/mech/ipfs.d.ts +1 -0
- package/dist/adapters/mech/ipfs.js +24 -1
- package/dist/adapters/mech/ipfs.js.map +1 -1
- package/dist/api/bootstrap-endpoint.js +14 -1
- package/dist/api/bootstrap-endpoint.js.map +1 -1
- package/dist/api/discovery-endpoint.d.ts +31 -0
- package/dist/api/discovery-endpoint.js +78 -0
- package/dist/api/discovery-endpoint.js.map +1 -0
- package/dist/api/fleet-build.d.ts +7 -0
- package/dist/api/fleet-build.js +6 -1
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/gather-status.js +20 -3
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/harness-readiness-endpoint.d.ts +25 -0
- package/dist/api/harness-readiness-endpoint.js +24 -0
- package/dist/api/harness-readiness-endpoint.js.map +1 -0
- package/dist/api/hermes-doctor-endpoint.d.ts +26 -0
- package/dist/api/hermes-doctor-endpoint.js +29 -0
- package/dist/api/hermes-doctor-endpoint.js.map +1 -0
- package/dist/api/server.d.ts +43 -0
- package/dist/api/server.js +39 -0
- package/dist/api/server.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +5 -0
- package/dist/api/setup-endpoints.js +24 -5
- package/dist/api/setup-endpoints.js.map +1 -1
- package/dist/build-info.json +4 -4
- package/dist/build-meta.json +1 -1
- package/dist/cli/commands/auth.js +3 -1
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/create.d.ts +5 -3
- package/dist/cli/commands/create.js +101 -36
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/solver-nets.d.ts +19 -0
- package/dist/cli/commands/solver-nets.js +140 -2
- package/dist/cli/commands/solver-nets.js.map +1 -1
- package/dist/cli/commands/solver-plugins-publish.d.ts +31 -0
- package/dist/cli/commands/solver-plugins-publish.js +169 -0
- package/dist/cli/commands/solver-plugins-publish.js.map +1 -0
- package/dist/cli/commands/solver-plugins-revoke.d.ts +15 -0
- package/dist/cli/commands/solver-plugins-revoke.js +91 -0
- package/dist/cli/commands/solver-plugins-revoke.js.map +1 -0
- package/dist/cli/commands/solver-plugins.d.ts +50 -6
- package/dist/cli/commands/solver-plugins.js +205 -68
- package/dist/cli/commands/solver-plugins.js.map +1 -1
- package/dist/config.d.ts +27 -0
- package/dist/config.js +30 -2
- package/dist/config.js.map +1 -1
- package/dist/conformance/checks/hash-signature.js +6 -2
- package/dist/conformance/checks/hash-signature.js.map +1 -1
- package/dist/conformance/checks/payload.js +4 -2
- package/dist/conformance/checks/payload.js.map +1 -1
- package/dist/conformance/checks/verdict.d.ts +10 -10
- package/dist/conformance/checks/verdict.js +16 -15
- package/dist/conformance/checks/verdict.js.map +1 -1
- package/dist/conformance/harness.d.ts +1 -1
- package/dist/conformance/harness.js +16 -9
- package/dist/conformance/harness.js.map +1 -1
- package/dist/conformance/types.d.ts +10 -3
- package/dist/conformance/types.js.map +1 -1
- package/dist/corpus/acquire.d.ts +1 -3
- package/dist/corpus/acquire.js.map +1 -1
- package/dist/corpus/envelope-projection.d.ts +1 -1
- package/dist/corpus/envelope-projection.js +14 -7
- package/dist/corpus/envelope-projection.js.map +1 -1
- package/dist/corpus/index.d.ts +2 -1
- package/dist/corpus/index.js.map +1 -1
- package/dist/corpus/prediction-brier-scoreboard-report.js +1 -1
- package/dist/corpus/prediction-brier-scoreboard-report.js.map +1 -1
- package/dist/corpus/prediction-brier-scoreboard.js +3 -1
- package/dist/corpus/prediction-brier-scoreboard.js.map +1 -1
- package/dist/corpus/types.d.ts +2 -2
- package/dist/daemon/daemon.d.ts +17 -1
- package/dist/daemon/daemon.js +15 -0
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/freeze-fence.js +6 -3
- package/dist/daemon/freeze-fence.js.map +1 -1
- package/dist/daemon/readiness-gate.d.ts +30 -0
- package/dist/daemon/readiness-gate.js +31 -0
- package/dist/daemon/readiness-gate.js.map +1 -0
- package/dist/dashboard/assets/{index-D_NMfDfV.css → index-DOlzFN8a.css} +1 -1
- package/dist/dashboard/assets/index-NkZ7CTAT.js +140 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/discovery/http.js +121 -0
- package/dist/discovery/http.js.map +1 -1
- package/dist/discovery/onchain.js +11 -0
- package/dist/discovery/onchain.js.map +1 -1
- package/dist/discovery/types.d.ts +112 -0
- package/dist/discovery/types.js.map +1 -1
- package/dist/discovery/with-fallback.js +9 -0
- package/dist/discovery/with-fallback.js.map +1 -1
- package/dist/earning/agent-wallet-binding.d.ts +20 -1
- package/dist/earning/agent-wallet-binding.js +54 -16
- package/dist/earning/agent-wallet-binding.js.map +1 -1
- package/dist/earning/bootstrap.d.ts +119 -0
- package/dist/earning/bootstrap.js +482 -16
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.js +9 -1
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/funding-plan.js +15 -2
- package/dist/earning/funding-plan.js.map +1 -1
- package/dist/earning/store.js +48 -1
- package/dist/earning/store.js.map +1 -1
- package/dist/earning/types.d.ts +30 -0
- package/dist/earning/types.js +37 -0
- package/dist/earning/types.js.map +1 -1
- package/dist/erc8004/abis.d.ts +64 -0
- package/dist/erc8004/abis.js +48 -0
- package/dist/erc8004/abis.js.map +1 -1
- package/dist/erc8004/plugin-registry.d.ts +102 -0
- package/dist/erc8004/plugin-registry.js +165 -0
- package/dist/erc8004/plugin-registry.js.map +1 -0
- package/dist/events/types.d.ts +2 -2
- package/dist/harnesses/engine/engine.js +15 -3
- package/dist/harnesses/engine/engine.js.map +1 -1
- package/dist/harnesses/engine/envelope-assembly.d.ts +2 -2
- package/dist/harnesses/engine/envelope-assembly.js +4 -2
- package/dist/harnesses/engine/envelope-assembly.js.map +1 -1
- package/dist/harnesses/freeze.d.ts +4 -1
- package/dist/harnesses/freeze.js +12 -2
- package/dist/harnesses/freeze.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/index.d.ts +4 -1
- package/dist/harnesses/impls/claude-mcp-prediction/index.js +7 -2
- package/dist/harnesses/impls/claude-mcp-prediction/index.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.d.ts +4 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js +7 -2
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js.map +1 -1
- package/dist/harnesses/impls/evaluation-context.d.ts +15 -4
- package/dist/harnesses/impls/evaluation-context.js +24 -8
- package/dist/harnesses/impls/evaluation-context.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/adapter.d.ts +34 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js +205 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +18 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js +231 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/config-builder.d.ts +49 -0
- package/dist/harnesses/impls/hermes-agent/config-builder.js +104 -0
- package/dist/harnesses/impls/hermes-agent/config-builder.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/harness.d.ts +30 -0
- package/dist/harnesses/impls/hermes-agent/harness.js +52 -0
- package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/index.d.ts +5 -0
- package/dist/harnesses/impls/hermes-agent/index.js +7 -0
- package/dist/harnesses/impls/hermes-agent/index.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/prompt.d.ts +15 -0
- package/dist/harnesses/impls/hermes-agent/prompt.js +37 -0
- package/dist/harnesses/impls/hermes-agent/prompt.js.map +1 -0
- package/dist/harnesses/impls/index.d.ts +6 -0
- package/dist/harnesses/impls/index.js +17 -4
- package/dist/harnesses/impls/index.js.map +1 -1
- package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-code.js +13 -34
- package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -0
- package/dist/harnesses/impls/learner/adapters/codex-workspace.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/harness.d.ts +9 -3
- package/dist/harnesses/impls/{claude-code-learner → learner}/harness.js +24 -1
- package/dist/harnesses/impls/learner/harness.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/harvest.js +15 -3
- package/dist/harnesses/impls/learner/harvest.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/index.d.ts +5 -5
- package/dist/harnesses/impls/{claude-code-learner → learner}/index.js +4 -4
- package/dist/harnesses/impls/learner/index.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/plugin-path.d.ts +4 -4
- package/dist/harnesses/impls/{claude-code-learner → learner}/plugin-path.js +7 -7
- package/dist/harnesses/impls/learner/plugin-path.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/restoration-patch.js +3 -1
- package/dist/harnesses/impls/learner/restoration-patch.js.map +1 -0
- package/dist/harnesses/impls/learner/test-utils/fake-plugin-outputs.js.map +1 -0
- package/dist/harnesses/impls/learner/test-utils/noop-adapter.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/types.d.ts +12 -2
- package/dist/harnesses/impls/learner/types.js.map +1 -0
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js +13 -12
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js +7 -7
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.d.ts +3 -3
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.js +7 -6
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.js.map +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/checks/integrity.js +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/index.js +11 -10
- package/dist/harnesses/impls/prediction-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-v1-evaluator/index.js +11 -10
- package/dist/harnesses/impls/prediction-v1-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.d.ts +1 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +10 -2
- 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 +24 -5
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +104 -4
- 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 +9 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +25 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
- package/dist/harnesses/names.d.ts +1 -0
- package/dist/harnesses/names.js +3 -0
- package/dist/harnesses/names.js.map +1 -1
- package/dist/harnesses/readiness-registry.d.ts +48 -0
- package/dist/harnesses/readiness-registry.js +136 -0
- package/dist/harnesses/readiness-registry.js.map +1 -0
- package/dist/harnesses/types.d.ts +7 -0
- package/dist/main.d.ts +14 -0
- package/dist/main.js +112 -37
- package/dist/main.js.map +1 -1
- package/dist/mcp/server.js +14 -13
- package/dist/mcp/server.js.map +1 -1
- package/dist/operator-errors.js +13 -1
- package/dist/operator-errors.js.map +1 -1
- package/dist/preflight/claude-auth.d.ts +18 -0
- package/dist/preflight/claude-auth.js +38 -0
- package/dist/preflight/claude-auth.js.map +1 -1
- package/dist/scripts/donation-consumption-acceptance.js +1 -1
- package/dist/scripts/donation-consumption-acceptance.js.map +1 -1
- package/dist/scripts/swe-rebench-v2-known-bad.json +12 -0
- package/dist/scripts/swe-rebench-v2-seed-pool.json +26 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.d.ts +52 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.js +76 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +38 -12
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js +136 -27
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
- package/dist/solver-types/swe-rebench-v2-auto.d.ts +6 -0
- package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
- package/dist/solver-types/swe-rebench-v2.d.ts +1 -0
- package/dist/solver-types/swe-rebench-v2.js +19 -6
- package/dist/solver-types/swe-rebench-v2.js.map +1 -1
- package/dist/store/store.js +12 -4
- package/dist/store/store.js.map +1 -1
- package/dist/templates/plugins/runtime-plugin/.mcp.json.tmpl +8 -0
- package/dist/templates/plugins/runtime-plugin/README.md.tmpl +30 -0
- package/dist/templates/plugins/runtime-plugin/gitignore.tmpl +3 -0
- package/dist/templates/plugins/runtime-plugin/jinn.plugin.json.tmpl +21 -0
- package/dist/templates/plugins/runtime-plugin/mcp/server.mjs.tmpl +33 -0
- package/dist/templates/plugins/runtime-plugin/package.json.tmpl +15 -0
- package/dist/templates/plugins/runtime-plugin/test/plugin.test.ts.tmpl +35 -0
- package/dist/templates/plugins/runtime-plugin/tsconfig.json.tmpl +11 -0
- package/dist/templates/plugins/solver-type-plugin/README.md.tmpl +35 -0
- package/dist/templates/plugins/solver-type-plugin/gitignore.tmpl +3 -0
- package/dist/templates/plugins/solver-type-plugin/jinn.plugin.json.tmpl +11 -0
- package/dist/templates/plugins/solver-type-plugin/package.json.tmpl +15 -0
- package/dist/templates/plugins/solver-type-plugin/skills/example/SKILL.md.tmpl +10 -0
- package/dist/templates/plugins/solver-type-plugin/test/plugin.test.ts.tmpl +25 -0
- package/dist/templates/plugins/solver-type-plugin/tsconfig.json.tmpl +11 -0
- package/dist/tx-retry.d.ts +13 -0
- package/dist/tx-retry.js +22 -0
- package/dist/tx-retry.js.map +1 -1
- package/dist/types/envelope.d.ts +28 -21
- package/dist/types/envelope.js +8 -3
- package/dist/types/envelope.js.map +1 -1
- package/dist/types/payloads/index.d.ts +2 -2
- package/dist/types/payloads/index.js +13 -12
- package/dist/types/payloads/index.js.map +1 -1
- package/dist/types/payloads/portfolio-v0.d.ts +60 -10
- package/dist/types/payloads/portfolio-v0.js +16 -6
- package/dist/types/payloads/portfolio-v0.js.map +1 -1
- package/dist/types/payloads/prediction-apy-v0.d.ts +52 -10
- package/dist/types/payloads/prediction-apy-v0.js +16 -6
- package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
- package/dist/types/payloads/prediction-v0.d.ts +49 -10
- package/dist/types/payloads/prediction-v0.js +16 -6
- package/dist/types/payloads/prediction-v0.js.map +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +45 -6
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +16 -6
- package/dist/x402/handler.js +51 -20
- package/dist/x402/handler.js.map +1 -1
- package/package.json +11 -3
- package/plugins/swe-rebench-v2-diffmin/.claude-plugin/plugin.json +5 -0
- package/plugins/swe-rebench-v2-diffmin/.mcp.json +8 -0
- package/plugins/swe-rebench-v2-diffmin/README.md +69 -0
- package/plugins/swe-rebench-v2-diffmin/jinn.plugin.json +12 -0
- package/plugins/swe-rebench-v2-diffmin/mcp/diff-stats-server.mjs +72 -0
- package/plugins/swe-rebench-v2-diffmin/mcp/diff-stats.mjs +48 -0
- package/plugins/swe-rebench-v2-diffmin/package.json +19 -0
- package/plugins/swe-rebench-v2-diffmin/skills/diffmin/SKILL.md +116 -0
- package/plugins/swe-rebench-v2-diffmin/skills/test-map/SKILL.md +126 -0
- package/plugins/swe-rebench-v2-diffmin/test/diff-stats.test.ts +62 -0
- package/plugins/swe-rebench-v2-diffmin/test/manifest.test.ts +53 -0
- package/plugins/swe-rebench-v2-diffmin/tsconfig.json +12 -0
- package/plugins/swe-rebench-v2-runtime/README.md +13 -0
- package/plugins/swe-rebench-v2-runtime/skills/orient/SKILL.md +7 -3
- package/plugins/swe-rebench-v2-runtime/skills/plan/SKILL.md +6 -17
- package/templates/plugins/runtime-plugin/.mcp.json.tmpl +8 -0
- package/templates/plugins/runtime-plugin/README.md.tmpl +30 -0
- package/templates/plugins/runtime-plugin/gitignore.tmpl +3 -0
- package/templates/plugins/runtime-plugin/jinn.plugin.json.tmpl +21 -0
- package/templates/plugins/runtime-plugin/mcp/server.mjs.tmpl +33 -0
- package/templates/plugins/runtime-plugin/package.json.tmpl +15 -0
- package/templates/plugins/runtime-plugin/test/plugin.test.ts.tmpl +35 -0
- package/templates/plugins/runtime-plugin/tsconfig.json.tmpl +11 -0
- package/templates/plugins/solver-type-plugin/README.md.tmpl +35 -0
- package/templates/plugins/solver-type-plugin/gitignore.tmpl +3 -0
- package/templates/plugins/solver-type-plugin/jinn.plugin.json.tmpl +11 -0
- package/templates/plugins/solver-type-plugin/package.json.tmpl +15 -0
- package/templates/plugins/solver-type-plugin/skills/example/SKILL.md.tmpl +10 -0
- package/templates/plugins/solver-type-plugin/test/plugin.test.ts.tmpl +25 -0
- package/templates/plugins/solver-type-plugin/tsconfig.json.tmpl +11 -0
- package/dist/dashboard/assets/index-BjtltOGc.js +0 -76
- package/dist/harnesses/impls/claude-code-learner/adapters/claude-code.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/adapters/codex-code.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/adapters/codex-workspace.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/harness.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/harvest.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/index.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/plugin-path.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/restoration-patch.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/test-utils/fake-plugin-outputs.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/test-utils/noop-adapter.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/types.js.map +0 -1
- package/dist/preflight/claude-required.d.ts +0 -8
- package/dist/preflight/claude-required.js +0 -17
- package/dist/preflight/claude-required.js.map +0 -1
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/claude-code.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/claude-code.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-code.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-workspace.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-workspace.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/harvest.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/restoration-patch.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/fake-plugin-outputs.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/fake-plugin-outputs.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/noop-adapter.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/noop-adapter.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/types.js +0 -0
- /package/plugins/{claude-code-learner → learner}/.claude-plugin/plugin.json +0 -0
- /package/plugins/{claude-code-learner → learner}/.codex-plugin/plugin.json +0 -0
- /package/plugins/{claude-code-learner → learner}/AGENTS.md +0 -0
- /package/plugins/{claude-code-learner → learner}/CLAUDE.md +0 -0
- /package/plugins/{claude-code-learner → learner}/README.md +0 -0
- /package/plugins/{claude-code-learner → learner}/hooks/hooks.json +0 -0
- /package/plugins/{claude-code-learner → learner}/hooks/session-start +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/SKILL.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/analyst-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/consolidator-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/explorer-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/planner-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/promoter-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/step-worker-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/strategist-prompt.md +0 -0
|
@@ -9,16 +9,40 @@
|
|
|
9
9
|
* silently grading against a missing instance.
|
|
10
10
|
*/
|
|
11
11
|
const DEFAULT_BASE_URL = 'https://datasets-server.huggingface.co/rows';
|
|
12
|
+
const DEFAULT_RETRY_BACKOFF_MS = [200, 800, 3200];
|
|
12
13
|
export class HttpHfFetcher {
|
|
13
14
|
baseUrl;
|
|
14
15
|
pageSize;
|
|
15
16
|
maxRows;
|
|
16
17
|
fetchImpl;
|
|
18
|
+
retryBackoffMs;
|
|
17
19
|
constructor(opts = {}) {
|
|
18
20
|
this.baseUrl = opts.baseUrl ?? DEFAULT_BASE_URL;
|
|
19
21
|
this.pageSize = Math.min(opts.pageSize ?? 100, 100);
|
|
20
22
|
this.maxRows = opts.maxRows ?? 1000;
|
|
21
23
|
this.fetchImpl = opts.fetchImpl ?? fetch.bind(globalThis);
|
|
24
|
+
this.retryBackoffMs = opts.retryBackoffMs ?? DEFAULT_RETRY_BACKOFF_MS;
|
|
25
|
+
}
|
|
26
|
+
async fetchWithRetry(url) {
|
|
27
|
+
let lastErr = null;
|
|
28
|
+
for (let attempt = 0; attempt <= this.retryBackoffMs.length; attempt += 1) {
|
|
29
|
+
try {
|
|
30
|
+
const res = await this.fetchImpl(url);
|
|
31
|
+
if (res.ok || (res.status >= 400 && res.status < 500))
|
|
32
|
+
return res;
|
|
33
|
+
// 5xx → retry-eligible
|
|
34
|
+
lastErr = new Error(`HF returned ${res.status}`);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
lastErr = err;
|
|
38
|
+
}
|
|
39
|
+
if (attempt < this.retryBackoffMs.length) {
|
|
40
|
+
await new Promise((r) => setTimeout(r, this.retryBackoffMs[attempt]));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (lastErr instanceof Error)
|
|
44
|
+
throw lastErr;
|
|
45
|
+
throw new Error('HF fetch failed after retries');
|
|
22
46
|
}
|
|
23
47
|
async fetchTaskRow(args) {
|
|
24
48
|
let offset = 0;
|
|
@@ -29,7 +53,7 @@ export class HttpHfFetcher {
|
|
|
29
53
|
url.searchParams.set('split', args.hf_split);
|
|
30
54
|
url.searchParams.set('offset', String(offset));
|
|
31
55
|
url.searchParams.set('length', String(this.pageSize));
|
|
32
|
-
const res = await this.
|
|
56
|
+
const res = await this.fetchWithRetry(url.toString());
|
|
33
57
|
if (!res.ok) {
|
|
34
58
|
throw new Error(`HF datasets-server returned ${res.status} for ${args.hf_dataset}/${args.hf_split}`);
|
|
35
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hf-fetcher.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"hf-fetcher.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const CLAUDE_CODE_HARNESS = "claude-code";
|
|
2
2
|
export declare const CODEX_HARNESS = "codex";
|
|
3
|
+
export declare const HERMES_AGENT_HARNESS = "hermes-agent";
|
|
3
4
|
export declare function canonicalHarnessName(name: string): string;
|
|
4
5
|
export declare function harnessNameMatches(candidate: string, requested: string): boolean;
|
|
5
6
|
export declare function canonicalHarnessNameSet(names: readonly string[]): Set<string>;
|
package/dist/harnesses/names.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export const CLAUDE_CODE_HARNESS = 'claude-code';
|
|
2
2
|
export const CODEX_HARNESS = 'codex';
|
|
3
|
+
export const HERMES_AGENT_HARNESS = 'hermes-agent';
|
|
3
4
|
const HARNESS_ALIASES = {
|
|
4
5
|
'claude-code-learner': CLAUDE_CODE_HARNESS,
|
|
5
6
|
'codex-code-learner': CODEX_HARNESS,
|
|
@@ -19,6 +20,8 @@ export function harnessStateDirName(name) {
|
|
|
19
20
|
return 'claude-code-learner';
|
|
20
21
|
if (canonical === CODEX_HARNESS)
|
|
21
22
|
return 'codex-code-learner';
|
|
23
|
+
if (canonical === HERMES_AGENT_HARNESS)
|
|
24
|
+
return 'hermes-agent';
|
|
22
25
|
return canonical;
|
|
23
26
|
}
|
|
24
27
|
//# sourceMappingURL=names.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/harnesses/names.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AACjD,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/harnesses/names.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AACjD,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AACrC,MAAM,CAAC,MAAM,oBAAoB,GAAG,cAAc,CAAC;AAEnD,MAAM,eAAe,GAA2B;IAC9C,qBAAqB,EAAE,mBAAmB;IAC1C,oBAAoB,EAAE,aAAa;CACpC,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,SAAiB;IACrE,OAAO,oBAAoB,CAAC,SAAS,CAAC,KAAK,oBAAoB,CAAC,SAAS,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAwB;IAC9D,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,SAAS,KAAK,mBAAmB;QAAE,OAAO,qBAAqB,CAAC;IACpE,IAAI,SAAS,KAAK,aAAa;QAAE,OAAO,oBAAoB,CAAC;IAC7D,IAAI,SAAS,KAAK,oBAAoB;QAAE,OAAO,cAAc,CAAC;IAC9D,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HarnessReadinessRegistry — per-harness Harness.isReady() composition for the
|
|
3
|
+
* daemon's claim loops and the SPA's per-harness setup cards.
|
|
4
|
+
*
|
|
5
|
+
* See docs/superpowers/specs/2026-05-15-per-harness-auth-design.md.
|
|
6
|
+
*
|
|
7
|
+
* Single writer: the background refresh tick. Readers (claim loops + the
|
|
8
|
+
* /v1/harnesses/readiness endpoint) read the cached snapshot lock-free.
|
|
9
|
+
* Bounded staleness = tickIntervalMs.
|
|
10
|
+
*/
|
|
11
|
+
import type { Harness, ReadyStatus } from './types.js';
|
|
12
|
+
export interface JoinedHarnessSpec {
|
|
13
|
+
harnessName: string;
|
|
14
|
+
roles: Array<'solver' | 'evaluator'>;
|
|
15
|
+
}
|
|
16
|
+
export interface HarnessReadinessSnapshot {
|
|
17
|
+
lastRefreshedAt: string;
|
|
18
|
+
harnesses: Array<{
|
|
19
|
+
harnessName: string;
|
|
20
|
+
manifestCids: string[];
|
|
21
|
+
ready: boolean;
|
|
22
|
+
reason?: string;
|
|
23
|
+
nextStep?: ReadyStatus['nextStep'];
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export interface HarnessReadinessRegistryOptions {
|
|
27
|
+
/** Harness instances indexed by Harness.name. */
|
|
28
|
+
harnessesByName: Record<string, Harness>;
|
|
29
|
+
/** joinedSolverNets shape, narrowed to harness lookup. */
|
|
30
|
+
joinedHarnessesByCid: Record<string, JoinedHarnessSpec>;
|
|
31
|
+
/** Background refresh interval (ms). Default 4000 (matches existing Claude auth poll cadence). */
|
|
32
|
+
tickIntervalMs?: number;
|
|
33
|
+
/** Per-isReady() timeout (ms). Default 5000. */
|
|
34
|
+
isReadyTimeoutMs?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare class HarnessReadinessRegistry {
|
|
37
|
+
private readonly opts;
|
|
38
|
+
private snapshot;
|
|
39
|
+
private timer;
|
|
40
|
+
private refreshInFlight;
|
|
41
|
+
constructor(opts: HarnessReadinessRegistryOptions);
|
|
42
|
+
start(): void;
|
|
43
|
+
stop(): void;
|
|
44
|
+
getSnapshot(): HarnessReadinessSnapshot;
|
|
45
|
+
isReadyForClaim(manifestCid: string): ReadyStatus;
|
|
46
|
+
refreshNow(): Promise<void>;
|
|
47
|
+
private _doRefresh;
|
|
48
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HarnessReadinessRegistry — per-harness Harness.isReady() composition for the
|
|
3
|
+
* daemon's claim loops and the SPA's per-harness setup cards.
|
|
4
|
+
*
|
|
5
|
+
* See docs/superpowers/specs/2026-05-15-per-harness-auth-design.md.
|
|
6
|
+
*
|
|
7
|
+
* Single writer: the background refresh tick. Readers (claim loops + the
|
|
8
|
+
* /v1/harnesses/readiness endpoint) read the cached snapshot lock-free.
|
|
9
|
+
* Bounded staleness = tickIntervalMs.
|
|
10
|
+
*/
|
|
11
|
+
const DEFAULT_TICK_INTERVAL_MS = 4_000;
|
|
12
|
+
const DEFAULT_IS_READY_TIMEOUT_MS = 5_000;
|
|
13
|
+
export class HarnessReadinessRegistry {
|
|
14
|
+
opts;
|
|
15
|
+
snapshot = {
|
|
16
|
+
lastRefreshedAt: new Date(0).toISOString(),
|
|
17
|
+
harnesses: [],
|
|
18
|
+
};
|
|
19
|
+
timer = null;
|
|
20
|
+
refreshInFlight = false;
|
|
21
|
+
constructor(opts) {
|
|
22
|
+
this.opts = {
|
|
23
|
+
tickIntervalMs: opts.tickIntervalMs ?? DEFAULT_TICK_INTERVAL_MS,
|
|
24
|
+
isReadyTimeoutMs: opts.isReadyTimeoutMs ?? DEFAULT_IS_READY_TIMEOUT_MS,
|
|
25
|
+
harnessesByName: opts.harnessesByName,
|
|
26
|
+
joinedHarnessesByCid: opts.joinedHarnessesByCid,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
start() {
|
|
30
|
+
if (this.timer)
|
|
31
|
+
return;
|
|
32
|
+
this.timer = setInterval(() => { void this.refreshNow(); }, this.opts.tickIntervalMs);
|
|
33
|
+
}
|
|
34
|
+
stop() {
|
|
35
|
+
if (this.timer) {
|
|
36
|
+
clearInterval(this.timer);
|
|
37
|
+
this.timer = null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
getSnapshot() {
|
|
41
|
+
return this.snapshot;
|
|
42
|
+
}
|
|
43
|
+
isReadyForClaim(manifestCid) {
|
|
44
|
+
const joined = this.opts.joinedHarnessesByCid[manifestCid];
|
|
45
|
+
if (!joined) {
|
|
46
|
+
return {
|
|
47
|
+
ready: false,
|
|
48
|
+
reason: `manifestCid ${manifestCid} not in joinedSolverNets`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const entry = this.snapshot.harnesses.find((h) => h.harnessName === joined.harnessName);
|
|
52
|
+
if (!entry) {
|
|
53
|
+
return { ready: false, reason: 'readiness snapshot not yet populated' };
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
ready: entry.ready,
|
|
57
|
+
reason: entry.reason,
|
|
58
|
+
nextStep: entry.nextStep,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async refreshNow() {
|
|
62
|
+
if (this.refreshInFlight)
|
|
63
|
+
return;
|
|
64
|
+
this.refreshInFlight = true;
|
|
65
|
+
try {
|
|
66
|
+
await this._doRefresh();
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
this.refreshInFlight = false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async _doRefresh() {
|
|
73
|
+
// Group joined entries by harnessName so we only call isReady() once per harness.
|
|
74
|
+
const harnessToCids = new Map();
|
|
75
|
+
for (const [cid, joined] of Object.entries(this.opts.joinedHarnessesByCid)) {
|
|
76
|
+
const list = harnessToCids.get(joined.harnessName) ?? [];
|
|
77
|
+
list.push(cid);
|
|
78
|
+
harnessToCids.set(joined.harnessName, list);
|
|
79
|
+
}
|
|
80
|
+
const results = await Promise.all(Array.from(harnessToCids.entries()).map(async ([name, cids]) => {
|
|
81
|
+
const harness = this.opts.harnessesByName[name];
|
|
82
|
+
if (!harness) {
|
|
83
|
+
return {
|
|
84
|
+
harnessName: name,
|
|
85
|
+
manifestCids: cids,
|
|
86
|
+
ready: false,
|
|
87
|
+
reason: `harness ${name} not registered in this daemon build`,
|
|
88
|
+
nextStep: {
|
|
89
|
+
description: 'Upgrade daemon or change SolverNet harness selection',
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (!harness.isReady) {
|
|
94
|
+
// No isReady → treat as always-ready (matches existing default).
|
|
95
|
+
return {
|
|
96
|
+
harnessName: name,
|
|
97
|
+
manifestCids: cids,
|
|
98
|
+
ready: true,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
let timeoutHandle;
|
|
103
|
+
const status = await Promise.race([
|
|
104
|
+
harness.isReady({ solverType: '*' }),
|
|
105
|
+
new Promise((_, reject) => {
|
|
106
|
+
timeoutHandle = setTimeout(() => reject(new Error('isReady timed out')), this.opts.isReadyTimeoutMs);
|
|
107
|
+
}),
|
|
108
|
+
]).finally(() => {
|
|
109
|
+
if (timeoutHandle !== undefined)
|
|
110
|
+
clearTimeout(timeoutHandle);
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
harnessName: name,
|
|
114
|
+
manifestCids: cids,
|
|
115
|
+
ready: status.ready,
|
|
116
|
+
reason: status.reason,
|
|
117
|
+
nextStep: status.nextStep,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
122
|
+
return {
|
|
123
|
+
harnessName: name,
|
|
124
|
+
manifestCids: cids,
|
|
125
|
+
ready: false,
|
|
126
|
+
reason: `isReady threw: ${msg}`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
this.snapshot = {
|
|
131
|
+
lastRefreshedAt: new Date().toISOString(),
|
|
132
|
+
harnesses: results,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=readiness-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness-registry.js","sourceRoot":"","sources":["../../src/harnesses/readiness-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -210,6 +210,13 @@ export interface Harness {
|
|
|
210
210
|
name: string;
|
|
211
211
|
/** semver */
|
|
212
212
|
version: string;
|
|
213
|
+
/**
|
|
214
|
+
* Optional implStateDir paths that are runtime-only and should not contribute
|
|
215
|
+
* to the frozen-mode state digest. Use this for generated credentials,
|
|
216
|
+
* binaries, or per-task config that a harness needs in ctx.implStateDir but
|
|
217
|
+
* that is not part of its learning/code surface.
|
|
218
|
+
*/
|
|
219
|
+
freezeStateHashIgnore?: readonly string[];
|
|
213
220
|
/**
|
|
214
221
|
* Return true if this Harness should handle the given (solverType, role) pair.
|
|
215
222
|
*
|
package/dist/main.d.ts
CHANGED
|
@@ -19,6 +19,9 @@
|
|
|
19
19
|
* jinn run
|
|
20
20
|
*/
|
|
21
21
|
import { type ErrorEnvelope } from './errors/envelope.js';
|
|
22
|
+
import type { Harness } from './harnesses/types.js';
|
|
23
|
+
import { HarnessReadinessRegistry } from './harnesses/readiness-registry.js';
|
|
24
|
+
import type { JinnConfig } from './config.js';
|
|
22
25
|
export interface DaemonStartupInfo {
|
|
23
26
|
schemaVersion: 1;
|
|
24
27
|
generatedAt: string;
|
|
@@ -45,3 +48,14 @@ export interface SetupHaltedInfo {
|
|
|
45
48
|
error: ErrorEnvelope;
|
|
46
49
|
}
|
|
47
50
|
export declare function main(): Promise<DaemonStartupInfo | SetupHaltedInfo | void>;
|
|
51
|
+
/**
|
|
52
|
+
* Builds a HarnessReadinessRegistry from the harness list returned by
|
|
53
|
+
* buildHarnesses() and the operator's joinedSolverNets config block.
|
|
54
|
+
*
|
|
55
|
+
* Per A2 carry-over: start() only schedules the background tick; callers that
|
|
56
|
+
* need the snapshot populated immediately must call refreshNow() after start().
|
|
57
|
+
*/
|
|
58
|
+
export declare function buildHarnessReadinessRegistry(args: {
|
|
59
|
+
harnesses: Harness[];
|
|
60
|
+
config: Pick<JinnConfig, 'joinedSolverNets'>;
|
|
61
|
+
}): HarnessReadinessRegistry;
|
package/dist/main.js
CHANGED
|
@@ -27,6 +27,8 @@ import { fileURLToPath } from 'node:url';
|
|
|
27
27
|
import { loadConfig, getConfigPathFromArgs, DEFAULT_CONFIG_PATH } from './config.js';
|
|
28
28
|
import { Store } from './store/store.js';
|
|
29
29
|
import { startApiServer } from './api/server.js';
|
|
30
|
+
// addHarnessReadinessRoutes is wired through startApiServer's holder ref now
|
|
31
|
+
// (jinn-mono-u34i). No direct import needed.
|
|
30
32
|
import { CapturePublishUnavailableError } from './api/captures.js';
|
|
31
33
|
import { invalidatePredictionOperatorStatusCache } from './api/gather-status.js';
|
|
32
34
|
import { ensureUiToken } from './api/ui-token.js';
|
|
@@ -37,10 +39,6 @@ import { createSetupModeController } from './setup-mode.js';
|
|
|
37
39
|
import { buildEnvelope, emitEnvelope } from './errors/envelope.js';
|
|
38
40
|
import { clearBootstrapError, persistBootstrapError, } from './errors/persisted-bootstrap-error.js';
|
|
39
41
|
import { emitStructured } from './events/emitter.js';
|
|
40
|
-
import { checkClaudeBinary } from './preflight/claude-binary.js';
|
|
41
|
-
import { emitClaudeBinaryPreflightFailure } from './preflight/claude-invocation-envelope.js';
|
|
42
|
-
import { detectAuthContext, probeClaudeAuth } from './preflight/claude-auth.js';
|
|
43
|
-
import { configRequiresClaudeAuth } from './preflight/claude-required.js';
|
|
44
42
|
import { FleetBootstrapper } from './earning/bootstrap.js';
|
|
45
43
|
import { DEFAULT_TESTNET_ARTIFACTS, applyChainGasOverrides, getChainConfig, loadJinnMviConfig } from './earning/contracts.js';
|
|
46
44
|
import { runLegacyAgentIdMigration } from './earning/migrate-agent-id.js';
|
|
@@ -57,7 +55,8 @@ import { DEFAULT_DISABLED_HARNESSES, DEFAULT_HARNESS, HarnessRegistry, } from '.
|
|
|
57
55
|
import { joinedSolverNetsViewFromConfig } from './harnesses/engine/engine.js';
|
|
58
56
|
import { buildHarnesses } from './harnesses/impls/index.js';
|
|
59
57
|
import { loadExternalImpl } from './harnesses/external-impls/index.js';
|
|
60
|
-
import { CLAUDE_CODE_HARNESS, CODEX_HARNESS, harnessStateDirName } from './harnesses/names.js';
|
|
58
|
+
import { CLAUDE_CODE_HARNESS, CODEX_HARNESS, HERMES_AGENT_HARNESS, harnessStateDirName } from './harnesses/names.js';
|
|
59
|
+
import { HarnessReadinessRegistry } from './harnesses/readiness-registry.js';
|
|
61
60
|
import { createClients } from './adapters/mech/safe.js';
|
|
62
61
|
import { loadSolverNets } from './solver-nets/registry.js';
|
|
63
62
|
import { createCorpus } from './corpus/index.js';
|
|
@@ -133,7 +132,7 @@ const config = loadConfig(CONFIG_PATH);
|
|
|
133
132
|
if (config.network === 'mainnet' && process.env['JINN_ENABLE_MAINNET'] !== '1') {
|
|
134
133
|
console.warn('[main] Mainnet is disabled before launch; using testnet defaults.');
|
|
135
134
|
config.network = 'testnet';
|
|
136
|
-
config.rpcUrl = 'https://sepolia.
|
|
135
|
+
config.rpcUrl = 'https://base-sepolia.gateway.tenderly.co/75tyLMQuD8EHpXxMwINIKu';
|
|
137
136
|
}
|
|
138
137
|
let activeClaudePath = config.claudePath ?? 'claude';
|
|
139
138
|
const selectClaudePath = (claudePath) => {
|
|
@@ -442,7 +441,7 @@ async function bootstrap() {
|
|
|
442
441
|
};
|
|
443
442
|
// eslint-disable-next-line no-constant-condition
|
|
444
443
|
while (true) {
|
|
445
|
-
result = await bootstrapper.
|
|
444
|
+
result = await bootstrapper.ensureStage1And2(PASSWORD);
|
|
446
445
|
if (!result.funding) {
|
|
447
446
|
clearFundingGate();
|
|
448
447
|
break;
|
|
@@ -744,6 +743,22 @@ export async function main() {
|
|
|
744
743
|
// on first request); subsystem init below populates `holder.current` and
|
|
745
744
|
// the route handlers dereference it per-request.
|
|
746
745
|
const solverNetEndpointsDepsHolder = { current: undefined };
|
|
746
|
+
// jinn-mono-u34i: same pattern for the harness readiness registry. The
|
|
747
|
+
// registry is built post-bootstrap (depends on the keystore being
|
|
748
|
+
// available), but the routes must be registered at server start to land in
|
|
749
|
+
// Hono's matcher before the panel's first poll. Late-mounting via
|
|
750
|
+
// `addHarnessReadinessRoutes(setupApiServer.app, ...)` after the panel had
|
|
751
|
+
// been polling for minutes threw "Can not add a route since the matcher is
|
|
752
|
+
// already built" and crashed the daemon on the running-mode transition.
|
|
753
|
+
const harnessReadinessRegistryHolder = { current: undefined };
|
|
754
|
+
// jinn-mono-u34i: same eager-register / late-populate pattern for the
|
|
755
|
+
// DiscoveryAPI. Pre-fix, /v1/discovery/* routes only mounted when
|
|
756
|
+
// `config.discovery` was set at startApiServer time — but main.ts builds
|
|
757
|
+
// `sharedDiscoveryApi` post-bootstrap, so the routes were never registered
|
|
758
|
+
// and the panel's /build page got a permanent 404 on plugin-publications +
|
|
759
|
+
// builder-artifacts. Holder ref lets the routes register eagerly and
|
|
760
|
+
// start returning real data the moment main.ts assigns holder.current.
|
|
761
|
+
const discoveryApiHolder = { current: undefined };
|
|
747
762
|
let setupApiServer;
|
|
748
763
|
try {
|
|
749
764
|
setupApiServer = await startApiServer({
|
|
@@ -753,6 +768,10 @@ export async function main() {
|
|
|
753
768
|
bindHost: apiBindHost,
|
|
754
769
|
corpus: () => corpusForApi,
|
|
755
770
|
ui: { token: uiToken, handshakeKey },
|
|
771
|
+
hermesDoctor: {
|
|
772
|
+
hermesPath: config.hermesPath,
|
|
773
|
+
hermesDoctorTimeoutMs: config.hermesDoctorTimeoutMs,
|
|
774
|
+
},
|
|
756
775
|
admin: {
|
|
757
776
|
onRestartRequested: () => {
|
|
758
777
|
console.log('[main] Restart requested via operator MCP. Exiting...');
|
|
@@ -840,7 +859,12 @@ export async function main() {
|
|
|
840
859
|
contract: { id: 'swe-rebench-v2', version: 'v1' },
|
|
841
860
|
state: 'live',
|
|
842
861
|
supportedRoles: ['solving', 'evaluating'],
|
|
862
|
+
// Order matters: the dashboard pre-selects compatibleHarnesses[0]
|
|
863
|
+
// as the default solver harness. Hermes Agent is the SWE-rebench v2
|
|
864
|
+
// default per the 2026-05-12 decision (jinn-mono-8psp.2 / spec §10);
|
|
865
|
+
// operators may switch to Claude Code or Codex.
|
|
843
866
|
compatibleHarnesses: [
|
|
867
|
+
{ name: HERMES_AGENT_HARNESS, version: '0.1.0', supportsRoles: ['solving'] },
|
|
844
868
|
{ name: CLAUDE_CODE_HARNESS, version: '0.1.0', supportsRoles: ['solving'] },
|
|
845
869
|
{ name: CODEX_HARNESS, version: '0.1.0', supportsRoles: ['solving'] },
|
|
846
870
|
{ name: 'swe-rebench-v2-evaluator', version: '0.1.0', supportsRoles: ['evaluating'] },
|
|
@@ -856,6 +880,12 @@ export async function main() {
|
|
|
856
880
|
// eagerly here; deps are populated by main.ts post-bootstrap via the
|
|
857
881
|
// holder, and each route handler reads `holder.current` per-request.
|
|
858
882
|
solverNetsLauncher: { holder: solverNetEndpointsDepsHolder },
|
|
883
|
+
// jinn-mono-u34i: same eager-register / late-populate pattern for the
|
|
884
|
+
// harness readiness routes. Until main.ts sets the holder, requests
|
|
885
|
+
// return 503 subsystem_not_ready (the panel handles that gracefully).
|
|
886
|
+
harnessReadinessRegistry: { holder: harnessReadinessRegistryHolder },
|
|
887
|
+
// jinn-mono-u34i: see discoveryApiHolder comment above.
|
|
888
|
+
discovery: { holder: discoveryApiHolder },
|
|
859
889
|
// Agent-binding retry: re-run the ERC-1271 bind step from the SPA
|
|
860
890
|
// without forcing a daemon restart. Constructs a fresh bootstrapper
|
|
861
891
|
// per call so we don't tangle lifecycle with the long-running one.
|
|
@@ -907,7 +937,17 @@ export async function main() {
|
|
|
907
937
|
earningDir: config.earningDir,
|
|
908
938
|
chain: NETWORK_CHAIN,
|
|
909
939
|
rpcUrl: config.rpcUrl,
|
|
910
|
-
|
|
940
|
+
// Note: do NOT pass minEoaGasWei here. setup-endpoints.ts derives
|
|
941
|
+
// its faucet target from stage1MinMasterEth(getChainConfig(chain),
|
|
942
|
+
// targetServices) — the same helper the daemon's ensureStage1 gate
|
|
943
|
+
// uses. Passing a computed value from here would re-introduce the
|
|
944
|
+
// drift seam that hit operators in the 2026-05-18 canary
|
|
945
|
+
// (jinn-mono-u34i): faucet dripped to one target while the daemon
|
|
946
|
+
// waited for a different one. The override field remains for tests
|
|
947
|
+
// that want a custom target.
|
|
948
|
+
// targetServices DOES need to flow through so the faucet drips enough
|
|
949
|
+
// ETH to cover ALL services for the operator's chosen targetServices.
|
|
950
|
+
targetServices: config.targetServices,
|
|
911
951
|
claudePath: activeClaudePath,
|
|
912
952
|
getClaudePath: () => activeClaudePath,
|
|
913
953
|
configPath: CONFIG_PATH ?? DEFAULT_CONFIG_PATH,
|
|
@@ -1207,35 +1247,6 @@ export async function main() {
|
|
|
1207
1247
|
},
|
|
1208
1248
|
});
|
|
1209
1249
|
}
|
|
1210
|
-
const claudeAuthRequired = configRequiresClaudeAuth(config);
|
|
1211
|
-
if (claudeAuthRequired) {
|
|
1212
|
-
const preflight = await checkClaudeBinary(activeClaudePath);
|
|
1213
|
-
if (!preflight.ok) {
|
|
1214
|
-
emitClaudeBinaryPreflightFailure(preflight.detail, activeClaudePath);
|
|
1215
|
-
}
|
|
1216
|
-
const authContext = detectAuthContext({ cwd: process.cwd(), configuredMode: config.runtimeMode });
|
|
1217
|
-
const authProbe = probeClaudeAuth({
|
|
1218
|
-
context: authContext,
|
|
1219
|
-
cwd: process.cwd(),
|
|
1220
|
-
claudePath: activeClaudePath,
|
|
1221
|
-
});
|
|
1222
|
-
if (!authProbe.authenticated) {
|
|
1223
|
-
emitEnvelope({
|
|
1224
|
-
code: 'invalid_invocation',
|
|
1225
|
-
message: 'Claude is not authenticated. Complete Claude setup in the operator app, then restart the daemon.',
|
|
1226
|
-
hint: `Detected context: ${authContext}. Run \`jinn run\` to open the app-guided setup flow.`,
|
|
1227
|
-
exampleCli: 'jinn run',
|
|
1228
|
-
details: {
|
|
1229
|
-
field: 'claude_auth',
|
|
1230
|
-
context: authContext,
|
|
1231
|
-
authenticated: false,
|
|
1232
|
-
},
|
|
1233
|
-
});
|
|
1234
|
-
}
|
|
1235
|
-
}
|
|
1236
|
-
else {
|
|
1237
|
-
console.log('[main] Claude auth preflight skipped; Claude-backed harnesses are disabled.');
|
|
1238
|
-
}
|
|
1239
1250
|
const runner = new ClaudeRunner({
|
|
1240
1251
|
claudePath: activeClaudePath,
|
|
1241
1252
|
model: config.claudeModel,
|
|
@@ -1298,6 +1309,11 @@ export async function main() {
|
|
|
1298
1309
|
sharedDiscoveryApi = await buildOnchainFloor();
|
|
1299
1310
|
}
|
|
1300
1311
|
}
|
|
1312
|
+
// jinn-mono-u34i: populate the holder so the /v1/discovery/* routes
|
|
1313
|
+
// registered eagerly at server-start time start returning real data on
|
|
1314
|
+
// the panel's next refetch. Before this, the routes 404'd forever and
|
|
1315
|
+
// the /build page rendered "Discovery unavailable" permanently.
|
|
1316
|
+
discoveryApiHolder.current = sharedDiscoveryApi;
|
|
1301
1317
|
const adapter = new MechAdapter({
|
|
1302
1318
|
rpcUrl: config.rpcUrl,
|
|
1303
1319
|
mechMarketplaceAddress: MARKETPLACE_ADDRESS,
|
|
@@ -1440,10 +1456,39 @@ export async function main() {
|
|
|
1440
1456
|
externalImpls,
|
|
1441
1457
|
disabledNames: config.harnesses?.disabled,
|
|
1442
1458
|
corpusEnv,
|
|
1459
|
+
hermesPath: config.hermesPath,
|
|
1460
|
+
hermesModel: config.hermesModel,
|
|
1461
|
+
hermesProvider: config.hermesProvider,
|
|
1443
1462
|
})) {
|
|
1444
1463
|
implRegistry.register(impl);
|
|
1445
1464
|
}
|
|
1446
1465
|
console.log(`[main] HarnessRegistry: ${implRegistry.list().map(i => i.name).join(', ')}`);
|
|
1466
|
+
// ── Harness readiness registry ─────────────────────────────────────────────
|
|
1467
|
+
// Composes per-harness isReady() probes into a cached snapshot consumed by
|
|
1468
|
+
// claim loops (A5) and /v1/harnesses/readiness (A3).
|
|
1469
|
+
//
|
|
1470
|
+
// The registry is constructed here, after buildHarnesses() has run, which
|
|
1471
|
+
// is necessarily after bootstrap (bootstrap needs the keystore). The HTTP
|
|
1472
|
+
// server was started before bootstrap so it could show setup progress — we
|
|
1473
|
+
// mount the readiness routes on the already-running app via setupApiServer.app
|
|
1474
|
+
// (same pattern used by registerSolverNetsEndpoints). Routes are registered
|
|
1475
|
+
// before the first operator request that cares about harness readiness.
|
|
1476
|
+
//
|
|
1477
|
+
// A2 carry-over: start() only schedules the 4s tick; refreshNow() is called
|
|
1478
|
+
// immediately so the snapshot is populated before the first claim-loop tick.
|
|
1479
|
+
const harnessReadinessRegistry = buildHarnessReadinessRegistry({
|
|
1480
|
+
harnesses: implRegistry.list(),
|
|
1481
|
+
config,
|
|
1482
|
+
});
|
|
1483
|
+
harnessReadinessRegistry.start();
|
|
1484
|
+
await harnessReadinessRegistry.refreshNow();
|
|
1485
|
+
// Routes were registered eagerly at startApiServer time via the holder
|
|
1486
|
+
// ref pattern (jinn-mono-u34i). Populate the holder now and the already-
|
|
1487
|
+
// mounted /v1/harnesses/readiness routes start returning real data.
|
|
1488
|
+
// Late-mounting via addHarnessReadinessRoutes(setupApiServer.app, ...)
|
|
1489
|
+
// is no longer needed and would throw on Hono's locked matcher.
|
|
1490
|
+
harnessReadinessRegistryHolder.current = harnessReadinessRegistry;
|
|
1491
|
+
console.log('[main] HarnessReadinessRegistry started; /v1/harnesses/readiness routes active.');
|
|
1447
1492
|
// ── Engine deps ───────────────────────────────────────────────────────────────
|
|
1448
1493
|
// Packaging deps: artifacts are always written to served_artifacts
|
|
1449
1494
|
// (operator-local SQLite). In public-testnet donation mode, scrubbed artifact
|
|
@@ -1812,6 +1857,7 @@ export async function main() {
|
|
|
1812
1857
|
nodeEndpoint: config.nodeEndpoint,
|
|
1813
1858
|
creatorSafeAddress: safeAddress,
|
|
1814
1859
|
corpusFactory,
|
|
1860
|
+
harnessReadinessRegistry,
|
|
1815
1861
|
status: {
|
|
1816
1862
|
earningDir: config.earningDir,
|
|
1817
1863
|
rpcUrl: config.rpcUrl,
|
|
@@ -1928,6 +1974,7 @@ export async function main() {
|
|
|
1928
1974
|
let exitCode = 0;
|
|
1929
1975
|
console.log(`\n[main] Received ${signal}, shutting down...`);
|
|
1930
1976
|
try {
|
|
1977
|
+
harnessReadinessRegistry.stop();
|
|
1931
1978
|
await daemon.stop();
|
|
1932
1979
|
await setupApiServer.close().catch(() => undefined);
|
|
1933
1980
|
await closeCaptureReceiver();
|
|
@@ -1994,4 +2041,32 @@ export async function main() {
|
|
|
1994
2041
|
serviceId,
|
|
1995
2042
|
};
|
|
1996
2043
|
}
|
|
2044
|
+
// ── Harness readiness registry factory ───────────────────────────────────────
|
|
2045
|
+
// Exported so tests can construct a registry without booting the full daemon.
|
|
2046
|
+
/**
|
|
2047
|
+
* Builds a HarnessReadinessRegistry from the harness list returned by
|
|
2048
|
+
* buildHarnesses() and the operator's joinedSolverNets config block.
|
|
2049
|
+
*
|
|
2050
|
+
* Per A2 carry-over: start() only schedules the background tick; callers that
|
|
2051
|
+
* need the snapshot populated immediately must call refreshNow() after start().
|
|
2052
|
+
*/
|
|
2053
|
+
export function buildHarnessReadinessRegistry(args) {
|
|
2054
|
+
const harnessesByName = {};
|
|
2055
|
+
for (const h of args.harnesses) {
|
|
2056
|
+
harnessesByName[h.name] = h;
|
|
2057
|
+
}
|
|
2058
|
+
const joinedHarnessesByCid = {};
|
|
2059
|
+
for (const [cid, entry] of Object.entries(args.config.joinedSolverNets ?? {})) {
|
|
2060
|
+
if (entry.harness) {
|
|
2061
|
+
joinedHarnessesByCid[cid] = {
|
|
2062
|
+
harnessName: entry.harness,
|
|
2063
|
+
roles: entry.roles,
|
|
2064
|
+
};
|
|
2065
|
+
}
|
|
2066
|
+
}
|
|
2067
|
+
return new HarnessReadinessRegistry({
|
|
2068
|
+
harnessesByName,
|
|
2069
|
+
joinedHarnessesByCid,
|
|
2070
|
+
});
|
|
2071
|
+
}
|
|
1997
2072
|
//# sourceMappingURL=main.js.map
|