@senpi/trading-runtime 1.0.0

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 (535) hide show
  1. package/README.md +117 -0
  2. package/dist/actions/decision-engine.d.ts +28 -0
  3. package/dist/actions/decision-engine.d.ts.map +1 -0
  4. package/dist/actions/decision-engine.js +65 -0
  5. package/dist/actions/decision-engine.js.map +1 -0
  6. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts +12 -0
  7. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts.map +1 -0
  8. package/dist/actions/llm-decision/anthropic-llm-decision.js +74 -0
  9. package/dist/actions/llm-decision/anthropic-llm-decision.js.map +1 -0
  10. package/dist/actions/llm-decision/factory.d.ts +17 -0
  11. package/dist/actions/llm-decision/factory.d.ts.map +1 -0
  12. package/dist/actions/llm-decision/factory.js +29 -0
  13. package/dist/actions/llm-decision/factory.js.map +1 -0
  14. package/dist/actions/llm-decision/index.d.ts +8 -0
  15. package/dist/actions/llm-decision/index.d.ts.map +1 -0
  16. package/dist/actions/llm-decision/index.js +5 -0
  17. package/dist/actions/llm-decision/index.js.map +1 -0
  18. package/dist/actions/llm-decision/openclaw-llm-decision.d.ts +14 -0
  19. package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -0
  20. package/dist/actions/llm-decision/openclaw-llm-decision.js +58 -0
  21. package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -0
  22. package/dist/actions/llm-decision/shared.d.ts +41 -0
  23. package/dist/actions/llm-decision/shared.d.ts.map +1 -0
  24. package/dist/actions/llm-decision/shared.js +117 -0
  25. package/dist/actions/llm-decision/shared.js.map +1 -0
  26. package/dist/actions/open-position/open-position.action.d.ts +15 -0
  27. package/dist/actions/open-position/open-position.action.d.ts.map +1 -0
  28. package/dist/actions/open-position/open-position.action.js +302 -0
  29. package/dist/actions/open-position/open-position.action.js.map +1 -0
  30. package/dist/actions/types.d.ts +123 -0
  31. package/dist/actions/types.d.ts.map +1 -0
  32. package/dist/actions/types.js +3 -0
  33. package/dist/actions/types.js.map +1 -0
  34. package/dist/cli/guide-commands.d.ts +26 -0
  35. package/dist/cli/guide-commands.d.ts.map +1 -0
  36. package/dist/cli/guide-commands.js +332 -0
  37. package/dist/cli/guide-commands.js.map +1 -0
  38. package/dist/cli/senpi-commands.d.ts +22 -0
  39. package/dist/cli/senpi-commands.d.ts.map +1 -0
  40. package/dist/cli/senpi-commands.js +138 -0
  41. package/dist/cli/senpi-commands.js.map +1 -0
  42. package/dist/constants/dsl/index.d.ts +39 -0
  43. package/dist/constants/dsl/index.d.ts.map +1 -0
  44. package/dist/constants/dsl/index.js +39 -0
  45. package/dist/constants/dsl/index.js.map +1 -0
  46. package/dist/context/context-builder.d.ts +14 -0
  47. package/dist/context/context-builder.d.ts.map +1 -0
  48. package/dist/context/context-builder.js +36 -0
  49. package/dist/context/context-builder.js.map +1 -0
  50. package/dist/context/index.d.ts +5 -0
  51. package/dist/context/index.d.ts.map +1 -0
  52. package/dist/context/index.js +5 -0
  53. package/dist/context/index.js.map +1 -0
  54. package/dist/context/interpolate.d.ts +6 -0
  55. package/dist/context/interpolate.d.ts.map +1 -0
  56. package/dist/context/interpolate.js +15 -0
  57. package/dist/context/interpolate.js.map +1 -0
  58. package/dist/context/providers/asset-trend.provider.d.ts +42 -0
  59. package/dist/context/providers/asset-trend.provider.d.ts.map +1 -0
  60. package/dist/context/providers/asset-trend.provider.js +94 -0
  61. package/dist/context/providers/asset-trend.provider.js.map +1 -0
  62. package/dist/context/providers/index.d.ts +5 -0
  63. package/dist/context/providers/index.d.ts.map +1 -0
  64. package/dist/context/providers/index.js +5 -0
  65. package/dist/context/providers/index.js.map +1 -0
  66. package/dist/context/providers/regime.provider.d.ts +14 -0
  67. package/dist/context/providers/regime.provider.d.ts.map +1 -0
  68. package/dist/context/providers/regime.provider.js +29 -0
  69. package/dist/context/providers/regime.provider.js.map +1 -0
  70. package/dist/context/providers/signal.provider.d.ts +11 -0
  71. package/dist/context/providers/signal.provider.d.ts.map +1 -0
  72. package/dist/context/providers/signal.provider.js +27 -0
  73. package/dist/context/providers/signal.provider.js.map +1 -0
  74. package/dist/context/providers/strategy.provider.d.ts +14 -0
  75. package/dist/context/providers/strategy.provider.d.ts.map +1 -0
  76. package/dist/context/providers/strategy.provider.js +68 -0
  77. package/dist/context/providers/strategy.provider.js.map +1 -0
  78. package/dist/context/types.d.ts +30 -0
  79. package/dist/context/types.d.ts.map +1 -0
  80. package/dist/context/types.js +2 -0
  81. package/dist/context/types.js.map +1 -0
  82. package/dist/dsl/config/index.d.ts +43 -0
  83. package/dist/dsl/config/index.d.ts.map +1 -0
  84. package/dist/dsl/config/index.js +108 -0
  85. package/dist/dsl/config/index.js.map +1 -0
  86. package/dist/dsl/constants/index.d.ts +3 -0
  87. package/dist/dsl/constants/index.d.ts.map +1 -0
  88. package/dist/dsl/constants/index.js +3 -0
  89. package/dist/dsl/constants/index.js.map +1 -0
  90. package/dist/dsl/engine/index.d.ts +7 -0
  91. package/dist/dsl/engine/index.d.ts.map +1 -0
  92. package/dist/dsl/engine/index.js +123 -0
  93. package/dist/dsl/engine/index.js.map +1 -0
  94. package/dist/dsl/events/bus-types.d.ts +7 -0
  95. package/dist/dsl/events/bus-types.d.ts.map +1 -0
  96. package/dist/dsl/events/bus-types.js +6 -0
  97. package/dist/dsl/events/bus-types.js.map +1 -0
  98. package/dist/dsl/events/guards.d.ts +17 -0
  99. package/dist/dsl/events/guards.d.ts.map +1 -0
  100. package/dist/dsl/events/guards.js +94 -0
  101. package/dist/dsl/events/guards.js.map +1 -0
  102. package/dist/dsl/events/handlers.d.ts +15 -0
  103. package/dist/dsl/events/handlers.d.ts.map +1 -0
  104. package/dist/dsl/events/handlers.js +229 -0
  105. package/dist/dsl/events/handlers.js.map +1 -0
  106. package/dist/dsl/events/index.d.ts +4 -0
  107. package/dist/dsl/events/index.d.ts.map +1 -0
  108. package/dist/dsl/events/index.js +4 -0
  109. package/dist/dsl/events/index.js.map +1 -0
  110. package/dist/dsl/index.d.ts +13 -0
  111. package/dist/dsl/index.d.ts.map +1 -0
  112. package/dist/dsl/index.js +35 -0
  113. package/dist/dsl/index.js.map +1 -0
  114. package/dist/dsl/monitor/index.d.ts +18 -0
  115. package/dist/dsl/monitor/index.d.ts.map +1 -0
  116. package/dist/dsl/monitor/index.js +296 -0
  117. package/dist/dsl/monitor/index.js.map +1 -0
  118. package/dist/dsl/plugin/index.d.ts +29 -0
  119. package/dist/dsl/plugin/index.d.ts.map +1 -0
  120. package/dist/dsl/plugin/index.js +85 -0
  121. package/dist/dsl/plugin/index.js.map +1 -0
  122. package/dist/dsl/types/index.d.ts +3 -0
  123. package/dist/dsl/types/index.d.ts.map +1 -0
  124. package/dist/dsl/types/index.js +3 -0
  125. package/dist/dsl/types/index.js.map +1 -0
  126. package/dist/health/index.d.ts +9 -0
  127. package/dist/health/index.d.ts.map +1 -0
  128. package/dist/health/index.js +9 -0
  129. package/dist/health/index.js.map +1 -0
  130. package/dist/index.d.ts +94 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +218 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/risk/index.d.ts +9 -0
  135. package/dist/risk/index.d.ts.map +1 -0
  136. package/dist/risk/index.js +9 -0
  137. package/dist/risk/index.js.map +1 -0
  138. package/dist/runtime/action-registry.d.ts +12 -0
  139. package/dist/runtime/action-registry.d.ts.map +1 -0
  140. package/dist/runtime/action-registry.js +18 -0
  141. package/dist/runtime/action-registry.js.map +1 -0
  142. package/dist/runtime/build-action-scan-payload.d.ts +20 -0
  143. package/dist/runtime/build-action-scan-payload.d.ts.map +1 -0
  144. package/dist/runtime/build-action-scan-payload.js +52 -0
  145. package/dist/runtime/build-action-scan-payload.js.map +1 -0
  146. package/dist/runtime/bus.d.ts +6 -0
  147. package/dist/runtime/bus.d.ts.map +1 -0
  148. package/dist/runtime/bus.js +19 -0
  149. package/dist/runtime/bus.js.map +1 -0
  150. package/dist/runtime/create-action-context.d.ts +34 -0
  151. package/dist/runtime/create-action-context.d.ts.map +1 -0
  152. package/dist/runtime/create-action-context.js +22 -0
  153. package/dist/runtime/create-action-context.js.map +1 -0
  154. package/dist/runtime/create-actions.d.ts +30 -0
  155. package/dist/runtime/create-actions.d.ts.map +1 -0
  156. package/dist/runtime/create-actions.js +78 -0
  157. package/dist/runtime/create-actions.js.map +1 -0
  158. package/dist/runtime/create-runtime-context.d.ts +33 -0
  159. package/dist/runtime/create-runtime-context.d.ts.map +1 -0
  160. package/dist/runtime/create-runtime-context.js +32 -0
  161. package/dist/runtime/create-runtime-context.js.map +1 -0
  162. package/dist/runtime/create-scanner-module.d.ts +14 -0
  163. package/dist/runtime/create-scanner-module.d.ts.map +1 -0
  164. package/dist/runtime/create-scanner-module.js +26 -0
  165. package/dist/runtime/create-scanner-module.js.map +1 -0
  166. package/dist/runtime/create-scanner-providers-for-run.d.ts +20 -0
  167. package/dist/runtime/create-scanner-providers-for-run.d.ts.map +1 -0
  168. package/dist/runtime/create-scanner-providers-for-run.js +34 -0
  169. package/dist/runtime/create-scanner-providers-for-run.js.map +1 -0
  170. package/dist/runtime/default-state-dir.d.ts +10 -0
  171. package/dist/runtime/default-state-dir.d.ts.map +1 -0
  172. package/dist/runtime/default-state-dir.js +22 -0
  173. package/dist/runtime/default-state-dir.js.map +1 -0
  174. package/dist/runtime/env-resolve.d.ts +17 -0
  175. package/dist/runtime/env-resolve.d.ts.map +1 -0
  176. package/dist/runtime/env-resolve.js +45 -0
  177. package/dist/runtime/env-resolve.js.map +1 -0
  178. package/dist/runtime/hook-system.d.ts +7 -0
  179. package/dist/runtime/hook-system.d.ts.map +1 -0
  180. package/dist/runtime/hook-system.js +16 -0
  181. package/dist/runtime/hook-system.js.map +1 -0
  182. package/dist/runtime/index.d.ts +37 -0
  183. package/dist/runtime/index.d.ts.map +1 -0
  184. package/dist/runtime/index.js +26 -0
  185. package/dist/runtime/index.js.map +1 -0
  186. package/dist/runtime/load-trading-strategy.d.ts +18 -0
  187. package/dist/runtime/load-trading-strategy.d.ts.map +1 -0
  188. package/dist/runtime/load-trading-strategy.js +51 -0
  189. package/dist/runtime/load-trading-strategy.js.map +1 -0
  190. package/dist/runtime/map-exit-config.d.ts +12 -0
  191. package/dist/runtime/map-exit-config.d.ts.map +1 -0
  192. package/dist/runtime/map-exit-config.js +89 -0
  193. package/dist/runtime/map-exit-config.js.map +1 -0
  194. package/dist/runtime/map-strategies-registration.d.ts +12 -0
  195. package/dist/runtime/map-strategies-registration.d.ts.map +1 -0
  196. package/dist/runtime/map-strategies-registration.js +52 -0
  197. package/dist/runtime/map-strategies-registration.js.map +1 -0
  198. package/dist/runtime/map-strategies.d.ts +12 -0
  199. package/dist/runtime/map-strategies.d.ts.map +1 -0
  200. package/dist/runtime/map-strategies.js +46 -0
  201. package/dist/runtime/map-strategies.js.map +1 -0
  202. package/dist/runtime/notifications.d.ts +10 -0
  203. package/dist/runtime/notifications.d.ts.map +1 -0
  204. package/dist/runtime/notifications.js +14 -0
  205. package/dist/runtime/notifications.js.map +1 -0
  206. package/dist/runtime/parse-interval.d.ts +11 -0
  207. package/dist/runtime/parse-interval.d.ts.map +1 -0
  208. package/dist/runtime/parse-interval.js +35 -0
  209. package/dist/runtime/parse-interval.js.map +1 -0
  210. package/dist/runtime/reconcile-state.d.ts +25 -0
  211. package/dist/runtime/reconcile-state.d.ts.map +1 -0
  212. package/dist/runtime/reconcile-state.js +114 -0
  213. package/dist/runtime/reconcile-state.js.map +1 -0
  214. package/dist/runtime/risk-guard.d.ts +6 -0
  215. package/dist/runtime/risk-guard.d.ts.map +1 -0
  216. package/dist/runtime/risk-guard.js +14 -0
  217. package/dist/runtime/risk-guard.js.map +1 -0
  218. package/dist/runtime/run.d.ts +21 -0
  219. package/dist/runtime/run.d.ts.map +1 -0
  220. package/dist/runtime/run.js +43 -0
  221. package/dist/runtime/run.js.map +1 -0
  222. package/dist/runtime/runtime.d.ts +40 -0
  223. package/dist/runtime/runtime.d.ts.map +1 -0
  224. package/dist/runtime/runtime.js +249 -0
  225. package/dist/runtime/runtime.js.map +1 -0
  226. package/dist/runtime/scanner-registry.d.ts +22 -0
  227. package/dist/runtime/scanner-registry.d.ts.map +1 -0
  228. package/dist/runtime/scanner-registry.js +72 -0
  229. package/dist/runtime/scanner-registry.js.map +1 -0
  230. package/dist/runtime/strategy-registry.d.ts +49 -0
  231. package/dist/runtime/strategy-registry.d.ts.map +1 -0
  232. package/dist/runtime/strategy-registry.js +150 -0
  233. package/dist/runtime/strategy-registry.js.map +1 -0
  234. package/dist/runtime/trading-strategy-config.d.ts +6 -0
  235. package/dist/runtime/trading-strategy-config.d.ts.map +1 -0
  236. package/dist/runtime/trading-strategy-config.js +5 -0
  237. package/dist/runtime/trading-strategy-config.js.map +1 -0
  238. package/dist/runtime/trading-strategy-schema.d.ts +19757 -0
  239. package/dist/runtime/trading-strategy-schema.d.ts.map +1 -0
  240. package/dist/runtime/trading-strategy-schema.js +107 -0
  241. package/dist/runtime/trading-strategy-schema.js.map +1 -0
  242. package/dist/scanners/__tests__/fixtures/index.d.ts +3 -0
  243. package/dist/scanners/__tests__/fixtures/index.d.ts.map +1 -0
  244. package/dist/scanners/__tests__/fixtures/index.js +3 -0
  245. package/dist/scanners/__tests__/fixtures/index.js.map +1 -0
  246. package/dist/scanners/__tests__/fixtures/scan-results.d.ts +23 -0
  247. package/dist/scanners/__tests__/fixtures/scan-results.d.ts.map +1 -0
  248. package/dist/scanners/__tests__/fixtures/scan-results.js +128 -0
  249. package/dist/scanners/__tests__/fixtures/scan-results.js.map +1 -0
  250. package/dist/scanners/__tests__/fixtures/signals.d.ts +18 -0
  251. package/dist/scanners/__tests__/fixtures/signals.d.ts.map +1 -0
  252. package/dist/scanners/__tests__/fixtures/signals.js +84 -0
  253. package/dist/scanners/__tests__/fixtures/signals.js.map +1 -0
  254. package/dist/scanners/__tests__/test-helpers.d.ts +4 -0
  255. package/dist/scanners/__tests__/test-helpers.d.ts.map +1 -0
  256. package/dist/scanners/__tests__/test-helpers.js +23 -0
  257. package/dist/scanners/__tests__/test-helpers.js.map +1 -0
  258. package/dist/scanners/artifacts.d.ts +119 -0
  259. package/dist/scanners/artifacts.d.ts.map +1 -0
  260. package/dist/scanners/artifacts.js +72 -0
  261. package/dist/scanners/artifacts.js.map +1 -0
  262. package/dist/scanners/create-scanner.d.ts +13 -0
  263. package/dist/scanners/create-scanner.d.ts.map +1 -0
  264. package/dist/scanners/create-scanner.js +11 -0
  265. package/dist/scanners/create-scanner.js.map +1 -0
  266. package/dist/scanners/engine/config-validator.d.ts +7 -0
  267. package/dist/scanners/engine/config-validator.d.ts.map +1 -0
  268. package/dist/scanners/engine/config-validator.js +16 -0
  269. package/dist/scanners/engine/config-validator.js.map +1 -0
  270. package/dist/scanners/engine/data-providers.d.ts +43 -0
  271. package/dist/scanners/engine/data-providers.d.ts.map +1 -0
  272. package/dist/scanners/engine/data-providers.js +8 -0
  273. package/dist/scanners/engine/data-providers.js.map +1 -0
  274. package/dist/scanners/engine/engine.d.ts +76 -0
  275. package/dist/scanners/engine/engine.d.ts.map +1 -0
  276. package/dist/scanners/engine/engine.js +399 -0
  277. package/dist/scanners/engine/engine.js.map +1 -0
  278. package/dist/scanners/engine/index.d.ts +9 -0
  279. package/dist/scanners/engine/index.d.ts.map +1 -0
  280. package/dist/scanners/engine/index.js +7 -0
  281. package/dist/scanners/engine/index.js.map +1 -0
  282. package/dist/scanners/engine/input-resolver.d.ts +21 -0
  283. package/dist/scanners/engine/input-resolver.d.ts.map +1 -0
  284. package/dist/scanners/engine/input-resolver.js +140 -0
  285. package/dist/scanners/engine/input-resolver.js.map +1 -0
  286. package/dist/scanners/engine/lifecycle.d.ts +21 -0
  287. package/dist/scanners/engine/lifecycle.d.ts.map +1 -0
  288. package/dist/scanners/engine/lifecycle.js +2 -0
  289. package/dist/scanners/engine/lifecycle.js.map +1 -0
  290. package/dist/scanners/engine/result-builder.d.ts +30 -0
  291. package/dist/scanners/engine/result-builder.d.ts.map +1 -0
  292. package/dist/scanners/engine/result-builder.js +129 -0
  293. package/dist/scanners/engine/result-builder.js.map +1 -0
  294. package/dist/scanners/engine/strategy-registry.d.ts +45 -0
  295. package/dist/scanners/engine/strategy-registry.d.ts.map +1 -0
  296. package/dist/scanners/engine/strategy-registry.js +93 -0
  297. package/dist/scanners/engine/strategy-registry.js.map +1 -0
  298. package/dist/scanners/events.d.ts +41 -0
  299. package/dist/scanners/events.d.ts.map +1 -0
  300. package/dist/scanners/events.js +33 -0
  301. package/dist/scanners/events.js.map +1 -0
  302. package/dist/scanners/implementations/emerging-movers.d.ts +212 -0
  303. package/dist/scanners/implementations/emerging-movers.d.ts.map +1 -0
  304. package/dist/scanners/implementations/emerging-movers.js +702 -0
  305. package/dist/scanners/implementations/emerging-movers.js.map +1 -0
  306. package/dist/scanners/implementations/index.d.ts +8 -0
  307. package/dist/scanners/implementations/index.d.ts.map +1 -0
  308. package/dist/scanners/implementations/index.js +8 -0
  309. package/dist/scanners/implementations/index.js.map +1 -0
  310. package/dist/scanners/implementations/indicators.d.ts +40 -0
  311. package/dist/scanners/implementations/indicators.d.ts.map +1 -0
  312. package/dist/scanners/implementations/indicators.js +114 -0
  313. package/dist/scanners/implementations/indicators.js.map +1 -0
  314. package/dist/scanners/implementations/market-regime.d.ts +52 -0
  315. package/dist/scanners/implementations/market-regime.d.ts.map +1 -0
  316. package/dist/scanners/implementations/market-regime.js +201 -0
  317. package/dist/scanners/implementations/market-regime.js.map +1 -0
  318. package/dist/scanners/implementations/momentum.d.ts +21 -0
  319. package/dist/scanners/implementations/momentum.d.ts.map +1 -0
  320. package/dist/scanners/implementations/momentum.js +128 -0
  321. package/dist/scanners/implementations/momentum.js.map +1 -0
  322. package/dist/scanners/implementations/oi-tracker.d.ts +13 -0
  323. package/dist/scanners/implementations/oi-tracker.d.ts.map +1 -0
  324. package/dist/scanners/implementations/oi-tracker.js +67 -0
  325. package/dist/scanners/implementations/oi-tracker.js.map +1 -0
  326. package/dist/scanners/implementations/opportunity.d.ts +104 -0
  327. package/dist/scanners/implementations/opportunity.d.ts.map +1 -0
  328. package/dist/scanners/implementations/opportunity.js +441 -0
  329. package/dist/scanners/implementations/opportunity.js.map +1 -0
  330. package/dist/scanners/implementations/prescreener.d.ts +20 -0
  331. package/dist/scanners/implementations/prescreener.d.ts.map +1 -0
  332. package/dist/scanners/implementations/prescreener.js +97 -0
  333. package/dist/scanners/implementations/prescreener.js.map +1 -0
  334. package/dist/scanners/implementations/sm-flip.d.ts +43 -0
  335. package/dist/scanners/implementations/sm-flip.d.ts.map +1 -0
  336. package/dist/scanners/implementations/sm-flip.js +200 -0
  337. package/dist/scanners/implementations/sm-flip.js.map +1 -0
  338. package/dist/scanners/index.d.ts +24 -0
  339. package/dist/scanners/index.d.ts.map +1 -0
  340. package/dist/scanners/index.js +17 -0
  341. package/dist/scanners/index.js.map +1 -0
  342. package/dist/scanners/input-descriptors.d.ts +49 -0
  343. package/dist/scanners/input-descriptors.d.ts.map +1 -0
  344. package/dist/scanners/input-descriptors.js +35 -0
  345. package/dist/scanners/input-descriptors.js.map +1 -0
  346. package/dist/scanners/protocol/context.d.ts +71 -0
  347. package/dist/scanners/protocol/context.d.ts.map +1 -0
  348. package/dist/scanners/protocol/context.js +2 -0
  349. package/dist/scanners/protocol/context.js.map +1 -0
  350. package/dist/scanners/protocol/hooks.d.ts +18 -0
  351. package/dist/scanners/protocol/hooks.d.ts.map +1 -0
  352. package/dist/scanners/protocol/hooks.js +12 -0
  353. package/dist/scanners/protocol/hooks.js.map +1 -0
  354. package/dist/scanners/protocol/index.d.ts +5 -0
  355. package/dist/scanners/protocol/index.d.ts.map +1 -0
  356. package/dist/scanners/protocol/index.js +2 -0
  357. package/dist/scanners/protocol/index.js.map +1 -0
  358. package/dist/scanners/protocol/scanner.d.ts +47 -0
  359. package/dist/scanners/protocol/scanner.d.ts.map +1 -0
  360. package/dist/scanners/protocol/scanner.js +2 -0
  361. package/dist/scanners/protocol/scanner.js.map +1 -0
  362. package/dist/scanners/providers/adapter.d.ts +23 -0
  363. package/dist/scanners/providers/adapter.d.ts.map +1 -0
  364. package/dist/scanners/providers/adapter.js +227 -0
  365. package/dist/scanners/providers/adapter.js.map +1 -0
  366. package/dist/scanners/providers/cache.d.ts +20 -0
  367. package/dist/scanners/providers/cache.d.ts.map +1 -0
  368. package/dist/scanners/providers/cache.js +61 -0
  369. package/dist/scanners/providers/cache.js.map +1 -0
  370. package/dist/scanners/providers/client.d.ts +53 -0
  371. package/dist/scanners/providers/client.d.ts.map +1 -0
  372. package/dist/scanners/providers/client.js +174 -0
  373. package/dist/scanners/providers/client.js.map +1 -0
  374. package/dist/scanners/providers/factory.d.ts +42 -0
  375. package/dist/scanners/providers/factory.d.ts.map +1 -0
  376. package/dist/scanners/providers/factory.js +156 -0
  377. package/dist/scanners/providers/factory.js.map +1 -0
  378. package/dist/scanners/providers/types.d.ts +61 -0
  379. package/dist/scanners/providers/types.d.ts.map +1 -0
  380. package/dist/scanners/providers/types.js +6 -0
  381. package/dist/scanners/providers/types.js.map +1 -0
  382. package/dist/scanners/runtime-module.d.ts +54 -0
  383. package/dist/scanners/runtime-module.d.ts.map +1 -0
  384. package/dist/scanners/runtime-module.js +94 -0
  385. package/dist/scanners/runtime-module.js.map +1 -0
  386. package/dist/scanners/scanner-definition.d.ts +58 -0
  387. package/dist/scanners/scanner-definition.d.ts.map +1 -0
  388. package/dist/scanners/scanner-definition.js +19 -0
  389. package/dist/scanners/scanner-definition.js.map +1 -0
  390. package/dist/scanners/schema-utils.d.ts +6 -0
  391. package/dist/scanners/schema-utils.d.ts.map +1 -0
  392. package/dist/scanners/schema-utils.js +14 -0
  393. package/dist/scanners/schema-utils.js.map +1 -0
  394. package/dist/scanners/score-utils.d.ts +19 -0
  395. package/dist/scanners/score-utils.d.ts.map +1 -0
  396. package/dist/scanners/score-utils.js +47 -0
  397. package/dist/scanners/score-utils.js.map +1 -0
  398. package/dist/scanners/store/fs-utils.d.ts +12 -0
  399. package/dist/scanners/store/fs-utils.d.ts.map +1 -0
  400. package/dist/scanners/store/fs-utils.js +47 -0
  401. package/dist/scanners/store/fs-utils.js.map +1 -0
  402. package/dist/scanners/store/index.d.ts +5 -0
  403. package/dist/scanners/store/index.d.ts.map +1 -0
  404. package/dist/scanners/store/index.js +5 -0
  405. package/dist/scanners/store/index.js.map +1 -0
  406. package/dist/scanners/store/runtime-store.d.ts +50 -0
  407. package/dist/scanners/store/runtime-store.d.ts.map +1 -0
  408. package/dist/scanners/store/runtime-store.js +91 -0
  409. package/dist/scanners/store/runtime-store.js.map +1 -0
  410. package/dist/scanners/store/shared-artifact-store.d.ts +31 -0
  411. package/dist/scanners/store/shared-artifact-store.d.ts.map +1 -0
  412. package/dist/scanners/store/shared-artifact-store.js +89 -0
  413. package/dist/scanners/store/shared-artifact-store.js.map +1 -0
  414. package/dist/scanners/store/signal-store.d.ts +36 -0
  415. package/dist/scanners/store/signal-store.d.ts.map +1 -0
  416. package/dist/scanners/store/signal-store.js +135 -0
  417. package/dist/scanners/store/signal-store.js.map +1 -0
  418. package/dist/scanners/types.d.ts +115 -0
  419. package/dist/scanners/types.d.ts.map +1 -0
  420. package/dist/scanners/types.js +3 -0
  421. package/dist/scanners/types.js.map +1 -0
  422. package/dist/scripts/run-dsl-standalone-live.d.ts +27 -0
  423. package/dist/scripts/run-dsl-standalone-live.d.ts.map +1 -0
  424. package/dist/scripts/run-dsl-standalone-live.js +207 -0
  425. package/dist/scripts/run-dsl-standalone-live.js.map +1 -0
  426. package/dist/scripts/run-dsl-standalone-mock.d.ts +13 -0
  427. package/dist/scripts/run-dsl-standalone-mock.d.ts.map +1 -0
  428. package/dist/scripts/run-dsl-standalone-mock.js +255 -0
  429. package/dist/scripts/run-dsl-standalone-mock.js.map +1 -0
  430. package/dist/senpi/client.d.ts +70 -0
  431. package/dist/senpi/client.d.ts.map +1 -0
  432. package/dist/senpi/client.js +482 -0
  433. package/dist/senpi/client.js.map +1 -0
  434. package/dist/senpi/constants.d.ts +7 -0
  435. package/dist/senpi/constants.d.ts.map +1 -0
  436. package/dist/senpi/constants.js +7 -0
  437. package/dist/senpi/constants.js.map +1 -0
  438. package/dist/senpi/index.d.ts +3 -0
  439. package/dist/senpi/index.d.ts.map +1 -0
  440. package/dist/senpi/index.js +2 -0
  441. package/dist/senpi/index.js.map +1 -0
  442. package/dist/senpi/types.d.ts +132 -0
  443. package/dist/senpi/types.d.ts.map +1 -0
  444. package/dist/senpi/types.js +3 -0
  445. package/dist/senpi/types.js.map +1 -0
  446. package/dist/state/index.d.ts +3 -0
  447. package/dist/state/index.d.ts.map +1 -0
  448. package/dist/state/index.js +3 -0
  449. package/dist/state/index.js.map +1 -0
  450. package/dist/state/paths.d.ts +8 -0
  451. package/dist/state/paths.d.ts.map +1 -0
  452. package/dist/state/paths.js +19 -0
  453. package/dist/state/paths.js.map +1 -0
  454. package/dist/state/state-manager.d.ts +56 -0
  455. package/dist/state/state-manager.d.ts.map +1 -0
  456. package/dist/state/state-manager.js +213 -0
  457. package/dist/state/state-manager.js.map +1 -0
  458. package/dist/strategy/index.d.ts +2 -0
  459. package/dist/strategy/index.d.ts.map +1 -0
  460. package/dist/strategy/index.js +2 -0
  461. package/dist/strategy/index.js.map +1 -0
  462. package/dist/strategy/strategy-state.d.ts +47 -0
  463. package/dist/strategy/strategy-state.d.ts.map +1 -0
  464. package/dist/strategy/strategy-state.js +179 -0
  465. package/dist/strategy/strategy-state.js.map +1 -0
  466. package/dist/types/action.d.ts +15 -0
  467. package/dist/types/action.d.ts.map +1 -0
  468. package/dist/types/action.js +2 -0
  469. package/dist/types/action.js.map +1 -0
  470. package/dist/types/dsl/index.d.ts +156 -0
  471. package/dist/types/dsl/index.d.ts.map +1 -0
  472. package/dist/types/dsl/index.js +5 -0
  473. package/dist/types/dsl/index.js.map +1 -0
  474. package/dist/types/event-bus.d.ts +11 -0
  475. package/dist/types/event-bus.d.ts.map +1 -0
  476. package/dist/types/event-bus.js +6 -0
  477. package/dist/types/event-bus.js.map +1 -0
  478. package/dist/types/hooks.d.ts +27 -0
  479. package/dist/types/hooks.d.ts.map +1 -0
  480. package/dist/types/hooks.js +15 -0
  481. package/dist/types/hooks.js.map +1 -0
  482. package/dist/types/index.d.ts +6 -0
  483. package/dist/types/index.d.ts.map +1 -0
  484. package/dist/types/index.js +6 -0
  485. package/dist/types/index.js.map +1 -0
  486. package/dist/types/notification.d.ts +4 -0
  487. package/dist/types/notification.d.ts.map +1 -0
  488. package/dist/types/notification.js +3 -0
  489. package/dist/types/notification.js.map +1 -0
  490. package/dist/types/runtime.d.ts +16 -0
  491. package/dist/types/runtime.d.ts.map +1 -0
  492. package/dist/types/runtime.js +2 -0
  493. package/dist/types/runtime.js.map +1 -0
  494. package/dist/types/scanner.d.ts +59 -0
  495. package/dist/types/scanner.d.ts.map +1 -0
  496. package/dist/types/scanner.js +13 -0
  497. package/dist/types/scanner.js.map +1 -0
  498. package/dist/types/strategy.d.ts +97 -0
  499. package/dist/types/strategy.d.ts.map +1 -0
  500. package/dist/types/strategy.js +2 -0
  501. package/dist/types/strategy.js.map +1 -0
  502. package/dist/utils/logger/dsl.d.ts +8 -0
  503. package/dist/utils/logger/dsl.d.ts.map +1 -0
  504. package/dist/utils/logger/dsl.js +7 -0
  505. package/dist/utils/logger/dsl.js.map +1 -0
  506. package/dist/utils/logger.d.ts +13 -0
  507. package/dist/utils/logger.d.ts.map +1 -0
  508. package/dist/utils/logger.js +65 -0
  509. package/dist/utils/logger.js.map +1 -0
  510. package/dist/utils/response.d.ts +14 -0
  511. package/dist/utils/response.d.ts.map +1 -0
  512. package/dist/utils/response.js +44 -0
  513. package/dist/utils/response.js.map +1 -0
  514. package/dist/version.d.ts +2 -0
  515. package/dist/version.d.ts.map +1 -0
  516. package/dist/version.js +2 -0
  517. package/dist/version.js.map +1 -0
  518. package/examples/.env.example +15 -0
  519. package/examples/README.md +75 -0
  520. package/examples/scanners-consumer-quickstart.mjs +134 -0
  521. package/examples/scanners-emerging-movers-v4.mjs +285 -0
  522. package/examples/scanners-live-mcp.mjs +208 -0
  523. package/examples/scanners-multi-strategy.mjs +165 -0
  524. package/examples/scanners-scheduled-events.mjs +95 -0
  525. package/examples/scanners-senpi-provider-client.mjs +182 -0
  526. package/examples/scanners-single-strategy.mjs +198 -0
  527. package/examples/strategies/README.md +45 -0
  528. package/examples/strategies/dsl-showcase.yaml +62 -0
  529. package/examples/strategies/fox.yaml +55 -0
  530. package/examples/strategies/minimal.yaml +41 -0
  531. package/examples/strategies/viper.yaml +63 -0
  532. package/examples/strategies/wolf.yaml +60 -0
  533. package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +111 -0
  534. package/openclaw.plugin.json +15 -0
  535. package/package.json +52 -0
