@senpi/trading-recipe 1.0.21

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 (553) hide show
  1. package/README.md +117 -0
  2. package/dist/actions/close-position/close-position.action.d.ts +16 -0
  3. package/dist/actions/close-position/close-position.action.d.ts.map +1 -0
  4. package/dist/actions/close-position/close-position.action.js +215 -0
  5. package/dist/actions/close-position/close-position.action.js.map +1 -0
  6. package/dist/actions/decision-engine.d.ts +32 -0
  7. package/dist/actions/decision-engine.d.ts.map +1 -0
  8. package/dist/actions/decision-engine.js +103 -0
  9. package/dist/actions/decision-engine.js.map +1 -0
  10. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts +12 -0
  11. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts.map +1 -0
  12. package/dist/actions/llm-decision/anthropic-llm-decision.js +74 -0
  13. package/dist/actions/llm-decision/anthropic-llm-decision.js.map +1 -0
  14. package/dist/actions/llm-decision/factory.d.ts +17 -0
  15. package/dist/actions/llm-decision/factory.d.ts.map +1 -0
  16. package/dist/actions/llm-decision/factory.js +29 -0
  17. package/dist/actions/llm-decision/factory.js.map +1 -0
  18. package/dist/actions/llm-decision/index.d.ts +8 -0
  19. package/dist/actions/llm-decision/index.d.ts.map +1 -0
  20. package/dist/actions/llm-decision/index.js +5 -0
  21. package/dist/actions/llm-decision/index.js.map +1 -0
  22. package/dist/actions/llm-decision/openclaw-llm-decision.d.ts +14 -0
  23. package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -0
  24. package/dist/actions/llm-decision/openclaw-llm-decision.js +58 -0
  25. package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -0
  26. package/dist/actions/llm-decision/shared.d.ts +41 -0
  27. package/dist/actions/llm-decision/shared.d.ts.map +1 -0
  28. package/dist/actions/llm-decision/shared.js +117 -0
  29. package/dist/actions/llm-decision/shared.js.map +1 -0
  30. package/dist/actions/open-position/open-position.action.d.ts +16 -0
  31. package/dist/actions/open-position/open-position.action.d.ts.map +1 -0
  32. package/dist/actions/open-position/open-position.action.js +275 -0
  33. package/dist/actions/open-position/open-position.action.js.map +1 -0
  34. package/dist/actions/types.d.ts +123 -0
  35. package/dist/actions/types.d.ts.map +1 -0
  36. package/dist/actions/types.js +3 -0
  37. package/dist/actions/types.js.map +1 -0
  38. package/dist/cli/guide-commands.d.ts +26 -0
  39. package/dist/cli/guide-commands.d.ts.map +1 -0
  40. package/dist/cli/guide-commands.js +345 -0
  41. package/dist/cli/guide-commands.js.map +1 -0
  42. package/dist/cli/senpi-commands.d.ts +20 -0
  43. package/dist/cli/senpi-commands.d.ts.map +1 -0
  44. package/dist/cli/senpi-commands.js +115 -0
  45. package/dist/cli/senpi-commands.js.map +1 -0
  46. package/dist/constants/dsl/index.d.ts +45 -0
  47. package/dist/constants/dsl/index.d.ts.map +1 -0
  48. package/dist/constants/dsl/index.js +45 -0
  49. package/dist/constants/dsl/index.js.map +1 -0
  50. package/dist/context/context-builder.d.ts +14 -0
  51. package/dist/context/context-builder.d.ts.map +1 -0
  52. package/dist/context/context-builder.js +36 -0
  53. package/dist/context/context-builder.js.map +1 -0
  54. package/dist/context/index.d.ts +5 -0
  55. package/dist/context/index.d.ts.map +1 -0
  56. package/dist/context/index.js +5 -0
  57. package/dist/context/index.js.map +1 -0
  58. package/dist/context/interpolate.d.ts +6 -0
  59. package/dist/context/interpolate.d.ts.map +1 -0
  60. package/dist/context/interpolate.js +15 -0
  61. package/dist/context/interpolate.js.map +1 -0
  62. package/dist/context/providers/asset-trend.provider.d.ts +42 -0
  63. package/dist/context/providers/asset-trend.provider.d.ts.map +1 -0
  64. package/dist/context/providers/asset-trend.provider.js +94 -0
  65. package/dist/context/providers/asset-trend.provider.js.map +1 -0
  66. package/dist/context/providers/index.d.ts +5 -0
  67. package/dist/context/providers/index.d.ts.map +1 -0
  68. package/dist/context/providers/index.js +5 -0
  69. package/dist/context/providers/index.js.map +1 -0
  70. package/dist/context/providers/regime.provider.d.ts +14 -0
  71. package/dist/context/providers/regime.provider.d.ts.map +1 -0
  72. package/dist/context/providers/regime.provider.js +29 -0
  73. package/dist/context/providers/regime.provider.js.map +1 -0
  74. package/dist/context/providers/signal.provider.d.ts +11 -0
  75. package/dist/context/providers/signal.provider.d.ts.map +1 -0
  76. package/dist/context/providers/signal.provider.js +27 -0
  77. package/dist/context/providers/signal.provider.js.map +1 -0
  78. package/dist/context/providers/strategy.provider.d.ts +14 -0
  79. package/dist/context/providers/strategy.provider.d.ts.map +1 -0
  80. package/dist/context/providers/strategy.provider.js +68 -0
  81. package/dist/context/providers/strategy.provider.js.map +1 -0
  82. package/dist/context/types.d.ts +30 -0
  83. package/dist/context/types.d.ts.map +1 -0
  84. package/dist/context/types.js +2 -0
  85. package/dist/context/types.js.map +1 -0
  86. package/dist/dsl/config/index.d.ts +59 -0
  87. package/dist/dsl/config/index.d.ts.map +1 -0
  88. package/dist/dsl/config/index.js +171 -0
  89. package/dist/dsl/config/index.js.map +1 -0
  90. package/dist/dsl/constants/index.d.ts +3 -0
  91. package/dist/dsl/constants/index.d.ts.map +1 -0
  92. package/dist/dsl/constants/index.js +3 -0
  93. package/dist/dsl/constants/index.js.map +1 -0
  94. package/dist/dsl/engine/index.d.ts +7 -0
  95. package/dist/dsl/engine/index.d.ts.map +1 -0
  96. package/dist/dsl/engine/index.js +310 -0
  97. package/dist/dsl/engine/index.js.map +1 -0
  98. package/dist/dsl/events/bus-types.d.ts +7 -0
  99. package/dist/dsl/events/bus-types.d.ts.map +1 -0
  100. package/dist/dsl/events/bus-types.js +6 -0
  101. package/dist/dsl/events/bus-types.js.map +1 -0
  102. package/dist/dsl/events/guards.d.ts +17 -0
  103. package/dist/dsl/events/guards.d.ts.map +1 -0
  104. package/dist/dsl/events/guards.js +94 -0
  105. package/dist/dsl/events/guards.js.map +1 -0
  106. package/dist/dsl/events/handlers.d.ts +15 -0
  107. package/dist/dsl/events/handlers.d.ts.map +1 -0
  108. package/dist/dsl/events/handlers.js +252 -0
  109. package/dist/dsl/events/handlers.js.map +1 -0
  110. package/dist/dsl/events/index.d.ts +4 -0
  111. package/dist/dsl/events/index.d.ts.map +1 -0
  112. package/dist/dsl/events/index.js +4 -0
  113. package/dist/dsl/events/index.js.map +1 -0
  114. package/dist/dsl/index.d.ts +13 -0
  115. package/dist/dsl/index.d.ts.map +1 -0
  116. package/dist/dsl/index.js +35 -0
  117. package/dist/dsl/index.js.map +1 -0
  118. package/dist/dsl/monitor/index.d.ts +18 -0
  119. package/dist/dsl/monitor/index.d.ts.map +1 -0
  120. package/dist/dsl/monitor/index.js +310 -0
  121. package/dist/dsl/monitor/index.js.map +1 -0
  122. package/dist/dsl/plugin/index.d.ts +29 -0
  123. package/dist/dsl/plugin/index.d.ts.map +1 -0
  124. package/dist/dsl/plugin/index.js +85 -0
  125. package/dist/dsl/plugin/index.js.map +1 -0
  126. package/dist/dsl/types/index.d.ts +3 -0
  127. package/dist/dsl/types/index.d.ts.map +1 -0
  128. package/dist/dsl/types/index.js +3 -0
  129. package/dist/dsl/types/index.js.map +1 -0
  130. package/dist/health/index.d.ts +9 -0
  131. package/dist/health/index.d.ts.map +1 -0
  132. package/dist/health/index.js +9 -0
  133. package/dist/health/index.js.map +1 -0
  134. package/dist/index.d.ts +95 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +235 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/leverage/max-leverage-cache.d.ts +10 -0
  139. package/dist/leverage/max-leverage-cache.d.ts.map +1 -0
  140. package/dist/leverage/max-leverage-cache.js +51 -0
  141. package/dist/leverage/max-leverage-cache.js.map +1 -0
  142. package/dist/leverage/resolve-leverage.d.ts +9 -0
  143. package/dist/leverage/resolve-leverage.d.ts.map +1 -0
  144. package/dist/leverage/resolve-leverage.js +15 -0
  145. package/dist/leverage/resolve-leverage.js.map +1 -0
  146. package/dist/risk/index.d.ts +9 -0
  147. package/dist/risk/index.d.ts.map +1 -0
  148. package/dist/risk/index.js +9 -0
  149. package/dist/risk/index.js.map +1 -0
  150. package/dist/runtime/action-registry.d.ts +12 -0
  151. package/dist/runtime/action-registry.d.ts.map +1 -0
  152. package/dist/runtime/action-registry.js +20 -0
  153. package/dist/runtime/action-registry.js.map +1 -0
  154. package/dist/runtime/build-action-scan-payload.d.ts +20 -0
  155. package/dist/runtime/build-action-scan-payload.d.ts.map +1 -0
  156. package/dist/runtime/build-action-scan-payload.js +40 -0
  157. package/dist/runtime/build-action-scan-payload.js.map +1 -0
  158. package/dist/runtime/bus.d.ts +6 -0
  159. package/dist/runtime/bus.d.ts.map +1 -0
  160. package/dist/runtime/bus.js +19 -0
  161. package/dist/runtime/bus.js.map +1 -0
  162. package/dist/runtime/create-action-context.d.ts +34 -0
  163. package/dist/runtime/create-action-context.d.ts.map +1 -0
  164. package/dist/runtime/create-action-context.js +22 -0
  165. package/dist/runtime/create-action-context.js.map +1 -0
  166. package/dist/runtime/create-actions.d.ts +30 -0
  167. package/dist/runtime/create-actions.d.ts.map +1 -0
  168. package/dist/runtime/create-actions.js +71 -0
  169. package/dist/runtime/create-actions.js.map +1 -0
  170. package/dist/runtime/create-runtime-context.d.ts +35 -0
  171. package/dist/runtime/create-runtime-context.d.ts.map +1 -0
  172. package/dist/runtime/create-runtime-context.js +33 -0
  173. package/dist/runtime/create-runtime-context.js.map +1 -0
  174. package/dist/runtime/create-scanner-module.d.ts +14 -0
  175. package/dist/runtime/create-scanner-module.d.ts.map +1 -0
  176. package/dist/runtime/create-scanner-module.js +26 -0
  177. package/dist/runtime/create-scanner-module.js.map +1 -0
  178. package/dist/runtime/create-scanner-providers-for-run.d.ts +20 -0
  179. package/dist/runtime/create-scanner-providers-for-run.d.ts.map +1 -0
  180. package/dist/runtime/create-scanner-providers-for-run.js +34 -0
  181. package/dist/runtime/create-scanner-providers-for-run.js.map +1 -0
  182. package/dist/runtime/default-state-dir.d.ts +10 -0
  183. package/dist/runtime/default-state-dir.d.ts.map +1 -0
  184. package/dist/runtime/default-state-dir.js +22 -0
  185. package/dist/runtime/default-state-dir.js.map +1 -0
  186. package/dist/runtime/env-resolve.d.ts +17 -0
  187. package/dist/runtime/env-resolve.d.ts.map +1 -0
  188. package/dist/runtime/env-resolve.js +45 -0
  189. package/dist/runtime/env-resolve.js.map +1 -0
  190. package/dist/runtime/hook-system.d.ts +7 -0
  191. package/dist/runtime/hook-system.d.ts.map +1 -0
  192. package/dist/runtime/hook-system.js +16 -0
  193. package/dist/runtime/hook-system.js.map +1 -0
  194. package/dist/runtime/index.d.ts +37 -0
  195. package/dist/runtime/index.d.ts.map +1 -0
  196. package/dist/runtime/index.js +26 -0
  197. package/dist/runtime/index.js.map +1 -0
  198. package/dist/runtime/load-trading-strategy.d.ts +23 -0
  199. package/dist/runtime/load-trading-strategy.d.ts.map +1 -0
  200. package/dist/runtime/load-trading-strategy.js +130 -0
  201. package/dist/runtime/load-trading-strategy.js.map +1 -0
  202. package/dist/runtime/map-exit-config.d.ts +12 -0
  203. package/dist/runtime/map-exit-config.d.ts.map +1 -0
  204. package/dist/runtime/map-exit-config.js +91 -0
  205. package/dist/runtime/map-exit-config.js.map +1 -0
  206. package/dist/runtime/map-strategies-registration.d.ts +12 -0
  207. package/dist/runtime/map-strategies-registration.d.ts.map +1 -0
  208. package/dist/runtime/map-strategies-registration.js +52 -0
  209. package/dist/runtime/map-strategies-registration.js.map +1 -0
  210. package/dist/runtime/map-strategies.d.ts +12 -0
  211. package/dist/runtime/map-strategies.d.ts.map +1 -0
  212. package/dist/runtime/map-strategies.js +66 -0
  213. package/dist/runtime/map-strategies.js.map +1 -0
  214. package/dist/runtime/notifications.d.ts +12 -0
  215. package/dist/runtime/notifications.d.ts.map +1 -0
  216. package/dist/runtime/notifications.js +83 -0
  217. package/dist/runtime/notifications.js.map +1 -0
  218. package/dist/runtime/parse-interval.d.ts +11 -0
  219. package/dist/runtime/parse-interval.d.ts.map +1 -0
  220. package/dist/runtime/parse-interval.js +35 -0
  221. package/dist/runtime/parse-interval.js.map +1 -0
  222. package/dist/runtime/reconcile-state.d.ts +25 -0
  223. package/dist/runtime/reconcile-state.d.ts.map +1 -0
  224. package/dist/runtime/reconcile-state.js +112 -0
  225. package/dist/runtime/reconcile-state.js.map +1 -0
  226. package/dist/runtime/risk-guard.d.ts +6 -0
  227. package/dist/runtime/risk-guard.d.ts.map +1 -0
  228. package/dist/runtime/risk-guard.js +14 -0
  229. package/dist/runtime/risk-guard.js.map +1 -0
  230. package/dist/runtime/run.d.ts +21 -0
  231. package/dist/runtime/run.d.ts.map +1 -0
  232. package/dist/runtime/run.js +35 -0
  233. package/dist/runtime/run.js.map +1 -0
  234. package/dist/runtime/runtime.d.ts +40 -0
  235. package/dist/runtime/runtime.d.ts.map +1 -0
  236. package/dist/runtime/runtime.js +251 -0
  237. package/dist/runtime/runtime.js.map +1 -0
  238. package/dist/runtime/scanner-registry.d.ts +22 -0
  239. package/dist/runtime/scanner-registry.d.ts.map +1 -0
  240. package/dist/runtime/scanner-registry.js +83 -0
  241. package/dist/runtime/scanner-registry.js.map +1 -0
  242. package/dist/runtime/strategy-registry.d.ts +49 -0
  243. package/dist/runtime/strategy-registry.d.ts.map +1 -0
  244. package/dist/runtime/strategy-registry.js +156 -0
  245. package/dist/runtime/strategy-registry.js.map +1 -0
  246. package/dist/runtime/trading-strategy-config.d.ts +6 -0
  247. package/dist/runtime/trading-strategy-config.d.ts.map +1 -0
  248. package/dist/runtime/trading-strategy-config.js +5 -0
  249. package/dist/runtime/trading-strategy-config.js.map +1 -0
  250. package/dist/runtime/trading-strategy-schema.d.ts +20093 -0
  251. package/dist/runtime/trading-strategy-schema.d.ts.map +1 -0
  252. package/dist/runtime/trading-strategy-schema.js +115 -0
  253. package/dist/runtime/trading-strategy-schema.js.map +1 -0
  254. package/dist/scanners/__tests__/fixtures/index.d.ts +3 -0
  255. package/dist/scanners/__tests__/fixtures/index.d.ts.map +1 -0
  256. package/dist/scanners/__tests__/fixtures/index.js +3 -0
  257. package/dist/scanners/__tests__/fixtures/index.js.map +1 -0
  258. package/dist/scanners/__tests__/fixtures/scan-results.d.ts +23 -0
  259. package/dist/scanners/__tests__/fixtures/scan-results.d.ts.map +1 -0
  260. package/dist/scanners/__tests__/fixtures/scan-results.js +128 -0
  261. package/dist/scanners/__tests__/fixtures/scan-results.js.map +1 -0
  262. package/dist/scanners/__tests__/fixtures/signals.d.ts +18 -0
  263. package/dist/scanners/__tests__/fixtures/signals.d.ts.map +1 -0
  264. package/dist/scanners/__tests__/fixtures/signals.js +84 -0
  265. package/dist/scanners/__tests__/fixtures/signals.js.map +1 -0
  266. package/dist/scanners/__tests__/test-helpers.d.ts +4 -0
  267. package/dist/scanners/__tests__/test-helpers.d.ts.map +1 -0
  268. package/dist/scanners/__tests__/test-helpers.js +23 -0
  269. package/dist/scanners/__tests__/test-helpers.js.map +1 -0
  270. package/dist/scanners/artifacts.d.ts +119 -0
  271. package/dist/scanners/artifacts.d.ts.map +1 -0
  272. package/dist/scanners/artifacts.js +72 -0
  273. package/dist/scanners/artifacts.js.map +1 -0
  274. package/dist/scanners/create-scanner.d.ts +13 -0
  275. package/dist/scanners/create-scanner.d.ts.map +1 -0
  276. package/dist/scanners/create-scanner.js +11 -0
  277. package/dist/scanners/create-scanner.js.map +1 -0
  278. package/dist/scanners/engine/config-validator.d.ts +7 -0
  279. package/dist/scanners/engine/config-validator.d.ts.map +1 -0
  280. package/dist/scanners/engine/config-validator.js +16 -0
  281. package/dist/scanners/engine/config-validator.js.map +1 -0
  282. package/dist/scanners/engine/data-providers.d.ts +47 -0
  283. package/dist/scanners/engine/data-providers.d.ts.map +1 -0
  284. package/dist/scanners/engine/data-providers.js +8 -0
  285. package/dist/scanners/engine/data-providers.js.map +1 -0
  286. package/dist/scanners/engine/engine.d.ts +76 -0
  287. package/dist/scanners/engine/engine.d.ts.map +1 -0
  288. package/dist/scanners/engine/engine.js +399 -0
  289. package/dist/scanners/engine/engine.js.map +1 -0
  290. package/dist/scanners/engine/index.d.ts +9 -0
  291. package/dist/scanners/engine/index.d.ts.map +1 -0
  292. package/dist/scanners/engine/index.js +7 -0
  293. package/dist/scanners/engine/index.js.map +1 -0
  294. package/dist/scanners/engine/input-resolver.d.ts +21 -0
  295. package/dist/scanners/engine/input-resolver.d.ts.map +1 -0
  296. package/dist/scanners/engine/input-resolver.js +149 -0
  297. package/dist/scanners/engine/input-resolver.js.map +1 -0
  298. package/dist/scanners/engine/lifecycle.d.ts +21 -0
  299. package/dist/scanners/engine/lifecycle.d.ts.map +1 -0
  300. package/dist/scanners/engine/lifecycle.js +2 -0
  301. package/dist/scanners/engine/lifecycle.js.map +1 -0
  302. package/dist/scanners/engine/result-builder.d.ts +30 -0
  303. package/dist/scanners/engine/result-builder.d.ts.map +1 -0
  304. package/dist/scanners/engine/result-builder.js +129 -0
  305. package/dist/scanners/engine/result-builder.js.map +1 -0
  306. package/dist/scanners/engine/strategy-registry.d.ts +45 -0
  307. package/dist/scanners/engine/strategy-registry.d.ts.map +1 -0
  308. package/dist/scanners/engine/strategy-registry.js +93 -0
  309. package/dist/scanners/engine/strategy-registry.js.map +1 -0
  310. package/dist/scanners/events.d.ts +41 -0
  311. package/dist/scanners/events.d.ts.map +1 -0
  312. package/dist/scanners/events.js +33 -0
  313. package/dist/scanners/events.js.map +1 -0
  314. package/dist/scanners/implementations/emerging-movers.d.ts +215 -0
  315. package/dist/scanners/implementations/emerging-movers.d.ts.map +1 -0
  316. package/dist/scanners/implementations/emerging-movers.js +709 -0
  317. package/dist/scanners/implementations/emerging-movers.js.map +1 -0
  318. package/dist/scanners/implementations/index.d.ts +8 -0
  319. package/dist/scanners/implementations/index.d.ts.map +1 -0
  320. package/dist/scanners/implementations/index.js +8 -0
  321. package/dist/scanners/implementations/index.js.map +1 -0
  322. package/dist/scanners/implementations/indicators.d.ts +40 -0
  323. package/dist/scanners/implementations/indicators.d.ts.map +1 -0
  324. package/dist/scanners/implementations/indicators.js +114 -0
  325. package/dist/scanners/implementations/indicators.js.map +1 -0
  326. package/dist/scanners/implementations/liquidation-watchdog.d.ts +74 -0
  327. package/dist/scanners/implementations/liquidation-watchdog.d.ts.map +1 -0
  328. package/dist/scanners/implementations/liquidation-watchdog.js +268 -0
  329. package/dist/scanners/implementations/liquidation-watchdog.js.map +1 -0
  330. package/dist/scanners/implementations/market-regime.d.ts +52 -0
  331. package/dist/scanners/implementations/market-regime.d.ts.map +1 -0
  332. package/dist/scanners/implementations/market-regime.js +201 -0
  333. package/dist/scanners/implementations/market-regime.js.map +1 -0
  334. package/dist/scanners/implementations/momentum.d.ts +21 -0
  335. package/dist/scanners/implementations/momentum.d.ts.map +1 -0
  336. package/dist/scanners/implementations/momentum.js +128 -0
  337. package/dist/scanners/implementations/momentum.js.map +1 -0
  338. package/dist/scanners/implementations/oi-tracker.d.ts +13 -0
  339. package/dist/scanners/implementations/oi-tracker.d.ts.map +1 -0
  340. package/dist/scanners/implementations/oi-tracker.js +67 -0
  341. package/dist/scanners/implementations/oi-tracker.js.map +1 -0
  342. package/dist/scanners/implementations/opportunity.d.ts +104 -0
  343. package/dist/scanners/implementations/opportunity.d.ts.map +1 -0
  344. package/dist/scanners/implementations/opportunity.js +441 -0
  345. package/dist/scanners/implementations/opportunity.js.map +1 -0
  346. package/dist/scanners/implementations/prescreener.d.ts +20 -0
  347. package/dist/scanners/implementations/prescreener.d.ts.map +1 -0
  348. package/dist/scanners/implementations/prescreener.js +97 -0
  349. package/dist/scanners/implementations/prescreener.js.map +1 -0
  350. package/dist/scanners/implementations/sm-flip.d.ts +43 -0
  351. package/dist/scanners/implementations/sm-flip.d.ts.map +1 -0
  352. package/dist/scanners/implementations/sm-flip.js +200 -0
  353. package/dist/scanners/implementations/sm-flip.js.map +1 -0
  354. package/dist/scanners/index.d.ts +25 -0
  355. package/dist/scanners/index.d.ts.map +1 -0
  356. package/dist/scanners/index.js +18 -0
  357. package/dist/scanners/index.js.map +1 -0
  358. package/dist/scanners/input-descriptors.d.ts +61 -0
  359. package/dist/scanners/input-descriptors.d.ts.map +1 -0
  360. package/dist/scanners/input-descriptors.js +43 -0
  361. package/dist/scanners/input-descriptors.js.map +1 -0
  362. package/dist/scanners/protocol/context.d.ts +75 -0
  363. package/dist/scanners/protocol/context.d.ts.map +1 -0
  364. package/dist/scanners/protocol/context.js +2 -0
  365. package/dist/scanners/protocol/context.js.map +1 -0
  366. package/dist/scanners/protocol/hooks.d.ts +18 -0
  367. package/dist/scanners/protocol/hooks.d.ts.map +1 -0
  368. package/dist/scanners/protocol/hooks.js +12 -0
  369. package/dist/scanners/protocol/hooks.js.map +1 -0
  370. package/dist/scanners/protocol/index.d.ts +5 -0
  371. package/dist/scanners/protocol/index.d.ts.map +1 -0
  372. package/dist/scanners/protocol/index.js +2 -0
  373. package/dist/scanners/protocol/index.js.map +1 -0
  374. package/dist/scanners/protocol/scanner.d.ts +47 -0
  375. package/dist/scanners/protocol/scanner.d.ts.map +1 -0
  376. package/dist/scanners/protocol/scanner.js +2 -0
  377. package/dist/scanners/protocol/scanner.js.map +1 -0
  378. package/dist/scanners/providers/adapter.d.ts +23 -0
  379. package/dist/scanners/providers/adapter.d.ts.map +1 -0
  380. package/dist/scanners/providers/adapter.js +227 -0
  381. package/dist/scanners/providers/adapter.js.map +1 -0
  382. package/dist/scanners/providers/cache.d.ts +20 -0
  383. package/dist/scanners/providers/cache.d.ts.map +1 -0
  384. package/dist/scanners/providers/cache.js +61 -0
  385. package/dist/scanners/providers/cache.js.map +1 -0
  386. package/dist/scanners/providers/client.d.ts +53 -0
  387. package/dist/scanners/providers/client.d.ts.map +1 -0
  388. package/dist/scanners/providers/client.js +174 -0
  389. package/dist/scanners/providers/client.js.map +1 -0
  390. package/dist/scanners/providers/factory.d.ts +43 -0
  391. package/dist/scanners/providers/factory.d.ts.map +1 -0
  392. package/dist/scanners/providers/factory.js +192 -0
  393. package/dist/scanners/providers/factory.js.map +1 -0
  394. package/dist/scanners/providers/types.d.ts +61 -0
  395. package/dist/scanners/providers/types.d.ts.map +1 -0
  396. package/dist/scanners/providers/types.js +6 -0
  397. package/dist/scanners/providers/types.js.map +1 -0
  398. package/dist/scanners/runtime-module.d.ts +54 -0
  399. package/dist/scanners/runtime-module.d.ts.map +1 -0
  400. package/dist/scanners/runtime-module.js +90 -0
  401. package/dist/scanners/runtime-module.js.map +1 -0
  402. package/dist/scanners/scanner-definition.d.ts +58 -0
  403. package/dist/scanners/scanner-definition.d.ts.map +1 -0
  404. package/dist/scanners/scanner-definition.js +19 -0
  405. package/dist/scanners/scanner-definition.js.map +1 -0
  406. package/dist/scanners/schema-utils.d.ts +6 -0
  407. package/dist/scanners/schema-utils.d.ts.map +1 -0
  408. package/dist/scanners/schema-utils.js +14 -0
  409. package/dist/scanners/schema-utils.js.map +1 -0
  410. package/dist/scanners/score-utils.d.ts +19 -0
  411. package/dist/scanners/score-utils.d.ts.map +1 -0
  412. package/dist/scanners/score-utils.js +47 -0
  413. package/dist/scanners/score-utils.js.map +1 -0
  414. package/dist/scanners/store/fs-utils.d.ts +12 -0
  415. package/dist/scanners/store/fs-utils.d.ts.map +1 -0
  416. package/dist/scanners/store/fs-utils.js +47 -0
  417. package/dist/scanners/store/fs-utils.js.map +1 -0
  418. package/dist/scanners/store/index.d.ts +5 -0
  419. package/dist/scanners/store/index.d.ts.map +1 -0
  420. package/dist/scanners/store/index.js +5 -0
  421. package/dist/scanners/store/index.js.map +1 -0
  422. package/dist/scanners/store/runtime-store.d.ts +50 -0
  423. package/dist/scanners/store/runtime-store.d.ts.map +1 -0
  424. package/dist/scanners/store/runtime-store.js +91 -0
  425. package/dist/scanners/store/runtime-store.js.map +1 -0
  426. package/dist/scanners/store/shared-artifact-store.d.ts +31 -0
  427. package/dist/scanners/store/shared-artifact-store.d.ts.map +1 -0
  428. package/dist/scanners/store/shared-artifact-store.js +89 -0
  429. package/dist/scanners/store/shared-artifact-store.js.map +1 -0
  430. package/dist/scanners/store/signal-store.d.ts +36 -0
  431. package/dist/scanners/store/signal-store.d.ts.map +1 -0
  432. package/dist/scanners/store/signal-store.js +135 -0
  433. package/dist/scanners/store/signal-store.js.map +1 -0
  434. package/dist/scanners/types.d.ts +115 -0
  435. package/dist/scanners/types.d.ts.map +1 -0
  436. package/dist/scanners/types.js +3 -0
  437. package/dist/scanners/types.js.map +1 -0
  438. package/dist/scripts/run-dsl-standalone-live.d.ts +27 -0
  439. package/dist/scripts/run-dsl-standalone-live.d.ts.map +1 -0
  440. package/dist/scripts/run-dsl-standalone-live.js +207 -0
  441. package/dist/scripts/run-dsl-standalone-live.js.map +1 -0
  442. package/dist/scripts/run-dsl-standalone-mock.d.ts +13 -0
  443. package/dist/scripts/run-dsl-standalone-mock.d.ts.map +1 -0
  444. package/dist/scripts/run-dsl-standalone-mock.js +255 -0
  445. package/dist/scripts/run-dsl-standalone-mock.js.map +1 -0
  446. package/dist/senpi/client.d.ts +77 -0
  447. package/dist/senpi/client.d.ts.map +1 -0
  448. package/dist/senpi/client.js +523 -0
  449. package/dist/senpi/client.js.map +1 -0
  450. package/dist/senpi/constants.d.ts +7 -0
  451. package/dist/senpi/constants.d.ts.map +1 -0
  452. package/dist/senpi/constants.js +7 -0
  453. package/dist/senpi/constants.js.map +1 -0
  454. package/dist/senpi/index.d.ts +3 -0
  455. package/dist/senpi/index.d.ts.map +1 -0
  456. package/dist/senpi/index.js +2 -0
  457. package/dist/senpi/index.js.map +1 -0
  458. package/dist/senpi/types.d.ts +132 -0
  459. package/dist/senpi/types.d.ts.map +1 -0
  460. package/dist/senpi/types.js +3 -0
  461. package/dist/senpi/types.js.map +1 -0
  462. package/dist/state/index.d.ts +3 -0
  463. package/dist/state/index.d.ts.map +1 -0
  464. package/dist/state/index.js +3 -0
  465. package/dist/state/index.js.map +1 -0
  466. package/dist/state/paths.d.ts +8 -0
  467. package/dist/state/paths.d.ts.map +1 -0
  468. package/dist/state/paths.js +19 -0
  469. package/dist/state/paths.js.map +1 -0
  470. package/dist/state/state-manager.d.ts +58 -0
  471. package/dist/state/state-manager.d.ts.map +1 -0
  472. package/dist/state/state-manager.js +221 -0
  473. package/dist/state/state-manager.js.map +1 -0
  474. package/dist/strategy/index.d.ts +2 -0
  475. package/dist/strategy/index.d.ts.map +1 -0
  476. package/dist/strategy/index.js +2 -0
  477. package/dist/strategy/index.js.map +1 -0
  478. package/dist/strategy/strategy-state.d.ts +48 -0
  479. package/dist/strategy/strategy-state.d.ts.map +1 -0
  480. package/dist/strategy/strategy-state.js +185 -0
  481. package/dist/strategy/strategy-state.js.map +1 -0
  482. package/dist/types/action.d.ts +15 -0
  483. package/dist/types/action.d.ts.map +1 -0
  484. package/dist/types/action.js +2 -0
  485. package/dist/types/action.js.map +1 -0
  486. package/dist/types/dsl/index.d.ts +215 -0
  487. package/dist/types/dsl/index.d.ts.map +1 -0
  488. package/dist/types/dsl/index.js +5 -0
  489. package/dist/types/dsl/index.js.map +1 -0
  490. package/dist/types/event-bus.d.ts +11 -0
  491. package/dist/types/event-bus.d.ts.map +1 -0
  492. package/dist/types/event-bus.js +6 -0
  493. package/dist/types/event-bus.js.map +1 -0
  494. package/dist/types/hooks.d.ts +27 -0
  495. package/dist/types/hooks.d.ts.map +1 -0
  496. package/dist/types/hooks.js +15 -0
  497. package/dist/types/hooks.js.map +1 -0
  498. package/dist/types/index.d.ts +6 -0
  499. package/dist/types/index.d.ts.map +1 -0
  500. package/dist/types/index.js +6 -0
  501. package/dist/types/index.js.map +1 -0
  502. package/dist/types/notification.d.ts +4 -0
  503. package/dist/types/notification.d.ts.map +1 -0
  504. package/dist/types/notification.js +3 -0
  505. package/dist/types/notification.js.map +1 -0
  506. package/dist/types/runtime.d.ts +18 -0
  507. package/dist/types/runtime.d.ts.map +1 -0
  508. package/dist/types/runtime.js +2 -0
  509. package/dist/types/runtime.js.map +1 -0
  510. package/dist/types/scanner.d.ts +59 -0
  511. package/dist/types/scanner.d.ts.map +1 -0
  512. package/dist/types/scanner.js +13 -0
  513. package/dist/types/scanner.js.map +1 -0
  514. package/dist/types/strategy.d.ts +100 -0
  515. package/dist/types/strategy.d.ts.map +1 -0
  516. package/dist/types/strategy.js +2 -0
  517. package/dist/types/strategy.js.map +1 -0
  518. package/dist/utils/logger/dsl.d.ts +8 -0
  519. package/dist/utils/logger/dsl.d.ts.map +1 -0
  520. package/dist/utils/logger/dsl.js +7 -0
  521. package/dist/utils/logger/dsl.js.map +1 -0
  522. package/dist/utils/logger.d.ts +13 -0
  523. package/dist/utils/logger.d.ts.map +1 -0
  524. package/dist/utils/logger.js +65 -0
  525. package/dist/utils/logger.js.map +1 -0
  526. package/dist/utils/response.d.ts +14 -0
  527. package/dist/utils/response.d.ts.map +1 -0
  528. package/dist/utils/response.js +44 -0
  529. package/dist/utils/response.js.map +1 -0
  530. package/dist/version.d.ts +2 -0
  531. package/dist/version.d.ts.map +1 -0
  532. package/dist/version.js +2 -0
  533. package/dist/version.js.map +1 -0
  534. package/examples/.env.example +15 -0
  535. package/examples/README.md +75 -0
  536. package/examples/scanners-consumer-quickstart.mjs +134 -0
  537. package/examples/scanners-emerging-movers-v4.mjs +285 -0
  538. package/examples/scanners-liquidation-watchdog.mjs +331 -0
  539. package/examples/scanners-live-mcp.mjs +208 -0
  540. package/examples/scanners-multi-strategy.mjs +165 -0
  541. package/examples/scanners-scheduled-events.mjs +95 -0
  542. package/examples/scanners-senpi-provider-client.mjs +182 -0
  543. package/examples/scanners-single-strategy.mjs +198 -0
  544. package/examples/strategies/README.md +45 -0
  545. package/examples/strategies/dsl-showcase.yaml +60 -0
  546. package/examples/strategies/fox-minimal-loosened.yaml +201 -0
  547. package/examples/strategies/fox-minimal.yaml +209 -0
  548. package/examples/strategies/minimal.yaml +49 -0
  549. package/examples/strategies/viper.yaml +64 -0
  550. package/examples/strategies/wolf.yaml +62 -0
  551. package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +116 -0
  552. package/openclaw.plugin.json +15 -0
  553. package/package.json +52 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-dsl-standalone-mock.js","sourceRoot":"","sources":["../../src/scripts/run-dsl-standalone-mock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { McpTransport, SenpiClientConfig, CreatePositionRequest, CreatePositionResult, EditPositionResult, GetPositionResult, OpenPosition, GetStrategyResult, GetOpenOrdersResult, GetTraderHistoryOptions, TraderHistoryEntry, StrategyFundResult, ClosePositionsRequest, GetPnlHistoryOptions } from './types.js';
