@jinn-network/client 0.1.1 → 0.1.2-canary.647548b7
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 +14 -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/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 +1 -0
- package/dist/adapters/mech/adapter.js +75 -41
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +2 -0
- package/dist/adapters/mech/contracts.js +57 -7
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/ipfs.d.ts +8 -0
- package/dist/adapters/mech/ipfs.js +12 -0
- package/dist/adapters/mech/ipfs.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +20 -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 +1 -0
- package/dist/api/gather-status.js +185 -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 +81 -0
- package/dist/api/portfolio-v0-build.js +141 -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 +37 -6
- package/dist/api/status-build.js +1 -0
- 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 +27 -0
- 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 +115 -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 +1 -0
- package/dist/cli/commands/bootstrap.js.map +1 -1
- package/dist/cli/commands/doctor.js +130 -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 +60 -4
- 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/status.js +11 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/submit-intent.js +108 -5
- 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 +64 -0
- package/dist/cli/intent-registry-access.js +187 -0
- package/dist/cli/intent-registry-access.js.map +1 -0
- package/dist/cli/introspection-context.js +1 -0
- 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 +110 -8
- package/dist/config.js +41 -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 -1
- package/dist/daemon/creator.js +51 -3
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +43 -0
- package/dist/daemon/daemon.js +110 -3
- 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/restorer.js +27 -0
- package/dist/daemon/restorer.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/earning/bootstrap.d.ts +2 -1
- package/dist/earning/bootstrap.js +72 -4
- 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/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 +65 -0
- package/dist/intents/prediction-v0-template.js +125 -0
- package/dist/intents/prediction-v0-template.js.map +1 -0
- package/dist/main.js +149 -1
- 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/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/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/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 +203 -0
- package/dist/restorer/engine/engine.js +753 -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 +101 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +710 -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 +43 -0
- package/dist/restorer/impls/claude-mcp-prediction/index.js +230 -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 +82 -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/legacy-claude/index.d.ts +45 -0
- package/dist/restorer/impls/legacy-claude/index.js +71 -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 +43 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js +431 -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 +32 -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 +39 -0
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.js +98 -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 +2 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.js +7 -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 +39 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js +186 -0
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.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 +29 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.js +94 -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 +7 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js +93 -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 +33 -0
- package/dist/restorer/impls/prediction-v0-evaluator/index.js +208 -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 +177 -0
- package/dist/restorer/types.js +7 -0
- package/dist/restorer/types.js.map +1 -0
- package/dist/store/store.d.ts +64 -1
- package/dist/store/store.js +226 -4
- package/dist/store/store.js.map +1 -1
- 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 +919 -0
- package/dist/types/prediction-apy.js +121 -0
- package/dist/types/prediction-apy.js.map +1 -0
- package/dist/types/prediction.d.ts +925 -0
- package/dist/types/prediction.js +140 -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 +81 -0
- package/dist/venues/aave-v3/client.js +97 -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 +12 -1
- package/skills/jinn-operator/SKILL.md +85 -0
package/dist/config.js
CHANGED
|
@@ -17,12 +17,8 @@ import { existsSync, readFileSync } from 'node:fs';
|
|
|
17
17
|
import { homedir } from 'node:os';
|
|
18
18
|
import { join } from 'node:path';
|
|
19
19
|
import { z } from 'zod';
|
|
20
|
+
import { DesiredStateSchema, parseDesiredState } from './types/desired-state.js';
|
|
20
21
|
// ── Schema ──────────────────────────────────────────────────────────────────
|
|
21
|
-
const DesiredStateSchema = z.object({
|
|
22
|
-
id: z.string(),
|
|
23
|
-
description: z.string().min(1),
|
|
24
|
-
context: z.record(z.unknown()).optional(),
|
|
25
|
-
});
|
|
26
22
|
export const JinnConfigSchema = z.object({
|
|
27
23
|
/**
|
|
28
24
|
* Network to connect to.
|
|
@@ -38,6 +34,7 @@ export const JinnConfigSchema = z.object({
|
|
|
38
34
|
* https://sepolia.base.org for 'testnet'. Set explicitly to override.
|
|
39
35
|
*/
|
|
40
36
|
rpcUrl: z.string().optional(),
|
|
37
|
+
archiveRpcUrl: z.string().optional(),
|
|
41
38
|
/** Earning state directory */
|
|
42
39
|
earningDir: z.string().default(join(homedir(), '.jinn-client', 'earning')),
|
|
43
40
|
/** SQLite database path */
|
|
@@ -63,6 +60,15 @@ export const JinnConfigSchema = z.object({
|
|
|
63
60
|
claudePath: z.string().default('claude'),
|
|
64
61
|
/** Model for restoration/evaluation agent */
|
|
65
62
|
claudeModel: z.string().default('claude-haiku-4-5-20251001'),
|
|
63
|
+
/**
|
|
64
|
+
* How the operator runs the daemon. Set once at `jinn auth`, read by every
|
|
65
|
+
* command that probes the Claude CLI or spawns a subprocess. Leaving it
|
|
66
|
+
* unset falls back to filesystem-based detection (docker-compose.yml near
|
|
67
|
+
* cwd, /.dockerenv, etc.) which is error-prone inside a checkout of the
|
|
68
|
+
* repo itself.
|
|
69
|
+
* Env override: JINN_RUNTIME_MODE.
|
|
70
|
+
*/
|
|
71
|
+
runtimeMode: z.enum(['bare', 'docker-compose', 'container']).optional(),
|
|
66
72
|
/** Comma-separated or array of peer URLs */
|
|
67
73
|
peers: z.union([
|
|
68
74
|
z.string().transform(s => s.split(',').filter(Boolean)),
|
|
@@ -72,13 +78,8 @@ export const JinnConfigSchema = z.object({
|
|
|
72
78
|
subgraphUrl: z.string().optional(),
|
|
73
79
|
/** This node's public HTTP endpoint (for 8004 registration) */
|
|
74
80
|
nodeEndpoint: z.string().optional(),
|
|
75
|
-
/** Desired states to create and restore */
|
|
76
|
-
desiredStates: z.array(DesiredStateSchema).default([
|
|
77
|
-
{
|
|
78
|
-
id: 'health-check',
|
|
79
|
-
description: 'The service is running and participating in the Jinn protocol loop.',
|
|
80
|
-
},
|
|
81
|
-
]),
|
|
81
|
+
/** Desired states to create and restore. Empty by default; testnet auto-intents fill the loop. */
|
|
82
|
+
desiredStates: z.array(DesiredStateSchema).default([]),
|
|
82
83
|
/** IPFS upload endpoint */
|
|
83
84
|
ipfsRegistryUrl: z.string().default('https://registry.autonolas.tech'),
|
|
84
85
|
/** IPFS read endpoint */
|
|
@@ -91,6 +92,8 @@ export const JinnConfigSchema = z.object({
|
|
|
91
92
|
testnetMechDeploymentPath: z.string().optional(),
|
|
92
93
|
/** Optional Base Sepolia stOLAS deployment artifact path */
|
|
93
94
|
testnetStolasDeploymentPath: z.string().optional(),
|
|
95
|
+
/** Optional Base Sepolia ClaimRegistry deployment artifact path */
|
|
96
|
+
testnetClaimRegistryDeploymentPath: z.string().optional(),
|
|
94
97
|
/** Staking mode: 'standard' uses stOLAS (no OLAS needed), 'self-bond' uses operator-provided OLAS. */
|
|
95
98
|
stakingMode: z.enum(['standard', 'self-bond']).default('standard'),
|
|
96
99
|
/** Number of services to bootstrap and run. */
|
|
@@ -108,6 +111,22 @@ export const JinnConfigSchema = z.object({
|
|
|
108
111
|
.string()
|
|
109
112
|
.regex(/^\d+$/, 'must be a non-negative integer string')
|
|
110
113
|
.optional(),
|
|
114
|
+
/**
|
|
115
|
+
* Operator-controlled impl dispatch for the restorer engine.
|
|
116
|
+
*
|
|
117
|
+
* Wired by daemon (jinn-mono-bv5); engine consumes via RestorerImplRegistry config.
|
|
118
|
+
*
|
|
119
|
+
* byKind: explicit spec.kind → impl name mapping (highest priority)
|
|
120
|
+
* default: fallback impl name when no kind-specific match is found
|
|
121
|
+
* disabled: impl names to exclude from dispatch entirely
|
|
122
|
+
*/
|
|
123
|
+
restorers: z
|
|
124
|
+
.object({
|
|
125
|
+
byKind: z.record(z.string()).optional(),
|
|
126
|
+
default: z.string().optional(),
|
|
127
|
+
disabled: z.array(z.string()).optional(),
|
|
128
|
+
})
|
|
129
|
+
.optional(),
|
|
111
130
|
});
|
|
112
131
|
// ── Defaults ────────────────────────────────────────────────────────────────
|
|
113
132
|
const DEFAULT_DIR = join(homedir(), '.jinn-client');
|
|
@@ -173,6 +192,8 @@ export function loadConfig(configPath) {
|
|
|
173
192
|
merged.claudePath = env['JINN_CLAUDE_PATH'];
|
|
174
193
|
if (env['JINN_CLAUDE_MODEL'])
|
|
175
194
|
merged.claudeModel = env['JINN_CLAUDE_MODEL'];
|
|
195
|
+
if (env['JINN_RUNTIME_MODE'])
|
|
196
|
+
merged.runtimeMode = env['JINN_RUNTIME_MODE'];
|
|
176
197
|
if (env['JINN_PEERS'])
|
|
177
198
|
merged.peers = env['JINN_PEERS'];
|
|
178
199
|
if (env['JINN_SUBGRAPH_URL'])
|
|
@@ -189,6 +210,9 @@ export function loadConfig(configPath) {
|
|
|
189
210
|
merged.testnetL2TokenDeploymentPath = env['JINN_TESTNET_TOKEN_DEPLOYMENT'];
|
|
190
211
|
if (env['JINN_TESTNET_MECH_DEPLOYMENT'])
|
|
191
212
|
merged.testnetMechDeploymentPath = env['JINN_TESTNET_MECH_DEPLOYMENT'];
|
|
213
|
+
if (env['JINN_TESTNET_CLAIM_REGISTRY_DEPLOYMENT']) {
|
|
214
|
+
merged.testnetClaimRegistryDeploymentPath = env['JINN_TESTNET_CLAIM_REGISTRY_DEPLOYMENT'];
|
|
215
|
+
}
|
|
192
216
|
if (env['JINN_STAKING_MODE'])
|
|
193
217
|
merged.stakingMode = env['JINN_STAKING_MODE'];
|
|
194
218
|
if (env['JINN_TARGET_SERVICES'])
|
|
@@ -214,6 +238,9 @@ export function loadConfig(configPath) {
|
|
|
214
238
|
else if (env['BASE_RPC_URL']) {
|
|
215
239
|
merged.rpcUrl = env['BASE_RPC_URL'];
|
|
216
240
|
}
|
|
241
|
+
if (env['JINN_ARCHIVE_RPC_URL']) {
|
|
242
|
+
merged.archiveRpcUrl = env['JINN_ARCHIVE_RPC_URL'];
|
|
243
|
+
}
|
|
217
244
|
// desiredStates from env points to a JSON file
|
|
218
245
|
if (env['JINN_DESIRED_STATES']) {
|
|
219
246
|
const statesPath = env['JINN_DESIRED_STATES'];
|
|
@@ -248,6 +275,8 @@ export function loadConfig(configPath) {
|
|
|
248
275
|
return {
|
|
249
276
|
...parsed,
|
|
250
277
|
rpcUrl: parsed.rpcUrl ?? defaultRpcUrl,
|
|
278
|
+
// parseDesiredState assigns a UUID to any entry missing an id
|
|
279
|
+
desiredStates: parsed.desiredStates.map(parseDesiredState),
|
|
251
280
|
};
|
|
252
281
|
}
|
|
253
282
|
/**
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { getAddress, formatEther } from 'viem';
|
|
12
12
|
import { viemSendTransactionWithRetry, waitForTransactionReceiptWithRetry } from '../tx-retry.js';
|
|
13
|
+
import { emitEvent } from '../observability/emit-event.js';
|
|
14
|
+
import { displayFleetServiceIndex } from '../earning/fleet-display-index.js';
|
|
13
15
|
export class BalanceTopupLoop {
|
|
14
16
|
config;
|
|
15
17
|
stopped = false;
|
|
@@ -29,15 +31,22 @@ export class BalanceTopupLoop {
|
|
|
29
31
|
continue;
|
|
30
32
|
if (!svc.agent_address || !svc.safe_address)
|
|
31
33
|
continue;
|
|
34
|
+
const displayIndex = displayFleetServiceIndex(svc);
|
|
32
35
|
try {
|
|
33
|
-
await this.topUpService(svc.index, svc.agent_address, svc.safe_address, masterAccount);
|
|
36
|
+
await this.topUpService(displayIndex, svc.index, svc.agent_address, svc.safe_address, masterAccount);
|
|
34
37
|
}
|
|
35
38
|
catch (err) {
|
|
36
39
|
console.error(`[balance-topup] Service ${svc.index}: unexpected error (non-fatal): ${err instanceof Error ? err.message : err}`);
|
|
40
|
+
this.config.jinnStore && emitEvent(this.config.jinnStore, {
|
|
41
|
+
kind: 'tick_error',
|
|
42
|
+
serviceIndex: displayIndex,
|
|
43
|
+
outcome: 'failed',
|
|
44
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
45
|
+
}, 'balance-topup');
|
|
37
46
|
}
|
|
38
47
|
}
|
|
39
48
|
}
|
|
40
|
-
async topUpService(
|
|
49
|
+
async topUpService(displayIndex, logIndex, agentAddressRaw, safeAddressRaw, masterAccount) {
|
|
41
50
|
const agentAddr = getAddress(agentAddressRaw);
|
|
42
51
|
const safeAddr = getAddress(safeAddressRaw);
|
|
43
52
|
// Check agent EOA balance
|
|
@@ -46,13 +55,20 @@ export class BalanceTopupLoop {
|
|
|
46
55
|
const needed = this.config.eoaTopupTarget - agentBal;
|
|
47
56
|
const masterBal = await this.config.publicClient.getBalance({ address: masterAccount.address });
|
|
48
57
|
if (masterBal > needed) {
|
|
49
|
-
console.error(`[balance-topup] Service ${
|
|
58
|
+
console.error(`[balance-topup] Service ${logIndex}: agent ${agentAddr} balance ${formatEther(agentBal)} ETH below trigger, topping up with ${formatEther(needed)} ETH from master`);
|
|
50
59
|
const hash = await viemSendTransactionWithRetry(this.config.masterWallet, this.config.publicClient, {
|
|
51
60
|
account: masterAccount,
|
|
52
61
|
to: agentAddr,
|
|
53
62
|
value: needed,
|
|
54
63
|
});
|
|
55
64
|
await waitForTransactionReceiptWithRetry(this.config.publicClient, hash);
|
|
65
|
+
this.config.jinnStore && emitEvent(this.config.jinnStore, {
|
|
66
|
+
kind: 'balance_topup',
|
|
67
|
+
serviceIndex: displayIndex,
|
|
68
|
+
txHash: hash,
|
|
69
|
+
outcome: 'ok',
|
|
70
|
+
detail: `Topped up agent to ${formatEther(this.config.eoaTopupTarget)} ETH`,
|
|
71
|
+
}, 'balance-topup');
|
|
56
72
|
}
|
|
57
73
|
else {
|
|
58
74
|
console.error(`[balance-topup] Warning: master balance (${formatEther(masterBal)} ETH) too low to top up agent ${agentAddr} (needs ${formatEther(needed)} ETH)`);
|
|
@@ -64,13 +80,20 @@ export class BalanceTopupLoop {
|
|
|
64
80
|
const safeNeeded = this.config.safeTopupTarget - safeBal;
|
|
65
81
|
const masterBal = await this.config.publicClient.getBalance({ address: masterAccount.address });
|
|
66
82
|
if (masterBal > safeNeeded) {
|
|
67
|
-
console.error(`[balance-topup] Service ${
|
|
83
|
+
console.error(`[balance-topup] Service ${logIndex}: Safe ${safeAddr} balance ${formatEther(safeBal)} ETH below trigger, topping up with ${formatEther(safeNeeded)} ETH from master`);
|
|
68
84
|
const hash = await viemSendTransactionWithRetry(this.config.masterWallet, this.config.publicClient, {
|
|
69
85
|
account: masterAccount,
|
|
70
86
|
to: safeAddr,
|
|
71
87
|
value: safeNeeded,
|
|
72
88
|
});
|
|
73
89
|
await waitForTransactionReceiptWithRetry(this.config.publicClient, hash);
|
|
90
|
+
this.config.jinnStore && emitEvent(this.config.jinnStore, {
|
|
91
|
+
kind: 'balance_topup',
|
|
92
|
+
serviceIndex: displayIndex,
|
|
93
|
+
txHash: hash,
|
|
94
|
+
outcome: 'ok',
|
|
95
|
+
detail: `Topped up safe to ${formatEther(this.config.safeTopupTarget)} ETH`,
|
|
96
|
+
}, 'balance-topup');
|
|
74
97
|
}
|
|
75
98
|
else {
|
|
76
99
|
console.error(`[balance-topup] Warning: master balance (${formatEther(masterBal)} ETH) too low to top up Safe ${safeAddr} (needs ${formatEther(safeNeeded)} ETH)`);
|
|
@@ -87,6 +110,11 @@ export class BalanceTopupLoop {
|
|
|
87
110
|
}
|
|
88
111
|
catch (err) {
|
|
89
112
|
console.error('[balance-topup] Tick failed (non-fatal):', err instanceof Error ? err.message : err);
|
|
113
|
+
this.config.jinnStore && emitEvent(this.config.jinnStore, {
|
|
114
|
+
kind: 'tick_error',
|
|
115
|
+
outcome: 'failed',
|
|
116
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
117
|
+
}, 'balance-topup');
|
|
90
118
|
}
|
|
91
119
|
this.config.jinnStore?.setConfigValue('last_balance_topup_tick_at', new Date().toISOString());
|
|
92
120
|
await new Promise(r => setTimeout(r, this.config.intervalMs));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balance-topup-loop.js","sourceRoot":"","sources":["../../src/daemon/balance-topup-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAG/C,OAAO,EAAE,4BAA4B,EAAE,kCAAkC,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"balance-topup-loop.js","sourceRoot":"","sources":["../../src/daemon/balance-topup-loop.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/creator.d.ts
CHANGED
|
@@ -7,17 +7,23 @@ export interface ActiveAttempt {
|
|
|
7
7
|
restorationRequestId: string;
|
|
8
8
|
status: 'pending' | 'resolved';
|
|
9
9
|
}
|
|
10
|
+
/** Returns a freshly-built DesiredState for this tick, or null to skip. */
|
|
11
|
+
export type IntentGenerator = () => Promise<DesiredState | null>;
|
|
10
12
|
export declare class CreatorLoop {
|
|
11
13
|
private readonly adapter;
|
|
12
14
|
private readonly desiredStates;
|
|
13
15
|
private readonly store;
|
|
16
|
+
private readonly safeAddress?;
|
|
14
17
|
private stopped;
|
|
15
18
|
private posted;
|
|
16
19
|
private attempts;
|
|
17
20
|
private stopResolve;
|
|
18
21
|
private stopPromise;
|
|
22
|
+
private readonly generators;
|
|
19
23
|
private static readonly REPOST_INTERVAL_MS;
|
|
20
|
-
|
|
24
|
+
/** SQLite config key for durable idempotency across daemon restarts. */
|
|
25
|
+
private static cacheKey;
|
|
26
|
+
constructor(adapter: ExecutionAdapter, desiredStates: DesiredState[], store: Store, generators?: IntentGenerator[], safeAddress?: string | undefined);
|
|
21
27
|
tick(): Promise<RequestId | null>;
|
|
22
28
|
run(): Promise<void>;
|
|
23
29
|
stop(): void;
|
package/dist/daemon/creator.js
CHANGED
|
@@ -1,32 +1,67 @@
|
|
|
1
1
|
import { TransientError } from '../types/index.js';
|
|
2
2
|
import { isRecoverableTransactionError } from '../tx-retry.js';
|
|
3
|
+
import { emitEvent } from '../observability/emit-event.js';
|
|
3
4
|
export class CreatorLoop {
|
|
4
5
|
adapter;
|
|
5
6
|
desiredStates;
|
|
6
7
|
store;
|
|
8
|
+
safeAddress;
|
|
7
9
|
stopped = false;
|
|
8
|
-
posted = new Map(); // stateId → timestamp of last post
|
|
10
|
+
posted = new Map(); // stateId → timestamp of last post (in-memory fast-path)
|
|
9
11
|
attempts = new Map();
|
|
10
12
|
stopResolve = null;
|
|
11
13
|
stopPromise;
|
|
14
|
+
generators;
|
|
12
15
|
// Minimum interval between posting the same desired state (ms).
|
|
13
16
|
// ~20 activities/day needed; each cycle = 4 activities; 5 cycles/day = 1 every ~4.8h.
|
|
14
17
|
// Use 4h to provide safety margin.
|
|
15
18
|
static REPOST_INTERVAL_MS = 4 * 60 * 60 * 1000;
|
|
16
|
-
|
|
19
|
+
/** SQLite config key for durable idempotency across daemon restarts. */
|
|
20
|
+
static cacheKey(state, safeAddress) {
|
|
21
|
+
const prefix = safeAddress ? `created_intent:${safeAddress}` : 'created_intent';
|
|
22
|
+
return `${prefix}:${state.id}`;
|
|
23
|
+
}
|
|
24
|
+
constructor(adapter, desiredStates, store, generators = [], safeAddress) {
|
|
17
25
|
this.adapter = adapter;
|
|
18
26
|
this.desiredStates = desiredStates;
|
|
19
27
|
this.store = store;
|
|
28
|
+
this.safeAddress = safeAddress;
|
|
29
|
+
this.generators = generators;
|
|
20
30
|
this.stopPromise = new Promise(resolve => {
|
|
21
31
|
this.stopResolve = resolve;
|
|
22
32
|
});
|
|
23
33
|
}
|
|
24
34
|
async tick() {
|
|
25
35
|
const now = Date.now();
|
|
26
|
-
|
|
36
|
+
// Compose candidates: static configured states + freshly generated ones.
|
|
37
|
+
// Generators returning null are filtered (e.g. Chainlink read failure).
|
|
38
|
+
const generated = [];
|
|
39
|
+
for (const gen of this.generators) {
|
|
40
|
+
try {
|
|
41
|
+
const result = await gen();
|
|
42
|
+
if (result)
|
|
43
|
+
generated.push(result);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.error('[creator] generator error (skipping this tick):', err);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const candidates = [...this.desiredStates, ...generated];
|
|
50
|
+
for (const state of candidates) {
|
|
51
|
+
// In-memory fast-path: posted within the 4h window → skip.
|
|
27
52
|
const lastPosted = this.posted.get(state.id);
|
|
28
53
|
if (lastPosted && (now - lastPosted) < CreatorLoop.REPOST_INTERVAL_MS)
|
|
29
54
|
continue;
|
|
55
|
+
// Durable idempotency: SQLite cache survives daemon restarts. If we
|
|
56
|
+
// already posted this state.id before (and it's still within the repost
|
|
57
|
+
// window OR the id is stable-per-hour like auto-generators), skip.
|
|
58
|
+
const cacheKey = CreatorLoop.cacheKey(state, this.safeAddress);
|
|
59
|
+
const cachedRequestId = this.store.getConfigValue(cacheKey);
|
|
60
|
+
if (cachedRequestId) {
|
|
61
|
+
// Refresh the in-memory tracker so subsequent ticks hit the fast-path.
|
|
62
|
+
this.posted.set(state.id, now);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
30
65
|
try {
|
|
31
66
|
const prev = this.attempts.get(state.id);
|
|
32
67
|
const attemptNumber = prev ? prev.attemptNumber + 1 : 1;
|
|
@@ -46,6 +81,14 @@ export class CreatorLoop {
|
|
|
46
81
|
status: 'pending',
|
|
47
82
|
});
|
|
48
83
|
this.store.recordOwnActivity(requestId, 'created');
|
|
84
|
+
emitEvent(this.store, {
|
|
85
|
+
kind: 'intent_posted',
|
|
86
|
+
requestId,
|
|
87
|
+
specKind: state.spec?.kind,
|
|
88
|
+
outcome: 'ok',
|
|
89
|
+
detail: `Posted intent for desired state ${state.id}`,
|
|
90
|
+
}, 'creator');
|
|
91
|
+
this.store.setConfigValue(cacheKey, requestId);
|
|
49
92
|
return requestId;
|
|
50
93
|
}
|
|
51
94
|
catch (err) {
|
|
@@ -64,6 +107,11 @@ export class CreatorLoop {
|
|
|
64
107
|
}
|
|
65
108
|
catch (err) {
|
|
66
109
|
console.error('[creator] Error:', err);
|
|
110
|
+
emitEvent(this.store, {
|
|
111
|
+
kind: 'tick_error',
|
|
112
|
+
outcome: 'failed',
|
|
113
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
114
|
+
}, 'creator');
|
|
67
115
|
delayMs = isRecoverableTransactionError(err) ? 12_000 : 8000;
|
|
68
116
|
}
|
|
69
117
|
await Promise.race([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"creator.js","sourceRoot":"","sources":["../../src/daemon/creator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"creator.js","sourceRoot":"","sources":["../../src/daemon/creator.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/daemon.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { ExecutionAdapter } from '../adapters/adapter.js';
|
|
2
2
|
import type { Runner } from '../runner/runner.js';
|
|
3
3
|
import type { DesiredState } from '../types/index.js';
|
|
4
|
+
import { type IntentGenerator } from './creator.js';
|
|
4
5
|
import type { StatusGatherConfig } from '../api/gather-status.js';
|
|
5
6
|
import type { EthHttpSigner } from '../auth/erc8128.js';
|
|
6
7
|
import { type RegistryConfig } from '../discovery/registry.js';
|
|
7
8
|
import type { X402Config } from '../x402/handler.js';
|
|
8
9
|
import { type RewardClaimLoopConfig } from './reward-claim-loop.js';
|
|
10
|
+
import { type RestorationEngineOptions } from '../restorer/engine/engine.js';
|
|
9
11
|
import { type BalanceTopupLoopConfig } from './balance-topup-loop.js';
|
|
10
12
|
export interface DaemonConfig {
|
|
11
13
|
adapter: ExecutionAdapter;
|
|
@@ -13,6 +15,8 @@ export interface DaemonConfig {
|
|
|
13
15
|
desiredStates: DesiredState[];
|
|
14
16
|
dbPath: string;
|
|
15
17
|
shutdownTimeoutMs?: number;
|
|
18
|
+
/** Engine tick interval (ms) for re-driving in-flight intents. Defaults to 5000. */
|
|
19
|
+
pollIntervalMs?: number;
|
|
16
20
|
apiPort?: number;
|
|
17
21
|
peers?: string[];
|
|
18
22
|
signer?: EthHttpSigner;
|
|
@@ -33,12 +37,37 @@ export interface DaemonConfig {
|
|
|
33
37
|
balanceTopup?: BalanceTopupLoopConfig;
|
|
34
38
|
/** Passed to HTTP API for GET /v1/status (fleet + RPC hints). */
|
|
35
39
|
status?: StatusGatherConfig;
|
|
40
|
+
/**
|
|
41
|
+
* Extra intent generators called each CreatorLoop tick. Each returns a
|
|
42
|
+
* freshly-built DesiredState (or null to skip this tick). Used e.g. for
|
|
43
|
+
* auto-posting price-aware prediction.v0 intents on testnet.
|
|
44
|
+
*/
|
|
45
|
+
intentGenerators?: IntentGenerator[];
|
|
46
|
+
/**
|
|
47
|
+
* Creator Safe address — used to scope CreatorLoop's SQLite idempotency
|
|
48
|
+
* cache keys per-Safe. Without this, two co-located daemons on the same
|
|
49
|
+
* DB would collide. Optional for backwards compatibility.
|
|
50
|
+
*/
|
|
51
|
+
creatorSafeAddress?: string;
|
|
52
|
+
/**
|
|
53
|
+
* When provided, the daemon uses RestorationEngine (new engine path) instead
|
|
54
|
+
* of the legacy RestorerLoop for intent dispatch.
|
|
55
|
+
*
|
|
56
|
+
* Required for portfolio.v0 spec kind (both restoration and evaluation).
|
|
57
|
+
* Evaluation intents (type === 'evaluation') are dispatched via supports() to
|
|
58
|
+
* portfolio-v0-evaluator; legacy health-check intents (no spec) fall back to
|
|
59
|
+
* legacy-claude via the default impl in the registry.
|
|
60
|
+
*/
|
|
61
|
+
restorationEngine?: Omit<RestorationEngineOptions, 'store'>;
|
|
36
62
|
}
|
|
37
63
|
export declare class Daemon {
|
|
38
64
|
private readonly config;
|
|
39
65
|
private store;
|
|
40
66
|
private creatorLoop;
|
|
67
|
+
/** @deprecated Kept for backwards compatibility (test suite). Not started when restorationEngine is configured. */
|
|
41
68
|
private restorerLoop;
|
|
69
|
+
private restorationEngine?;
|
|
70
|
+
private engineStopped;
|
|
42
71
|
private deliveryWatcherLoop;
|
|
43
72
|
private adapter;
|
|
44
73
|
private loopPromises;
|
|
@@ -53,6 +82,20 @@ export declare class Daemon {
|
|
|
53
82
|
start(): Promise<void>;
|
|
54
83
|
stop(): Promise<void>;
|
|
55
84
|
getShutdownState(): string | null;
|
|
85
|
+
/**
|
|
86
|
+
* Bridge loop: consumes adapter.watchForRequests() and routes each request to
|
|
87
|
+
* the RestorationEngine via observe() + process().
|
|
88
|
+
*
|
|
89
|
+
* For legacy intents (no spec), the engine dispatches to the legacy-claude impl.
|
|
90
|
+
* For portfolio.v0 intents, the engine dispatches to claude-mcp-hyperliquid.
|
|
91
|
+
* For portfolio.v0.eval intents, the engine dispatches to portfolio-v0-evaluator.
|
|
92
|
+
*
|
|
93
|
+
* On-chain provenance (intentCid, onchainCreationTx, onchainCreationBlock) is
|
|
94
|
+
* populated from the RestorationRequest when available (MechAdapter sets these
|
|
95
|
+
* from the MarketplaceRequest event log). Legacy paths that don't populate them
|
|
96
|
+
* fall back to safe defaults with a warning.
|
|
97
|
+
*/
|
|
98
|
+
private _runEngineWatcherLoop;
|
|
56
99
|
/**
|
|
57
100
|
* Register an artifact on the 8004 registry (fire-and-forget).
|
|
58
101
|
* Called after local artifact publish if registry is configured.
|