@jinn-network/client 0.1.7 → 0.1.8-canary.09a3b2f6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -1
- package/dist/adapters/mech/adapter.d.ts +39 -2
- package/dist/adapters/mech/adapter.js +178 -20
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +22 -1
- package/dist/adapters/mech/contracts.js +96 -52
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/safe-revert.d.ts +4 -0
- package/dist/adapters/mech/safe-revert.js +5 -1
- package/dist/adapters/mech/safe-revert.js.map +1 -1
- package/dist/adapters/mech/safe.d.ts +1 -1
- package/dist/adapters/mech/safe.js +10 -4
- package/dist/adapters/mech/safe.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +6 -1
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/agent/operator-claude.js +8 -0
- package/dist/agent/operator-claude.js.map +1 -1
- package/dist/api/activity-events-endpoint.d.ts +14 -0
- package/dist/api/activity-events-endpoint.js +59 -0
- package/dist/api/activity-events-endpoint.js.map +1 -0
- package/dist/api/bootstrap-endpoint.d.ts +1 -2
- package/dist/api/bootstrap-endpoint.js +42 -24
- package/dist/api/bootstrap-endpoint.js.map +1 -1
- package/dist/api/codex-doctor-endpoint.d.ts +22 -5
- package/dist/api/codex-doctor-endpoint.js +136 -17
- package/dist/api/codex-doctor-endpoint.js.map +1 -1
- package/dist/api/debug-report-endpoint.d.ts +27 -0
- package/dist/api/debug-report-endpoint.js +157 -0
- package/dist/api/debug-report-endpoint.js.map +1 -0
- package/dist/api/discovery-endpoint.d.ts +1 -0
- package/dist/api/discovery-endpoint.js +24 -0
- package/dist/api/discovery-endpoint.js.map +1 -1
- package/dist/api/fleet-build.d.ts +1 -7
- package/dist/api/fleet-build.js +0 -7
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/gather-status.d.ts +39 -0
- package/dist/api/gather-status.js +181 -84
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/hermes-doctor-endpoint.d.ts +15 -7
- package/dist/api/hermes-doctor-endpoint.js +56 -19
- package/dist/api/hermes-doctor-endpoint.js.map +1 -1
- package/dist/api/launcher-status.d.ts +4 -2
- package/dist/api/launcher-status.js +11 -10
- package/dist/api/launcher-status.js.map +1 -1
- package/dist/api/launcher-tasks.d.ts +1 -1
- package/dist/api/launcher-tasks.js +12 -8
- package/dist/api/launcher-tasks.js.map +1 -1
- package/dist/api/loop-completion-build.d.ts +79 -0
- package/dist/api/loop-completion-build.js +155 -0
- package/dist/api/loop-completion-build.js.map +1 -0
- package/dist/api/operator-artifacts-endpoint.js +73 -6
- package/dist/api/operator-artifacts-endpoint.js.map +1 -1
- package/dist/api/portfolio-v0-build.d.ts +7 -1
- package/dist/api/portfolio-v0-build.js +6 -2
- package/dist/api/portfolio-v0-build.js.map +1 -1
- package/dist/api/prediction-v1-build.d.ts +6 -0
- package/dist/api/prediction-v1-build.js +3 -1
- package/dist/api/prediction-v1-build.js.map +1 -1
- package/dist/api/server.d.ts +17 -0
- package/dist/api/server.js +40 -1
- package/dist/api/server.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +13 -9
- package/dist/api/setup-endpoints.js +50 -173
- package/dist/api/setup-endpoints.js.map +1 -1
- package/dist/api/solvernets-endpoints.js +33 -63
- package/dist/api/solvernets-endpoints.js.map +1 -1
- package/dist/api/status-build.d.ts +140 -17
- package/dist/api/status-build.js +47 -34
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/status-harness-rollup.d.ts +35 -0
- package/dist/api/status-harness-rollup.js +45 -0
- package/dist/api/status-harness-rollup.js.map +1 -0
- package/dist/api/status-rollup-build.d.ts +0 -4
- package/dist/api/status-rollup-build.js +0 -4
- package/dist/api/status-rollup-build.js.map +1 -1
- package/dist/api/task-runs-build.d.ts +8 -0
- package/dist/api/task-runs-build.js +5 -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/captures/live-publisher.js +24 -4
- package/dist/captures/live-publisher.js.map +1 -1
- package/dist/captures/publish.d.ts +1 -1
- package/dist/chain-read-errors.d.ts +12 -0
- package/dist/chain-read-errors.js +26 -1
- package/dist/chain-read-errors.js.map +1 -1
- package/dist/cli/commands/codedigest-revert-check.d.ts +33 -0
- package/dist/cli/commands/codedigest-revert-check.js +253 -0
- package/dist/cli/commands/codedigest-revert-check.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +35 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/eval.d.ts +76 -0
- package/dist/cli/commands/eval.js +401 -0
- package/dist/cli/commands/eval.js.map +1 -0
- package/dist/cli/commands/rewards.d.ts +2 -0
- package/dist/cli/commands/rewards.js +27 -0
- package/dist/cli/commands/rewards.js.map +1 -1
- package/dist/cli/commands/solver-nets.d.ts +1 -0
- package/dist/cli/commands/solver-nets.js +245 -22
- package/dist/cli/commands/solver-nets.js.map +1 -1
- package/dist/cli/commands/solver-plugins-block.d.ts +33 -0
- package/dist/cli/commands/solver-plugins-block.js +118 -0
- package/dist/cli/commands/solver-plugins-block.js.map +1 -0
- package/dist/cli/commands/solver-plugins-feedback.d.ts +72 -0
- package/dist/cli/commands/solver-plugins-feedback.js +262 -0
- package/dist/cli/commands/solver-plugins-feedback.js.map +1 -0
- package/dist/cli/commands/solver-plugins-read.d.ts +54 -0
- package/dist/cli/commands/solver-plugins-read.js +259 -0
- package/dist/cli/commands/solver-plugins-read.js.map +1 -0
- package/dist/cli/commands/solver-plugins.d.ts +35 -0
- package/dist/cli/commands/solver-plugins.js +399 -2
- package/dist/cli/commands/solver-plugins.js.map +1 -1
- package/dist/cli/commands/status.js +0 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/tasks.js +15 -2
- package/dist/cli/commands/tasks.js.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/task-native-readiness.d.ts +7 -0
- package/dist/cli/task-native-readiness.js +7 -5
- package/dist/cli/task-native-readiness.js.map +1 -1
- package/dist/config.d.ts +206 -232
- package/dist/config.js +289 -107
- package/dist/config.js.map +1 -1
- package/dist/daemon/ai-units-gate.d.ts +54 -0
- package/dist/daemon/ai-units-gate.js +83 -0
- package/dist/daemon/ai-units-gate.js.map +1 -0
- package/dist/daemon/creator.js +13 -0
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +10 -0
- package/dist/daemon/daemon.js +205 -30
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/eviction-loop.d.ts +7 -0
- package/dist/daemon/eviction-loop.js +16 -0
- package/dist/daemon/eviction-loop.js.map +1 -1
- package/dist/daemon/gate-logger.d.ts +9 -0
- package/dist/daemon/gate-logger.js +2 -0
- package/dist/daemon/gate-logger.js.map +1 -0
- package/dist/daemon/jinn-claim-loop.js +22 -4
- package/dist/daemon/jinn-claim-loop.js.map +1 -1
- package/dist/daemon/readiness-gate.d.ts +1 -4
- package/dist/daemon/readiness-gate.js.map +1 -1
- package/dist/daemon/spend-cap-gate.d.ts +40 -0
- package/dist/daemon/spend-cap-gate.js +46 -0
- package/dist/daemon/spend-cap-gate.js.map +1 -0
- package/dist/dashboard/assets/index-3quVQqik.js +167 -0
- package/dist/dashboard/assets/index-BVAWkLwY.css +1 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/discovery/http.d.ts +7 -0
- package/dist/discovery/http.js +567 -24
- package/dist/discovery/http.js.map +1 -1
- package/dist/discovery/onchain.js +197 -5
- package/dist/discovery/onchain.js.map +1 -1
- package/dist/discovery/types.d.ts +235 -0
- package/dist/discovery/types.js +40 -0
- package/dist/discovery/types.js.map +1 -1
- package/dist/discovery/with-fallback.js +41 -0
- package/dist/discovery/with-fallback.js.map +1 -1
- package/dist/earning/bootstrap.d.ts +31 -3
- package/dist/earning/bootstrap.js +94 -22
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/faucet.d.ts +1 -1
- package/dist/earning/faucet.js +2 -2
- package/dist/earning/faucet.js.map +1 -1
- package/dist/earning/safe-adapter.js +34 -11
- package/dist/earning/safe-adapter.js.map +1 -1
- package/dist/earning/types.d.ts +6 -6
- package/dist/earning/viem-clients.d.ts +11 -4
- package/dist/earning/viem-clients.js +14 -5
- package/dist/earning/viem-clients.js.map +1 -1
- package/dist/erc8004/identity.d.ts +19 -3
- package/dist/erc8004/identity.js +38 -11
- package/dist/erc8004/identity.js.map +1 -1
- package/dist/erc8004/index.d.ts +1 -1
- package/dist/erc8004/index.js.map +1 -1
- package/dist/eval/eval-harness-run.d.ts +63 -0
- package/dist/eval/eval-harness-run.js +123 -0
- package/dist/eval/eval-harness-run.js.map +1 -0
- package/dist/eval/orchestrator.d.ts +163 -0
- package/dist/eval/orchestrator.js +232 -0
- package/dist/eval/orchestrator.js.map +1 -0
- package/dist/eval/paired.d.ts +68 -0
- package/dist/eval/paired.js +93 -0
- package/dist/eval/paired.js.map +1 -0
- package/dist/eval/resolve-slate-tasks.d.ts +35 -0
- package/dist/eval/resolve-slate-tasks.js +56 -0
- package/dist/eval/resolve-slate-tasks.js.map +1 -0
- package/dist/eval/screen-discovery.d.ts +22 -0
- package/dist/eval/screen-discovery.js +71 -0
- package/dist/eval/screen-discovery.js.map +1 -0
- package/dist/eval/screen-progress.d.ts +41 -0
- package/dist/eval/screen-progress.js +60 -0
- package/dist/eval/screen-progress.js.map +1 -0
- package/dist/eval/screen-runner.d.ts +30 -0
- package/dist/eval/screen-runner.js +289 -0
- package/dist/eval/screen-runner.js.map +1 -0
- package/dist/eval/screen.d.ts +107 -0
- package/dist/eval/screen.js +159 -0
- package/dist/eval/screen.js.map +1 -0
- package/dist/eval/slope.d.ts +29 -0
- package/dist/eval/slope.js +46 -0
- package/dist/eval/slope.js.map +1 -0
- package/dist/eval/train-sequence.d.ts +35 -0
- package/dist/eval/train-sequence.js +59 -0
- package/dist/eval/train-sequence.js.map +1 -0
- package/dist/eval/wilson.d.ts +45 -0
- package/dist/eval/wilson.js +48 -0
- package/dist/eval/wilson.js.map +1 -0
- package/dist/events/types.d.ts +2 -2
- package/dist/harnesses/cost-estimates.d.ts +10 -31
- package/dist/harnesses/cost-estimates.js +11 -43
- package/dist/harnesses/cost-estimates.js.map +1 -1
- package/dist/harnesses/engine/canonical-json.js +5 -3
- package/dist/harnesses/engine/canonical-json.js.map +1 -1
- package/dist/harnesses/engine/engine.d.ts +37 -4
- package/dist/harnesses/engine/engine.js +151 -20
- package/dist/harnesses/engine/engine.js.map +1 -1
- package/dist/harnesses/engine/persistence.d.ts +38 -4
- package/dist/harnesses/engine/persistence.js +71 -6
- package/dist/harnesses/engine/persistence.js.map +1 -1
- package/dist/harnesses/engine/state.d.ts +9 -0
- package/dist/harnesses/engine/state.js +23 -10
- package/dist/harnesses/engine/state.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/adapter.d.ts +2 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js +8 -5
- package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +1 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js +10 -3
- package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/config-builder.d.ts +1 -1
- package/dist/harnesses/impls/hermes-agent/config-builder.js +4 -2
- package/dist/harnesses/impls/hermes-agent/config-builder.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/harness.d.ts +31 -3
- package/dist/harnesses/impls/hermes-agent/harness.js +84 -7
- package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/prompt.d.ts +6 -6
- package/dist/harnesses/impls/hermes-agent/prompt.js +6 -6
- package/dist/harnesses/impls/index.d.ts +2 -0
- package/dist/harnesses/impls/index.js +2 -0
- package/dist/harnesses/impls/index.js.map +1 -1
- package/dist/harnesses/impls/learner/adapters/claude-code.d.ts +17 -0
- package/dist/harnesses/impls/learner/adapters/claude-code.js +118 -14
- package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
- package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +9 -0
- package/dist/harnesses/impls/learner/adapters/codex-code.js +30 -8
- package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
- package/dist/harnesses/impls/learner/harness.d.ts +41 -1
- package/dist/harnesses/impls/learner/harness.js +78 -4
- package/dist/harnesses/impls/learner/harness.js.map +1 -1
- package/dist/harnesses/impls/learner/harvest.d.ts +3 -1
- package/dist/harnesses/impls/learner/harvest.js +30 -6
- package/dist/harnesses/impls/learner/harvest.js.map +1 -1
- package/dist/harnesses/impls/learner/plugin-path.js +1 -0
- package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
- package/dist/harnesses/impls/learner/restoration-patch.d.ts +2 -2
- package/dist/harnesses/impls/learner/restoration-patch.js +25 -6
- package/dist/harnesses/impls/learner/restoration-patch.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +21 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +3 -1
- 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 +74 -5
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +103 -32
- 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 +2 -2
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +3 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
- package/dist/harnesses/readiness-registry.d.ts +7 -0
- package/dist/harnesses/readiness-registry.js +9 -0
- package/dist/harnesses/readiness-registry.js.map +1 -1
- package/dist/harnesses/types.d.ts +14 -0
- package/dist/learner/revert-decision.d.ts +74 -0
- package/dist/learner/revert-decision.js +73 -0
- package/dist/learner/revert-decision.js.map +1 -0
- package/dist/learner/revert-stats.d.ts +38 -0
- package/dist/learner/revert-stats.js +86 -0
- package/dist/learner/revert-stats.js.map +1 -0
- package/dist/local-provider-url.d.ts +3 -0
- package/dist/local-provider-url.js +28 -0
- package/dist/local-provider-url.js.map +1 -0
- package/dist/main.js +199 -104
- package/dist/main.js.map +1 -1
- package/dist/mcp/get-codedigest-reward.d.ts +13 -0
- package/dist/mcp/get-codedigest-reward.js +23 -0
- package/dist/mcp/get-codedigest-reward.js.map +1 -0
- package/dist/mcp/server.js +23 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/observability/debug-report-assemble.d.ts +43 -0
- package/dist/observability/debug-report-assemble.js +80 -0
- package/dist/observability/debug-report-assemble.js.map +1 -0
- package/dist/observability/emit-event.d.ts +9 -2
- package/dist/observability/emit-event.js +36 -2
- package/dist/observability/emit-event.js.map +1 -1
- package/dist/observability/file-logger.d.ts +69 -0
- package/dist/observability/file-logger.js +177 -0
- package/dist/observability/file-logger.js.map +1 -0
- package/dist/observability/redact-secrets.d.ts +65 -0
- package/dist/observability/redact-secrets.js +300 -0
- package/dist/observability/redact-secrets.js.map +1 -0
- package/dist/observability/tar.d.ts +30 -0
- package/dist/observability/tar.js +102 -0
- package/dist/observability/tar.js.map +1 -0
- package/dist/plugins/learner/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/learner/.codex-plugin/plugin.json +1 -1
- package/dist/plugins/learner/hooks/session-start +30 -1
- package/dist/plugins/learner/skills/learn/consolidator-prompt.md +22 -1
- package/dist/plugins/learner/skills/learn/promoter-prompt.md +72 -1
- package/dist/preflight/deployment-readiness.d.ts +147 -0
- package/dist/preflight/deployment-readiness.js +366 -0
- package/dist/preflight/deployment-readiness.js.map +1 -0
- package/dist/preflight/pidfile-liveness.d.ts +50 -0
- package/dist/preflight/pidfile-liveness.js +117 -0
- package/dist/preflight/pidfile-liveness.js.map +1 -0
- package/dist/preflight/rpc-network.d.ts +40 -0
- package/dist/preflight/rpc-network.js +67 -1
- package/dist/preflight/rpc-network.js.map +1 -1
- package/dist/rpc/transport.d.ts +145 -0
- package/dist/rpc/transport.js +319 -0
- package/dist/rpc/transport.js.map +1 -0
- package/dist/scripts/donation-consumption-acceptance.js +7 -28
- package/dist/scripts/donation-consumption-acceptance.js.map +1 -1
- package/dist/scripts/swe-rebench-v2-pytest-missing.json +16 -0
- package/dist/solver-nets/prediction-operator-ux.d.ts +1 -2
- package/dist/solver-nets/prediction-operator-ux.js +56 -53
- package/dist/solver-nets/prediction-operator-ux.js.map +1 -1
- package/dist/solver-nets/registry.d.ts +19 -1
- package/dist/solver-nets/registry.js +37 -24
- package/dist/solver-nets/registry.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.d.ts +76 -0
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.js +156 -0
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.d.ts +81 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.js +116 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-pool.d.ts +9 -2
- package/dist/solver-types/_swe-rebench-v2-pool.js +15 -20
- package/dist/solver-types/_swe-rebench-v2-pool.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-state.d.ts +24 -0
- package/dist/solver-types/_swe-rebench-v2-state.js +33 -0
- package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +116 -2
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js +296 -21
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v1.json +20 -0
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.json +19 -0
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.screening-report.json +628 -0
- package/dist/solver-types/solver-type.d.ts +8 -0
- package/dist/solver-types/swe-rebench-v2-auto.d.ts +20 -11
- package/dist/solver-types/swe-rebench-v2-auto.js +64 -19
- package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
- package/dist/solver-types/swe-rebench-v2.d.ts +10 -2
- package/dist/solver-types/swe-rebench-v2.js +233 -13
- package/dist/solver-types/swe-rebench-v2.js.map +1 -1
- package/dist/solvernets/daemon-init.d.ts +1 -1
- package/dist/solvernets/daemon-init.js +19 -4
- package/dist/solvernets/daemon-init.js.map +1 -1
- package/dist/solvernets/launched-record-dispatcher.d.ts +7 -0
- package/dist/solvernets/launched-record-dispatcher.js +10 -4
- package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
- package/dist/solvernets/registry-client-erc8004.js +40 -37
- package/dist/solvernets/registry-client-erc8004.js.map +1 -1
- package/dist/solvernets/registry-client.d.ts +6 -0
- package/dist/solvernets/store.d.ts +2 -2
- package/dist/solvernets/store.js +7 -2
- package/dist/solvernets/store.js.map +1 -1
- package/dist/spend/ai-units-config.d.ts +49 -0
- package/dist/spend/ai-units-config.js +34 -0
- package/dist/spend/ai-units-config.js.map +1 -0
- package/dist/spend/ai-units.d.ts +140 -0
- package/dist/spend/ai-units.js +229 -0
- package/dist/spend/ai-units.js.map +1 -0
- package/dist/spend/cost-surface-status.d.ts +12 -0
- package/dist/spend/cost-surface-status.js +24 -0
- package/dist/spend/cost-surface-status.js.map +1 -0
- package/dist/spend/credential.d.ts +39 -0
- package/dist/spend/credential.js +71 -0
- package/dist/spend/credential.js.map +1 -0
- package/dist/spend/daemon-config.d.ts +13 -0
- package/dist/spend/daemon-config.js +24 -0
- package/dist/spend/daemon-config.js.map +1 -0
- package/dist/spend/pricing.d.ts +16 -0
- package/dist/spend/pricing.js +26 -0
- package/dist/spend/pricing.js.map +1 -0
- package/dist/spend/record.d.ts +13 -0
- package/dist/spend/record.js +43 -0
- package/dist/spend/record.js.map +1 -0
- package/dist/spend/usage.d.ts +27 -0
- package/dist/spend/usage.js +113 -0
- package/dist/spend/usage.js.map +1 -0
- package/dist/store/store.d.ts +187 -0
- package/dist/store/store.js +467 -4
- package/dist/store/store.js.map +1 -1
- package/dist/trajectory/transcript-parsers/codex-session.d.ts +12 -6
- package/dist/trajectory/transcript-parsers/codex-session.js +114 -13
- package/dist/trajectory/transcript-parsers/codex-session.js.map +1 -1
- package/dist/trajectory/transcript-parsers/types.d.ts +8 -8
- package/dist/trajectory/transcript-session-dirs.d.ts +18 -0
- package/dist/trajectory/transcript-session-dirs.js +85 -0
- package/dist/trajectory/transcript-session-dirs.js.map +1 -0
- package/dist/trajectory/transcript-watcher.d.ts +20 -1
- package/dist/trajectory/transcript-watcher.js +108 -32
- package/dist/trajectory/transcript-watcher.js.map +1 -1
- package/dist/tx-retry.d.ts +25 -0
- package/dist/tx-retry.js +95 -7
- package/dist/tx-retry.js.map +1 -1
- package/dist/types/payloads/portfolio-v0.d.ts +3 -3
- package/dist/types/payloads/prediction-apy-v0.d.ts +3 -3
- package/dist/types/payloads/prediction-v0.d.ts +12 -12
- package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +108 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +25 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.d.ts +65 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.js +123 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.d.ts +2 -2
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js +1 -1
- package/dist/vendor/@jinn-network/sdk/package.json +4 -0
- package/docker-compose.yml +3 -2
- package/package.json +30 -18
- package/plugins/learner/.claude-plugin/plugin.json +1 -1
- package/plugins/learner/.codex-plugin/plugin.json +1 -1
- package/plugins/learner/hooks/session-start +30 -1
- package/plugins/learner/skills/learn/consolidator-prompt.md +22 -1
- package/plugins/learner/skills/learn/promoter-prompt.md +72 -1
- package/plugins/swe-rebench-v2-diffmin/README.md +10 -9
- package/plugins/swe-rebench-v2-diffmin/jinn.plugin.json +1 -1
- package/plugins/swe-rebench-v2-diffmin/skills/diffmin/SKILL.md +15 -10
- package/plugins/swe-rebench-v2-diffmin/skills/test-map/SKILL.md +10 -12
- package/plugins/swe-rebench-v2-runtime/.claude-plugin/plugin.json +1 -1
- package/plugins/swe-rebench-v2-runtime/.codex-plugin/plugin.json +3 -3
- package/plugins/swe-rebench-v2-runtime/README.md +6 -6
- package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
- package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
- package/plugins/swe-rebench-v2-runtime/jinn.plugin.json +2 -3
- package/plugins/swe-rebench-v2-runtime/skills/task/SKILL.md +81 -0
- package/dist/dashboard/assets/index-BUlE8F3Y.js +0 -330
- package/dist/dashboard/assets/index-blqc7eqq.css +0 -32
- package/plugins/swe-rebench-v2-runtime/skills/orient/SKILL.md +0 -29
- package/plugins/swe-rebench-v2-runtime/skills/plan/SKILL.md +0 -53
package/dist/discovery/http.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DiscoveryUnavailableError } from './types.js';
|
|
1
|
+
import { DiscoveryUnavailableError, TASK_POST_WINDOW_BLOCKS, bucketTaskPostCounts } from './types.js';
|
|
2
2
|
import { manifestDigestForCid } from '../adapters/mech/digest.js';
|
|
3
3
|
// ── GraphQL query strings ─────────────────────────────────────────────────────
|
|
4
4
|
/**
|
|
@@ -68,6 +68,8 @@ const ATTEMPTS_PAGE_LIMIT = 1000;
|
|
|
68
68
|
* the resulting count is a lower bound; see `getSolverNetOperatorCount`.
|
|
69
69
|
*/
|
|
70
70
|
const MAX_OPERATOR_COUNT_TASK_PAGES = 50;
|
|
71
|
+
/** Page cap for the task-post-rate scan (1000 rows/page → 50k recent tasks). */
|
|
72
|
+
const MAX_TASK_POST_PAGES = 50;
|
|
71
73
|
const ATTEMPTS_FOR_TASKS_QUERY = `
|
|
72
74
|
query AttemptsForTasks($taskIds: [String!]!, $chainId: Int!, $limit: Int!, $after: String) {
|
|
73
75
|
attempts(
|
|
@@ -97,6 +99,43 @@ query AttemptsForTasks($taskIds: [String!]!, $chainId: Int!, $limit: Int!, $afte
|
|
|
97
99
|
// scalar variables into a literal `where: { ... }` block is a bug.
|
|
98
100
|
const LIST_SOLVER_NETS_QUERY = `
|
|
99
101
|
query ListSolverNets($where: solverNetManifestFilter, $limit: Int!) {
|
|
102
|
+
solverNetManifests(
|
|
103
|
+
where: $where,
|
|
104
|
+
limit: $limit,
|
|
105
|
+
orderBy: "anchorBlock",
|
|
106
|
+
orderDirection: "desc"
|
|
107
|
+
) {
|
|
108
|
+
items {
|
|
109
|
+
id
|
|
110
|
+
launcherAgentId
|
|
111
|
+
status
|
|
112
|
+
statusUpdatedAt
|
|
113
|
+
manifestHash
|
|
114
|
+
anchorBlock
|
|
115
|
+
chainId
|
|
116
|
+
name
|
|
117
|
+
network
|
|
118
|
+
solutionPriceWei
|
|
119
|
+
verdictPriceWei
|
|
120
|
+
openRoles
|
|
121
|
+
launcherSafeAddress
|
|
122
|
+
contractId
|
|
123
|
+
contractVersion
|
|
124
|
+
solverNetId
|
|
125
|
+
manifestEnrichmentStatus
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
`;
|
|
130
|
+
// Legacy selection for the backward-compat degrade path (issue #985): the
|
|
131
|
+
// pre-enrichment field set, safe against an OLD indexer that lacks the
|
|
132
|
+
// enriched columns. The projection fills sentinels for the missing fields and
|
|
133
|
+
// leaves manifestEnrichmentStatus undefined → treated as not-ok → sentinels.
|
|
134
|
+
// These rows surface unenriched on the LIST path (empty name, '0' prices, zero
|
|
135
|
+
// address); they are not re-enriched anywhere — full fields require an indexer
|
|
136
|
+
// that persists the enriched columns, or the hash-verified getManifest detail path.
|
|
137
|
+
const LIST_SOLVER_NETS_QUERY_LEGACY = `
|
|
138
|
+
query ListSolverNetsLegacy($where: solverNetManifestFilter, $limit: Int!) {
|
|
100
139
|
solverNetManifests(
|
|
101
140
|
where: $where,
|
|
102
141
|
limit: $limit,
|
|
@@ -181,6 +220,126 @@ query OperatorCountAttempts($taskIds: [String!]!, $chainId: Int!, $limit: Int!,
|
|
|
181
220
|
}
|
|
182
221
|
}
|
|
183
222
|
`;
|
|
223
|
+
/**
|
|
224
|
+
* Paginated read of verdictEnvelopeMeta rows for swe-rebench-v2 successes,
|
|
225
|
+
* scoped to a single SolverNet via `solverNetManifestCid` so multi-SolverNet
|
|
226
|
+
* operators with overlapping instance_id pools don't cross-tenant over-count
|
|
227
|
+
* (#669 Finding 2).
|
|
228
|
+
*
|
|
229
|
+
* Ponder's auto-GraphQL does not expose GROUP BY / count aggregations, so
|
|
230
|
+
* getInstanceSuccessCounts pages this query with the `after` cursor and
|
|
231
|
+
* groups client-side. Capped at 1000 per page (Ponder's upper bound on
|
|
232
|
+
* plural-query `limit`).
|
|
233
|
+
*/
|
|
234
|
+
const INSTANCE_SUCCESS_COUNTS_QUERY = `
|
|
235
|
+
query InstanceSuccessCounts($solverNetManifestCid: String!, $limit: Int!, $after: String) {
|
|
236
|
+
verdictEnvelopeMetas(
|
|
237
|
+
where: {
|
|
238
|
+
solverNetManifestCid: $solverNetManifestCid,
|
|
239
|
+
solverType_starts_with: "swe-rebench-v2",
|
|
240
|
+
actualPassed: true,
|
|
241
|
+
enrichmentStatus: "ok",
|
|
242
|
+
instanceId_not: ""
|
|
243
|
+
},
|
|
244
|
+
limit: $limit,
|
|
245
|
+
after: $after,
|
|
246
|
+
orderBy: "enrichedAtBlock",
|
|
247
|
+
orderDirection: "asc"
|
|
248
|
+
) {
|
|
249
|
+
items {
|
|
250
|
+
requestId
|
|
251
|
+
chainId
|
|
252
|
+
instanceId
|
|
253
|
+
}
|
|
254
|
+
pageInfo {
|
|
255
|
+
hasNextPage
|
|
256
|
+
endCursor
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
`;
|
|
261
|
+
/**
|
|
262
|
+
* Leg 1 of getInstanceClaimCounts (#802): page every task id + maxClaims for a
|
|
263
|
+
* SolverNet's manifestDigest. Leg 2 reuses ATTEMPTS_FOR_TASKS_QUERY to count
|
|
264
|
+
* attempts (= consumed slots) per task. Same two-leg shape as
|
|
265
|
+
* getSolverNetOperatorCount; the only delta is selecting maxClaims here.
|
|
266
|
+
*/
|
|
267
|
+
const CLAIM_COUNT_TASKS_QUERY = `
|
|
268
|
+
query ClaimCountTasks($manifestDigest: String!, $limit: Int!, $after: String) {
|
|
269
|
+
tasks(
|
|
270
|
+
where: { manifestDigest: $manifestDigest },
|
|
271
|
+
limit: $limit,
|
|
272
|
+
after: $after,
|
|
273
|
+
orderBy: "id",
|
|
274
|
+
orderDirection: "asc"
|
|
275
|
+
) {
|
|
276
|
+
items {
|
|
277
|
+
id
|
|
278
|
+
maxClaims
|
|
279
|
+
chainId
|
|
280
|
+
}
|
|
281
|
+
pageInfo {
|
|
282
|
+
hasNextPage
|
|
283
|
+
endCursor
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
`;
|
|
288
|
+
/**
|
|
289
|
+
* Task-post-rate query (#918). Pages the most-recent tasks ordered by
|
|
290
|
+
* createdAtBlock desc; the daemon reads the top row's block as the window head
|
|
291
|
+
* and buckets the three windows (1h / 6h / 24h) AND the per-cid totals
|
|
292
|
+
* client-side from createdAtBlock + manifestDigest.
|
|
293
|
+
*
|
|
294
|
+
* We do NOT push a `manifestDigest_in` / `createdAtBlock_gte` filter into the
|
|
295
|
+
* query: `manifestDigest_in` is not a stable Ponder filter operator across all
|
|
296
|
+
* deploys, and the chain-wide total needs every recent task anyway. A
|
|
297
|
+
* client-side scan-then-bucket over the most-recent N pages is the portable
|
|
298
|
+
* shape. `windowEndBlock` for the HTTP backing is the indexer's latest indexed
|
|
299
|
+
* task block (the top row), not the chain head.
|
|
300
|
+
*/
|
|
301
|
+
const TASK_POST_COUNTS_QUERY = `
|
|
302
|
+
query TaskPostCounts($limit: Int!, $after: String) {
|
|
303
|
+
tasks(
|
|
304
|
+
limit: $limit,
|
|
305
|
+
after: $after,
|
|
306
|
+
orderBy: "createdAtBlock",
|
|
307
|
+
orderDirection: "desc"
|
|
308
|
+
) {
|
|
309
|
+
items {
|
|
310
|
+
id
|
|
311
|
+
manifestDigest
|
|
312
|
+
createdAtBlock
|
|
313
|
+
}
|
|
314
|
+
pageInfo {
|
|
315
|
+
hasNextPage
|
|
316
|
+
endCursor
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
`;
|
|
321
|
+
/**
|
|
322
|
+
* Most-recent task for a SolverNet (#957). Filters the `task` table by
|
|
323
|
+
* `manifestDigest = keccak256(manifestCid)` (the same digest join the other
|
|
324
|
+
* task queries use), orders newest-first by `createdAtBlock`, limit 1. Returns
|
|
325
|
+
* the row's `taskCidDigest` + `id` so the caller can reconstruct the IPFS task
|
|
326
|
+
* CID and read its eligibility ref.
|
|
327
|
+
*/
|
|
328
|
+
const MOST_RECENT_TASK_QUERY = `
|
|
329
|
+
query MostRecentTask($manifestDigest: String!) {
|
|
330
|
+
tasks(
|
|
331
|
+
where: { manifestDigest: $manifestDigest },
|
|
332
|
+
limit: 1,
|
|
333
|
+
orderBy: "createdAtBlock",
|
|
334
|
+
orderDirection: "desc"
|
|
335
|
+
) {
|
|
336
|
+
items {
|
|
337
|
+
id
|
|
338
|
+
taskCidDigest
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
`;
|
|
184
343
|
const QUERY_ENVELOPES_QUERY = `
|
|
185
344
|
query QueryEnvelopes($where: envelopeFilter, $limit: Int!) {
|
|
186
345
|
envelopes(
|
|
@@ -199,6 +358,67 @@ query QueryEnvelopes($where: envelopeFilter, $limit: Int!) {
|
|
|
199
358
|
}
|
|
200
359
|
}
|
|
201
360
|
`;
|
|
361
|
+
/** Sentinel for an unenriched / unknown launcher safe address. */
|
|
362
|
+
const ZERO_ADDR = '0x0000000000000000000000000000000000000000';
|
|
363
|
+
/** Coerce an indexer-supplied address to a typed hex, or fall back to the zero sentinel. */
|
|
364
|
+
function safeAddr(a) {
|
|
365
|
+
return typeof a === 'string' && /^0x[0-9a-fA-F]{40}$/.test(a) ? a : ZERO_ADDR;
|
|
366
|
+
}
|
|
367
|
+
// ── Per-codeDigest reward aggregates (#764) ──────────────────────────────────
|
|
368
|
+
const CODEDIGEST_ATTEMPTS_QUERY = `
|
|
369
|
+
query CodeDigestAttempts($codeDigests: [String!]!, $limit: Int!, $after: String) {
|
|
370
|
+
attemptEnvelopeMetas(
|
|
371
|
+
where: { codeDigest_in: $codeDigests, mode: "train", enrichmentStatus: "ok" },
|
|
372
|
+
limit: $limit,
|
|
373
|
+
after: $after,
|
|
374
|
+
orderBy: "enrichedAtBlock",
|
|
375
|
+
orderDirection: "desc"
|
|
376
|
+
) {
|
|
377
|
+
items { requestId chainId codeDigest }
|
|
378
|
+
pageInfo { hasNextPage endCursor }
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
`;
|
|
382
|
+
// The verdict leg is the only place per-SolverNet scoping is queryable: of the
|
|
383
|
+
// tables this method touches, only `verdictEnvelopeMeta` carries
|
|
384
|
+
// `solverNetManifestCid` (ponder.schema.ts:657 — written by the same IPFS
|
|
385
|
+
// task-body enrichment that resolves instanceId). `attemptEnvelopeMeta` has no
|
|
386
|
+
// SolverNet column. Aggregation (step 4) only counts requests that HAVE a
|
|
387
|
+
// verdict, so filtering the verdict leg correctly scopes the whole aggregate to
|
|
388
|
+
// the given SolverNet. The filter is emitted only when scoping is requested —
|
|
389
|
+
// Ponder treats a `null` `where` value as "IS NULL", not "skip the filter", so
|
|
390
|
+
// an unscoped call must omit the field entirely (#764).
|
|
391
|
+
function codeDigestVerdictsQuery(scopeBySolverNet) {
|
|
392
|
+
return `
|
|
393
|
+
query CodeDigestVerdicts($requestIds: [String!]!, $limit: Int!, $after: String${scopeBySolverNet ? ', $solverNetManifestCid: String!' : ''}) {
|
|
394
|
+
verdictEnvelopeMetas(
|
|
395
|
+
where: { requestId_in: $requestIds${scopeBySolverNet ? ', solverNetManifestCid: $solverNetManifestCid' : ''} },
|
|
396
|
+
limit: $limit,
|
|
397
|
+
after: $after,
|
|
398
|
+
orderBy: "requestId",
|
|
399
|
+
orderDirection: "asc"
|
|
400
|
+
) {
|
|
401
|
+
items { requestId chainId actualPassed actualScore passedCount totalCount }
|
|
402
|
+
pageInfo { hasNextPage endCursor }
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
`;
|
|
406
|
+
}
|
|
407
|
+
// Optional operator scoping: restrict attempts to those the operator claimed.
|
|
408
|
+
const CODEDIGEST_OPERATOR_ATTEMPTS_QUERY = `
|
|
409
|
+
query CodeDigestOperatorAttempts($requestIds: [String!]!, $operator: String!, $limit: Int!, $after: String) {
|
|
410
|
+
attempts(
|
|
411
|
+
where: { requestId_in: $requestIds, operator: $operator },
|
|
412
|
+
limit: $limit,
|
|
413
|
+
after: $after,
|
|
414
|
+
orderBy: "createdAtBlock",
|
|
415
|
+
orderDirection: "asc"
|
|
416
|
+
) {
|
|
417
|
+
items { requestId chainId }
|
|
418
|
+
pageInfo { hasNextPage endCursor }
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
`;
|
|
202
422
|
// ── Plug-in publication queries (attd) ───────────────────────────────────────
|
|
203
423
|
const LIST_PLUGIN_PUBLICATIONS_QUERY = `
|
|
204
424
|
query ListPluginPublications($where: pluginPublicationFilter, $limit: Int!) {
|
|
@@ -248,6 +468,17 @@ query GetPluginScores($pluginCid: String!, $limit: Int!) {
|
|
|
248
468
|
* a sync stall low without hammering the endpoint.
|
|
249
469
|
*/
|
|
250
470
|
const READY_PROBE_TTL_MS = 20_000;
|
|
471
|
+
/**
|
|
472
|
+
* Per-request timeout for every indexer fetch (the `/ready` probe and all
|
|
473
|
+
* GraphQL POSTs). A healthy indexer answers in well under a second; 15s is
|
|
474
|
+
* generous headroom that still recovers quickly. Its purpose is to convert a
|
|
475
|
+
* never-settling fetch (half-open socket during an indexer redeploy) into a
|
|
476
|
+
* catchable `DiscoveryUnavailableError` so the discovery/generator/catalog
|
|
477
|
+
* loops skip the tick and retry on the next poll, rather than wedging forever
|
|
478
|
+
* with no self-recovery while the indexer-independent loops mask the outage
|
|
479
|
+
* (#1038).
|
|
480
|
+
*/
|
|
481
|
+
const FETCH_TIMEOUT_MS = 15_000;
|
|
251
482
|
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
252
483
|
function parseOptionalNumber(value) {
|
|
253
484
|
if (typeof value === 'number')
|
|
@@ -306,10 +537,20 @@ export function createHttpDiscoveryAPI(opts) {
|
|
|
306
537
|
// Ponder's `/ready` lives at the host root, not under `/graphql`.
|
|
307
538
|
const readyUrl = `${opts.url.replace(/\/graphql\/?$/, '').replace(/\/$/, '')}/ready`;
|
|
308
539
|
const readyTtlMs = opts.readyProbeTtlMs ?? READY_PROBE_TTL_MS;
|
|
309
|
-
const
|
|
310
|
-
|
|
540
|
+
const fetchTimeoutMs = opts.fetchTimeoutMs ?? FETCH_TIMEOUT_MS;
|
|
541
|
+
const baseFetch = opts.fetchImpl ?? globalThis.fetch;
|
|
542
|
+
if (!baseFetch) {
|
|
311
543
|
throw new Error('No fetch implementation available; pass fetchImpl in options');
|
|
312
544
|
}
|
|
545
|
+
// Bound every indexer fetch with an AbortSignal timeout. Without it, a single
|
|
546
|
+
// fetch against an indexer whose socket went half-open (e.g. mid-redeploy)
|
|
547
|
+
// never resolves or rejects — and since the fetch is unbounded, the awaiting
|
|
548
|
+
// discovery/generator/catalog loop wedges forever with no self-recovery,
|
|
549
|
+
// while the indexer-independent loops keep running and mask the outage
|
|
550
|
+
// on-chain (#1038). A timeout turns the hang into the same
|
|
551
|
+
// DiscoveryUnavailableError those loops already catch and retry. A caller
|
|
552
|
+
// that supplies its own signal keeps it.
|
|
553
|
+
const fetchImpl = (input, init) => baseFetch(input, { ...init, signal: init?.signal ?? AbortSignal.timeout(fetchTimeoutMs) });
|
|
313
554
|
// ── /ready probe (memoized with a short TTL) ──────────────────────────────
|
|
314
555
|
// Ponder serves GraphQL with 200 + stale/empty data while still catching up;
|
|
315
556
|
// `/ready` returns non-200 until it is at realtime. The daemon's fallback
|
|
@@ -448,7 +689,10 @@ export function createHttpDiscoveryAPI(opts) {
|
|
|
448
689
|
// by id ASC and pages are appended in page order), but sort defensively
|
|
449
690
|
// so the round-robin always pulls the lowest unclaimed id from each CID
|
|
450
691
|
// even if upstream ordering ever changes.
|
|
451
|
-
bucket.sort((a, b) =>
|
|
692
|
+
bucket.sort((a, b) => {
|
|
693
|
+
const diff = BigInt(a.taskId) - BigInt(b.taskId);
|
|
694
|
+
return diff < 0n ? -1 : diff > 0n ? 1 : 0;
|
|
695
|
+
});
|
|
452
696
|
buckets.push(bucket);
|
|
453
697
|
}
|
|
454
698
|
// Round-robin interleave across CID buckets: pull index 0 from each CID
|
|
@@ -477,26 +721,51 @@ export function createHttpDiscoveryAPI(opts) {
|
|
|
477
721
|
where['status_in'] = args.status;
|
|
478
722
|
if (args?.launcherAgentId)
|
|
479
723
|
where['launcherAgentId'] = args.launcherAgentId;
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
//
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
724
|
+
let data;
|
|
725
|
+
try {
|
|
726
|
+
data = await postGql(gqlUrl, fetchImpl, LIST_SOLVER_NETS_QUERY, { where, limit: 200 });
|
|
727
|
+
}
|
|
728
|
+
catch (err) {
|
|
729
|
+
// Backward-compat degrade (issue #985): an OLD indexer that predates the
|
|
730
|
+
// enriched columns rejects the extended selection set with a GraphQL
|
|
731
|
+
// validation error. Mirror the getPluginScores degrade pattern: re-run
|
|
732
|
+
// the minimal legacy query and project sentinels, so a daemon on a new
|
|
733
|
+
// build still lists against an old indexer (consumers re-enrich via IPFS).
|
|
734
|
+
if (err instanceof Error && /Unknown type|Cannot query|Cannot query field/.test(err.message)) {
|
|
735
|
+
data = await postGql(gqlUrl, fetchImpl, LIST_SOLVER_NETS_QUERY_LEGACY, { where, limit: 200 });
|
|
736
|
+
}
|
|
737
|
+
else {
|
|
738
|
+
throw err;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
return (data.solverNetManifests?.items ?? []).map((row) => {
|
|
742
|
+
// Only trust enriched fields when the indexer marked the row 'ok'. A
|
|
743
|
+
// pending/failed row (or an old indexer that omits the field) keeps the
|
|
744
|
+
// sentinel rather than presenting an empty-string price as a real value.
|
|
745
|
+
// On the LIST hot path these rows pass through unenriched (degraded but
|
|
746
|
+
// present — empty name, '0' prices, zero address); full fields arrive once
|
|
747
|
+
// indexer enrichment lands, or via the hash-verified getManifest detail path.
|
|
748
|
+
const enriched = row.manifestEnrichmentStatus === 'ok';
|
|
749
|
+
return {
|
|
750
|
+
manifestCid: row.id,
|
|
751
|
+
solverNetId: enriched && row.solverNetId ? row.solverNetId : row.id,
|
|
752
|
+
name: enriched ? (row.name ?? '') : '',
|
|
753
|
+
network: enriched ? (row.network ?? '') : '',
|
|
754
|
+
launcherSafeAddress: enriched ? safeAddr(row.launcherSafeAddress) : ZERO_ADDR,
|
|
755
|
+
contractId: enriched ? (row.contractId ?? '') : '',
|
|
756
|
+
contractVersion: enriched ? (row.contractVersion ?? '') : '',
|
|
757
|
+
solutionPriceWei: enriched ? (row.solutionPriceWei ?? '0') : '0',
|
|
758
|
+
verdictPriceWei: enriched ? (row.verdictPriceWei ?? '0') : '0',
|
|
759
|
+
openRoles: enriched
|
|
760
|
+
? ((row.openRoles ?? []).filter((r) => r === 'solver' || r === 'evaluator'))
|
|
761
|
+
: [],
|
|
762
|
+
launcherAgentId: row.launcherAgentId,
|
|
763
|
+
status: row.status ?? 'launched',
|
|
764
|
+
statusUpdatedAt: row.statusUpdatedAt,
|
|
765
|
+
anchorBlock: Number(row.anchorBlock),
|
|
766
|
+
chainId: row.chainId,
|
|
767
|
+
};
|
|
768
|
+
});
|
|
500
769
|
}
|
|
501
770
|
// ── getLifecycleStatus ────────────────────────────────────────────────────
|
|
502
771
|
async function getLifecycleStatus(manifestCid) {
|
|
@@ -672,6 +941,275 @@ export function createHttpDiscoveryAPI(opts) {
|
|
|
672
941
|
});
|
|
673
942
|
return plugins;
|
|
674
943
|
}
|
|
944
|
+
// ── getInstanceSuccessCounts (#669) ────────────────────────────────────────
|
|
945
|
+
// Scoped to a single SolverNet via `verdictEnvelopeMeta.solverNetManifestCid`
|
|
946
|
+
// — the indexer enrichment writes this column from the task body's top-level
|
|
947
|
+
// `solverNetManifestCid` (task.v1 schema). Prevents multi-SolverNet operators
|
|
948
|
+
// with overlapping instance_id pools from cross-tenant over-counting
|
|
949
|
+
// (#669 Finding 2).
|
|
950
|
+
async function getInstanceSuccessCounts(args) {
|
|
951
|
+
await ensureReady();
|
|
952
|
+
// Defensive cap: 10 × 1000 rows. Expected ~125 successes per SolverNet
|
|
953
|
+
// (25 candidates × N_target_successes), so two orders of magnitude head.
|
|
954
|
+
const MAX_PAGES = 10;
|
|
955
|
+
const PAGE_LIMIT = 1000;
|
|
956
|
+
const counts = new Map();
|
|
957
|
+
const seen = new Set(); // (requestId|chainId) dedupe across pages
|
|
958
|
+
let cursor = null;
|
|
959
|
+
for (let page = 0; page < MAX_PAGES; page++) {
|
|
960
|
+
const data = await postGql(gqlUrl, fetchImpl, INSTANCE_SUCCESS_COUNTS_QUERY, { solverNetManifestCid: args.manifestCid, limit: PAGE_LIMIT, after: cursor });
|
|
961
|
+
const rows = data.verdictEnvelopeMetas?.items ?? [];
|
|
962
|
+
for (const row of rows) {
|
|
963
|
+
const key = `${row.requestId}|${row.chainId}`;
|
|
964
|
+
if (seen.has(key))
|
|
965
|
+
continue;
|
|
966
|
+
seen.add(key);
|
|
967
|
+
const id = row.instanceId;
|
|
968
|
+
if (!id)
|
|
969
|
+
continue;
|
|
970
|
+
counts.set(id, (counts.get(id) ?? 0) + 1);
|
|
971
|
+
}
|
|
972
|
+
const pageInfo = data.verdictEnvelopeMetas?.pageInfo;
|
|
973
|
+
if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
|
|
974
|
+
break;
|
|
975
|
+
cursor = pageInfo.endCursor;
|
|
976
|
+
}
|
|
977
|
+
return counts;
|
|
978
|
+
}
|
|
979
|
+
async function getCodeDigestRewards(args) {
|
|
980
|
+
if (args.codeDigests.length === 0)
|
|
981
|
+
return [];
|
|
982
|
+
await ensureReady();
|
|
983
|
+
const MAX_PAGES = 20;
|
|
984
|
+
const PAGE_LIMIT = 1000;
|
|
985
|
+
// Per-digest recency cap (#764 C1). CODEDIGEST_ATTEMPTS_QUERY orders by
|
|
986
|
+
// enrichedAtBlock desc, so attempt rows arrive newest-first. Ponder's
|
|
987
|
+
// GraphQL `limit` is global across all requested codeDigests, so the window
|
|
988
|
+
// MUST be enforced client-side per-digest — we keep only the first `window`
|
|
989
|
+
// rows seen for each codeDigest (i.e. the most recent). When undefined, no
|
|
990
|
+
// cap is applied (behaviour identical to before this change).
|
|
991
|
+
const windowCap = typeof args.window === 'number' && Number.isFinite(args.window) && args.window > 0
|
|
992
|
+
? Math.floor(args.window)
|
|
993
|
+
: undefined;
|
|
994
|
+
// 1) Pull train-mode attempt-meta rows for the requested codeDigests,
|
|
995
|
+
// capped to the most-recent `window` per codeDigest when set.
|
|
996
|
+
const requestKeyToDigest = new Map(); // "requestId|chainId" -> codeDigest
|
|
997
|
+
const keptPerDigest = new Map(); // codeDigest -> rows kept
|
|
998
|
+
let cursor = null;
|
|
999
|
+
for (let page = 0; page < MAX_PAGES; page++) {
|
|
1000
|
+
const data = await postGql(gqlUrl, fetchImpl, CODEDIGEST_ATTEMPTS_QUERY, { codeDigests: args.codeDigests, limit: PAGE_LIMIT, after: cursor });
|
|
1001
|
+
for (const row of data.attemptEnvelopeMetas?.items ?? []) {
|
|
1002
|
+
if (windowCap !== undefined) {
|
|
1003
|
+
const kept = keptPerDigest.get(row.codeDigest) ?? 0;
|
|
1004
|
+
if (kept >= windowCap)
|
|
1005
|
+
continue; // already have the window's worth for this digest
|
|
1006
|
+
keptPerDigest.set(row.codeDigest, kept + 1);
|
|
1007
|
+
}
|
|
1008
|
+
requestKeyToDigest.set(`${row.requestId}|${row.chainId}`, row.codeDigest);
|
|
1009
|
+
}
|
|
1010
|
+
const pi = data.attemptEnvelopeMetas?.pageInfo;
|
|
1011
|
+
if (!pi?.hasNextPage || !pi.endCursor)
|
|
1012
|
+
break;
|
|
1013
|
+
// Short-circuit pagination once every requested digest has filled its
|
|
1014
|
+
// window — no need to keep paging history we'll discard.
|
|
1015
|
+
if (windowCap !== undefined &&
|
|
1016
|
+
args.codeDigests.every((d) => (keptPerDigest.get(d) ?? 0) >= windowCap))
|
|
1017
|
+
break;
|
|
1018
|
+
cursor = pi.endCursor;
|
|
1019
|
+
}
|
|
1020
|
+
if (requestKeyToDigest.size === 0)
|
|
1021
|
+
return [];
|
|
1022
|
+
const requestIds = [...new Set([...requestKeyToDigest.keys()].map((k) => k.split('|')[0]))];
|
|
1023
|
+
// 2) Optional operator scoping: keep only requests the operator claimed.
|
|
1024
|
+
let allowedKeys = null;
|
|
1025
|
+
if (args.operator) {
|
|
1026
|
+
allowedKeys = new Set();
|
|
1027
|
+
cursor = null;
|
|
1028
|
+
for (let page = 0; page < MAX_PAGES; page++) {
|
|
1029
|
+
const data = await postGql(gqlUrl, fetchImpl, CODEDIGEST_OPERATOR_ATTEMPTS_QUERY, { requestIds, operator: args.operator, limit: PAGE_LIMIT, after: cursor });
|
|
1030
|
+
for (const row of data.attempts?.items ?? [])
|
|
1031
|
+
allowedKeys.add(`${row.requestId}|${row.chainId}`);
|
|
1032
|
+
const pi = data.attempts?.pageInfo;
|
|
1033
|
+
if (!pi?.hasNextPage || !pi.endCursor)
|
|
1034
|
+
break;
|
|
1035
|
+
cursor = pi.endCursor;
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
// 3) Pull verdict-meta rows for those requestIds (actualPassed/actualScore).
|
|
1039
|
+
// Optionally scope to a single SolverNet: verdictEnvelopeMeta is the only
|
|
1040
|
+
// queryable table carrying solverNetManifestCid, and only requests with a
|
|
1041
|
+
// verdict are aggregated (step 4), so filtering here scopes the aggregate.
|
|
1042
|
+
const scopeBySolverNet = typeof args.solverNetManifestCid === 'string' && args.solverNetManifestCid.length > 0;
|
|
1043
|
+
const verdictsQuery = codeDigestVerdictsQuery(scopeBySolverNet);
|
|
1044
|
+
const verdictByKey = new Map();
|
|
1045
|
+
cursor = null;
|
|
1046
|
+
for (let page = 0; page < MAX_PAGES; page++) {
|
|
1047
|
+
const variables = { requestIds, limit: PAGE_LIMIT, after: cursor };
|
|
1048
|
+
if (scopeBySolverNet)
|
|
1049
|
+
variables.solverNetManifestCid = args.solverNetManifestCid;
|
|
1050
|
+
const data = await postGql(gqlUrl, fetchImpl, verdictsQuery, variables);
|
|
1051
|
+
for (const row of data.verdictEnvelopeMetas?.items ?? []) {
|
|
1052
|
+
const key = `${row.requestId}|${row.chainId}`;
|
|
1053
|
+
const scoreNum = Number(row.actualScore);
|
|
1054
|
+
const pc = Number(row.passedCount);
|
|
1055
|
+
const tc = Number(row.totalCount);
|
|
1056
|
+
const graded = Number.isFinite(tc) && tc > 0 ? pc / tc : null;
|
|
1057
|
+
verdictByKey.set(key, {
|
|
1058
|
+
passed: Boolean(row.actualPassed),
|
|
1059
|
+
score: Number.isFinite(scoreNum) && row.actualScore !== '' ? scoreNum : null,
|
|
1060
|
+
graded,
|
|
1061
|
+
});
|
|
1062
|
+
}
|
|
1063
|
+
const pi = data.verdictEnvelopeMetas?.pageInfo;
|
|
1064
|
+
if (!pi?.hasNextPage || !pi.endCursor)
|
|
1065
|
+
break;
|
|
1066
|
+
cursor = pi.endCursor;
|
|
1067
|
+
}
|
|
1068
|
+
// 4) Aggregate per codeDigest (only requests that HAVE a verdict count).
|
|
1069
|
+
const agg = new Map();
|
|
1070
|
+
for (const [key, digest] of requestKeyToDigest) {
|
|
1071
|
+
if (allowedKeys && !allowedKeys.has(key))
|
|
1072
|
+
continue;
|
|
1073
|
+
const v = verdictByKey.get(key);
|
|
1074
|
+
if (!v)
|
|
1075
|
+
continue; // no verdict yet — not a completed attempt
|
|
1076
|
+
const cur = agg.get(digest) ?? { attempts: 0, passes: 0, scoreSum: 0, scoreN: 0, gradedScores: [] };
|
|
1077
|
+
cur.attempts += 1;
|
|
1078
|
+
if (v.passed)
|
|
1079
|
+
cur.passes += 1;
|
|
1080
|
+
if (v.score !== null) {
|
|
1081
|
+
cur.scoreSum += v.score;
|
|
1082
|
+
cur.scoreN += 1;
|
|
1083
|
+
}
|
|
1084
|
+
if (v.graded !== null)
|
|
1085
|
+
cur.gradedScores.push(v.graded);
|
|
1086
|
+
agg.set(digest, cur);
|
|
1087
|
+
}
|
|
1088
|
+
const rows = [];
|
|
1089
|
+
for (const [codeDigest, a] of agg) {
|
|
1090
|
+
rows.push({
|
|
1091
|
+
codeDigest,
|
|
1092
|
+
attempts: a.attempts,
|
|
1093
|
+
passes: a.passes,
|
|
1094
|
+
passRate: a.attempts > 0 ? a.passes / a.attempts : 0,
|
|
1095
|
+
avgScore: a.scoreN > 0 ? a.scoreSum / a.scoreN : 0,
|
|
1096
|
+
gradedScores: a.gradedScores,
|
|
1097
|
+
});
|
|
1098
|
+
}
|
|
1099
|
+
return rows;
|
|
1100
|
+
}
|
|
1101
|
+
// ── getInstanceClaimCounts (#802) ──────────────────────────────────────────
|
|
1102
|
+
// Per-task consumed-vs-maxClaims for a SolverNet. Two legs, mirroring
|
|
1103
|
+
// getSolverNetOperatorCount: leg 1 pages tasks (+ maxClaims) for the
|
|
1104
|
+
// manifestDigest; leg 2 pages attempts (consumed slots) batched by taskId_in.
|
|
1105
|
+
async function getInstanceClaimCounts(args) {
|
|
1106
|
+
await ensureReady();
|
|
1107
|
+
const manifestDigest = manifestDigestForCid(args.manifestCid).toLowerCase();
|
|
1108
|
+
// Leg 1: task ids + maxClaims for this SolverNet (single-chain → shared chainId).
|
|
1109
|
+
const maxClaimsByTaskId = new Map();
|
|
1110
|
+
const taskIds = [];
|
|
1111
|
+
let chainId;
|
|
1112
|
+
let taskCursor = null;
|
|
1113
|
+
for (let page = 0; page < MAX_OPERATOR_COUNT_TASK_PAGES; page++) {
|
|
1114
|
+
const data = await postGql(gqlUrl, fetchImpl, CLAIM_COUNT_TASKS_QUERY, { manifestDigest, limit: ATTEMPTS_PAGE_LIMIT, after: taskCursor });
|
|
1115
|
+
for (const row of data.tasks?.items ?? []) {
|
|
1116
|
+
taskIds.push(row.id);
|
|
1117
|
+
maxClaimsByTaskId.set(row.id, row.maxClaims);
|
|
1118
|
+
if (chainId === undefined)
|
|
1119
|
+
chainId = row.chainId;
|
|
1120
|
+
}
|
|
1121
|
+
const pageInfo = data.tasks?.pageInfo;
|
|
1122
|
+
if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
|
|
1123
|
+
break;
|
|
1124
|
+
taskCursor = pageInfo.endCursor;
|
|
1125
|
+
}
|
|
1126
|
+
if (taskIds.length === 0 || chainId === undefined) {
|
|
1127
|
+
return new Map();
|
|
1128
|
+
}
|
|
1129
|
+
// Leg 2: count attempts per taskId (= consumed slots), batched by taskId_in.
|
|
1130
|
+
const consumedByTaskId = new Map();
|
|
1131
|
+
let attemptCursor = null;
|
|
1132
|
+
for (;;) {
|
|
1133
|
+
const data = await postGql(gqlUrl, fetchImpl, ATTEMPTS_FOR_TASKS_QUERY, { taskIds, chainId, limit: ATTEMPTS_PAGE_LIMIT, after: attemptCursor });
|
|
1134
|
+
for (const a of data.attempts?.items ?? []) {
|
|
1135
|
+
consumedByTaskId.set(a.taskId, (consumedByTaskId.get(a.taskId) ?? 0) + 1);
|
|
1136
|
+
}
|
|
1137
|
+
const pageInfo = data.attempts?.pageInfo;
|
|
1138
|
+
if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
|
|
1139
|
+
break;
|
|
1140
|
+
attemptCursor = pageInfo.endCursor;
|
|
1141
|
+
}
|
|
1142
|
+
const out = new Map();
|
|
1143
|
+
for (const taskId of taskIds) {
|
|
1144
|
+
out.set(taskId, {
|
|
1145
|
+
taskId,
|
|
1146
|
+
consumed: consumedByTaskId.get(taskId) ?? 0,
|
|
1147
|
+
maxClaims: maxClaimsByTaskId.get(taskId) ?? 0,
|
|
1148
|
+
});
|
|
1149
|
+
}
|
|
1150
|
+
return out;
|
|
1151
|
+
}
|
|
1152
|
+
// ── getTaskPostCounts (#918) ───────────────────────────────────────────────
|
|
1153
|
+
// Page the most-recent tasks (createdAtBlock desc); the top row's block is the
|
|
1154
|
+
// window head. Bucket the three windows AND the per-cid totals client-side.
|
|
1155
|
+
// windowEndBlock here is the indexer's latest indexed task block, not the
|
|
1156
|
+
// chain head (the indexer is the source of truth on the HTTP path).
|
|
1157
|
+
async function getTaskPostCounts(args) {
|
|
1158
|
+
await ensureReady();
|
|
1159
|
+
const windowEndTs = Math.floor(Date.now() / 1000);
|
|
1160
|
+
const cids = Array.from(new Set((args?.manifestCids ?? []).filter(Boolean)));
|
|
1161
|
+
const cidByDigest = new Map();
|
|
1162
|
+
for (const cid of cids) {
|
|
1163
|
+
cidByDigest.set(manifestDigestForCid(cid).toLowerCase(), cid);
|
|
1164
|
+
}
|
|
1165
|
+
// Page createdAtBlock desc. The first row sets the window head; we stop
|
|
1166
|
+
// paging once a page's oldest row falls before the 24h cut (everything
|
|
1167
|
+
// beyond is outside every window).
|
|
1168
|
+
const rows = [];
|
|
1169
|
+
let head;
|
|
1170
|
+
let cursor = null;
|
|
1171
|
+
for (let page = 0; page < MAX_TASK_POST_PAGES; page++) {
|
|
1172
|
+
const data = await postGql(gqlUrl, fetchImpl, TASK_POST_COUNTS_QUERY, { limit: 1000, after: cursor });
|
|
1173
|
+
const items = data.tasks?.items ?? [];
|
|
1174
|
+
for (const row of items) {
|
|
1175
|
+
const block = Number(row.createdAtBlock);
|
|
1176
|
+
if (!Number.isFinite(block))
|
|
1177
|
+
continue;
|
|
1178
|
+
if (head === undefined)
|
|
1179
|
+
head = block;
|
|
1180
|
+
rows.push({ digest: (row.manifestDigest ?? '').toLowerCase(), block });
|
|
1181
|
+
}
|
|
1182
|
+
const pageInfo = data.tasks?.pageInfo;
|
|
1183
|
+
// Once the oldest row this page is past the 24h cut, no further page can
|
|
1184
|
+
// contribute (desc order) — stop early.
|
|
1185
|
+
if (head !== undefined && items.length > 0) {
|
|
1186
|
+
const oldest = Number(items[items.length - 1].createdAtBlock);
|
|
1187
|
+
if (Number.isFinite(oldest) && oldest < head - TASK_POST_WINDOW_BLOCKS.h24)
|
|
1188
|
+
break;
|
|
1189
|
+
}
|
|
1190
|
+
if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
|
|
1191
|
+
break;
|
|
1192
|
+
cursor = pageInfo.endCursor;
|
|
1193
|
+
}
|
|
1194
|
+
const windowEndBlock = head ?? 0;
|
|
1195
|
+
const { chain, byCid } = bucketTaskPostCounts(windowEndBlock, windowEndTs, rows, cidByDigest);
|
|
1196
|
+
return { windowEndBlock, windowEndTs, chain, byCid };
|
|
1197
|
+
}
|
|
1198
|
+
// ── getMostRecentTaskCidDigest (#957) ──────────────────────────────────────
|
|
1199
|
+
// Single newest task (createdAtBlock desc, limit 1) for the SolverNet's
|
|
1200
|
+
// manifestDigest. Pure indexer read — no IPFS hop; the caller reconstructs the
|
|
1201
|
+
// task CID from the returned digest.
|
|
1202
|
+
async function getMostRecentTaskCidDigest(manifestCid) {
|
|
1203
|
+
await ensureReady();
|
|
1204
|
+
// The indexer keys tasks by `manifestDigest = keccak256(toBytes(cid))`, not
|
|
1205
|
+
// by the cid string — same join the other task queries use.
|
|
1206
|
+
const manifestDigest = manifestDigestForCid(manifestCid).toLowerCase();
|
|
1207
|
+
const data = await postGql(gqlUrl, fetchImpl, MOST_RECENT_TASK_QUERY, { manifestDigest });
|
|
1208
|
+
const row = data.tasks?.items?.[0];
|
|
1209
|
+
if (!row || !isHex(row.taskCidDigest))
|
|
1210
|
+
return undefined;
|
|
1211
|
+
return { taskCidDigest: row.taskCidDigest, taskId: row.id };
|
|
1212
|
+
}
|
|
675
1213
|
return {
|
|
676
1214
|
findClaimableTasks,
|
|
677
1215
|
listLaunchedSolverNets,
|
|
@@ -681,6 +1219,11 @@ export function createHttpDiscoveryAPI(opts) {
|
|
|
681
1219
|
listPluginPublications,
|
|
682
1220
|
getPluginScores,
|
|
683
1221
|
listBuilderArtifacts,
|
|
1222
|
+
getInstanceSuccessCounts,
|
|
1223
|
+
getCodeDigestRewards,
|
|
1224
|
+
getInstanceClaimCounts,
|
|
1225
|
+
getTaskPostCounts,
|
|
1226
|
+
getMostRecentTaskCidDigest,
|
|
684
1227
|
};
|
|
685
1228
|
}
|
|
686
1229
|
//# sourceMappingURL=http.js.map
|