@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
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { brierScore } from './canonical-metrics.js';
|
|
2
|
+
export const SCORE_BASIS = 'brier.v1';
|
|
3
|
+
export const SCORE_VERSION = '1';
|
|
4
|
+
export function computeScore(verdict, probability, groundTruth) {
|
|
5
|
+
if (verdict !== 'PASS') {
|
|
6
|
+
return { score: '0', scoreBasis: SCORE_BASIS, scoreVersion: SCORE_VERSION };
|
|
7
|
+
}
|
|
8
|
+
const outcome = groundTruth === 'YES' ? 1 : 0;
|
|
9
|
+
return {
|
|
10
|
+
score: brierScore(probability, outcome),
|
|
11
|
+
scoreBasis: SCORE_BASIS,
|
|
12
|
+
scoreVersion: SCORE_VERSION,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.js","sourceRoot":"","sources":["../../../../src/restorer/impls/prediction-v0-evaluator/score.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,MAAM,WAAW,GAAG,UAAmB,CAAC;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,GAAY,CAAC;AAI1C,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,WAAmB,EACnB,WAAyB;IAEzB,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9E,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC;QACvC,UAAU,EAAE,WAAW;QACvB,YAAY,EAAE,aAAa;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/restorer/impls/prediction-v0-evaluator/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Restorer-impl interface — §6.7 of the portfolio.v0 design spec.
|
|
3
|
+
*
|
|
4
|
+
* Pure type definitions; no runtime side effects.
|
|
5
|
+
*/
|
|
6
|
+
import type { DesiredState } from '../types/desired-state.js';
|
|
7
|
+
import type { OutputArtifact, RationaleEntry, Snapshot } from '../types/portfolio.js';
|
|
8
|
+
export interface RestorationContext {
|
|
9
|
+
intent: DesiredState;
|
|
10
|
+
/** Persistent directory for impl-specific state. */
|
|
11
|
+
implStateDir: string;
|
|
12
|
+
/** Ephemeral working directory (cleared between attempts). */
|
|
13
|
+
workingDir: string;
|
|
14
|
+
log: (event: {
|
|
15
|
+
level: 'info' | 'warn' | 'error';
|
|
16
|
+
msg: string;
|
|
17
|
+
data?: unknown;
|
|
18
|
+
}) => void;
|
|
19
|
+
/** Fires at window.endTs. */
|
|
20
|
+
abort: AbortSignal;
|
|
21
|
+
msUntilEndTs: () => number;
|
|
22
|
+
}
|
|
23
|
+
export interface RestorationOutput {
|
|
24
|
+
venueRef: {
|
|
25
|
+
name: string;
|
|
26
|
+
};
|
|
27
|
+
/** Optional — evaluator impls that do not operate on a venue leave these undefined. */
|
|
28
|
+
preSnapshot?: Snapshot;
|
|
29
|
+
postSnapshot?: Snapshot;
|
|
30
|
+
fills?: unknown[];
|
|
31
|
+
/** Shape is per spec.kind convention. */
|
|
32
|
+
gating: Record<string, unknown>;
|
|
33
|
+
informational?: Record<string, unknown>;
|
|
34
|
+
artifacts?: OutputArtifact[];
|
|
35
|
+
rationale?: RationaleEntry[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Context-free readiness probe. "Are this impl's external dependencies
|
|
39
|
+
* satisfied right now, regardless of any specific intent?" Used by
|
|
40
|
+
* `jinn intents list|status` and by the claim-policy gate that refuses
|
|
41
|
+
* to spend gas claiming an intent whose impl cannot execute.
|
|
42
|
+
*/
|
|
43
|
+
export interface ReadyStatus {
|
|
44
|
+
ready: boolean;
|
|
45
|
+
reason?: string;
|
|
46
|
+
/** Optional hint for the operator/agent on how to become ready. */
|
|
47
|
+
nextStep?: {
|
|
48
|
+
description: string;
|
|
49
|
+
cli?: string;
|
|
50
|
+
url?: string;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Argument a kind-specific enable flow wants from the operator, surfaced
|
|
55
|
+
* via `enableMetadata()`. The generic `jinn intents enable <kind>` verb
|
|
56
|
+
* parses these from `--key=value` flags without caring what they mean.
|
|
57
|
+
*/
|
|
58
|
+
export interface EnableArgDef {
|
|
59
|
+
name: string;
|
|
60
|
+
description: string;
|
|
61
|
+
required: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Metadata that `jinn intents list` uses to teach the operator (or agent)
|
|
65
|
+
* what's needed to enable a kind. Returned without running the flow.
|
|
66
|
+
*/
|
|
67
|
+
export interface IntentEnableMetadata {
|
|
68
|
+
/** Human-readable summary of what opting in to this kind entails. */
|
|
69
|
+
description: string;
|
|
70
|
+
requiredArgs?: EnableArgDef[];
|
|
71
|
+
/** External URLs the operator/agent will need (e.g. exchange UI). */
|
|
72
|
+
externalResources?: Array<{
|
|
73
|
+
name: string;
|
|
74
|
+
url: string;
|
|
75
|
+
}>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Outcome of a single `jinn intents enable <kind>` invocation.
|
|
79
|
+
*
|
|
80
|
+
* The flow is idempotent: the agent reruns the same command until
|
|
81
|
+
* `status === 'ready'`. Each intermediate state carries enough info for
|
|
82
|
+
* the agent to know what to do next (show a URL, collect more args,
|
|
83
|
+
* surface an error).
|
|
84
|
+
*/
|
|
85
|
+
export type EnableResult = {
|
|
86
|
+
status: 'ready';
|
|
87
|
+
/** Anything the impl wants to surface (e.g. master address, wallet address). */
|
|
88
|
+
details?: Record<string, unknown>;
|
|
89
|
+
} | {
|
|
90
|
+
status: 'waiting_for_external_action';
|
|
91
|
+
/** What the operator has to do out-of-band (e.g. approve an api-wallet). */
|
|
92
|
+
action: {
|
|
93
|
+
description: string;
|
|
94
|
+
url?: string;
|
|
95
|
+
};
|
|
96
|
+
details?: Record<string, unknown>;
|
|
97
|
+
/** The exact CLI the agent should re-run once the action is done. */
|
|
98
|
+
nextInvocation: {
|
|
99
|
+
cli: string;
|
|
100
|
+
purpose: string;
|
|
101
|
+
};
|
|
102
|
+
} | {
|
|
103
|
+
status: 'missing_args';
|
|
104
|
+
required: EnableArgDef[];
|
|
105
|
+
example: {
|
|
106
|
+
cli: string;
|
|
107
|
+
};
|
|
108
|
+
} | {
|
|
109
|
+
status: 'error';
|
|
110
|
+
message: string;
|
|
111
|
+
details?: Record<string, unknown>;
|
|
112
|
+
};
|
|
113
|
+
export interface RestorerImpl {
|
|
114
|
+
name: string;
|
|
115
|
+
/** semver */
|
|
116
|
+
version: string;
|
|
117
|
+
/**
|
|
118
|
+
* Return true if this impl should handle the given (kind, type) pair.
|
|
119
|
+
*
|
|
120
|
+
* `type` reflects DesiredState.type:
|
|
121
|
+
* - 'restoration' (or undefined — legacy default): the impl runs a restoration attempt
|
|
122
|
+
* - 'evaluation': the impl runs as an evaluator producing a verdict
|
|
123
|
+
*
|
|
124
|
+
* A restorer impl for kind=X should return true for type !== 'evaluation'.
|
|
125
|
+
* An evaluator impl for kind=X should return true for type === 'evaluation'.
|
|
126
|
+
*/
|
|
127
|
+
supports(ctx: {
|
|
128
|
+
kind: string;
|
|
129
|
+
type?: 'restoration' | 'evaluation';
|
|
130
|
+
}): boolean;
|
|
131
|
+
canAttempt?(intent: DesiredState): Promise<{
|
|
132
|
+
ok: true;
|
|
133
|
+
} | {
|
|
134
|
+
ok: false;
|
|
135
|
+
reason: string;
|
|
136
|
+
}>;
|
|
137
|
+
run(ctx: RestorationContext): Promise<RestorationOutput>;
|
|
138
|
+
/**
|
|
139
|
+
* Context-free readiness probe. Zero-dep impls can omit this (treated
|
|
140
|
+
* as `{ ready: true }`). Impls with external deps (credentials, files,
|
|
141
|
+
* exchange approvals) report current readiness plus a `nextStep` hint.
|
|
142
|
+
*/
|
|
143
|
+
isReady?(): Promise<ReadyStatus>;
|
|
144
|
+
/**
|
|
145
|
+
* Describes what `onEnable` wants from the caller. Consumed by
|
|
146
|
+
* `jinn intents list` so the agent can tell the operator what a
|
|
147
|
+
* specific kind's enable flow needs without triggering it first.
|
|
148
|
+
*/
|
|
149
|
+
enableMetadata?(): IntentEnableMetadata;
|
|
150
|
+
/**
|
|
151
|
+
* Idempotent enable-state machine. Called by `jinn intents enable <kind>`.
|
|
152
|
+
*
|
|
153
|
+
* Contract:
|
|
154
|
+
* - Zero-dep impls return `{ status: 'ready' }` on every call.
|
|
155
|
+
* - Impls with external deps advance as far as they can without
|
|
156
|
+
* blocking, then return a `waiting_for_external_action` envelope
|
|
157
|
+
* the agent surfaces to the operator.
|
|
158
|
+
* - Subsequent invocations pick up where the previous left off.
|
|
159
|
+
* - Calling after already-enabled is a no-op that returns `ready`.
|
|
160
|
+
*
|
|
161
|
+
* `args` is the raw `--key=value` map parsed from the CLI. Impls
|
|
162
|
+
* validate and coerce as needed; missing required args should return
|
|
163
|
+
* `{ status: 'missing_args', required: [...], example: {...} }`.
|
|
164
|
+
*
|
|
165
|
+
* Impls that omit this method cannot be enabled by the generic CLI;
|
|
166
|
+
* they are either always-on (zero-dep) or require manual config.
|
|
167
|
+
*/
|
|
168
|
+
onEnable?(args: Record<string, string | undefined>): Promise<EnableResult>;
|
|
169
|
+
/**
|
|
170
|
+
* Optional inverse of `onEnable`. Invoked when the operator runs
|
|
171
|
+
* `jinn intents disable <kind>`. Should NOT destroy unrecoverable
|
|
172
|
+
* state (generated key material, on-chain registrations); reserve
|
|
173
|
+
* that for explicit `jinn intents purge` or similar (out of scope
|
|
174
|
+
* for this interface).
|
|
175
|
+
*/
|
|
176
|
+
onDisable?(): Promise<void>;
|
|
177
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/restorer/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/dist/store/store.d.ts
CHANGED
|
@@ -1,7 +1,51 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
export interface ActivityEventInput {
|
|
3
|
+
ts: string | null;
|
|
4
|
+
kind: string;
|
|
5
|
+
requestId?: string | null;
|
|
6
|
+
serviceIndex?: number | null;
|
|
7
|
+
txHash?: string | null;
|
|
8
|
+
specKind?: string | null;
|
|
9
|
+
outcome?: string | null;
|
|
10
|
+
detail?: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface ActivityEventRow {
|
|
13
|
+
id: number;
|
|
14
|
+
ts: string | null;
|
|
15
|
+
kind: string;
|
|
16
|
+
requestId: string | null;
|
|
17
|
+
serviceIndex: number | null;
|
|
18
|
+
txHash: string | null;
|
|
19
|
+
specKind: string | null;
|
|
20
|
+
outcome: string | null;
|
|
21
|
+
detail: string | null;
|
|
22
|
+
}
|
|
23
|
+
export interface RewardClaimInput {
|
|
24
|
+
ts: string;
|
|
25
|
+
serviceIndex: number;
|
|
26
|
+
serviceId?: number | null;
|
|
27
|
+
stakingProxy: string;
|
|
28
|
+
distributor: string;
|
|
29
|
+
txHash: string;
|
|
30
|
+
amountWei: string;
|
|
31
|
+
asset?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface BalanceCacheEntry {
|
|
34
|
+
role: string;
|
|
35
|
+
address: string;
|
|
36
|
+
nativeWei?: string | null;
|
|
37
|
+
bondWei?: string | null;
|
|
38
|
+
assetExtraJson?: string | null;
|
|
39
|
+
fetchedAt: string;
|
|
40
|
+
error?: string | null;
|
|
41
|
+
}
|
|
1
42
|
export declare class Store {
|
|
2
|
-
|
|
43
|
+
/** Exposed for engine persistence layer — treat as package-internal. */
|
|
44
|
+
readonly db: Database.Database;
|
|
3
45
|
readonly path: string;
|
|
4
46
|
constructor(dbPath: string);
|
|
47
|
+
/** Idempotent: older DBs before idx_reward_claims_tx may lack the unique index. */
|
|
48
|
+
private ensureRewardClaimsTxIndex;
|
|
5
49
|
recordOwnActivity(requestId: string, role: 'created' | 'claimed' | 'delivered' | 'evaluated'): void;
|
|
6
50
|
isOwnActivity(requestId: string): boolean;
|
|
7
51
|
setShutdownState(state: 'clean' | 'running'): void;
|
|
@@ -16,6 +60,25 @@ export declare class Store {
|
|
|
16
60
|
requestId: string;
|
|
17
61
|
role: string;
|
|
18
62
|
}>;
|
|
63
|
+
recordActivityEvent(event: ActivityEventInput): void;
|
|
64
|
+
getRecentActivityEvents(limit: number, opts?: {
|
|
65
|
+
since?: string;
|
|
66
|
+
cursor?: string;
|
|
67
|
+
}): ActivityEventRow[];
|
|
68
|
+
/** Newer events first, then ascending id for `jinn logs --follow` (oldest in batch printed first in caller). */
|
|
69
|
+
getActivityEventsAfterId(afterId: number, limit: number): ActivityEventRow[];
|
|
70
|
+
getActivityCountsByKind(): Record<string, number>;
|
|
71
|
+
getLastEventAtForService(serviceIndex: number): string | null;
|
|
72
|
+
getActivityCountsForService(serviceIndex: number): Record<string, number>;
|
|
73
|
+
recordRewardClaim(claim: RewardClaimInput): void;
|
|
74
|
+
getClaimedRewardsByService(): Record<number, {
|
|
75
|
+
total: string;
|
|
76
|
+
lastAt: string;
|
|
77
|
+
lastTxHash: string;
|
|
78
|
+
}>;
|
|
79
|
+
upsertBalanceCache(entry: BalanceCacheEntry): void;
|
|
80
|
+
getBalanceCache(): BalanceCacheEntry[];
|
|
81
|
+
private backfillActivityEvents;
|
|
19
82
|
getLastProcessedBlock(): bigint | null;
|
|
20
83
|
setLastProcessedBlock(block: bigint): void;
|
|
21
84
|
insertArtifact(artifact: {
|
package/dist/store/store.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import Database from 'better-sqlite3';
|
|
2
2
|
import { mkdirSync } from 'node:fs';
|
|
3
3
|
import { dirname } from 'node:path';
|
|
4
|
+
import { RESTORATION_INTENTS_SCHEMA } from '../restorer/engine/persistence.js';
|
|
4
5
|
const SCHEMA = `
|
|
5
6
|
CREATE TABLE IF NOT EXISTS own_activity (
|
|
6
7
|
request_id TEXT PRIMARY KEY,
|
|
@@ -31,8 +32,48 @@ CREATE INDEX IF NOT EXISTS idx_artifacts_desired_state ON artifacts (desired_sta
|
|
|
31
32
|
CREATE INDEX IF NOT EXISTS idx_artifacts_outcome ON artifacts (outcome);
|
|
32
33
|
CREATE INDEX IF NOT EXISTS idx_artifacts_remote ON artifacts (remote);
|
|
33
34
|
|
|
35
|
+
CREATE TABLE IF NOT EXISTS activity_events (
|
|
36
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
37
|
+
ts TEXT,
|
|
38
|
+
kind TEXT NOT NULL,
|
|
39
|
+
request_id TEXT,
|
|
40
|
+
service_index INTEGER,
|
|
41
|
+
tx_hash TEXT,
|
|
42
|
+
spec_kind TEXT,
|
|
43
|
+
outcome TEXT,
|
|
44
|
+
detail TEXT
|
|
45
|
+
);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_activity_events_ts ON activity_events (ts DESC);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_activity_events_req ON activity_events (request_id);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_activity_events_service_idx ON activity_events (service_index);
|
|
49
|
+
|
|
50
|
+
CREATE TABLE IF NOT EXISTS reward_claims (
|
|
51
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
52
|
+
ts TEXT NOT NULL,
|
|
53
|
+
service_index INTEGER NOT NULL,
|
|
54
|
+
service_id INTEGER,
|
|
55
|
+
staking_proxy TEXT NOT NULL,
|
|
56
|
+
distributor TEXT NOT NULL,
|
|
57
|
+
tx_hash TEXT NOT NULL,
|
|
58
|
+
amount_wei TEXT NOT NULL,
|
|
59
|
+
asset TEXT NOT NULL DEFAULT 'reward'
|
|
60
|
+
);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_reward_claims_svc ON reward_claims (service_index);
|
|
62
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_reward_claims_tx ON reward_claims (tx_hash);
|
|
63
|
+
|
|
64
|
+
CREATE TABLE IF NOT EXISTS balance_cache (
|
|
65
|
+
role TEXT PRIMARY KEY,
|
|
66
|
+
address TEXT NOT NULL,
|
|
67
|
+
native_wei TEXT,
|
|
68
|
+
bond_wei TEXT,
|
|
69
|
+
asset_extra_json TEXT,
|
|
70
|
+
fetched_at TEXT NOT NULL,
|
|
71
|
+
error TEXT
|
|
72
|
+
);
|
|
73
|
+
|
|
34
74
|
`;
|
|
35
75
|
export class Store {
|
|
76
|
+
/** Exposed for engine persistence layer — treat as package-internal. */
|
|
36
77
|
db;
|
|
37
78
|
path;
|
|
38
79
|
constructor(dbPath) {
|
|
@@ -43,9 +84,18 @@ export class Store {
|
|
|
43
84
|
this.db = new Database(dbPath);
|
|
44
85
|
this.db.pragma('journal_mode = WAL');
|
|
45
86
|
this.db.exec(SCHEMA);
|
|
87
|
+
this.db.exec(RESTORATION_INTENTS_SCHEMA);
|
|
88
|
+
this.ensureRewardClaimsTxIndex();
|
|
89
|
+
this.backfillActivityEvents();
|
|
90
|
+
}
|
|
91
|
+
/** Idempotent: older DBs before idx_reward_claims_tx may lack the unique index. */
|
|
92
|
+
ensureRewardClaimsTxIndex() {
|
|
93
|
+
this.db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_reward_claims_tx ON reward_claims (tx_hash)`);
|
|
46
94
|
}
|
|
47
95
|
recordOwnActivity(requestId, role) {
|
|
48
96
|
this.db.prepare(`INSERT OR REPLACE INTO own_activity (request_id, role) VALUES (?, ?)`).run(requestId, role);
|
|
97
|
+
const ts = new Date().toISOString();
|
|
98
|
+
this.recordActivityEvent({ ts, kind: role, requestId });
|
|
49
99
|
}
|
|
50
100
|
isOwnActivity(requestId) {
|
|
51
101
|
const row = this.db.prepare('SELECT 1 FROM own_activity WHERE request_id = ?').get(requestId);
|
|
@@ -68,17 +118,189 @@ export class Store {
|
|
|
68
118
|
}
|
|
69
119
|
/** Counts of protocol roles recorded for this node (best-effort activity hints). */
|
|
70
120
|
getOwnActivityCounts() {
|
|
121
|
+
const counts = this.getActivityCountsByKind();
|
|
122
|
+
if (Object.keys(counts).length > 0)
|
|
123
|
+
return counts;
|
|
71
124
|
const rows = this.db.prepare(`SELECT role, COUNT(*) as c FROM own_activity GROUP BY role`).all();
|
|
72
125
|
const out = {};
|
|
73
|
-
for (const r of rows)
|
|
126
|
+
for (const r of rows)
|
|
74
127
|
out[r.role] = r.c;
|
|
75
|
-
}
|
|
76
128
|
return out;
|
|
77
129
|
}
|
|
78
130
|
/** Latest own_activity rows by insertion order (approximate). */
|
|
79
131
|
getRecentOwnActivity(limit) {
|
|
80
|
-
const rows = this.
|
|
81
|
-
|
|
132
|
+
const rows = this.getRecentActivityEvents(limit);
|
|
133
|
+
if (rows.length > 0)
|
|
134
|
+
return rows.map((r) => ({ requestId: r.requestId ?? '', role: r.kind }));
|
|
135
|
+
const legacyRows = this.db.prepare(`SELECT request_id, role FROM own_activity ORDER BY rowid DESC LIMIT ?`).all(Math.max(0, Math.min(limit, 1000)));
|
|
136
|
+
return legacyRows.map(r => ({ requestId: r.request_id, role: r.role }));
|
|
137
|
+
}
|
|
138
|
+
recordActivityEvent(event) {
|
|
139
|
+
this.db.prepare(`INSERT INTO activity_events (ts, kind, request_id, service_index, tx_hash, spec_kind, outcome, detail)
|
|
140
|
+
VALUES (@ts, @kind, @requestId, @serviceIndex, @txHash, @specKind, @outcome, @detail)`).run({
|
|
141
|
+
ts: event.ts ?? null,
|
|
142
|
+
kind: event.kind,
|
|
143
|
+
requestId: event.requestId ?? null,
|
|
144
|
+
serviceIndex: event.serviceIndex ?? null,
|
|
145
|
+
txHash: event.txHash ?? null,
|
|
146
|
+
specKind: event.specKind ?? null,
|
|
147
|
+
outcome: event.outcome ?? null,
|
|
148
|
+
detail: event.detail ?? null,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
getRecentActivityEvents(limit, opts = {}) {
|
|
152
|
+
const effectiveLimit = Math.max(0, Math.min(limit, 1000));
|
|
153
|
+
const clauses = [];
|
|
154
|
+
const params = { limit: effectiveLimit };
|
|
155
|
+
if (opts.since) {
|
|
156
|
+
clauses.push('ts IS NOT NULL AND ts >= @since');
|
|
157
|
+
params['since'] = opts.since;
|
|
158
|
+
}
|
|
159
|
+
if (opts.cursor) {
|
|
160
|
+
clauses.push('ts IS NOT NULL AND ts < @cursor');
|
|
161
|
+
params['cursor'] = opts.cursor;
|
|
162
|
+
}
|
|
163
|
+
const where = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';
|
|
164
|
+
const rows = this.db.prepare(`SELECT id, ts, kind, request_id, service_index, tx_hash, spec_kind, outcome, detail
|
|
165
|
+
FROM activity_events
|
|
166
|
+
${where}
|
|
167
|
+
ORDER BY id DESC
|
|
168
|
+
LIMIT @limit`).all(params);
|
|
169
|
+
return rows.map((r) => ({
|
|
170
|
+
id: r.id,
|
|
171
|
+
ts: r.ts,
|
|
172
|
+
kind: r.kind,
|
|
173
|
+
requestId: r.request_id,
|
|
174
|
+
serviceIndex: r.service_index,
|
|
175
|
+
txHash: r.tx_hash,
|
|
176
|
+
specKind: r.spec_kind,
|
|
177
|
+
outcome: r.outcome,
|
|
178
|
+
detail: r.detail,
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
/** Newer events first, then ascending id for `jinn logs --follow` (oldest in batch printed first in caller). */
|
|
182
|
+
getActivityEventsAfterId(afterId, limit) {
|
|
183
|
+
const effectiveLimit = Math.max(0, Math.min(limit, 1000));
|
|
184
|
+
const rows = this.db
|
|
185
|
+
.prepare(`SELECT id, ts, kind, request_id, service_index, tx_hash, spec_kind, outcome, detail
|
|
186
|
+
FROM activity_events
|
|
187
|
+
WHERE id > @afterId
|
|
188
|
+
ORDER BY id ASC
|
|
189
|
+
LIMIT @limit`)
|
|
190
|
+
.all({ afterId, limit: effectiveLimit });
|
|
191
|
+
return rows.map((r) => ({
|
|
192
|
+
id: r.id,
|
|
193
|
+
ts: r.ts,
|
|
194
|
+
kind: r.kind,
|
|
195
|
+
requestId: r.request_id,
|
|
196
|
+
serviceIndex: r.service_index,
|
|
197
|
+
txHash: r.tx_hash,
|
|
198
|
+
specKind: r.spec_kind,
|
|
199
|
+
outcome: r.outcome,
|
|
200
|
+
detail: r.detail,
|
|
201
|
+
}));
|
|
202
|
+
}
|
|
203
|
+
getActivityCountsByKind() {
|
|
204
|
+
const rows = this.db.prepare(`SELECT kind, COUNT(*) as c FROM activity_events GROUP BY kind`).all();
|
|
205
|
+
const out = {};
|
|
206
|
+
for (const r of rows)
|
|
207
|
+
out[r.kind] = r.c;
|
|
208
|
+
return out;
|
|
209
|
+
}
|
|
210
|
+
getLastEventAtForService(serviceIndex) {
|
|
211
|
+
const row = this.db.prepare(`SELECT ts FROM activity_events WHERE service_index = ? AND ts IS NOT NULL ORDER BY id DESC LIMIT 1`).get(serviceIndex);
|
|
212
|
+
return row?.ts ?? null;
|
|
213
|
+
}
|
|
214
|
+
getActivityCountsForService(serviceIndex) {
|
|
215
|
+
const rows = this.db.prepare(`SELECT kind, COUNT(*) as c FROM activity_events WHERE service_index = ? GROUP BY kind`).all(serviceIndex);
|
|
216
|
+
const out = {};
|
|
217
|
+
for (const r of rows)
|
|
218
|
+
out[r.kind] = r.c;
|
|
219
|
+
return out;
|
|
220
|
+
}
|
|
221
|
+
recordRewardClaim(claim) {
|
|
222
|
+
this.db
|
|
223
|
+
.prepare(`INSERT OR IGNORE INTO reward_claims
|
|
224
|
+
(ts, service_index, service_id, staking_proxy, distributor, tx_hash, amount_wei, asset)
|
|
225
|
+
VALUES (@ts, @serviceIndex, @serviceId, @stakingProxy, @distributor, @txHash, @amountWei, @asset)`)
|
|
226
|
+
.run({
|
|
227
|
+
ts: claim.ts,
|
|
228
|
+
serviceIndex: claim.serviceIndex,
|
|
229
|
+
serviceId: claim.serviceId ?? null,
|
|
230
|
+
stakingProxy: claim.stakingProxy,
|
|
231
|
+
distributor: claim.distributor,
|
|
232
|
+
txHash: claim.txHash,
|
|
233
|
+
amountWei: claim.amountWei,
|
|
234
|
+
asset: claim.asset ?? 'reward',
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
getClaimedRewardsByService() {
|
|
238
|
+
const rows = this.db.prepare(`SELECT id, service_index, amount_wei, ts, tx_hash FROM reward_claims ORDER BY id ASC`).all();
|
|
239
|
+
const out = {};
|
|
240
|
+
const lastId = {};
|
|
241
|
+
for (const r of rows) {
|
|
242
|
+
const current = out[r.service_index];
|
|
243
|
+
const nextTotal = (current ? BigInt(current.total) : 0n) + BigInt(r.amount_wei);
|
|
244
|
+
const isNewer = !current || r.id > (lastId[r.service_index] ?? 0);
|
|
245
|
+
if (isNewer) {
|
|
246
|
+
lastId[r.service_index] = r.id;
|
|
247
|
+
}
|
|
248
|
+
out[r.service_index] = {
|
|
249
|
+
total: nextTotal.toString(),
|
|
250
|
+
lastAt: isNewer || !current ? r.ts : current.lastAt,
|
|
251
|
+
lastTxHash: isNewer || !current ? r.tx_hash : current.lastTxHash,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
return out;
|
|
255
|
+
}
|
|
256
|
+
upsertBalanceCache(entry) {
|
|
257
|
+
this.db.prepare(`INSERT INTO balance_cache (role, address, native_wei, bond_wei, asset_extra_json, fetched_at, error)
|
|
258
|
+
VALUES (@role, @address, @nativeWei, @bondWei, @assetExtraJson, @fetchedAt, @error)
|
|
259
|
+
ON CONFLICT(role) DO UPDATE SET
|
|
260
|
+
address=excluded.address,
|
|
261
|
+
native_wei=excluded.native_wei,
|
|
262
|
+
bond_wei=excluded.bond_wei,
|
|
263
|
+
asset_extra_json=excluded.asset_extra_json,
|
|
264
|
+
fetched_at=excluded.fetched_at,
|
|
265
|
+
error=excluded.error`).run({
|
|
266
|
+
role: entry.role,
|
|
267
|
+
address: entry.address,
|
|
268
|
+
nativeWei: entry.nativeWei ?? null,
|
|
269
|
+
bondWei: entry.bondWei ?? null,
|
|
270
|
+
assetExtraJson: entry.assetExtraJson ?? null,
|
|
271
|
+
fetchedAt: entry.fetchedAt,
|
|
272
|
+
error: entry.error ?? null,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
getBalanceCache() {
|
|
276
|
+
const rows = this.db.prepare(`SELECT role, address, native_wei, bond_wei, asset_extra_json, fetched_at, error
|
|
277
|
+
FROM balance_cache`).all();
|
|
278
|
+
return rows.map((r) => ({
|
|
279
|
+
role: r.role,
|
|
280
|
+
address: r.address,
|
|
281
|
+
nativeWei: r.native_wei,
|
|
282
|
+
bondWei: r.bond_wei,
|
|
283
|
+
assetExtraJson: r.asset_extra_json,
|
|
284
|
+
fetchedAt: r.fetched_at,
|
|
285
|
+
error: r.error,
|
|
286
|
+
}));
|
|
287
|
+
}
|
|
288
|
+
backfillActivityEvents() {
|
|
289
|
+
const migrationKey = 'activity_events_migrated_v1';
|
|
290
|
+
const insert = this.db.prepare(`INSERT INTO activity_events (ts, kind, request_id)
|
|
291
|
+
SELECT NULL, o.role, o.request_id
|
|
292
|
+
FROM own_activity o
|
|
293
|
+
WHERE NOT EXISTS (
|
|
294
|
+
SELECT 1 FROM activity_events a
|
|
295
|
+
WHERE a.request_id = o.request_id AND a.kind = o.role
|
|
296
|
+
)`);
|
|
297
|
+
const tx = this.db.transaction(() => {
|
|
298
|
+
if (this.getConfigValue(migrationKey) === 'true')
|
|
299
|
+
return;
|
|
300
|
+
insert.run();
|
|
301
|
+
this.setConfigValue(migrationKey, 'true');
|
|
302
|
+
});
|
|
303
|
+
tx();
|
|
82
304
|
}
|
|
83
305
|
getLastProcessedBlock() {
|
|
84
306
|
const row = this.db.prepare('SELECT value FROM config WHERE key = ?').get('last_processed_block');
|
package/dist/store/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AA8C/E,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqEd,CAAC;AAEF,MAAM,OAAO,KAAK;IAChB,wEAAwE;IAC/D,EAAE,CAAoB;IACtB,IAAI,CAAS;IAEtB,YAAY,MAAc;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAED,mFAAmF;IAC3E,yBAAyB;QAC/B,IAAI,CAAC,EAAE,CAAC,IAAI,CACV,mFAAmF,CACpF,CAAC;IACJ,CAAC;IAED,iBAAiB,CAAC,SAAiB,EAAE,IAAuD;QAC1F,IAAI,CAAC,EAAE,CAAC,OAAO,CACb,sEAAsE,CACvE,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9F,OAAO,GAAG,KAAK,SAAS,CAAC;IAC3B,CAAC;IAED,gBAAgB,CAAC,KAA0B;QACzC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAC3G,CAAC;IAED,gBAAgB;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAkC,CAAC;QAC7H,OAAO,GAAG,EAAE,KAAK,IAAI,IAAI,CAAC;IAC5B,CAAC;IAED,2DAA2D;IAC3D,cAAc,CAAC,GAAW;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAkC,CAAC;QAChH,OAAO,GAAG,EAAE,KAAK,IAAI,IAAI,CAAC;IAC5B,CAAC;IAED,cAAc,CAAC,GAAW,EAAE,KAAa;QACvC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9F,CAAC;IAED,oFAAoF;IACpF,oBAAoB;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC9C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,4DAA4D,CAC7D,CAAC,GAAG,EAAwC,CAAC;QAC9C,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,iEAAiE;IACjE,oBAAoB,CAAC,KAAa;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9F,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAChC,uEAAuE,CACxE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAgD,CAAC;QACzF,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,mBAAmB,CAAC,KAAyB;QAC3C,IAAI,CAAC,EAAE,CAAC,OAAO,CACb;6FACuF,CACxF,CAAC,GAAG,CAAC;YACJ,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;YAClC,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;YACxC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB,CACrB,KAAa,EACb,OAA4C,EAAE;QAE9C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,MAAM,GAA4B,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QAClE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACjC,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;;SAEG,KAAK;;oBAEM,CACf,CAAC,GAAG,CAAC,MAAM,CAUV,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,YAAY,EAAE,CAAC,CAAC,aAAa;YAC7B,MAAM,EAAE,CAAC,CAAC,OAAO;YACjB,QAAQ,EAAE,CAAC,CAAC,SAAS;YACrB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,gHAAgH;IAChH,wBAAwB,CAAC,OAAe,EAAE,KAAa;QACrD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;sBAIc,CACf;aACA,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAUrC,CAAC;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,YAAY,EAAE,CAAC,CAAC,aAAa;YAC7B,MAAM,EAAE,CAAC,CAAC,OAAO;YACjB,QAAQ,EAAE,CAAC,CAAC,SAAS;YACrB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,uBAAuB;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,+DAA+D,CAChE,CAAC,GAAG,EAAwC,CAAC;QAC9C,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,wBAAwB,CAAC,YAAoB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,oGAAoG,CACrG,CAAC,GAAG,CAAC,YAAY,CAAsC,CAAC;QACzD,OAAO,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC;IACzB,CAAC;IAED,2BAA2B,CAAC,YAAoB;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,uFAAuF,CACxF,CAAC,GAAG,CAAC,YAAY,CAAuC,CAAC;QAC1D,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,iBAAiB,CAAC,KAAuB;QACvC,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;2GAEmG,CACpG;aACA,GAAG,CAAC;YACH,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;YAClC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,QAAQ;SAC/B,CAAC,CAAC;IACP,CAAC;IAED,0BAA0B;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,sFAAsF,CACvF,CAAC,GAAG,EAMH,CAAC;QACH,MAAM,GAAG,GAA0E,EAAE,CAAC;QACtF,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YACrC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAChF,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAClE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACjC,CAAC;YACD,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG;gBACrB,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;gBAC3B,MAAM,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;gBACnD,UAAU,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU;aACjE,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,kBAAkB,CAAC,KAAwB;QACzC,IAAI,CAAC,EAAE,CAAC,OAAO,CACb;;;;;;;;8BAQwB,CACzB,CAAC,GAAG,CAAC;YACJ,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;YAClC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;YAC9B,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;YAC5C,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,eAAe;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;0BACoB,CACrB,CAAC,GAAG,EAQH,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,OAAO,EAAE,CAAC,CAAC,QAAQ;YACnB,cAAc,EAAE,CAAC,CAAC,gBAAgB;YAClC,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,sBAAsB;QAC5B,MAAM,YAAY,GAAG,6BAA6B,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC5B;;;;;;SAMG,CACJ,CAAC;QACF,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClC,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,MAAM;gBAAE,OAAO;YACzD,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,EAAE,EAAE,CAAC;IACP,CAAC;IAED,qBAAqB;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAkC,CAAC;QACnI,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAED,qBAAqB,CAAC,KAAa;QACjC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5H,CAAC;IAED,cAAc,CAAC,QAQd;QACC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC;YACL,GAAG,QAAQ;YACX,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,KAQf;QACC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAA4B,EAAE,CAAC;QAE3C,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QACpC,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QACxC,CAAC;QAED,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC;QAClD,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QAChC,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QAClC,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACtC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,qGAAqG,KAAK,mCAAmC,KAAK,EAAE,CACrJ,CAAC,GAAG,CAAC,MAAM,CAA2J,CAAC;QAExK,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtB,GAAG,GAAG;YACN,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAa;SACvC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,oBAAoB,CAAC,QAUpB;QACC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC;YACL,GAAG,QAAQ;YACX,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,EAAU;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,CAAC,EAAE,CAA2C,CAAC;QAC5H,OAAO,GAAG,EAAE,OAAO,IAAI,IAAI,CAAC;IAC9B,CAAC;IAED,qBAAqB,CAAC,EAAU;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,kFAAkF,CACnF,CAAC,GAAG,CAAC,EAAE,CAAkF,CAAC;QAC3F,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO;YACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;SAC9B,CAAC;IACJ,CAAC;IAED,sBAAsB,CAAC,SAAiB,EAAE,GAAW;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,+HAA+H,CAChI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,GAAG,CAA8F,CAAC;QAC1H,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAa,EAAE,CAAC;IAC5D,CAAC;IAED,kBAAkB,CAAC,EAAU,EAAE,OAAe;QAC5C,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}
|