2
+ export declare class SenpiClient {
3
+ private readonly injectedTransport;
4
+ private readonly config;
5
+ private mcpClient;
6
+ constructor(transportOrConfig: McpTransport | SenpiClientConfig);
7
+ connect(): Promise<void>;
8
+ disconnect(): Promise<void>;
9
+ private callTool;
10
+ /**
11
+ * Returns an adapter compatible with SenpiToolClient so the same connection
12
+ * can be used for scanner provider MCP tool calls (e.g. leaderboard_get_markets).
13
+ */
14
+ asToolClient(): {
15
+ callTool(name: string, args: Record<string, unknown>): Promise<unknown>;
16
+ };
17
+ createPosition(request: CreatePositionRequest): Promise<CreatePositionResult>;
18
+ /**
19
+ * Fetch market prices. Main DEX is passed as dex: ""; use dex: "xyz" for xyz.
20
+ * If assets is omitted, the MCP returns all asset prices for that dex.
21
+ */
22
+ getMarketPrices(params: {
23
+ dex: string;
24
+ assets?: string[];
25
+ }): Promise<Record<string, number> | null>;
26
+ /**
27
+ * Set/update SL (and optionally TP) on an open position. Uses MCP edit_position.
28
+ * For XYZ DEX pass dex: "xyz" so coin is sent as "xyz:COIN"; otherwise main DEX uses plain coin.
29
+ */
30
+ editPosition(wallet: string, payload: {
31
+ coin: string;
32
+ dex?: string;
33
+ stopLoss?: {
34
+ triggerPx: number;
35
+ };
36
+ }): Promise<EditPositionResult>;
37
+ getOrderStatus(wallet: string, orderId: number): Promise<{
38
+ filled?: boolean;
39
+ } | null>;
40
+ /**
41
+ * Fetch full clearing house state for a wallet (main + xyz DEXes) from MCP.
42
+ * Uses strategy_get_clearinghouse_state (Senpi/Hyperliquid MCP). Use getPosition(wallet, coin, dex?) to resolve a single position from this state.
43
+ */
44
+ getClearingHouseState(wallet: string): Promise<Record<string, unknown> | null>;
45
+ /**
46
+ * Fetch position (szi, entryPx, leverage) from clearing house for a wallet+coin.
47
+ * Uses getClearingHouseState so one MCP call returns both main and xyz (and other) DEX positions;
48
+ * then looks up the position for the given coin (and optional dex).
49
+ */
50
+ getPosition(wallet: string, coin: string, dex?: string): Promise<GetPositionResult | null>;
51
+ closePosition(wallet: string, coin: string, params: {
52
+ reason: string;
53
+ dex?: string;
54
+ }): Promise<unknown>;
55
+ /**
56
+ * List open positions for a wallet (for reconciliation). Calls MCP tool list_open_positions.
57
+ * If the tool is not implemented or fails, returns [] so reconciliation can continue.
58
+ */
59
+ listOpenPositions(wallet: string): Promise<OpenPosition[]>;
60
+ getStrategy(wallet: string): Promise<GetStrategyResult | null>;
61
+ getOpenOrders(wallet: string): Promise<GetOpenOrdersResult[]>;
62
+ getTraderHistory(wallet: string, opts?: GetTraderHistoryOptions): Promise<TraderHistoryEntry[]>;
63
+ topUp(wallet: string, amount: number): Promise<StrategyFundResult>;
64
+ withdrawFunds(wallet: string, amount: number): Promise<StrategyFundResult>;
65
+ closeStrategy(wallet: string): Promise<StrategyFundResult>;
66
+ closePositions(wallet: string, positions: ClosePositionsRequest[]): Promise<unknown>;
67
+ cancelOrder(wallet: string, orderId: number): Promise<unknown>;
68
+ getAssetTradingLimits(wallet: string, coin: string, dex?: string): Promise<{
69
+ maxLeverage: number;
70
+ } | null>;
71
+ listInstruments(): Promise<Array<{
72
+ name: string;
73
+ maxLeverage: number;
74
+ }>>;
75
+ getPnlHistory(wallet: string, opts?: GetPnlHistoryOptions): Promise<unknown>;
76
+ }
77
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/senpi/client.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EAGpB,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IAEtB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsB;IAGxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,SAAS,CAAuB;gBAE5B,iBAAiB,EAAE,YAAY,GAAG,iBAAiB;IAUzD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAYnB,QAAQ;IAwBtB;;;OAGG;IACH,YAAY,IAAI;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE;IAMrF,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAYnF;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAiBzG;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GACxE,OAAO,CAAC,kBAAkB,CAAC;IA8CxB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAU3F;;;OAGG;IACG,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAOpF;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAM1F,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAS7G;;;OAGG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAY1D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAgB9D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAgB7D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAyB/F,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAOlE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAO1E,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAO1D,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpF,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO9D,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAiB1G,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAmBxE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;CAKnF"}
@@ -0,0 +1,523 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
3
+ import { MCP_BASE_URL } from "./constants.js";
4
+ import { isRecord, unwrapEnvelope, asString, asNumber } from "../utils/response.js";
5
+ import { createLogger } from "../utils/logger.js";
6
+ const logger = createLogger("[senpi][client]");
7
+ export class SenpiClient {
8
+ // Injected mode
9
+ injectedTransport;
10
+ // Self-managed mode
11
+ config;
12
+ mcpClient = null;
13
+ constructor(transportOrConfig) {
14
+ if (typeof transportOrConfig === 'function') {
15
+ this.injectedTransport = transportOrConfig;
16
+ this.config = null;
17
+ }
18
+ else {
19
+ this.injectedTransport = null;
20
+ this.config = transportOrConfig;
21
+ }
22
+ }
23
+ async connect() {
24
+ if (this.injectedTransport)
25
+ return; // no-op in injected mode
26
+ const apiKey = this.config?.apiKey?.trim() ||
27
+ process.env.SENPI_API_KEY?.trim() ||
28
+ '';
29
+ if (!apiKey) {
30
+ throw new Error('SenpiClient requires apiKey or SENPI_API_KEY env var');
31
+ }
32
+ const url = this.config?.mcpUrl
33
+ ? new URL(this.config.mcpUrl)
34
+ : process.env.SENPI_MCP_URL
35
+ ? new URL(process.env.SENPI_MCP_URL)
36
+ : new URL(MCP_BASE_URL);
37
+ const transport = new StreamableHTTPClientTransport(url, {
38
+ requestInit: {
39
+ headers: { Authorization: `Bearer ${apiKey}` },
40
+ },
41
+ });
42
+ const client = new Client({
43
+ name: this.config?.clientName ?? 'senpi-client',
44
+ version: this.config?.clientVersion ?? '0.0.1',
45
+ });
46
+ await client.connect(transport);
47
+ this.mcpClient = client;
48
+ }
49
+ async disconnect() {
50
+ if (this.injectedTransport)
51
+ return; // no-op in injected mode
52
+ if (this.mcpClient) {
53
+ try {
54
+ this.mcpClient.close();
55
+ }
56
+ catch {
57
+ // ignore on teardown
58
+ }
59
+ this.mcpClient = null;
60
+ }
61
+ }
62
+ async callTool(toolName, args) {
63
+ // Injected mode: delegate directly
64
+ if (this.injectedTransport) {
65
+ return this.injectedTransport(toolName, args);
66
+ }
67
+ // Self-managed mode: call via MCP client
68
+ if (!this.mcpClient) {
69
+ throw new Error('SenpiClient not connected — call connect() first');
70
+ }
71
+ const result = await this.mcpClient.callTool({ name: toolName, arguments: args });
72
+ if (result.content && Array.isArray(result.content) && result.content.length > 0) {
73
+ const part = result.content[0];
74
+ if (part && 'text' in part && typeof part.text === 'string') {
75
+ try {
76
+ return JSON.parse(part.text);
77
+ }
78
+ catch {
79
+ return part.text;
80
+ }
81
+ }
82
+ }
83
+ return result;
84
+ }
85
+ /**
86
+ * Returns an adapter compatible with SenpiToolClient so the same connection
87
+ * can be used for scanner provider MCP tool calls (e.g. leaderboard_get_markets).
88
+ */
89
+ asToolClient() {
90
+ return {
91
+ callTool: (name, args) => this.callTool(name, args),
92
+ };
93
+ }
94
+ async createPosition(request) {
95
+ console.log('[SenpiClient] createPosition request:', JSON.stringify(request, null, 2));
96
+ const raw = await this.callTool('create_position', {
97
+ strategyWalletAddress: request.strategyWalletAddress,
98
+ orders: request.orders,
99
+ ...(request.reason != null ? { reason: request.reason } : {}),
100
+ });
101
+ console.log('[SenpiClient] createPosition raw response:', JSON.stringify(raw, null, 2));
102
+ return parseCreatePositionResult(raw);
103
+ }
104
+ /**
105
+ * Fetch market prices. Main DEX is passed as dex: ""; use dex: "xyz" for xyz.
106
+ * If assets is omitted, the MCP returns all asset prices for that dex.
107
+ */
108
+ async getMarketPrices(params) {
109
+ const raw = await this.callTool("market_get_prices", {
110
+ dex: params.dex || "",
111
+ ...(params.assets != null && params.assets.length > 0 ? { assets: params.assets } : {}),
112
+ });
113
+ const unwrapped = unwrapEnvelope(raw) ?? raw;
114
+ if (unwrapped == null || typeof unwrapped !== "object")
115
+ return null;
116
+ const obj = unwrapped;
117
+ const prices = (obj.prices ?? obj);
118
+ const out = {};
119
+ for (const [k, v] of Object.entries(prices)) {
120
+ const n = typeof v === "number" ? v : typeof v === "string" ? Number(v) : NaN;
121
+ if (Number.isFinite(n))
122
+ out[k] = n;
123
+ }
124
+ return Object.keys(out).length > 0 ? out : null;
125
+ }
126
+ /**
127
+ * Set/update SL (and optionally TP) on an open position. Uses MCP edit_position.
128
+ * For XYZ DEX pass dex: "xyz" so coin is sent as "xyz:COIN"; otherwise main DEX uses plain coin.
129
+ */
130
+ async editPosition(wallet, payload) {
131
+ const coin = payload.dex === "xyz" && payload.coin && !payload.coin.startsWith("xyz:")
132
+ ? `xyz:${payload.coin}`
133
+ : payload.coin;
134
+ const stopLoss = payload.stopLoss != null
135
+ ? { price: payload.stopLoss.triggerPx }
136
+ : undefined;
137
+ const args = {
138
+ strategyWalletAddress: wallet,
139
+ coin,
140
+ ...(stopLoss != null ? { stopLoss } : {}),
141
+ };
142
+ const raw = await this.callTool("edit_position", args);
143
+ logger.info("edit_position raw response", {
144
+ wallet,
145
+ coin,
146
+ rawKeys: isRecord(raw) ? Object.keys(raw) : [],
147
+ rawShape: isRecord(raw) ? JSON.stringify(raw).slice(0, 500) : String(raw),
148
+ });
149
+ const result = (unwrapEnvelope(raw) ?? raw);
150
+ if (result && typeof result === "object" && !Array.isArray(result)) {
151
+ const ro = result;
152
+ const slOrderId = extractSlOrderId(ro, raw);
153
+ logger.info("edit_position parsed", {
154
+ wallet,
155
+ coin,
156
+ slOrderId,
157
+ unwrappedKeys: Object.keys(ro),
158
+ hasStopLossOrderResult: "StopLossOrderResult" in ro || "stopLossOrderResult" in ro,
159
+ });
160
+ if (slOrderId != null && Number.isFinite(slOrderId)) {
161
+ return { ...result, slOrderId };
162
+ }
163
+ const actions = ro.actionsPerformed;
164
+ if (Array.isArray(actions) && (actions.includes("stop_loss_updated") || actions.includes("stop_loss_placed"))) {
165
+ logger.warn("edit_position reported SL update but slOrderId not found in response; state will have slOrderId=null", {
166
+ keys: Object.keys(ro),
167
+ rawKeys: isRecord(raw) ? Object.keys(raw) : [],
168
+ });
169
+ }
170
+ }
171
+ return result;
172
+ }
173
+ async getOrderStatus(wallet, orderId) {
174
+ const raw = await this.callTool("execution_get_order_status", { user: wallet, orderId });
175
+ if (raw == null || typeof raw !== "object")
176
+ return null;
177
+ const obj = raw;
178
+ const filled = obj.filled ?? obj.status;
179
+ return {
180
+ filled: filled === true || (typeof filled === "string" && filled.toUpperCase() === "FILLED"),
181
+ };
182
+ }
183
+ /**
184
+ * Fetch full clearing house state for a wallet (main + xyz DEXes) from MCP.
185
+ * Uses strategy_get_clearinghouse_state (Senpi/Hyperliquid MCP). Use getPosition(wallet, coin, dex?) to resolve a single position from this state.
186
+ */
187
+ async getClearingHouseState(wallet) {
188
+ const raw = await this.callTool("strategy_get_clearinghouse_state", { strategy_wallet: wallet });
189
+ const unwrapped = unwrapEnvelope(raw);
190
+ if (unwrapped == null || typeof unwrapped !== "object")
191
+ return null;
192
+ return unwrapped;
193
+ }
194
+ /**
195
+ * Fetch position (szi, entryPx, leverage) from clearing house for a wallet+coin.
196
+ * Uses getClearingHouseState so one MCP call returns both main and xyz (and other) DEX positions;
197
+ * then looks up the position for the given coin (and optional dex).
198
+ */
199
+ async getPosition(wallet, coin, dex) {
200
+ const state = await this.getClearingHouseState(wallet);
201
+ if (state == null)
202
+ return null;
203
+ return findPositionInClearingHouseState(state, coin, dex);
204
+ }
205
+ async closePosition(wallet, coin, params) {
206
+ const effectiveCoin = params.dex === "xyz" && coin && !coin.startsWith("xyz:") ? `xyz:${coin}` : coin;
207
+ return this.callTool("close_position", {
208
+ strategyWalletAddress: wallet,
209
+ coin: effectiveCoin,
210
+ ...(params.reason ? { reason: params.reason } : {}),
211
+ });
212
+ }
213
+ /**
214
+ * List open positions for a wallet (for reconciliation). Calls MCP tool list_open_positions.
215
+ * If the tool is not implemented or fails, returns [] so reconciliation can continue.
216
+ */
217
+ async listOpenPositions(wallet) {
218
+ try {
219
+ const raw = await this.callTool("list_open_positions", { wallet });
220
+ if (!Array.isArray(raw))
221
+ return [];
222
+ return raw.filter((p) => p != null && typeof p === "object" && typeof p.coin === "string");
223
+ }
224
+ catch {
225
+ return [];
226
+ }
227
+ }
228
+ // ─── New MCP methods ────────────────────────────────────────────────────────
229
+ async getStrategy(wallet) {
230
+ const raw = await this.callTool("strategy_get", { strategy_wallet: wallet });
231
+ const data = unwrapEnvelope(raw);
232
+ if (!isRecord(data))
233
+ return null;
234
+ return {
235
+ strategyId: asString(data.strategyId) ?? asString(data.id) ?? "",
236
+ name: asString(data.name) ?? "",
237
+ status: asString(data.status) ?? "",
238
+ traderAddress: asString(data.traderAddress) ?? "",
239
+ initialBudget: asNumber(data.initialBudget) ?? 0,
240
+ totalPnl: asNumber(data.totalPnl) ?? 0,
241
+ pnlPercentage: asNumber(data.pnlPercentage) ?? 0,
242
+ createdAt: asString(data.createdAt) ?? "",
243
+ };
244
+ }
245
+ async getOpenOrders(wallet) {
246
+ const raw = await this.callTool("strategy_get_open_orders", { strategy_wallet: wallet });
247
+ const data = unwrapEnvelope(raw);
248
+ const arr = Array.isArray(data) ? data : (isRecord(data) && Array.isArray(data.orders) ? data.orders : []);
249
+ return arr.filter(isRecord).map((o) => ({
250
+ orderId: asNumber(o.orderId) ?? 0,
251
+ coin: asString(o.coin) ?? "",
252
+ side: (asString(o.side) ?? "BUY"),
253
+ size: asNumber(o.size) ?? asNumber(o.sz) ?? 0,
254
+ price: asNumber(o.price) ?? asNumber(o.limitPx) ?? 0,
255
+ orderType: asString(o.orderType) ?? asString(o.type) ?? "",
256
+ status: asString(o.status) ?? "",
257
+ timestamp: asNumber(o.timestamp) ?? 0,
258
+ }));
259
+ }
260
+ async getTraderHistory(wallet, opts) {
261
+ const args = { traderAddress: wallet, latest: true };
262
+ if (opts?.limit != null)
263
+ args.limit = opts.limit;
264
+ if (opts?.offset != null)
265
+ args.offset = opts.offset;
266
+ if (opts?.sort_by != null)
267
+ args.sort_by = opts.sort_by;
268
+ if (opts?.sort_direction != null)
269
+ args.sort_direction = opts.sort_direction;
270
+ const raw = await this.callTool("discovery_get_trader_history", args);
271
+ const data = unwrapEnvelope(raw);
272
+ const arr = Array.isArray(data) ? data : (isRecord(data) && Array.isArray(data.trades) ? data.trades : []);
273
+ return arr.filter(isRecord).map((t) => {
274
+ const szi = asNumber(t.szi) ?? 0;
275
+ return {
276
+ coin: asString(t.coin) ?? "",
277
+ direction: (szi >= 0 ? "LONG" : "SHORT"),
278
+ entryPx: asNumber(t.entryPx) ?? 0,
279
+ closePx: asNumber(t.closePx) ?? 0,
280
+ szi,
281
+ realizedPnl: asNumber(t.realizedPnl) ?? 0,
282
+ closedTime: asNumber(t.closedTime) ?? asNumber(t.closeTime) ?? 0,
283
+ openTime: asNumber(t.openTime) ?? 0,
284
+ totalFees: asNumber(t.totalFees) ?? 0,
285
+ };
286
+ });
287
+ }
288
+ async topUp(wallet, amount) {
289
+ const raw = await this.callTool("strategy_top_up", { strategy_wallet: wallet, amount });
290
+ const data = unwrapEnvelope(raw);
291
+ if (!isRecord(data))
292
+ return { success: false };
293
+ return { success: data.success === true, message: asString(data.message) ?? undefined };
294
+ }
295
+ async withdrawFunds(wallet, amount) {
296
+ const raw = await this.callTool("strategy_withdraw_funds", { strategy_wallet: wallet, amount });
297
+ const data = unwrapEnvelope(raw);
298
+ if (!isRecord(data))
299
+ return { success: false };
300
+ return { success: data.success === true, message: asString(data.message) ?? undefined };
301
+ }
302
+ async closeStrategy(wallet) {
303
+ const raw = await this.callTool("strategy_close", { strategy_wallet: wallet });
304
+ const data = unwrapEnvelope(raw);
305
+ if (!isRecord(data))
306
+ return { success: false };
307
+ return { success: data.success === true, message: asString(data.message) ?? undefined };
308
+ }
309
+ async closePositions(wallet, positions) {
310
+ return this.callTool("strategy_close_positions", {
311
+ strategy_wallet: wallet,
312
+ positions,
313
+ });
314
+ }
315
+ async cancelOrder(wallet, orderId) {
316
+ return this.callTool("cancel_order", {
317
+ strategyWalletAddress: wallet,
318
+ orderId,
319
+ });
320
+ }
321
+ async getAssetTradingLimits(wallet, coin, dex) {
322
+ try {
323
+ const args = { strategy_wallet: wallet, coin };
324
+ if (dex != null)
325
+ args.dex = dex;
326
+ const raw = await this.callTool("strategy_get_asset_trading_limits", args);
327
+ const data = unwrapEnvelope(raw) ?? raw;
328
+ if (!isRecord(data))
329
+ return null;
330
+ const leverage = data.leverage;
331
+ const value = leverage != null ? asNumber(leverage.value) : asNumber(data.maxLeverage);
332
+ if (value == null)
333
+ return null;
334
+ return { maxLeverage: value };
335
+ }
336
+ catch (err) {
337
+ logger.warn("getAssetTradingLimits failed", { wallet, coin, err });
338
+ return null;
339
+ }
340
+ }
341
+ async listInstruments() {
342
+ const raw = await this.callTool("market_list_instruments", {});
343
+ const unwrapped = unwrapEnvelope(raw) ?? raw;
344
+ if (unwrapped == null || typeof unwrapped !== "object")
345
+ return [];
346
+ const obj = unwrapped;
347
+ const instrumentsRaw = obj.instruments;
348
+ if (!Array.isArray(instrumentsRaw))
349
+ return [];
350
+ const result = [];
351
+ for (const row of instrumentsRaw) {
352
+ if (!isRecord(row))
353
+ continue;
354
+ const name = asString(row.name);
355
+ const maxLeverage = asNumber(row.max_leverage);
356
+ if (name != null && maxLeverage != null) {
357
+ result.push({ name, maxLeverage });
358
+ }
359
+ }
360
+ return result;
361
+ }
362
+ async getPnlHistory(wallet, opts) {
363
+ const args = { strategy_wallet: wallet };
364
+ if (opts?.period != null)
365
+ args.period = opts.period;
366
+ return this.callTool("strategy_get_pnl_and_account_value_history", args);
367
+ }
368
+ }
369
+ // ─── Response parsing ────────────────────────────────────────────────────────
370
+ /**
371
+ * Extract SL order ID from edit_position response. Tries multiple common shapes
372
+ * so state gets slOrderId even when MCP returns it under different keys.
373
+ * MCP may return: data.ordersUpdated.stopLoss.orderId or StopLossOrderResult.orderId.
374
+ */
375
+ function extractSlOrderId(unwrapped, raw) {
376
+ const from = (v) => (v != null && Number.isFinite(asNumber(v)) ? asNumber(v) : null);
377
+ const fromObj = (obj, key) => obj && typeof obj === "object" && key in obj ? from(obj[key]) : null;
378
+ const ou = unwrapped.ordersUpdated;
379
+ const stopLossObj = ou && typeof ou === "object" && "stopLoss" in ou ? ou.stopLoss : undefined;
380
+ let n = from(unwrapped.slOrderId)
381
+ ?? (ou && "slOrderId" in ou ? from(ou.slOrderId) : null)
382
+ ?? from(unwrapped.stopLossOrderId)
383
+ ?? from(ou?.stopLossOrderId)
384
+ ?? fromObj(stopLossObj, "orderId")
385
+ ?? fromObj(unwrapped.StopLossOrderResult, "orderId")
386
+ ?? fromObj(unwrapped.stopLossOrderResult, "orderId");
387
+ if (n != null)
388
+ return n;
389
+ if (isRecord(raw) && isRecord(raw.data)) {
390
+ const data = raw.data;
391
+ const dataOu = data.ordersUpdated;
392
+ const dataStopLoss = dataOu && typeof dataOu === "object" && "stopLoss" in dataOu ? dataOu.stopLoss : undefined;
393
+ n =
394
+ from(data.slOrderId)
395
+ ?? from(dataOu?.slOrderId)
396
+ ?? from(data.stopLossOrderId)
397
+ ?? fromObj(dataStopLoss, "orderId")
398
+ ?? fromObj(data.StopLossOrderResult, "orderId")
399
+ ?? fromObj(data.stopLossOrderResult, "orderId");
400
+ if (n != null)
401
+ return n;
402
+ }
403
+ return null;
404
+ }
405
+ function parseCreatePositionResult(raw) {
406
+ const data = unwrapEnvelope(raw);
407
+ if (!isRecord(data)) {
408
+ return { success: false, orders: [], error: 'Invalid response shape' };
409
+ }
410
+ const success = typeof data.success === 'boolean' ? data.success : false;
411
+ const error = typeof data.error === 'string' ? data.error
412
+ : typeof data.message === 'string' ? data.message
413
+ : null;
414
+ const rawOrders = Array.isArray(data.results) ? data.results : (Array.isArray(data.orders) ? data.orders : []);
415
+ const orders = [];
416
+ for (const row of rawOrders) {
417
+ if (!isRecord(row))
418
+ continue;
419
+ // MCP response nests fill data under mainOrder
420
+ const mainOrder = isRecord(row.mainOrder) ? row.mainOrder : row;
421
+ // error can be an object { code, description } or a string
422
+ const rowError = isRecord(row.error)
423
+ ? asString(row.error.description) ?? asString(row.error.code)
424
+ : asString(row.error);
425
+ orders.push({
426
+ coin: asString(row.coin) ?? asString(mainOrder.coin) ?? '',
427
+ direction: asDirection(row.direction) ?? asDirection(mainOrder.direction) ?? 'LONG',
428
+ leverage: asNumber(row.leverage) ?? asNumber(mainOrder.leverage) ?? 0,
429
+ marginAmount: asNumber(row.marginAmount) ?? asNumber(row.marginUsed) ?? 0,
430
+ entryPrice: asNumber(mainOrder.avgPrice) ?? asNumber(mainOrder.entryPrice) ?? asNumber(row.avgPrice),
431
+ size: asNumber(mainOrder.filledSize) ?? asNumber(mainOrder.size) ?? asNumber(row.filledSize),
432
+ filled: String(mainOrder.status).toUpperCase() === 'FILLED' || (typeof row.filled === 'boolean' ? row.filled : false),
433
+ orderId: stringifyId(mainOrder.orderId) ?? stringifyId(row.orderId),
434
+ executionAsMaker: typeof mainOrder.executionAsMaker === 'boolean' ? mainOrder.executionAsMaker : null,
435
+ error: rowError,
436
+ });
437
+ }
438
+ return { success, orders, error };
439
+ }
440
+ // ─── Clearing house state lookup ─────────────────────────────────────────────
441
+ function positionFromRaw(obj) {
442
+ const szi = asNumber(obj.szi) ?? asNumber(obj.size);
443
+ const entryPx = asNumber(obj.entryPx) ?? asNumber(obj.entryPrice) ?? asNumber(obj.avgPrice);
444
+ if (szi == null || entryPx == null || !Number.isFinite(szi) || !Number.isFinite(entryPx)) {
445
+ return null;
446
+ }
447
+ let leverage = asNumber(obj.leverage);
448
+ if (leverage == null && isRecord(obj.leverage) && typeof obj.leverage.value === "number") {
449
+ leverage = obj.leverage.value;
450
+ }
451
+ const result = { szi, entryPx };
452
+ if (leverage != null && Number.isFinite(leverage))
453
+ result.leverage = leverage;
454
+ return result;
455
+ }
456
+ function coinMatches(pos, coin) {
457
+ const c = asString(pos.coin) ?? asString(pos.asset) ?? "";
458
+ return c.toUpperCase() === coin.toUpperCase() || c === coin;
459
+ }
460
+ /**
461
+ * Find a position for the given coin (and optional dex) in clearing house state.
462
+ * Senpi MCP (strategy_get_clearinghouse_state) returns { main, xyz } where each value is
463
+ * ClearinghouseState: { assetPositions: [ { type, position: { coin, szi, entryPx, leverage } } ] }.
464
+ * Also supports flat { positions: [ { coin, dex?, ... } ] } or per-DEX arrays.
465
+ */
466
+ function findPositionInClearingHouseState(state, coin, dex) {
467
+ // Single flat list with optional dex on each item
468
+ const positions = state.positions ?? state.positionsList;
469
+ if (Array.isArray(positions)) {
470
+ for (const p of positions) {
471
+ if (!isRecord(p))
472
+ continue;
473
+ const pos = isRecord(p.position) ? p.position : p;
474
+ if (!coinMatches(pos, coin))
475
+ continue;
476
+ if (dex != null && dex !== "") {
477
+ const d = asString(p.dex) ?? "";
478
+ if (d !== dex)
479
+ continue;
480
+ }
481
+ const result = positionFromRaw(pos);
482
+ if (result)
483
+ return result;
484
+ }
485
+ return null;
486
+ }
487
+ // Per-DEX keys (main, xyz): each value is ClearinghouseState with assetPositions
488
+ const keysToSearch = dex != null && dex !== "" ? [dex] : Object.keys(state);
489
+ for (const key of keysToSearch) {
490
+ const dexState = state[key];
491
+ if (dexState == null || typeof dexState !== "object")
492
+ continue;
493
+ const dexObj = dexState;
494
+ const assetPositions = dexObj.assetPositions;
495
+ if (!Array.isArray(assetPositions))
496
+ continue;
497
+ for (const item of assetPositions) {
498
+ if (!isRecord(item))
499
+ continue;
500
+ const pos = isRecord(item.position) ? item.position : item;
501
+ if (!coinMatches(pos, coin))
502
+ continue;
503
+ const result = positionFromRaw(pos);
504
+ if (result)
505
+ return result;
506
+ }
507
+ }
508
+ return null;
509
+ }
510
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
511
+ function asDirection(value) {
512
+ if (value === 'LONG' || value === 'SHORT')
513
+ return value;
514
+ return null;
515
+ }
516
+ function stringifyId(value) {
517
+ if (typeof value === 'string')
518
+ return value;
519
+ if (typeof value === 'number' && Number.isFinite(value))
520
+ return String(value);
521
+ return null;
522
+ }
523
+ //# sourceMappingURL=client.js.map