@reefclaw/connect 0.1.11 → 0.1.12

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.
Files changed (397) hide show
  1. package/assets/bridge/gateway/heartbeat-cron.d.ts +27 -0
  2. package/assets/bridge/gateway/heartbeat-cron.js +85 -0
  3. package/assets/bridge/providers/gateway.d.ts +2 -0
  4. package/assets/bridge/providers/gateway.js +57 -16
  5. package/assets/bridge/setup.js +6 -51
  6. package/dist/deps.js +2 -2
  7. package/dist/plugin.js +35 -7
  8. package/package.json +1 -1
  9. package/assets/plugin/audit/mode-transition-audit.d.ts +0 -11
  10. package/assets/plugin/audit/mode-transition-audit.js +0 -29
  11. package/assets/plugin/balance-utils.d.ts +0 -36
  12. package/assets/plugin/balance-utils.js +0 -98
  13. package/assets/plugin/ccxt/binance-ban-gate.d.ts +0 -47
  14. package/assets/plugin/ccxt/binance-ban-gate.js +0 -420
  15. package/assets/plugin/ccxt/binance-private.d.ts +0 -346
  16. package/assets/plugin/ccxt/binance-private.js +0 -1525
  17. package/assets/plugin/ccxt/binance-public.d.ts +0 -34
  18. package/assets/plugin/ccxt/binance-public.js +0 -180
  19. package/assets/plugin/ccxt/intel-public.d.ts +0 -25
  20. package/assets/plugin/ccxt/intel-public.js +0 -80
  21. package/assets/plugin/ccxt/public-market-data-api.d.ts +0 -26
  22. package/assets/plugin/ccxt/public-market-data-api.js +0 -23
  23. package/assets/plugin/config/agent-config-client.d.ts +0 -77
  24. package/assets/plugin/config/agent-config-client.js +0 -188
  25. package/assets/plugin/config/agent-config-poller.d.ts +0 -32
  26. package/assets/plugin/config/agent-config-poller.js +0 -101
  27. package/assets/plugin/config/brackets-config.d.ts +0 -22
  28. package/assets/plugin/config/brackets-config.js +0 -58
  29. package/assets/plugin/config/entitlement-gate.d.ts +0 -51
  30. package/assets/plugin/config/entitlement-gate.js +0 -137
  31. package/assets/plugin/config/gate-store.d.ts +0 -18
  32. package/assets/plugin/config/gate-store.js +0 -61
  33. package/assets/plugin/config/plugin-config-io.d.ts +0 -222
  34. package/assets/plugin/config/plugin-config-io.js +0 -126
  35. package/assets/plugin/config/position-review-config.d.ts +0 -35
  36. package/assets/plugin/config/position-review-config.js +0 -105
  37. package/assets/plugin/config/tool-gate.d.ts +0 -53
  38. package/assets/plugin/config/tool-gate.js +0 -128
  39. package/assets/plugin/config/user-data-stream-config.d.ts +0 -89
  40. package/assets/plugin/config/user-data-stream-config.js +0 -239
  41. package/assets/plugin/connector-supervisor.d.ts +0 -36
  42. package/assets/plugin/connector-supervisor.js +0 -149
  43. package/assets/plugin/exchange-adapter.d.ts +0 -65
  44. package/assets/plugin/exchange-adapter.js +0 -4
  45. package/assets/plugin/index.d.ts +0 -30
  46. package/assets/plugin/index.js +0 -2756
  47. package/assets/plugin/ingest/pending-entry-metadata.d.ts +0 -74
  48. package/assets/plugin/ingest/pending-entry-metadata.js +0 -236
  49. package/assets/plugin/ingest/position-auto-capture.d.ts +0 -171
  50. package/assets/plugin/ingest/position-auto-capture.js +0 -709
  51. package/assets/plugin/ingest/position-decisions-client.d.ts +0 -327
  52. package/assets/plugin/ingest/position-decisions-client.js +0 -306
  53. package/assets/plugin/ingest/readiness-reporter.d.ts +0 -42
  54. package/assets/plugin/ingest/readiness-reporter.js +0 -163
  55. package/assets/plugin/ingest/reconcile-db-vs-exchange.d.ts +0 -51
  56. package/assets/plugin/ingest/reconcile-db-vs-exchange.js +0 -170
  57. package/assets/plugin/ingest/reconciler-cleanup.d.ts +0 -37
  58. package/assets/plugin/ingest/reconciler-cleanup.js +0 -147
  59. package/assets/plugin/ingest/rest-gap-filler.d.ts +0 -191
  60. package/assets/plugin/ingest/rest-gap-filler.js +0 -565
  61. package/assets/plugin/ingest/touched-symbols-store.d.ts +0 -25
  62. package/assets/plugin/ingest/touched-symbols-store.js +0 -96
  63. package/assets/plugin/ingest/trade-store-client.d.ts +0 -40
  64. package/assets/plugin/ingest/trade-store-client.js +0 -125
  65. package/assets/plugin/ingest/ws-ingest.d.ts +0 -43
  66. package/assets/plugin/ingest/ws-ingest.js +0 -126
  67. package/assets/plugin/learning/setup-family.d.ts +0 -21
  68. package/assets/plugin/learning/setup-family.js +0 -103
  69. package/assets/plugin/lifecycle/install-signal-handlers.d.ts +0 -33
  70. package/assets/plugin/lifecycle/install-signal-handlers.js +0 -112
  71. package/assets/plugin/lifecycle/shutdown-coordinator.d.ts +0 -43
  72. package/assets/plugin/lifecycle/shutdown-coordinator.js +0 -131
  73. package/assets/plugin/lifecycle/trading-operation-lock.d.ts +0 -17
  74. package/assets/plugin/lifecycle/trading-operation-lock.js +0 -14
  75. package/assets/plugin/live/bracket-id.d.ts +0 -26
  76. package/assets/plugin/live/bracket-id.js +0 -112
  77. package/assets/plugin/live/bracket-ledger.d.ts +0 -54
  78. package/assets/plugin/live/bracket-ledger.js +0 -267
  79. package/assets/plugin/live/bracket-manager.d.ts +0 -82
  80. package/assets/plugin/live/bracket-manager.js +0 -478
  81. package/assets/plugin/live/bracket-params.d.ts +0 -22
  82. package/assets/plugin/live/bracket-params.js +0 -124
  83. package/assets/plugin/live/bracket-reconciler.d.ts +0 -95
  84. package/assets/plugin/live/bracket-reconciler.js +0 -573
  85. package/assets/plugin/live/bracket-types.d.ts +0 -102
  86. package/assets/plugin/live/bracket-types.js +0 -8
  87. package/assets/plugin/live/deposit-tracker.d.ts +0 -62
  88. package/assets/plugin/live/deposit-tracker.js +0 -97
  89. package/assets/plugin/live/emergency-controls.d.ts +0 -32
  90. package/assets/plugin/live/emergency-controls.js +0 -226
  91. package/assets/plugin/live/exchange-errors.d.ts +0 -12
  92. package/assets/plugin/live/exchange-errors.js +0 -130
  93. package/assets/plugin/live/exchange-info-cache.d.ts +0 -37
  94. package/assets/plugin/live/exchange-info-cache.js +0 -134
  95. package/assets/plugin/live/fact-subscriber.d.ts +0 -78
  96. package/assets/plugin/live/fact-subscriber.js +0 -182
  97. package/assets/plugin/live/fill-price.d.ts +0 -13
  98. package/assets/plugin/live/fill-price.js +0 -37
  99. package/assets/plugin/live/intent-journal.d.ts +0 -42
  100. package/assets/plugin/live/intent-journal.js +0 -122
  101. package/assets/plugin/live/listen-key-manager.d.ts +0 -70
  102. package/assets/plugin/live/listen-key-manager.js +0 -169
  103. package/assets/plugin/live/live-adapter.d.ts +0 -319
  104. package/assets/plugin/live/live-adapter.js +0 -1906
  105. package/assets/plugin/live/live-balance-enricher.d.ts +0 -32
  106. package/assets/plugin/live/live-balance-enricher.js +0 -104
  107. package/assets/plugin/live/live-bracket-api.d.ts +0 -13
  108. package/assets/plugin/live/live-bracket-api.js +0 -20
  109. package/assets/plugin/live/live-state-store.d.ts +0 -194
  110. package/assets/plugin/live/live-state-store.js +0 -450
  111. package/assets/plugin/live/local-signal-service.d.ts +0 -57
  112. package/assets/plugin/live/local-signal-service.js +0 -151
  113. package/assets/plugin/live/local-strategy-evaluator.d.ts +0 -62
  114. package/assets/plugin/live/local-strategy-evaluator.js +0 -131
  115. package/assets/plugin/live/microstructure-assembler.d.ts +0 -54
  116. package/assets/plugin/live/microstructure-assembler.js +0 -148
  117. package/assets/plugin/live/order-poller.d.ts +0 -29
  118. package/assets/plugin/live/order-poller.js +0 -125
  119. package/assets/plugin/live/position-state-store.d.ts +0 -87
  120. package/assets/plugin/live/position-state-store.js +0 -237
  121. package/assets/plugin/live/proposal-decision-listener.d.ts +0 -70
  122. package/assets/plugin/live/proposal-decision-listener.js +0 -292
  123. package/assets/plugin/live/proposal-manager.d.ts +0 -76
  124. package/assets/plugin/live/proposal-manager.js +0 -140
  125. package/assets/plugin/live/rate-limiter.d.ts +0 -47
  126. package/assets/plugin/live/rate-limiter.js +0 -159
  127. package/assets/plugin/live/reconciler.d.ts +0 -39
  128. package/assets/plugin/live/reconciler.js +0 -175
  129. package/assets/plugin/live/setup-buckets.d.ts +0 -7
  130. package/assets/plugin/live/setup-buckets.js +0 -33
  131. package/assets/plugin/live/slippage-tracker.d.ts +0 -45
  132. package/assets/plugin/live/slippage-tracker.js +0 -78
  133. package/assets/plugin/live/stop-watcher.d.ts +0 -67
  134. package/assets/plugin/live/stop-watcher.js +0 -218
  135. package/assets/plugin/live/user-data-active-probe.d.ts +0 -54
  136. package/assets/plugin/live/user-data-active-probe.js +0 -180
  137. package/assets/plugin/live/user-data-stream-controller.d.ts +0 -200
  138. package/assets/plugin/live/user-data-stream-controller.js +0 -579
  139. package/assets/plugin/live/user-data-stream-ws.d.ts +0 -22
  140. package/assets/plugin/live/user-data-stream-ws.js +0 -63
  141. package/assets/plugin/live/user-data-stream.d.ts +0 -243
  142. package/assets/plugin/live/user-data-stream.js +0 -704
  143. package/assets/plugin/logger.d.ts +0 -2
  144. package/assets/plugin/logger.js +0 -2
  145. package/assets/plugin/mfe.d.ts +0 -21
  146. package/assets/plugin/mfe.js +0 -68
  147. package/assets/plugin/onboarding/mode-ladder.d.ts +0 -1
  148. package/assets/plugin/onboarding/mode-ladder.js +0 -3
  149. package/assets/plugin/onboarding/runtime.d.ts +0 -90
  150. package/assets/plugin/onboarding/runtime.js +0 -184
  151. package/assets/plugin/openclaw.plugin.json +0 -92
  152. package/assets/plugin/paper-adapter.d.ts +0 -24
  153. package/assets/plugin/paper-adapter.js +0 -91
  154. package/assets/plugin/persistence/state-manager.d.ts +0 -66
  155. package/assets/plugin/persistence/state-manager.js +0 -222
  156. package/assets/plugin/pinned-plan.d.ts +0 -9
  157. package/assets/plugin/pinned-plan.js +0 -23
  158. package/assets/plugin/portfolio/reentry-tracker.d.ts +0 -36
  159. package/assets/plugin/portfolio/reentry-tracker.js +0 -127
  160. package/assets/plugin/portfolio/wave9-admission.d.ts +0 -67
  161. package/assets/plugin/portfolio/wave9-admission.js +0 -262
  162. package/assets/plugin/portfolio/wave9-policy.d.ts +0 -36
  163. package/assets/plugin/portfolio/wave9-policy.js +0 -183
  164. package/assets/plugin/risk/pre-trade-check.d.ts +0 -38
  165. package/assets/plugin/risk/pre-trade-check.js +0 -345
  166. package/assets/plugin/risk/pre-trade-types.d.ts +0 -60
  167. package/assets/plugin/risk/pre-trade-types.js +0 -3
  168. package/assets/plugin/shadow/shadow-tracker.d.ts +0 -36
  169. package/assets/plugin/shadow/shadow-tracker.js +0 -151
  170. package/assets/plugin/shadow/types.d.ts +0 -42
  171. package/assets/plugin/shadow/types.js +0 -20
  172. package/assets/plugin/shared/indicators-extended.d.ts +0 -52
  173. package/assets/plugin/shared/indicators-extended.js +0 -291
  174. package/assets/plugin/shared/indicators.d.ts +0 -15
  175. package/assets/plugin/shared/indicators.js +0 -114
  176. package/assets/plugin/signals/conditions/registry.d.ts +0 -16
  177. package/assets/plugin/signals/conditions/registry.js +0 -1333
  178. package/assets/plugin/signals/conditions/types.d.ts +0 -1
  179. package/assets/plugin/signals/conditions/types.js +0 -4
  180. package/assets/plugin/signals/direction-rules.d.ts +0 -3
  181. package/assets/plugin/signals/direction-rules.js +0 -24
  182. package/assets/plugin/signals/entry-rules.d.ts +0 -6
  183. package/assets/plugin/signals/entry-rules.js +0 -33
  184. package/assets/plugin/signals/serialize-context.d.ts +0 -4
  185. package/assets/plugin/signals/serialize-context.js +0 -39
  186. package/assets/plugin/signals/stop-rules.d.ts +0 -3
  187. package/assets/plugin/signals/stop-rules.js +0 -48
  188. package/assets/plugin/signals/strategy-adapter.d.ts +0 -47
  189. package/assets/plugin/signals/strategy-adapter.js +0 -209
  190. package/assets/plugin/signals/types.d.ts +0 -1
  191. package/assets/plugin/signals/types.js +0 -8
  192. package/assets/plugin/simulator/exchange-simulator.d.ts +0 -105
  193. package/assets/plugin/simulator/exchange-simulator.js +0 -759
  194. package/assets/plugin/simulator/fill-engine.d.ts +0 -53
  195. package/assets/plugin/simulator/fill-engine.js +0 -280
  196. package/assets/plugin/simulator/paper-market-feed.d.ts +0 -26
  197. package/assets/plugin/simulator/paper-market-feed.js +0 -104
  198. package/assets/plugin/simulator/realistic-fills.d.ts +0 -59
  199. package/assets/plugin/simulator/realistic-fills.js +0 -175
  200. package/assets/plugin/simulator/types.d.ts +0 -228
  201. package/assets/plugin/simulator/types.js +0 -43
  202. package/assets/plugin/strategy/builtin-strategies.d.ts +0 -2
  203. package/assets/plugin/strategy/builtin-strategies.js +0 -113
  204. package/assets/plugin/strategy/condition-registry.d.ts +0 -3
  205. package/assets/plugin/strategy/condition-registry.js +0 -153
  206. package/assets/plugin/strategy/evaluator.d.ts +0 -70
  207. package/assets/plugin/strategy/evaluator.js +0 -98
  208. package/assets/plugin/tools/assessment-validation.d.ts +0 -141
  209. package/assets/plugin/tools/assessment-validation.js +0 -473
  210. package/assets/plugin/tools/attach-brackets.d.ts +0 -39
  211. package/assets/plugin/tools/attach-brackets.js +0 -564
  212. package/assets/plugin/tools/audit-bracket-protection.d.ts +0 -49
  213. package/assets/plugin/tools/audit-bracket-protection.js +0 -683
  214. package/assets/plugin/tools/bracket-control.d.ts +0 -12
  215. package/assets/plugin/tools/bracket-control.js +0 -35
  216. package/assets/plugin/tools/cancel-all-orders.d.ts +0 -9
  217. package/assets/plugin/tools/cancel-all-orders.js +0 -8
  218. package/assets/plugin/tools/cancel-order.d.ts +0 -14
  219. package/assets/plugin/tools/cancel-order.js +0 -60
  220. package/assets/plugin/tools/check-position-health.d.ts +0 -46
  221. package/assets/plugin/tools/check-position-health.js +0 -194
  222. package/assets/plugin/tools/clear-exchange-credentials.d.ts +0 -24
  223. package/assets/plugin/tools/clear-exchange-credentials.js +0 -70
  224. package/assets/plugin/tools/close-position.d.ts +0 -45
  225. package/assets/plugin/tools/close-position.js +0 -722
  226. package/assets/plugin/tools/create-order.d.ts +0 -82
  227. package/assets/plugin/tools/create-order.js +0 -1544
  228. package/assets/plugin/tools/exit-gate.d.ts +0 -58
  229. package/assets/plugin/tools/exit-gate.js +0 -162
  230. package/assets/plugin/tools/fetch-balance.d.ts +0 -5
  231. package/assets/plugin/tools/fetch-balance.js +0 -4
  232. package/assets/plugin/tools/fetch-ohlcv.d.ts +0 -11
  233. package/assets/plugin/tools/fetch-ohlcv.js +0 -8
  234. package/assets/plugin/tools/fetch-open-orders.d.ts +0 -7
  235. package/assets/plugin/tools/fetch-open-orders.js +0 -4
  236. package/assets/plugin/tools/fetch-positions.d.ts +0 -7
  237. package/assets/plugin/tools/fetch-positions.js +0 -4
  238. package/assets/plugin/tools/fetch-ticker.d.ts +0 -11
  239. package/assets/plugin/tools/fetch-ticker.js +0 -5
  240. package/assets/plugin/tools/get-agent-profile.d.ts +0 -4
  241. package/assets/plugin/tools/get-agent-profile.js +0 -6
  242. package/assets/plugin/tools/get-analytics.d.ts +0 -6
  243. package/assets/plugin/tools/get-analytics.js +0 -7
  244. package/assets/plugin/tools/get-backtest.d.ts +0 -12
  245. package/assets/plugin/tools/get-backtest.js +0 -91
  246. package/assets/plugin/tools/get-basis.d.ts +0 -7
  247. package/assets/plugin/tools/get-basis.js +0 -7
  248. package/assets/plugin/tools/get-bracket-config.d.ts +0 -11
  249. package/assets/plugin/tools/get-bracket-config.js +0 -24
  250. package/assets/plugin/tools/get-cascade-risk.d.ts +0 -7
  251. package/assets/plugin/tools/get-cascade-risk.js +0 -8
  252. package/assets/plugin/tools/get-crypto-metrics.d.ts +0 -18
  253. package/assets/plugin/tools/get-crypto-metrics.js +0 -62
  254. package/assets/plugin/tools/get-cvd.d.ts +0 -6
  255. package/assets/plugin/tools/get-cvd.js +0 -6
  256. package/assets/plugin/tools/get-divergences.d.ts +0 -6
  257. package/assets/plugin/tools/get-divergences.js +0 -6
  258. package/assets/plugin/tools/get-funding-context.d.ts +0 -6
  259. package/assets/plugin/tools/get-funding-context.js +0 -16
  260. package/assets/plugin/tools/get-liquidation-levels.d.ts +0 -7
  261. package/assets/plugin/tools/get-liquidation-levels.js +0 -7
  262. package/assets/plugin/tools/get-liquidation-pulse.d.ts +0 -9
  263. package/assets/plugin/tools/get-liquidation-pulse.js +0 -22
  264. package/assets/plugin/tools/get-market-breadth.d.ts +0 -6
  265. package/assets/plugin/tools/get-market-breadth.js +0 -8
  266. package/assets/plugin/tools/get-market-intel.d.ts +0 -19
  267. package/assets/plugin/tools/get-market-intel.js +0 -116
  268. package/assets/plugin/tools/get-market-structure.d.ts +0 -47
  269. package/assets/plugin/tools/get-market-structure.js +0 -198
  270. package/assets/plugin/tools/get-my-mined-patterns.d.ts +0 -20
  271. package/assets/plugin/tools/get-my-mined-patterns.js +0 -61
  272. package/assets/plugin/tools/get-my-proposed-learnings.d.ts +0 -20
  273. package/assets/plugin/tools/get-my-proposed-learnings.js +0 -55
  274. package/assets/plugin/tools/get-my-recent-reviews.d.ts +0 -22
  275. package/assets/plugin/tools/get-my-recent-reviews.js +0 -66
  276. package/assets/plugin/tools/get-orderbook.d.ts +0 -21
  277. package/assets/plugin/tools/get-orderbook.js +0 -32
  278. package/assets/plugin/tools/get-pattern-scan.d.ts +0 -7
  279. package/assets/plugin/tools/get-pattern-scan.js +0 -8
  280. package/assets/plugin/tools/get-regime.d.ts +0 -6
  281. package/assets/plugin/tools/get-regime.js +0 -7
  282. package/assets/plugin/tools/get-relevant-learnings.d.ts +0 -21
  283. package/assets/plugin/tools/get-relevant-learnings.js +0 -65
  284. package/assets/plugin/tools/get-resting-liquidity.d.ts +0 -6
  285. package/assets/plugin/tools/get-resting-liquidity.js +0 -11
  286. package/assets/plugin/tools/get-risk-scenario.d.ts +0 -29
  287. package/assets/plugin/tools/get-risk-scenario.js +0 -47
  288. package/assets/plugin/tools/get-risk-summary.d.ts +0 -51
  289. package/assets/plugin/tools/get-risk-summary.js +0 -118
  290. package/assets/plugin/tools/get-sentiment.d.ts +0 -4
  291. package/assets/plugin/tools/get-sentiment.js +0 -6
  292. package/assets/plugin/tools/get-session-review.d.ts +0 -7
  293. package/assets/plugin/tools/get-session-review.js +0 -8
  294. package/assets/plugin/tools/get-setup-detail.d.ts +0 -7
  295. package/assets/plugin/tools/get-setup-detail.js +0 -322
  296. package/assets/plugin/tools/get-signals.d.ts +0 -15
  297. package/assets/plugin/tools/get-signals.js +0 -54
  298. package/assets/plugin/tools/get-sizing.d.ts +0 -6
  299. package/assets/plugin/tools/get-sizing.js +0 -6
  300. package/assets/plugin/tools/get-trade-feedback.d.ts +0 -7
  301. package/assets/plugin/tools/get-trade-feedback.js +0 -8
  302. package/assets/plugin/tools/get-trade-flow.d.ts +0 -7
  303. package/assets/plugin/tools/get-trade-flow.js +0 -7
  304. package/assets/plugin/tools/get-volume-analysis.d.ts +0 -21
  305. package/assets/plugin/tools/get-volume-analysis.js +0 -74
  306. package/assets/plugin/tools/get-volume-profile.d.ts +0 -7
  307. package/assets/plugin/tools/get-volume-profile.js +0 -7
  308. package/assets/plugin/tools/get-wave9-status.d.ts +0 -127
  309. package/assets/plugin/tools/get-wave9-status.js +0 -796
  310. package/assets/plugin/tools/helpers.d.ts +0 -26
  311. package/assets/plugin/tools/helpers.js +0 -39
  312. package/assets/plugin/tools/intel-api.d.ts +0 -34
  313. package/assets/plugin/tools/intel-api.js +0 -119
  314. package/assets/plugin/tools/intel-cache.d.ts +0 -25
  315. package/assets/plugin/tools/intel-cache.js +0 -148
  316. package/assets/plugin/tools/list-strategies.d.ts +0 -17
  317. package/assets/plugin/tools/list-strategies.js +0 -23
  318. package/assets/plugin/tools/modify-stop.d.ts +0 -21
  319. package/assets/plugin/tools/modify-stop.js +0 -120
  320. package/assets/plugin/tools/modify-target.d.ts +0 -21
  321. package/assets/plugin/tools/modify-target.js +0 -110
  322. package/assets/plugin/tools/propose-learning.d.ts +0 -22
  323. package/assets/plugin/tools/propose-learning.js +0 -65
  324. package/assets/plugin/tools/query-review-outcomes.d.ts +0 -30
  325. package/assets/plugin/tools/query-review-outcomes.js +0 -64
  326. package/assets/plugin/tools/query-trades.d.ts +0 -21
  327. package/assets/plugin/tools/query-trades.js +0 -37
  328. package/assets/plugin/tools/record-position-reviews.d.ts +0 -38
  329. package/assets/plugin/tools/record-position-reviews.js +0 -147
  330. package/assets/plugin/tools/save-strategy.d.ts +0 -16
  331. package/assets/plugin/tools/save-strategy.js +0 -46
  332. package/assets/plugin/tools/scan-pairs.d.ts +0 -22
  333. package/assets/plugin/tools/scan-pairs.js +0 -234
  334. package/assets/plugin/tools/score-setup.d.ts +0 -31
  335. package/assets/plugin/tools/score-setup.js +0 -268
  336. package/assets/plugin/tools/set-bracket-requirement.d.ts +0 -18
  337. package/assets/plugin/tools/set-bracket-requirement.js +0 -81
  338. package/assets/plugin/tools/set-exchange-credentials.d.ts +0 -25
  339. package/assets/plugin/tools/set-exchange-credentials.js +0 -80
  340. package/assets/plugin/tools/set-trading-mode.d.ts +0 -26
  341. package/assets/plugin/tools/set-trading-mode.js +0 -135
  342. package/assets/plugin/tools/test-exchange-credentials.d.ts +0 -16
  343. package/assets/plugin/tools/test-exchange-credentials.js +0 -100
  344. package/assets/plugin/tools/toggle-strategy.d.ts +0 -8
  345. package/assets/plugin/tools/toggle-strategy.js +0 -15
  346. package/assets/plugin/trading-params-cache.d.ts +0 -26
  347. package/assets/plugin/trading-params-cache.js +0 -52
  348. package/assets/plugin/types.d.ts +0 -134
  349. package/assets/plugin/types.js +0 -7
  350. package/assets/plugin/util/plugin-paths.d.ts +0 -3
  351. package/assets/plugin/util/plugin-paths.js +0 -15
  352. package/assets/plugin/venues/hyperliquid/hl-balance.d.ts +0 -116
  353. package/assets/plugin/venues/hyperliquid/hl-balance.js +0 -145
  354. package/assets/plugin/venues/hyperliquid/hl-bracket-coordinator.d.ts +0 -123
  355. package/assets/plugin/venues/hyperliquid/hl-bracket-coordinator.js +0 -533
  356. package/assets/plugin/venues/hyperliquid/hl-brackets.d.ts +0 -102
  357. package/assets/plugin/venues/hyperliquid/hl-brackets.js +0 -172
  358. package/assets/plugin/venues/hyperliquid/hl-cloid.d.ts +0 -22
  359. package/assets/plugin/venues/hyperliquid/hl-cloid.js +0 -82
  360. package/assets/plugin/venues/hyperliquid/hl-info-cache.d.ts +0 -46
  361. package/assets/plugin/venues/hyperliquid/hl-info-cache.js +0 -125
  362. package/assets/plugin/venues/hyperliquid/hl-live-adapter.d.ts +0 -146
  363. package/assets/plugin/venues/hyperliquid/hl-live-adapter.js +0 -728
  364. package/assets/plugin/venues/hyperliquid/hl-precision.d.ts +0 -61
  365. package/assets/plugin/venues/hyperliquid/hl-precision.js +0 -176
  366. package/assets/plugin/venues/hyperliquid/hl-private.d.ts +0 -88
  367. package/assets/plugin/venues/hyperliquid/hl-private.js +0 -357
  368. package/assets/plugin/venues/hyperliquid/hl-public.d.ts +0 -79
  369. package/assets/plugin/venues/hyperliquid/hl-public.js +0 -436
  370. package/assets/plugin/venues/hyperliquid/hl-rate-gate.d.ts +0 -57
  371. package/assets/plugin/venues/hyperliquid/hl-rate-gate.js +0 -220
  372. package/assets/plugin/venues/hyperliquid/hl-user-stream.d.ts +0 -90
  373. package/assets/plugin/venues/hyperliquid/hl-user-stream.js +0 -220
  374. package/assets/plugin/venues/registry.d.ts +0 -38
  375. package/assets/plugin/venues/registry.js +0 -46
  376. package/assets/plugin/venues/symbols.d.ts +0 -43
  377. package/assets/plugin/venues/symbols.js +0 -107
  378. package/assets/plugin/wave9/live-account-capture.d.ts +0 -67
  379. package/assets/plugin/wave9/live-account-capture.js +0 -435
  380. package/assets/plugin/wave9/live-autonomous-protection.d.ts +0 -39
  381. package/assets/plugin/wave9/live-autonomous-protection.js +0 -112
  382. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.d.ts +0 -33
  383. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.js +0 -115
  384. package/assets/plugin/wave9/live-execution-ledger.d.ts +0 -107
  385. package/assets/plugin/wave9/live-execution-ledger.js +0 -498
  386. package/assets/plugin/wave9/live-position-confirmation.d.ts +0 -18
  387. package/assets/plugin/wave9/live-position-confirmation.js +0 -111
  388. package/assets/plugin/wave9/live-residual-protection.d.ts +0 -18
  389. package/assets/plugin/wave9/live-residual-protection.js +0 -250
  390. package/assets/plugin/wave9/live-startup-reconciliation.d.ts +0 -38
  391. package/assets/plugin/wave9/live-startup-reconciliation.js +0 -454
  392. package/assets/plugin/wave9/live-symbol-ownership.d.ts +0 -20
  393. package/assets/plugin/wave9/live-symbol-ownership.js +0 -132
  394. package/assets/plugin/wave9/paper-admission-guard.d.ts +0 -199
  395. package/assets/plugin/wave9/paper-admission-guard.js +0 -650
  396. package/assets/plugin/wave9/usdm-evidence-provider.d.ts +0 -42
  397. package/assets/plugin/wave9/usdm-evidence-provider.js +0 -133