@@ -0,0 +1,332 @@
1
+ /**
2
+ * senpi guide subcommands — in-shell reference for @senpi/trading-runtime.
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-runtime 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 Two-phase exit engine reference
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.
145
+
146
+ exit:
147
+ engine: dsl
148
+ interval_seconds: 30 # how often the price monitor runs
149
+
150
+ dsl_presets:
151
+ <preset_name>:
152
+ phase1: ...
153
+ phase2_trigger_tier: 0
154
+ phase2: ...
155
+
156
+ ──────────────────────────────────────────────────────────────────────────────
157
+ Phase 1 — Fixed floor
158
+ Active from entry until the tier at phase2_trigger_tier is crossed.
159
+ Floor = entry_price × (1 − max_loss_pct / 100)
160
+
161
+ phase1:
162
+ enabled: true
163
+ max_loss_pct: 3.0 # exit if price drops 3% below entry
164
+ consecutive_breaches_required: 3 # ticks below floor before exit fires
165
+
166
+ ──────────────────────────────────────────────────────────────────────────────
167
+ Phase 2 — Dynamic trailing floor (high-water mark retrace)
168
+ Replaces Phase 1 once the position gains enough. The floor tracks the
169
+ high-water mark and never moves down.
170
+
171
+ phase2_trigger_tier: 0 # 0 = phase2 starts when the first tier is hit
172
+
173
+ phase2:
174
+ enabled: true
175
+ retrace_threshold: 1.5 # default: exit if 1.5% below HWM
176
+ consecutive_breaches_required: 1
177
+
178
+ tiers:
179
+ # Each tier: trigger_pct = gain from entry that activates this tier
180
+ # lock_pct = floor locked at entry × (1 + lock_pct%)
181
+ # retrace = overrides retrace_threshold for this tier
182
+ - { trigger_pct: 10, lock_pct: 5 }
183
+ - { trigger_pct: 20, lock_pct: 14 }
184
+ - { trigger_pct: 30, lock_pct: 22, retrace: 1.2 }
185
+ - { trigger_pct: 50, lock_pct: 40, retrace: 1.0 }
186
+ - { trigger_pct: 75, lock_pct: 60, retrace: 0.8 }
187
+ - { trigger_pct: 100, lock_pct: 80, retrace: 0.6 }
188
+
189
+ ──────────────────────────────────────────────────────────────────────────────
190
+ State and events
191
+ Per-position state is persisted at {stateDir}/strategies/{id}/... as JSON.
192
+ Events emitted: dsl.created, dsl.tier_advanced, dsl.sl_updated,
193
+ dsl.phase_changed, position.closed
194
+ `.trim();
195
+ const SCHEMA_TEXT = `
196
+ YAML schema — top-level keys
197
+ ─────────────────────────────────────────────────────────────────────────────
198
+ Key Type Req Description
199
+ name string Yes Strategy name
200
+ version string No Version identifier
201
+ description string No Human-readable description
202
+ strategies object Yes Keyed strategy configs (non-empty)
203
+ scanners array * Scanner definitions (* required when actions
204
+ have OPEN_POSITION or a scanners list)
205
+ actions array No Action definitions
206
+ exit object No Exit / DSL block
207
+ health object No Health check config
208
+ hooks array No Hook definitions
209
+ notifications object No e.g. telegram_chat_id
210
+ advanced object No Extra options
211
+
212
+ strategies.<name>
213
+ wallet string Yes Wallet address; supports \${VAR} substitution
214
+ budget number No Total budget
215
+ slots number No Max concurrent positions
216
+ margin_per_slot number No Margin per slot
217
+ trading_risk string No conservative | moderate | aggressive
218
+ enabled boolean No Default true
219
+
220
+ scanners[]
221
+ name string Yes Unique name referenced in actions.scanners
222
+ type string Yes emerging_movers | momentum | prescreener | oi_tracker
223
+ interval string Yes e.g. "30s", "2m", "1h"
224
+ blocked_assets array No
225
+ config object No Scanner-specific config (see: senpi guide scanners)
226
+ advanced object No
227
+
228
+ actions[]
229
+ name string Yes
230
+ action_type string Yes OPEN_POSITION
231
+ decision_mode string Yes llm | no_decision
232
+ decision_model string No Required when decision_mode: llm
233
+ scanners string[] No Scanner names this action listens to
234
+ min_confidence number No 0–10
235
+ context string[] No [signal]
236
+ decision_prompt string No Prompt template with {{signal}}
237
+ params object No
238
+
239
+ exit
240
+ engine string No dsl
241
+ interval_seconds number No Default 30
242
+ dsl_presets object No Presets keyed by name (preferred)
243
+ dsl object No Legacy alias for dsl_presets
244
+
245
+ Environment substitution: \${VAR} and \${VAR:-default} resolved at load time.
246
+ `.trim();
247
+ const MINIMAL_YAML = `
248
+ name: minimal
249
+ version: 1.0.0
250
+ description: Watch-only strategy — logs signals, opens no positions.
251
+
252
+ strategies:
253
+ watch-only:
254
+ wallet: "\${WALLET_ADDRESS}"
255
+ budget: "0"
256
+ slots: 1
257
+ margin_per_slot: 0
258
+ trading_risk: conservative
259
+ enabled: true
260
+
261
+ scanners:
262
+ - name: emerging_movers
263
+ type: emerging_movers
264
+ interval: 60s
265
+ config:
266
+ topN: 20
267
+ minRankJump: 5
268
+ minScansBeforeSignals: 2
269
+
270
+ actions:
271
+ - name: log_signals
272
+ action_type: OPEN_POSITION
273
+ decision_mode: no_decision
274
+ scanners: [emerging_movers]
275
+ min_confidence: 0
276
+
277
+ exit:
278
+ engine: dsl
279
+ interval_seconds: 60
280
+ dsl_presets:
281
+ default:
282
+ phase1:
283
+ enabled: true
284
+ consecutive_breaches_required: 3
285
+ max_loss_pct: 5.0
286
+ phase2_trigger_tier: 0
287
+ phase2:
288
+ enabled: false
289
+ `.trim();
290
+ /**
291
+ * Register `senpi guide [subcommand]` on the senpi Commander subprogram.
292
+ * @param senpi - the `senpi` Commander command object
293
+ * @param version - plugin version string (from src/version.ts)
294
+ */
295
+ export function registerGuideCommands(senpi, version) {
296
+ const guide = senpi.command("guide")
297
+ .description("In-shell reference for @senpi/trading-runtime");
298
+ guide.action(() => {
299
+ process.stdout.write(OVERVIEW_TEXT(version) + "\n");
300
+ });
301
+ guide.command("scanners")
302
+ .description("Scanner types and config fields")
303
+ .action(() => {
304
+ process.stdout.write(SCANNERS_TEXT + "\n");
305
+ });
306
+ guide.command("actions")
307
+ .description("Action types and decision modes")
308
+ .action(() => {
309
+ process.stdout.write(ACTIONS_TEXT + "\n");
310
+ });
311
+ guide.command("dsl")
312
+ .description("DSL two-phase exit engine reference")
313
+ .action(() => {
314
+ process.stdout.write(DSL_TEXT + "\n");
315
+ });
316
+ guide.command("examples")
317
+ .description("Print minimal strategy YAML to stdout")
318
+ .action(() => {
319
+ process.stdout.write(MINIMAL_YAML + "\n");
320
+ });
321
+ guide.command("schema")
322
+ .description("Full YAML schema field reference")
323
+ .action(() => {
324
+ process.stdout.write(SCHEMA_TEXT + "\n");
325
+ });
326
+ guide.command("version")
327
+ .description("Plugin version and changelog URL")
328
+ .action(() => {
329
+ process.stdout.write(`@senpi/trading-runtime v${version}\n${CHANGELOG_URL}\n`);
330
+ });
331
+ }
332
+ //# 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;0BACjB,OAAO;;;;;;;;;;;;;;;;CAgBhC,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDhB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDnB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CpB,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,+CAA+C,CAAC,CAAC;IAEhE,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,qCAAqC,CAAC;SAClD,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,2BAA2B,OAAO,KAAK,aAAa,IAAI,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * OpenClaw CLI commands: openclaw senpi trading-strategy create | list | uninstallStrategy.
3
+ * create hot-loads via gateway RPC; list/uninstallStrategy operate on the registry.
4
+ */
5
+ export type GetStateDir = () => string;
6
+ /**
7
+ * Register senpi subcommands on the given Commander program.
8
+ * getStateDir: returns the plugin state dir (e.g. from config or default).
9
+ */
10
+ export declare function registerSenpiCli(program: {
11
+ command: (name: string, desc?: string) => CommanderCommand | unknown;
12
+ }, getStateDir: GetStateDir): void;
13
+ /** Minimal Commander command type for subcommands and options. */
14
+ interface CommanderCommand {
15
+ command(name: string, desc?: string): CommanderCommand;
16
+ description(desc: string): CommanderCommand;
17
+ option(flags: string, description?: string): CommanderCommand;
18
+ requiredOption(flags: string, description?: string): CommanderCommand;
19
+ action(fn: (opts: Record<string, unknown>) => void | Promise<void>): CommanderCommand;
20
+ }
21
+ export {};
22
+ //# 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;AAiBH,MAAM,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,gBAAgB,GAAG,OAAO,CAAA;CAAE,EACjF,WAAW,EAAE,WAAW,GACvB,IAAI,CA4HN;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,138 @@
1
+ /**
2
+ * OpenClaw CLI commands: openclaw senpi trading-strategy create | list | uninstallStrategy.
3
+ * create hot-loads via gateway RPC; list/uninstallStrategy operate on the registry.
4
+ */
5
+ import { spawnSync } from "node:child_process";
6
+ import path from "node:path";
7
+ import { registerGuideCommands } from "./guide-commands.js";
8
+ import { VERSION } from "../version.js";
9
+ import { loadTradingStrategy } from "../runtime/load-trading-strategy.js";
10
+ import { readRegistry, writeRegistry, validateEntry, hasId, deriveIdFromPath, deriveIdForContent, sanitizeId, } from "../runtime/strategy-registry.js";
11
+ /**
12
+ * Register senpi subcommands on the given Commander program.
13
+ * getStateDir: returns the plugin state dir (e.g. from config or default).
14
+ */
15
+ export function registerSenpiCli(program, getStateDir) {
16
+ const senpi = program.command("senpi");
17
+ senpi.description("Senpi trading runtime: trading-strategy create, list, uninstallStrategy");
18
+ const tradingStrategy = senpi.command("trading-strategy");
19
+ tradingStrategy.description("Manage trading strategies");
20
+ tradingStrategy
21
+ .command("create")
22
+ .description("Create and hot-load a strategy from a YAML file or inline content (no gateway restart)")
23
+ .option("-p, --path <path>", "Path to trading strategy YAML file")
24
+ .option("-c, --content <content>", "Inline YAML content")
25
+ .option("--strategy-id <id>", "Strategy id (default: derived from path or content-N)")
26
+ .option("--state-dir <dir>", "Override state directory (default: from config or ~/.openclaw/senpi-state)")
27
+ .action(async (opts) => {
28
+ const stateDir = opts.stateDir ?? getStateDir();
29
+ const hasPath = typeof opts.path === "string" && opts.path.length > 0;
30
+ const hasContent = typeof opts.content === "string";
31
+ if (hasPath && hasContent) {
32
+ console.error("Error: provide exactly one of --path or --content");
33
+ process.exitCode = 1;
34
+ return;
35
+ }
36
+ if (!hasPath && !hasContent) {
37
+ console.error("Error: provide --path or --content");
38
+ process.exitCode = 1;
39
+ return;
40
+ }
41
+ const registry = await readRegistry(stateDir);
42
+ let id;
43
+ if (typeof opts.strategyId === "string" && opts.strategyId.length > 0) {
44
+ id = sanitizeId(opts.strategyId);
45
+ if (id.length === 0)
46
+ id = "strategy";
47
+ if (hasId(registry, id)) {
48
+ console.error(`Error: id '${id}' already exists`);
49
+ process.exitCode = 1;
50
+ return;
51
+ }
52
+ }
53
+ else {
54
+ id =
55
+ hasPath
56
+ ? deriveIdFromPath(opts.path, registry.strategies.map((s) => s.id))
57
+ : deriveIdForContent(registry.strategies.map((s) => s.id));
58
+ }
59
+ const tradingStrategyYamlPath = hasPath ? path.resolve(process.cwd(), opts.path) : undefined;
60
+ const tradingStrategyYamlContent = hasContent ? opts.content : undefined;
61
+ const entry = hasPath
62
+ ? { id, tradingStrategyYamlPath: opts.path }
63
+ : { id, tradingStrategyYamlContent: opts.content };
64
+ const valid = validateEntry(entry);
65
+ if (!valid.ok) {
66
+ console.error("Error:", valid.error);
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+ const pathOrContent = hasPath ? tradingStrategyYamlPath : tradingStrategyYamlContent;
71
+ try {
72
+ await loadTradingStrategy(pathOrContent, { fromPath: hasPath });
73
+ }
74
+ catch (err) {
75
+ console.error(err instanceof Error ? err.message : String(err));
76
+ process.exitCode = 1;
77
+ return;
78
+ }
79
+ const params = tradingStrategyYamlPath
80
+ ? { tradingStrategyYamlPath, id }
81
+ : { tradingStrategyYamlContent: tradingStrategyYamlContent, id };
82
+ const result = spawnSync(process.argv[0], [process.argv[1], "gateway", "call", "senpi.installStrategy", "--params", JSON.stringify(params)], {
83
+ stdio: "inherit",
84
+ cwd: process.cwd(),
85
+ });
86
+ if (result.status === 0) {
87
+ process.exitCode = 0;
88
+ return;
89
+ }
90
+ const fallbackRegistry = await readRegistry(stateDir);
91
+ if (!hasId(fallbackRegistry, id)) {
92
+ fallbackRegistry.strategies.push(entry);
93
+ await writeRegistry(stateDir, fallbackRegistry);
94
+ console.error("Gateway unreachable. Strategy added to registry. Start or restart the gateway to load it.");
95
+ }
96
+ process.exitCode = result.status ?? 1;
97
+ });
98
+ tradingStrategy
99
+ .command("uninstallStrategy")
100
+ .description("Remove a strategy by id")
101
+ .option("--strategy-id <id>", "Strategy id to remove")
102
+ .option("--state-dir <dir>", "Override state directory")
103
+ .action(async (opts) => {
104
+ if (typeof opts.strategyId !== "string" || opts.strategyId.length === 0) {
105
+ console.error("Error: --strategy-id is required");
106
+ process.exitCode = 1;
107
+ return;
108
+ }
109
+ const stateDir = opts.stateDir ?? getStateDir();
110
+ const registry = await readRegistry(stateDir);
111
+ const next = registry.strategies.filter((e) => e.id !== opts.strategyId);
112
+ if (next.length === registry.strategies.length) {
113
+ console.log(`No strategy with id '${opts.strategyId}' in registry.`);
114
+ return;
115
+ }
116
+ await writeRegistry(stateDir, { ...registry, strategies: next });
117
+ console.log(`Strategy '${opts.strategyId}' removed from registry. Restart the gateway or call senpi.uninstallStrategy RPC to stop it.`);
118
+ });
119
+ tradingStrategy
120
+ .command("list")
121
+ .description("List installed strategies")
122
+ .option("--state-dir <dir>", "Override state directory")
123
+ .action(async (opts) => {
124
+ const stateDir = opts.stateDir ?? getStateDir();
125
+ const registry = await readRegistry(stateDir);
126
+ if (registry.strategies.length === 0) {
127
+ console.log("No strategies installed.");
128
+ return;
129
+ }
130
+ console.log("id\t\tsource");
131
+ for (const e of registry.strategies) {
132
+ const source = e.tradingStrategyYamlPath ?? "(inline)";
133
+ console.log(`${e.id}\t\t${source}`);
134
+ }
135
+ });
136
+ registerGuideCommands(senpi, VERSION);
137
+ }
138
+ //# sourceMappingURL=senpi-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"senpi-commands.js","sourceRoot":"","sources":["../../src/cli/senpi-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Centralized constants for the DSL feature.
3
+ */
4
+ export declare const COMPONENT_TYPE_EXIT_DSL: "exit/dsl";
5
+ /** DSL subscribes to the same hook event names as the rest of the runtime. */
6
+ export declare const EVENTS: {
7
+ readonly POSITION_OPENED: "on_position_opened";
8
+ readonly POSITION_CLOSED: "on_position_closed";
9
+ readonly POSITION_FLIPPED: "on_position_flipped";
10
+ };
11
+ export declare const DSL_EVENTS: {
12
+ readonly CREATED: "dsl.created";
13
+ readonly PHASE_CHANGED: "dsl.phase_changed";
14
+ readonly TIER_ADVANCED: "dsl.tier_advanced";
15
+ readonly SL_UPDATED: "dsl.sl_updated";
16
+ readonly CLOSED: "dsl.closed";
17
+ readonly CLOSE_PENDING: "dsl.close_pending";
18
+ readonly SETTINGS_UPDATED: "dsl.settings_updated";
19
+ };
20
+ export declare const DEFAULT_STATE_DIR = ".dsl-state";
21
+ export declare const DSL_STATE_VERSION = 2;
22
+ /** Close reasons for DSL state (closeReason) and position.closed (reason). */
23
+ export declare const CLOSE_REASON: {
24
+ readonly MANUAL_CLOSE: "manual_close";
25
+ readonly CLOSED_EXTERNALLY: "closed_externally";
26
+ readonly SL_HIT: "sl_hit";
27
+ readonly DSL_BREACH: "dsl_breach";
28
+ readonly FLIPPED: "flipped";
29
+ readonly CLOSE_POSITION_FAILED: "close_position_failed";
30
+ };
31
+ export type CloseReason = (typeof CLOSE_REASON)[keyof typeof CLOSE_REASON];
32
+ export declare const MIN_INTERVAL_SECONDS = 5;
33
+ export declare const DEFAULT_INTERVAL_MS = 30000;
34
+ export declare const MAX_CONSECUTIVE_CLOSE_FAILURES = 3;
35
+ export declare const MCP_TOOL_PREFIX = "senpi.";
36
+ export declare const PHASE1_DEFAULT_BREACHES = 3;
37
+ export declare const PHASE2_DEFAULT_BREACHES = 1;
38
+ export declare const PRICE_DECIMALS = 4;
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,uBAAuB,EAAG,UAAmB,CAAC;AAE3D,8EAA8E;AAC9E,eAAO,MAAM,MAAM;;;;CAIT,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;CAQb,CAAC;AAEX,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,8EAA8E;AAC9E,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAC3E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAC1C,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,cAAc,IAAI,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Centralized constants for the DSL feature.
3
+ */
4
+ import { HOOK_EVENT } from "../../types/hooks.js";
5
+ export const COMPONENT_TYPE_EXIT_DSL = "exit/dsl";
6
+ /** DSL subscribes to the same hook event names as the rest of the runtime. */
7
+ export const EVENTS = {
8
+ POSITION_OPENED: HOOK_EVENT.ON_POSITION_OPENED,
9
+ POSITION_CLOSED: HOOK_EVENT.ON_POSITION_CLOSED,
10
+ POSITION_FLIPPED: HOOK_EVENT.ON_POSITION_FLIPPED,
11
+ };
12
+ export const DSL_EVENTS = {
13
+ CREATED: "dsl.created",
14
+ PHASE_CHANGED: "dsl.phase_changed",
15
+ TIER_ADVANCED: "dsl.tier_advanced",
16
+ SL_UPDATED: "dsl.sl_updated",
17
+ CLOSED: "dsl.closed",
18
+ CLOSE_PENDING: "dsl.close_pending",
19
+ SETTINGS_UPDATED: "dsl.settings_updated",
20
+ };
21
+ export const DEFAULT_STATE_DIR = ".dsl-state";
22
+ export const DSL_STATE_VERSION = 2;
23
+ /** Close reasons for DSL state (closeReason) and position.closed (reason). */
24
+ export const CLOSE_REASON = {
25
+ MANUAL_CLOSE: "manual_close",
26
+ CLOSED_EXTERNALLY: "closed_externally",
27
+ SL_HIT: "sl_hit",
28
+ DSL_BREACH: "dsl_breach",
29
+ FLIPPED: "flipped",
30
+ CLOSE_POSITION_FAILED: "close_position_failed",
31
+ };
32
+ export const MIN_INTERVAL_SECONDS = 5;
33
+ export const DEFAULT_INTERVAL_MS = 30_000;
34
+ export const MAX_CONSECUTIVE_CLOSE_FAILURES = 3;
35
+ export const MCP_TOOL_PREFIX = "senpi.";
36
+ export const PHASE1_DEFAULT_BREACHES = 3;
37
+ export const PHASE2_DEFAULT_BREACHES = 1;
38
+ export const PRICE_DECIMALS = 4;
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/dsl/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAmB,CAAC;AAE3D,8EAA8E;AAC9E,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,eAAe,EAAE,UAAU,CAAC,kBAAkB;IAC9C,gBAAgB,EAAE,UAAU,CAAC,mBAAmB;CACxC,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,aAAa;IACtB,aAAa,EAAE,mBAAmB;IAClC,aAAa,EAAE,mBAAmB;IAClC,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,YAAY;IACpB,aAAa,EAAE,mBAAmB;IAClC,gBAAgB,EAAE,sBAAsB;CAChC,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAClB,qBAAqB,EAAE,uBAAuB;CACtC,CAAC;AAGX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AACxC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * RuntimeContextBuilder: resolves context variables for LLM decision prompts.
3
+ *
4
+ * Each context type (e.g. "signal", "strategy") is backed by a ContextProvider
5
+ * that knows how to extract/compute its data from the event and runtime state.
6
+ */
7
+ import type { ContextBuilder as IContextBuilder, ContextEntry, ContextProvider, ContextProviderRequest } from "./types.js";
8
+ export declare class RuntimeContextBuilder implements IContextBuilder {
9
+ private providers;
10
+ register(provider: ContextProvider): void;
11
+ build(entries: ContextEntry[], request: ContextProviderRequest): Promise<Record<string, unknown>>;
12
+ }
13
+ export declare function createContextBuilder(): RuntimeContextBuilder;
14
+ //# sourceMappingURL=context-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/context/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,IAAI,eAAe,EACjC,YAAY,EACZ,eAAe,EACf,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAQpB,qBAAa,qBAAsB,YAAW,eAAe;IAC3D,OAAO,CAAC,SAAS,CAAsC;IAEvD,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAInC,KAAK,CACT,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAUpC;AAID,wBAAgB,oBAAoB,IAAI,qBAAqB,CAO5D"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * RuntimeContextBuilder: resolves context variables for LLM decision prompts.
3
+ *
4
+ * Each context type (e.g. "signal", "strategy") is backed by a ContextProvider
5
+ * that knows how to extract/compute its data from the event and runtime state.
6
+ */
7
+ import { signalProvider } from "./providers/signal.provider.js";
8
+ import { strategyProvider } from "./providers/strategy.provider.js";
9
+ import { regimeProvider } from "./providers/regime.provider.js";
10
+ import { assetTrendProvider } from "./providers/asset-trend.provider.js";
11
+ // ─── RuntimeContextBuilder ──────────────────────────────────────────────────
12
+ export class RuntimeContextBuilder {
13
+ providers = new Map();
14
+ register(provider) {
15
+ this.providers.set(provider.type, provider);
16
+ }
17
+ async build(entries, request) {
18
+ const results = await Promise.all(entries.map(async (entry) => {
19
+ const provider = this.providers.get(entry.type);
20
+ if (!provider)
21
+ return [entry.value, null];
22
+ return [entry.value, await provider.resolve(request, entry)];
23
+ }));
24
+ return Object.fromEntries(results);
25
+ }
26
+ }
27
+ // ─── Factory ────────────────────────────────────────────────────────────────
28
+ export function createContextBuilder() {
29
+ const builder = new RuntimeContextBuilder();
30
+ builder.register(signalProvider);
31
+ builder.register(strategyProvider);
32
+ builder.register(regimeProvider);
33
+ builder.register(assetTrendProvider);
34
+ return builder;
35
+ }
36
+ //# sourceMappingURL=context-builder.js.map