@jinn-network/client 0.1.5 → 0.1.6-canary.107ea271
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +131 -0
- package/dist/adapters/mech/adapter.d.ts +23 -1
- package/dist/adapters/mech/adapter.js +169 -33
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +1 -0
- package/dist/adapters/mech/contracts.js +1 -0
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/ipfs-pinfile.d.ts +22 -0
- package/dist/adapters/mech/ipfs-pinfile.js +54 -0
- package/dist/adapters/mech/ipfs-pinfile.js.map +1 -0
- package/dist/adapters/mech/ipfs.d.ts +1 -0
- package/dist/adapters/mech/ipfs.js +24 -1
- package/dist/adapters/mech/ipfs.js.map +1 -1
- package/dist/adapters/mech/verdict-code.d.ts +1 -0
- package/dist/adapters/mech/verdict-code.js +18 -0
- package/dist/adapters/mech/verdict-code.js.map +1 -1
- package/dist/api/bootstrap-endpoint.js +63 -1
- package/dist/api/bootstrap-endpoint.js.map +1 -1
- package/dist/api/codex-doctor-endpoint.d.ts +73 -0
- package/dist/api/codex-doctor-endpoint.js +158 -0
- package/dist/api/codex-doctor-endpoint.js.map +1 -0
- package/dist/api/discovery-endpoint.d.ts +31 -0
- package/dist/api/discovery-endpoint.js +78 -0
- package/dist/api/discovery-endpoint.js.map +1 -0
- package/dist/api/fleet-build.d.ts +8 -0
- package/dist/api/fleet-build.js +8 -2
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/gather-status.js +90 -4
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/harness-readiness-endpoint.d.ts +25 -0
- package/dist/api/harness-readiness-endpoint.js +24 -0
- package/dist/api/harness-readiness-endpoint.js.map +1 -0
- package/dist/api/hermes-doctor-endpoint.d.ts +66 -0
- package/dist/api/hermes-doctor-endpoint.js +75 -0
- package/dist/api/hermes-doctor-endpoint.js.map +1 -0
- package/dist/api/portfolio-v0-build.d.ts +10 -0
- package/dist/api/portfolio-v0-build.js +24 -5
- package/dist/api/portfolio-v0-build.js.map +1 -1
- package/dist/api/prediction-v1-build.d.ts +9 -0
- package/dist/api/prediction-v1-build.js +6 -1
- package/dist/api/prediction-v1-build.js.map +1 -1
- package/dist/api/server.d.ts +70 -0
- package/dist/api/server.js +107 -1
- package/dist/api/server.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +21 -0
- package/dist/api/setup-endpoints.js +101 -8
- package/dist/api/setup-endpoints.js.map +1 -1
- package/dist/api/setup-retry-endpoint.d.ts +19 -0
- package/dist/api/setup-retry-endpoint.js +32 -0
- package/dist/api/setup-retry-endpoint.js.map +1 -0
- package/dist/api/solvernets-endpoints.js +8 -1
- package/dist/api/solvernets-endpoints.js.map +1 -1
- package/dist/api/status-build.d.ts +14 -0
- package/dist/api/status-build.js +23 -18
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/task-run-routing.d.ts +7 -0
- package/dist/api/task-run-routing.js +12 -0
- package/dist/api/task-run-routing.js.map +1 -0
- package/dist/api/task-runs-build.d.ts +20 -0
- package/dist/api/task-runs-build.js +4 -0
- package/dist/api/task-runs-build.js.map +1 -1
- package/dist/build-info.json +4 -4
- package/dist/build-meta.json +1 -1
- package/dist/chain-read-errors.d.ts +10 -0
- package/dist/chain-read-errors.js +15 -0
- package/dist/chain-read-errors.js.map +1 -1
- package/dist/cli/commands/auth.js +3 -1
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/create.d.ts +5 -3
- package/dist/cli/commands/create.js +102 -36
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/solver-nets.d.ts +19 -0
- package/dist/cli/commands/solver-nets.js +164 -11
- package/dist/cli/commands/solver-nets.js.map +1 -1
- package/dist/cli/commands/solver-plugins-publish.d.ts +31 -0
- package/dist/cli/commands/solver-plugins-publish.js +169 -0
- package/dist/cli/commands/solver-plugins-publish.js.map +1 -0
- package/dist/cli/commands/solver-plugins-revoke.d.ts +15 -0
- package/dist/cli/commands/solver-plugins-revoke.js +91 -0
- package/dist/cli/commands/solver-plugins-revoke.js.map +1 -0
- package/dist/cli/commands/solver-plugins.d.ts +50 -6
- package/dist/cli/commands/solver-plugins.js +205 -68
- package/dist/cli/commands/solver-plugins.js.map +1 -1
- package/dist/cli/commands/update.d.ts +10 -0
- package/dist/cli/commands/update.js +36 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/config.d.ts +51 -0
- package/dist/config.js +49 -2
- package/dist/config.js.map +1 -1
- package/dist/conformance/checks/hash-signature.js +6 -2
- package/dist/conformance/checks/hash-signature.js.map +1 -1
- package/dist/conformance/checks/payload.js +4 -2
- package/dist/conformance/checks/payload.js.map +1 -1
- package/dist/conformance/checks/verdict.d.ts +10 -10
- package/dist/conformance/checks/verdict.js +16 -15
- package/dist/conformance/checks/verdict.js.map +1 -1
- package/dist/conformance/harness.d.ts +1 -1
- package/dist/conformance/harness.js +16 -9
- package/dist/conformance/harness.js.map +1 -1
- package/dist/conformance/types.d.ts +10 -3
- package/dist/conformance/types.js.map +1 -1
- package/dist/corpus/acquire.d.ts +1 -3
- package/dist/corpus/acquire.js.map +1 -1
- package/dist/corpus/envelope-projection.d.ts +1 -1
- package/dist/corpus/envelope-projection.js +14 -7
- package/dist/corpus/envelope-projection.js.map +1 -1
- package/dist/corpus/index.d.ts +2 -1
- package/dist/corpus/index.js.map +1 -1
- package/dist/corpus/prediction-brier-scoreboard-report.js +1 -1
- package/dist/corpus/prediction-brier-scoreboard-report.js.map +1 -1
- package/dist/corpus/prediction-brier-scoreboard.js +3 -1
- package/dist/corpus/prediction-brier-scoreboard.js.map +1 -1
- package/dist/corpus/types.d.ts +2 -2
- package/dist/daemon/daemon.d.ts +26 -1
- package/dist/daemon/daemon.js +63 -1
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/eviction-loop.d.ts +40 -0
- package/dist/daemon/eviction-loop.js +67 -0
- package/dist/daemon/eviction-loop.js.map +1 -0
- package/dist/daemon/freeze-fence.js +6 -3
- package/dist/daemon/freeze-fence.js.map +1 -1
- package/dist/daemon/readiness-gate.d.ts +30 -0
- package/dist/daemon/readiness-gate.js +31 -0
- package/dist/daemon/readiness-gate.js.map +1 -0
- package/dist/daemon/skip-log-dedup.d.ts +69 -0
- package/dist/daemon/skip-log-dedup.js +106 -0
- package/dist/daemon/skip-log-dedup.js.map +1 -0
- package/dist/dashboard/assets/{index-D_NMfDfV.css → index-DE4qUnzV.css} +1 -1
- package/dist/dashboard/assets/index-Di7xA4eB.js +170 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/discovery/http.js +121 -0
- package/dist/discovery/http.js.map +1 -1
- package/dist/discovery/onchain.d.ts +5 -0
- package/dist/discovery/onchain.js +292 -7
- package/dist/discovery/onchain.js.map +1 -1
- package/dist/discovery/types.d.ts +127 -1
- package/dist/discovery/types.js +8 -10
- package/dist/discovery/types.js.map +1 -1
- package/dist/discovery/with-fallback.js +9 -0
- package/dist/discovery/with-fallback.js.map +1 -1
- package/dist/earning/agent-wallet-binding.d.ts +20 -1
- package/dist/earning/agent-wallet-binding.js +54 -16
- package/dist/earning/agent-wallet-binding.js.map +1 -1
- package/dist/earning/bootstrap.d.ts +178 -0
- package/dist/earning/bootstrap.js +628 -57
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +12 -0
- package/dist/earning/contracts.js +16 -1
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/funding-plan.js +15 -2
- package/dist/earning/funding-plan.js.map +1 -1
- package/dist/earning/jinn-rewards.d.ts +46 -0
- package/dist/earning/jinn-rewards.js +32 -0
- package/dist/earning/jinn-rewards.js.map +1 -1
- package/dist/earning/store.d.ts +8 -0
- package/dist/earning/store.js +48 -1
- package/dist/earning/store.js.map +1 -1
- package/dist/earning/testnet-setup-migration.d.ts +12 -0
- package/dist/earning/testnet-setup-migration.js +27 -1
- package/dist/earning/testnet-setup-migration.js.map +1 -1
- package/dist/earning/types.d.ts +45 -0
- package/dist/earning/types.js +37 -0
- package/dist/earning/types.js.map +1 -1
- package/dist/erc8004/abis.d.ts +64 -0
- package/dist/erc8004/abis.js +48 -0
- package/dist/erc8004/abis.js.map +1 -1
- package/dist/erc8004/plugin-registry.d.ts +102 -0
- package/dist/erc8004/plugin-registry.js +165 -0
- package/dist/erc8004/plugin-registry.js.map +1 -0
- package/dist/erc8004/reputation.d.ts +8 -0
- package/dist/erc8004/reputation.js +22 -3
- package/dist/erc8004/reputation.js.map +1 -1
- package/dist/events/types.d.ts +2 -2
- package/dist/harnesses/cost-estimates.d.ts +145 -0
- package/dist/harnesses/cost-estimates.js +297 -0
- package/dist/harnesses/cost-estimates.js.map +1 -0
- package/dist/harnesses/engine/engine.d.ts +40 -0
- package/dist/harnesses/engine/engine.js +69 -8
- package/dist/harnesses/engine/engine.js.map +1 -1
- package/dist/harnesses/engine/envelope-assembly.d.ts +2 -2
- package/dist/harnesses/engine/envelope-assembly.js +4 -2
- package/dist/harnesses/engine/envelope-assembly.js.map +1 -1
- package/dist/harnesses/engine/persistence.d.ts +21 -0
- package/dist/harnesses/engine/persistence.js +39 -0
- package/dist/harnesses/engine/persistence.js.map +1 -1
- package/dist/harnesses/engine/work-dir-reaper.d.ts +65 -0
- package/dist/harnesses/engine/work-dir-reaper.js +100 -0
- package/dist/harnesses/engine/work-dir-reaper.js.map +1 -0
- package/dist/harnesses/freeze.d.ts +4 -1
- package/dist/harnesses/freeze.js +12 -2
- package/dist/harnesses/freeze.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/index.d.ts +4 -1
- package/dist/harnesses/impls/claude-mcp-prediction/index.js +7 -2
- package/dist/harnesses/impls/claude-mcp-prediction/index.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.d.ts +4 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js +7 -2
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js.map +1 -1
- package/dist/harnesses/impls/evaluation-context.d.ts +15 -4
- package/dist/harnesses/impls/evaluation-context.js +24 -8
- package/dist/harnesses/impls/evaluation-context.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/adapter.d.ts +34 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js +205 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +18 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js +231 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/config-builder.d.ts +49 -0
- package/dist/harnesses/impls/hermes-agent/config-builder.js +132 -0
- package/dist/harnesses/impls/hermes-agent/config-builder.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/harness.d.ts +58 -0
- package/dist/harnesses/impls/hermes-agent/harness.js +118 -0
- package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/index.d.ts +5 -0
- package/dist/harnesses/impls/hermes-agent/index.js +7 -0
- package/dist/harnesses/impls/hermes-agent/index.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/prompt.d.ts +15 -0
- package/dist/harnesses/impls/hermes-agent/prompt.js +37 -0
- package/dist/harnesses/impls/hermes-agent/prompt.js.map +1 -0
- package/dist/harnesses/impls/index.d.ts +13 -0
- package/dist/harnesses/impls/index.js +32 -4
- package/dist/harnesses/impls/index.js.map +1 -1
- package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-code.js +13 -34
- package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -0
- package/dist/harnesses/impls/learner/adapters/codex-workspace.js.map +1 -0
- package/dist/harnesses/impls/learner/harness.d.ts +62 -0
- package/dist/harnesses/impls/learner/harness.js +179 -0
- package/dist/harnesses/impls/learner/harness.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/harvest.js +15 -3
- package/dist/harnesses/impls/learner/harvest.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/index.d.ts +5 -5
- package/dist/harnesses/impls/{claude-code-learner → learner}/index.js +4 -4
- package/dist/harnesses/impls/learner/index.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/plugin-path.d.ts +4 -4
- package/dist/harnesses/impls/{claude-code-learner → learner}/plugin-path.js +7 -7
- package/dist/harnesses/impls/learner/plugin-path.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/restoration-patch.js +3 -1
- package/dist/harnesses/impls/learner/restoration-patch.js.map +1 -0
- package/dist/harnesses/impls/learner/test-utils/fake-plugin-outputs.js.map +1 -0
- package/dist/harnesses/impls/learner/test-utils/noop-adapter.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/types.d.ts +23 -2
- package/dist/harnesses/impls/learner/types.js.map +1 -0
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js +13 -12
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js +7 -7
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.d.ts +3 -3
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.js +7 -6
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.js.map +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/checks/integrity.js +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/index.js +11 -10
- package/dist/harnesses/impls/prediction-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-v1-evaluator/index.js +11 -10
- package/dist/harnesses/impls/prediction-v1-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/stub.d.ts +58 -0
- package/dist/harnesses/impls/stub.js +89 -0
- package/dist/harnesses/impls/stub.js.map +1 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.d.ts +1 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +10 -2
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.d.ts +24 -5
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +104 -4
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.d.ts +9 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +25 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
- package/dist/harnesses/names.d.ts +1 -0
- package/dist/harnesses/names.js +3 -0
- package/dist/harnesses/names.js.map +1 -1
- package/dist/harnesses/readiness-registry.d.ts +48 -0
- package/dist/harnesses/readiness-registry.js +144 -0
- package/dist/harnesses/readiness-registry.js.map +1 -0
- package/dist/harnesses/types.d.ts +7 -0
- package/dist/main.d.ts +14 -0
- package/dist/main.js +372 -90
- package/dist/main.js.map +1 -1
- package/dist/mcp/server.js +14 -13
- package/dist/mcp/server.js.map +1 -1
- package/dist/operator-errors.d.ts +7 -0
- package/dist/operator-errors.js +26 -2
- package/dist/operator-errors.js.map +1 -1
- package/dist/preflight/claude-auth.d.ts +18 -0
- package/dist/preflight/claude-auth.js +38 -0
- package/dist/preflight/claude-auth.js.map +1 -1
- package/dist/restart-daemon.d.ts +71 -0
- package/dist/restart-daemon.js +82 -0
- package/dist/restart-daemon.js.map +1 -0
- package/dist/scripts/donation-consumption-acceptance.js +1 -1
- package/dist/scripts/donation-consumption-acceptance.js.map +1 -1
- package/dist/scripts/swe-rebench-v2-known-bad.json +12 -0
- package/dist/scripts/swe-rebench-v2-seed-pool.json +26 -0
- package/dist/setup/halt-mode.d.ts +14 -0
- package/dist/setup/halt-mode.js +17 -0
- package/dist/setup/halt-mode.js.map +1 -0
- package/dist/solver-nets/prediction-operator-ux.js +43 -3
- package/dist/solver-nets/prediction-operator-ux.js.map +1 -1
- package/dist/solver-nets/registry.d.ts +1 -0
- package/dist/solver-nets/registry.js +1 -1
- package/dist/solver-nets/registry.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-substrate.d.ts +52 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.js +76 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +38 -12
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js +136 -27
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
- package/dist/solver-types/swe-rebench-v2-auto.d.ts +6 -0
- package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
- package/dist/solver-types/swe-rebench-v2.d.ts +1 -0
- package/dist/solver-types/swe-rebench-v2.js +19 -6
- package/dist/solver-types/swe-rebench-v2.js.map +1 -1
- package/dist/solvernets/daemon-init.d.ts +10 -2
- package/dist/solvernets/daemon-init.js +22 -2
- package/dist/solvernets/daemon-init.js.map +1 -1
- package/dist/store/store.js +12 -4
- package/dist/store/store.js.map +1 -1
- package/dist/templates/plugins/runtime-plugin/.mcp.json.tmpl +8 -0
- package/dist/templates/plugins/runtime-plugin/README.md.tmpl +30 -0
- package/dist/templates/plugins/runtime-plugin/gitignore.tmpl +3 -0
- package/dist/templates/plugins/runtime-plugin/jinn.plugin.json.tmpl +21 -0
- package/dist/templates/plugins/runtime-plugin/mcp/server.mjs.tmpl +33 -0
- package/dist/templates/plugins/runtime-plugin/package.json.tmpl +15 -0
- package/dist/templates/plugins/runtime-plugin/test/plugin.test.ts.tmpl +35 -0
- package/dist/templates/plugins/runtime-plugin/tsconfig.json.tmpl +11 -0
- package/dist/templates/plugins/solver-type-plugin/README.md.tmpl +35 -0
- package/dist/templates/plugins/solver-type-plugin/gitignore.tmpl +3 -0
- package/dist/templates/plugins/solver-type-plugin/jinn.plugin.json.tmpl +11 -0
- package/dist/templates/plugins/solver-type-plugin/package.json.tmpl +15 -0
- package/dist/templates/plugins/solver-type-plugin/skills/example/SKILL.md.tmpl +10 -0
- package/dist/templates/plugins/solver-type-plugin/test/plugin.test.ts.tmpl +25 -0
- package/dist/templates/plugins/solver-type-plugin/tsconfig.json.tmpl +11 -0
- package/dist/tx-retry.d.ts +13 -0
- package/dist/tx-retry.js +22 -0
- package/dist/tx-retry.js.map +1 -1
- package/dist/types/envelope.d.ts +28 -21
- package/dist/types/envelope.js +8 -3
- package/dist/types/envelope.js.map +1 -1
- package/dist/types/payloads/index.d.ts +2 -2
- package/dist/types/payloads/index.js +13 -12
- package/dist/types/payloads/index.js.map +1 -1
- package/dist/types/payloads/portfolio-v0.d.ts +60 -10
- package/dist/types/payloads/portfolio-v0.js +16 -6
- package/dist/types/payloads/portfolio-v0.js.map +1 -1
- package/dist/types/payloads/prediction-apy-v0.d.ts +56 -14
- package/dist/types/payloads/prediction-apy-v0.js +16 -6
- package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
- package/dist/types/payloads/prediction-v0.d.ts +53 -14
- package/dist/types/payloads/prediction-v0.js +16 -6
- package/dist/types/payloads/prediction-v0.js.map +1 -1
- package/dist/util/extract-tx-hash.d.ts +14 -0
- package/dist/util/extract-tx-hash.js +19 -0
- package/dist/util/extract-tx-hash.js.map +1 -0
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +45 -6
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +16 -6
- package/dist/x402/handler.js +51 -20
- package/dist/x402/handler.js.map +1 -1
- package/package.json +38 -13
- package/plugins/swe-rebench-v2-diffmin/.claude-plugin/plugin.json +5 -0
- package/plugins/swe-rebench-v2-diffmin/.mcp.json +8 -0
- package/plugins/swe-rebench-v2-diffmin/README.md +69 -0
- package/plugins/swe-rebench-v2-diffmin/jinn.plugin.json +12 -0
- package/plugins/swe-rebench-v2-diffmin/mcp/diff-stats-server.mjs +72 -0
- package/plugins/swe-rebench-v2-diffmin/mcp/diff-stats.mjs +48 -0
- package/plugins/swe-rebench-v2-diffmin/package.json +19 -0
- package/plugins/swe-rebench-v2-diffmin/skills/diffmin/SKILL.md +116 -0
- package/plugins/swe-rebench-v2-diffmin/skills/test-map/SKILL.md +126 -0
- package/plugins/swe-rebench-v2-diffmin/test/diff-stats.test.ts +62 -0
- package/plugins/swe-rebench-v2-diffmin/test/manifest.test.ts +53 -0
- package/plugins/swe-rebench-v2-diffmin/tsconfig.json +12 -0
- package/plugins/swe-rebench-v2-runtime/README.md +13 -0
- package/plugins/swe-rebench-v2-runtime/skills/orient/SKILL.md +7 -3
- package/plugins/swe-rebench-v2-runtime/skills/plan/SKILL.md +6 -17
- package/templates/plugins/runtime-plugin/.mcp.json.tmpl +8 -0
- package/templates/plugins/runtime-plugin/README.md.tmpl +30 -0
- package/templates/plugins/runtime-plugin/gitignore.tmpl +3 -0
- package/templates/plugins/runtime-plugin/jinn.plugin.json.tmpl +21 -0
- package/templates/plugins/runtime-plugin/mcp/server.mjs.tmpl +33 -0
- package/templates/plugins/runtime-plugin/package.json.tmpl +15 -0
- package/templates/plugins/runtime-plugin/test/plugin.test.ts.tmpl +35 -0
- package/templates/plugins/runtime-plugin/tsconfig.json.tmpl +11 -0
- package/templates/plugins/solver-type-plugin/README.md.tmpl +35 -0
- package/templates/plugins/solver-type-plugin/gitignore.tmpl +3 -0
- package/templates/plugins/solver-type-plugin/jinn.plugin.json.tmpl +11 -0
- package/templates/plugins/solver-type-plugin/package.json.tmpl +15 -0
- package/templates/plugins/solver-type-plugin/skills/example/SKILL.md.tmpl +10 -0
- package/templates/plugins/solver-type-plugin/test/plugin.test.ts.tmpl +25 -0
- package/templates/plugins/solver-type-plugin/tsconfig.json.tmpl +11 -0
- package/dist/dashboard/assets/index-BjtltOGc.js +0 -76
- package/dist/harnesses/impls/claude-code-learner/adapters/claude-code.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/adapters/codex-code.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/adapters/codex-workspace.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/harness.d.ts +0 -22
- package/dist/harnesses/impls/claude-code-learner/harness.js +0 -62
- package/dist/harnesses/impls/claude-code-learner/harness.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/harvest.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/index.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/plugin-path.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/restoration-patch.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/test-utils/fake-plugin-outputs.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/test-utils/noop-adapter.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/types.js.map +0 -1
- package/dist/preflight/claude-required.d.ts +0 -8
- package/dist/preflight/claude-required.js +0 -17
- package/dist/preflight/claude-required.js.map +0 -1
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/claude-code.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/claude-code.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-code.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-workspace.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-workspace.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/harvest.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/restoration-patch.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/fake-plugin-outputs.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/fake-plugin-outputs.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/noop-adapter.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/noop-adapter.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/types.js +0 -0
- /package/plugins/{claude-code-learner → learner}/.claude-plugin/plugin.json +0 -0
- /package/plugins/{claude-code-learner → learner}/.codex-plugin/plugin.json +0 -0
- /package/plugins/{claude-code-learner → learner}/AGENTS.md +0 -0
- /package/plugins/{claude-code-learner → learner}/CLAUDE.md +0 -0
- /package/plugins/{claude-code-learner → learner}/README.md +0 -0
- /package/plugins/{claude-code-learner → learner}/hooks/hooks.json +0 -0
- /package/plugins/{claude-code-learner → learner}/hooks/session-start +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/SKILL.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/analyst-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/consolidator-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/explorer-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/planner-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/promoter-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/step-worker-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/strategist-prompt.md +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { readBootstrapError } from '../errors/persisted-bootstrap-error.js';
|
|
4
|
+
import { MIGRATIONS_FILE } from '../earning/store.js';
|
|
4
5
|
const STEPS = [
|
|
5
6
|
'wallet',
|
|
6
7
|
'safe_predicted',
|
|
@@ -19,6 +20,38 @@ const STEPS = [
|
|
|
19
20
|
];
|
|
20
21
|
const STEP_INDEX = new Map(STEPS.map((s, i) => [s, i]));
|
|
21
22
|
const RUNNING_STEPS = new Set(['safe_binding_pending', 'complete']);
|
|
23
|
+
/**
|
|
24
|
+
* Reads the migration archive and returns the most recent retire_error from
|
|
25
|
+
* any entry where the migration explicitly suppressed the local-state wipe
|
|
26
|
+
* (`wipe_suppressed === true`). Pre-PR archive entries lack the field — they
|
|
27
|
+
* are intentionally NOT surfaced because their local state was wiped, so
|
|
28
|
+
* showing a "service state preserved" envelope would mislead the operator.
|
|
29
|
+
*/
|
|
30
|
+
function readLatestRetireError(earningDir) {
|
|
31
|
+
const archivePath = join(earningDir, MIGRATIONS_FILE);
|
|
32
|
+
if (!existsSync(archivePath))
|
|
33
|
+
return null;
|
|
34
|
+
let archive;
|
|
35
|
+
try {
|
|
36
|
+
archive = JSON.parse(readFileSync(archivePath, 'utf-8'));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const entries = archive.entries ?? [];
|
|
42
|
+
// Only surface entries where the wipe was *explicitly* suppressed by this
|
|
43
|
+
// PR's guard. Pre-PR entries have wipe_suppressed=undefined (falsy) and are
|
|
44
|
+
// ignored even though retire_status==='failed' — their state was reset, so
|
|
45
|
+
// the envelope would not apply.
|
|
46
|
+
const failed = entries.filter(e => e.retire_status === 'failed' && e.wipe_suppressed === true && e.retire_error);
|
|
47
|
+
if (failed.length === 0)
|
|
48
|
+
return null;
|
|
49
|
+
const latest = failed[failed.length - 1];
|
|
50
|
+
return {
|
|
51
|
+
retire_error: latest.retire_error,
|
|
52
|
+
tx_hash: latest.retire_tx_hash ?? null,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
22
55
|
function fundingTargetWei(fundingGate) {
|
|
23
56
|
const required = fundingGate.eth_required;
|
|
24
57
|
const balance = fundingGate.eth_balance;
|
|
@@ -66,16 +99,31 @@ export function addBootstrapRoutes(app, config) {
|
|
|
66
99
|
const fundingGateActive = Boolean(parsed.master_address) &&
|
|
67
100
|
fundingGate?.master_address?.toLowerCase() === parsed.master_address?.toLowerCase() &&
|
|
68
101
|
!allRunning;
|
|
102
|
+
// Three states map to currentStep:
|
|
103
|
+
// 1. fundingGateActive → 'awaiting_funding' (phase 2 in the panel).
|
|
104
|
+
// 2. funding cleared, services.length === 0 → 'safe_deployed' (phase 3,
|
|
105
|
+
// subState 'Deploying'). This is the "Stage 1 in flight" window —
|
|
106
|
+
// the daemon is deploying the fleet Safe, minting agentId, and
|
|
107
|
+
// binding via setAgentWallet, none of which creates a service row
|
|
108
|
+
// until Stage 2's distributor.stake() lands. Previously this branch
|
|
109
|
+
// also returned 'awaiting_funding' which left the panel lying for
|
|
110
|
+
// 30-60s of post-funding bootstrap work. jinn-mono-u34i UX fix.
|
|
111
|
+
// 3. services.length > 0 → first service's step (the normal post-
|
|
112
|
+
// Stage-2 path).
|
|
69
113
|
const currentStepIdx = fundingGateActive
|
|
70
114
|
? STEP_INDEX.get('awaiting_funding')
|
|
71
115
|
: services.length === 0
|
|
72
|
-
? (parsed.master_address ? STEP_INDEX.get('
|
|
116
|
+
? (parsed.master_address ? STEP_INDEX.get('safe_deployed') : 0)
|
|
73
117
|
: Math.min(...services.map((s) => STEP_INDEX.get(s.step) ?? 0));
|
|
74
118
|
const currentStep = STEPS[currentStepIdx];
|
|
75
119
|
// Surface the most recent persisted bootstrap-error envelope so the panel
|
|
76
120
|
// can render a "Bootstrap failed at X" state instead of staying frozen on
|
|
77
121
|
// the last persisted step. Cleared at the start of each bootstrap attempt.
|
|
78
122
|
const error = readBootstrapError(config.earningDir);
|
|
123
|
+
// Surface a retire_failed envelope when migration archived a failure but
|
|
124
|
+
// preserved local state. The BootstrapErrorCard (PR-6) will render it;
|
|
125
|
+
// for now we just expose the field so the dashboard can act on it.
|
|
126
|
+
const retireFailed = readLatestRetireError(config.earningDir);
|
|
79
127
|
const cfg = config.configReader?.() ?? {};
|
|
80
128
|
return c.json({
|
|
81
129
|
schemaVersion: 1,
|
|
@@ -85,6 +133,8 @@ export function addBootstrapRoutes(app, config) {
|
|
|
85
133
|
services,
|
|
86
134
|
master_address: parsed.master_address,
|
|
87
135
|
chain: parsed.chain,
|
|
136
|
+
...(parsed.fleet_agent_id ? { fleet_agent_id: parsed.fleet_agent_id } : {}),
|
|
137
|
+
...(parsed.fleet_safe_address ? { fleet_safe_address: parsed.fleet_safe_address } : {}),
|
|
88
138
|
...(cfg.rpcUrl !== undefined ? { rpcUrl: cfg.rpcUrl } : {}),
|
|
89
139
|
...(cfg.defaultRpcUrl !== undefined ? { defaultRpcUrl: cfg.defaultRpcUrl } : {}),
|
|
90
140
|
...(cfg.solverNets !== undefined ? { solverNets: cfg.solverNets } : {}),
|
|
@@ -95,9 +145,21 @@ export function addBootstrapRoutes(app, config) {
|
|
|
95
145
|
eth_required: fundingGate.eth_required,
|
|
96
146
|
eth_balance: fundingGate.eth_balance,
|
|
97
147
|
targetWei: fundingTargetWei(fundingGate),
|
|
148
|
+
// targetMet is false whenever the funding gate is active: the gate
|
|
149
|
+
// fires only when master balance < target. Once the gate clears the
|
|
150
|
+
// daemon advances past awaiting_funding and the funding block is
|
|
151
|
+
// omitted entirely (allRunning path or currentStep > awaiting_funding).
|
|
152
|
+
targetMet: false,
|
|
98
153
|
},
|
|
99
154
|
} : {}),
|
|
100
155
|
...(error ? { error } : {}),
|
|
156
|
+
...(retireFailed ? {
|
|
157
|
+
retire_failed: {
|
|
158
|
+
retire_error: retireFailed.retire_error,
|
|
159
|
+
tx_hash: retireFailed.tx_hash,
|
|
160
|
+
message: 'We could not retire your previous setup. Your service state is preserved; resolve the retire failure before upgrading.',
|
|
161
|
+
},
|
|
162
|
+
} : {}),
|
|
101
163
|
});
|
|
102
164
|
});
|
|
103
165
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-endpoint.js","sourceRoot":"","sources":["../../src/api/bootstrap-endpoint.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap-endpoint.js","sourceRoot":"","sources":["../../src/api/bootstrap-endpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/codex/doctor
|
|
3
|
+
*
|
|
4
|
+
* Runs `codex --version` via spawnSync and inspects the auth configuration so
|
|
5
|
+
* the operator dashboard can show an install-required / sign-in-required panel
|
|
6
|
+
* before the operator saves a Codex harness selection.
|
|
7
|
+
*
|
|
8
|
+
* Response shape:
|
|
9
|
+
* { installed: boolean, authenticated: boolean,
|
|
10
|
+
* authStatus: 'ok' | 'expired' | 'not_configured',
|
|
11
|
+
* exitCode: number | null, stdout: string, stderr: string }
|
|
12
|
+
*
|
|
13
|
+
* `installed: false` means the binary was not found (ENOENT or equivalent).
|
|
14
|
+
* `exitCode !== 0` (with `installed: true`) means the binary exists but
|
|
15
|
+
* `codex --version` itself failed.
|
|
16
|
+
*
|
|
17
|
+
* `authStatus` (with `installed: true`, `exitCode === 0`) classifies the
|
|
18
|
+
* Codex credentials:
|
|
19
|
+
* - `'ok'` — usable credentials: an `OPENAI_API_KEY` (env or in
|
|
20
|
+
* `auth.json`), or a non-expired `codex login` OAuth
|
|
21
|
+
* session.
|
|
22
|
+
* - `'expired'` — an `auth.json` is present but its OAuth tokens have
|
|
23
|
+
* expired, or the file is malformed/unreadable. A
|
|
24
|
+
* logged-out operator with a leftover file lands here
|
|
25
|
+
* instead of false-`ok` (#366).
|
|
26
|
+
* - `'not_configured'` — no `OPENAI_API_KEY` and no `auth.json` at all.
|
|
27
|
+
* `authenticated` is kept as a convenience alias for `authStatus === 'ok'`.
|
|
28
|
+
*
|
|
29
|
+
* Codex (unlike Hermes) has no `codex doctor` subcommand, so install
|
|
30
|
+
* detection shells `codex --version`. Codex also exposes no auth-status
|
|
31
|
+
* subcommand, so liveness is derived by parsing + expiry-checking the
|
|
32
|
+
* `auth.json` it persists — existence alone is not enough: a stale OAuth
|
|
33
|
+
* session reads as logged-in to a naive existence check (#366).
|
|
34
|
+
*
|
|
35
|
+
* The probe logic is exported as `probeCodexDoctor` so the Codex variant of
|
|
36
|
+
* the `LearnerHarness` can reuse it from `isReady()` — same source of truth
|
|
37
|
+
* for the SPA precheck panel and the daemon's claim-readiness gate (#348,
|
|
38
|
+
* same-shape bug as #330; liveness tightening from #366).
|
|
39
|
+
*/
|
|
40
|
+
import type { Hono } from 'hono';
|
|
41
|
+
/** Classification of Codex credentials. */
|
|
42
|
+
export type CodexAuthStatus = 'ok' | 'expired' | 'not_configured';
|
|
43
|
+
export interface CodexDoctorResponse {
|
|
44
|
+
installed: boolean;
|
|
45
|
+
/** Convenience alias — true iff `authStatus === 'ok'`. */
|
|
46
|
+
authenticated: boolean;
|
|
47
|
+
/** Live/expired/absent classification of Codex credentials. */
|
|
48
|
+
authStatus: CodexAuthStatus;
|
|
49
|
+
exitCode: number | null;
|
|
50
|
+
stdout: string;
|
|
51
|
+
stderr: string;
|
|
52
|
+
}
|
|
53
|
+
export interface CodexDoctorConfig {
|
|
54
|
+
codexPath?: string;
|
|
55
|
+
codexDoctorTimeoutMs?: number;
|
|
56
|
+
/** Inject env for testing (defaults to process.env). */
|
|
57
|
+
env?: NodeJS.ProcessEnv;
|
|
58
|
+
/**
|
|
59
|
+
* Override the auth-file read (for testing). Returns the raw `auth.json`
|
|
60
|
+
* contents, or `undefined` when no file exists. When supplied, the real
|
|
61
|
+
* filesystem is not touched.
|
|
62
|
+
*/
|
|
63
|
+
readAuthFile?: () => string | undefined;
|
|
64
|
+
/** Override the clock for deterministic expiry tests (epoch ms). */
|
|
65
|
+
now?: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Synchronously runs `codex --version` and classifies install + auth state.
|
|
69
|
+
* Pure (no Hono dependency) so the harness layer can call it without pulling
|
|
70
|
+
* the API server in.
|
|
71
|
+
*/
|
|
72
|
+
export declare function probeCodexDoctor(config?: CodexDoctorConfig): CodexDoctorResponse;
|
|
73
|
+
export declare function addCodexDoctorRoutes(app: Hono, config?: CodexDoctorConfig): void;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
/**
|
|
6
|
+
* Decodes a JWT's payload and returns its `exp` claim (epoch seconds), or
|
|
7
|
+
* `undefined` when the token is absent, malformed, or carries no `exp`.
|
|
8
|
+
* Defensive: never throws.
|
|
9
|
+
*
|
|
10
|
+
* Note: the JWT signature is intentionally NOT verified — this is not a
|
|
11
|
+
* security gap. The daemon only needs the `exp` claim for a liveness hint;
|
|
12
|
+
* Codex itself verifies signatures when the token is actually used.
|
|
13
|
+
*/
|
|
14
|
+
function jwtExpiry(token) {
|
|
15
|
+
if (typeof token !== 'string' || token.length === 0)
|
|
16
|
+
return undefined;
|
|
17
|
+
const parts = token.split('.');
|
|
18
|
+
if (parts.length !== 3)
|
|
19
|
+
return undefined;
|
|
20
|
+
try {
|
|
21
|
+
const payloadJson = Buffer.from(parts[1], 'base64url').toString('utf8');
|
|
22
|
+
const payload = JSON.parse(payloadJson);
|
|
23
|
+
return typeof payload.exp === 'number' ? payload.exp : undefined;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Classifies the credentials inside a parsed `auth.json`.
|
|
31
|
+
*
|
|
32
|
+
* - A non-empty `OPENAI_API_KEY` in the file is API-key mode — there is no
|
|
33
|
+
* expiry, so presence is acceptable (`'ok'`).
|
|
34
|
+
* - Otherwise it is OAuth (`codex login`) mode: expiry-check the JWT `exp`
|
|
35
|
+
* of `id_token` (falling back to `access_token`). An expired token, or
|
|
36
|
+
* tokens we cannot expiry-check at all (no JWT / no `exp`), is treated as
|
|
37
|
+
* `'expired'` — the safe direction for a claim gate: a logged-out operator
|
|
38
|
+
* with a leftover file must not read as live (#366).
|
|
39
|
+
*/
|
|
40
|
+
function classifyAuthFile(auth, nowMs) {
|
|
41
|
+
const fileApiKey = auth.OPENAI_API_KEY;
|
|
42
|
+
if (typeof fileApiKey === 'string' && fileApiKey.trim().length > 0) {
|
|
43
|
+
return 'ok';
|
|
44
|
+
}
|
|
45
|
+
const tokens = auth.tokens;
|
|
46
|
+
if (!tokens || typeof tokens !== 'object') {
|
|
47
|
+
// A file with neither an API key nor a tokens object carries no usable
|
|
48
|
+
// credential — treat as stale rather than live.
|
|
49
|
+
return 'expired';
|
|
50
|
+
}
|
|
51
|
+
const exp = jwtExpiry(tokens.id_token) ?? jwtExpiry(tokens.access_token);
|
|
52
|
+
if (exp === undefined) {
|
|
53
|
+
// Tokens present but not expiry-checkable — cannot prove liveness.
|
|
54
|
+
return 'expired';
|
|
55
|
+
}
|
|
56
|
+
return exp * 1000 > nowMs ? 'ok' : 'expired';
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Reads `auth.json` (from `CODEX_HOME` or `~/.codex`) and returns its raw
|
|
60
|
+
* contents, or `undefined` when the file does not exist. A read error other
|
|
61
|
+
* than "not found" (e.g. EACCES) is reported as an empty string so the caller
|
|
62
|
+
* classifies it as `expired` rather than `not_configured`.
|
|
63
|
+
*/
|
|
64
|
+
function readCodexAuthFile(config) {
|
|
65
|
+
if (config.readAuthFile)
|
|
66
|
+
return config.readAuthFile();
|
|
67
|
+
const env = config.env ?? process.env;
|
|
68
|
+
const codexHome = env['CODEX_HOME']?.trim();
|
|
69
|
+
const authPath = codexHome
|
|
70
|
+
? join(codexHome, 'auth.json')
|
|
71
|
+
: join(homedir(), '.codex', 'auth.json');
|
|
72
|
+
try {
|
|
73
|
+
return readFileSync(authPath, 'utf8');
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
const code = err?.code;
|
|
77
|
+
if (code === 'ENOENT')
|
|
78
|
+
return undefined;
|
|
79
|
+
// File exists but is unreadable — surface as a present-but-broken file so
|
|
80
|
+
// it classifies as `expired`, never `not_configured`.
|
|
81
|
+
return '';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Classifies Codex credential state. Codex authenticates either via the
|
|
86
|
+
* `OPENAI_API_KEY` env var (no expiry) or via a `codex login` session
|
|
87
|
+
* persisted to `auth.json` under `CODEX_HOME` (falling back to `~/.codex`).
|
|
88
|
+
*
|
|
89
|
+
* Liveness, not mere existence: a malformed file or an expired OAuth session
|
|
90
|
+
* classifies as `'expired'`, distinct from `'not_configured'` (no file and no
|
|
91
|
+
* env key). Never throws — a corrupt file degrades to `'expired'`.
|
|
92
|
+
*/
|
|
93
|
+
function detectCodexAuthStatus(config) {
|
|
94
|
+
if (hasApiKey(config))
|
|
95
|
+
return 'ok';
|
|
96
|
+
const raw = readCodexAuthFile(config);
|
|
97
|
+
if (raw === undefined)
|
|
98
|
+
return 'not_configured';
|
|
99
|
+
let parsed;
|
|
100
|
+
try {
|
|
101
|
+
parsed = JSON.parse(raw);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Malformed / truncated auth.json — a logged-out operator with a corrupt
|
|
105
|
+
// leftover file. Stale-class, never a false `ok` (#366).
|
|
106
|
+
return 'expired';
|
|
107
|
+
}
|
|
108
|
+
if (!parsed || typeof parsed !== 'object')
|
|
109
|
+
return 'expired';
|
|
110
|
+
const nowMs = config.now ?? Date.now();
|
|
111
|
+
return classifyAuthFile(parsed, nowMs);
|
|
112
|
+
}
|
|
113
|
+
function hasApiKey(config) {
|
|
114
|
+
const env = config.env ?? process.env;
|
|
115
|
+
return Boolean(env['OPENAI_API_KEY']?.trim());
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Synchronously runs `codex --version` and classifies install + auth state.
|
|
119
|
+
* Pure (no Hono dependency) so the harness layer can call it without pulling
|
|
120
|
+
* the API server in.
|
|
121
|
+
*/
|
|
122
|
+
export function probeCodexDoctor(config = {}) {
|
|
123
|
+
const codexBin = config.codexPath ?? 'codex';
|
|
124
|
+
const timeoutMs = config.codexDoctorTimeoutMs ?? 30_000;
|
|
125
|
+
const result = spawnSync(codexBin, ['--version'], {
|
|
126
|
+
timeout: timeoutMs,
|
|
127
|
+
encoding: 'utf8',
|
|
128
|
+
});
|
|
129
|
+
const errorCode = result.error?.code;
|
|
130
|
+
// installed=true means we found the binary on disk. ENOENT is the only
|
|
131
|
+
// definitive not-installed signal. Other errors (EACCES = wrong
|
|
132
|
+
// permissions; ETIMEDOUT = ran but didn't finish in time) indicate the
|
|
133
|
+
// binary exists but couldn't be exercised cleanly — surface those as
|
|
134
|
+
// config-issue, not missing.
|
|
135
|
+
const notFound = errorCode === 'ENOENT';
|
|
136
|
+
const installed = !notFound && (result.status !== null
|
|
137
|
+
|| result.signal !== null
|
|
138
|
+
|| (errorCode != null && errorCode !== 'ENOENT'));
|
|
139
|
+
// Auth is only meaningful once the binary is present and runnable.
|
|
140
|
+
const runnable = installed && result.status === 0;
|
|
141
|
+
const authStatus = runnable
|
|
142
|
+
? detectCodexAuthStatus(config)
|
|
143
|
+
: 'not_configured';
|
|
144
|
+
return {
|
|
145
|
+
installed,
|
|
146
|
+
authenticated: authStatus === 'ok',
|
|
147
|
+
authStatus,
|
|
148
|
+
exitCode: result.status,
|
|
149
|
+
stdout: (result.stdout ?? '').slice(0, 4000),
|
|
150
|
+
stderr: (result.stderr ?? '').slice(0, 4000),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export function addCodexDoctorRoutes(app, config = {}) {
|
|
154
|
+
app.get('/api/codex/doctor', (c) => {
|
|
155
|
+
return c.json(probeCodexDoctor(config));
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=codex-doctor-endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-doctor-endpoint.js","sourceRoot":"","sources":["../../src/api/codex-doctor-endpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /v1/discovery/* — daemon-side proxies onto the daemon's `DiscoveryAPI`
|
|
3
|
+
* instance so the SPA does not need direct GraphQL or RPC access.
|
|
4
|
+
*
|
|
5
|
+
* Routes:
|
|
6
|
+
* GET /v1/discovery/plugin-publications?solverType&builderAgentId&includeRevoked
|
|
7
|
+
* GET /v1/discovery/builder-artifacts?builderAgentId&limit
|
|
8
|
+
* GET /v1/discovery/plugin-scores?cid&limit
|
|
9
|
+
*
|
|
10
|
+
* Used by the /build SPA route (hfmf) to render published plug-ins, the
|
|
11
|
+
* local operator's published plug-ins, and per-plug-in score history.
|
|
12
|
+
*
|
|
13
|
+
* Accepts two config shapes:
|
|
14
|
+
* - `{ discovery: () => DiscoveryAPI }` — direct getter (legacy).
|
|
15
|
+
* - `{ getDiscovery: () => DiscoveryAPI | null }` — lazy holder access; returns
|
|
16
|
+
* 503 subsystem_not_ready until the daemon populates it post-bootstrap.
|
|
17
|
+
*
|
|
18
|
+
* The lazy form lets server.ts register the routes eagerly at server-start
|
|
19
|
+
* (before the daemon has built its DiscoveryAPI), so Hono's matcher includes
|
|
20
|
+
* the paths and the SPA gets a 503 (not a 404) while waiting for bootstrap to
|
|
21
|
+
* finish. Same eager-register / late-populate pattern as solverNetsLauncher
|
|
22
|
+
* and harnessReadinessRegistry. See jinn-mono-u34i.
|
|
23
|
+
*/
|
|
24
|
+
import type { Hono } from 'hono';
|
|
25
|
+
import type { DiscoveryAPI } from '../discovery/types.js';
|
|
26
|
+
export type DiscoveryEndpointConfig = {
|
|
27
|
+
discovery: () => DiscoveryAPI;
|
|
28
|
+
} | {
|
|
29
|
+
getDiscovery: () => DiscoveryAPI | null;
|
|
30
|
+
};
|
|
31
|
+
export declare function addDiscoveryRoutes(app: Hono, config: DiscoveryEndpointConfig): void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { DiscoveryUnavailableError } from '../discovery/types.js';
|
|
2
|
+
export function addDiscoveryRoutes(app, config) {
|
|
3
|
+
const getDiscovery = 'getDiscovery' in config ? config.getDiscovery : () => config.discovery();
|
|
4
|
+
app.get('/v1/discovery/plugin-publications', async (c) => {
|
|
5
|
+
const discovery = getDiscovery();
|
|
6
|
+
if (!discovery) {
|
|
7
|
+
return c.json({ error: 'subsystem_not_ready', message: 'DiscoveryAPI still initialising' }, 503);
|
|
8
|
+
}
|
|
9
|
+
const solverType = c.req.query('solverType');
|
|
10
|
+
const builderAgentId = c.req.query('builderAgentId');
|
|
11
|
+
const includeRevokedRaw = c.req.query('includeRevoked');
|
|
12
|
+
const includeRevoked = includeRevokedRaw === undefined ? undefined : includeRevokedRaw !== 'false';
|
|
13
|
+
try {
|
|
14
|
+
const publications = await discovery.listPluginPublications({
|
|
15
|
+
...(solverType !== undefined ? { solverType } : {}),
|
|
16
|
+
...(builderAgentId !== undefined ? { builderAgentId } : {}),
|
|
17
|
+
...(includeRevoked !== undefined ? { includeRevoked } : {}),
|
|
18
|
+
});
|
|
19
|
+
return c.json({ publications });
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
if (err instanceof DiscoveryUnavailableError) {
|
|
23
|
+
return c.json({ error: 'discovery_unavailable' }, 503);
|
|
24
|
+
}
|
|
25
|
+
return c.json({ error: 'internal_error', detail: err.message }, 503);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
app.get('/v1/discovery/builder-artifacts', async (c) => {
|
|
29
|
+
const discovery = getDiscovery();
|
|
30
|
+
if (!discovery) {
|
|
31
|
+
return c.json({ error: 'subsystem_not_ready', message: 'DiscoveryAPI still initialising' }, 503);
|
|
32
|
+
}
|
|
33
|
+
const builderAgentId = c.req.query('builderAgentId');
|
|
34
|
+
if (!builderAgentId) {
|
|
35
|
+
return c.json({ error: 'builderAgentId is required' }, 400);
|
|
36
|
+
}
|
|
37
|
+
const limitRaw = c.req.query('limit');
|
|
38
|
+
const limit = limitRaw === undefined ? undefined : Number(limitRaw);
|
|
39
|
+
try {
|
|
40
|
+
const artifacts = await discovery.listBuilderArtifacts({
|
|
41
|
+
builderAgentId,
|
|
42
|
+
...(limit !== undefined && Number.isFinite(limit) ? { limit } : {}),
|
|
43
|
+
});
|
|
44
|
+
return c.json({ artifacts });
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
if (err instanceof DiscoveryUnavailableError) {
|
|
48
|
+
return c.json({ error: 'discovery_unavailable' }, 503);
|
|
49
|
+
}
|
|
50
|
+
return c.json({ error: 'internal_error', detail: err.message }, 503);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
app.get('/v1/discovery/plugin-scores', async (c) => {
|
|
54
|
+
const discovery = getDiscovery();
|
|
55
|
+
if (!discovery) {
|
|
56
|
+
return c.json({ error: 'subsystem_not_ready', message: 'DiscoveryAPI still initialising' }, 503);
|
|
57
|
+
}
|
|
58
|
+
const cid = c.req.query('cid');
|
|
59
|
+
if (!cid)
|
|
60
|
+
return c.json({ error: 'cid is required' }, 400);
|
|
61
|
+
const limitRaw = c.req.query('limit');
|
|
62
|
+
const limit = limitRaw === undefined ? undefined : Number(limitRaw);
|
|
63
|
+
try {
|
|
64
|
+
const scores = await discovery.getPluginScores({
|
|
65
|
+
pluginCid: cid,
|
|
66
|
+
...(limit !== undefined && Number.isFinite(limit) ? { limit } : {}),
|
|
67
|
+
});
|
|
68
|
+
return c.json({ scores });
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
if (err instanceof DiscoveryUnavailableError) {
|
|
72
|
+
return c.json({ error: 'discovery_unavailable' }, 503);
|
|
73
|
+
}
|
|
74
|
+
return c.json({ error: 'internal_error', detail: err.message }, 503);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=discovery-endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-endpoint.js","sourceRoot":"","sources":["../../src/api/discovery-endpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,7 @@ export interface FleetV1Service {
|
|
|
30
30
|
staked: boolean;
|
|
31
31
|
evicted: boolean;
|
|
32
32
|
sinceBlock: number | null;
|
|
33
|
+
inactivitySeconds: number | null;
|
|
33
34
|
};
|
|
34
35
|
activity: {
|
|
35
36
|
lastEventAt: string | null;
|
|
@@ -43,6 +44,13 @@ export interface FleetV1Service {
|
|
|
43
44
|
kind: AttentionKind;
|
|
44
45
|
hint: string;
|
|
45
46
|
exampleCli: string;
|
|
47
|
+
/** Machine-readable category for programmatic consumers (e.g. CLI tools). */
|
|
48
|
+
category?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Decoded contract revert reason when `category === 'safe_binding_failed'`.
|
|
51
|
+
* Null when the revert had no reason data; absent for other attention kinds.
|
|
52
|
+
*/
|
|
53
|
+
revertReason?: string | null;
|
|
46
54
|
};
|
|
47
55
|
}
|
|
48
56
|
export interface FleetV1Response {
|
package/dist/api/fleet-build.js
CHANGED
|
@@ -18,10 +18,15 @@ function computeAttention(svc, raw, isFirstService) {
|
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
20
|
if (svc.error) {
|
|
21
|
+
const hint = svc.error_short_message ?? svc.error;
|
|
21
22
|
return {
|
|
22
23
|
kind: 'reconcile_needed',
|
|
23
|
-
hint
|
|
24
|
+
hint,
|
|
24
25
|
exampleCli: 'jinn status --detail',
|
|
26
|
+
...(svc.error?.startsWith('safe_binding_failed') ? { category: 'safe_binding_failed' } : {}),
|
|
27
|
+
...(svc.error_revert_reason !== undefined
|
|
28
|
+
? { revertReason: svc.error_revert_reason }
|
|
29
|
+
: {}),
|
|
25
30
|
};
|
|
26
31
|
}
|
|
27
32
|
if (svc.step === 'safe_binding_pending') {
|
|
@@ -67,8 +72,9 @@ export function assembleFleetV1(raw) {
|
|
|
67
72
|
},
|
|
68
73
|
staking: {
|
|
69
74
|
staked: isStakedLikeServiceStep(svc.step),
|
|
70
|
-
evicted: false,
|
|
75
|
+
evicted: raw.evictedByServiceIndex?.[di] ?? false,
|
|
71
76
|
sinceBlock: null,
|
|
77
|
+
inactivitySeconds: raw.inactivityByServiceIndex?.[di] ?? null,
|
|
72
78
|
},
|
|
73
79
|
activity: {
|
|
74
80
|
lastEventAt: per?.lastEventAt ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fleet-build.js","sourceRoot":"","sources":["../../src/api/fleet-build.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAqB,MAAM,qBAAqB,CAAC;AAC3G,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"fleet-build.js","sourceRoot":"","sources":["../../src/api/fleet-build.ts"],"names":[],"mappings":"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"}
|