@jinn-network/client 0.1.1 → 0.1.2-canary.6237288d
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 +16 -0
- package/CONTRIBUTING.md +123 -0
- package/README.md +213 -37
- package/deployments/deployment-claim-registry-baseSepolia.json +13 -0
- package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +15 -0
- package/dist/adapters/adapter.d.ts +7 -0
- package/dist/adapters/claim-registry/abi.d.ts +127 -0
- package/dist/adapters/claim-registry/abi.js +93 -0
- package/dist/adapters/claim-registry/abi.js.map +1 -0
- package/dist/adapters/claim-registry/client.d.ts +89 -0
- package/dist/adapters/claim-registry/client.js +205 -0
- package/dist/adapters/claim-registry/client.js.map +1 -0
- package/dist/adapters/mech/adapter.d.ts +5 -0
- package/dist/adapters/mech/adapter.js +211 -56
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +19 -1
- package/dist/adapters/mech/contracts.js +112 -8
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/ipfs.d.ts +38 -5
- package/dist/adapters/mech/ipfs.js +174 -17
- package/dist/adapters/mech/ipfs.js.map +1 -1
- package/dist/adapters/mech/safe.js +8 -6
- package/dist/adapters/mech/safe.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +22 -46
- package/dist/adapters/mech/types.js +16 -35
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/api/balance-build.js +3 -3
- package/dist/api/balance-build.js.map +1 -1
- package/dist/api/fleet-build.js +35 -40
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/gather-status.d.ts +6 -0
- package/dist/api/gather-status.js +187 -4
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/history-build.d.ts +5 -1
- package/dist/api/history-build.js +51 -26
- package/dist/api/history-build.js.map +1 -1
- package/dist/api/portfolio-v0-build.d.ts +83 -0
- package/dist/api/portfolio-v0-build.js +143 -0
- package/dist/api/portfolio-v0-build.js.map +1 -0
- package/dist/api/portfolio-v0-doctor.d.ts +37 -0
- package/dist/api/portfolio-v0-doctor.js +123 -0
- package/dist/api/portfolio-v0-doctor.js.map +1 -0
- package/dist/api/rewards-build.js +30 -14
- package/dist/api/rewards-build.js.map +1 -1
- package/dist/api/status-build.d.ts +39 -6
- package/dist/api/status-build.js +3 -1
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/status-rollup-build.d.ts +2 -0
- package/dist/api/status-rollup-build.js +30 -3
- package/dist/api/status-rollup-build.js.map +1 -1
- package/dist/bin/jinn-mcp.d.ts +0 -12
- package/dist/bin/jinn-mcp.js +5 -14
- package/dist/bin/jinn-mcp.js.map +1 -1
- package/dist/build-meta.json +1 -1
- package/dist/cli/commands/auth.js +137 -25
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/balance.js +8 -1
- package/dist/cli/commands/balance.js.map +1 -1
- package/dist/cli/commands/bootstrap.js +23 -0
- package/dist/cli/commands/bootstrap.js.map +1 -1
- package/dist/cli/commands/doctor.js +160 -14
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/fleet-scale.js +1 -0
- package/dist/cli/commands/fleet-scale.js.map +1 -1
- package/dist/cli/commands/fleet.js +10 -1
- package/dist/cli/commands/fleet.js.map +1 -1
- package/dist/cli/commands/fund-requirements.js +2 -0
- package/dist/cli/commands/fund-requirements.js.map +1 -1
- package/dist/cli/commands/history.js +25 -6
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/intents.d.ts +17 -0
- package/dist/cli/commands/intents.js +489 -0
- package/dist/cli/commands/intents.js.map +1 -0
- package/dist/cli/commands/keys-backup.js +13 -11
- package/dist/cli/commands/keys-backup.js.map +1 -1
- package/dist/cli/commands/logs.js +35 -11
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +3 -0
- package/dist/cli/commands/mcp.js +19 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/plugin-install.js +8 -4
- package/dist/cli/commands/plugin-install.js.map +1 -1
- package/dist/cli/commands/quickstart.js +99 -5
- package/dist/cli/commands/quickstart.js.map +1 -1
- package/dist/cli/commands/rewards.js +27 -1
- package/dist/cli/commands/rewards.js.map +1 -1
- package/dist/cli/commands/run.js +38 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/status.js +11 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/submit-intent.js +110 -44
- package/dist/cli/commands/submit-intent.js.map +1 -1
- package/dist/cli/commands/version.js +1 -0
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/deployment-digest.js +5 -0
- package/dist/cli/deployment-digest.js.map +1 -1
- package/dist/cli/execution-context.js +1 -0
- package/dist/cli/execution-context.js.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/intent-registry-access.d.ts +62 -0
- package/dist/cli/intent-registry-access.js +165 -0
- package/dist/cli/intent-registry-access.js.map +1 -0
- package/dist/cli/introspection-context.js +12 -8
- package/dist/cli/introspection-context.js.map +1 -1
- package/dist/cli/password.d.ts +21 -9
- package/dist/cli/password.js +45 -24
- package/dist/cli/password.js.map +1 -1
- package/dist/config.d.ts +137 -8
- package/dist/config.js +70 -12
- package/dist/config.js.map +1 -1
- package/dist/daemon/balance-topup-loop.js +32 -4
- package/dist/daemon/balance-topup-loop.js.map +1 -1
- package/dist/daemon/creator.d.ts +7 -4
- package/dist/daemon/creator.js +55 -26
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +35 -3
- package/dist/daemon/daemon.js +99 -7
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/delivery-watcher.d.ts +3 -1
- package/dist/daemon/delivery-watcher.js +19 -1
- package/dist/daemon/delivery-watcher.js.map +1 -1
- package/dist/daemon/reward-claim-loop.js +38 -1
- package/dist/daemon/reward-claim-loop.js.map +1 -1
- package/dist/dashboard/index.html +71 -496
- package/dist/discovery/registry.d.ts +54 -0
- package/dist/discovery/registry.js +73 -0
- package/dist/discovery/registry.js.map +1 -1
- package/dist/earning/bootstrap.d.ts +2 -1
- package/dist/earning/bootstrap.js +71 -33
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +10 -0
- package/dist/earning/contracts.js +24 -0
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/jinn-rewards.d.ts +9 -0
- package/dist/earning/jinn-rewards.js +7 -0
- package/dist/earning/jinn-rewards.js.map +1 -1
- package/dist/earning/stolas-claim.d.ts +6 -0
- package/dist/earning/stolas-claim.js +7 -0
- package/dist/earning/stolas-claim.js.map +1 -1
- package/dist/intents/kinds/constants.d.ts +5 -0
- package/dist/intents/kinds/constants.js +6 -0
- package/dist/intents/kinds/constants.js.map +1 -0
- package/dist/intents/kinds/index.d.ts +28 -0
- package/dist/intents/kinds/index.js +50 -0
- package/dist/intents/kinds/index.js.map +1 -0
- package/dist/intents/kinds/portfolio-v0.d.ts +2 -0
- package/dist/intents/kinds/portfolio-v0.js +13 -0
- package/dist/intents/kinds/portfolio-v0.js.map +1 -0
- package/dist/intents/kinds/prediction-apy-v0.d.ts +3 -0
- package/dist/intents/kinds/prediction-apy-v0.js +21 -0
- package/dist/intents/kinds/prediction-apy-v0.js.map +1 -0
- package/dist/intents/kinds/prediction-v0.d.ts +3 -0
- package/dist/intents/kinds/prediction-v0.js +32 -0
- package/dist/intents/kinds/prediction-v0.js.map +1 -0
- package/dist/intents/kinds/spec-kind.d.ts +38 -0
- package/dist/intents/kinds/spec-kind.js +6 -0
- package/dist/intents/kinds/spec-kind.js.map +1 -0
- package/dist/intents/posting-service.d.ts +26 -0
- package/dist/intents/posting-service.js +218 -0
- package/dist/intents/posting-service.js.map +1 -0
- package/dist/intents/prediction-apy-v0-auto.d.ts +11 -0
- package/dist/intents/prediction-apy-v0-auto.js +46 -0
- package/dist/intents/prediction-apy-v0-auto.js.map +1 -0
- package/dist/intents/prediction-apy-v0-template.d.ts +8 -0
- package/dist/intents/prediction-apy-v0-template.js +22 -0
- package/dist/intents/prediction-apy-v0-template.js.map +1 -0
- package/dist/intents/prediction-v0-auto.d.ts +53 -0
- package/dist/intents/prediction-v0-auto.js +84 -0
- package/dist/intents/prediction-v0-auto.js.map +1 -0
- package/dist/intents/prediction-v0-template.d.ts +70 -0
- package/dist/intents/prediction-v0-template.js +145 -0
- package/dist/intents/prediction-v0-template.js.map +1 -0
- package/dist/intents/sources.d.ts +39 -0
- package/dist/intents/sources.js +42 -0
- package/dist/intents/sources.js.map +1 -0
- package/dist/main.js +175 -3
- package/dist/main.js.map +1 -1
- package/dist/mcp/operator-server.d.ts +1 -1
- package/dist/mcp/operator-server.js +1 -1
- package/dist/mcp/server.js +8 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/observability/emit-event.d.ts +12 -0
- package/dist/observability/emit-event.js +27 -0
- package/dist/observability/emit-event.js.map +1 -0
- package/dist/preflight/api-port.d.ts +13 -0
- package/dist/preflight/api-port.js +32 -0
- package/dist/preflight/api-port.js.map +1 -0
- package/dist/preflight/claude-auth.d.ts +12 -1
- package/dist/preflight/claude-auth.js +21 -3
- package/dist/preflight/claude-auth.js.map +1 -1
- package/dist/preflight/rpc-network.d.ts +44 -0
- package/dist/preflight/rpc-network.js +121 -0
- package/dist/preflight/rpc-network.js.map +1 -0
- package/dist/restorer/engine/canonical-json.d.ts +18 -0
- package/dist/restorer/engine/canonical-json.js +59 -0
- package/dist/restorer/engine/canonical-json.js.map +1 -0
- package/dist/restorer/engine/claim.d.ts +69 -0
- package/dist/restorer/engine/claim.js +104 -0
- package/dist/restorer/engine/claim.js.map +1 -0
- package/dist/restorer/engine/delivery.d.ts +52 -0
- package/dist/restorer/engine/delivery.js +63 -0
- package/dist/restorer/engine/delivery.js.map +1 -0
- package/dist/restorer/engine/engine.d.ts +213 -0
- package/dist/restorer/engine/engine.js +769 -0
- package/dist/restorer/engine/engine.js.map +1 -0
- package/dist/restorer/engine/manifest-assembly.d.ts +67 -0
- package/dist/restorer/engine/manifest-assembly.js +79 -0
- package/dist/restorer/engine/manifest-assembly.js.map +1 -0
- package/dist/restorer/engine/packaging.d.ts +87 -0
- package/dist/restorer/engine/packaging.js +350 -0
- package/dist/restorer/engine/packaging.js.map +1 -0
- package/dist/restorer/engine/persistence.d.ts +170 -0
- package/dist/restorer/engine/persistence.js +381 -0
- package/dist/restorer/engine/persistence.js.map +1 -0
- package/dist/restorer/engine/recovery.d.ts +22 -0
- package/dist/restorer/engine/recovery.js +24 -0
- package/dist/restorer/engine/recovery.js.map +1 -0
- package/dist/restorer/engine/registry.d.ts +62 -0
- package/dist/restorer/engine/registry.js +73 -0
- package/dist/restorer/engine/registry.js.map +1 -0
- package/dist/restorer/engine/signing.d.ts +30 -0
- package/dist/restorer/engine/signing.js +39 -0
- package/dist/restorer/engine/signing.js.map +1 -0
- package/dist/restorer/engine/state.d.ts +42 -0
- package/dist/restorer/engine/state.js +87 -0
- package/dist/restorer/engine/state.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.d.ts +64 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js +96 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.d.ts +104 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +721 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +137 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js +865 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.d.ts +74 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js +74 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.d.ts +97 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js +226 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/index.d.ts +44 -0
- package/dist/restorer/impls/claude-mcp-prediction/index.js +239 -0
- package/dist/restorer/impls/claude-mcp-prediction/index.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.d.ts +38 -0
- package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.js +135 -0
- package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/prompt.d.ts +8 -0
- package/dist/restorer/impls/claude-mcp-prediction/prompt.js +54 -0
- package/dist/restorer/impls/claude-mcp-prediction/prompt.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.d.ts +36 -0
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js +137 -0
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/types.d.ts +84 -0
- package/dist/restorer/impls/claude-mcp-prediction/types.js +6 -0
- package/dist/restorer/impls/claude-mcp-prediction/types.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/index.d.ts +34 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/index.js +233 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/index.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.d.ts +18 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.js +136 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.d.ts +7 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.js +46 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.d.ts +27 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.js +128 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/types.d.ts +64 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/types.js +6 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/types.js.map +1 -0
- package/dist/restorer/impls/evaluation-context.d.ts +16 -0
- package/dist/restorer/impls/evaluation-context.js +18 -0
- package/dist/restorer/impls/evaluation-context.js.map +1 -0
- package/dist/restorer/impls/index.d.ts +46 -0
- package/dist/restorer/impls/index.js +88 -0
- package/dist/restorer/impls/index.js.map +1 -0
- package/dist/restorer/impls/legacy-claude/index.d.ts +52 -0
- package/dist/restorer/impls/legacy-claude/index.js +140 -0
- package/dist/restorer/impls/legacy-claude/index.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.d.ts +68 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js +117 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.d.ts +49 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js +91 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.d.ts +78 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js +274 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.d.ts +23 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js +49 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.d.ts +25 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js +44 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.d.ts +17 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js +43 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.d.ts +44 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js +440 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.d.ts +21 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.js +32 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.d.ts +34 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.js +8 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.d.ts +40 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.js +107 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/strategy.d.ts +2 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/strategy.js +7 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/strategy.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/types.d.ts +4 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/types.js +2 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/types.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.d.ts +6 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.js +11 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.d.ts +42 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js +208 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.d.ts +7 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.js +29 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/score.d.ts +9 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/score.js +20 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/score.js.map +1 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/types.d.ts +7 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/types.js +2 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/types.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.d.ts +31 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.js +100 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-baseline/strategy.d.ts +8 -0
- package/dist/restorer/impls/prediction-v0-baseline/strategy.js +41 -0
- package/dist/restorer/impls/prediction-v0-baseline/strategy.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-baseline/types.d.ts +7 -0
- package/dist/restorer/impls/prediction-v0-baseline/types.js +2 -0
- package/dist/restorer/impls/prediction-v0-baseline/types.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.d.ts +20 -0
- package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js +66 -0
- package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.d.ts +9 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js +23 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.d.ts +3 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js +13 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.d.ts +13 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js +111 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.d.ts +5 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js +20 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/index.d.ts +36 -0
- package/dist/restorer/impls/prediction-v0-evaluator/index.js +234 -0
- package/dist/restorer/impls/prediction-v0-evaluator/index.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/score.d.ts +8 -0
- package/dist/restorer/impls/prediction-v0-evaluator/score.js +15 -0
- package/dist/restorer/impls/prediction-v0-evaluator/score.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/types.d.ts +7 -0
- package/dist/restorer/impls/prediction-v0-evaluator/types.js +2 -0
- package/dist/restorer/impls/prediction-v0-evaluator/types.js.map +1 -0
- package/dist/restorer/types.d.ts +194 -0
- package/dist/restorer/types.js +28 -0
- package/dist/restorer/types.js.map +1 -0
- package/dist/rpc-error-context.d.ts +10 -0
- package/dist/rpc-error-context.js +26 -0
- package/dist/rpc-error-context.js.map +1 -0
- package/dist/store/store.d.ts +101 -1
- package/dist/store/store.js +334 -4
- package/dist/store/store.js.map +1 -1
- package/dist/trajectory/schema.d.ts +510 -0
- package/dist/trajectory/schema.js +74 -0
- package/dist/trajectory/schema.js.map +1 -0
- package/dist/types/desired-state.d.ts +53 -0
- package/dist/types/desired-state.js +20 -0
- package/dist/types/desired-state.js.map +1 -1
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.js +4 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/portfolio.d.ts +1000 -0
- package/dist/types/portfolio.js +168 -0
- package/dist/types/portfolio.js.map +1 -0
- package/dist/types/prediction-apy.d.ts +930 -0
- package/dist/types/prediction-apy.js +133 -0
- package/dist/types/prediction-apy.js.map +1 -0
- package/dist/types/prediction.d.ts +926 -0
- package/dist/types/prediction.js +141 -0
- package/dist/types/prediction.js.map +1 -0
- package/dist/venues/aave-v3/addresses.d.ts +6 -0
- package/dist/venues/aave-v3/addresses.js +19 -0
- package/dist/venues/aave-v3/addresses.js.map +1 -0
- package/dist/venues/aave-v3/client.d.ts +85 -0
- package/dist/venues/aave-v3/client.js +106 -0
- package/dist/venues/aave-v3/client.js.map +1 -0
- package/dist/venues/chainlink/client.d.ts +99 -0
- package/dist/venues/chainlink/client.js +130 -0
- package/dist/venues/chainlink/client.js.map +1 -0
- package/dist/venues/chainlink/feeds.d.ts +8 -0
- package/dist/venues/chainlink/feeds.js +9 -0
- package/dist/venues/chainlink/feeds.js.map +1 -0
- package/dist/venues/hyperliquid/account-value.d.ts +30 -0
- package/dist/venues/hyperliquid/account-value.js +30 -0
- package/dist/venues/hyperliquid/account-value.js.map +1 -0
- package/dist/venues/hyperliquid/client.d.ts +63 -0
- package/dist/venues/hyperliquid/client.js +135 -0
- package/dist/venues/hyperliquid/client.js.map +1 -0
- package/dist/venues/hyperliquid/grid.d.ts +36 -0
- package/dist/venues/hyperliquid/grid.js +61 -0
- package/dist/venues/hyperliquid/grid.js.map +1 -0
- package/dist/venues/hyperliquid/types.d.ts +81 -0
- package/dist/venues/hyperliquid/types.js +8 -0
- package/dist/venues/hyperliquid/types.js.map +1 -0
- package/dist/withdraw/run-withdraw-plan.js +2 -0
- package/dist/withdraw/run-withdraw-plan.js.map +1 -1
- package/docker-compose.yml +44 -0
- package/package.json +15 -3
- package/skills/jinn-operator/SKILL.md +85 -0
- package/dist/daemon/restorer.d.ts +0 -19
- package/dist/daemon/restorer.js +0 -82
- package/dist/daemon/restorer.js.map +0 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool definitions for claude-mcp-prediction-apy.
|
|
3
|
+
*
|
|
4
|
+
* Two tools:
|
|
5
|
+
* - read_aave_reserve: read-only Aave v3 Pool.getReserveData; APY bps from liquidity rate.
|
|
6
|
+
* - submit_apy_prediction: terminal tool; records predicted bps + rationale.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { createPublicClient, http } from 'viem';
|
|
10
|
+
import { base, baseSepolia, mainnet } from 'viem/chains';
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
12
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
13
|
+
import { AAVE_POOL_ABI, liquidityRateRayToApyBps, } from '../../../venues/aave-v3/client.js';
|
|
14
|
+
function ok(data) {
|
|
15
|
+
return {
|
|
16
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function toolErr(code, message) {
|
|
20
|
+
return {
|
|
21
|
+
content: [{ type: 'text', text: JSON.stringify({ error: true, code, message }) }],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const ReadAaveReserveSchema = z.object({});
|
|
25
|
+
const SubmitApyPredictionSchema = z.object({
|
|
26
|
+
predictedBps: z
|
|
27
|
+
.number()
|
|
28
|
+
.int('predictedBps must be an integer')
|
|
29
|
+
.min(0, 'predictedBps must be ≥ 0')
|
|
30
|
+
.max(1_000_000, 'predictedBps must be ≤ 1_000_000'),
|
|
31
|
+
rationale: z
|
|
32
|
+
.string()
|
|
33
|
+
.min(1, 'rationale must not be empty')
|
|
34
|
+
.max(2000, 'rationale must be ≤ 2000 characters'),
|
|
35
|
+
});
|
|
36
|
+
export function buildApyPredictionTools(deps) {
|
|
37
|
+
const { pool, reserve, reserveSymbol, venue, publicClient, onSubmit } = deps;
|
|
38
|
+
const readAaveReserve = {
|
|
39
|
+
name: 'read_aave_reserve',
|
|
40
|
+
description: 'Read the current Aave v3 reserve supply APY (basis points) for the pool/reserve in this intent. Returns the converted APY from currentLiquidityRate plus block metadata.',
|
|
41
|
+
schema: ReadAaveReserveSchema,
|
|
42
|
+
handler: async () => {
|
|
43
|
+
try {
|
|
44
|
+
const reserveData = await publicClient.readContract({
|
|
45
|
+
address: pool,
|
|
46
|
+
abi: AAVE_POOL_ABI,
|
|
47
|
+
functionName: 'getReserveData',
|
|
48
|
+
args: [reserve],
|
|
49
|
+
});
|
|
50
|
+
const currentLiquidityRateRay = reserveData[2];
|
|
51
|
+
const lastUpdateTimestamp = reserveData[6];
|
|
52
|
+
const apyBps = liquidityRateRayToApyBps(currentLiquidityRateRay);
|
|
53
|
+
const block = await publicClient.getBlock({ blockTag: 'latest' });
|
|
54
|
+
const chainId = await publicClient.getChainId();
|
|
55
|
+
return ok({
|
|
56
|
+
apyBps,
|
|
57
|
+
liquidityRateRay: String(currentLiquidityRateRay),
|
|
58
|
+
lastUpdateTimestamp: Number(lastUpdateTimestamp),
|
|
59
|
+
pool,
|
|
60
|
+
reserve,
|
|
61
|
+
reserveSymbol,
|
|
62
|
+
venue,
|
|
63
|
+
chainId,
|
|
64
|
+
blockNumber: String(block.number),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
return toolErr('AAVE_READ_FAILED', err instanceof Error ? err.message : String(err));
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
const submitApyPrediction = {
|
|
73
|
+
name: 'submit_apy_prediction',
|
|
74
|
+
description: 'Submit your final APY prediction in basis points (integer). `predictedBps` is the supply APY you predict for the TWA window ending at resolveTs. `rationale` is a brief explanation. Calling this ends the session; do not call any other tool after it.',
|
|
75
|
+
schema: SubmitApyPredictionSchema,
|
|
76
|
+
handler: async (rawArgs) => {
|
|
77
|
+
const parsed = SubmitApyPredictionSchema.safeParse(rawArgs);
|
|
78
|
+
if (!parsed.success) {
|
|
79
|
+
return toolErr('INVALID_ARGS', parsed.error.issues.map((i) => i.message).join('; '));
|
|
80
|
+
}
|
|
81
|
+
const { predictedBps, rationale } = parsed.data;
|
|
82
|
+
const predictedBpsStr = String(predictedBps);
|
|
83
|
+
onSubmit({ predictedBps: predictedBpsStr, rationale });
|
|
84
|
+
return ok({
|
|
85
|
+
accepted: true,
|
|
86
|
+
predictedBps: predictedBpsStr,
|
|
87
|
+
note: 'Prediction recorded. The session will terminate shortly after this response reaches Claude.',
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
return [readAaveReserve, submitApyPrediction];
|
|
92
|
+
}
|
|
93
|
+
function chainForVenue(venue) {
|
|
94
|
+
if (venue === 'aave-v3-base-sepolia')
|
|
95
|
+
return { chain: baseSepolia, chainId: 84532 };
|
|
96
|
+
if (venue === 'aave-v3-mainnet')
|
|
97
|
+
return { chain: mainnet, chainId: 1 };
|
|
98
|
+
return { chain: base, chainId: 8453 };
|
|
99
|
+
}
|
|
100
|
+
export async function startMcpServer(config) {
|
|
101
|
+
const { chain } = chainForVenue(config.venue);
|
|
102
|
+
const publicClient = createPublicClient({
|
|
103
|
+
chain,
|
|
104
|
+
transport: http(config.rpcUrl),
|
|
105
|
+
});
|
|
106
|
+
const { appendFileSync } = await import('node:fs');
|
|
107
|
+
const onSubmit = (submission) => {
|
|
108
|
+
appendFileSync(config.submissionLogPath, JSON.stringify({
|
|
109
|
+
ts: Date.now(),
|
|
110
|
+
predictedBps: submission.predictedBps,
|
|
111
|
+
rationale: submission.rationale,
|
|
112
|
+
}) + '\n', { encoding: 'utf-8' });
|
|
113
|
+
};
|
|
114
|
+
const tools = buildApyPredictionTools({
|
|
115
|
+
pool: config.pool,
|
|
116
|
+
reserve: config.reserve,
|
|
117
|
+
reserveSymbol: config.reserveSymbol,
|
|
118
|
+
venue: config.venue,
|
|
119
|
+
publicClient,
|
|
120
|
+
onSubmit,
|
|
121
|
+
});
|
|
122
|
+
const server = new McpServer({ name: 'jinn-apy-prediction', version: '1.0.0' });
|
|
123
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
124
|
+
const registerTool = server.tool.bind(server);
|
|
125
|
+
for (const tool of tools) {
|
|
126
|
+
const shape = tool.schema.shape ?? {};
|
|
127
|
+
registerTool(tool.name, tool.description, shape, async (args) => tool.handler(args));
|
|
128
|
+
}
|
|
129
|
+
const transport = new StdioServerTransport();
|
|
130
|
+
await server.connect(transport);
|
|
131
|
+
await new Promise((resolve) => {
|
|
132
|
+
process.stdin.on('close', resolve);
|
|
133
|
+
process.stdin.on('end', resolve);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=mcp-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tools.js","sourceRoot":"","sources":["../../../../src/restorer/impls/claude-mcp-prediction-apy/mcp-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt template for claude-mcp-prediction-apy sessions.
|
|
3
|
+
*
|
|
4
|
+
* Kept intentionally static (no branching) so tests can snapshot deterministically.
|
|
5
|
+
*/
|
|
6
|
+
import type { PredictionApyV0Intent } from '../../../types/prediction-apy.js';
|
|
7
|
+
export declare function buildSessionPrompt(intent: PredictionApyV0Intent, sessionId: string): string;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt template for claude-mcp-prediction-apy sessions.
|
|
3
|
+
*
|
|
4
|
+
* Kept intentionally static (no branching) so tests can snapshot deterministically.
|
|
5
|
+
*/
|
|
6
|
+
export function buildSessionPrompt(intent, sessionId) {
|
|
7
|
+
const { oracle, metric, question } = intent.spec;
|
|
8
|
+
const { window } = intent;
|
|
9
|
+
return [
|
|
10
|
+
`Session: ${sessionId}`,
|
|
11
|
+
'',
|
|
12
|
+
'You are evaluating a Jinn prediction.apy.v0 intent. Predict the time-weighted-average (TWA) supply APY for the reserve, expressed as an integer in basis points (bps), and submit it via submit_apy_prediction.',
|
|
13
|
+
'',
|
|
14
|
+
'Ground truth (for scoring) is computed at resolution as follows:',
|
|
15
|
+
' - Take sampleCount evenly spaced timestamps in [resolveTs - twaWindowSeconds, resolveTs].',
|
|
16
|
+
' - At each timestamp, read Aave Pool.getReserveData(reserve).currentLiquidityRate (ray).',
|
|
17
|
+
' - Convert each sample to supply APY and take the arithmetic mean; round to integer bps.',
|
|
18
|
+
'',
|
|
19
|
+
`Reserve: ${oracle.reserveSymbol} (${oracle.reserve})`,
|
|
20
|
+
`Pool: ${oracle.pool}`,
|
|
21
|
+
`Venue: ${oracle.venue}`,
|
|
22
|
+
`TWA window: ${metric.twaWindowSeconds}s with ${metric.sampleCount} samples`,
|
|
23
|
+
`Tolerance: ±${metric.toleranceBps} bps (for scoring)`,
|
|
24
|
+
'',
|
|
25
|
+
`Intent window: [${new Date(window.startTs).toISOString()}, ${new Date(window.endTs).toISOString()}]`,
|
|
26
|
+
`Resolve at: ${new Date(question.resolveTs).toISOString()}`,
|
|
27
|
+
'',
|
|
28
|
+
'You have exactly two tools:',
|
|
29
|
+
'',
|
|
30
|
+
' 1. read_aave_reserve — returns the current on-chain supply APY in bps from the reserve (spot, not the full TWA). Call this once.',
|
|
31
|
+
' 2. submit_apy_prediction — submit your final predicted bps (non-negative integer) with a brief rationale.',
|
|
32
|
+
' Calling this ends the session. Do not call any other tool afterward.',
|
|
33
|
+
'',
|
|
34
|
+
'Approach:',
|
|
35
|
+
' 1. Call read_aave_reserve to see the current supply APY in bps.',
|
|
36
|
+
' 2. Reason briefly about what TWA APY at resolveTs might be given the spot reading and time to resolution.',
|
|
37
|
+
' 3. Call submit_apy_prediction with your integer predictedBps and a concise rationale.',
|
|
38
|
+
'',
|
|
39
|
+
'Guidelines:',
|
|
40
|
+
' - predictedBps must be a whole number (basis points). Example: 350 means 3.50% APY.',
|
|
41
|
+
' - Do not call submit_apy_prediction before calling read_aave_reserve.',
|
|
42
|
+
' - The rationale should reference the apyBps you read.',
|
|
43
|
+
' - Keep the rationale under 2000 characters.',
|
|
44
|
+
].join('\n');
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../src/restorer/impls/claude-mcp-prediction-apy/prompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,UAAU,kBAAkB,CAAC,MAA6B,EAAE,SAAiB;IACjF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACjD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE1B,OAAO;QACL,YAAY,SAAS,EAAE;QACvB,EAAE;QACF,iNAAiN;QACjN,EAAE;QACF,kEAAkE;QAClE,6FAA6F;QAC7F,2FAA2F;QAC3F,2FAA2F;QAC3F,EAAE;QACF,mBAAmB,MAAM,CAAC,aAAa,KAAK,MAAM,CAAC,OAAO,GAAG;QAC7D,mBAAmB,MAAM,CAAC,IAAI,EAAE;QAChC,mBAAmB,MAAM,CAAC,KAAK,EAAE;QACjC,mBAAmB,MAAM,CAAC,gBAAgB,UAAU,MAAM,CAAC,WAAW,UAAU;QAChF,oBAAoB,MAAM,CAAC,YAAY,oBAAoB;QAC3D,EAAE;QACF,oBAAoB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,GAAG;QACtG,mBAAmB,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE;QAC/D,EAAE;QACF,6BAA6B;QAC7B,EAAE;QACF,oIAAoI;QACpI,6GAA6G;QAC7G,kGAAkG;QAClG,EAAE;QACF,WAAW;QACX,mEAAmE;QACnE,6GAA6G;QAC7G,yFAAyF;QACzF,EAAE;QACF,aAAa;QACb,uFAAuF;QACvF,yEAAyE;QACzE,yDAAyD;QACzD,+CAA+C;KAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session orchestrator for claude-mcp-prediction-apy.
|
|
3
|
+
*
|
|
4
|
+
* Single-session. Spawns Claude once with the APY prediction MCP + prompt,
|
|
5
|
+
* polls for submit_apy_prediction, then terminates after a short grace period.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import type { SessionResult } from './types.js';
|
|
9
|
+
export interface OrchestratorDeps {
|
|
10
|
+
claudePath: string;
|
|
11
|
+
claudeModel?: string;
|
|
12
|
+
mcpConfigPath: string;
|
|
13
|
+
workingDir: string;
|
|
14
|
+
abort: AbortSignal;
|
|
15
|
+
log: (event: {
|
|
16
|
+
level: 'info' | 'warn' | 'error';
|
|
17
|
+
msg: string;
|
|
18
|
+
data?: unknown;
|
|
19
|
+
}) => void;
|
|
20
|
+
/** Poll callback — returns true once submit_apy_prediction has been invoked. */
|
|
21
|
+
isSubmitted: () => boolean;
|
|
22
|
+
sessionMaxMs?: number;
|
|
23
|
+
pollIntervalMs?: number;
|
|
24
|
+
submissionGraceMs?: number;
|
|
25
|
+
_spawnFn?: typeof spawn;
|
|
26
|
+
}
|
|
27
|
+
export declare function spawnSession(sessionId: string, prompt: string, deps: OrchestratorDeps): Promise<SessionResult>;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session orchestrator for claude-mcp-prediction-apy.
|
|
3
|
+
*
|
|
4
|
+
* Single-session. Spawns Claude once with the APY prediction MCP + prompt,
|
|
5
|
+
* polls for submit_apy_prediction, then terminates after a short grace period.
|
|
6
|
+
*/
|
|
7
|
+
import { appendFileSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
const DEFAULT_SESSION_MAX_MS = 180_000;
|
|
11
|
+
const DEFAULT_POLL_INTERVAL_MS = 500;
|
|
12
|
+
const DEFAULT_SUBMISSION_GRACE_MS = 2_000;
|
|
13
|
+
export async function spawnSession(sessionId, prompt, deps) {
|
|
14
|
+
const sessionMaxMs = deps.sessionMaxMs ?? DEFAULT_SESSION_MAX_MS;
|
|
15
|
+
const pollIntervalMs = deps.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
16
|
+
const submissionGraceMs = deps.submissionGraceMs ?? DEFAULT_SUBMISSION_GRACE_MS;
|
|
17
|
+
const sessionDir = join(deps.workingDir, 'sessions', sessionId);
|
|
18
|
+
mkdirSync(sessionDir, { recursive: true });
|
|
19
|
+
const transcriptPath = join(sessionDir, 'transcript.txt');
|
|
20
|
+
const startedAt = Date.now();
|
|
21
|
+
writeFileSync(transcriptPath, `=== Session ${sessionId} started at ${new Date(startedAt).toISOString()} ===\n\n`);
|
|
22
|
+
const args = [
|
|
23
|
+
'-p', prompt,
|
|
24
|
+
'--mcp-config', deps.mcpConfigPath,
|
|
25
|
+
'--strict-mcp-config',
|
|
26
|
+
'--allowedTools', 'mcp__jinn-apy-prediction__*',
|
|
27
|
+
];
|
|
28
|
+
if (deps.claudeModel)
|
|
29
|
+
args.push('--model', deps.claudeModel);
|
|
30
|
+
const agentEnv = {};
|
|
31
|
+
for (const key of [
|
|
32
|
+
'PATH', 'HOME', 'USER', 'SHELL', 'LANG', 'TERM', 'TMPDIR',
|
|
33
|
+
'XDG_CONFIG_HOME', 'XDG_DATA_HOME', 'XDG_CACHE_HOME',
|
|
34
|
+
'NODE_PATH', 'NODE_OPTIONS', 'NPM_CONFIG_PREFIX',
|
|
35
|
+
'CLAUDE_CODE_OAUTH_TOKEN', 'ANTHROPIC_API_KEY',
|
|
36
|
+
]) {
|
|
37
|
+
if (process.env[key])
|
|
38
|
+
agentEnv[key] = process.env[key];
|
|
39
|
+
}
|
|
40
|
+
deps.log({ level: 'info', msg: `apy-prediction-session: spawning ${sessionId}`, data: { claudePath: deps.claudePath } });
|
|
41
|
+
const spawnFn = deps._spawnFn ?? spawn;
|
|
42
|
+
return new Promise((resolve) => {
|
|
43
|
+
const child = spawnFn(deps.claudePath, args, {
|
|
44
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
45
|
+
env: agentEnv,
|
|
46
|
+
});
|
|
47
|
+
let stdout = '';
|
|
48
|
+
let aborted = false;
|
|
49
|
+
let terminatedEarly = false;
|
|
50
|
+
child.stdout?.on('data', (d) => {
|
|
51
|
+
const chunk = d.toString();
|
|
52
|
+
stdout += chunk;
|
|
53
|
+
appendFileSync(transcriptPath, chunk);
|
|
54
|
+
});
|
|
55
|
+
child.stderr?.on('data', (d) => {
|
|
56
|
+
appendFileSync(transcriptPath, `[stderr] ${d.toString()}`);
|
|
57
|
+
});
|
|
58
|
+
const sessionTimeout = setTimeout(() => {
|
|
59
|
+
if (!child.killed) {
|
|
60
|
+
deps.log({ level: 'warn', msg: `apy-prediction-session: ${sessionId} reached sessionMaxMs; killing`, data: { sessionMaxMs } });
|
|
61
|
+
child.kill('SIGTERM');
|
|
62
|
+
}
|
|
63
|
+
}, sessionMaxMs);
|
|
64
|
+
let graceTimer = null;
|
|
65
|
+
const pollTimer = setInterval(() => {
|
|
66
|
+
if (graceTimer || child.killed)
|
|
67
|
+
return;
|
|
68
|
+
if (deps.isSubmitted()) {
|
|
69
|
+
deps.log({ level: 'info', msg: `apy-prediction-session: ${sessionId} submit_apy_prediction invoked; scheduling graceful termination` });
|
|
70
|
+
terminatedEarly = true;
|
|
71
|
+
graceTimer = setTimeout(() => {
|
|
72
|
+
if (!child.killed)
|
|
73
|
+
child.kill('SIGTERM');
|
|
74
|
+
}, submissionGraceMs);
|
|
75
|
+
}
|
|
76
|
+
}, pollIntervalMs);
|
|
77
|
+
const onAbort = () => {
|
|
78
|
+
if (aborted)
|
|
79
|
+
return;
|
|
80
|
+
aborted = true;
|
|
81
|
+
deps.log({ level: 'info', msg: `apy-prediction-session: ${sessionId} window abort; killing` });
|
|
82
|
+
child.kill('SIGTERM');
|
|
83
|
+
};
|
|
84
|
+
deps.abort.addEventListener('abort', onAbort);
|
|
85
|
+
const cleanup = () => {
|
|
86
|
+
clearTimeout(sessionTimeout);
|
|
87
|
+
if (graceTimer)
|
|
88
|
+
clearTimeout(graceTimer);
|
|
89
|
+
clearInterval(pollTimer);
|
|
90
|
+
deps.abort.removeEventListener('abort', onAbort);
|
|
91
|
+
};
|
|
92
|
+
child.on('exit', (code, signal) => {
|
|
93
|
+
cleanup();
|
|
94
|
+
const endedAt = Date.now();
|
|
95
|
+
appendFileSync(transcriptPath, `\n\n=== Session ended at ${new Date(endedAt).toISOString()} (code=${code} signal=${signal} submitted=${deps.isSubmitted()} terminatedEarly=${terminatedEarly} aborted=${aborted}) ===\n`);
|
|
96
|
+
deps.log({
|
|
97
|
+
level: 'info',
|
|
98
|
+
msg: `apy-prediction-session: ${sessionId} exited`,
|
|
99
|
+
data: { code, signal, durationMs: endedAt - startedAt, submitted: deps.isSubmitted(), aborted },
|
|
100
|
+
});
|
|
101
|
+
resolve({
|
|
102
|
+
sessionId,
|
|
103
|
+
startedAt,
|
|
104
|
+
endedAt,
|
|
105
|
+
transcriptPath,
|
|
106
|
+
submitted: deps.isSubmitted(),
|
|
107
|
+
stdout,
|
|
108
|
+
aborted: aborted || deps.abort.aborted,
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
child.on('error', (err) => {
|
|
112
|
+
cleanup();
|
|
113
|
+
const endedAt = Date.now();
|
|
114
|
+
appendFileSync(transcriptPath, `\n\n=== Session spawn error: ${err.message} ===\n`);
|
|
115
|
+
deps.log({ level: 'error', msg: `apy-prediction-session: ${sessionId} spawn error`, data: { err: err.message } });
|
|
116
|
+
resolve({
|
|
117
|
+
sessionId,
|
|
118
|
+
startedAt,
|
|
119
|
+
endedAt,
|
|
120
|
+
transcriptPath,
|
|
121
|
+
submitted: deps.isSubmitted(),
|
|
122
|
+
stdout,
|
|
123
|
+
aborted: deps.abort.aborted,
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=session-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-orchestrator.js","sourceRoot":"","sources":["../../../../src/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for claude-mcp-prediction-apy — a RestorerImpl that spawns Claude with
|
|
3
|
+
* two MCP tools to submit prediction.apy.v0 (integer APY bps).
|
|
4
|
+
*/
|
|
5
|
+
import type { PublicClient } from 'viem';
|
|
6
|
+
export interface McpToolContent {
|
|
7
|
+
type: 'text';
|
|
8
|
+
text: string;
|
|
9
|
+
}
|
|
10
|
+
export interface McpToolResult {
|
|
11
|
+
content: McpToolContent[];
|
|
12
|
+
}
|
|
13
|
+
export interface ApyPredictionToolDefinition {
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
schema: import('zod').ZodObject<import('zod').ZodRawShape>;
|
|
17
|
+
handler: (args: unknown) => Promise<McpToolResult>;
|
|
18
|
+
}
|
|
19
|
+
export interface SubmissionState {
|
|
20
|
+
predictedBps: string | null;
|
|
21
|
+
rationale: string | null;
|
|
22
|
+
submittedAt: number | null;
|
|
23
|
+
}
|
|
24
|
+
export type AaveV3Venue = 'aave-v3-base-sepolia' | 'aave-v3-base' | 'aave-v3-mainnet';
|
|
25
|
+
export interface ApyPredictionToolDeps {
|
|
26
|
+
pool: `0x${string}`;
|
|
27
|
+
reserve: `0x${string}`;
|
|
28
|
+
reserveSymbol: string;
|
|
29
|
+
venue: AaveV3Venue;
|
|
30
|
+
publicClient: PublicClient;
|
|
31
|
+
onSubmit: (submission: {
|
|
32
|
+
predictedBps: string;
|
|
33
|
+
rationale: string;
|
|
34
|
+
}) => void;
|
|
35
|
+
}
|
|
36
|
+
export interface ClaudeMcpPredictionApyConfig {
|
|
37
|
+
rpcUrl?: string;
|
|
38
|
+
archiveRpcUrl?: string;
|
|
39
|
+
claudeModel?: string;
|
|
40
|
+
claudePath?: string;
|
|
41
|
+
sessionMaxMs?: number;
|
|
42
|
+
_testDeps?: TestDeps;
|
|
43
|
+
stub?: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface TestDeps {
|
|
46
|
+
runSession?: (args: {
|
|
47
|
+
sessionId: string;
|
|
48
|
+
prompt: string;
|
|
49
|
+
mcpConfigPath: string;
|
|
50
|
+
workingDir: string;
|
|
51
|
+
implStateDir: string;
|
|
52
|
+
timeoutMs: number;
|
|
53
|
+
signalSubmit: (predictedBps: string, rationale: string) => void;
|
|
54
|
+
}) => Promise<SessionResult>;
|
|
55
|
+
}
|
|
56
|
+
export interface SessionResult {
|
|
57
|
+
sessionId: string;
|
|
58
|
+
startedAt: number;
|
|
59
|
+
endedAt: number;
|
|
60
|
+
transcriptPath: string;
|
|
61
|
+
submitted: boolean;
|
|
62
|
+
stdout: string;
|
|
63
|
+
aborted: boolean;
|
|
64
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/restorer/impls/claude-mcp-prediction-apy/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DesiredState } from '../../types/desired-state.js';
|
|
2
|
+
/** Eval `DesiredState.context` key for the restoration job’s intended-state IPFS CID (not the eval job’s). */
|
|
3
|
+
export declare const RESTORATION_INTENT_CID_CONTEXT_KEY: "restorationIntentCid";
|
|
4
|
+
/**
|
|
5
|
+
* Resolve the expected restoration intent CID for `integrity.intent_ref`.
|
|
6
|
+
* Test-only overrides win; otherwise the value must be present in `context`.
|
|
7
|
+
* There is no fallback to the evaluation job’s `intentCid` (wrong reference).
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveExpectedRestorationIntentCid(intent: DesiredState, testDeps?: {
|
|
10
|
+
expectedIntentCid?: string;
|
|
11
|
+
}): {
|
|
12
|
+
kind: 'resolved';
|
|
13
|
+
cid: string;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'missing';
|
|
16
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Eval `DesiredState.context` key for the restoration job’s intended-state IPFS CID (not the eval job’s). */
|
|
2
|
+
export const RESTORATION_INTENT_CID_CONTEXT_KEY = 'restorationIntentCid';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the expected restoration intent CID for `integrity.intent_ref`.
|
|
5
|
+
* Test-only overrides win; otherwise the value must be present in `context`.
|
|
6
|
+
* There is no fallback to the evaluation job’s `intentCid` (wrong reference).
|
|
7
|
+
*/
|
|
8
|
+
export function resolveExpectedRestorationIntentCid(intent, testDeps) {
|
|
9
|
+
if (testDeps?.expectedIntentCid) {
|
|
10
|
+
return { kind: 'resolved', cid: testDeps.expectedIntentCid };
|
|
11
|
+
}
|
|
12
|
+
const v = intent.context?.[RESTORATION_INTENT_CID_CONTEXT_KEY];
|
|
13
|
+
if (typeof v === 'string' && v.length > 0) {
|
|
14
|
+
return { kind: 'resolved', cid: v };
|
|
15
|
+
}
|
|
16
|
+
return { kind: 'missing' };
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=evaluation-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation-context.js","sourceRoot":"","sources":["../../../src/restorer/impls/evaluation-context.ts"],"names":[],"mappings":"AAEA,8GAA8G;AAC9G,MAAM,CAAC,MAAM,kCAAkC,GAAG,sBAA+B,CAAC;AAElF;;;;GAIG;AACH,MAAM,UAAU,mCAAmC,CACjD,MAAoB,EACpB,QAAyC;IAEzC,IAAI,QAAQ,EAAE,iBAAiB,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,kCAAkC,CAAC,CAAC;IAC/D,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single construction site for all first-party {@link RestorerImpl} instances.
|
|
3
|
+
* Used by the daemon entrypoint and `jinn intents` CLI (stub mode).
|
|
4
|
+
*/
|
|
5
|
+
import type { Runner } from '../../runner/runner.js';
|
|
6
|
+
import type { RestorerImpl } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Environment passed to {@link buildRestorerImpls} — same shape for daemon
|
|
9
|
+
* (live creds) and CLI introspection (stub: true, optional runner).
|
|
10
|
+
*/
|
|
11
|
+
export interface RestorerEnv {
|
|
12
|
+
/** When true, CLI path — impls report `requires live daemon` from `isReady()`. */
|
|
13
|
+
stub?: boolean;
|
|
14
|
+
/** Agent EOA private key (daemon). */
|
|
15
|
+
pk?: `0x${string}`;
|
|
16
|
+
/** Service Safe address (daemon). */
|
|
17
|
+
safe?: `0x${string}`;
|
|
18
|
+
rpcUrl: string;
|
|
19
|
+
archiveRpcUrl?: string;
|
|
20
|
+
claudePath: string;
|
|
21
|
+
claudeModel: string;
|
|
22
|
+
/**
|
|
23
|
+
* Required for production registry when `legacy-claude` is included.
|
|
24
|
+
* Omitted in stub CLI registries.
|
|
25
|
+
*/
|
|
26
|
+
runner?: Runner;
|
|
27
|
+
/** e.g. `http://127.0.0.1:${apiPort}` for {@link LegacyClaudeImpl} */
|
|
28
|
+
daemonApiUrl?: string;
|
|
29
|
+
/** SQLite store path for MCP artifact handoff in {@link LegacyClaudeImpl}. */
|
|
30
|
+
storePath?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Legacy-claude runner working directory (defaults to /tmp if unset).
|
|
33
|
+
*/
|
|
34
|
+
legacyClaudeWorkingDirectory?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Root for impl-scoped state dirs (e.g. hyperliquid api-wallet). Defaults under
|
|
37
|
+
* `~/.jinn-client/engine/impl-state` when unset — wired from `config.engine` in main.
|
|
38
|
+
*/
|
|
39
|
+
implStateDirRoot?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Build the canonical ordered list of first-party restorer / evaluator impls.
|
|
43
|
+
* Registration order is stable: it matches historical `main.ts` first-match
|
|
44
|
+
* behavior for `RestorerImplRegistry`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildRestorerImpls(env: RestorerEnv): RestorerImpl[];
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single construction site for all first-party {@link RestorerImpl} instances.
|
|
3
|
+
* Used by the daemon entrypoint and `jinn intents` CLI (stub mode).
|
|
4
|
+
*/
|
|
5
|
+
import { LegacyClaudeImpl } from './legacy-claude/index.js';
|
|
6
|
+
import { ClaudeMcpHyperliquidImpl } from './claude-mcp-hyperliquid/index.js';
|
|
7
|
+
import { PortfolioV0Evaluator } from './portfolio-v0-evaluator/index.js';
|
|
8
|
+
import { PredictionV0BaselineImpl } from './prediction-v0-baseline/index.js';
|
|
9
|
+
import { PredictionV0Evaluator } from './prediction-v0-evaluator/index.js';
|
|
10
|
+
import { ClaudeMcpPredictionImpl } from './claude-mcp-prediction/index.js';
|
|
11
|
+
import { PredictionApyV0BaselineImpl } from './prediction-apy-v0-baseline/index.js';
|
|
12
|
+
import { ClaudeMcpPredictionApyImpl } from './claude-mcp-prediction-apy/index.js';
|
|
13
|
+
import { PredictionApyV0Evaluator } from './prediction-apy-v0-evaluator/index.js';
|
|
14
|
+
/**
|
|
15
|
+
* Build the canonical ordered list of first-party restorer / evaluator impls.
|
|
16
|
+
* Registration order is stable: it matches historical `main.ts` first-match
|
|
17
|
+
* behavior for `RestorerImplRegistry`.
|
|
18
|
+
*/
|
|
19
|
+
export function buildRestorerImpls(env) {
|
|
20
|
+
const isStub = Boolean(env.stub);
|
|
21
|
+
if (!isStub) {
|
|
22
|
+
if (!env.pk)
|
|
23
|
+
throw new Error('buildRestorerImpls: pk is required when stub is not set');
|
|
24
|
+
if (!env.safe)
|
|
25
|
+
throw new Error('buildRestorerImpls: safe is required when stub is not set');
|
|
26
|
+
}
|
|
27
|
+
const out = [];
|
|
28
|
+
if (env.runner) {
|
|
29
|
+
out.push(new LegacyClaudeImpl({
|
|
30
|
+
runner: env.runner,
|
|
31
|
+
workingDirectory: env.legacyClaudeWorkingDirectory ?? '/tmp',
|
|
32
|
+
timeoutMs: 300_000,
|
|
33
|
+
storePath: env.storePath,
|
|
34
|
+
daemonApiUrl: env.daemonApiUrl,
|
|
35
|
+
stub: isStub,
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
out.push(new ClaudeMcpHyperliquidImpl({
|
|
39
|
+
claudePath: env.claudePath,
|
|
40
|
+
claudeModel: env.claudeModel,
|
|
41
|
+
implStateDir: env.implStateDirRoot
|
|
42
|
+
? `${env.implStateDirRoot}/claude-mcp-hyperliquid`
|
|
43
|
+
: undefined,
|
|
44
|
+
stub: isStub,
|
|
45
|
+
}));
|
|
46
|
+
out.push(isStub
|
|
47
|
+
? new PortfolioV0Evaluator({ stub: true })
|
|
48
|
+
: new PortfolioV0Evaluator());
|
|
49
|
+
out.push(new PredictionV0BaselineImpl({
|
|
50
|
+
rpcUrl: env.rpcUrl,
|
|
51
|
+
stub: isStub,
|
|
52
|
+
}));
|
|
53
|
+
out.push(new ClaudeMcpPredictionImpl({
|
|
54
|
+
claudePath: env.claudePath,
|
|
55
|
+
claudeModel: env.claudeModel,
|
|
56
|
+
rpcUrl: env.rpcUrl,
|
|
57
|
+
stub: isStub,
|
|
58
|
+
}));
|
|
59
|
+
out.push(isStub
|
|
60
|
+
? new PredictionV0Evaluator({ stub: true, rpcUrl: env.rpcUrl })
|
|
61
|
+
: new PredictionV0Evaluator({
|
|
62
|
+
evaluatorPk: env.pk,
|
|
63
|
+
evaluatorSafeAddress: env.safe,
|
|
64
|
+
rpcUrl: env.rpcUrl,
|
|
65
|
+
}));
|
|
66
|
+
out.push(new PredictionApyV0BaselineImpl({
|
|
67
|
+
rpcUrl: env.rpcUrl,
|
|
68
|
+
archiveRpcUrl: env.archiveRpcUrl,
|
|
69
|
+
stub: isStub,
|
|
70
|
+
}));
|
|
71
|
+
out.push(new ClaudeMcpPredictionApyImpl({
|
|
72
|
+
claudePath: env.claudePath,
|
|
73
|
+
claudeModel: env.claudeModel,
|
|
74
|
+
rpcUrl: env.rpcUrl,
|
|
75
|
+
archiveRpcUrl: env.archiveRpcUrl,
|
|
76
|
+
stub: isStub,
|
|
77
|
+
}));
|
|
78
|
+
out.push(isStub
|
|
79
|
+
? new PredictionApyV0Evaluator({ stub: true, rpcUrl: env.rpcUrl, archiveRpcUrl: env.archiveRpcUrl })
|
|
80
|
+
: new PredictionApyV0Evaluator({
|
|
81
|
+
evaluatorPk: env.pk,
|
|
82
|
+
evaluatorSafeAddress: env.safe,
|
|
83
|
+
rpcUrl: env.rpcUrl,
|
|
84
|
+
archiveRpcUrl: env.archiveRpcUrl,
|
|
85
|
+
}));
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/restorer/impls/index.ts"],"names":[],"mappings":"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"}
|