@jinn-network/client 0.1.8 → 0.1.9-canary.023faefb
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/CONTRIBUTING.md +2 -2
- package/README.md +6 -0
- package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +3 -3
- package/deployments/deployment-stolas-l2-baseSepolia-fast.json +23 -3
- package/deployments/deployment-task-coordinator-router-v3-baseSepolia-fast.json +34 -6
- package/dist/adapters/mech/adapter.d.ts +31 -1
- package/dist/adapters/mech/adapter.js +126 -53
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +174 -13
- package/dist/adapters/mech/contracts.js +99 -49
- 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.js +77 -1
- package/dist/adapters/mech/safe.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +5 -130
- package/dist/adapters/mech/types.js +9 -65
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/adapters/mech/verdict-code.js +1 -1
- package/dist/adapters/mech/verdict-code.js.map +1 -1
- package/dist/api/bootstrap-endpoint.d.ts +19 -3
- package/dist/api/bootstrap-endpoint.js +4 -0
- package/dist/api/bootstrap-endpoint.js.map +1 -1
- 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 +26 -17
- package/dist/api/gather-status.js +62 -520
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/harness-auth-status-endpoint.d.ts +21 -0
- package/dist/api/harness-auth-status-endpoint.js +17 -0
- package/dist/api/harness-auth-status-endpoint.js.map +1 -0
- package/dist/api/launcher-endpoints.js +6 -1
- package/dist/api/launcher-endpoints.js.map +1 -1
- package/dist/api/launcher-status.d.ts +2 -0
- package/dist/api/launcher-status.js.map +1 -1
- package/dist/api/launcher-tasks.d.ts +47 -0
- package/dist/api/launcher-tasks.js +88 -3
- 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 +154 -0
- package/dist/api/loop-completion-build.js.map +1 -0
- package/dist/api/operator-artifacts-endpoint.js +1 -1
- package/dist/api/operator-artifacts-endpoint.js.map +1 -1
- package/dist/api/portfolio-v0-build.d.ts +2 -1
- package/dist/api/portfolio-v0-build.js +5 -7
- package/dist/api/portfolio-v0-build.js.map +1 -1
- package/dist/api/prediction-v1-build.d.ts +2 -2
- package/dist/api/prediction-v1-build.js +5 -7
- package/dist/api/prediction-v1-build.js.map +1 -1
- package/dist/api/rewards-build.d.ts +8 -1
- package/dist/api/rewards-build.js +32 -4
- package/dist/api/rewards-build.js.map +1 -1
- package/dist/api/rewards-endpoint.d.ts +12 -0
- package/dist/api/rewards-endpoint.js +46 -0
- package/dist/api/rewards-endpoint.js.map +1 -0
- package/dist/api/server.d.ts +6 -16
- package/dist/api/server.js +29 -26
- package/dist/api/server.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +45 -0
- package/dist/api/setup-endpoints.js +271 -52
- package/dist/api/setup-endpoints.js.map +1 -1
- package/dist/api/solvernets-endpoints.js +4 -1
- package/dist/api/solvernets-endpoints.js.map +1 -1
- package/dist/api/status-build.d.ts +71 -94
- package/dist/api/status-build.js +11 -77
- package/dist/api/status-build.js.map +1 -1
- 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/stop-hook.d.ts +1 -1
- package/dist/api/stop-hook.js +1 -1
- package/dist/api/stop-hook.js.map +1 -1
- package/dist/api/task-run-routing.d.ts +1 -1
- package/dist/api/task-runs-build.d.ts +2 -2
- package/dist/api/task-runs-build.js +5 -7
- package/dist/api/task-runs-build.js.map +1 -1
- package/dist/bin/jinn-distil-mcp.js +813 -0
- package/dist/bin/jinn-layer.js +12568 -0
- package/dist/build-info.json +4 -4
- package/dist/build-meta.json +1 -1
- package/dist/captures/distil-export.d.ts +54 -0
- package/dist/captures/distil-export.js +135 -0
- package/dist/captures/distil-export.js.map +1 -0
- package/dist/captures/ingest.d.ts +21 -0
- package/dist/captures/ingest.js +144 -0
- package/dist/captures/ingest.js.map +1 -0
- package/dist/captures/live-publisher.d.ts +9 -0
- package/dist/captures/live-publisher.js +5 -3
- package/dist/captures/live-publisher.js.map +1 -1
- package/dist/captures/publish.d.ts +15 -0
- package/dist/captures/publish.js +17 -7
- package/dist/captures/publish.js.map +1 -1
- package/dist/cli/commands/codedigest-revert-check.js +6 -2
- package/dist/cli/commands/codedigest-revert-check.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +36 -4
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/eval.d.ts +87 -0
- package/dist/cli/commands/eval.js +481 -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 +39 -10
- package/dist/cli/commands/rewards.js.map +1 -1
- package/dist/cli/commands/solver-nets.js +68 -0
- package/dist/cli/commands/solver-nets.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/update.js +8 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/version.js +4 -0
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/execution-context.js +2 -1
- package/dist/cli/execution-context.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/introspection-context.js +0 -3
- package/dist/cli/introspection-context.js.map +1 -1
- package/dist/config.d.ts +158 -541
- package/dist/config.js +190 -197
- package/dist/config.js.map +1 -1
- package/dist/contracts/abis.d.ts +100 -0
- package/dist/contracts/abis.js +58 -0
- package/dist/contracts/abis.js.map +1 -0
- package/dist/contracts/addresses.d.ts +36 -0
- package/dist/contracts/addresses.js +60 -0
- package/dist/contracts/addresses.js.map +1 -0
- package/dist/corpus/acquire.d.ts +7 -6
- package/dist/corpus/acquire.js +10 -10
- package/dist/corpus/acquire.js.map +1 -1
- package/dist/corpus/fetch-artifact.d.ts +21 -0
- package/dist/corpus/fetch-artifact.js +33 -0
- package/dist/corpus/fetch-artifact.js.map +1 -0
- package/dist/corpus/index.d.ts +2 -2
- package/dist/corpus/onchain-query.d.ts +0 -1
- package/dist/corpus/onchain-query.js +2 -5
- package/dist/corpus/onchain-query.js.map +1 -1
- package/dist/corpus/route-resolver.d.ts +3 -3
- package/dist/corpus/route-resolver.js +3 -3
- package/dist/daemon/ai-units-gate.d.ts +6 -6
- package/dist/daemon/ai-units-gate.js +11 -10
- package/dist/daemon/ai-units-gate.js.map +1 -1
- package/dist/daemon/balance-topup-loop.js +27 -9
- package/dist/daemon/balance-topup-loop.js.map +1 -1
- package/dist/daemon/checkpoint-loop.js +2 -2
- package/dist/daemon/creator.d.ts +1 -0
- package/dist/daemon/creator.js +39 -25
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +15 -10
- package/dist/daemon/daemon.js +95 -41
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/delivery-watcher.d.ts +9 -0
- package/dist/daemon/delivery-watcher.js +24 -1
- package/dist/daemon/delivery-watcher.js.map +1 -1
- package/dist/daemon/eviction-loop.d.ts +7 -0
- package/dist/daemon/eviction-loop.js +19 -3
- package/dist/daemon/eviction-loop.js.map +1 -1
- package/dist/daemon/join-applier.d.ts +35 -0
- package/dist/daemon/join-applier.js +49 -0
- package/dist/daemon/join-applier.js.map +1 -0
- package/dist/daemon/loop-heartbeat.d.ts +89 -0
- package/dist/daemon/loop-heartbeat.js +75 -0
- package/dist/daemon/loop-heartbeat.js.map +1 -0
- package/dist/{api/peers.js → daemon/peer-sync.js} +3 -1
- package/dist/daemon/peer-sync.js.map +1 -0
- package/dist/daemon/reward-claim-loop.js +28 -10
- package/dist/daemon/reward-claim-loop.js.map +1 -1
- package/dist/daemon/skip-log-dedup.d.ts +1 -1
- package/dist/daemon/skip-log-dedup.js +3 -0
- package/dist/daemon/skip-log-dedup.js.map +1 -1
- package/dist/daemon/spend-cap-gate.d.ts +0 -6
- package/dist/daemon/spend-cap-gate.js +1 -8
- package/dist/daemon/spend-cap-gate.js.map +1 -1
- package/dist/daemon/watchdog-loop.d.ts +84 -0
- package/dist/daemon/watchdog-loop.js +91 -0
- package/dist/daemon/watchdog-loop.js.map +1 -0
- package/dist/dashboard/assets/index-B_5Cb-ZH.js +161 -0
- package/dist/dashboard/assets/index-D7rvJRNa.css +1 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/discovery/http.d.ts +17 -0
- package/dist/discovery/http.js +378 -26
- package/dist/discovery/http.js.map +1 -1
- package/dist/discovery/onchain.js +174 -10
- package/dist/discovery/onchain.js.map +1 -1
- package/dist/discovery/types.d.ts +149 -0
- package/dist/discovery/types.js +40 -0
- package/dist/discovery/types.js.map +1 -1
- package/dist/discovery/with-fallback.js +24 -0
- package/dist/discovery/with-fallback.js.map +1 -1
- package/dist/earning/bootstrap-run.d.ts +25 -0
- package/dist/earning/bootstrap-run.js +315 -0
- package/dist/earning/bootstrap-run.js.map +1 -0
- package/dist/earning/bootstrap.d.ts +31 -11
- package/dist/earning/bootstrap.js +123 -212
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +2 -232
- package/dist/earning/contracts.js +16 -205
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/faucet-topup-store.d.ts +41 -0
- package/dist/earning/faucet-topup-store.js +89 -0
- package/dist/earning/faucet-topup-store.js.map +1 -0
- 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 +12 -45
- package/dist/earning/safe-adapter.js.map +1 -1
- package/dist/earning/steps/context.d.ts +42 -0
- package/dist/earning/steps/context.js +4 -0
- package/dist/earning/steps/context.js.map +1 -0
- package/dist/earning/steps/fleet-identity-register.d.ts +4 -0
- package/dist/earning/steps/fleet-identity-register.js +65 -0
- package/dist/earning/steps/fleet-identity-register.js.map +1 -0
- package/dist/earning/steps/fleet-safe-deploy.d.ts +4 -0
- package/dist/earning/steps/fleet-safe-deploy.js +62 -0
- package/dist/earning/steps/fleet-safe-deploy.js.map +1 -0
- package/dist/earning/steps/fleet-safe-predict.d.ts +4 -0
- package/dist/earning/steps/fleet-safe-predict.js +18 -0
- package/dist/earning/steps/fleet-safe-predict.js.map +1 -0
- package/dist/earning/steps/receipt-parsing.d.ts +12 -0
- package/dist/earning/steps/receipt-parsing.js +71 -0
- package/dist/earning/steps/receipt-parsing.js.map +1 -0
- package/dist/earning/stolas-claim.js +8 -8
- package/dist/earning/stolas-claim.js.map +1 -1
- package/dist/earning/{jinn-rewards.d.ts → stolas-staking.d.ts} +4 -8
- package/dist/earning/{jinn-rewards.js → stolas-staking.js} +6 -10
- package/dist/earning/stolas-staking.js.map +1 -0
- package/dist/earning/testnet-setup-migration.d.ts +1 -0
- package/dist/earning/testnet-setup-migration.js +7 -2
- package/dist/earning/testnet-setup-migration.js.map +1 -1
- package/dist/earning/types.d.ts +1 -1
- package/dist/earning/types.js +1 -1
- package/dist/earning/types.js.map +1 -1
- package/dist/earning/viem-clients.d.ts +3 -19
- package/dist/earning/viem-clients.js +4 -31
- package/dist/earning/viem-clients.js.map +1 -1
- package/dist/erc8004/addresses.d.ts +6 -5
- package/dist/erc8004/addresses.js +7 -5
- package/dist/erc8004/addresses.js.map +1 -1
- package/dist/erc8004/identity.d.ts +12 -1
- package/dist/erc8004/identity.js +31 -0
- package/dist/erc8004/identity.js.map +1 -1
- package/dist/erc8004/index.d.ts +1 -1
- package/dist/erc8004/index.js +1 -1
- package/dist/erc8004/index.js.map +1 -1
- package/dist/eval/capability-slate.d.ts +54 -0
- package/dist/eval/capability-slate.js +116 -0
- package/dist/eval/capability-slate.js.map +1 -0
- package/dist/eval/capability-stats.d.ts +39 -0
- package/dist/eval/capability-stats.js +123 -0
- package/dist/eval/capability-stats.js.map +1 -0
- package/dist/eval/contested-band.d.ts +18 -0
- package/dist/eval/contested-band.js +19 -0
- package/dist/eval/contested-band.js.map +1 -0
- package/dist/eval/corpus-index.d.ts +21 -0
- package/dist/eval/corpus-index.js +55 -0
- package/dist/eval/corpus-index.js.map +1 -0
- package/dist/eval/disjointness.d.ts +26 -0
- package/dist/eval/disjointness.js +67 -0
- package/dist/eval/disjointness.js.map +1 -0
- 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/mcnemar-power.d.ts +14 -0
- package/dist/eval/mcnemar-power.js +40 -0
- package/dist/eval/mcnemar-power.js.map +1 -0
- package/dist/eval/orchestrator.d.ts +224 -0
- package/dist/eval/orchestrator.js +250 -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 +1 -1
- package/dist/events/types.js +1 -1
- package/dist/events/types.js.map +1 -1
- package/dist/harnesses/auth-source.d.ts +51 -0
- package/dist/harnesses/auth-source.js +155 -0
- package/dist/harnesses/auth-source.js.map +1 -0
- 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 +34 -1
- package/dist/harnesses/engine/engine.js +91 -11
- package/dist/harnesses/engine/engine.js.map +1 -1
- package/dist/harnesses/engine/packaging.js +5 -5
- package/dist/harnesses/engine/packaging.js.map +1 -1
- package/dist/harnesses/engine/persistence.d.ts +19 -61
- package/dist/harnesses/engine/persistence.js +28 -0
- package/dist/harnesses/engine/persistence.js.map +1 -1
- package/dist/harnesses/impls/_evaluator-base.d.ts +48 -0
- package/dist/harnesses/impls/_evaluator-base.js +35 -0
- package/dist/harnesses/impls/_evaluator-base.js.map +1 -0
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +1 -1
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js +1 -1
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/index.d.ts +2 -3
- package/dist/harnesses/impls/claude-mcp-prediction/index.js +29 -99
- package/dist/harnesses/impls/claude-mcp-prediction/index.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/mcp-tools.js +4 -21
- package/dist/harnesses/impls/claude-mcp-prediction/mcp-tools.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/session-orchestrator.d.ts +2 -0
- package/dist/harnesses/impls/claude-mcp-prediction/session-orchestrator.js +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/session-orchestrator.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js +30 -79
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/mcp-tools.js +4 -19
- package/dist/harnesses/impls/claude-mcp-prediction-apy/mcp-tools.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/session-orchestrator.d.ts +2 -0
- package/dist/harnesses/impls/claude-mcp-prediction-apy/session-orchestrator.js +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/session-orchestrator.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server-script.d.ts +39 -0
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server-script.js +62 -0
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server-script.js.map +1 -0
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server.d.ts +40 -0
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server.js +44 -0
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server.js.map +1 -0
- package/dist/harnesses/impls/claude-mcp-shared/single-session-harness.d.ts +56 -0
- package/dist/harnesses/impls/claude-mcp-shared/single-session-harness.js +79 -0
- package/dist/harnesses/impls/claude-mcp-shared/single-session-harness.js.map +1 -0
- 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 +6 -1
- package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/harness.d.ts +25 -3
- package/dist/harnesses/impls/hermes-agent/harness.js +89 -5
- package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
- package/dist/harnesses/impls/index.d.ts +2 -0
- package/dist/harnesses/impls/index.js +10 -1
- package/dist/harnesses/impls/index.js.map +1 -1
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.d.ts +34 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js +111 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.d.ts +24 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js +19 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.d.ts +64 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.js +125 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.d.ts +32 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.js +73 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.js.map +1 -0
- package/dist/harnesses/impls/learner/adapters/claude-code.js +5 -0
- package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
- package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +11 -1
- package/dist/harnesses/impls/learner/adapters/codex-code.js +130 -15
- package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
- package/dist/harnesses/impls/learner/harness.d.ts +29 -1
- package/dist/harnesses/impls/learner/harness.js +85 -1
- package/dist/harnesses/impls/learner/harness.js.map +1 -1
- package/dist/harnesses/impls/learner/harvest.d.ts +2 -0
- package/dist/harnesses/impls/learner/harvest.js +51 -1
- 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/portfolio-v0-evaluator/index.d.ts +5 -15
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js +10 -29
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.d.ts +5 -15
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js +10 -23
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/index.d.ts +5 -15
- package/dist/harnesses/impls/prediction-v0-evaluator/index.js +10 -25
- package/dist/harnesses/impls/prediction-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/stub.d.ts +2 -2
- package/dist/harnesses/impls/stub.js +2 -2
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +8 -0
- 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/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 +16 -0
- package/dist/harnesses/readiness-registry.js +28 -6
- package/dist/harnesses/readiness-registry.js.map +1 -1
- package/dist/harnesses/types.d.ts +26 -0
- package/dist/learner/revert-decision.d.ts +16 -1
- package/dist/learner/revert-decision.js +38 -18
- package/dist/learner/revert-decision.js.map +1 -1
- package/dist/learner/revert-stats.d.ts +14 -0
- package/dist/learner/revert-stats.js +42 -0
- package/dist/learner/revert-stats.js.map +1 -1
- package/dist/learner/verification-gate.d.ts +53 -0
- package/dist/learner/verification-gate.js +80 -0
- package/dist/learner/verification-gate.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 +188 -566
- package/dist/main.js.map +1 -1
- package/dist/mcp/acquire-artifact.d.ts +3 -3
- package/dist/mcp/acquire-artifact.js +3 -3
- package/dist/mcp/operator-server.js +1 -1
- package/dist/mcp/operator-server.js.map +1 -1
- package/dist/mcp/server.js +5 -6
- package/dist/mcp/server.js.map +1 -1
- package/dist/monitoring/net-liveness.d.ts +143 -0
- package/dist/monitoring/net-liveness.js +301 -0
- package/dist/monitoring/net-liveness.js.map +1 -0
- package/dist/observability/emit-event.d.ts +1 -1
- package/dist/observability/emit-event.js +0 -4
- package/dist/observability/emit-event.js.map +1 -1
- package/dist/observability/progress.d.ts +11 -0
- package/dist/observability/progress.js +16 -0
- package/dist/observability/progress.js.map +1 -0
- package/dist/pilot/cost.d.ts +19 -0
- package/dist/pilot/cost.js +31 -0
- package/dist/pilot/cost.js.map +1 -0
- package/dist/pilot/instance.d.ts +20 -0
- package/dist/pilot/instance.js +19 -0
- package/dist/pilot/instance.js.map +1 -0
- package/dist/pilot/repo.d.ts +31 -0
- package/dist/pilot/repo.js +42 -0
- package/dist/pilot/repo.js.map +1 -0
- package/dist/pilot/solve.d.ts +22 -0
- package/dist/pilot/solve.js +37 -0
- package/dist/pilot/solve.js.map +1 -0
- package/dist/pilot/tally.d.ts +35 -0
- package/dist/pilot/tally.js +61 -0
- package/dist/pilot/tally.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 +4 -0
- package/dist/plugins/local-trace-distiller/.claude-plugin/plugin.json +9 -0
- package/dist/plugins/local-trace-distiller/.codex-plugin/plugin.json +41 -0
- package/dist/plugins/local-trace-distiller/.mcp.json +8 -0
- package/dist/plugins/local-trace-distiller/README.md +27 -0
- package/dist/plugins/local-trace-distiller/jinn.plugin.json +36 -0
- package/dist/plugins/local-trace-distiller/skills/distill/SKILL.md +51 -0
- package/dist/preflight/deployment-readiness.d.ts +127 -0
- package/dist/preflight/deployment-readiness.js +308 -0
- package/dist/preflight/deployment-readiness.js.map +1 -0
- package/dist/preflight/pidfile-liveness.d.ts +7 -1
- package/dist/preflight/pidfile-liveness.js +14 -0
- package/dist/preflight/pidfile-liveness.js.map +1 -1
- package/dist/preflight/rpc-network.d.ts +10 -3
- package/dist/preflight/rpc-network.js +46 -13
- package/dist/preflight/rpc-network.js.map +1 -1
- package/dist/preflight/stable-cwd.d.ts +29 -0
- package/dist/preflight/stable-cwd.js +98 -0
- package/dist/preflight/stable-cwd.js.map +1 -0
- package/dist/rpc/transport.d.ts +43 -5
- package/dist/rpc/transport.js +131 -30
- package/dist/rpc/transport.js.map +1 -1
- package/dist/scripts/swe-rebench-v2-seed-pool.json +2 -1
- package/dist/solver-nets/registry.d.ts +19 -0
- package/dist/solver-nets/registry.js +95 -66
- package/dist/solver-nets/registry.js.map +1 -1
- package/dist/solver-types/_jinn-repo-pool.d.ts +27 -0
- package/dist/solver-types/_jinn-repo-pool.js +27 -0
- package/dist/solver-types/_jinn-repo-pool.js.map +1 -0
- 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-state.d.ts +9 -0
- package/dist/solver-types/_swe-rebench-v2-state.js +14 -0
- package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +30 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js +40 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
- package/dist/solver-types/index.js +2 -0
- package/dist/solver-types/index.js.map +1 -1
- package/dist/solver-types/jinn-repo-admit.d.ts +17 -0
- package/dist/solver-types/jinn-repo-admit.js +16 -0
- package/dist/solver-types/jinn-repo-admit.js.map +1 -0
- package/dist/solver-types/jinn-repo-auto.d.ts +60 -0
- package/dist/solver-types/jinn-repo-auto.js +163 -0
- package/dist/solver-types/jinn-repo-auto.js.map +1 -0
- package/dist/solver-types/jinn-repo-definition.d.ts +15 -0
- package/dist/solver-types/jinn-repo-definition.js +34 -0
- package/dist/solver-types/jinn-repo-definition.js.map +1 -0
- package/dist/solver-types/jinn-repo-extract.d.ts +16 -0
- package/dist/solver-types/jinn-repo-extract.js +32 -0
- package/dist/solver-types/jinn-repo-extract.js.map +1 -0
- package/dist/solver-types/jinn-repo.d.ts +21 -0
- package/dist/solver-types/jinn-repo.js +23 -0
- package/dist/solver-types/jinn-repo.js.map +1 -0
- package/dist/solver-types/learner-loop-test.js +1 -1
- package/dist/solver-types/learner-loop-test.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.d.ts +2 -0
- package/dist/solver-types/swe-rebench-v2.js +115 -10
- package/dist/solver-types/swe-rebench-v2.js.map +1 -1
- package/dist/solvernets/launched-record-dispatcher.d.ts +5 -0
- package/dist/solvernets/launched-record-dispatcher.js +14 -1
- package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
- package/dist/solvernets/registry-client-erc8004.js +29 -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 +1 -1
- package/dist/solvernets/store.js +8 -3
- package/dist/solvernets/store.js.map +1 -1
- package/dist/spend/ai-units-config.d.ts +10 -0
- package/dist/spend/ai-units-config.js +7 -1
- package/dist/spend/ai-units-config.js.map +1 -1
- package/dist/spend/ai-units.d.ts +51 -0
- package/dist/spend/ai-units.js +73 -0
- package/dist/spend/ai-units.js.map +1 -1
- package/dist/spend/credential.d.ts +2 -2
- package/dist/spend/credential.js +9 -3
- package/dist/spend/credential.js.map +1 -1
- package/dist/spend/record.js +12 -5
- package/dist/spend/record.js.map +1 -1
- package/dist/spend/spend-cap.d.ts +10 -0
- package/dist/spend/spend-cap.js +13 -0
- package/dist/spend/spend-cap.js.map +1 -0
- package/dist/spend/usage.js +39 -3
- package/dist/spend/usage.js.map +1 -1
- package/dist/store/store.d.ts +106 -5
- package/dist/store/store.js +194 -8
- package/dist/store/store.js.map +1 -1
- package/dist/trajectory/emit.d.ts +6 -0
- package/dist/trajectory/emit.js +9 -1
- package/dist/trajectory/emit.js.map +1 -1
- package/dist/trajectory/harness-bundle-schema.d.ts +1 -1
- package/dist/trajectory/harness-bundle-schema.js +1 -1
- package/dist/trajectory/harness-bundle-schema.js.map +1 -1
- package/dist/trajectory/processors/identity-scrub.js +22 -3
- package/dist/trajectory/processors/identity-scrub.js.map +1 -1
- package/dist/trajectory/schema.d.ts +1 -1
- package/dist/trajectory/schema.js +1 -1
- package/dist/trajectory/schema.js.map +1 -1
- package/dist/trajectory/scrub/build.d.ts +46 -0
- package/dist/trajectory/scrub/build.js +76 -0
- package/dist/trajectory/scrub/build.js.map +1 -0
- package/dist/trajectory/scrub/emit-scrub.d.ts +41 -0
- package/dist/trajectory/scrub/emit-scrub.js +88 -0
- package/dist/trajectory/scrub/emit-scrub.js.map +1 -0
- package/dist/trajectory/scrub/key-policy.d.ts +20 -0
- package/dist/trajectory/scrub/key-policy.js +43 -0
- package/dist/trajectory/scrub/key-policy.js.map +1 -0
- package/dist/trajectory/scrub/layer2.d.ts +23 -0
- package/dist/trajectory/scrub/layer2.js +33 -0
- package/dist/trajectory/scrub/layer2.js.map +1 -0
- package/dist/trajectory/scrub/ml-pii-stage.d.ts +24 -0
- package/dist/trajectory/scrub/ml-pii-stage.js +43 -0
- package/dist/trajectory/scrub/ml-pii-stage.js.map +1 -0
- package/dist/trajectory/scrub/openredaction-stage.d.ts +178 -0
- package/dist/trajectory/scrub/openredaction-stage.js +269 -0
- package/dist/trajectory/scrub/openredaction-stage.js.map +1 -0
- package/dist/trajectory/scrub/pii-build.d.ts +31 -0
- package/dist/trajectory/scrub/pii-build.js +64 -0
- package/dist/trajectory/scrub/pii-build.js.map +1 -0
- package/dist/trajectory/scrub/pipeline.d.ts +37 -0
- package/dist/trajectory/scrub/pipeline.js +83 -0
- package/dist/trajectory/scrub/pipeline.js.map +1 -0
- package/dist/trajectory/scrub/plain-patterns-stage.d.ts +31 -0
- package/dist/trajectory/scrub/plain-patterns-stage.js +85 -0
- package/dist/trajectory/scrub/plain-patterns-stage.js.map +1 -0
- package/dist/trajectory/scrub/secretlint-stage.d.ts +35 -0
- package/dist/trajectory/scrub/secretlint-stage.js +250 -0
- package/dist/trajectory/scrub/secretlint-stage.js.map +1 -0
- package/dist/trajectory/scrub/transformers-detector.d.ts +35 -0
- package/dist/trajectory/scrub/transformers-detector.js +68 -0
- package/dist/trajectory/scrub/transformers-detector.js.map +1 -0
- package/dist/trajectory/scrub/types.d.ts +25 -0
- package/dist/trajectory/scrub/types.js +2 -0
- package/dist/trajectory/scrub/types.js.map +1 -0
- package/dist/trajectory/transcript-parsers/types.d.ts +1 -1
- package/dist/trajectory/transcript-parsers/types.js +1 -1
- package/dist/trajectory/transcript-parsers/types.js.map +1 -1
- package/dist/trajectory/transcript-watcher.d.ts +26 -0
- package/dist/trajectory/transcript-watcher.js +33 -0
- package/dist/trajectory/transcript-watcher.js.map +1 -1
- package/dist/tx-retry.d.ts +12 -0
- package/dist/tx-retry.js +41 -12
- package/dist/tx-retry.js.map +1 -1
- package/dist/types/envelope.d.ts +1 -1
- package/dist/types/envelope.js +1 -1
- package/dist/types/envelope.js.map +1 -1
- package/dist/types/payloads/index.d.ts +1 -1
- package/dist/types/payloads/index.js +7 -1
- package/dist/types/payloads/index.js.map +1 -1
- package/dist/types/payloads/portfolio-v0.d.ts +1 -1
- package/dist/types/payloads/portfolio-v0.js +1 -1
- package/dist/types/payloads/portfolio-v0.js.map +1 -1
- package/dist/types/payloads/prediction-apy-v0.d.ts +1 -1
- package/dist/types/payloads/prediction-apy-v0.js +1 -1
- package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
- package/dist/types/payloads/prediction-v0.d.ts +1 -1
- package/dist/types/payloads/prediction-v0.js +1 -1
- package/dist/types/payloads/prediction-v0.js.map +1 -1
- package/dist/types/portfolio.d.ts +1 -1
- package/dist/types/portfolio.js +1 -1
- package/dist/types/portfolio.js.map +1 -1
- package/dist/types/prediction-apy.d.ts +1 -1
- package/dist/types/prediction-apy.js +1 -1
- package/dist/types/prediction-apy.js.map +1 -1
- package/dist/types/prediction.d.ts +1 -1
- package/dist/types/prediction.js +1 -1
- package/dist/types/prediction.js.map +1 -1
- package/dist/types/session-provenance.d.ts +1 -1
- package/dist/types/session-provenance.js +1 -1
- package/dist/types/session-provenance.js.map +1 -1
- package/dist/types/skill-artifact.d.ts +442 -0
- package/dist/types/skill-artifact.js +137 -0
- package/dist/types/skill-artifact.js.map +1 -0
- package/dist/types/task-document.d.ts +315 -1
- package/dist/types/task-document.js +9 -1
- package/dist/types/task-document.js.map +1 -1
- package/dist/types/task-run-read-model.d.ts +21 -0
- package/dist/types/task-run-read-model.js +2 -0
- package/dist/types/task-run-read-model.js.map +1 -0
- package/dist/types/task-run.d.ts +75 -0
- package/dist/types/task-run.js +2 -0
- package/dist/types/task-run.js.map +1 -0
- package/dist/types/task.d.ts +29 -1
- package/dist/types/task.js +1 -1
- package/dist/types/task.js.map +1 -1
- package/dist/types/window.d.ts +1 -1
- package/dist/types/window.js +1 -1
- package/dist/types/window.js.map +1 -1
- package/dist/util/redact-rpc-urls.d.ts +1 -1
- package/dist/util/redact-rpc-urls.js +57 -2
- package/dist/util/redact-rpc-urls.js.map +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/checkpoint.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/checkpoint.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/contracts.d.ts +3 -2
- package/dist/vendor/@jinn-network/sdk/dist/contracts.js +49 -0
- package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.d.ts +44 -0
- package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.js +25 -0
- package/dist/vendor/@jinn-network/sdk/dist/json-schema.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/json-schema.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.d.ts +38 -0
- package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.js +22 -0
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +109 -2
- package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +26 -2
- package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.d.ts +4 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.js +2 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -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/dist/swe-rebench-v2.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.js +1 -1
- package/dist/vendor/@jinn-network/sdk/package.json +9 -1
- package/docker-compose.yml +3 -2
- package/package.json +43 -28
- package/plugins/jinn-repo-runtime/.claude-plugin/plugin.json +5 -0
- package/plugins/jinn-repo-runtime/.codex-plugin/plugin.json +39 -0
- package/plugins/jinn-repo-runtime/README.md +27 -0
- package/plugins/jinn-repo-runtime/hooks/hooks.json +16 -0
- package/plugins/jinn-repo-runtime/hooks/session-start +73 -0
- package/plugins/jinn-repo-runtime/jinn.plugin.json +11 -0
- package/plugins/jinn-repo-runtime/skills/task/SKILL.md +92 -0
- 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 +4 -0
- package/plugins/local-trace-distiller/.claude-plugin/plugin.json +9 -0
- package/plugins/local-trace-distiller/.codex-plugin/plugin.json +41 -0
- package/plugins/local-trace-distiller/.mcp.json +8 -0
- package/plugins/local-trace-distiller/README.md +27 -0
- package/plugins/local-trace-distiller/jinn.plugin.json +36 -0
- package/plugins/local-trace-distiller/skills/distill/SKILL.md +51 -0
- package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
- package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
- package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +0 -55
- package/deployments/deployment-jinn-mvi-l1-sepolia.json +0 -55
- package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +0 -13
- package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +0 -15
- package/dist/api/peers.js.map +0 -1
- package/dist/daemon/jinn-claim-loop-canonical.d.ts +0 -207
- package/dist/daemon/jinn-claim-loop-canonical.js +0 -296
- package/dist/daemon/jinn-claim-loop-canonical.js.map +0 -1
- package/dist/daemon/jinn-claim-loop-mock.d.ts +0 -61
- package/dist/daemon/jinn-claim-loop-mock.js +0 -122
- package/dist/daemon/jinn-claim-loop-mock.js.map +0 -1
- package/dist/daemon/jinn-claim-loop-wiring.d.ts +0 -33
- package/dist/daemon/jinn-claim-loop-wiring.js +0 -40
- package/dist/daemon/jinn-claim-loop-wiring.js.map +0 -1
- package/dist/daemon/jinn-claim-loop.d.ts +0 -130
- package/dist/daemon/jinn-claim-loop.js +0 -328
- package/dist/daemon/jinn-claim-loop.js.map +0 -1
- package/dist/dashboard/assets/index-CzKxvMcU.css +0 -32
- package/dist/dashboard/assets/index-yVemxHot.js +0 -351
- package/dist/earning/jinn-rewards.js.map +0 -1
- package/dist/scripts/donation-consumption-acceptance.d.ts +0 -85
- package/dist/scripts/donation-consumption-acceptance.js +0 -1382
- package/dist/scripts/donation-consumption-acceptance.js.map +0 -1
- package/dist/x402/acquire.d.ts +0 -17
- package/dist/x402/acquire.js +0 -49
- package/dist/x402/acquire.js.map +0 -1
- package/dist/x402/facilitator.d.ts +0 -11
- package/dist/x402/facilitator.js +0 -52
- package/dist/x402/facilitator.js.map +0 -1
- package/dist/x402/handler.d.ts +0 -27
- package/dist/x402/handler.js +0 -236
- package/dist/x402/handler.js.map +0 -1
- /package/dist/{api/peers.d.ts → daemon/peer-sync.d.ts} +0 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployment-readiness preflight (issue #958).
|
|
3
|
+
*
|
|
4
|
+
* Hosted deploys have no boot-time guard that the environment is fit to run;
|
|
5
|
+
* misconfig fails silently or mid-run. This module adds a set of checks that
|
|
6
|
+
* answer "is this environment fit to run the daemon?" and a boot gate that
|
|
7
|
+
* **fails loud — but only in a deployment context**.
|
|
8
|
+
*
|
|
9
|
+
* Load-bearing constraint: a plain local `jinn run` (no `JINN_STATE_DIR`,
|
|
10
|
+
* running as the user) must NEVER be newly gated. The
|
|
11
|
+
* fail-loud boot gate fires only when `isDeploymentContext()` is true; outside
|
|
12
|
+
* that, every check is advisory (surfaced in `doctor`, never boot-fatal). The
|
|
13
|
+
* `doctor` command runs all checks regardless of context.
|
|
14
|
+
*
|
|
15
|
+
* The checks compose existing primitives where possible:
|
|
16
|
+
* - `writable_volume` — the one genuinely new primitive (write+fsync+unlink probe)
|
|
17
|
+
* - `state_on_volume` — assert resolved state lives on the configured volume
|
|
18
|
+
* - `credentials_resolvable` — reuses `detectAuthContext`; presence-only, NEVER echoes secrets
|
|
19
|
+
* - `agent_cli_non_root` — uid 0 is unfit (the agent CLI refuses to run as root)
|
|
20
|
+
*
|
|
21
|
+
* Every check is side-effect-light and NEVER throws — a failure becomes a
|
|
22
|
+
* structured fail result, not an exception. The aggregate is the safe caller
|
|
23
|
+
* surface; the gate adds the fail-loud envelope on top.
|
|
24
|
+
*/
|
|
25
|
+
import { promises as fs } from 'node:fs';
|
|
26
|
+
import { join, resolve } from 'node:path';
|
|
27
|
+
import { randomBytes } from 'node:crypto';
|
|
28
|
+
import { emitEnvelope } from '../errors/envelope.js';
|
|
29
|
+
import { emitStructured } from '../events/emitter.js';
|
|
30
|
+
/** Hard checks — failing one of these in a deployment context refuses the boot. */
|
|
31
|
+
const HARD_CHECK_NAMES = new Set([
|
|
32
|
+
'writable_volume',
|
|
33
|
+
'state_on_volume',
|
|
34
|
+
'agent_cli_non_root',
|
|
35
|
+
]);
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// isDeploymentContext
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
/**
|
|
40
|
+
* Deployment context = `JINN_STATE_DIR` set OR `config.stateDir` set OR the
|
|
41
|
+
* auth context is a container / docker-compose. A plain local operator (bare
|
|
42
|
+
* context, no state-dir) is NOT a deployment context, so the boot gate stays
|
|
43
|
+
* disarmed for them.
|
|
44
|
+
*/
|
|
45
|
+
export function isDeploymentContext(input) {
|
|
46
|
+
if (typeof input.env['JINN_STATE_DIR'] === 'string' && input.env['JINN_STATE_DIR'].length > 0) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
if (typeof input.stateDir === 'string' && input.stateDir.length > 0)
|
|
50
|
+
return true;
|
|
51
|
+
return input.authContext === 'container' || input.authContext === 'docker-compose';
|
|
52
|
+
}
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// writable_volume — the new primitive
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
/**
|
|
57
|
+
* Attempt to write + fsync + unlink a temp file under `dir`. ok when it
|
|
58
|
+
* succeeds; structured fail (never throws) on EACCES / EROFS / ENOSPC / missing
|
|
59
|
+
* dir / any other fs error.
|
|
60
|
+
*/
|
|
61
|
+
export async function checkWritableVolume(dir) {
|
|
62
|
+
const probePath = join(dir, `.jinn-writeprobe-${process.pid}-${randomBytes(4).toString('hex')}`);
|
|
63
|
+
let handle;
|
|
64
|
+
try {
|
|
65
|
+
handle = await fs.open(probePath, 'w', 0o600);
|
|
66
|
+
await handle.write('jinn-writable-volume-probe');
|
|
67
|
+
await handle.sync();
|
|
68
|
+
await handle.close();
|
|
69
|
+
handle = undefined;
|
|
70
|
+
await fs.unlink(probePath);
|
|
71
|
+
return {
|
|
72
|
+
name: 'writable_volume',
|
|
73
|
+
ok: true,
|
|
74
|
+
detail: `${dir} is writable`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
// Best-effort cleanup; ignore whatever it throws.
|
|
79
|
+
if (handle)
|
|
80
|
+
await handle.close().catch(() => undefined);
|
|
81
|
+
await fs.unlink(probePath).catch(() => undefined);
|
|
82
|
+
const code = err.code;
|
|
83
|
+
return {
|
|
84
|
+
name: 'writable_volume',
|
|
85
|
+
ok: false,
|
|
86
|
+
detail: `${dir} is not writable${code ? ` (${code})` : ''}`,
|
|
87
|
+
remedy: 'Ensure the daemon process can write to the state directory. In hosted deploys, mount a writable ' +
|
|
88
|
+
'persistent volume at the path pointed to by JINN_STATE_DIR (or earningDir) and give the daemon user write access.',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// state_on_volume
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
/**
|
|
96
|
+
* In a deployment context, assert resolved state lives on the configured
|
|
97
|
+
* volume — i.e. `stateDir` is set AND `earningDir` resolves under it. Advisory
|
|
98
|
+
* (always ok) outside a deployment context.
|
|
99
|
+
*/
|
|
100
|
+
export function checkStateOnVolume(input) {
|
|
101
|
+
if (!input.deployment) {
|
|
102
|
+
return {
|
|
103
|
+
name: 'state_on_volume',
|
|
104
|
+
ok: true,
|
|
105
|
+
detail: 'not a deployment context — state location is advisory only',
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
if (!input.stateDir) {
|
|
109
|
+
return {
|
|
110
|
+
name: 'state_on_volume',
|
|
111
|
+
ok: false,
|
|
112
|
+
detail: 'deployment context but JINN_STATE_DIR / stateDir is unset — state would land on the ephemeral ~/.jinn-client default and be lost on redeploy',
|
|
113
|
+
remedy: 'Set JINN_STATE_DIR to the mounted persistent volume (e.g. JINN_STATE_DIR=/data).',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const root = resolve(input.stateDir);
|
|
117
|
+
const earning = resolve(input.earningDir);
|
|
118
|
+
const under = earning === root || earning.startsWith(root + '/');
|
|
119
|
+
if (!under) {
|
|
120
|
+
return {
|
|
121
|
+
name: 'state_on_volume',
|
|
122
|
+
ok: false,
|
|
123
|
+
detail: `earningDir (${earning}) does not resolve under the configured volume (${root})`,
|
|
124
|
+
remedy: 'Remove the per-key earningDir/dbPath override so state derives under JINN_STATE_DIR, or point them at the volume.',
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
name: 'state_on_volume',
|
|
129
|
+
ok: true,
|
|
130
|
+
detail: `state resolves under the configured volume ${root}`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// credentials_resolvable
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
/**
|
|
137
|
+
* Presence-only credential check. In a bare context the operator authenticates
|
|
138
|
+
* the agent CLI interactively (claude session auth), so credentials are not
|
|
139
|
+
* env-resolvable and that is fine. In a container / compose context there is no
|
|
140
|
+
* interactive login, so SOME agent-CLI auth signal must be present in the env.
|
|
141
|
+
*
|
|
142
|
+
* NEVER returns or logs a secret value — only presence + context.
|
|
143
|
+
*/
|
|
144
|
+
export function checkCredentialsResolvable(input) {
|
|
145
|
+
// Env vars that, if present and non-empty, indicate the agent CLI can resolve
|
|
146
|
+
// credentials non-interactively. Presence only — values are never read out.
|
|
147
|
+
const AUTH_ENV_KEYS = [
|
|
148
|
+
'ANTHROPIC_API_KEY',
|
|
149
|
+
'CLAUDE_CODE_OAUTH_TOKEN',
|
|
150
|
+
'OPENROUTER_API_KEY',
|
|
151
|
+
'OPENAI_API_KEY',
|
|
152
|
+
];
|
|
153
|
+
const present = AUTH_ENV_KEYS.filter((k) => {
|
|
154
|
+
const v = input.env[k];
|
|
155
|
+
return typeof v === 'string' && v.trim().length > 0;
|
|
156
|
+
});
|
|
157
|
+
if (input.context === 'bare') {
|
|
158
|
+
return {
|
|
159
|
+
name: 'credentials_resolvable',
|
|
160
|
+
ok: true,
|
|
161
|
+
detail: present.length > 0
|
|
162
|
+
? `bare context; agent-CLI auth env present (${present.length} key(s))`
|
|
163
|
+
: 'bare context; agent CLI uses interactive session auth',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
// container / docker-compose: no interactive login path — need an env signal.
|
|
167
|
+
if (present.length > 0) {
|
|
168
|
+
return {
|
|
169
|
+
name: 'credentials_resolvable',
|
|
170
|
+
ok: true,
|
|
171
|
+
detail: `${input.context} context; agent-CLI auth env present (${present.length} key(s))`,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
name: 'credentials_resolvable',
|
|
176
|
+
ok: false,
|
|
177
|
+
detail: `${input.context} context but no agent-CLI auth credential is resolvable from the environment`,
|
|
178
|
+
remedy: 'Provide the agent CLI credentials the harness needs (e.g. ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN, ' +
|
|
179
|
+
'or OPENROUTER_API_KEY for the hermes harness) as a secret in the deploy environment.',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
// agent_cli_non_root
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
/**
|
|
186
|
+
* ok when uid !== 0 (or no getuid on the platform). Fail when running as root —
|
|
187
|
+
* the agent CLI refuses to run as root, so a root daemon is unfit. Never throws.
|
|
188
|
+
*/
|
|
189
|
+
export function checkAgentCliNonRoot(getuid) {
|
|
190
|
+
if (typeof getuid !== 'function') {
|
|
191
|
+
return {
|
|
192
|
+
name: 'agent_cli_non_root',
|
|
193
|
+
ok: true,
|
|
194
|
+
detail: 'platform has no uid concept — non-root assumption holds',
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
let uid;
|
|
198
|
+
try {
|
|
199
|
+
uid = getuid();
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// Can't determine uid: don't crash, treat as non-fatal (conservative ok —
|
|
203
|
+
// we'd rather not falsely gate a boot on an unreadable uid).
|
|
204
|
+
return {
|
|
205
|
+
name: 'agent_cli_non_root',
|
|
206
|
+
ok: true,
|
|
207
|
+
detail: 'could not read process uid — assuming non-root',
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
if (uid === 0) {
|
|
211
|
+
return {
|
|
212
|
+
name: 'agent_cli_non_root',
|
|
213
|
+
ok: false,
|
|
214
|
+
detail: 'daemon is running as root (uid 0); the agent CLI refuses to run as root',
|
|
215
|
+
remedy: 'Run the daemon as a non-root user. In containers, create and drop to a non-root user (e.g. via gosu) before launching.',
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
name: 'agent_cli_non_root',
|
|
220
|
+
ok: true,
|
|
221
|
+
detail: `running as non-root (uid ${uid})`,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
// runDeploymentReadinessChecks — the aggregate
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
/**
|
|
228
|
+
* Run every deployment-readiness check and assemble a report. Detects the
|
|
229
|
+
* deployment context internally and decides `bootFatal` accordingly. Never
|
|
230
|
+
* throws — each check degrades to a structured fail.
|
|
231
|
+
*/
|
|
232
|
+
export async function runDeploymentReadinessChecks(inputs, deps) {
|
|
233
|
+
const authContext = (() => {
|
|
234
|
+
try {
|
|
235
|
+
return deps.detectAuthContext({
|
|
236
|
+
cwd: process.cwd(),
|
|
237
|
+
env: deps.env,
|
|
238
|
+
configuredMode: inputs.runtimeMode,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
return 'bare';
|
|
243
|
+
}
|
|
244
|
+
})();
|
|
245
|
+
const deployment = isDeploymentContext({
|
|
246
|
+
env: deps.env,
|
|
247
|
+
authContext,
|
|
248
|
+
stateDir: inputs.stateDir,
|
|
249
|
+
});
|
|
250
|
+
// The writable-volume probe targets the volume root when set, else earningDir.
|
|
251
|
+
const probeDir = inputs.stateDir ?? inputs.earningDir;
|
|
252
|
+
const checks = [
|
|
253
|
+
await checkWritableVolume(probeDir),
|
|
254
|
+
checkStateOnVolume({ deployment, stateDir: inputs.stateDir, earningDir: inputs.earningDir }),
|
|
255
|
+
checkCredentialsResolvable({ context: authContext, env: deps.env }),
|
|
256
|
+
checkAgentCliNonRoot(deps.getuid),
|
|
257
|
+
];
|
|
258
|
+
const bootFatal = deployment && checks.some((c) => !c.ok && HARD_CHECK_NAMES.has(c.name));
|
|
259
|
+
return { deployment, authContext, checks, bootFatal };
|
|
260
|
+
}
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
// applyDeploymentReadinessGate — the boot gate (fail-loud only in deployment)
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
/**
|
|
265
|
+
* Boot gate for `jinn run`. Runs the readiness aggregate; in a deployment
|
|
266
|
+
* context, fail loud (emit `invalid_invocation` envelope + non-zero exit) when
|
|
267
|
+
* a hard check fails. Outside a deployment context, log advisories for any
|
|
268
|
+
* failing check and proceed. Mirrors `applyPidfileLivenessGate`'s contract:
|
|
269
|
+
* `emitEnvelope` does not return in production (it `process.exit`s).
|
|
270
|
+
*/
|
|
271
|
+
export async function applyDeploymentReadinessGate(inputs, deps, sinks = {}) {
|
|
272
|
+
const report = await runDeploymentReadinessChecks(inputs, deps);
|
|
273
|
+
const failed = report.checks.filter((c) => !c.ok);
|
|
274
|
+
if (report.bootFatal) {
|
|
275
|
+
const hardFailures = failed.filter((c) => HARD_CHECK_NAMES.has(c.name));
|
|
276
|
+
const summary = hardFailures.map((c) => `${c.name}: ${c.detail}`).join('; ');
|
|
277
|
+
emitEnvelope({
|
|
278
|
+
code: 'invalid_invocation',
|
|
279
|
+
message: `Environment is not fit to run the daemon in this deployment — ${summary}`,
|
|
280
|
+
hint: 'Run `jinn doctor --human` for the full readiness report. Fix the failing check(s) and restart.',
|
|
281
|
+
exampleCli: 'jinn doctor --human',
|
|
282
|
+
details: {
|
|
283
|
+
field: 'deployment_readiness',
|
|
284
|
+
authContext: report.authContext,
|
|
285
|
+
// Names + ok only — no secret material, no raw env values.
|
|
286
|
+
failed: hardFailures.map((c) => ({ name: c.name, detail: c.detail })),
|
|
287
|
+
},
|
|
288
|
+
}, sinks);
|
|
289
|
+
// emitEnvelope calls process.exit in production; in tests the injected exit
|
|
290
|
+
// is a no-op. Either way, do not fall through to "proceed" logging.
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
// Advisory path (local operator, or non-hard failures in a deployment ctx):
|
|
294
|
+
// surface each failing check but never gate the boot.
|
|
295
|
+
for (const c of failed) {
|
|
296
|
+
emitStructured({
|
|
297
|
+
kind: 'system',
|
|
298
|
+
message: `deployment-readiness advisory — ${c.name}: ${c.detail}`,
|
|
299
|
+
details: {
|
|
300
|
+
phase: 'preflight',
|
|
301
|
+
check: c.name,
|
|
302
|
+
deployment: report.deployment,
|
|
303
|
+
...(c.remedy ? { remedy: c.remedy } : {}),
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=deployment-readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-readiness.js","sourceRoot":"","sources":["../../src/preflight/deployment-readiness.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,11 +6,17 @@
|
|
|
6
6
|
* Branches (load-bearing — see #649 acceptance criteria):
|
|
7
7
|
* - File missing → { decision: 'proceed' }
|
|
8
8
|
* - File malformed (NaN/empty) → { decision: 'unlink-stale', reason: 'malformed' }
|
|
9
|
+
* - PID 1 or our own pid → { decision: 'unlink-stale', reason: 'self-or-pid1-container' }
|
|
9
10
|
* - process.kill(pid, 0) ESRCH → { decision: 'unlink-stale', reason: 'esrch' }
|
|
10
11
|
* - process.kill(pid, 0) ok → { decision: 'refuse', reason: 'alive' }
|
|
11
12
|
* - process.kill(pid, 0) EPERM → { decision: 'refuse', reason: 'eperm' }
|
|
12
13
|
* - any other errno → { decision: 'refuse', reason: 'unknown' }
|
|
13
14
|
*
|
|
15
|
+
* The PID-1/self branch classifies *before* the `process.kill` probe (#805): in
|
|
16
|
+
* a container the daemon is PID 1, whose pidfile outlives the container on the
|
|
17
|
+
* persistent volume; `process.kill(1, 0)` always succeeds, so a probe-first
|
|
18
|
+
* order would mis-classify the stale record as a live sibling and crash-loop.
|
|
19
|
+
*
|
|
14
20
|
* `.trim()` before `parseInt` is required: `main.ts` writes the PID with a
|
|
15
21
|
* trailing `\n` (see `client/src/main.ts` writeFileSync near the pidfile site).
|
|
16
22
|
*/
|
|
@@ -21,7 +27,7 @@ export type PidfileLivenessDecision = {
|
|
|
21
27
|
decision: 'unlink-stale';
|
|
22
28
|
pid: number | null;
|
|
23
29
|
pidfilePath: string;
|
|
24
|
-
reason: 'malformed' | 'esrch';
|
|
30
|
+
reason: 'malformed' | 'esrch' | 'self-or-pid1-container';
|
|
25
31
|
} | {
|
|
26
32
|
decision: 'refuse';
|
|
27
33
|
pid: number;
|
|
@@ -6,11 +6,17 @@
|
|
|
6
6
|
* Branches (load-bearing — see #649 acceptance criteria):
|
|
7
7
|
* - File missing → { decision: 'proceed' }
|
|
8
8
|
* - File malformed (NaN/empty) → { decision: 'unlink-stale', reason: 'malformed' }
|
|
9
|
+
* - PID 1 or our own pid → { decision: 'unlink-stale', reason: 'self-or-pid1-container' }
|
|
9
10
|
* - process.kill(pid, 0) ESRCH → { decision: 'unlink-stale', reason: 'esrch' }
|
|
10
11
|
* - process.kill(pid, 0) ok → { decision: 'refuse', reason: 'alive' }
|
|
11
12
|
* - process.kill(pid, 0) EPERM → { decision: 'refuse', reason: 'eperm' }
|
|
12
13
|
* - any other errno → { decision: 'refuse', reason: 'unknown' }
|
|
13
14
|
*
|
|
15
|
+
* The PID-1/self branch classifies *before* the `process.kill` probe (#805): in
|
|
16
|
+
* a container the daemon is PID 1, whose pidfile outlives the container on the
|
|
17
|
+
* persistent volume; `process.kill(1, 0)` always succeeds, so a probe-first
|
|
18
|
+
* order would mis-classify the stale record as a live sibling and crash-loop.
|
|
19
|
+
*
|
|
14
20
|
* `.trim()` before `parseInt` is required: `main.ts` writes the PID with a
|
|
15
21
|
* trailing `\n` (see `client/src/main.ts` writeFileSync near the pidfile site).
|
|
16
22
|
*/
|
|
@@ -35,6 +41,14 @@ export function checkPidfileLiveness(input) {
|
|
|
35
41
|
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
36
42
|
return { decision: 'unlink-stale', pid: null, pidfilePath: pidPath, reason: 'malformed' };
|
|
37
43
|
}
|
|
44
|
+
// #805: in a container the daemon is PID 1; the pidfile on the persistent
|
|
45
|
+
// volume outlives the container, and `process.kill(1, 0)` always succeeds, so
|
|
46
|
+
// we must classify the self/PID-1 record as stale *before* the liveness probe
|
|
47
|
+
// below — otherwise the probe reports it alive and the daemon crash-loops. A
|
|
48
|
+
// record of our own pid is likewise self, never a live sibling.
|
|
49
|
+
if (parsed === 1 || parsed === process.pid) {
|
|
50
|
+
return { decision: 'unlink-stale', pid: parsed, pidfilePath: pidPath, reason: 'self-or-pid1-container' };
|
|
51
|
+
}
|
|
38
52
|
try {
|
|
39
53
|
process.kill(parsed, 0);
|
|
40
54
|
return { decision: 'refuse', pid: parsed, pidfilePath: pidPath, reason: 'alive' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pidfile-liveness.js","sourceRoot":"","sources":["../../src/preflight/pidfile-liveness.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pidfile-liveness.js","sourceRoot":"","sources":["../../src/preflight/pidfile-liveness.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,14 +48,19 @@ export type ProbeOk = {
|
|
|
48
48
|
ok: true;
|
|
49
49
|
host: string;
|
|
50
50
|
latencyMs: number;
|
|
51
|
+
expectedChainId: number;
|
|
52
|
+
actualChainId: number;
|
|
53
|
+
localDev?: true;
|
|
51
54
|
};
|
|
52
55
|
export type ProbeFail = {
|
|
53
56
|
ok: false;
|
|
54
57
|
host: string;
|
|
58
|
+
expectedChainId: number;
|
|
59
|
+
actualChainId?: number;
|
|
55
60
|
/** HTTP status when applicable (4xx / 5xx). */
|
|
56
61
|
code?: number;
|
|
57
62
|
/** Failure shape when no HTTP status is available. */
|
|
58
|
-
reason?: 'unreachable' | 'unknown';
|
|
63
|
+
reason?: 'chain_mismatch' | 'unreachable' | 'unknown';
|
|
59
64
|
message: string;
|
|
60
65
|
};
|
|
61
66
|
export type ProbeResult = ProbeOk | ProbeFail;
|
|
@@ -64,8 +69,9 @@ export interface ProbeFallbackChainOptions {
|
|
|
64
69
|
log?: (message: string) => void;
|
|
65
70
|
}
|
|
66
71
|
/**
|
|
67
|
-
* Probe each URL in a fallback chain with
|
|
68
|
-
* Records ok/latency or a structured failure
|
|
72
|
+
* Probe each URL in a fallback chain with per-slot `eth_chainId` +
|
|
73
|
+
* `eth_blockNumber` calls. Records ok/latency or a structured failure
|
|
74
|
+
* (chain mismatch / HTTP status / unreachable).
|
|
69
75
|
*
|
|
70
76
|
* The probe is **log-only** — it never throws on per-slot failures. Startup
|
|
71
77
|
* gating remains the job of {@link checkRpcNetwork}, which fails loud on
|
|
@@ -73,6 +79,7 @@ export interface ProbeFallbackChainOptions {
|
|
|
73
79
|
*
|
|
74
80
|
* Per AC9 (issue #592): emits one log line per slot
|
|
75
81
|
* `[rpc] <layer> <host> ok latency=Nms`
|
|
82
|
+
* `[rpc] <layer> <host> warn chain_mismatch expected=<id> actual=<id>`
|
|
76
83
|
* `[rpc] <layer> <host> warn <http-status>` (e.g. 429, 503)
|
|
77
84
|
* `[rpc] <layer> <host> warn unreachable: <message>`
|
|
78
85
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createPublicClient, http, HttpRequestError } from 'viem';
|
|
2
|
-
import { base, baseSepolia } from 'viem/chains';
|
|
2
|
+
import { base, baseSepolia, mainnet, sepolia } from 'viem/chains';
|
|
3
3
|
import { describeFallbackChain, maskRpcHost } from '../rpc/transport.js';
|
|
4
4
|
export function expectedChainIdForNetwork(network) {
|
|
5
5
|
return network === 'testnet' ? 84532 : 8453;
|
|
@@ -119,24 +119,35 @@ export function rpcNetworkFailureHint(result) {
|
|
|
119
119
|
}
|
|
120
120
|
return 'Set rpcUrl to a Base mainnet endpoint such as https://mainnet.base.org, or set BASE_RPC_URL.';
|
|
121
121
|
}
|
|
122
|
-
function
|
|
122
|
+
function expectedChainIdForProbe(network, layer) {
|
|
123
|
+
if (layer === 'L1')
|
|
124
|
+
return network === 'testnet' ? sepolia.id : mainnet.id;
|
|
125
|
+
return expectedChainIdForNetwork(network);
|
|
126
|
+
}
|
|
127
|
+
function expectedChainForProbe(network, layer) {
|
|
128
|
+
if (layer === 'L1')
|
|
129
|
+
return network === 'testnet' ? sepolia : mainnet;
|
|
130
|
+
return expectedChainForNetwork(network);
|
|
131
|
+
}
|
|
132
|
+
function classifyProbeError(host, expectedChainId, actualChainId, err) {
|
|
123
133
|
const message = err instanceof Error ? err.message : String(err);
|
|
124
134
|
if (err instanceof HttpRequestError && typeof err.status === 'number') {
|
|
125
|
-
return { ok: false, host, code: err.status, message };
|
|
135
|
+
return { ok: false, host, expectedChainId, actualChainId, code: err.status, message };
|
|
126
136
|
}
|
|
127
137
|
// viem wraps HTTP errors inside other shapes; walk the cause chain.
|
|
128
138
|
let cur = err?.cause;
|
|
129
139
|
while (cur) {
|
|
130
140
|
if (cur instanceof HttpRequestError && typeof cur.status === 'number') {
|
|
131
|
-
return { ok: false, host, code: cur.status, message };
|
|
141
|
+
return { ok: false, host, expectedChainId, actualChainId, code: cur.status, message };
|
|
132
142
|
}
|
|
133
143
|
cur = cur.cause;
|
|
134
144
|
}
|
|
135
|
-
return { ok: false, host, reason: 'unreachable', message };
|
|
145
|
+
return { ok: false, host, expectedChainId, actualChainId, reason: 'unreachable', message };
|
|
136
146
|
}
|
|
137
147
|
/**
|
|
138
|
-
* Probe each URL in a fallback chain with
|
|
139
|
-
* Records ok/latency or a structured failure
|
|
148
|
+
* Probe each URL in a fallback chain with per-slot `eth_chainId` +
|
|
149
|
+
* `eth_blockNumber` calls. Records ok/latency or a structured failure
|
|
150
|
+
* (chain mismatch / HTTP status / unreachable).
|
|
140
151
|
*
|
|
141
152
|
* The probe is **log-only** — it never throws on per-slot failures. Startup
|
|
142
153
|
* gating remains the job of {@link checkRpcNetwork}, which fails loud on
|
|
@@ -144,28 +155,50 @@ function classifyProbeError(host, err) {
|
|
|
144
155
|
*
|
|
145
156
|
* Per AC9 (issue #592): emits one log line per slot
|
|
146
157
|
* `[rpc] <layer> <host> ok latency=Nms`
|
|
158
|
+
* `[rpc] <layer> <host> warn chain_mismatch expected=<id> actual=<id>`
|
|
147
159
|
* `[rpc] <layer> <host> warn <http-status>` (e.g. 429, 503)
|
|
148
160
|
* `[rpc] <layer> <host> warn unreachable: <message>`
|
|
149
161
|
*/
|
|
150
162
|
export async function probeFallbackChain(urls, network, layer, options = {}) {
|
|
151
163
|
const log = options.log ?? ((m) => process.stderr.write(`${m}\n`));
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
// since this is just used to satisfy viem's typing.
|
|
155
|
-
const chain = network === 'testnet' ? baseSepolia : base;
|
|
164
|
+
const expectedChainId = expectedChainIdForProbe(network, layer);
|
|
165
|
+
const chain = expectedChainForProbe(network, layer);
|
|
156
166
|
const results = [];
|
|
157
167
|
for (const url of urls) {
|
|
158
168
|
const host = maskRpcHost(url);
|
|
159
169
|
const client = createPublicClient({ chain, transport: http(url, { retryCount: 0 }) });
|
|
160
170
|
const t0 = performance.now();
|
|
171
|
+
let actualChainId;
|
|
161
172
|
try {
|
|
173
|
+
actualChainId = await client.getChainId();
|
|
174
|
+
const localDev = evmLocalDevOverrideAcceptable(expectedChainId, actualChainId, url);
|
|
175
|
+
if (actualChainId !== expectedChainId && !localDev) {
|
|
176
|
+
const failure = {
|
|
177
|
+
ok: false,
|
|
178
|
+
host,
|
|
179
|
+
expectedChainId,
|
|
180
|
+
actualChainId,
|
|
181
|
+
reason: 'chain_mismatch',
|
|
182
|
+
message: `expected chain ${expectedChainId}, got ${actualChainId}`,
|
|
183
|
+
};
|
|
184
|
+
log(`[rpc] ${layer} ${host} warn chain_mismatch expected=${expectedChainId} actual=${actualChainId}`);
|
|
185
|
+
results.push(failure);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
162
188
|
await client.getBlockNumber();
|
|
163
189
|
const latencyMs = Math.max(0, Math.round(performance.now() - t0));
|
|
164
190
|
log(`[rpc] ${layer} ${host} ok latency=${latencyMs}ms`);
|
|
165
|
-
results.push({
|
|
191
|
+
results.push({
|
|
192
|
+
ok: true,
|
|
193
|
+
host,
|
|
194
|
+
latencyMs,
|
|
195
|
+
expectedChainId,
|
|
196
|
+
actualChainId,
|
|
197
|
+
...(localDev ? { localDev: true } : {}),
|
|
198
|
+
});
|
|
166
199
|
}
|
|
167
200
|
catch (err) {
|
|
168
|
-
const failure = classifyProbeError(host, err);
|
|
201
|
+
const failure = classifyProbeError(host, expectedChainId, actualChainId, err);
|
|
169
202
|
if (failure.code !== undefined) {
|
|
170
203
|
log(`[rpc] ${layer} ${host} warn ${failure.code}`);
|
|
171
204
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-network.js","sourceRoot":"","sources":["../../src/preflight/rpc-network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"rpc-network.js","sourceRoot":"","sources":["../../src/preflight/rpc-network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ResolveStableCwdInput {
|
|
2
|
+
currentCwd: string;
|
|
3
|
+
earningDir: string;
|
|
4
|
+
homeDir: string;
|
|
5
|
+
exists: (p: string) => boolean;
|
|
6
|
+
sep?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ResolveStableCwdResult {
|
|
9
|
+
chosenCwd: string;
|
|
10
|
+
needsChdir: boolean;
|
|
11
|
+
logLine: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Pure resolver — no fs/os/process access. All inputs are injected so this can
|
|
15
|
+
* be unit-tested deterministically.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveStableCwd(input: ResolveStableCwdInput): ResolveStableCwdResult;
|
|
18
|
+
/**
|
|
19
|
+
* Real-world wrapper: gathers `process.cwd()`, `os.homedir()`, and `existsSync`,
|
|
20
|
+
* delegates the decision to `resolveStableCwd`, then performs the chdir.
|
|
21
|
+
*
|
|
22
|
+
* `earningDir` comes in as a param to keep this decoupled from the config
|
|
23
|
+
* module. Never crashes boot: a `process.cwd()` read can itself throw ENOENT
|
|
24
|
+
* (when the launch dir was deleted), and `process.chdir` can fail — both are
|
|
25
|
+
* caught and logged.
|
|
26
|
+
*/
|
|
27
|
+
export declare function ensureStableCwd(opts: {
|
|
28
|
+
earningDir: string;
|
|
29
|
+
}): ResolveStableCwdResult;
|