@reefclaw/connect 0.1.12 → 0.1.14
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/assets/plugin/audit/mode-transition-audit.d.ts +11 -0
- package/assets/plugin/audit/mode-transition-audit.js +29 -0
- package/assets/plugin/balance-utils.d.ts +36 -0
- package/assets/plugin/balance-utils.js +98 -0
- package/assets/plugin/ccxt/binance-ban-gate.d.ts +47 -0
- package/assets/plugin/ccxt/binance-ban-gate.js +420 -0
- package/assets/plugin/ccxt/binance-private.d.ts +346 -0
- package/assets/plugin/ccxt/binance-private.js +1525 -0
- package/assets/plugin/ccxt/binance-public.d.ts +34 -0
- package/assets/plugin/ccxt/binance-public.js +180 -0
- package/assets/plugin/ccxt/intel-public.d.ts +25 -0
- package/assets/plugin/ccxt/intel-public.js +80 -0
- package/assets/plugin/ccxt/public-market-data-api.d.ts +26 -0
- package/assets/plugin/ccxt/public-market-data-api.js +23 -0
- package/assets/plugin/config/agent-config-client.d.ts +77 -0
- package/assets/plugin/config/agent-config-client.js +188 -0
- package/assets/plugin/config/agent-config-poller.d.ts +32 -0
- package/assets/plugin/config/agent-config-poller.js +101 -0
- package/assets/plugin/config/brackets-config.d.ts +22 -0
- package/assets/plugin/config/brackets-config.js +58 -0
- package/assets/plugin/config/entitlement-gate.d.ts +51 -0
- package/assets/plugin/config/entitlement-gate.js +137 -0
- package/assets/plugin/config/gate-store.d.ts +18 -0
- package/assets/plugin/config/gate-store.js +61 -0
- package/assets/plugin/config/plugin-config-io.d.ts +222 -0
- package/assets/plugin/config/plugin-config-io.js +126 -0
- package/assets/plugin/config/position-review-config.d.ts +35 -0
- package/assets/plugin/config/position-review-config.js +105 -0
- package/assets/plugin/config/tool-gate.d.ts +53 -0
- package/assets/plugin/config/tool-gate.js +128 -0
- package/assets/plugin/config/user-data-stream-config.d.ts +89 -0
- package/assets/plugin/config/user-data-stream-config.js +239 -0
- package/assets/plugin/connector-supervisor.d.ts +36 -0
- package/assets/plugin/connector-supervisor.js +149 -0
- package/assets/plugin/exchange-adapter.d.ts +65 -0
- package/assets/plugin/exchange-adapter.js +4 -0
- package/assets/plugin/index.d.ts +30 -0
- package/assets/plugin/index.js +2763 -0
- package/assets/plugin/ingest/pending-entry-metadata.d.ts +74 -0
- package/assets/plugin/ingest/pending-entry-metadata.js +236 -0
- package/assets/plugin/ingest/position-auto-capture.d.ts +171 -0
- package/assets/plugin/ingest/position-auto-capture.js +709 -0
- package/assets/plugin/ingest/position-decisions-client.d.ts +327 -0
- package/assets/plugin/ingest/position-decisions-client.js +306 -0
- package/assets/plugin/ingest/readiness-reporter.d.ts +42 -0
- package/assets/plugin/ingest/readiness-reporter.js +163 -0
- package/assets/plugin/ingest/reconcile-db-vs-exchange.d.ts +51 -0
- package/assets/plugin/ingest/reconcile-db-vs-exchange.js +170 -0
- package/assets/plugin/ingest/reconciler-cleanup.d.ts +37 -0
- package/assets/plugin/ingest/reconciler-cleanup.js +147 -0
- package/assets/plugin/ingest/rest-gap-filler.d.ts +191 -0
- package/assets/plugin/ingest/rest-gap-filler.js +565 -0
- package/assets/plugin/ingest/touched-symbols-store.d.ts +25 -0
- package/assets/plugin/ingest/touched-symbols-store.js +96 -0
- package/assets/plugin/ingest/trade-store-client.d.ts +40 -0
- package/assets/plugin/ingest/trade-store-client.js +125 -0
- package/assets/plugin/ingest/ws-ingest.d.ts +43 -0
- package/assets/plugin/ingest/ws-ingest.js +126 -0
- package/assets/plugin/learning/setup-family.d.ts +21 -0
- package/assets/plugin/learning/setup-family.js +103 -0
- package/assets/plugin/lifecycle/install-signal-handlers.d.ts +33 -0
- package/assets/plugin/lifecycle/install-signal-handlers.js +112 -0
- package/assets/plugin/lifecycle/shutdown-coordinator.d.ts +43 -0
- package/assets/plugin/lifecycle/shutdown-coordinator.js +131 -0
- package/assets/plugin/lifecycle/trading-operation-lock.d.ts +17 -0
- package/assets/plugin/lifecycle/trading-operation-lock.js +14 -0
- package/assets/plugin/live/bracket-id.d.ts +26 -0
- package/assets/plugin/live/bracket-id.js +112 -0
- package/assets/plugin/live/bracket-ledger.d.ts +54 -0
- package/assets/plugin/live/bracket-ledger.js +267 -0
- package/assets/plugin/live/bracket-manager.d.ts +82 -0
- package/assets/plugin/live/bracket-manager.js +478 -0
- package/assets/plugin/live/bracket-params.d.ts +22 -0
- package/assets/plugin/live/bracket-params.js +124 -0
- package/assets/plugin/live/bracket-reconciler.d.ts +95 -0
- package/assets/plugin/live/bracket-reconciler.js +573 -0
- package/assets/plugin/live/bracket-types.d.ts +102 -0
- package/assets/plugin/live/bracket-types.js +8 -0
- package/assets/plugin/live/deposit-tracker.d.ts +62 -0
- package/assets/plugin/live/deposit-tracker.js +97 -0
- package/assets/plugin/live/emergency-controls.d.ts +32 -0
- package/assets/plugin/live/emergency-controls.js +226 -0
- package/assets/plugin/live/exchange-errors.d.ts +12 -0
- package/assets/plugin/live/exchange-errors.js +130 -0
- package/assets/plugin/live/exchange-info-cache.d.ts +37 -0
- package/assets/plugin/live/exchange-info-cache.js +134 -0
- package/assets/plugin/live/fact-subscriber.d.ts +78 -0
- package/assets/plugin/live/fact-subscriber.js +182 -0
- package/assets/plugin/live/fill-price.d.ts +13 -0
- package/assets/plugin/live/fill-price.js +37 -0
- package/assets/plugin/live/intent-journal.d.ts +42 -0
- package/assets/plugin/live/intent-journal.js +122 -0
- package/assets/plugin/live/listen-key-manager.d.ts +70 -0
- package/assets/plugin/live/listen-key-manager.js +169 -0
- package/assets/plugin/live/live-adapter.d.ts +319 -0
- package/assets/plugin/live/live-adapter.js +1906 -0
- package/assets/plugin/live/live-balance-enricher.d.ts +32 -0
- package/assets/plugin/live/live-balance-enricher.js +104 -0
- package/assets/plugin/live/live-bracket-api.d.ts +13 -0
- package/assets/plugin/live/live-bracket-api.js +20 -0
- package/assets/plugin/live/live-state-store.d.ts +194 -0
- package/assets/plugin/live/live-state-store.js +450 -0
- package/assets/plugin/live/local-signal-service.d.ts +57 -0
- package/assets/plugin/live/local-signal-service.js +151 -0
- package/assets/plugin/live/local-strategy-evaluator.d.ts +62 -0
- package/assets/plugin/live/local-strategy-evaluator.js +131 -0
- package/assets/plugin/live/microstructure-assembler.d.ts +54 -0
- package/assets/plugin/live/microstructure-assembler.js +148 -0
- package/assets/plugin/live/order-poller.d.ts +29 -0
- package/assets/plugin/live/order-poller.js +125 -0
- package/assets/plugin/live/position-state-store.d.ts +87 -0
- package/assets/plugin/live/position-state-store.js +237 -0
- package/assets/plugin/live/proposal-decision-listener.d.ts +70 -0
- package/assets/plugin/live/proposal-decision-listener.js +292 -0
- package/assets/plugin/live/proposal-manager.d.ts +76 -0
- package/assets/plugin/live/proposal-manager.js +140 -0
- package/assets/plugin/live/rate-limiter.d.ts +47 -0
- package/assets/plugin/live/rate-limiter.js +159 -0
- package/assets/plugin/live/reconciler.d.ts +39 -0
- package/assets/plugin/live/reconciler.js +175 -0
- package/assets/plugin/live/setup-buckets.d.ts +7 -0
- package/assets/plugin/live/setup-buckets.js +33 -0
- package/assets/plugin/live/slippage-tracker.d.ts +45 -0
- package/assets/plugin/live/slippage-tracker.js +78 -0
- package/assets/plugin/live/stop-watcher.d.ts +67 -0
- package/assets/plugin/live/stop-watcher.js +218 -0
- package/assets/plugin/live/user-data-active-probe.d.ts +54 -0
- package/assets/plugin/live/user-data-active-probe.js +180 -0
- package/assets/plugin/live/user-data-stream-controller.d.ts +200 -0
- package/assets/plugin/live/user-data-stream-controller.js +579 -0
- package/assets/plugin/live/user-data-stream-ws.d.ts +22 -0
- package/assets/plugin/live/user-data-stream-ws.js +63 -0
- package/assets/plugin/live/user-data-stream.d.ts +243 -0
- package/assets/plugin/live/user-data-stream.js +704 -0
- package/assets/plugin/logger.d.ts +2 -0
- package/assets/plugin/logger.js +2 -0
- package/assets/plugin/mfe.d.ts +21 -0
- package/assets/plugin/mfe.js +68 -0
- package/assets/plugin/onboarding/mode-ladder.d.ts +1 -0
- package/assets/plugin/onboarding/mode-ladder.js +3 -0
- package/assets/plugin/onboarding/runtime.d.ts +102 -0
- package/assets/plugin/onboarding/runtime.js +215 -0
- package/assets/plugin/openclaw.plugin.json +92 -0
- package/assets/plugin/paper-adapter.d.ts +24 -0
- package/assets/plugin/paper-adapter.js +91 -0
- package/assets/plugin/persistence/state-manager.d.ts +66 -0
- package/assets/plugin/persistence/state-manager.js +222 -0
- package/assets/plugin/pinned-plan.d.ts +9 -0
- package/assets/plugin/pinned-plan.js +23 -0
- package/assets/plugin/portfolio/reentry-tracker.d.ts +36 -0
- package/assets/plugin/portfolio/reentry-tracker.js +127 -0
- package/assets/plugin/portfolio/wave9-admission.d.ts +67 -0
- package/assets/plugin/portfolio/wave9-admission.js +262 -0
- package/assets/plugin/portfolio/wave9-policy.d.ts +36 -0
- package/assets/plugin/portfolio/wave9-policy.js +183 -0
- package/assets/plugin/risk/pre-trade-check.d.ts +38 -0
- package/assets/plugin/risk/pre-trade-check.js +345 -0
- package/assets/plugin/risk/pre-trade-types.d.ts +60 -0
- package/assets/plugin/risk/pre-trade-types.js +3 -0
- package/assets/plugin/shadow/shadow-tracker.d.ts +36 -0
- package/assets/plugin/shadow/shadow-tracker.js +151 -0
- package/assets/plugin/shadow/types.d.ts +42 -0
- package/assets/plugin/shadow/types.js +20 -0
- package/assets/plugin/shared/indicators-extended.d.ts +52 -0
- package/assets/plugin/shared/indicators-extended.js +291 -0
- package/assets/plugin/shared/indicators.d.ts +15 -0
- package/assets/plugin/shared/indicators.js +114 -0
- package/assets/plugin/signals/conditions/registry.d.ts +16 -0
- package/assets/plugin/signals/conditions/registry.js +1333 -0
- package/assets/plugin/signals/conditions/types.d.ts +1 -0
- package/assets/plugin/signals/conditions/types.js +4 -0
- package/assets/plugin/signals/direction-rules.d.ts +3 -0
- package/assets/plugin/signals/direction-rules.js +24 -0
- package/assets/plugin/signals/entry-rules.d.ts +6 -0
- package/assets/plugin/signals/entry-rules.js +33 -0
- package/assets/plugin/signals/serialize-context.d.ts +4 -0
- package/assets/plugin/signals/serialize-context.js +39 -0
- package/assets/plugin/signals/stop-rules.d.ts +3 -0
- package/assets/plugin/signals/stop-rules.js +48 -0
- package/assets/plugin/signals/strategy-adapter.d.ts +47 -0
- package/assets/plugin/signals/strategy-adapter.js +209 -0
- package/assets/plugin/signals/types.d.ts +1 -0
- package/assets/plugin/signals/types.js +8 -0
- package/assets/plugin/simulator/exchange-simulator.d.ts +105 -0
- package/assets/plugin/simulator/exchange-simulator.js +759 -0
- package/assets/plugin/simulator/fill-engine.d.ts +53 -0
- package/assets/plugin/simulator/fill-engine.js +280 -0
- package/assets/plugin/simulator/paper-market-feed.d.ts +26 -0
- package/assets/plugin/simulator/paper-market-feed.js +104 -0
- package/assets/plugin/simulator/realistic-fills.d.ts +59 -0
- package/assets/plugin/simulator/realistic-fills.js +175 -0
- package/assets/plugin/simulator/types.d.ts +228 -0
- package/assets/plugin/simulator/types.js +43 -0
- package/assets/plugin/strategy/builtin-strategies.d.ts +2 -0
- package/assets/plugin/strategy/builtin-strategies.js +113 -0
- package/assets/plugin/strategy/condition-registry.d.ts +3 -0
- package/assets/plugin/strategy/condition-registry.js +153 -0
- package/assets/plugin/strategy/evaluator.d.ts +70 -0
- package/assets/plugin/strategy/evaluator.js +98 -0
- package/assets/plugin/tools/assessment-validation.d.ts +141 -0
- package/assets/plugin/tools/assessment-validation.js +473 -0
- package/assets/plugin/tools/attach-brackets.d.ts +39 -0
- package/assets/plugin/tools/attach-brackets.js +564 -0
- package/assets/plugin/tools/audit-bracket-protection.d.ts +49 -0
- package/assets/plugin/tools/audit-bracket-protection.js +683 -0
- package/assets/plugin/tools/bracket-control.d.ts +12 -0
- package/assets/plugin/tools/bracket-control.js +35 -0
- package/assets/plugin/tools/cancel-all-orders.d.ts +9 -0
- package/assets/plugin/tools/cancel-all-orders.js +8 -0
- package/assets/plugin/tools/cancel-order.d.ts +14 -0
- package/assets/plugin/tools/cancel-order.js +60 -0
- package/assets/plugin/tools/check-position-health.d.ts +46 -0
- package/assets/plugin/tools/check-position-health.js +194 -0
- package/assets/plugin/tools/clear-exchange-credentials.d.ts +24 -0
- package/assets/plugin/tools/clear-exchange-credentials.js +70 -0
- package/assets/plugin/tools/close-position.d.ts +45 -0
- package/assets/plugin/tools/close-position.js +722 -0
- package/assets/plugin/tools/create-order.d.ts +89 -0
- package/assets/plugin/tools/create-order.js +1555 -0
- package/assets/plugin/tools/exit-gate.d.ts +58 -0
- package/assets/plugin/tools/exit-gate.js +162 -0
- package/assets/plugin/tools/fetch-balance.d.ts +5 -0
- package/assets/plugin/tools/fetch-balance.js +4 -0
- package/assets/plugin/tools/fetch-ohlcv.d.ts +11 -0
- package/assets/plugin/tools/fetch-ohlcv.js +8 -0
- package/assets/plugin/tools/fetch-open-orders.d.ts +7 -0
- package/assets/plugin/tools/fetch-open-orders.js +4 -0
- package/assets/plugin/tools/fetch-positions.d.ts +7 -0
- package/assets/plugin/tools/fetch-positions.js +4 -0
- package/assets/plugin/tools/fetch-ticker.d.ts +11 -0
- package/assets/plugin/tools/fetch-ticker.js +5 -0
- package/assets/plugin/tools/get-agent-profile.d.ts +4 -0
- package/assets/plugin/tools/get-agent-profile.js +6 -0
- package/assets/plugin/tools/get-analytics.d.ts +6 -0
- package/assets/plugin/tools/get-analytics.js +7 -0
- package/assets/plugin/tools/get-backtest.d.ts +12 -0
- package/assets/plugin/tools/get-backtest.js +91 -0
- package/assets/plugin/tools/get-basis.d.ts +7 -0
- package/assets/plugin/tools/get-basis.js +7 -0
- package/assets/plugin/tools/get-bracket-config.d.ts +11 -0
- package/assets/plugin/tools/get-bracket-config.js +24 -0
- package/assets/plugin/tools/get-cascade-risk.d.ts +7 -0
- package/assets/plugin/tools/get-cascade-risk.js +8 -0
- package/assets/plugin/tools/get-crypto-metrics.d.ts +18 -0
- package/assets/plugin/tools/get-crypto-metrics.js +62 -0
- package/assets/plugin/tools/get-cvd.d.ts +6 -0
- package/assets/plugin/tools/get-cvd.js +6 -0
- package/assets/plugin/tools/get-divergences.d.ts +6 -0
- package/assets/plugin/tools/get-divergences.js +6 -0
- package/assets/plugin/tools/get-funding-context.d.ts +6 -0
- package/assets/plugin/tools/get-funding-context.js +16 -0
- package/assets/plugin/tools/get-liquidation-levels.d.ts +7 -0
- package/assets/plugin/tools/get-liquidation-levels.js +7 -0
- package/assets/plugin/tools/get-liquidation-pulse.d.ts +9 -0
- package/assets/plugin/tools/get-liquidation-pulse.js +22 -0
- package/assets/plugin/tools/get-market-breadth.d.ts +6 -0
- package/assets/plugin/tools/get-market-breadth.js +8 -0
- package/assets/plugin/tools/get-market-intel.d.ts +19 -0
- package/assets/plugin/tools/get-market-intel.js +116 -0
- package/assets/plugin/tools/get-market-structure.d.ts +47 -0
- package/assets/plugin/tools/get-market-structure.js +198 -0
- package/assets/plugin/tools/get-my-mined-patterns.d.ts +20 -0
- package/assets/plugin/tools/get-my-mined-patterns.js +61 -0
- package/assets/plugin/tools/get-my-proposed-learnings.d.ts +20 -0
- package/assets/plugin/tools/get-my-proposed-learnings.js +55 -0
- package/assets/plugin/tools/get-my-recent-reviews.d.ts +22 -0
- package/assets/plugin/tools/get-my-recent-reviews.js +66 -0
- package/assets/plugin/tools/get-orderbook.d.ts +21 -0
- package/assets/plugin/tools/get-orderbook.js +32 -0
- package/assets/plugin/tools/get-pattern-scan.d.ts +7 -0
- package/assets/plugin/tools/get-pattern-scan.js +8 -0
- package/assets/plugin/tools/get-regime.d.ts +6 -0
- package/assets/plugin/tools/get-regime.js +7 -0
- package/assets/plugin/tools/get-relevant-learnings.d.ts +21 -0
- package/assets/plugin/tools/get-relevant-learnings.js +65 -0
- package/assets/plugin/tools/get-resting-liquidity.d.ts +6 -0
- package/assets/plugin/tools/get-resting-liquidity.js +11 -0
- package/assets/plugin/tools/get-risk-scenario.d.ts +29 -0
- package/assets/plugin/tools/get-risk-scenario.js +47 -0
- package/assets/plugin/tools/get-risk-summary.d.ts +51 -0
- package/assets/plugin/tools/get-risk-summary.js +118 -0
- package/assets/plugin/tools/get-sentiment.d.ts +4 -0
- package/assets/plugin/tools/get-sentiment.js +6 -0
- package/assets/plugin/tools/get-session-review.d.ts +7 -0
- package/assets/plugin/tools/get-session-review.js +8 -0
- package/assets/plugin/tools/get-setup-detail.d.ts +7 -0
- package/assets/plugin/tools/get-setup-detail.js +322 -0
- package/assets/plugin/tools/get-signals.d.ts +15 -0
- package/assets/plugin/tools/get-signals.js +54 -0
- package/assets/plugin/tools/get-sizing.d.ts +6 -0
- package/assets/plugin/tools/get-sizing.js +6 -0
- package/assets/plugin/tools/get-trade-feedback.d.ts +7 -0
- package/assets/plugin/tools/get-trade-feedback.js +8 -0
- package/assets/plugin/tools/get-trade-flow.d.ts +7 -0
- package/assets/plugin/tools/get-trade-flow.js +7 -0
- package/assets/plugin/tools/get-volume-analysis.d.ts +21 -0
- package/assets/plugin/tools/get-volume-analysis.js +74 -0
- package/assets/plugin/tools/get-volume-profile.d.ts +7 -0
- package/assets/plugin/tools/get-volume-profile.js +7 -0
- package/assets/plugin/tools/get-wave9-status.d.ts +127 -0
- package/assets/plugin/tools/get-wave9-status.js +796 -0
- package/assets/plugin/tools/helpers.d.ts +26 -0
- package/assets/plugin/tools/helpers.js +39 -0
- package/assets/plugin/tools/intel-api.d.ts +34 -0
- package/assets/plugin/tools/intel-api.js +119 -0
- package/assets/plugin/tools/intel-cache.d.ts +25 -0
- package/assets/plugin/tools/intel-cache.js +148 -0
- package/assets/plugin/tools/list-strategies.d.ts +17 -0
- package/assets/plugin/tools/list-strategies.js +23 -0
- package/assets/plugin/tools/modify-stop.d.ts +21 -0
- package/assets/plugin/tools/modify-stop.js +120 -0
- package/assets/plugin/tools/modify-target.d.ts +21 -0
- package/assets/plugin/tools/modify-target.js +110 -0
- package/assets/plugin/tools/propose-learning.d.ts +22 -0
- package/assets/plugin/tools/propose-learning.js +65 -0
- package/assets/plugin/tools/query-review-outcomes.d.ts +30 -0
- package/assets/plugin/tools/query-review-outcomes.js +64 -0
- package/assets/plugin/tools/query-trades.d.ts +21 -0
- package/assets/plugin/tools/query-trades.js +37 -0
- package/assets/plugin/tools/record-position-reviews.d.ts +38 -0
- package/assets/plugin/tools/record-position-reviews.js +147 -0
- package/assets/plugin/tools/save-strategy.d.ts +16 -0
- package/assets/plugin/tools/save-strategy.js +46 -0
- package/assets/plugin/tools/scan-pairs.d.ts +22 -0
- package/assets/plugin/tools/scan-pairs.js +234 -0
- package/assets/plugin/tools/score-setup.d.ts +31 -0
- package/assets/plugin/tools/score-setup.js +268 -0
- package/assets/plugin/tools/set-bracket-requirement.d.ts +18 -0
- package/assets/plugin/tools/set-bracket-requirement.js +81 -0
- package/assets/plugin/tools/set-exchange-credentials.d.ts +25 -0
- package/assets/plugin/tools/set-exchange-credentials.js +80 -0
- package/assets/plugin/tools/set-trading-mode.d.ts +26 -0
- package/assets/plugin/tools/set-trading-mode.js +152 -0
- package/assets/plugin/tools/test-exchange-credentials.d.ts +16 -0
- package/assets/plugin/tools/test-exchange-credentials.js +100 -0
- package/assets/plugin/tools/toggle-strategy.d.ts +8 -0
- package/assets/plugin/tools/toggle-strategy.js +15 -0
- package/assets/plugin/trading-params-cache.d.ts +26 -0
- package/assets/plugin/trading-params-cache.js +52 -0
- package/assets/plugin/types.d.ts +134 -0
- package/assets/plugin/types.js +7 -0
- package/assets/plugin/util/plugin-paths.d.ts +3 -0
- package/assets/plugin/util/plugin-paths.js +15 -0
- package/assets/plugin/venues/hyperliquid/hl-balance.d.ts +116 -0
- package/assets/plugin/venues/hyperliquid/hl-balance.js +145 -0
- package/assets/plugin/venues/hyperliquid/hl-bracket-coordinator.d.ts +123 -0
- package/assets/plugin/venues/hyperliquid/hl-bracket-coordinator.js +533 -0
- package/assets/plugin/venues/hyperliquid/hl-brackets.d.ts +102 -0
- package/assets/plugin/venues/hyperliquid/hl-brackets.js +172 -0
- package/assets/plugin/venues/hyperliquid/hl-cloid.d.ts +22 -0
- package/assets/plugin/venues/hyperliquid/hl-cloid.js +82 -0
- package/assets/plugin/venues/hyperliquid/hl-info-cache.d.ts +46 -0
- package/assets/plugin/venues/hyperliquid/hl-info-cache.js +125 -0
- package/assets/plugin/venues/hyperliquid/hl-live-adapter.d.ts +146 -0
- package/assets/plugin/venues/hyperliquid/hl-live-adapter.js +728 -0
- package/assets/plugin/venues/hyperliquid/hl-precision.d.ts +61 -0
- package/assets/plugin/venues/hyperliquid/hl-precision.js +176 -0
- package/assets/plugin/venues/hyperliquid/hl-private.d.ts +88 -0
- package/assets/plugin/venues/hyperliquid/hl-private.js +357 -0
- package/assets/plugin/venues/hyperliquid/hl-public.d.ts +79 -0
- package/assets/plugin/venues/hyperliquid/hl-public.js +436 -0
- package/assets/plugin/venues/hyperliquid/hl-rate-gate.d.ts +57 -0
- package/assets/plugin/venues/hyperliquid/hl-rate-gate.js +220 -0
- package/assets/plugin/venues/hyperliquid/hl-user-stream.d.ts +90 -0
- package/assets/plugin/venues/hyperliquid/hl-user-stream.js +220 -0
- package/assets/plugin/venues/registry.d.ts +38 -0
- package/assets/plugin/venues/registry.js +46 -0
- package/assets/plugin/venues/symbols.d.ts +43 -0
- package/assets/plugin/venues/symbols.js +107 -0
- package/assets/plugin/wave9/live-account-capture.d.ts +67 -0
- package/assets/plugin/wave9/live-account-capture.js +435 -0
- package/assets/plugin/wave9/live-autonomous-protection.d.ts +39 -0
- package/assets/plugin/wave9/live-autonomous-protection.js +112 -0
- package/assets/plugin/wave9/live-durable-reconciliation-scheduler.d.ts +33 -0
- package/assets/plugin/wave9/live-durable-reconciliation-scheduler.js +115 -0
- package/assets/plugin/wave9/live-execution-ledger.d.ts +107 -0
- package/assets/plugin/wave9/live-execution-ledger.js +498 -0
- package/assets/plugin/wave9/live-position-confirmation.d.ts +18 -0
- package/assets/plugin/wave9/live-position-confirmation.js +111 -0
- package/assets/plugin/wave9/live-residual-protection.d.ts +18 -0
- package/assets/plugin/wave9/live-residual-protection.js +250 -0
- package/assets/plugin/wave9/live-startup-reconciliation.d.ts +38 -0
- package/assets/plugin/wave9/live-startup-reconciliation.js +454 -0
- package/assets/plugin/wave9/live-symbol-ownership.d.ts +20 -0
- package/assets/plugin/wave9/live-symbol-ownership.js +132 -0
- package/assets/plugin/wave9/paper-admission-guard.d.ts +199 -0
- package/assets/plugin/wave9/paper-admission-guard.js +650 -0
- package/assets/plugin/wave9/usdm-evidence-provider.d.ts +42 -0
- package/assets/plugin/wave9/usdm-evidence-provider.js +133 -0
- package/dist/plugin.js +24 -15
- package/package.json +1 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Agent-config poller — boots the ToolGate from central config and keeps it
|
|
2
|
+
// fresh (docs/TOOL_DISTRIBUTION_ARCHITECTURE.md §5b).
|
|
3
|
+
//
|
|
4
|
+
// Boot: fetch → valid + version-acceptable → apply + write cache
|
|
5
|
+
// fetch fails → last-known-good cache file → apply
|
|
6
|
+
// nothing → hardcoded safe default (nothing disabled)
|
|
7
|
+
// Runtime: re-poll every RC_AGENT_CONFIG_POLL_MS (default 60s). Every failed
|
|
8
|
+
// poll is a keep-last-known-good no-op. Version-lower responses are
|
|
9
|
+
// rejected (rollback guard). The interval is unref()'d so it never
|
|
10
|
+
// holds the process open at shutdown.
|
|
11
|
+
//
|
|
12
|
+
// No token → the poller does not start at all: the gate stays empty (all
|
|
13
|
+
// tools on), byte-identical to pre-feature behavior. A module-level singleton
|
|
14
|
+
// guard mirrors `pluginInitialised` in index.ts — OpenClaw calls register()
|
|
15
|
+
// multiple times per process and we must never spawn a second timer.
|
|
16
|
+
import { defaultAgentConfig, fetchAgentConfig, isAcceptableVersion, readCachedConfig, writeCachedConfig, } from './agent-config-client.js';
|
|
17
|
+
import { logger } from '../logger.js';
|
|
18
|
+
const TAG = 'agent-config';
|
|
19
|
+
const DEFAULT_POLL_MS = 60_000;
|
|
20
|
+
const MIN_POLL_MS = 5_000;
|
|
21
|
+
export function resolvePollIntervalMs() {
|
|
22
|
+
const raw = Number(process.env.RC_AGENT_CONFIG_POLL_MS);
|
|
23
|
+
if (!Number.isFinite(raw) || raw <= 0)
|
|
24
|
+
return DEFAULT_POLL_MS;
|
|
25
|
+
return Math.max(MIN_POLL_MS, raw);
|
|
26
|
+
}
|
|
27
|
+
let pollerStarted = false;
|
|
28
|
+
/** Test-only — allows the singleton guard to be reset between unit tests. */
|
|
29
|
+
export function __resetPollerSingleton() {
|
|
30
|
+
pollerStarted = false;
|
|
31
|
+
}
|
|
32
|
+
export function startAgentConfigPoller(opts) {
|
|
33
|
+
const noop = {
|
|
34
|
+
stop: () => { },
|
|
35
|
+
getCurrent: () => defaultAgentConfig(),
|
|
36
|
+
};
|
|
37
|
+
if (pollerStarted) {
|
|
38
|
+
logger.warn(TAG, 'poller already started — ignoring duplicate start');
|
|
39
|
+
return noop;
|
|
40
|
+
}
|
|
41
|
+
if (!opts.token || !opts.token.trim()) {
|
|
42
|
+
logger.info(TAG, 'no connection token — central tool config disabled, all tools enabled (safe default)');
|
|
43
|
+
return noop;
|
|
44
|
+
}
|
|
45
|
+
pollerStarted = true;
|
|
46
|
+
const intervalMs = opts.intervalMs ?? resolvePollIntervalMs();
|
|
47
|
+
let current = defaultAgentConfig();
|
|
48
|
+
let loggedFetchFailure = false;
|
|
49
|
+
const applyIfAcceptable = (fetched, source) => {
|
|
50
|
+
if (!isAcceptableVersion(fetched, current)) {
|
|
51
|
+
logger.warn(TAG, `rejected ${source} config v${fetched.version} < applied v${current.version} (rollback guard)`);
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
current = fetched;
|
|
55
|
+
opts.gate.apply(fetched);
|
|
56
|
+
opts.gateStore?.apply(fetched.gates);
|
|
57
|
+
opts.entitlementGate?.apply(fetched.entitlement);
|
|
58
|
+
return true;
|
|
59
|
+
};
|
|
60
|
+
const poll = async (isBoot) => {
|
|
61
|
+
const fetched = await fetchAgentConfig({
|
|
62
|
+
apiBaseUrl: opts.apiBaseUrl,
|
|
63
|
+
token: opts.token,
|
|
64
|
+
fetchImpl: opts.fetchImpl,
|
|
65
|
+
});
|
|
66
|
+
if (fetched) {
|
|
67
|
+
loggedFetchFailure = false;
|
|
68
|
+
if (applyIfAcceptable(fetched, 'network')) {
|
|
69
|
+
writeCachedConfig(fetched, opts.cachePath);
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (isBoot) {
|
|
74
|
+
// Network unavailable at boot — fall back to the last-known-good cache.
|
|
75
|
+
const cached = readCachedConfig(opts.cachePath);
|
|
76
|
+
if (cached) {
|
|
77
|
+
logger.info(TAG, `boot fetch failed — applying last-known-good cache v${cached.version}`);
|
|
78
|
+
applyIfAcceptable(cached, 'cache');
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
logger.info(TAG, 'boot fetch failed, no cache — safe defaults (all tools enabled)');
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Runtime failure: keep last-known-good silently (log once per outage).
|
|
86
|
+
if (!loggedFetchFailure) {
|
|
87
|
+
loggedFetchFailure = true;
|
|
88
|
+
logger.warn(TAG, `config poll failed — keeping last-known-good v${current.version}`);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
void poll(true);
|
|
92
|
+
const timer = setInterval(() => {
|
|
93
|
+
void poll(false);
|
|
94
|
+
}, intervalMs);
|
|
95
|
+
timer.unref();
|
|
96
|
+
logger.info(TAG, `poller started (interval ${Math.round(intervalMs / 1000)}s)`);
|
|
97
|
+
return {
|
|
98
|
+
stop: () => clearInterval(timer),
|
|
99
|
+
getCurrent: () => current,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type PluginConfigFile } from './plugin-config-io.js';
|
|
2
|
+
export type BracketMode = 'off' | 'observe' | 'enforce';
|
|
3
|
+
/** Read bracket mode from a config object. Invalid values fall back to 'off'. */
|
|
4
|
+
export declare function getBracketMode(config?: PluginConfigFile, remoteOverride?: BracketMode): BracketMode;
|
|
5
|
+
/** Convenience: load from disk and return the effective mode. */
|
|
6
|
+
export declare function loadBracketMode(): BracketMode;
|
|
7
|
+
/** Is the feature enabled at all (observe or enforce)? */
|
|
8
|
+
export declare function bracketsEnabled(mode: BracketMode): boolean;
|
|
9
|
+
/** Should the stop-watcher still run alongside brackets? Only 'enforce' turns it off for live. */
|
|
10
|
+
export declare function stopWatcherActiveInLive(mode: BracketMode): boolean;
|
|
11
|
+
/** Per-side requirement flags. Default both true — operator can untick
|
|
12
|
+
* individually from the Trading Parameters panel to accept the documented
|
|
13
|
+
* risk. Read alongside the bracket mode so a single config read covers
|
|
14
|
+
* everything the pre-trade gate needs. */
|
|
15
|
+
export interface BracketRequirements {
|
|
16
|
+
requireStopLoss: boolean;
|
|
17
|
+
requireTakeProfit: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function getBracketRequirements(config?: PluginConfigFile): BracketRequirements;
|
|
20
|
+
/** Convenience loader. Returns defaults on a missing/corrupt file — same
|
|
21
|
+
* policy as loadBracketMode: don't gate trading on a corrupt flag read. */
|
|
22
|
+
export declare function loadBracketRequirements(): BracketRequirements;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Feature flag reader for the bracket-orders system.
|
|
2
|
+
//
|
|
3
|
+
// Ordering of sources (first hit wins):
|
|
4
|
+
// 1. Remote override from intelligence (set via admin dashboard OTA) — stored
|
|
5
|
+
// in memory on the plugin after push; not persisted to plugin-config.json.
|
|
6
|
+
// Wired in Phase 2; for Phase 1 this is always undefined.
|
|
7
|
+
// 2. Local plugin-config.json `brackets.mode` field.
|
|
8
|
+
// 3. Default: 'off' (legacy stop-watcher remains authoritative).
|
|
9
|
+
import { readPluginConfig } from './plugin-config-io.js';
|
|
10
|
+
const VALID = new Set(['off', 'observe', 'enforce']);
|
|
11
|
+
/** Read bracket mode from a config object. Invalid values fall back to 'off'. */
|
|
12
|
+
export function getBracketMode(config, remoteOverride) {
|
|
13
|
+
if (remoteOverride && VALID.has(remoteOverride))
|
|
14
|
+
return remoteOverride;
|
|
15
|
+
const raw = config?.brackets?.mode;
|
|
16
|
+
if (typeof raw === 'string' && VALID.has(raw)) {
|
|
17
|
+
return raw;
|
|
18
|
+
}
|
|
19
|
+
return 'off';
|
|
20
|
+
}
|
|
21
|
+
/** Convenience: load from disk and return the effective mode. */
|
|
22
|
+
export function loadBracketMode() {
|
|
23
|
+
try {
|
|
24
|
+
return getBracketMode(readPluginConfig());
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// If plugin-config.json is malformed, we deliberately default to 'off'
|
|
28
|
+
// rather than throw — other subsystems will alert; trading should not
|
|
29
|
+
// be gated on bracket-mode reading a corrupt file.
|
|
30
|
+
return 'off';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Is the feature enabled at all (observe or enforce)? */
|
|
34
|
+
export function bracketsEnabled(mode) {
|
|
35
|
+
return mode !== 'off';
|
|
36
|
+
}
|
|
37
|
+
/** Should the stop-watcher still run alongside brackets? Only 'enforce' turns it off for live. */
|
|
38
|
+
export function stopWatcherActiveInLive(mode) {
|
|
39
|
+
return mode !== 'enforce';
|
|
40
|
+
}
|
|
41
|
+
export function getBracketRequirements(config) {
|
|
42
|
+
const b = config?.brackets;
|
|
43
|
+
return {
|
|
44
|
+
// Explicit `false` turns off; anything else (undefined, true, junk) stays on.
|
|
45
|
+
requireStopLoss: b?.requireStopLoss !== false,
|
|
46
|
+
requireTakeProfit: b?.requireTakeProfit !== false,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Convenience loader. Returns defaults on a missing/corrupt file — same
|
|
50
|
+
* policy as loadBracketMode: don't gate trading on a corrupt flag read. */
|
|
51
|
+
export function loadBracketRequirements() {
|
|
52
|
+
try {
|
|
53
|
+
return getBracketRequirements(readPluginConfig());
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return { requireStopLoss: true, requireTakeProfit: true };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { AgentEntitlement } from './agent-config-client.js';
|
|
2
|
+
/** The ONLY tools an expired entitlement may pause. Deliberately a denylist
|
|
3
|
+
* (not "everything except safety"): a tool added tomorrow is un-gated by
|
|
4
|
+
* default, which is the conservative failure mode in a trading product.
|
|
5
|
+
* Intel/data tools are NOT here — the intelligence service and webapp 403
|
|
6
|
+
* those server-side with the same actionable message. */
|
|
7
|
+
export declare const ENTITLEMENT_GATED_TOOLS: ReadonlySet<string>;
|
|
8
|
+
export type EntitlementGateMode = 'enforce' | 'shadow' | 'off';
|
|
9
|
+
export declare function resolveEntitlementGateMode(): EntitlementGateMode;
|
|
10
|
+
/** Structured, agent-visible result for a blocked call. Worded so the agent
|
|
11
|
+
* stops cleanly (no retry loop), keeps managing the existing book, and tells
|
|
12
|
+
* the operator exactly how to restore service. */
|
|
13
|
+
export declare function entitlementBlockedResult(name: string): {
|
|
14
|
+
ok: false;
|
|
15
|
+
error: 'entitlement_expired';
|
|
16
|
+
tool: string;
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
/** Minimal structural view of a registered plugin tool — same shape as
|
|
20
|
+
* tool-gate.ts GateablePluginTool (kept local to avoid a cross-module type
|
|
21
|
+
* dependency for one interface). */
|
|
22
|
+
export interface EntitlementGateableTool {
|
|
23
|
+
name: string;
|
|
24
|
+
execute: (...args: any[]) => any;
|
|
25
|
+
}
|
|
26
|
+
export declare class EntitlementGate {
|
|
27
|
+
private readonly mode;
|
|
28
|
+
private entitlement;
|
|
29
|
+
/** Avoids log spam: one line per state transition, not per blocked call. */
|
|
30
|
+
private lastLoggedKey;
|
|
31
|
+
constructor(mode?: EntitlementGateMode);
|
|
32
|
+
getMode(): EntitlementGateMode;
|
|
33
|
+
getEntitlement(): AgentEntitlement | undefined;
|
|
34
|
+
/** Apply the entitlement slice of a validated config (poller path).
|
|
35
|
+
* `undefined` (server omitted it / validation dropped it) CLEARS the held
|
|
36
|
+
* verdict — the gate then fails open rather than enforcing a stale one
|
|
37
|
+
* the server no longer asserts. */
|
|
38
|
+
apply(entitlement: AgentEntitlement | undefined): void;
|
|
39
|
+
/** Should this call be blocked? Non-gated names short-circuit FIRST (the
|
|
40
|
+
* safety set can never be touched, in any mode, with any payload); then
|
|
41
|
+
* only an explicit server verdict of paidAccess=false blocks. */
|
|
42
|
+
isBlocked(name: string): boolean;
|
|
43
|
+
/** Wrap a tool's execute with the gate check — same hot-apply pattern as
|
|
44
|
+
* ToolGate.wrapTool (state is consulted per call, not at registration). */
|
|
45
|
+
wrapTool<T extends EntitlementGateableTool>(tool: T, jsonResult: (data: unknown) => unknown): T;
|
|
46
|
+
/** Test-only. */
|
|
47
|
+
__reset(): void;
|
|
48
|
+
}
|
|
49
|
+
/** Module singleton — one gate per plugin process, shared by the poller
|
|
50
|
+
* (writer) and the tool-wrap in index.ts (consumer), mirroring gateStore. */
|
|
51
|
+
export declare const entitlementGate: EntitlementGate;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// EntitlementGate — the plugin-side enforcement point for account-level
|
|
2
|
+
// (billing) restrictions: when the server-resolved entitlement says the user
|
|
3
|
+
// has no paid access (trial expired past its end, subscription lapsed past
|
|
4
|
+
// the 7-day grace), NEW ENTRIES pause. Everything else keeps working.
|
|
5
|
+
//
|
|
6
|
+
// ★ SAFETY ANALYSIS (why this can never add risk to an existing book):
|
|
7
|
+
// the gate blocks ONLY the names in ENTITLEMENT_GATED_TOOLS — today exactly
|
|
8
|
+
// `create_order`, the one tool that ADDS risk and the one thing our servers
|
|
9
|
+
// cannot 403 (it goes plugin → Binance directly). Every risk-REDUCING and
|
|
10
|
+
// safety path (close_position, modify_stop, attach_brackets,
|
|
11
|
+
// audit_bracket_protection, record_position_reviews, the operator-control
|
|
12
|
+
// tools, kill/flatten/pause via the skill) is untouched by construction: it
|
|
13
|
+
// is not in the gated set, and a pin test asserts the set can never grow into
|
|
14
|
+
// the safety floor. This mirrors what an auto-pause on loss limits already
|
|
15
|
+
// does (no new entries, existing positions fully manageable) — an operation
|
|
16
|
+
// the product already considers safe.
|
|
17
|
+
//
|
|
18
|
+
// ★ THREAT MODEL HONESTY: the plugin runs on the trader's own hardware, so
|
|
19
|
+
// this gate is the COURTESY layer — it makes the agent stop cleanly with an
|
|
20
|
+
// actionable message instead of burning failed calls. The HARD enforcement is
|
|
21
|
+
// server-side: webapp Pro routes and the intelligence API both 403 on
|
|
22
|
+
// paidAccess=false, which removes the data the agent trades on.
|
|
23
|
+
//
|
|
24
|
+
// Fail direction: no entitlement data (older webapp, outage, garbage payload,
|
|
25
|
+
// no token) → ALLOW. Billing enforcement must never brick a paying customer
|
|
26
|
+
// because our config channel hiccuped; last-known-good semantics come from
|
|
27
|
+
// the agent-config cache like every other centrally-delivered value.
|
|
28
|
+
//
|
|
29
|
+
// Kill-switch: RC_ENTITLEMENT_GATE=off (never blocks) | shadow (log-only)
|
|
30
|
+
// | default enforce — same convention as RC_TOOL_GATE / RC_CENTRAL_GATES.
|
|
31
|
+
import { logger } from '../logger.js';
|
|
32
|
+
const TAG = 'entitlement-gate';
|
|
33
|
+
/** The ONLY tools an expired entitlement may pause. Deliberately a denylist
|
|
34
|
+
* (not "everything except safety"): a tool added tomorrow is un-gated by
|
|
35
|
+
* default, which is the conservative failure mode in a trading product.
|
|
36
|
+
* Intel/data tools are NOT here — the intelligence service and webapp 403
|
|
37
|
+
* those server-side with the same actionable message. */
|
|
38
|
+
export const ENTITLEMENT_GATED_TOOLS = new Set(['create_order']);
|
|
39
|
+
export function resolveEntitlementGateMode() {
|
|
40
|
+
const raw = (process.env.RC_ENTITLEMENT_GATE ?? '').toLowerCase();
|
|
41
|
+
if (raw === 'off')
|
|
42
|
+
return 'off';
|
|
43
|
+
if (raw === 'shadow')
|
|
44
|
+
return 'shadow';
|
|
45
|
+
return 'enforce';
|
|
46
|
+
}
|
|
47
|
+
/** Structured, agent-visible result for a blocked call. Worded so the agent
|
|
48
|
+
* stops cleanly (no retry loop), keeps managing the existing book, and tells
|
|
49
|
+
* the operator exactly how to restore service. */
|
|
50
|
+
export function entitlementBlockedResult(name) {
|
|
51
|
+
return {
|
|
52
|
+
ok: false,
|
|
53
|
+
error: 'entitlement_expired',
|
|
54
|
+
tool: name,
|
|
55
|
+
message: `New entries are paused: the ReefClaw subscription for this connection has expired ` +
|
|
56
|
+
`(trial ended or payment lapsed). Do not retry this call. Existing positions remain fully ` +
|
|
57
|
+
`manageable — close_position, modify_stop, attach_brackets, and all emergency/operator ` +
|
|
58
|
+
`controls work normally, and protective brackets stay enforced by the exchange. ` +
|
|
59
|
+
`Tell your operator to renew at https://reefclaw.com (Settings → Billing) to resume trading.`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export class EntitlementGate {
|
|
63
|
+
mode;
|
|
64
|
+
entitlement;
|
|
65
|
+
/** Avoids log spam: one line per state transition, not per blocked call. */
|
|
66
|
+
lastLoggedKey = '';
|
|
67
|
+
constructor(mode = resolveEntitlementGateMode()) {
|
|
68
|
+
this.mode = mode;
|
|
69
|
+
if (mode !== 'enforce')
|
|
70
|
+
logger.info(TAG, `mode=${mode}`);
|
|
71
|
+
}
|
|
72
|
+
getMode() {
|
|
73
|
+
return this.mode;
|
|
74
|
+
}
|
|
75
|
+
getEntitlement() {
|
|
76
|
+
return this.entitlement;
|
|
77
|
+
}
|
|
78
|
+
/** Apply the entitlement slice of a validated config (poller path).
|
|
79
|
+
* `undefined` (server omitted it / validation dropped it) CLEARS the held
|
|
80
|
+
* verdict — the gate then fails open rather than enforcing a stale one
|
|
81
|
+
* the server no longer asserts. */
|
|
82
|
+
apply(entitlement) {
|
|
83
|
+
const key = entitlement ? `${entitlement.state}:${entitlement.paidAccess}` : '(none)';
|
|
84
|
+
if (key !== this.lastLoggedKey) {
|
|
85
|
+
this.lastLoggedKey = key;
|
|
86
|
+
logger.info(TAG, entitlement
|
|
87
|
+
? `entitlement: state=${entitlement.state} paidAccess=${entitlement.paidAccess}` +
|
|
88
|
+
(entitlement.graceUntil ? ` graceUntil=${entitlement.graceUntil}` : '')
|
|
89
|
+
: 'entitlement: no server verdict — gate inactive (fail-open)');
|
|
90
|
+
}
|
|
91
|
+
this.entitlement = entitlement;
|
|
92
|
+
}
|
|
93
|
+
/** Should this call be blocked? Non-gated names short-circuit FIRST (the
|
|
94
|
+
* safety set can never be touched, in any mode, with any payload); then
|
|
95
|
+
* only an explicit server verdict of paidAccess=false blocks. */
|
|
96
|
+
isBlocked(name) {
|
|
97
|
+
if (this.mode === 'off')
|
|
98
|
+
return false;
|
|
99
|
+
if (!ENTITLEMENT_GATED_TOOLS.has(name))
|
|
100
|
+
return false;
|
|
101
|
+
if (!this.entitlement)
|
|
102
|
+
return false; // unknown → allow
|
|
103
|
+
if (this.entitlement.paidAccess !== false)
|
|
104
|
+
return false;
|
|
105
|
+
if (this.mode === 'shadow') {
|
|
106
|
+
logger.info(TAG, `SHADOW: would block ${name} (state=${this.entitlement.state})`);
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
/** Wrap a tool's execute with the gate check — same hot-apply pattern as
|
|
112
|
+
* ToolGate.wrapTool (state is consulted per call, not at registration). */
|
|
113
|
+
wrapTool(tool, jsonResult) {
|
|
114
|
+
if (!ENTITLEMENT_GATED_TOOLS.has(tool.name))
|
|
115
|
+
return tool;
|
|
116
|
+
const originalExecute = tool.execute.bind(tool);
|
|
117
|
+
return {
|
|
118
|
+
...tool,
|
|
119
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
120
|
+
execute: (...args) => {
|
|
121
|
+
if (this.isBlocked(tool.name)) {
|
|
122
|
+
logger.info(TAG, `blocked ${tool.name} (entitlement state=${this.entitlement?.state ?? 'unknown'})`);
|
|
123
|
+
return Promise.resolve(jsonResult(entitlementBlockedResult(tool.name)));
|
|
124
|
+
}
|
|
125
|
+
return originalExecute(...args);
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/** Test-only. */
|
|
130
|
+
__reset() {
|
|
131
|
+
this.entitlement = undefined;
|
|
132
|
+
this.lastLoggedKey = '';
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Module singleton — one gate per plugin process, shared by the poller
|
|
136
|
+
* (writer) and the tool-wrap in index.ts (consumer), mirroring gateStore. */
|
|
137
|
+
export const entitlementGate = new EntitlementGate();
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AgentGates } from './agent-config-client.js';
|
|
2
|
+
declare class GateStore {
|
|
3
|
+
private gates;
|
|
4
|
+
/** Apply a validated gates object (poller path). Logs only on change. */
|
|
5
|
+
apply(gates: AgentGates): void;
|
|
6
|
+
/** The central exitGate mode, or null when central has no value (or the
|
|
7
|
+
* kill-switch is on) — null tells the reader to fall back to the file. */
|
|
8
|
+
getExitGate(): AgentGates['exitGate'] | null;
|
|
9
|
+
/** The central positionReview.mode, or null when central has no value (or the
|
|
10
|
+
* kill-switch is on) — null tells the reader to fall back to the file. */
|
|
11
|
+
getPositionReviewMode(): AgentGates['positionReviewMode'] | null;
|
|
12
|
+
/** Test-only. */
|
|
13
|
+
__reset(): void;
|
|
14
|
+
}
|
|
15
|
+
/** Module singleton — one store per plugin process, shared by the poller
|
|
16
|
+
* (writer) and the config readers (consumers). */
|
|
17
|
+
export declare const gateStore: GateStore;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// GateStore — the plugin-side holder for centrally-delivered operational-gate
|
|
2
|
+
// values (TOOL_DISTRIBUTION_ARCHITECTURE.md §11 step 3; slice 2 = exitGate,
|
|
3
|
+
// slice 3 = positionReviewMode).
|
|
4
|
+
//
|
|
5
|
+
// The agent-config poller applies each validated config's `gates` here; the
|
|
6
|
+
// per-feature config readers (position-review-config.ts loadExitGateMode +
|
|
7
|
+
// loadPositionReviewMode) consult the store FIRST and fall back to the local
|
|
8
|
+
// plugin-config.json when no central value is present:
|
|
9
|
+
//
|
|
10
|
+
// central (this store) → ~/.reefclaw/plugin-config.json → hardcoded default
|
|
11
|
+
//
|
|
12
|
+
// Values in the store have already passed the plugin-side enum validation in
|
|
13
|
+
// agent-config-client.ts (validateGates) — central can never deliver a value
|
|
14
|
+
// outside a gate's enum (§5b). A config-server outage never lands here either:
|
|
15
|
+
// the poller keeps last-known-good, and with no applied config the store is
|
|
16
|
+
// empty → the local file rules, byte-identical to pre-central behavior.
|
|
17
|
+
//
|
|
18
|
+
// Kill-switch: RC_CENTRAL_GATES=off makes the store report no central values
|
|
19
|
+
// (local file rules again) without a redeploy — same convention as
|
|
20
|
+
// RC_TOOL_GATE for the tool allowlist.
|
|
21
|
+
import { logger } from '../logger.js';
|
|
22
|
+
const TAG = 'gate-store';
|
|
23
|
+
function centralGatesEnabled() {
|
|
24
|
+
return (process.env.RC_CENTRAL_GATES ?? '').toLowerCase() !== 'off';
|
|
25
|
+
}
|
|
26
|
+
const UNSET = '(unset — local config rules)';
|
|
27
|
+
class GateStore {
|
|
28
|
+
gates = {};
|
|
29
|
+
/** Apply a validated gates object (poller path). Logs only on change. */
|
|
30
|
+
apply(gates) {
|
|
31
|
+
const next = gates ?? {};
|
|
32
|
+
const changed = next.exitGate !== this.gates.exitGate ||
|
|
33
|
+
next.positionReviewMode !== this.gates.positionReviewMode;
|
|
34
|
+
this.gates = { ...next };
|
|
35
|
+
if (changed) {
|
|
36
|
+
logger.info(TAG, `applied central gates: exitGate=${next.exitGate ?? UNSET} ` +
|
|
37
|
+
`positionReviewMode=${next.positionReviewMode ?? UNSET}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** The central exitGate mode, or null when central has no value (or the
|
|
41
|
+
* kill-switch is on) — null tells the reader to fall back to the file. */
|
|
42
|
+
getExitGate() {
|
|
43
|
+
if (!centralGatesEnabled())
|
|
44
|
+
return null;
|
|
45
|
+
return this.gates.exitGate ?? null;
|
|
46
|
+
}
|
|
47
|
+
/** The central positionReview.mode, or null when central has no value (or the
|
|
48
|
+
* kill-switch is on) — null tells the reader to fall back to the file. */
|
|
49
|
+
getPositionReviewMode() {
|
|
50
|
+
if (!centralGatesEnabled())
|
|
51
|
+
return null;
|
|
52
|
+
return this.gates.positionReviewMode ?? null;
|
|
53
|
+
}
|
|
54
|
+
/** Test-only. */
|
|
55
|
+
__reset() {
|
|
56
|
+
this.gates = {};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Module singleton — one store per plugin process, shared by the poller
|
|
60
|
+
* (writer) and the config readers (consumers). */
|
|
61
|
+
export const gateStore = new GateStore();
|