@@ -1,34 +0,0 @@
1
- import type { CcxtTicker, CcxtOHLCV } from '../types.js';
2
- import type { OrderBookDepth } from '../simulator/types.js';
3
- import type { PublicMarketDataApi } from './public-market-data-api.js';
4
- export declare class BinancePublicApi implements PublicMarketDataApi {
5
- private exchange;
6
- constructor();
7
- /** Fetch raw CCXT ticker (includes funding rate, OI, info). Returns null on error. */
8
- fetchTickerRaw(symbol: string): Promise<Record<string, any> | null>;
9
- /** Fetch current ticker for a symbol. Returns null on error. */
10
- fetchTicker(symbol: string): Promise<CcxtTicker | null>;
11
- /** Fetch funding rate for a perpetual futures symbol. Returns null on error. */
12
- fetchFundingRate(symbol: string): Promise<Record<string, any> | null>;
13
- /** Fetch open interest for a perpetual futures symbol. Returns null on error. */
14
- fetchOpenInterest(symbol: string): Promise<Record<string, any> | null>;
15
- /** Fetch order book depth. Returns null on error. */
16
- fetchOrderBook(symbol: string, limit?: number): Promise<OrderBookDepth | null>;
17
- /** Fetch OHLCV candles. Returns null on error. */
18
- fetchOHLCV(symbol: string, timeframe?: string, limit?: number): Promise<CcxtOHLCV[] | null>;
19
- /** Probe Binance USD-M FUTURES reachability from this host — the readiness
20
- * gate's core signal. Calls the futures-explicit implicit method so it hits
21
- * `fapi.binance.com` (a bare `fetchTime()` on this instance resolves to spot
22
- * `api.binance.com`, since the public client doesn't set defaultType:'future').
23
- * HTTP 451 = Binance geo-restriction; the ban gate does NOT classify 451, so
24
- * we inspect the message here. Ban-gate compliant (assertNotBanned/noteSuccess/
25
- * noteBinanceError). Outcomes:
26
- * - 'reachable' clean response (driftMs = serverTime − localTime)
27
- * - 'geo_blocked' HTTP 451 — host is in a restricted region (actionable)
28
- * - 'unknown' the ban/weight gate paused us — NOT a host problem
29
- * - 'unreachable' network / DNS / timeout / other error */
30
- probeReachability(): Promise<{
31
- outcome: 'reachable' | 'geo_blocked' | 'unreachable' | 'unknown';
32
- driftMs: number | null;
33
- }>;
34
- }
@@ -1,180 +0,0 @@
1
- // Thin wrapper around CCXT for Binance public API endpoints.
2
- // No API keys required — only uses public market data.
3
- import { createRequire } from 'node:module';
4
- import { logger } from '../logger.js';
5
- import { assertNotBanned, noteBinanceError, noteSuccess, BinanceBannedError } from './binance-ban-gate.js';
6
- const TAG = 'binance-public';
7
- // Load ccxt via CJS require — OpenClaw's ESM loader gives wrong module shape
8
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
- let ccxtCjs;
10
- try {
11
- const _require = createRequire(import.meta.url);
12
- ccxtCjs = _require('ccxt');
13
- }
14
- catch {
15
- // Fallback: try global require (available in OpenClaw's loader context)
16
- // eslint-disable-next-line @typescript-eslint/no-require-imports
17
- ccxtCjs = require('ccxt');
18
- }
19
- export class BinancePublicApi {
20
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
- exchange;
22
- constructor() {
23
- const BinanceClass = ccxtCjs.binance ?? ccxtCjs.default?.binance;
24
- if (!BinanceClass) {
25
- throw new Error('CCXT binance class not found — check ccxt version');
26
- }
27
- this.exchange = new BinanceClass({
28
- enableRateLimit: true,
29
- });
30
- logger.info(TAG, 'Binance public API initialized (no auth)');
31
- }
32
- /** Fetch raw CCXT ticker (includes funding rate, OI, info). Returns null on error. */
33
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
- async fetchTickerRaw(symbol) {
35
- try {
36
- assertNotBanned('fetchTickerRaw');
37
- const r = await this.exchange.fetchTicker(symbol);
38
- noteSuccess();
39
- return r;
40
- }
41
- catch (err) {
42
- noteBinanceError(err);
43
- logger.error(TAG, `fetchTickerRaw(${symbol}) failed: ${err instanceof Error ? err.message : String(err)}`);
44
- return null;
45
- }
46
- }
47
- /** Fetch current ticker for a symbol. Returns null on error. */
48
- async fetchTicker(symbol) {
49
- try {
50
- assertNotBanned('fetchTicker');
51
- const raw = await this.exchange.fetchTicker(symbol);
52
- noteSuccess();
53
- return {
54
- symbol: raw.symbol,
55
- last: raw.last ?? 0,
56
- bid: raw.bid ?? 0,
57
- ask: raw.ask ?? 0,
58
- baseVolume: raw.baseVolume ?? 0,
59
- quoteVolume: raw.quoteVolume ?? 0,
60
- change: raw.change ?? 0,
61
- percentage: raw.percentage ?? 0,
62
- timestamp: raw.timestamp ?? Date.now(),
63
- datetime: raw.datetime ?? new Date().toISOString(),
64
- };
65
- }
66
- catch (err) {
67
- noteBinanceError(err);
68
- logger.error(TAG, `fetchTicker(${symbol}) failed: ${err instanceof Error ? err.message : String(err)}`);
69
- return null;
70
- }
71
- }
72
- /** Fetch funding rate for a perpetual futures symbol. Returns null on error. */
73
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
- async fetchFundingRate(symbol) {
75
- try {
76
- assertNotBanned('fetchFundingRate');
77
- const r = await this.exchange.fetchFundingRate(symbol);
78
- noteSuccess();
79
- return r;
80
- }
81
- catch (err) {
82
- noteBinanceError(err);
83
- logger.error(TAG, `fetchFundingRate(${symbol}) failed: ${err instanceof Error ? err.message : String(err)}`);
84
- return null;
85
- }
86
- }
87
- /** Fetch open interest for a perpetual futures symbol. Returns null on error. */
88
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
- async fetchOpenInterest(symbol) {
90
- try {
91
- assertNotBanned('fetchOpenInterest');
92
- const r = await this.exchange.fetchOpenInterest(symbol);
93
- noteSuccess();
94
- return r;
95
- }
96
- catch (err) {
97
- noteBinanceError(err);
98
- logger.error(TAG, `fetchOpenInterest(${symbol}) failed: ${err instanceof Error ? err.message : String(err)}`);
99
- return null;
100
- }
101
- }
102
- /** Fetch order book depth. Returns null on error. */
103
- async fetchOrderBook(symbol, limit = 20) {
104
- try {
105
- assertNotBanned('fetchOrderBook');
106
- const raw = await this.exchange.fetchOrderBook(symbol, limit);
107
- noteSuccess();
108
- return {
109
- bids: (raw.bids ?? []).map((l) => [l[0], l[1]]),
110
- asks: (raw.asks ?? []).map((l) => [l[0], l[1]]),
111
- timestamp: raw.timestamp ?? Date.now(),
112
- };
113
- }
114
- catch (err) {
115
- noteBinanceError(err);
116
- logger.error(TAG, `fetchOrderBook(${symbol}) failed: ${err instanceof Error ? err.message : String(err)}`);
117
- return null;
118
- }
119
- }
120
- /** Fetch OHLCV candles. Returns null on error. */
121
- async fetchOHLCV(symbol, timeframe = '1h', limit = 100) {
122
- try {
123
- assertNotBanned('fetchOHLCV');
124
- const raw = await this.exchange.fetchOHLCV(symbol, timeframe, undefined, limit);
125
- noteSuccess();
126
- // Validate each candle has 6 numeric values
127
- const valid = [];
128
- for (const candle of raw) {
129
- if (candle.length >= 6 &&
130
- typeof candle[0] === 'number' &&
131
- typeof candle[1] === 'number' &&
132
- typeof candle[2] === 'number' &&
133
- typeof candle[3] === 'number' &&
134
- typeof candle[4] === 'number' &&
135
- typeof candle[5] === 'number') {
136
- valid.push(candle);
137
- }
138
- }
139
- return valid;
140
- }
141
- catch (err) {
142
- noteBinanceError(err);
143
- logger.error(TAG, `fetchOHLCV(${symbol}, ${timeframe}) failed: ${err instanceof Error ? err.message : String(err)}`);
144
- return null;
145
- }
146
- }
147
- /** Probe Binance USD-M FUTURES reachability from this host — the readiness
148
- * gate's core signal. Calls the futures-explicit implicit method so it hits
149
- * `fapi.binance.com` (a bare `fetchTime()` on this instance resolves to spot
150
- * `api.binance.com`, since the public client doesn't set defaultType:'future').
151
- * HTTP 451 = Binance geo-restriction; the ban gate does NOT classify 451, so
152
- * we inspect the message here. Ban-gate compliant (assertNotBanned/noteSuccess/
153
- * noteBinanceError). Outcomes:
154
- * - 'reachable' clean response (driftMs = serverTime − localTime)
155
- * - 'geo_blocked' HTTP 451 — host is in a restricted region (actionable)
156
- * - 'unknown' the ban/weight gate paused us — NOT a host problem
157
- * - 'unreachable' network / DNS / timeout / other error */
158
- async probeReachability() {
159
- try {
160
- assertNotBanned('reachabilityProbe');
161
- const r = await this.exchange.fapiPublicGetTime({});
162
- noteSuccess();
163
- const serverTime = Number(r?.serverTime);
164
- const driftMs = Number.isFinite(serverTime) ? serverTime - Date.now() : null;
165
- return { outcome: 'reachable', driftMs };
166
- }
167
- catch (err) {
168
- noteBinanceError(err);
169
- if (err instanceof BinanceBannedError) {
170
- // Gate paused us (418/429 backoff or weight pacer) — we didn't actually
171
- // reach the host, so the result is UNKNOWN, not a reachability failure.
172
- return { outcome: 'unknown', driftMs: null };
173
- }
174
- const msg = err instanceof Error ? err.message : String(err);
175
- const geo = msg.includes('451');
176
- logger.warn(TAG, `probeReachability failed${geo ? ' (HTTP 451 geo-block)' : ''}: ${msg}`);
177
- return { outcome: geo ? 'geo_blocked' : 'unreachable', driftMs: null };
178
- }
179
- }
180
- }
@@ -1,25 +0,0 @@
1
- import { type IntelApiDeps } from '../tools/intel-api.js';
2
- import type { CcxtTicker, CcxtOHLCV } from '../types.js';
3
- import type { OrderBookDepth } from '../simulator/types.js';
4
- import type { PublicMarketDataApi } from './public-market-data-api.js';
5
- type RawCcxt = Record<string, any>;
6
- export declare class IntelPublicApi implements PublicMarketDataApi {
7
- private readonly deps;
8
- constructor(deps: IntelApiDeps);
9
- /** Latest price for `symbol` as a CcxtTicker (last=bid=ask=intel 1m close;
10
- * zero modeled spread — the paper fill engine models slippage itself).
11
- * Returns null on any intel error, matching BinancePublicApi's contract. */
12
- fetchTicker(symbol: string): Promise<CcxtTicker | null>;
13
- /** Intel has no raw-ticker/funding/OI HTTP route yet — null (same as a 451). */
14
- fetchTickerRaw(): Promise<RawCcxt | null>;
15
- fetchFundingRate(): Promise<RawCcxt | null>;
16
- fetchOpenInterest(): Promise<RawCcxt | null>;
17
- /** No intel depth route yet — null. The paper fill engine falls back to
18
- * random slippage when the book is absent (see helpers.ts fetchOrderBook). */
19
- fetchOrderBook(): Promise<OrderBookDepth | null>;
20
- /** No intel candle route yet — null (candle-consuming analysis tools degrade
21
- * exactly as they do under a 451; the agent's decisioning reads intel
22
- * signals/scan tools, not raw candles). */
23
- fetchOHLCV(): Promise<CcxtOHLCV[] | null>;
24
- }
25
- export {};
@@ -1,80 +0,0 @@
1
- // Intel-backed public market-data source for PAPER mode on hosts that Binance
2
- // geo-blocks (HTTP 451). Paper execution is fully simulated; it only needs a
3
- // price, which the intel service serves from its own (permitted-region) feeds
4
- // via GET /api/price/:symbol (latest 1m close, ≤~60s stale). See
5
- // docs/AGENT_READINESS_GATE_PLAN.md sibling + the wisekid 451 findings.
6
- //
7
- // Selected only when plugin-config `paperMarketDataSource: 'intel'` AND paper
8
- // mode (index.ts). Live trading NEVER uses this — live needs the real exchange.
9
- //
10
- // Increment 1 serves PRICE only (fetchTicker), which is the trading-critical
11
- // path: create_order / close_position price + the PaperMarketFeed mark loop.
12
- // Candles / order book / funding / OI have no intel HTTP route yet, so those
13
- // return null here — the SAME shape a 451 produces today (no regression), and
14
- // order-book absence is already handled by the fill engine's random-slippage
15
- // fallback. Candle/book/OI intel routes are a follow-up.
16
- import { logger } from '../logger.js';
17
- import { fetchIntelApi } from '../tools/intel-api.js';
18
- const TAG = 'intel-public';
19
- /** CCXT symbol (`BTC/USDT`, `BTC/USDT:USDT`) → intel format (`BTCUSDT`). */
20
- function toIntelSymbol(symbol) {
21
- return symbol.replace('/', '').replace(/:.*$/, '');
22
- }
23
- export class IntelPublicApi {
24
- deps;
25
- constructor(deps) {
26
- this.deps = deps;
27
- logger.info(TAG, 'Intel public market-data source active (paper mode, Binance reads routed to intel)');
28
- }
29
- /** Latest price for `symbol` as a CcxtTicker (last=bid=ask=intel 1m close;
30
- * zero modeled spread — the paper fill engine models slippage itself).
31
- * Returns null on any intel error, matching BinancePublicApi's contract. */
32
- async fetchTicker(symbol) {
33
- const res = await fetchIntelApi(`/api/price/${toIntelSymbol(symbol)}`, this.deps);
34
- if ('error' in res) {
35
- logger.warn(TAG, `fetchTicker(${symbol}) via intel failed: ${res.error}`);
36
- return null;
37
- }
38
- const body = res;
39
- const price = Number(body.price);
40
- if (!Number.isFinite(price) || price <= 0) {
41
- logger.warn(TAG, `fetchTicker(${symbol}) via intel returned a bad price: ${body.price}`);
42
- return null;
43
- }
44
- const timestamp = Number.isFinite(body.time) ? body.time : Date.now();
45
- return {
46
- // Key on the ORIGINAL ccxt symbol so the simulator's per-symbol maps line up.
47
- symbol,
48
- last: price,
49
- bid: price,
50
- ask: price,
51
- baseVolume: 0,
52
- quoteVolume: 0,
53
- change: 0,
54
- percentage: 0,
55
- timestamp,
56
- datetime: new Date(timestamp).toISOString(),
57
- };
58
- }
59
- /** Intel has no raw-ticker/funding/OI HTTP route yet — null (same as a 451). */
60
- async fetchTickerRaw() {
61
- return null;
62
- }
63
- async fetchFundingRate() {
64
- return null;
65
- }
66
- async fetchOpenInterest() {
67
- return null;
68
- }
69
- /** No intel depth route yet — null. The paper fill engine falls back to
70
- * random slippage when the book is absent (see helpers.ts fetchOrderBook). */
71
- async fetchOrderBook() {
72
- return null;
73
- }
74
- /** No intel candle route yet — null (candle-consuming analysis tools degrade
75
- * exactly as they do under a 451; the agent's decisioning reads intel
76
- * signals/scan tools, not raw candles). */
77
- async fetchOHLCV() {
78
- return null;
79
- }
80
- }
@@ -1,26 +0,0 @@
1
- import type { CcxtTicker, CcxtOHLCV } from '../types.js';
2
- import type { OrderBookDepth } from '../simulator/types.js';
3
- type RawCcxt = Record<string, any>;
4
- export interface PublicMarketDataApi {
5
- fetchTickerRaw(symbol: string): Promise<RawCcxt | null>;
6
- fetchTicker(symbol: string): Promise<CcxtTicker | null>;
7
- fetchFundingRate(symbol: string): Promise<RawCcxt | null>;
8
- fetchOpenInterest(symbol: string): Promise<RawCcxt | null>;
9
- fetchOrderBook(symbol: string, limit?: number): Promise<OrderBookDepth | null>;
10
- fetchOHLCV(symbol: string, timeframe?: string, limit?: number): Promise<CcxtOHLCV[] | null>;
11
- }
12
- /** Which exchange serves the public market-data tools (fetch_ticker,
13
- * fetch_ohlcv, get_orderbook, get_market_structure, …).
14
- *
15
- * The configured VENUE decides, in BOTH books — a hyperliquid venue must
16
- * never read Binance prices (live included: the agent would be running
17
- * technical analysis on the wrong exchange's data while trading real money
18
- * on HL). The intel price relay is a Binance-venue, paper-only escape hatch
19
- * for 451-geo-blocked hosts. */
20
- export declare function resolveMarketDataSource(opts: {
21
- venue: 'binance' | 'hyperliquid';
22
- isLive: boolean;
23
- paperDataSource: 'binance' | 'intel';
24
- hasConnectionToken: boolean;
25
- }): 'hyperliquid' | 'intel' | 'binance';
26
- export {};
@@ -1,23 +0,0 @@
1
- // The public market-data surface paper mode reads (prices, candles, book,
2
- // funding, OI). Both BinancePublicApi (direct Binance) and IntelPublicApi
3
- // (via the intel service, for Binance-451-geo-blocked hosts) implement it, so
4
- // the paper wiring can select a source without any consumer knowing which.
5
- //
6
- // Deliberately EXCLUDES probeReachability: that is Binance-specific and only
7
- // the readiness reporter uses it — it must always probe the REAL Binance host
8
- // to detect the 451, so it keeps a concrete BinancePublicApi, never this.
9
- /** Which exchange serves the public market-data tools (fetch_ticker,
10
- * fetch_ohlcv, get_orderbook, get_market_structure, …).
11
- *
12
- * The configured VENUE decides, in BOTH books — a hyperliquid venue must
13
- * never read Binance prices (live included: the agent would be running
14
- * technical analysis on the wrong exchange's data while trading real money
15
- * on HL). The intel price relay is a Binance-venue, paper-only escape hatch
16
- * for 451-geo-blocked hosts. */
17
- export function resolveMarketDataSource(opts) {
18
- if (opts.venue === 'hyperliquid')
19
- return 'hyperliquid';
20
- if (!opts.isLive && opts.paperDataSource === 'intel' && opts.hasConnectionToken)
21
- return 'intel';
22
- return 'binance';
23
- }
@@ -1,77 +0,0 @@
1
- /** Central operational-gate values. Each gate is validated against its own enum
2
- * PLUGIN-SIDE (§5b: central can never express a value the plugin doesn't
3
- * already consider safe); an invalid field is dropped — field-level fallback,
4
- * never whole-payload rejection. Gates are added one at a time
5
- * (TOOL_DISTRIBUTION_ARCHITECTURE.md §11 step 3): `exitGate` (slice 2) →
6
- * `positionReviewMode` (slice 3, the Position Decision Journal
7
- * heartbeat-mandate + superset gate, file key `positionReview.mode`). Both
8
- * ride the same four-stage `off → shadow → observe → enforce` ladder. */
9
- export interface AgentGates {
10
- exitGate?: 'off' | 'shadow' | 'observe' | 'enforce';
11
- positionReviewMode?: 'off' | 'shadow' | 'observe' | 'enforce';
12
- }
13
- /** Server-resolved entitlement verdict (webapp lib/entitlements.ts, computed
14
- * from the users row and delivered on the config channel). The plugin NEVER
15
- * re-derives billing state — it consumes `paidAccess` as-is. Absent field =
16
- * unknown = the entitlement gate fails OPEN (older webapp, outage, garbage):
17
- * billing enforcement must never depend on this read succeeding; the
18
- * server-side 403 walls (webapp Pro routes + intel) are the hard layer. */
19
- export interface AgentEntitlement {
20
- state: 'active' | 'trialing' | 'grace' | 'expired' | 'none';
21
- paidAccess: boolean;
22
- tier?: string;
23
- expiresAt?: string;
24
- graceUntil?: string;
25
- }
26
- /** The slice of /api/internal/config the plugin consumes today. `limits`
27
- * arrives in the payload but is deliberately not modeled yet. */
28
- export interface AgentConfig {
29
- version: number;
30
- tools: {
31
- disabled: string[];
32
- };
33
- gates: AgentGates;
34
- /** Absent when the server omitted it or the field failed validation. */
35
- entitlement?: AgentEntitlement;
36
- }
37
- /** Hardcoded safe default — identical to pre-central behavior (nothing
38
- * disabled, no central gate values → local file / defaults rule). */
39
- export declare function defaultAgentConfig(): AgentConfig;
40
- /**
41
- * Validate an untrusted payload (network response OR cache file) into an
42
- * AgentConfig. Returns null when the payload as a whole is malformed —
43
- * partial application is never allowed (§5b: central cannot express a value
44
- * the plugin doesn't already consider safe).
45
- */
46
- export declare function validateAgentConfig(raw: unknown): AgentConfig | null;
47
- /** Per-field entitlement validation: a structurally-valid `{state, paidAccess}`
48
- * pair (state in the enum, paidAccess a real boolean) is kept; ANYTHING else
49
- * → undefined, and an absent entitlement makes the gate fail open. Garbage
50
- * can pause new entries only by forging a syntactically-perfect verdict —
51
- * and even then it can never touch closes/stops/emergency (those aren't in
52
- * the gated set at all — see entitlement-gate.ts). */
53
- export declare function validateEntitlement(raw: unknown): AgentEntitlement | undefined;
54
- /** Version-monotonic acceptance (basic rollback/replay protection): a fetched
55
- * config older than what we already applied is rejected. Equal versions are
56
- * acceptable (idempotent re-apply is a no-op for the gate). */
57
- export declare function isAcceptableVersion(fetched: AgentConfig, current: AgentConfig | null): boolean;
58
- export interface FetchAgentConfigOptions {
59
- apiBaseUrl: string;
60
- token: string;
61
- /** Injectable for unit tests + observability shims. */
62
- fetchImpl?: typeof fetch;
63
- timeoutMs?: number;
64
- }
65
- /**
66
- * Fetch the central config. Returns a VALIDATED AgentConfig, or null on any
67
- * failure (network, non-200, non-JSON, invalid shape). Never throws.
68
- */
69
- export declare function fetchAgentConfig(opts: FetchAgentConfigOptions): Promise<AgentConfig | null>;
70
- export declare function defaultCachePath(): string;
71
- /** Read + validate the cached config. Missing/corrupt/invalid → null (the
72
- * caller falls through to safe defaults). Never throws. */
73
- export declare function readCachedConfig(path?: string): AgentConfig | null;
74
- /** Atomically persist the last-known-good config (tmp + rename, 0o600 — the
75
- * plugin-config-io convention). Failures are logged, never thrown: cache
76
- * persistence is an optimization, not a correctness requirement. */
77
- export declare function writeCachedConfig(config: AgentConfig, path?: string): void;
@@ -1,188 +0,0 @@
1
- // Central per-user agent config — fetch + validate + last-known-good cache.
2
- //
3
- // Slice 1 of docs/TOOL_DISTRIBUTION_ARCHITECTURE.md §5: the plugin PULLS
4
- // `GET /api/internal/config` (webapp, rc_ token → tenant) and applies the
5
- // tool-enablement OFF-list through the ToolGate. The critical contract (§5b):
6
- // only a successful, authenticated, VALIDATED, version-acceptable response
7
- // ever changes behavior. A network error, 5xx, 401, garbage payload, or
8
- // corrupt cache file can NEVER change what the agent does — the caller keeps
9
- // the last-known-good config, or the hardcoded safe default (nothing
10
- // disabled).
11
- //
12
- // The cache file lives next to plugin-config.json (`~/.reefclaw/
13
- // agent-config-cache.json`) and follows the same atomic write convention
14
- // (tmp + rename, mode 0o600 — see plugin-config-io.ts). It is validated on
15
- // read with the same validator as the network path: a poisoned cache is as
16
- // untrusted as a poisoned response.
17
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
18
- import { dirname, join } from 'node:path';
19
- import { homedir } from 'node:os';
20
- import { logger, formatError } from '../logger.js';
21
- const TAG = 'agent-config';
22
- /** Shared four-stage ladder for the gates migrated so far. Kept as one set
23
- * because exitGate + positionReviewMode use identical values; a future gate
24
- * with a different enum gets its own constant. */
25
- const MODE_LADDER_VALUES = new Set(['off', 'shadow', 'observe', 'enforce']);
26
- const ENTITLEMENT_STATES = new Set([
27
- 'active',
28
- 'trialing',
29
- 'grace',
30
- 'expired',
31
- 'none',
32
- ]);
33
- /** Hardcoded safe default — identical to pre-central behavior (nothing
34
- * disabled, no central gate values → local file / defaults rule). */
35
- export function defaultAgentConfig() {
36
- return { version: 0, tools: { disabled: [] }, gates: {} };
37
- }
38
- /** Tool names must look like tool names. Anything else is dropped — central
39
- * can never smuggle a weird value into the gate's set. */
40
- const TOOL_NAME_RE = /^[a-z0-9_]{1,64}$/;
41
- /**
42
- * Validate an untrusted payload (network response OR cache file) into an
43
- * AgentConfig. Returns null when the payload as a whole is malformed —
44
- * partial application is never allowed (§5b: central cannot express a value
45
- * the plugin doesn't already consider safe).
46
- */
47
- export function validateAgentConfig(raw) {
48
- if (!raw || typeof raw !== 'object' || Array.isArray(raw))
49
- return null;
50
- const obj = raw;
51
- const version = obj.version;
52
- if (typeof version !== 'number' || !Number.isFinite(version) || version < 0)
53
- return null;
54
- const tools = obj.tools;
55
- if (!tools || typeof tools !== 'object' || Array.isArray(tools))
56
- return null;
57
- const disabledRaw = tools.disabled;
58
- if (!Array.isArray(disabledRaw))
59
- return null;
60
- const disabled = disabledRaw.filter((v) => typeof v === 'string' && TOOL_NAME_RE.test(v));
61
- const config = {
62
- version,
63
- tools: { disabled },
64
- gates: validateGates(obj.gates),
65
- };
66
- const entitlement = validateEntitlement(obj.entitlement);
67
- if (entitlement)
68
- config.entitlement = entitlement;
69
- return config;
70
- }
71
- /** Per-field entitlement validation: a structurally-valid `{state, paidAccess}`
72
- * pair (state in the enum, paidAccess a real boolean) is kept; ANYTHING else
73
- * → undefined, and an absent entitlement makes the gate fail open. Garbage
74
- * can pause new entries only by forging a syntactically-perfect verdict —
75
- * and even then it can never touch closes/stops/emergency (those aren't in
76
- * the gated set at all — see entitlement-gate.ts). */
77
- export function validateEntitlement(raw) {
78
- if (!raw || typeof raw !== 'object' || Array.isArray(raw))
79
- return undefined;
80
- const obj = raw;
81
- const state = obj.state;
82
- const paidAccess = obj.paidAccess;
83
- if (typeof state !== 'string' || !ENTITLEMENT_STATES.has(state))
84
- return undefined;
85
- if (typeof paidAccess !== 'boolean')
86
- return undefined;
87
- const entitlement = {
88
- state: state,
89
- paidAccess,
90
- };
91
- if (typeof obj.tier === 'string')
92
- entitlement.tier = obj.tier;
93
- if (typeof obj.expiresAt === 'string')
94
- entitlement.expiresAt = obj.expiresAt;
95
- if (typeof obj.graceUntil === 'string')
96
- entitlement.graceUntil = obj.graceUntil;
97
- return entitlement;
98
- }
99
- /** Per-field gate validation (§5b): a structurally-absent/garbage `gates`
100
- * becomes `{}` (no central values → local config rules); each known gate is
101
- * kept only when its value is in that gate's enum. Unknown keys are dropped. */
102
- function validateGates(raw) {
103
- if (!raw || typeof raw !== 'object' || Array.isArray(raw))
104
- return {};
105
- const obj = raw;
106
- const gates = {};
107
- const exitGate = obj.exitGate;
108
- if (typeof exitGate === 'string' && MODE_LADDER_VALUES.has(exitGate)) {
109
- gates.exitGate = exitGate;
110
- }
111
- const positionReviewMode = obj.positionReviewMode;
112
- if (typeof positionReviewMode === 'string' && MODE_LADDER_VALUES.has(positionReviewMode)) {
113
- gates.positionReviewMode = positionReviewMode;
114
- }
115
- return gates;
116
- }
117
- /** Version-monotonic acceptance (basic rollback/replay protection): a fetched
118
- * config older than what we already applied is rejected. Equal versions are
119
- * acceptable (idempotent re-apply is a no-op for the gate). */
120
- export function isAcceptableVersion(fetched, current) {
121
- if (!current)
122
- return true;
123
- return fetched.version >= current.version;
124
- }
125
- /**
126
- * Fetch the central config. Returns a VALIDATED AgentConfig, or null on any
127
- * failure (network, non-200, non-JSON, invalid shape). Never throws.
128
- */
129
- export async function fetchAgentConfig(opts) {
130
- const { apiBaseUrl, token, fetchImpl = fetch, timeoutMs = 10_000 } = opts;
131
- const url = `${apiBaseUrl.replace(/\/+$/, '')}/api/internal/config`;
132
- try {
133
- const res = await fetchImpl(url, {
134
- headers: { authorization: `Bearer ${token}` },
135
- signal: AbortSignal.timeout(timeoutMs),
136
- });
137
- if (!res.ok) {
138
- logger.debug(TAG, `config fetch non-200: ${res.status}`);
139
- return null;
140
- }
141
- const body = (await res.json());
142
- const validated = validateAgentConfig(body);
143
- if (!validated)
144
- logger.warn(TAG, 'config fetch returned an invalid payload — ignored');
145
- return validated;
146
- }
147
- catch (err) {
148
- logger.debug(TAG, `config fetch failed: ${formatError(err)}`);
149
- return null;
150
- }
151
- }
152
- // ---- last-known-good cache file ---------------------------------------------
153
- export function defaultCachePath() {
154
- return join(homedir(), '.reefclaw', 'agent-config-cache.json');
155
- }
156
- /** Read + validate the cached config. Missing/corrupt/invalid → null (the
157
- * caller falls through to safe defaults). Never throws. */
158
- export function readCachedConfig(path = defaultCachePath()) {
159
- try {
160
- if (!existsSync(path))
161
- return null;
162
- const raw = readFileSync(path, 'utf-8');
163
- return validateAgentConfig(JSON.parse(raw));
164
- }
165
- catch (err) {
166
- logger.warn(TAG, `config cache unreadable (${formatError(err)}) — using safe defaults`);
167
- return null;
168
- }
169
- }
170
- /** Atomically persist the last-known-good config (tmp + rename, 0o600 — the
171
- * plugin-config-io convention). Failures are logged, never thrown: cache
172
- * persistence is an optimization, not a correctness requirement. */
173
- export function writeCachedConfig(config, path = defaultCachePath()) {
174
- try {
175
- const dir = dirname(path);
176
- if (!existsSync(dir))
177
- mkdirSync(dir, { recursive: true });
178
- const tmpPath = `${path}.tmp`;
179
- writeFileSync(tmpPath, JSON.stringify(config, null, 2) + '\n', {
180
- encoding: 'utf-8',
181
- mode: 0o600,
182
- });
183
- renameSync(tmpPath, path);
184
- }
185
- catch (err) {
186
- logger.warn(TAG, `config cache write failed: ${formatError(err)}`);
187
- }
188
- }
@@ -1,32 +0,0 @@
1
- import { type AgentConfig, type AgentEntitlement, type AgentGates } from './agent-config-client.js';
2
- import type { ToolGate } from './tool-gate.js';
3
- export declare function resolvePollIntervalMs(): number;
4
- export interface AgentConfigPollerOptions {
5
- gate: ToolGate;
6
- /** Central operational-gates consumer (slice 2 — exitGate). Optional so the
7
- * tool-allowlist path stands alone; wired from index.ts with the module
8
- * singleton `gateStore`. */
9
- gateStore?: {
10
- apply(gates: AgentGates): void;
11
- };
12
- /** Entitlement consumer (account-level enforcement). Optional, wired from
13
- * index.ts with the module singleton `entitlementGate`. Receives the
14
- * config's entitlement slice — including `undefined` when the server
15
- * omitted it, which clears any held verdict (fail-open). */
16
- entitlementGate?: {
17
- apply(entitlement: AgentEntitlement | undefined): void;
18
- };
19
- apiBaseUrl: string;
20
- token: string;
21
- fetchImpl?: typeof fetch;
22
- intervalMs?: number;
23
- cachePath?: string;
24
- }
25
- export interface AgentConfigPollerHandle {
26
- stop(): void;
27
- /** Exposed for tests/diagnostics — the currently applied config. */
28
- getCurrent(): AgentConfig;
29
- }
30
- /** Test-only — allows the singleton guard to be reset between unit tests. */
31
- export declare function __resetPollerSingleton(): void;
32
- export declare function startAgentConfigPoller(opts: AgentConfigPollerOptions): AgentConfigPollerHandle;