@reefclaw/connect 0.1.10 → 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 (396) hide show
  1. package/assets/bridge/gateway/event-parser.d.ts +6 -1
  2. package/assets/bridge/gateway/event-parser.js +19 -2
  3. package/assets/bridge/gateway/heartbeat-cron.d.ts +27 -0
  4. package/assets/bridge/gateway/heartbeat-cron.js +85 -0
  5. package/assets/bridge/gateway/poller.d.ts +1 -0
  6. package/assets/bridge/gateway/poller.js +14 -2
  7. package/assets/bridge/providers/gateway.d.ts +24 -2
  8. package/assets/bridge/providers/gateway.js +124 -25
  9. package/assets/bridge/setup.js +6 -51
  10. package/assets/shared/signals/conditions/registry.js +11 -2
  11. package/assets/shared/signals/strategy-adapter.js +17 -7
  12. package/assets/skill/SKILL.md +2 -0
  13. package/dist/deps.js +2 -2
  14. package/dist/plugin.js +35 -7
  15. package/package.json +1 -1
  16. package/assets/plugin/audit/mode-transition-audit.d.ts +0 -11
  17. package/assets/plugin/audit/mode-transition-audit.js +0 -29
  18. package/assets/plugin/balance-utils.d.ts +0 -36
  19. package/assets/plugin/balance-utils.js +0 -98
  20. package/assets/plugin/ccxt/binance-ban-gate.d.ts +0 -47
  21. package/assets/plugin/ccxt/binance-ban-gate.js +0 -420
  22. package/assets/plugin/ccxt/binance-private.d.ts +0 -346
  23. package/assets/plugin/ccxt/binance-private.js +0 -1525
  24. package/assets/plugin/ccxt/binance-public.d.ts +0 -34
  25. package/assets/plugin/ccxt/binance-public.js +0 -180
  26. package/assets/plugin/ccxt/intel-public.d.ts +0 -25
  27. package/assets/plugin/ccxt/intel-public.js +0 -80
  28. package/assets/plugin/ccxt/public-market-data-api.d.ts +0 -12
  29. package/assets/plugin/ccxt/public-market-data-api.js +0 -9
  30. package/assets/plugin/config/agent-config-client.d.ts +0 -77
  31. package/assets/plugin/config/agent-config-client.js +0 -188
  32. package/assets/plugin/config/agent-config-poller.d.ts +0 -32
  33. package/assets/plugin/config/agent-config-poller.js +0 -101
  34. package/assets/plugin/config/brackets-config.d.ts +0 -22
  35. package/assets/plugin/config/brackets-config.js +0 -58
  36. package/assets/plugin/config/entitlement-gate.d.ts +0 -51
  37. package/assets/plugin/config/entitlement-gate.js +0 -137
  38. package/assets/plugin/config/gate-store.d.ts +0 -18
  39. package/assets/plugin/config/gate-store.js +0 -61
  40. package/assets/plugin/config/plugin-config-io.d.ts +0 -215
  41. package/assets/plugin/config/plugin-config-io.js +0 -111
  42. package/assets/plugin/config/position-review-config.d.ts +0 -35
  43. package/assets/plugin/config/position-review-config.js +0 -105
  44. package/assets/plugin/config/tool-gate.d.ts +0 -53
  45. package/assets/plugin/config/tool-gate.js +0 -128
  46. package/assets/plugin/config/user-data-stream-config.d.ts +0 -89
  47. package/assets/plugin/config/user-data-stream-config.js +0 -239
  48. package/assets/plugin/connector-supervisor.d.ts +0 -36
  49. package/assets/plugin/connector-supervisor.js +0 -149
  50. package/assets/plugin/exchange-adapter.d.ts +0 -65
  51. package/assets/plugin/exchange-adapter.js +0 -4
  52. package/assets/plugin/index.d.ts +0 -30
  53. package/assets/plugin/index.js +0 -2678
  54. package/assets/plugin/ingest/pending-entry-metadata.d.ts +0 -74
  55. package/assets/plugin/ingest/pending-entry-metadata.js +0 -236
  56. package/assets/plugin/ingest/position-auto-capture.d.ts +0 -103
  57. package/assets/plugin/ingest/position-auto-capture.js +0 -411
  58. package/assets/plugin/ingest/position-decisions-client.d.ts +0 -322
  59. package/assets/plugin/ingest/position-decisions-client.js +0 -296
  60. package/assets/plugin/ingest/readiness-reporter.d.ts +0 -42
  61. package/assets/plugin/ingest/readiness-reporter.js +0 -163
  62. package/assets/plugin/ingest/reconcile-db-vs-exchange.d.ts +0 -13
  63. package/assets/plugin/ingest/reconcile-db-vs-exchange.js +0 -114
  64. package/assets/plugin/ingest/reconciler-cleanup.d.ts +0 -37
  65. package/assets/plugin/ingest/reconciler-cleanup.js +0 -147
  66. package/assets/plugin/ingest/rest-gap-filler.d.ts +0 -191
  67. package/assets/plugin/ingest/rest-gap-filler.js +0 -565
  68. package/assets/plugin/ingest/touched-symbols-store.d.ts +0 -25
  69. package/assets/plugin/ingest/touched-symbols-store.js +0 -96
  70. package/assets/plugin/ingest/trade-store-client.d.ts +0 -40
  71. package/assets/plugin/ingest/trade-store-client.js +0 -125
  72. package/assets/plugin/ingest/ws-ingest.d.ts +0 -43
  73. package/assets/plugin/ingest/ws-ingest.js +0 -126
  74. package/assets/plugin/learning/setup-family.d.ts +0 -21
  75. package/assets/plugin/learning/setup-family.js +0 -103
  76. package/assets/plugin/lifecycle/install-signal-handlers.d.ts +0 -33
  77. package/assets/plugin/lifecycle/install-signal-handlers.js +0 -112
  78. package/assets/plugin/lifecycle/shutdown-coordinator.d.ts +0 -43
  79. package/assets/plugin/lifecycle/shutdown-coordinator.js +0 -131
  80. package/assets/plugin/lifecycle/trading-operation-lock.d.ts +0 -17
  81. package/assets/plugin/lifecycle/trading-operation-lock.js +0 -14
  82. package/assets/plugin/live/bracket-id.d.ts +0 -26
  83. package/assets/plugin/live/bracket-id.js +0 -112
  84. package/assets/plugin/live/bracket-ledger.d.ts +0 -54
  85. package/assets/plugin/live/bracket-ledger.js +0 -267
  86. package/assets/plugin/live/bracket-manager.d.ts +0 -82
  87. package/assets/plugin/live/bracket-manager.js +0 -478
  88. package/assets/plugin/live/bracket-params.d.ts +0 -22
  89. package/assets/plugin/live/bracket-params.js +0 -124
  90. package/assets/plugin/live/bracket-reconciler.d.ts +0 -95
  91. package/assets/plugin/live/bracket-reconciler.js +0 -573
  92. package/assets/plugin/live/bracket-types.d.ts +0 -102
  93. package/assets/plugin/live/bracket-types.js +0 -8
  94. package/assets/plugin/live/deposit-tracker.d.ts +0 -62
  95. package/assets/plugin/live/deposit-tracker.js +0 -97
  96. package/assets/plugin/live/emergency-controls.d.ts +0 -32
  97. package/assets/plugin/live/emergency-controls.js +0 -226
  98. package/assets/plugin/live/exchange-errors.d.ts +0 -12
  99. package/assets/plugin/live/exchange-errors.js +0 -130
  100. package/assets/plugin/live/exchange-info-cache.d.ts +0 -37
  101. package/assets/plugin/live/exchange-info-cache.js +0 -134
  102. package/assets/plugin/live/fact-subscriber.d.ts +0 -78
  103. package/assets/plugin/live/fact-subscriber.js +0 -182
  104. package/assets/plugin/live/intent-journal.d.ts +0 -42
  105. package/assets/plugin/live/intent-journal.js +0 -122
  106. package/assets/plugin/live/listen-key-manager.d.ts +0 -70
  107. package/assets/plugin/live/listen-key-manager.js +0 -169
  108. package/assets/plugin/live/live-adapter.d.ts +0 -287
  109. package/assets/plugin/live/live-adapter.js +0 -1777
  110. package/assets/plugin/live/live-balance-enricher.d.ts +0 -32
  111. package/assets/plugin/live/live-balance-enricher.js +0 -104
  112. package/assets/plugin/live/live-bracket-api.d.ts +0 -13
  113. package/assets/plugin/live/live-bracket-api.js +0 -20
  114. package/assets/plugin/live/live-state-store.d.ts +0 -194
  115. package/assets/plugin/live/live-state-store.js +0 -450
  116. package/assets/plugin/live/local-signal-service.d.ts +0 -57
  117. package/assets/plugin/live/local-signal-service.js +0 -151
  118. package/assets/plugin/live/local-strategy-evaluator.d.ts +0 -62
  119. package/assets/plugin/live/local-strategy-evaluator.js +0 -131
  120. package/assets/plugin/live/microstructure-assembler.d.ts +0 -54
  121. package/assets/plugin/live/microstructure-assembler.js +0 -148
  122. package/assets/plugin/live/order-poller.d.ts +0 -29
  123. package/assets/plugin/live/order-poller.js +0 -125
  124. package/assets/plugin/live/position-state-store.d.ts +0 -83
  125. package/assets/plugin/live/position-state-store.js +0 -237
  126. package/assets/plugin/live/proposal-decision-listener.d.ts +0 -70
  127. package/assets/plugin/live/proposal-decision-listener.js +0 -292
  128. package/assets/plugin/live/proposal-manager.d.ts +0 -76
  129. package/assets/plugin/live/proposal-manager.js +0 -140
  130. package/assets/plugin/live/rate-limiter.d.ts +0 -47
  131. package/assets/plugin/live/rate-limiter.js +0 -159
  132. package/assets/plugin/live/reconciler.d.ts +0 -39
  133. package/assets/plugin/live/reconciler.js +0 -175
  134. package/assets/plugin/live/setup-buckets.d.ts +0 -7
  135. package/assets/plugin/live/setup-buckets.js +0 -33
  136. package/assets/plugin/live/slippage-tracker.d.ts +0 -45
  137. package/assets/plugin/live/slippage-tracker.js +0 -78
  138. package/assets/plugin/live/stop-watcher.d.ts +0 -60
  139. package/assets/plugin/live/stop-watcher.js +0 -215
  140. package/assets/plugin/live/user-data-active-probe.d.ts +0 -54
  141. package/assets/plugin/live/user-data-active-probe.js +0 -180
  142. package/assets/plugin/live/user-data-stream-controller.d.ts +0 -200
  143. package/assets/plugin/live/user-data-stream-controller.js +0 -579
  144. package/assets/plugin/live/user-data-stream-ws.d.ts +0 -22
  145. package/assets/plugin/live/user-data-stream-ws.js +0 -63
  146. package/assets/plugin/live/user-data-stream.d.ts +0 -243
  147. package/assets/plugin/live/user-data-stream.js +0 -704
  148. package/assets/plugin/logger.d.ts +0 -2
  149. package/assets/plugin/logger.js +0 -2
  150. package/assets/plugin/mfe.d.ts +0 -21
  151. package/assets/plugin/mfe.js +0 -68
  152. package/assets/plugin/onboarding/mode-ladder.d.ts +0 -1
  153. package/assets/plugin/onboarding/mode-ladder.js +0 -3
  154. package/assets/plugin/onboarding/runtime.d.ts +0 -84
  155. package/assets/plugin/onboarding/runtime.js +0 -173
  156. package/assets/plugin/openclaw.plugin.json +0 -92
  157. package/assets/plugin/paper-adapter.d.ts +0 -24
  158. package/assets/plugin/paper-adapter.js +0 -91
  159. package/assets/plugin/persistence/state-manager.d.ts +0 -66
  160. package/assets/plugin/persistence/state-manager.js +0 -222
  161. package/assets/plugin/pinned-plan.d.ts +0 -9
  162. package/assets/plugin/pinned-plan.js +0 -23
  163. package/assets/plugin/portfolio/wave9-admission.d.ts +0 -67
  164. package/assets/plugin/portfolio/wave9-admission.js +0 -262
  165. package/assets/plugin/portfolio/wave9-policy.d.ts +0 -36
  166. package/assets/plugin/portfolio/wave9-policy.js +0 -183
  167. package/assets/plugin/risk/pre-trade-check.d.ts +0 -38
  168. package/assets/plugin/risk/pre-trade-check.js +0 -345
  169. package/assets/plugin/risk/pre-trade-types.d.ts +0 -60
  170. package/assets/plugin/risk/pre-trade-types.js +0 -3
  171. package/assets/plugin/shadow/shadow-tracker.d.ts +0 -36
  172. package/assets/plugin/shadow/shadow-tracker.js +0 -151
  173. package/assets/plugin/shadow/types.d.ts +0 -42
  174. package/assets/plugin/shadow/types.js +0 -20
  175. package/assets/plugin/shared/indicators-extended.d.ts +0 -52
  176. package/assets/plugin/shared/indicators-extended.js +0 -291
  177. package/assets/plugin/shared/indicators.d.ts +0 -15
  178. package/assets/plugin/shared/indicators.js +0 -114
  179. package/assets/plugin/signals/conditions/registry.d.ts +0 -16
  180. package/assets/plugin/signals/conditions/registry.js +0 -1324
  181. package/assets/plugin/signals/conditions/types.d.ts +0 -1
  182. package/assets/plugin/signals/conditions/types.js +0 -4
  183. package/assets/plugin/signals/direction-rules.d.ts +0 -3
  184. package/assets/plugin/signals/direction-rules.js +0 -24
  185. package/assets/plugin/signals/entry-rules.d.ts +0 -6
  186. package/assets/plugin/signals/entry-rules.js +0 -33
  187. package/assets/plugin/signals/serialize-context.d.ts +0 -4
  188. package/assets/plugin/signals/serialize-context.js +0 -39
  189. package/assets/plugin/signals/stop-rules.d.ts +0 -3
  190. package/assets/plugin/signals/stop-rules.js +0 -48
  191. package/assets/plugin/signals/strategy-adapter.d.ts +0 -47
  192. package/assets/plugin/signals/strategy-adapter.js +0 -199
  193. package/assets/plugin/signals/types.d.ts +0 -1
  194. package/assets/plugin/signals/types.js +0 -8
  195. package/assets/plugin/simulator/exchange-simulator.d.ts +0 -93
  196. package/assets/plugin/simulator/exchange-simulator.js +0 -689
  197. package/assets/plugin/simulator/fill-engine.d.ts +0 -53
  198. package/assets/plugin/simulator/fill-engine.js +0 -280
  199. package/assets/plugin/simulator/paper-market-feed.d.ts +0 -26
  200. package/assets/plugin/simulator/paper-market-feed.js +0 -104
  201. package/assets/plugin/simulator/realistic-fills.d.ts +0 -59
  202. package/assets/plugin/simulator/realistic-fills.js +0 -175
  203. package/assets/plugin/simulator/types.d.ts +0 -224
  204. package/assets/plugin/simulator/types.js +0 -43
  205. package/assets/plugin/strategy/builtin-strategies.d.ts +0 -2
  206. package/assets/plugin/strategy/builtin-strategies.js +0 -113
  207. package/assets/plugin/strategy/condition-registry.d.ts +0 -3
  208. package/assets/plugin/strategy/condition-registry.js +0 -153
  209. package/assets/plugin/strategy/evaluator.d.ts +0 -70
  210. package/assets/plugin/strategy/evaluator.js +0 -98
  211. package/assets/plugin/tools/assessment-validation.d.ts +0 -120
  212. package/assets/plugin/tools/assessment-validation.js +0 -415
  213. package/assets/plugin/tools/attach-brackets.d.ts +0 -39
  214. package/assets/plugin/tools/attach-brackets.js +0 -399
  215. package/assets/plugin/tools/audit-bracket-protection.d.ts +0 -49
  216. package/assets/plugin/tools/audit-bracket-protection.js +0 -527
  217. package/assets/plugin/tools/cancel-all-orders.d.ts +0 -9
  218. package/assets/plugin/tools/cancel-all-orders.js +0 -8
  219. package/assets/plugin/tools/cancel-order.d.ts +0 -14
  220. package/assets/plugin/tools/cancel-order.js +0 -60
  221. package/assets/plugin/tools/check-position-health.d.ts +0 -46
  222. package/assets/plugin/tools/check-position-health.js +0 -194
  223. package/assets/plugin/tools/clear-exchange-credentials.d.ts +0 -24
  224. package/assets/plugin/tools/clear-exchange-credentials.js +0 -70
  225. package/assets/plugin/tools/close-position.d.ts +0 -45
  226. package/assets/plugin/tools/close-position.js +0 -722
  227. package/assets/plugin/tools/create-order.d.ts +0 -82
  228. package/assets/plugin/tools/create-order.js +0 -1516
  229. package/assets/plugin/tools/exit-gate.d.ts +0 -58
  230. package/assets/plugin/tools/exit-gate.js +0 -162
  231. package/assets/plugin/tools/fetch-balance.d.ts +0 -5
  232. package/assets/plugin/tools/fetch-balance.js +0 -4
  233. package/assets/plugin/tools/fetch-ohlcv.d.ts +0 -11
  234. package/assets/plugin/tools/fetch-ohlcv.js +0 -8
  235. package/assets/plugin/tools/fetch-open-orders.d.ts +0 -7
  236. package/assets/plugin/tools/fetch-open-orders.js +0 -4
  237. package/assets/plugin/tools/fetch-positions.d.ts +0 -7
  238. package/assets/plugin/tools/fetch-positions.js +0 -4
  239. package/assets/plugin/tools/fetch-ticker.d.ts +0 -11
  240. package/assets/plugin/tools/fetch-ticker.js +0 -5
  241. package/assets/plugin/tools/get-agent-profile.d.ts +0 -4
  242. package/assets/plugin/tools/get-agent-profile.js +0 -6
  243. package/assets/plugin/tools/get-analytics.d.ts +0 -6
  244. package/assets/plugin/tools/get-analytics.js +0 -7
  245. package/assets/plugin/tools/get-backtest.d.ts +0 -12
  246. package/assets/plugin/tools/get-backtest.js +0 -91
  247. package/assets/plugin/tools/get-basis.d.ts +0 -7
  248. package/assets/plugin/tools/get-basis.js +0 -7
  249. package/assets/plugin/tools/get-bracket-config.d.ts +0 -11
  250. package/assets/plugin/tools/get-bracket-config.js +0 -24
  251. package/assets/plugin/tools/get-cascade-risk.d.ts +0 -7
  252. package/assets/plugin/tools/get-cascade-risk.js +0 -8
  253. package/assets/plugin/tools/get-crypto-metrics.d.ts +0 -18
  254. package/assets/plugin/tools/get-crypto-metrics.js +0 -62
  255. package/assets/plugin/tools/get-cvd.d.ts +0 -6
  256. package/assets/plugin/tools/get-cvd.js +0 -6
  257. package/assets/plugin/tools/get-divergences.d.ts +0 -6
  258. package/assets/plugin/tools/get-divergences.js +0 -6
  259. package/assets/plugin/tools/get-funding-context.d.ts +0 -6
  260. package/assets/plugin/tools/get-funding-context.js +0 -16
  261. package/assets/plugin/tools/get-liquidation-levels.d.ts +0 -7
  262. package/assets/plugin/tools/get-liquidation-levels.js +0 -7
  263. package/assets/plugin/tools/get-liquidation-pulse.d.ts +0 -9
  264. package/assets/plugin/tools/get-liquidation-pulse.js +0 -22
  265. package/assets/plugin/tools/get-market-breadth.d.ts +0 -6
  266. package/assets/plugin/tools/get-market-breadth.js +0 -8
  267. package/assets/plugin/tools/get-market-intel.d.ts +0 -19
  268. package/assets/plugin/tools/get-market-intel.js +0 -116
  269. package/assets/plugin/tools/get-market-structure.d.ts +0 -47
  270. package/assets/plugin/tools/get-market-structure.js +0 -198
  271. package/assets/plugin/tools/get-my-mined-patterns.d.ts +0 -20
  272. package/assets/plugin/tools/get-my-mined-patterns.js +0 -61
  273. package/assets/plugin/tools/get-my-proposed-learnings.d.ts +0 -20
  274. package/assets/plugin/tools/get-my-proposed-learnings.js +0 -55
  275. package/assets/plugin/tools/get-my-recent-reviews.d.ts +0 -22
  276. package/assets/plugin/tools/get-my-recent-reviews.js +0 -66
  277. package/assets/plugin/tools/get-orderbook.d.ts +0 -21
  278. package/assets/plugin/tools/get-orderbook.js +0 -32
  279. package/assets/plugin/tools/get-pattern-scan.d.ts +0 -7
  280. package/assets/plugin/tools/get-pattern-scan.js +0 -8
  281. package/assets/plugin/tools/get-regime.d.ts +0 -6
  282. package/assets/plugin/tools/get-regime.js +0 -7
  283. package/assets/plugin/tools/get-relevant-learnings.d.ts +0 -21
  284. package/assets/plugin/tools/get-relevant-learnings.js +0 -65
  285. package/assets/plugin/tools/get-resting-liquidity.d.ts +0 -6
  286. package/assets/plugin/tools/get-resting-liquidity.js +0 -11
  287. package/assets/plugin/tools/get-risk-scenario.d.ts +0 -29
  288. package/assets/plugin/tools/get-risk-scenario.js +0 -47
  289. package/assets/plugin/tools/get-risk-summary.d.ts +0 -51
  290. package/assets/plugin/tools/get-risk-summary.js +0 -118
  291. package/assets/plugin/tools/get-sentiment.d.ts +0 -4
  292. package/assets/plugin/tools/get-sentiment.js +0 -6
  293. package/assets/plugin/tools/get-session-review.d.ts +0 -7
  294. package/assets/plugin/tools/get-session-review.js +0 -8
  295. package/assets/plugin/tools/get-setup-detail.d.ts +0 -7
  296. package/assets/plugin/tools/get-setup-detail.js +0 -311
  297. package/assets/plugin/tools/get-signals.d.ts +0 -15
  298. package/assets/plugin/tools/get-signals.js +0 -54
  299. package/assets/plugin/tools/get-sizing.d.ts +0 -6
  300. package/assets/plugin/tools/get-sizing.js +0 -6
  301. package/assets/plugin/tools/get-trade-feedback.d.ts +0 -7
  302. package/assets/plugin/tools/get-trade-feedback.js +0 -8
  303. package/assets/plugin/tools/get-trade-flow.d.ts +0 -7
  304. package/assets/plugin/tools/get-trade-flow.js +0 -7
  305. package/assets/plugin/tools/get-volume-analysis.d.ts +0 -21
  306. package/assets/plugin/tools/get-volume-analysis.js +0 -74
  307. package/assets/plugin/tools/get-volume-profile.d.ts +0 -7
  308. package/assets/plugin/tools/get-volume-profile.js +0 -7
  309. package/assets/plugin/tools/get-wave9-status.d.ts +0 -127
  310. package/assets/plugin/tools/get-wave9-status.js +0 -796
  311. package/assets/plugin/tools/helpers.d.ts +0 -26
  312. package/assets/plugin/tools/helpers.js +0 -39
  313. package/assets/plugin/tools/intel-api.d.ts +0 -34
  314. package/assets/plugin/tools/intel-api.js +0 -119
  315. package/assets/plugin/tools/intel-cache.d.ts +0 -25
  316. package/assets/plugin/tools/intel-cache.js +0 -148
  317. package/assets/plugin/tools/list-strategies.d.ts +0 -17
  318. package/assets/plugin/tools/list-strategies.js +0 -23
  319. package/assets/plugin/tools/modify-stop.d.ts +0 -21
  320. package/assets/plugin/tools/modify-stop.js +0 -120
  321. package/assets/plugin/tools/modify-target.d.ts +0 -21
  322. package/assets/plugin/tools/modify-target.js +0 -110
  323. package/assets/plugin/tools/propose-learning.d.ts +0 -22
  324. package/assets/plugin/tools/propose-learning.js +0 -65
  325. package/assets/plugin/tools/query-review-outcomes.d.ts +0 -30
  326. package/assets/plugin/tools/query-review-outcomes.js +0 -64
  327. package/assets/plugin/tools/query-trades.d.ts +0 -21
  328. package/assets/plugin/tools/query-trades.js +0 -37
  329. package/assets/plugin/tools/record-position-reviews.d.ts +0 -38
  330. package/assets/plugin/tools/record-position-reviews.js +0 -147
  331. package/assets/plugin/tools/save-strategy.d.ts +0 -16
  332. package/assets/plugin/tools/save-strategy.js +0 -46
  333. package/assets/plugin/tools/scan-pairs.d.ts +0 -18
  334. package/assets/plugin/tools/scan-pairs.js +0 -231
  335. package/assets/plugin/tools/score-setup.d.ts +0 -31
  336. package/assets/plugin/tools/score-setup.js +0 -268
  337. package/assets/plugin/tools/set-bracket-requirement.d.ts +0 -18
  338. package/assets/plugin/tools/set-bracket-requirement.js +0 -81
  339. package/assets/plugin/tools/set-exchange-credentials.d.ts +0 -25
  340. package/assets/plugin/tools/set-exchange-credentials.js +0 -80
  341. package/assets/plugin/tools/set-trading-mode.d.ts +0 -26
  342. package/assets/plugin/tools/set-trading-mode.js +0 -135
  343. package/assets/plugin/tools/test-exchange-credentials.d.ts +0 -16
  344. package/assets/plugin/tools/test-exchange-credentials.js +0 -100
  345. package/assets/plugin/tools/toggle-strategy.d.ts +0 -8
  346. package/assets/plugin/tools/toggle-strategy.js +0 -15
  347. package/assets/plugin/trading-params-cache.d.ts +0 -26
  348. package/assets/plugin/trading-params-cache.js +0 -52
  349. package/assets/plugin/types.d.ts +0 -134
  350. package/assets/plugin/types.js +0 -7
  351. package/assets/plugin/util/plugin-paths.d.ts +0 -3
  352. package/assets/plugin/util/plugin-paths.js +0 -15
  353. package/assets/plugin/venues/hyperliquid/hl-balance.d.ts +0 -116
  354. package/assets/plugin/venues/hyperliquid/hl-balance.js +0 -145
  355. package/assets/plugin/venues/hyperliquid/hl-brackets.d.ts +0 -102
  356. package/assets/plugin/venues/hyperliquid/hl-brackets.js +0 -172
  357. package/assets/plugin/venues/hyperliquid/hl-cloid.d.ts +0 -22
  358. package/assets/plugin/venues/hyperliquid/hl-cloid.js +0 -82
  359. package/assets/plugin/venues/hyperliquid/hl-info-cache.d.ts +0 -46
  360. package/assets/plugin/venues/hyperliquid/hl-info-cache.js +0 -125
  361. package/assets/plugin/venues/hyperliquid/hl-live-adapter.d.ts +0 -88
  362. package/assets/plugin/venues/hyperliquid/hl-live-adapter.js +0 -353
  363. package/assets/plugin/venues/hyperliquid/hl-precision.d.ts +0 -61
  364. package/assets/plugin/venues/hyperliquid/hl-precision.js +0 -176
  365. package/assets/plugin/venues/hyperliquid/hl-private.d.ts +0 -88
  366. package/assets/plugin/venues/hyperliquid/hl-private.js +0 -357
  367. package/assets/plugin/venues/hyperliquid/hl-public.d.ts +0 -79
  368. package/assets/plugin/venues/hyperliquid/hl-public.js +0 -429
  369. package/assets/plugin/venues/hyperliquid/hl-rate-gate.d.ts +0 -57
  370. package/assets/plugin/venues/hyperliquid/hl-rate-gate.js +0 -220
  371. package/assets/plugin/venues/hyperliquid/hl-user-stream.d.ts +0 -90
  372. package/assets/plugin/venues/hyperliquid/hl-user-stream.js +0 -220
  373. package/assets/plugin/venues/registry.d.ts +0 -38
  374. package/assets/plugin/venues/registry.js +0 -46
  375. package/assets/plugin/venues/symbols.d.ts +0 -43
  376. package/assets/plugin/venues/symbols.js +0 -107
  377. package/assets/plugin/wave9/live-account-capture.d.ts +0 -67
  378. package/assets/plugin/wave9/live-account-capture.js +0 -435
  379. package/assets/plugin/wave9/live-autonomous-protection.d.ts +0 -39
  380. package/assets/plugin/wave9/live-autonomous-protection.js +0 -112
  381. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.d.ts +0 -33
  382. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.js +0 -115
  383. package/assets/plugin/wave9/live-execution-ledger.d.ts +0 -107
  384. package/assets/plugin/wave9/live-execution-ledger.js +0 -498
  385. package/assets/plugin/wave9/live-position-confirmation.d.ts +0 -18
  386. package/assets/plugin/wave9/live-position-confirmation.js +0 -111
  387. package/assets/plugin/wave9/live-residual-protection.d.ts +0 -18
  388. package/assets/plugin/wave9/live-residual-protection.js +0 -250
  389. package/assets/plugin/wave9/live-startup-reconciliation.d.ts +0 -38
  390. package/assets/plugin/wave9/live-startup-reconciliation.js +0 -454
  391. package/assets/plugin/wave9/live-symbol-ownership.d.ts +0 -20
  392. package/assets/plugin/wave9/live-symbol-ownership.js +0 -132
  393. package/assets/plugin/wave9/paper-admission-guard.d.ts +0 -199
  394. package/assets/plugin/wave9/paper-admission-guard.js +0 -650
  395. package/assets/plugin/wave9/usdm-evidence-provider.d.ts +0 -42
  396. 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,12 +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
- export {};
@@ -1,9 +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
- export {};
@@ -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;