@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,123 @@
1
+ export type { HookEventType, HookEvent, HookSystem } from '../types/hooks.js';
2
+ export type { NotificationService } from '../types/notification.js';
3
+ export type { StrategyConfig, } from '../types/strategy.js';
4
+ export type { StateManager, GateCheckResult, RiskGuard, } from '../types/action.js';
5
+ export type { Signal, ScanResult } from '../types/scanner.js';
6
+ export { ScanStatus } from '../types/scanner.js';
7
+ import type { Signal, ScanResult } from '../types/scanner.js';
8
+ /** Per-strategy slot counts for action payload. */
9
+ export interface StrategySlots {
10
+ total: number;
11
+ used: number;
12
+ available: number;
13
+ }
14
+ /** Action-specific enrichment wrapper around a scanner ScanResult. */
15
+ export interface ActionScanPayload {
16
+ scanResult: ScanResult;
17
+ /** Sorted signals (e.g. scanResult.signals) for actions to consider. */
18
+ topPicks?: Signal[];
19
+ /** Per-strategy total/used/available slots. Keys are addresses. */
20
+ strategySlots?: Record<string, StrategySlots>;
21
+ /** True when the emitting strategy (or any, if no address filter) has available slots. */
22
+ anySlotsAvailable?: boolean;
23
+ /** Sum of available slots (for emitting strategy when address set, else all). */
24
+ totalAvailableSlots?: number;
25
+ /** Number of scans in history (optional). */
26
+ scansInHistory?: number;
27
+ }
28
+ export interface LlmDecisionRequest {
29
+ prompt: string;
30
+ context: Record<string, unknown>;
31
+ model?: string;
32
+ maxTokens?: number;
33
+ temperature?: number;
34
+ }
35
+ export interface LlmDecisionResponse<T = unknown> {
36
+ decision: T;
37
+ rawResponse: string;
38
+ tokensUsed: number;
39
+ latencyMs: number;
40
+ }
41
+ export interface LlmDecision {
42
+ decide<T>(request: LlmDecisionRequest): Promise<LlmDecisionResponse<T>>;
43
+ }
44
+ import type { HookEvent, HookSystem } from '../types/hooks.js';
45
+ import type { NotificationService } from '../types/notification.js';
46
+ import type { StrategyConfig } from '../types/strategy.js';
47
+ import type { RuntimeContext } from '../types/runtime.js';
48
+ import type { RiskGuard, StateManager } from '../types/action.js';
49
+ import type { SenpiClient } from '../senpi/client.js';
50
+ import type { ContextBuilder } from '../context/types.js';
51
+ export type ActionType = 'OPEN_POSITION' | 'CLOSE_POSITION' | 'EMERGENCY_CLOSE_ALL' | string;
52
+ export type DecisionMode = 'llm' | 'script' | 'agent' | 'rule' | 'none';
53
+ export interface ActionConfig {
54
+ name: string;
55
+ action_type: ActionType;
56
+ decision_mode: DecisionMode;
57
+ decision_model?: string;
58
+ scanners?: string[];
59
+ min_confidence?: number;
60
+ context?: import('../context/types.js').ContextEntry[];
61
+ decision_prompt?: string;
62
+ params?: Record<string, unknown>;
63
+ }
64
+ export interface ActionContext {
65
+ senpi: SenpiClient;
66
+ stateManager: StateManager;
67
+ hookSystem: HookSystem;
68
+ llmDecision: LlmDecision;
69
+ contextBuilder: ContextBuilder;
70
+ riskGuard: RiskGuard;
71
+ notifications: NotificationService;
72
+ strategies: Map<string, StrategyConfig>;
73
+ playbook: {
74
+ tradingStrategyName: string;
75
+ version: string;
76
+ };
77
+ maxLeverageData: Record<string, number>;
78
+ }
79
+ /**
80
+ * Base decision output from the decision layer.
81
+ * Enforced fields are common to ALL actions.
82
+ * Action-specific fields go in `payload` — each action defines its own shape.
83
+ */
84
+ export interface ActionDecision {
85
+ execute: boolean;
86
+ actionType: ActionType;
87
+ confidence: number;
88
+ reasoning: string;
89
+ payload: Record<string, unknown>;
90
+ }
91
+ export interface ActionResult {
92
+ success: boolean;
93
+ action_type: ActionType;
94
+ summary: string;
95
+ data?: Record<string, unknown>;
96
+ skipped?: boolean;
97
+ skipReason?: string;
98
+ error?: string;
99
+ }
100
+ /**
101
+ * Core Action contract. Every action implementation must satisfy this.
102
+ *
103
+ * Actions are event-driven: instantiated once, receive events via handle(),
104
+ * return results. They do NOT subscribe themselves to events — the orchestrator
105
+ * (future) handles wiring.
106
+ *
107
+ * Lifecycle: create (factory) -> start() -> handle() [repeated] -> stop()
108
+ */
109
+ export interface Action {
110
+ readonly name: string;
111
+ readonly actionType: ActionType;
112
+ handle(event: HookEvent): Promise<ActionResult>;
113
+ }
114
+ export type ActionFactory = (config: ActionConfig, context: RuntimeContext) => Action;
115
+ export interface ActionManifest {
116
+ type: string;
117
+ name: string;
118
+ description?: string;
119
+ eventsConsumed: string[];
120
+ eventsEmitted: string[];
121
+ configSchema?: Record<string, unknown>;
122
+ }
123
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/actions/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // ─── Re-export shared types used by the action system ───────────────────────
2
+ export { ScanStatus } from '../types/scanner.js';
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/actions/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAgB/E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * senpi guide subcommands — in-shell reference for @senpi/trading-recipe.
3
+ *
4
+ * All reference text is static string constants. This is intentional: the
5
+ * scanner registry does not expose configSchema or description metadata at
6
+ * runtime (ScannerEngine.list() only returns id/enabled/intervalSeconds).
7
+ *
8
+ * TODO: replace static strings with dynamic registry metadata once
9
+ * ScannerEngine exposes configSchema per scanner type. Relevant type is
10
+ * ScannerRegistrationSummary in src/scanners/engine/engine.ts.
11
+ */
12
+ /** Minimal Commander command type — mirrors the interface in senpi-commands.ts */
13
+ interface CommanderCommand {
14
+ command(name: string, desc?: string): CommanderCommand;
15
+ description(desc: string): CommanderCommand;
16
+ option(flags: string, description?: string): CommanderCommand;
17
+ action(fn: (opts?: Record<string, unknown>) => void | Promise<void>): CommanderCommand;
18
+ }
19
+ /**
20
+ * Register `senpi guide [subcommand]` on the senpi Commander subprogram.
21
+ * @param senpi - the `senpi` Commander command object
22
+ * @param version - plugin version string (from src/version.ts)
23
+ */
24
+ export declare function registerGuideCommands(senpi: CommanderCommand, version: string): void;
25
+ export {};
26
+ //# sourceMappingURL=guide-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-commands.d.ts","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAgTH,kFAAkF;AAClF,UAAU,gBAAgB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC9D,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;CACxF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,GACd,IAAI,CA2CN"}
@@ -0,0 +1,345 @@
1
+ /**
2
+ * senpi guide subcommands — in-shell reference for @senpi/trading-recipe.
3
+ *
4
+ * All reference text is static string constants. This is intentional: the
5
+ * scanner registry does not expose configSchema or description metadata at
6
+ * runtime (ScannerEngine.list() only returns id/enabled/intervalSeconds).
7
+ *
8
+ * TODO: replace static strings with dynamic registry metadata once
9
+ * ScannerEngine exposes configSchema per scanner type. Relevant type is
10
+ * ScannerRegistrationSummary in src/scanners/engine/engine.ts.
11
+ */
12
+ const CHANGELOG_URL = "https://github.com/Senpi-ai/senpi-trading-runtime/blob/main/CHANGELOG.md";
13
+ // ── Reference text constants ────────────────────────────────────────────────
14
+ const OVERVIEW_TEXT = (version) => `
15
+ @senpi/trading-recipe v${version}
16
+
17
+ Event-driven automated trading plugin for OpenClaw. Orchestrates scanners,
18
+ LLM-based trade decisions, and a DSL trailing stop-loss exit engine.
19
+
20
+ Flow: Scanner → signal queue → Action (optional LLM) → position → DSL exit
21
+
22
+ Quick commands:
23
+ senpi guide scanners Scanner types and config fields
24
+ senpi guide actions Action types and decision modes
25
+ senpi guide dsl DSL exit: phases, lock modes, tiers, time-based cuts
26
+ senpi guide examples Print minimal strategy YAML
27
+ senpi guide schema Full YAML schema field reference
28
+ senpi guide version Plugin version and changelog URL
29
+
30
+ Docs: docs/runtime-docs/
31
+ `.trim();
32
+ const SCANNERS_TEXT = `
33
+ Scanner types
34
+ ─────────────────────────────────────────────────────────────────────────────
35
+
36
+ emerging_movers
37
+ Watches the Senpi smart-money leaderboard for rank and contribution
38
+ movements. Stateful — compares each scan to stored history.
39
+ Typical interval: 20s–60s
40
+
41
+ Signal types (priority order):
42
+ FIRST_JUMP (score 0.95) 10+ rank jump from deep, first appearance
43
+ CONTRIB_EXPLOSION (score 0.90) 3x+ contribution spike in one scan
44
+ IMMEDIATE_MOVER (score 0.85) 10+ rank jump, token was already tracked
45
+ NEW_ENTRY_DEEP (score 0.80) New entry landing directly in top 20
46
+ DEEP_CLIMBER (score 0.60) Moderate rank gain from a deep position
47
+
48
+ Config fields:
49
+ topN number 50 Track top N by SM contribution
50
+ minRankJump number 5 Min rank improvement for DEEP_CLIMBER
51
+ minTopTradersGain number 0.1 Min contribution threshold
52
+ minScansBeforeSignals number 2 Warm-up scans before emitting signals
53
+ historyLimit number 60 Max history entries per token
54
+ immediateJumpThreshold number 10 Rank jump for IMMEDIATE_MOVER/FIRST_JUMP
55
+ deepClimbRankThreshold number 25 Starting rank for deep-climb detection
56
+ contribExplosionMultiplier number 3.0 Ratio for CONTRIB_EXPLOSION
57
+ firstJumpMinPrevRank number 30 Prev-rank floor for FIRST_JUMP
58
+
59
+ ──────────────────────────────────────────────────────────────────────────────
60
+
61
+ momentum
62
+ Emits directional breakout signals based on candle price movement.
63
+ Works best paired with the prescreener scanner.
64
+ Typical interval: 1m
65
+
66
+ Signal types: MOMENTUM_BREAKOUT (LONG or SHORT)
67
+
68
+ Config fields:
69
+ timeframe string "1h" Candle timeframe to analyze
70
+ minMovePct number 1.5 Min price change % to emit a signal
71
+ maxCandidates number 20 Max assets evaluated per scan
72
+ minDayVolume number 1e6 Min 24h volume filter (fallback only)
73
+ minSignalScore number 0.2 Min signal score threshold (0–1)
74
+ requirePrescreened boolean true Only scan assets from the prescreener
75
+
76
+ ──────────────────────────────────────────────────────────────────────────────
77
+
78
+ prescreener
79
+ Infrastructure scanner. Ranks liquid instruments by a composite
80
+ liquidity/momentum/OI score and publishes a shared artifact consumed
81
+ by momentum and oi_tracker. Add this scanner before those in your YAML.
82
+ Typical interval: 5m
83
+
84
+ Signal types: none (artifact producer only)
85
+
86
+ Config fields:
87
+ topN number 30 Assets passed through to downstream scanners
88
+ minDayVolume number 1e6 Min 24h notional volume
89
+ minLeverage number 2 Min max-leverage (filters illiquid markets)
90
+ minOpenInterest number 0 Min open interest
91
+
92
+ ──────────────────────────────────────────────────────────────────────────────
93
+
94
+ oi_tracker
95
+ Infrastructure scanner. Samples open interest per instrument and writes
96
+ an oi-history artifact. Used by downstream scanners that need OI trend data.
97
+ Typical interval: 1m
98
+
99
+ Signal types: none (artifact producer only)
100
+
101
+ Config fields:
102
+ minDayVolume number 1e6 Min 24h volume; instruments below are skipped
103
+ maxHistory number 60 Max OI snapshots retained per instrument
104
+ `.trim();
105
+ const ACTIONS_TEXT = `
106
+ Action types
107
+ ─────────────────────────────────────────────────────────────────────────────
108
+
109
+ OPEN_POSITION
110
+ Opens a new position on Senpi. Checks slot availability before executing.
111
+
112
+ Required YAML fields:
113
+ action_type OPEN_POSITION
114
+ decision_mode llm | no_decision
115
+ scanners list of scanner names that feed this action
116
+ min_confidence 0–10; signals below this score are skipped
117
+
118
+ Optional fields:
119
+ decision_model Claude model id (required when decision_mode: llm)
120
+ context list of context fields injected into the prompt
121
+ currently supported: signal
122
+ decision_prompt system prompt template; use {{signal}} for signal JSON
123
+
124
+ Decision modes:
125
+ llm Claude evaluates each signal. Prompt receives {{signal}} as JSON.
126
+ Claude must respond with:
127
+ {
128
+ "execute": true | false,
129
+ "actionType": "OPEN_POSITION",
130
+ "confidence": 1–10,
131
+ "reasoning": "one sentence",
132
+ "payload": { "asset": "SOL", "direction": "LONG" | "SHORT" }
133
+ }
134
+ Trades are skipped when execute=false or confidence < min_confidence.
135
+
136
+ no_decision Opens a position for every qualifying signal immediately.
137
+ No LLM call. Use with tight DSL stops to manage risk.
138
+ `.trim();
139
+ const DSL_TEXT = `
140
+ DSL exit engine — two-phase trailing stop-loss
141
+ ─────────────────────────────────────────────────────────────────────────────
142
+
143
+ The DSL monitors open positions on a configurable interval and closes them
144
+ when price breaches the computed floor. Supports lock_mode (pctOfHighWater
145
+ or fixedRoe), Phase 1 fixed + trailing floor, Phase 2 tiers, and optional
146
+ Phase 1 time-based cuts (hard_timeout, weak_peak_cut, dead_weight_cut).
147
+
148
+ exit:
149
+ engine: dsl
150
+ interval_seconds: 30 # how often the price monitor runs
151
+
152
+ dsl_presets:
153
+ <preset_name>:
154
+ lock_mode: pctOfHighWater # or fixed_roe; YAML accepts snake_case
155
+ phase1: ...
156
+ phase2_trigger_tier: 0
157
+ phase2: ...
158
+
159
+ ──────────────────────────────────────────────────────────────────────────────
160
+ Phase 1 — Fixed floor + optional trailing
161
+ Active from entry until the tier at phase2_trigger_tier is crossed.
162
+ Floor = max(absolute_floor, trailing_floor). Absolute floor from max_loss_pct
163
+ (entry × (1 − max_loss_pct/100/leverage) for LONG). Trailing uses phase1
164
+ retraceThreshold (ROE %) so the floor can rise with high-water.
165
+
166
+ phase1:
167
+ max_loss_pct: 3.0 # e.g. 3% max loss at 1×
168
+ consecutive_breaches_required: 3 # ticks below floor before exit
169
+ # Optional time-based cuts (each: enabled, interval_in_minutes):
170
+ # hard_timeout, weak_peak_cut (min_value ROE %), dead_weight_cut
171
+
172
+ ──────────────────────────────────────────────────────────────────────────────
173
+ Phase 2 — Tiers + trailing floor (high-water retrace)
174
+ Starts when price reaches the tier at phase2_trigger_tier (0 = first tier).
175
+ Floor = max(tier_floor, trailing_floor). Retrace values are ROE %; the
176
+ engine divides by leverage for price (e.g. 1.5% ROE at 10× = 0.15% below HW).
177
+
178
+ phase2_trigger_tier: 0
179
+
180
+ phase2:
181
+ retrace_threshold: 1.5 # default ROE % retrace from HWM
182
+ consecutive_breaches_required: 1
183
+
184
+ tiers:
185
+ # trigger_pct = ROE % from entry that activates this tier
186
+ # lock_hw_pct = % of high-water ROE to lock (pctOfHighWater); floor trails every tick
187
+ # lock_pct = % of (entry→HW) range to lock (fixedRoe); floor fixed at tier trigger
188
+ # retrace = ROE % retrace for this tier (overrides retrace_threshold)
189
+ - { trigger_pct: 10, lock_hw_pct: 50 }
190
+ - { trigger_pct: 20, lock_hw_pct: 70 }
191
+ - { trigger_pct: 30, lock_hw_pct: 73, retrace: 1.2 }
192
+ - { trigger_pct: 50, lock_hw_pct: 80, retrace: 1.0 }
193
+
194
+ ──────────────────────────────────────────────────────────────────────────────
195
+ State and events
196
+ Per-position state at {stateDir}/strategies/{id}/... . Close reason preserved
197
+ on pendingClose retry (phase1_timeout, weak_peak_cut, dead_weight_cut, dsl_breach).
198
+ Events: dsl.created, dsl.tier_advanced, dsl.sl_updated, dsl.phase_changed, position.closed
199
+ `.trim();
200
+ const SCHEMA_TEXT = `
201
+ YAML schema — top-level keys
202
+ ─────────────────────────────────────────────────────────────────────────────
203
+ Key Type Req Description
204
+ name string Yes Strategy name
205
+ version string No Version identifier
206
+ description string No Human-readable description
207
+ strategies object Yes Keyed strategy configs (non-empty)
208
+ scanners array * Scanner definitions (* required when actions
209
+ have OPEN_POSITION or a scanners list)
210
+ actions array No Action definitions
211
+ exit object No Exit / DSL block
212
+ health object No Health check config
213
+ hooks array No Hook definitions
214
+ notifications object No e.g. telegram_chat_id
215
+ advanced object No Extra options
216
+
217
+ strategies.<name>
218
+ wallet string Yes Wallet address; supports \${VAR} substitution
219
+ budget number No Total budget
220
+ slots number No Max concurrent positions
221
+ margin_per_slot number No Margin per slot
222
+ trading_risk string No conservative | moderate | aggressive
223
+ enabled boolean No Default true
224
+
225
+ scanners[]
226
+ name string Yes Unique name referenced in actions.scanners
227
+ type string Yes emerging_movers | momentum | prescreener | oi_tracker
228
+ interval string Yes e.g. "30s", "2m", "1h"
229
+ blocked_assets array No
230
+ config object No Scanner-specific config (see: senpi guide scanners)
231
+ advanced object No
232
+
233
+ actions[]
234
+ name string Yes
235
+ action_type string Yes OPEN_POSITION
236
+ decision_mode string Yes llm | no_decision
237
+ decision_model string No Required when decision_mode: llm
238
+ scanners string[] No Scanner names this action listens to
239
+ min_confidence number No 0–10
240
+ context string[] No [signal]
241
+ decision_prompt string No Prompt template with {{signal}}
242
+ params object No
243
+
244
+ exit
245
+ engine string No dsl
246
+ interval_seconds number No Default 30 (min 5)
247
+ dsl_presets object No Presets keyed by name (preferred)
248
+ dsl object No Legacy alias for dsl_presets
249
+
250
+ Preset: lock_mode (pctOfHighWater | fixedRoe), phase1 (max_loss_pct,
251
+ consecutive_breaches_required, optional hard_timeout/weak_peak_cut/dead_weight_cut),
252
+ phase2_trigger_tier, phase2 (retrace_threshold ROE %, tiers with trigger_pct,
253
+ lock_hw_pct or lock_pct; tier retrace = ROE %). See: senpi guide dsl
254
+
255
+ Environment substitution: \${VAR} and \${VAR:-default} resolved at load time.
256
+ `.trim();
257
+ const MINIMAL_YAML = `
258
+ name: minimal
259
+ version: 1.0.0
260
+ description: Watch-only strategy — logs signals, opens no positions.
261
+
262
+ strategies:
263
+ watch-only:
264
+ wallet: "\${WALLET_ADDRESS}"
265
+ budget: "0"
266
+ slots: 1
267
+ margin_per_slot: 0
268
+ trading_risk: conservative
269
+ enabled: true
270
+
271
+ scanners:
272
+ - name: emerging_movers
273
+ type: emerging_movers
274
+ interval: 60s
275
+ config:
276
+ topN: 20
277
+ minRankJump: 5
278
+ minScansBeforeSignals: 2
279
+
280
+ actions:
281
+ - name: log_signals
282
+ action_type: OPEN_POSITION
283
+ decision_mode: no_decision
284
+ scanners: [emerging_movers]
285
+ min_confidence: 0
286
+
287
+ exit:
288
+ engine: dsl
289
+ interval_seconds: 60
290
+ dsl_presets:
291
+ default:
292
+ lock_mode: pctOfHighWater
293
+ phase1:
294
+ consecutive_breaches_required: 3
295
+ max_loss_pct: 5.0
296
+ phase2_trigger_tier: 0
297
+ phase2:
298
+ retrace_threshold: 1.5
299
+ consecutive_breaches_required: 1
300
+ tiers:
301
+ - { trigger_pct: 1, lock_hw_pct: 50 }
302
+ `.trim();
303
+ /**
304
+ * Register `senpi guide [subcommand]` on the senpi Commander subprogram.
305
+ * @param senpi - the `senpi` Commander command object
306
+ * @param version - plugin version string (from src/version.ts)
307
+ */
308
+ export function registerGuideCommands(senpi, version) {
309
+ const guide = senpi.command("guide")
310
+ .description("In-shell reference for @senpi/trading-recipe");
311
+ guide.action(() => {
312
+ process.stdout.write(OVERVIEW_TEXT(version) + "\n");
313
+ });
314
+ guide.command("scanners")
315
+ .description("Scanner types and config fields")
316
+ .action(() => {
317
+ process.stdout.write(SCANNERS_TEXT + "\n");
318
+ });
319
+ guide.command("actions")
320
+ .description("Action types and decision modes")
321
+ .action(() => {
322
+ process.stdout.write(ACTIONS_TEXT + "\n");
323
+ });
324
+ guide.command("dsl")
325
+ .description("DSL exit engine: phases, lock modes, tiers, time-based cuts")
326
+ .action(() => {
327
+ process.stdout.write(DSL_TEXT + "\n");
328
+ });
329
+ guide.command("examples")
330
+ .description("Print minimal strategy YAML to stdout")
331
+ .action(() => {
332
+ process.stdout.write(MINIMAL_YAML + "\n");
333
+ });
334
+ guide.command("schema")
335
+ .description("Full YAML schema field reference")
336
+ .action(() => {
337
+ process.stdout.write(SCHEMA_TEXT + "\n");
338
+ });
339
+ guide.command("version")
340
+ .description("Plugin version and changelog URL")
341
+ .action(() => {
342
+ process.stdout.write(`@senpi/trading-recipe v${version}\n${CHANGELOG_URL}\n`);
343
+ });
344
+ }
345
+ //# sourceMappingURL=guide-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-commands.js","sourceRoot":"","sources":["../../src/cli/guide-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,aAAa,GACjB,0EAA0E,CAAC;AAE7E,+EAA+E;AAE/E,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC;yBAClB,OAAO;;;;;;;;;;;;;;;;CAgB/B,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwErB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCpB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DhB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDnB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CpB,CAAC,IAAI,EAAE,CAAC;AAYT;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAuB,EACvB,OAAe;IAEf,MAAM,KAAK,GAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAsB;SACvD,WAAW,CAAC,8CAA8C,CAAC,CAAC;IAE/D,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,UAAU,CAAsB;SAC5C,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,SAAS,CAAsB;SAC3C,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,KAAK,CAAsB;SACvC,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,UAAU,CAAsB;SAC5C,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAsB;SAC1C,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,SAAS,CAAsB;SAC3C,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,OAAO,KAAK,aAAa,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * OpenClaw CLI commands: openclaw senpi trading-strategy create | list | delete.
3
+ * Thin layer: all three invoke gateway RPCs only; validation and registry live in the gateway.
4
+ */
5
+ /**
6
+ * Register senpi subcommands on the given Commander program.
7
+ */
8
+ export declare function registerSenpiCli(program: {
9
+ command: (name: string, desc?: string) => CommanderCommand | unknown;
10
+ }): void;
11
+ /** Minimal Commander command type for subcommands and options. */
12
+ interface CommanderCommand {
13
+ command(name: string, desc?: string): CommanderCommand;
14
+ description(desc: string): CommanderCommand;
15
+ option(flags: string, description?: string): CommanderCommand;
16
+ requiredOption(flags: string, description?: string): CommanderCommand;
17
+ action(fn: (opts: Record<string, unknown>) => void | Promise<void>): CommanderCommand;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=senpi-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"senpi-commands.d.ts","sourceRoot":"","sources":["../../src/cli/senpi-commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,gBAAgB,GAAG,OAAO,CAAA;CAAE,GAChF,IAAI,CAgHN;AAED,kEAAkE;AAClE,UAAU,gBAAgB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC9D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACtE,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;CACvF"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * OpenClaw CLI commands: openclaw senpi trading-strategy create | list | delete.
3
+ * Thin layer: all three invoke gateway RPCs only; validation and registry live in the gateway.
4
+ */
5
+ import { readFileSync } from "node:fs";
6
+ import { spawnSync } from "node:child_process";
7
+ import path from "node:path";
8
+ import { registerGuideCommands } from "./guide-commands.js";
9
+ import { VERSION } from "../version.js";
10
+ /**
11
+ * Register senpi subcommands on the given Commander program.
12
+ */
13
+ export function registerSenpiCli(program) {
14
+ const senpi = program.command("senpi");
15
+ senpi.description("Senpi trading recipe: trading-strategy create, list, delete");
16
+ const tradingStrategy = senpi.command("trading-strategy");
17
+ tradingStrategy.description("Manage trading strategies");
18
+ tradingStrategy
19
+ .command("create")
20
+ .description("Add a strategy from a YAML file or paste YAML; the gateway validates and runs it")
21
+ .option("-p, --path <path>", "Path to your strategy YAML file")
22
+ .option("-c, --content <content>", "Paste YAML content directly")
23
+ .option("--strategy-id <id>", "Name for this strategy (default: from file name or content)")
24
+ .action(async (opts) => {
25
+ const hasPath = typeof opts.path === "string" && opts.path.length > 0;
26
+ const hasContent = typeof opts.content === "string";
27
+ if (hasPath && hasContent) {
28
+ console.error("Please provide either a file path (--path) or YAML content (--content), not both.\nExample: openclaw senpi trading-strategy create -p my-strategy.yaml");
29
+ process.exitCode = 1;
30
+ return;
31
+ }
32
+ if (!hasPath && !hasContent) {
33
+ console.error("Please provide your strategy: either a path to a YAML file (--path) or the YAML content (--content).\nExample: openclaw senpi trading-strategy create -p my-strategy.yaml\nTo see a sample YAML: openclaw senpi guide examples");
34
+ process.exitCode = 1;
35
+ return;
36
+ }
37
+ let content;
38
+ if (hasPath) {
39
+ try {
40
+ content = readFileSync(path.resolve(process.cwd(), opts.path), "utf8");
41
+ }
42
+ catch (err) {
43
+ const msg = err instanceof Error ? err.message : String(err);
44
+ const isNotFound = msg.includes("ENOENT") || msg.includes("no such file");
45
+ if (isNotFound) {
46
+ console.error(`Could not find the file "${opts.path}". Please check the path is correct and the file exists.`);
47
+ }
48
+ else {
49
+ console.error(`Could not read the file. ${msg}`);
50
+ }
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ }
55
+ else {
56
+ content = opts.content;
57
+ }
58
+ const params = {
59
+ tradingStrategyYamlContent: content,
60
+ ...(typeof opts.strategyId === "string" && opts.strategyId.length > 0 ? { id: opts.strategyId } : {}),
61
+ };
62
+ const result = spawnSync(process.argv[0], [process.argv[1], "gateway", "call", "senpi.installStrategy", "--params", JSON.stringify(params)], {
63
+ stdio: "inherit",
64
+ cwd: process.cwd(),
65
+ });
66
+ process.exitCode = result.status ?? 1;
67
+ });
68
+ tradingStrategy
69
+ .command("delete <trading_strategy_id>")
70
+ .description("Remove a strategy (use the id from 'trading-strategy list')")
71
+ .action(async (tradingStrategyIdOrOpts) => {
72
+ const tradingStrategyId = typeof tradingStrategyIdOrOpts === "string" ? tradingStrategyIdOrOpts : "";
73
+ if (tradingStrategyId.length === 0) {
74
+ console.error("Please provide the strategy id (the name you used when creating it).\nExample: openclaw senpi trading-strategy delete my-strategy\nTo list installed strategies: openclaw senpi trading-strategy list");
75
+ process.exitCode = 1;
76
+ return;
77
+ }
78
+ const result = spawnSync(process.argv[0], [process.argv[1], "gateway", "call", "senpi.deleteStrategy", "--params", JSON.stringify({ id: tradingStrategyId })], { stdio: "inherit", cwd: process.cwd() });
79
+ process.exitCode = result.status ?? 1;
80
+ });
81
+ tradingStrategy
82
+ .command("list")
83
+ .description("List all installed strategies with their id, source, and status (running/stopped)")
84
+ .action(async () => {
85
+ const result = spawnSync(process.argv[0], [process.argv[1], "gateway", "call", "senpi.listStrategies", "--json", "--params", "{}"], {
86
+ stdio: ["inherit", "pipe", "inherit"],
87
+ cwd: process.cwd(),
88
+ encoding: "utf8",
89
+ });
90
+ if (result.status !== 0) {
91
+ process.exitCode = result.status ?? 1;
92
+ console.error("\nTip: If the gateway is not running, start it with: openclaw gateway run");
93
+ return;
94
+ }
95
+ let data;
96
+ try {
97
+ data = JSON.parse(result.stdout ?? "{}");
98
+ }
99
+ catch {
100
+ process.stdout.write(result.stdout ?? "");
101
+ return;
102
+ }
103
+ const strategies = data.payload?.strategies ?? data.strategies ?? [];
104
+ if (strategies.length === 0) {
105
+ console.log("No strategies installed.");
106
+ return;
107
+ }
108
+ console.log("id\t\tsource\t\tstatus");
109
+ for (const s of strategies) {
110
+ console.log(`${s.id}\t\t${s.source ?? "(inline)"}\t\t${s.status ?? "—"}`);
111
+ }
112
+ });
113
+ registerGuideCommands(senpi, VERSION);
114
+ }
115
+ //# sourceMappingURL=senpi-commands.js.map