@senpi/runtime 1.0.95-dev.20260408174401

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 (755) hide show
  1. package/README.md +155 -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 +220 -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 +278 -0
  33. package/dist/actions/open-position/open-position.action.js.map +1 -0
  34. package/dist/actions/position-tracker/position-tracker.action.d.ts +14 -0
  35. package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -0
  36. package/dist/actions/position-tracker/position-tracker.action.js +201 -0
  37. package/dist/actions/position-tracker/position-tracker.action.js.map +1 -0
  38. package/dist/actions/types.d.ts +123 -0
  39. package/dist/actions/types.d.ts.map +1 -0
  40. package/dist/actions/types.js +3 -0
  41. package/dist/actions/types.js.map +1 -0
  42. package/dist/cli/guide-commands.d.ts +27 -0
  43. package/dist/cli/guide-commands.d.ts.map +1 -0
  44. package/dist/cli/guide-commands.js +481 -0
  45. package/dist/cli/guide-commands.js.map +1 -0
  46. package/dist/cli/senpi-cli-config.d.ts +33 -0
  47. package/dist/cli/senpi-cli-config.d.ts.map +1 -0
  48. package/dist/cli/senpi-cli-config.js +130 -0
  49. package/dist/cli/senpi-cli-config.js.map +1 -0
  50. package/dist/cli/senpi-commands.d.ts +21 -0
  51. package/dist/cli/senpi-commands.d.ts.map +1 -0
  52. package/dist/cli/senpi-commands.js +471 -0
  53. package/dist/cli/senpi-commands.js.map +1 -0
  54. package/dist/cli/senpi-config-commands.d.ts +11 -0
  55. package/dist/cli/senpi-config-commands.d.ts.map +1 -0
  56. package/dist/cli/senpi-config-commands.js +113 -0
  57. package/dist/cli/senpi-config-commands.js.map +1 -0
  58. package/dist/constants/dsl/index.d.ts +62 -0
  59. package/dist/constants/dsl/index.d.ts.map +1 -0
  60. package/dist/constants/dsl/index.js +62 -0
  61. package/dist/constants/dsl/index.js.map +1 -0
  62. package/dist/context/context-builder.d.ts +14 -0
  63. package/dist/context/context-builder.d.ts.map +1 -0
  64. package/dist/context/context-builder.js +38 -0
  65. package/dist/context/context-builder.js.map +1 -0
  66. package/dist/context/index.d.ts +5 -0
  67. package/dist/context/index.d.ts.map +1 -0
  68. package/dist/context/index.js +5 -0
  69. package/dist/context/index.js.map +1 -0
  70. package/dist/context/interpolate.d.ts +6 -0
  71. package/dist/context/interpolate.d.ts.map +1 -0
  72. package/dist/context/interpolate.js +15 -0
  73. package/dist/context/interpolate.js.map +1 -0
  74. package/dist/context/providers/asset-trend.provider.d.ts +42 -0
  75. package/dist/context/providers/asset-trend.provider.d.ts.map +1 -0
  76. package/dist/context/providers/asset-trend.provider.js +90 -0
  77. package/dist/context/providers/asset-trend.provider.js.map +1 -0
  78. package/dist/context/providers/index.d.ts +5 -0
  79. package/dist/context/providers/index.d.ts.map +1 -0
  80. package/dist/context/providers/index.js +5 -0
  81. package/dist/context/providers/index.js.map +1 -0
  82. package/dist/context/providers/scanner-context.provider.d.ts +10 -0
  83. package/dist/context/providers/scanner-context.provider.d.ts.map +1 -0
  84. package/dist/context/providers/scanner-context.provider.js +20 -0
  85. package/dist/context/providers/scanner-context.provider.js.map +1 -0
  86. package/dist/context/providers/signal.provider.d.ts +11 -0
  87. package/dist/context/providers/signal.provider.d.ts.map +1 -0
  88. package/dist/context/providers/signal.provider.js +30 -0
  89. package/dist/context/providers/signal.provider.js.map +1 -0
  90. package/dist/context/providers/strategy.provider.d.ts +14 -0
  91. package/dist/context/providers/strategy.provider.d.ts.map +1 -0
  92. package/dist/context/providers/strategy.provider.js +71 -0
  93. package/dist/context/providers/strategy.provider.js.map +1 -0
  94. package/dist/context/types.d.ts +45 -0
  95. package/dist/context/types.d.ts.map +1 -0
  96. package/dist/context/types.js +18 -0
  97. package/dist/context/types.js.map +1 -0
  98. package/dist/debug.d.ts +2 -0
  99. package/dist/debug.d.ts.map +1 -0
  100. package/dist/debug.js +591 -0
  101. package/dist/debug.js.map +1 -0
  102. package/dist/dsl/config/exit-block.d.ts +11 -0
  103. package/dist/dsl/config/exit-block.d.ts.map +1 -0
  104. package/dist/dsl/config/exit-block.js +5 -0
  105. package/dist/dsl/config/exit-block.js.map +1 -0
  106. package/dist/dsl/config/index.d.ts +8 -0
  107. package/dist/dsl/config/index.d.ts.map +1 -0
  108. package/dist/dsl/config/index.js +6 -0
  109. package/dist/dsl/config/index.js.map +1 -0
  110. package/dist/dsl/config/parse-phase.d.ts +14 -0
  111. package/dist/dsl/config/parse-phase.d.ts.map +1 -0
  112. package/dist/dsl/config/parse-phase.js +78 -0
  113. package/dist/dsl/config/parse-phase.js.map +1 -0
  114. package/dist/dsl/config/parse-plugin-config.d.ts +8 -0
  115. package/dist/dsl/config/parse-plugin-config.d.ts.map +1 -0
  116. package/dist/dsl/config/parse-plugin-config.js +27 -0
  117. package/dist/dsl/config/parse-plugin-config.js.map +1 -0
  118. package/dist/dsl/config/parse-preset.d.ts +7 -0
  119. package/dist/dsl/config/parse-preset.d.ts.map +1 -0
  120. package/dist/dsl/config/parse-preset.js +99 -0
  121. package/dist/dsl/config/parse-preset.js.map +1 -0
  122. package/dist/dsl/config/parse-tiers.d.ts +7 -0
  123. package/dist/dsl/config/parse-tiers.d.ts.map +1 -0
  124. package/dist/dsl/config/parse-tiers.js +31 -0
  125. package/dist/dsl/config/parse-tiers.js.map +1 -0
  126. package/dist/dsl/config/parse-timeouts.d.ts +16 -0
  127. package/dist/dsl/config/parse-timeouts.d.ts.map +1 -0
  128. package/dist/dsl/config/parse-timeouts.js +75 -0
  129. package/dist/dsl/config/parse-timeouts.js.map +1 -0
  130. package/dist/dsl/config/raw-types.d.ts +45 -0
  131. package/dist/dsl/config/raw-types.d.ts.map +1 -0
  132. package/dist/dsl/config/raw-types.js +5 -0
  133. package/dist/dsl/config/raw-types.js.map +1 -0
  134. package/dist/dsl/config/unknown-keys.d.ts +7 -0
  135. package/dist/dsl/config/unknown-keys.d.ts.map +1 -0
  136. package/dist/dsl/config/unknown-keys.js +119 -0
  137. package/dist/dsl/config/unknown-keys.js.map +1 -0
  138. package/dist/dsl/config/validation.d.ts +21 -0
  139. package/dist/dsl/config/validation.d.ts.map +1 -0
  140. package/dist/dsl/config/validation.js +45 -0
  141. package/dist/dsl/config/validation.js.map +1 -0
  142. package/dist/dsl/constants/index.d.ts +3 -0
  143. package/dist/dsl/constants/index.d.ts.map +1 -0
  144. package/dist/dsl/constants/index.js +3 -0
  145. package/dist/dsl/constants/index.js.map +1 -0
  146. package/dist/dsl/engine/exchange-stop.d.ts +16 -0
  147. package/dist/dsl/engine/exchange-stop.d.ts.map +1 -0
  148. package/dist/dsl/engine/exchange-stop.js +20 -0
  149. package/dist/dsl/engine/exchange-stop.js.map +1 -0
  150. package/dist/dsl/engine/floors.d.ts +32 -0
  151. package/dist/dsl/engine/floors.d.ts.map +1 -0
  152. package/dist/dsl/engine/floors.js +115 -0
  153. package/dist/dsl/engine/floors.js.map +1 -0
  154. package/dist/dsl/engine/index.d.ts +7 -0
  155. package/dist/dsl/engine/index.d.ts.map +1 -0
  156. package/dist/dsl/engine/index.js +7 -0
  157. package/dist/dsl/engine/index.js.map +1 -0
  158. package/dist/dsl/engine/round.d.ts +5 -0
  159. package/dist/dsl/engine/round.d.ts.map +1 -0
  160. package/dist/dsl/engine/round.js +9 -0
  161. package/dist/dsl/engine/round.js.map +1 -0
  162. package/dist/dsl/engine/state-updates.d.ts +8 -0
  163. package/dist/dsl/engine/state-updates.d.ts.map +1 -0
  164. package/dist/dsl/engine/state-updates.js +60 -0
  165. package/dist/dsl/engine/state-updates.js.map +1 -0
  166. package/dist/dsl/engine/tick.d.ts +6 -0
  167. package/dist/dsl/engine/tick.d.ts.map +1 -0
  168. package/dist/dsl/engine/tick.js +174 -0
  169. package/dist/dsl/engine/tick.js.map +1 -0
  170. package/dist/dsl/events/bus-types.d.ts +7 -0
  171. package/dist/dsl/events/bus-types.d.ts.map +1 -0
  172. package/dist/dsl/events/bus-types.js +6 -0
  173. package/dist/dsl/events/bus-types.js.map +1 -0
  174. package/dist/dsl/events/guards.d.ts +17 -0
  175. package/dist/dsl/events/guards.d.ts.map +1 -0
  176. package/dist/dsl/events/guards.js +116 -0
  177. package/dist/dsl/events/guards.js.map +1 -0
  178. package/dist/dsl/events/handlers.d.ts +19 -0
  179. package/dist/dsl/events/handlers.d.ts.map +1 -0
  180. package/dist/dsl/events/handlers.js +387 -0
  181. package/dist/dsl/events/handlers.js.map +1 -0
  182. package/dist/dsl/events/index.d.ts +4 -0
  183. package/dist/dsl/events/index.d.ts.map +1 -0
  184. package/dist/dsl/events/index.js +4 -0
  185. package/dist/dsl/events/index.js.map +1 -0
  186. package/dist/dsl/events/initial-state.d.ts +7 -0
  187. package/dist/dsl/events/initial-state.d.ts.map +1 -0
  188. package/dist/dsl/events/initial-state.js +96 -0
  189. package/dist/dsl/events/initial-state.js.map +1 -0
  190. package/dist/dsl/events/normalize-position-opened.d.ts +10 -0
  191. package/dist/dsl/events/normalize-position-opened.d.ts.map +1 -0
  192. package/dist/dsl/events/normalize-position-opened.js +13 -0
  193. package/dist/dsl/events/normalize-position-opened.js.map +1 -0
  194. package/dist/dsl/index.d.ts +13 -0
  195. package/dist/dsl/index.d.ts.map +1 -0
  196. package/dist/dsl/index.js +37 -0
  197. package/dist/dsl/index.js.map +1 -0
  198. package/dist/dsl/monitor/create-monitor.d.ts +24 -0
  199. package/dist/dsl/monitor/create-monitor.d.ts.map +1 -0
  200. package/dist/dsl/monitor/create-monitor.js +162 -0
  201. package/dist/dsl/monitor/create-monitor.js.map +1 -0
  202. package/dist/dsl/monitor/effective-dex.d.ts +7 -0
  203. package/dist/dsl/monitor/effective-dex.d.ts.map +1 -0
  204. package/dist/dsl/monitor/effective-dex.js +11 -0
  205. package/dist/dsl/monitor/effective-dex.js.map +1 -0
  206. package/dist/dsl/monitor/exchange-sync.d.ts +16 -0
  207. package/dist/dsl/monitor/exchange-sync.d.ts.map +1 -0
  208. package/dist/dsl/monitor/exchange-sync.js +37 -0
  209. package/dist/dsl/monitor/exchange-sync.js.map +1 -0
  210. package/dist/dsl/monitor/index.d.ts +6 -0
  211. package/dist/dsl/monitor/index.d.ts.map +1 -0
  212. package/dist/dsl/monitor/index.js +5 -0
  213. package/dist/dsl/monitor/index.js.map +1 -0
  214. package/dist/dsl/monitor/market-price.d.ts +5 -0
  215. package/dist/dsl/monitor/market-price.d.ts.map +1 -0
  216. package/dist/dsl/monitor/market-price.js +24 -0
  217. package/dist/dsl/monitor/market-price.js.map +1 -0
  218. package/dist/dsl/monitor/process-one-position.d.ts +19 -0
  219. package/dist/dsl/monitor/process-one-position.d.ts.map +1 -0
  220. package/dist/dsl/monitor/process-one-position.js +438 -0
  221. package/dist/dsl/monitor/process-one-position.js.map +1 -0
  222. package/dist/dsl/notifications/formatter.d.ts +18 -0
  223. package/dist/dsl/notifications/formatter.d.ts.map +1 -0
  224. package/dist/dsl/notifications/formatter.js +69 -0
  225. package/dist/dsl/notifications/formatter.js.map +1 -0
  226. package/dist/dsl/notifications/index.d.ts +19 -0
  227. package/dist/dsl/notifications/index.d.ts.map +1 -0
  228. package/dist/dsl/notifications/index.js +90 -0
  229. package/dist/dsl/notifications/index.js.map +1 -0
  230. package/dist/dsl/plugin/index.d.ts +66 -0
  231. package/dist/dsl/plugin/index.d.ts.map +1 -0
  232. package/dist/dsl/plugin/index.js +398 -0
  233. package/dist/dsl/plugin/index.js.map +1 -0
  234. package/dist/dsl/plugin/options.d.ts +40 -0
  235. package/dist/dsl/plugin/options.d.ts.map +1 -0
  236. package/dist/dsl/plugin/options.js +5 -0
  237. package/dist/dsl/plugin/options.js.map +1 -0
  238. package/dist/dsl/types/index.d.ts +3 -0
  239. package/dist/dsl/types/index.d.ts.map +1 -0
  240. package/dist/dsl/types/index.js +3 -0
  241. package/dist/dsl/types/index.js.map +1 -0
  242. package/dist/health/index.d.ts +29 -0
  243. package/dist/health/index.d.ts.map +1 -0
  244. package/dist/health/index.js +191 -0
  245. package/dist/health/index.js.map +1 -0
  246. package/dist/health/types.d.ts +114 -0
  247. package/dist/health/types.d.ts.map +1 -0
  248. package/dist/health/types.js +2 -0
  249. package/dist/health/types.js.map +1 -0
  250. package/dist/index.d.ts +102 -0
  251. package/dist/index.d.ts.map +1 -0
  252. package/dist/index.js +772 -0
  253. package/dist/index.js.map +1 -0
  254. package/dist/leverage/max-leverage-cache.d.ts +10 -0
  255. package/dist/leverage/max-leverage-cache.d.ts.map +1 -0
  256. package/dist/leverage/max-leverage-cache.js +51 -0
  257. package/dist/leverage/max-leverage-cache.js.map +1 -0
  258. package/dist/leverage/resolve-leverage.d.ts +9 -0
  259. package/dist/leverage/resolve-leverage.d.ts.map +1 -0
  260. package/dist/leverage/resolve-leverage.js +15 -0
  261. package/dist/leverage/resolve-leverage.js.map +1 -0
  262. package/dist/risk/index.d.ts +9 -0
  263. package/dist/risk/index.d.ts.map +1 -0
  264. package/dist/risk/index.js +9 -0
  265. package/dist/risk/index.js.map +1 -0
  266. package/dist/runtime/action-registry.d.ts +12 -0
  267. package/dist/runtime/action-registry.d.ts.map +1 -0
  268. package/dist/runtime/action-registry.js +22 -0
  269. package/dist/runtime/action-registry.js.map +1 -0
  270. package/dist/runtime/auto-update/command-runner.d.ts +20 -0
  271. package/dist/runtime/auto-update/command-runner.d.ts.map +1 -0
  272. package/dist/runtime/auto-update/command-runner.js +54 -0
  273. package/dist/runtime/auto-update/command-runner.js.map +1 -0
  274. package/dist/runtime/auto-update/coordinator.d.ts +90 -0
  275. package/dist/runtime/auto-update/coordinator.d.ts.map +1 -0
  276. package/dist/runtime/auto-update/coordinator.js +336 -0
  277. package/dist/runtime/auto-update/coordinator.js.map +1 -0
  278. package/dist/runtime/auto-update/gateway-restart.d.ts +49 -0
  279. package/dist/runtime/auto-update/gateway-restart.d.ts.map +1 -0
  280. package/dist/runtime/auto-update/gateway-restart.js +105 -0
  281. package/dist/runtime/auto-update/gateway-restart.js.map +1 -0
  282. package/dist/runtime/auto-update/policy.d.ts +24 -0
  283. package/dist/runtime/auto-update/policy.d.ts.map +1 -0
  284. package/dist/runtime/auto-update/policy.js +42 -0
  285. package/dist/runtime/auto-update/policy.js.map +1 -0
  286. package/dist/runtime/auto-update/preflight.d.ts +16 -0
  287. package/dist/runtime/auto-update/preflight.d.ts.map +1 -0
  288. package/dist/runtime/auto-update/preflight.js +20 -0
  289. package/dist/runtime/auto-update/preflight.js.map +1 -0
  290. package/dist/runtime/auto-update/state-store.d.ts +29 -0
  291. package/dist/runtime/auto-update/state-store.d.ts.map +1 -0
  292. package/dist/runtime/auto-update/state-store.js +51 -0
  293. package/dist/runtime/auto-update/state-store.js.map +1 -0
  294. package/dist/runtime/auto-update/types.d.ts +105 -0
  295. package/dist/runtime/auto-update/types.d.ts.map +1 -0
  296. package/dist/runtime/auto-update/types.js +56 -0
  297. package/dist/runtime/auto-update/types.js.map +1 -0
  298. package/dist/runtime/auto-update/version-source.d.ts +23 -0
  299. package/dist/runtime/auto-update/version-source.d.ts.map +1 -0
  300. package/dist/runtime/auto-update/version-source.js +25 -0
  301. package/dist/runtime/auto-update/version-source.js.map +1 -0
  302. package/dist/runtime/build-action-scan-payload.d.ts +20 -0
  303. package/dist/runtime/build-action-scan-payload.d.ts.map +1 -0
  304. package/dist/runtime/build-action-scan-payload.js +36 -0
  305. package/dist/runtime/build-action-scan-payload.js.map +1 -0
  306. package/dist/runtime/bus.d.ts +6 -0
  307. package/dist/runtime/bus.d.ts.map +1 -0
  308. package/dist/runtime/bus.js +22 -0
  309. package/dist/runtime/bus.js.map +1 -0
  310. package/dist/runtime/create-action-context.d.ts +34 -0
  311. package/dist/runtime/create-action-context.d.ts.map +1 -0
  312. package/dist/runtime/create-action-context.js +22 -0
  313. package/dist/runtime/create-action-context.js.map +1 -0
  314. package/dist/runtime/create-actions.d.ts +30 -0
  315. package/dist/runtime/create-actions.d.ts.map +1 -0
  316. package/dist/runtime/create-actions.js +70 -0
  317. package/dist/runtime/create-actions.js.map +1 -0
  318. package/dist/runtime/create-runtime-context.d.ts +35 -0
  319. package/dist/runtime/create-runtime-context.d.ts.map +1 -0
  320. package/dist/runtime/create-runtime-context.js +35 -0
  321. package/dist/runtime/create-runtime-context.js.map +1 -0
  322. package/dist/runtime/create-scanner-module.d.ts +14 -0
  323. package/dist/runtime/create-scanner-module.d.ts.map +1 -0
  324. package/dist/runtime/create-scanner-module.js +31 -0
  325. package/dist/runtime/create-scanner-module.js.map +1 -0
  326. package/dist/runtime/create-scanner-providers-for-run.d.ts +20 -0
  327. package/dist/runtime/create-scanner-providers-for-run.d.ts.map +1 -0
  328. package/dist/runtime/create-scanner-providers-for-run.js +34 -0
  329. package/dist/runtime/create-scanner-providers-for-run.js.map +1 -0
  330. package/dist/runtime/default-state-dir.d.ts +10 -0
  331. package/dist/runtime/default-state-dir.d.ts.map +1 -0
  332. package/dist/runtime/default-state-dir.js +22 -0
  333. package/dist/runtime/default-state-dir.js.map +1 -0
  334. package/dist/runtime/env-resolve.d.ts +17 -0
  335. package/dist/runtime/env-resolve.d.ts.map +1 -0
  336. package/dist/runtime/env-resolve.js +45 -0
  337. package/dist/runtime/env-resolve.js.map +1 -0
  338. package/dist/runtime/hook-system.d.ts +7 -0
  339. package/dist/runtime/hook-system.d.ts.map +1 -0
  340. package/dist/runtime/hook-system.js +16 -0
  341. package/dist/runtime/hook-system.js.map +1 -0
  342. package/dist/runtime/index.d.ts +37 -0
  343. package/dist/runtime/index.d.ts.map +1 -0
  344. package/dist/runtime/index.js +26 -0
  345. package/dist/runtime/index.js.map +1 -0
  346. package/dist/runtime/load-runtime-config.d.ts +23 -0
  347. package/dist/runtime/load-runtime-config.d.ts.map +1 -0
  348. package/dist/runtime/load-runtime-config.js +176 -0
  349. package/dist/runtime/load-runtime-config.js.map +1 -0
  350. package/dist/runtime/map-exit-config.d.ts +11 -0
  351. package/dist/runtime/map-exit-config.d.ts.map +1 -0
  352. package/dist/runtime/map-exit-config.js +86 -0
  353. package/dist/runtime/map-exit-config.js.map +1 -0
  354. package/dist/runtime/map-strategies-registration.d.ts +14 -0
  355. package/dist/runtime/map-strategies-registration.d.ts.map +1 -0
  356. package/dist/runtime/map-strategies-registration.js +44 -0
  357. package/dist/runtime/map-strategies-registration.js.map +1 -0
  358. package/dist/runtime/map-strategies.d.ts +14 -0
  359. package/dist/runtime/map-strategies.d.ts.map +1 -0
  360. package/dist/runtime/map-strategies.js +64 -0
  361. package/dist/runtime/map-strategies.js.map +1 -0
  362. package/dist/runtime/notifications.d.ts +19 -0
  363. package/dist/runtime/notifications.d.ts.map +1 -0
  364. package/dist/runtime/notifications.js +88 -0
  365. package/dist/runtime/notifications.js.map +1 -0
  366. package/dist/runtime/parse-interval.d.ts +11 -0
  367. package/dist/runtime/parse-interval.d.ts.map +1 -0
  368. package/dist/runtime/parse-interval.js +35 -0
  369. package/dist/runtime/parse-interval.js.map +1 -0
  370. package/dist/runtime/recipe-version.d.ts +3 -0
  371. package/dist/runtime/recipe-version.d.ts.map +1 -0
  372. package/dist/runtime/recipe-version.js +3 -0
  373. package/dist/runtime/recipe-version.js.map +1 -0
  374. package/dist/runtime/reconcile-state.d.ts +37 -0
  375. package/dist/runtime/reconcile-state.d.ts.map +1 -0
  376. package/dist/runtime/reconcile-state.js +179 -0
  377. package/dist/runtime/reconcile-state.js.map +1 -0
  378. package/dist/runtime/risk-guard.d.ts +6 -0
  379. package/dist/runtime/risk-guard.d.ts.map +1 -0
  380. package/dist/runtime/risk-guard.js +14 -0
  381. package/dist/runtime/risk-guard.js.map +1 -0
  382. package/dist/runtime/run.d.ts +30 -0
  383. package/dist/runtime/run.d.ts.map +1 -0
  384. package/dist/runtime/run.js +46 -0
  385. package/dist/runtime/run.js.map +1 -0
  386. package/dist/runtime/runtime-config.d.ts +6 -0
  387. package/dist/runtime/runtime-config.d.ts.map +1 -0
  388. package/dist/runtime/runtime-config.js +5 -0
  389. package/dist/runtime/runtime-config.js.map +1 -0
  390. package/dist/runtime/runtime-schema.d.ts +1859 -0
  391. package/dist/runtime/runtime-schema.d.ts.map +1 -0
  392. package/dist/runtime/runtime-schema.js +110 -0
  393. package/dist/runtime/runtime-schema.js.map +1 -0
  394. package/dist/runtime/runtime-version.d.ts +19 -0
  395. package/dist/runtime/runtime-version.d.ts.map +1 -0
  396. package/dist/runtime/runtime-version.js +29 -0
  397. package/dist/runtime/runtime-version.js.map +1 -0
  398. package/dist/runtime/runtime.d.ts +53 -0
  399. package/dist/runtime/runtime.d.ts.map +1 -0
  400. package/dist/runtime/runtime.js +335 -0
  401. package/dist/runtime/runtime.js.map +1 -0
  402. package/dist/runtime/scanner-composition.d.ts +23 -0
  403. package/dist/runtime/scanner-composition.d.ts.map +1 -0
  404. package/dist/runtime/scanner-composition.js +168 -0
  405. package/dist/runtime/scanner-composition.js.map +1 -0
  406. package/dist/runtime/scanner-registry.d.ts +28 -0
  407. package/dist/runtime/scanner-registry.d.ts.map +1 -0
  408. package/dist/runtime/scanner-registry.js +114 -0
  409. package/dist/runtime/scanner-registry.js.map +1 -0
  410. package/dist/runtime/state-layout.d.ts +50 -0
  411. package/dist/runtime/state-layout.d.ts.map +1 -0
  412. package/dist/runtime/state-layout.js +89 -0
  413. package/dist/runtime/state-layout.js.map +1 -0
  414. package/dist/runtime/strategy-registry.d.ts +79 -0
  415. package/dist/runtime/strategy-registry.d.ts.map +1 -0
  416. package/dist/runtime/strategy-registry.js +265 -0
  417. package/dist/runtime/strategy-registry.js.map +1 -0
  418. package/dist/runtime/validate-dsl-position-tracking.d.ts +3 -0
  419. package/dist/runtime/validate-dsl-position-tracking.d.ts.map +1 -0
  420. package/dist/runtime/validate-dsl-position-tracking.js +27 -0
  421. package/dist/runtime/validate-dsl-position-tracking.js.map +1 -0
  422. package/dist/scanners/__tests__/default-engine-test-composition.d.ts +9 -0
  423. package/dist/scanners/__tests__/default-engine-test-composition.d.ts.map +1 -0
  424. package/dist/scanners/__tests__/default-engine-test-composition.js +84 -0
  425. package/dist/scanners/__tests__/default-engine-test-composition.js.map +1 -0
  426. package/dist/scanners/__tests__/fixtures/index.d.ts +3 -0
  427. package/dist/scanners/__tests__/fixtures/index.d.ts.map +1 -0
  428. package/dist/scanners/__tests__/fixtures/index.js +3 -0
  429. package/dist/scanners/__tests__/fixtures/index.js.map +1 -0
  430. package/dist/scanners/__tests__/fixtures/position-tracker-scenarios.d.ts +21 -0
  431. package/dist/scanners/__tests__/fixtures/position-tracker-scenarios.d.ts.map +1 -0
  432. package/dist/scanners/__tests__/fixtures/position-tracker-scenarios.js +199 -0
  433. package/dist/scanners/__tests__/fixtures/position-tracker-scenarios.js.map +1 -0
  434. package/dist/scanners/__tests__/fixtures/scan-results.d.ts +23 -0
  435. package/dist/scanners/__tests__/fixtures/scan-results.d.ts.map +1 -0
  436. package/dist/scanners/__tests__/fixtures/scan-results.js +128 -0
  437. package/dist/scanners/__tests__/fixtures/scan-results.js.map +1 -0
  438. package/dist/scanners/__tests__/fixtures/signals.d.ts +18 -0
  439. package/dist/scanners/__tests__/fixtures/signals.d.ts.map +1 -0
  440. package/dist/scanners/__tests__/fixtures/signals.js +84 -0
  441. package/dist/scanners/__tests__/fixtures/signals.js.map +1 -0
  442. package/dist/scanners/__tests__/test-helpers.d.ts +4 -0
  443. package/dist/scanners/__tests__/test-helpers.d.ts.map +1 -0
  444. package/dist/scanners/__tests__/test-helpers.js +23 -0
  445. package/dist/scanners/__tests__/test-helpers.js.map +1 -0
  446. package/dist/scanners/artifacts.d.ts +131 -0
  447. package/dist/scanners/artifacts.d.ts.map +1 -0
  448. package/dist/scanners/artifacts.js +72 -0
  449. package/dist/scanners/artifacts.js.map +1 -0
  450. package/dist/scanners/context-source-mapping.d.ts +4 -0
  451. package/dist/scanners/context-source-mapping.d.ts.map +1 -0
  452. package/dist/scanners/context-source-mapping.js +10 -0
  453. package/dist/scanners/context-source-mapping.js.map +1 -0
  454. package/dist/scanners/create-scanner.d.ts +13 -0
  455. package/dist/scanners/create-scanner.d.ts.map +1 -0
  456. package/dist/scanners/create-scanner.js +11 -0
  457. package/dist/scanners/create-scanner.js.map +1 -0
  458. package/dist/scanners/engine/config-validator.d.ts +7 -0
  459. package/dist/scanners/engine/config-validator.d.ts.map +1 -0
  460. package/dist/scanners/engine/config-validator.js +16 -0
  461. package/dist/scanners/engine/config-validator.js.map +1 -0
  462. package/dist/scanners/engine/data-providers.d.ts +48 -0
  463. package/dist/scanners/engine/data-providers.d.ts.map +1 -0
  464. package/dist/scanners/engine/data-providers.js +28 -0
  465. package/dist/scanners/engine/data-providers.js.map +1 -0
  466. package/dist/scanners/engine/engine.d.ts +92 -0
  467. package/dist/scanners/engine/engine.d.ts.map +1 -0
  468. package/dist/scanners/engine/engine.js +478 -0
  469. package/dist/scanners/engine/engine.js.map +1 -0
  470. package/dist/scanners/engine/index.d.ts +9 -0
  471. package/dist/scanners/engine/index.d.ts.map +1 -0
  472. package/dist/scanners/engine/index.js +7 -0
  473. package/dist/scanners/engine/index.js.map +1 -0
  474. package/dist/scanners/engine/input-resolver.d.ts +33 -0
  475. package/dist/scanners/engine/input-resolver.d.ts.map +1 -0
  476. package/dist/scanners/engine/input-resolver.js +216 -0
  477. package/dist/scanners/engine/input-resolver.js.map +1 -0
  478. package/dist/scanners/engine/lifecycle.d.ts +21 -0
  479. package/dist/scanners/engine/lifecycle.d.ts.map +1 -0
  480. package/dist/scanners/engine/lifecycle.js +2 -0
  481. package/dist/scanners/engine/lifecycle.js.map +1 -0
  482. package/dist/scanners/engine/result-builder.d.ts +30 -0
  483. package/dist/scanners/engine/result-builder.d.ts.map +1 -0
  484. package/dist/scanners/engine/result-builder.js +129 -0
  485. package/dist/scanners/engine/result-builder.js.map +1 -0
  486. package/dist/scanners/engine/strategy-registry.d.ts +48 -0
  487. package/dist/scanners/engine/strategy-registry.d.ts.map +1 -0
  488. package/dist/scanners/engine/strategy-registry.js +103 -0
  489. package/dist/scanners/engine/strategy-registry.js.map +1 -0
  490. package/dist/scanners/events.d.ts +41 -0
  491. package/dist/scanners/events.d.ts.map +1 -0
  492. package/dist/scanners/events.js +33 -0
  493. package/dist/scanners/events.js.map +1 -0
  494. package/dist/scanners/implementations/emerging-movers.d.ts +215 -0
  495. package/dist/scanners/implementations/emerging-movers.d.ts.map +1 -0
  496. package/dist/scanners/implementations/emerging-movers.js +713 -0
  497. package/dist/scanners/implementations/emerging-movers.js.map +1 -0
  498. package/dist/scanners/implementations/index.d.ts +9 -0
  499. package/dist/scanners/implementations/index.d.ts.map +1 -0
  500. package/dist/scanners/implementations/index.js +9 -0
  501. package/dist/scanners/implementations/index.js.map +1 -0
  502. package/dist/scanners/implementations/indicators.d.ts +40 -0
  503. package/dist/scanners/implementations/indicators.d.ts.map +1 -0
  504. package/dist/scanners/implementations/indicators.js +114 -0
  505. package/dist/scanners/implementations/indicators.js.map +1 -0
  506. package/dist/scanners/implementations/liquidation-watchdog.d.ts +66 -0
  507. package/dist/scanners/implementations/liquidation-watchdog.d.ts.map +1 -0
  508. package/dist/scanners/implementations/liquidation-watchdog.js +293 -0
  509. package/dist/scanners/implementations/liquidation-watchdog.js.map +1 -0
  510. package/dist/scanners/implementations/market-regime.d.ts +52 -0
  511. package/dist/scanners/implementations/market-regime.d.ts.map +1 -0
  512. package/dist/scanners/implementations/market-regime.js +205 -0
  513. package/dist/scanners/implementations/market-regime.js.map +1 -0
  514. package/dist/scanners/implementations/momentum.d.ts +21 -0
  515. package/dist/scanners/implementations/momentum.d.ts.map +1 -0
  516. package/dist/scanners/implementations/momentum.js +132 -0
  517. package/dist/scanners/implementations/momentum.js.map +1 -0
  518. package/dist/scanners/implementations/oi-tracker.d.ts +13 -0
  519. package/dist/scanners/implementations/oi-tracker.d.ts.map +1 -0
  520. package/dist/scanners/implementations/oi-tracker.js +71 -0
  521. package/dist/scanners/implementations/oi-tracker.js.map +1 -0
  522. package/dist/scanners/implementations/opportunity.d.ts +104 -0
  523. package/dist/scanners/implementations/opportunity.d.ts.map +1 -0
  524. package/dist/scanners/implementations/opportunity.js +445 -0
  525. package/dist/scanners/implementations/opportunity.js.map +1 -0
  526. package/dist/scanners/implementations/position-tracker.d.ts +120 -0
  527. package/dist/scanners/implementations/position-tracker.d.ts.map +1 -0
  528. package/dist/scanners/implementations/position-tracker.js +360 -0
  529. package/dist/scanners/implementations/position-tracker.js.map +1 -0
  530. package/dist/scanners/implementations/prescreener.d.ts +20 -0
  531. package/dist/scanners/implementations/prescreener.d.ts.map +1 -0
  532. package/dist/scanners/implementations/prescreener.js +101 -0
  533. package/dist/scanners/implementations/prescreener.js.map +1 -0
  534. package/dist/scanners/implementations/sm-flip.d.ts +43 -0
  535. package/dist/scanners/implementations/sm-flip.d.ts.map +1 -0
  536. package/dist/scanners/implementations/sm-flip.js +205 -0
  537. package/dist/scanners/implementations/sm-flip.js.map +1 -0
  538. package/dist/scanners/index.d.ts +26 -0
  539. package/dist/scanners/index.d.ts.map +1 -0
  540. package/dist/scanners/index.js +19 -0
  541. package/dist/scanners/index.js.map +1 -0
  542. package/dist/scanners/input-descriptors.d.ts +61 -0
  543. package/dist/scanners/input-descriptors.d.ts.map +1 -0
  544. package/dist/scanners/input-descriptors.js +43 -0
  545. package/dist/scanners/input-descriptors.js.map +1 -0
  546. package/dist/scanners/prepare-scanner-inputs.d.ts +12 -0
  547. package/dist/scanners/prepare-scanner-inputs.d.ts.map +1 -0
  548. package/dist/scanners/prepare-scanner-inputs.js +21 -0
  549. package/dist/scanners/prepare-scanner-inputs.js.map +1 -0
  550. package/dist/scanners/protocol/context.d.ts +95 -0
  551. package/dist/scanners/protocol/context.d.ts.map +1 -0
  552. package/dist/scanners/protocol/context.js +2 -0
  553. package/dist/scanners/protocol/context.js.map +1 -0
  554. package/dist/scanners/protocol/hooks.d.ts +18 -0
  555. package/dist/scanners/protocol/hooks.d.ts.map +1 -0
  556. package/dist/scanners/protocol/hooks.js +12 -0
  557. package/dist/scanners/protocol/hooks.js.map +1 -0
  558. package/dist/scanners/protocol/index.d.ts +5 -0
  559. package/dist/scanners/protocol/index.d.ts.map +1 -0
  560. package/dist/scanners/protocol/index.js +2 -0
  561. package/dist/scanners/protocol/index.js.map +1 -0
  562. package/dist/scanners/protocol/scanner.d.ts +47 -0
  563. package/dist/scanners/protocol/scanner.d.ts.map +1 -0
  564. package/dist/scanners/protocol/scanner.js +2 -0
  565. package/dist/scanners/protocol/scanner.js.map +1 -0
  566. package/dist/scanners/providers/adapter.d.ts +23 -0
  567. package/dist/scanners/providers/adapter.d.ts.map +1 -0
  568. package/dist/scanners/providers/adapter.js +227 -0
  569. package/dist/scanners/providers/adapter.js.map +1 -0
  570. package/dist/scanners/providers/cache.d.ts +20 -0
  571. package/dist/scanners/providers/cache.d.ts.map +1 -0
  572. package/dist/scanners/providers/cache.js +61 -0
  573. package/dist/scanners/providers/cache.js.map +1 -0
  574. package/dist/scanners/providers/client.d.ts +53 -0
  575. package/dist/scanners/providers/client.d.ts.map +1 -0
  576. package/dist/scanners/providers/client.js +174 -0
  577. package/dist/scanners/providers/client.js.map +1 -0
  578. package/dist/scanners/providers/factory.d.ts +43 -0
  579. package/dist/scanners/providers/factory.d.ts.map +1 -0
  580. package/dist/scanners/providers/factory.js +297 -0
  581. package/dist/scanners/providers/factory.js.map +1 -0
  582. package/dist/scanners/providers/types.d.ts +61 -0
  583. package/dist/scanners/providers/types.d.ts.map +1 -0
  584. package/dist/scanners/providers/types.js +6 -0
  585. package/dist/scanners/providers/types.js.map +1 -0
  586. package/dist/scanners/runtime-module.d.ts +79 -0
  587. package/dist/scanners/runtime-module.d.ts.map +1 -0
  588. package/dist/scanners/runtime-module.js +362 -0
  589. package/dist/scanners/runtime-module.js.map +1 -0
  590. package/dist/scanners/scanner-definition.d.ts +81 -0
  591. package/dist/scanners/scanner-definition.d.ts.map +1 -0
  592. package/dist/scanners/scanner-definition.js +19 -0
  593. package/dist/scanners/scanner-definition.js.map +1 -0
  594. package/dist/scanners/schema-utils.d.ts +6 -0
  595. package/dist/scanners/schema-utils.d.ts.map +1 -0
  596. package/dist/scanners/schema-utils.js +14 -0
  597. package/dist/scanners/schema-utils.js.map +1 -0
  598. package/dist/scanners/score-utils.d.ts +19 -0
  599. package/dist/scanners/score-utils.d.ts.map +1 -0
  600. package/dist/scanners/score-utils.js +47 -0
  601. package/dist/scanners/score-utils.js.map +1 -0
  602. package/dist/scanners/store/fs-utils.d.ts +12 -0
  603. package/dist/scanners/store/fs-utils.d.ts.map +1 -0
  604. package/dist/scanners/store/fs-utils.js +47 -0
  605. package/dist/scanners/store/fs-utils.js.map +1 -0
  606. package/dist/scanners/store/index.d.ts +5 -0
  607. package/dist/scanners/store/index.d.ts.map +1 -0
  608. package/dist/scanners/store/index.js +5 -0
  609. package/dist/scanners/store/index.js.map +1 -0
  610. package/dist/scanners/store/runtime-store.d.ts +50 -0
  611. package/dist/scanners/store/runtime-store.d.ts.map +1 -0
  612. package/dist/scanners/store/runtime-store.js +91 -0
  613. package/dist/scanners/store/runtime-store.js.map +1 -0
  614. package/dist/scanners/store/shared-artifact-store.d.ts +35 -0
  615. package/dist/scanners/store/shared-artifact-store.d.ts.map +1 -0
  616. package/dist/scanners/store/shared-artifact-store.js +89 -0
  617. package/dist/scanners/store/shared-artifact-store.js.map +1 -0
  618. package/dist/scanners/store/signal-store.d.ts +36 -0
  619. package/dist/scanners/store/signal-store.d.ts.map +1 -0
  620. package/dist/scanners/store/signal-store.js +135 -0
  621. package/dist/scanners/store/signal-store.js.map +1 -0
  622. package/dist/scanners/types.d.ts +115 -0
  623. package/dist/scanners/types.d.ts.map +1 -0
  624. package/dist/scanners/types.js +3 -0
  625. package/dist/scanners/types.js.map +1 -0
  626. package/dist/scripts/run-dsl-standalone-live.d.ts +48 -0
  627. package/dist/scripts/run-dsl-standalone-live.d.ts.map +1 -0
  628. package/dist/scripts/run-dsl-standalone-live.js +531 -0
  629. package/dist/scripts/run-dsl-standalone-live.js.map +1 -0
  630. package/dist/scripts/run-dsl-standalone-mock.d.ts +13 -0
  631. package/dist/scripts/run-dsl-standalone-mock.d.ts.map +1 -0
  632. package/dist/scripts/run-dsl-standalone-mock.js +264 -0
  633. package/dist/scripts/run-dsl-standalone-mock.js.map +1 -0
  634. package/dist/senpi/client.d.ts +99 -0
  635. package/dist/senpi/client.d.ts.map +1 -0
  636. package/dist/senpi/client.js +779 -0
  637. package/dist/senpi/client.js.map +1 -0
  638. package/dist/senpi/constants.d.ts +7 -0
  639. package/dist/senpi/constants.d.ts.map +1 -0
  640. package/dist/senpi/constants.js +7 -0
  641. package/dist/senpi/constants.js.map +1 -0
  642. package/dist/senpi/index.d.ts +3 -0
  643. package/dist/senpi/index.d.ts.map +1 -0
  644. package/dist/senpi/index.js +2 -0
  645. package/dist/senpi/index.js.map +1 -0
  646. package/dist/senpi/types.d.ts +162 -0
  647. package/dist/senpi/types.d.ts.map +1 -0
  648. package/dist/senpi/types.js +3 -0
  649. package/dist/senpi/types.js.map +1 -0
  650. package/dist/state/index.d.ts +3 -0
  651. package/dist/state/index.d.ts.map +1 -0
  652. package/dist/state/index.js +3 -0
  653. package/dist/state/index.js.map +1 -0
  654. package/dist/state/paths.d.ts +18 -0
  655. package/dist/state/paths.d.ts.map +1 -0
  656. package/dist/state/paths.js +51 -0
  657. package/dist/state/paths.js.map +1 -0
  658. package/dist/state/state-manager.d.ts +83 -0
  659. package/dist/state/state-manager.d.ts.map +1 -0
  660. package/dist/state/state-manager.js +380 -0
  661. package/dist/state/state-manager.js.map +1 -0
  662. package/dist/strategy/index.d.ts +2 -0
  663. package/dist/strategy/index.d.ts.map +1 -0
  664. package/dist/strategy/index.js +2 -0
  665. package/dist/strategy/index.js.map +1 -0
  666. package/dist/strategy/strategy-state.d.ts +51 -0
  667. package/dist/strategy/strategy-state.d.ts.map +1 -0
  668. package/dist/strategy/strategy-state.js +218 -0
  669. package/dist/strategy/strategy-state.js.map +1 -0
  670. package/dist/types/action.d.ts +15 -0
  671. package/dist/types/action.d.ts.map +1 -0
  672. package/dist/types/action.js +2 -0
  673. package/dist/types/action.js.map +1 -0
  674. package/dist/types/dsl/index.d.ts +286 -0
  675. package/dist/types/dsl/index.d.ts.map +1 -0
  676. package/dist/types/dsl/index.js +5 -0
  677. package/dist/types/dsl/index.js.map +1 -0
  678. package/dist/types/event-bus.d.ts +13 -0
  679. package/dist/types/event-bus.d.ts.map +1 -0
  680. package/dist/types/event-bus.js +6 -0
  681. package/dist/types/event-bus.js.map +1 -0
  682. package/dist/types/hooks.d.ts +30 -0
  683. package/dist/types/hooks.d.ts.map +1 -0
  684. package/dist/types/hooks.js +18 -0
  685. package/dist/types/hooks.js.map +1 -0
  686. package/dist/types/index.d.ts +6 -0
  687. package/dist/types/index.d.ts.map +1 -0
  688. package/dist/types/index.js +6 -0
  689. package/dist/types/index.js.map +1 -0
  690. package/dist/types/notification.d.ts +4 -0
  691. package/dist/types/notification.d.ts.map +1 -0
  692. package/dist/types/notification.js +3 -0
  693. package/dist/types/notification.js.map +1 -0
  694. package/dist/types/runtime.d.ts +18 -0
  695. package/dist/types/runtime.d.ts.map +1 -0
  696. package/dist/types/runtime.js +2 -0
  697. package/dist/types/runtime.js.map +1 -0
  698. package/dist/types/scanner.d.ts +59 -0
  699. package/dist/types/scanner.d.ts.map +1 -0
  700. package/dist/types/scanner.js +13 -0
  701. package/dist/types/scanner.js.map +1 -0
  702. package/dist/types/strategy.d.ts +106 -0
  703. package/dist/types/strategy.d.ts.map +1 -0
  704. package/dist/types/strategy.js +2 -0
  705. package/dist/types/strategy.js.map +1 -0
  706. package/dist/utils/clearing-house-staleness.d.ts +47 -0
  707. package/dist/utils/clearing-house-staleness.d.ts.map +1 -0
  708. package/dist/utils/clearing-house-staleness.js +73 -0
  709. package/dist/utils/clearing-house-staleness.js.map +1 -0
  710. package/dist/utils/logger/dsl.d.ts +8 -0
  711. package/dist/utils/logger/dsl.d.ts.map +1 -0
  712. package/dist/utils/logger/dsl.js +7 -0
  713. package/dist/utils/logger/dsl.js.map +1 -0
  714. package/dist/utils/logger.d.ts +23 -0
  715. package/dist/utils/logger.d.ts.map +1 -0
  716. package/dist/utils/logger.js +97 -0
  717. package/dist/utils/logger.js.map +1 -0
  718. package/dist/utils/perp-coin.d.ts +19 -0
  719. package/dist/utils/perp-coin.d.ts.map +1 -0
  720. package/dist/utils/perp-coin.js +40 -0
  721. package/dist/utils/perp-coin.js.map +1 -0
  722. package/dist/utils/response.d.ts +14 -0
  723. package/dist/utils/response.d.ts.map +1 -0
  724. package/dist/utils/response.js +44 -0
  725. package/dist/utils/response.js.map +1 -0
  726. package/dist/utils/retry.d.ts +19 -0
  727. package/dist/utils/retry.d.ts.map +1 -0
  728. package/dist/utils/retry.js +32 -0
  729. package/dist/utils/retry.js.map +1 -0
  730. package/dist/version.d.ts +6 -0
  731. package/dist/version.d.ts.map +1 -0
  732. package/dist/version.js +21 -0
  733. package/dist/version.js.map +1 -0
  734. package/examples/.env.example +25 -0
  735. package/examples/README.md +89 -0
  736. package/examples/scanners-consumer-quickstart.mjs +134 -0
  737. package/examples/scanners-emerging-movers-v4.mjs +287 -0
  738. package/examples/scanners-liquidation-watchdog.mjs +341 -0
  739. package/examples/scanners-live-mcp.mjs +208 -0
  740. package/examples/scanners-multi-strategy.mjs +165 -0
  741. package/examples/scanners-position-tracker-e2e.mjs +225 -0
  742. package/examples/scanners-scheduled-events.mjs +96 -0
  743. package/examples/scanners-senpi-provider-client.mjs +182 -0
  744. package/examples/scanners-single-strategy.mjs +198 -0
  745. package/examples/strategies/README.md +45 -0
  746. package/examples/strategies/dsl-showcase.yaml +63 -0
  747. package/examples/strategies/dsl.yaml +47 -0
  748. package/examples/strategies/fox-minimal-loosened.yaml +225 -0
  749. package/examples/strategies/fox-minimal.yaml +220 -0
  750. package/examples/strategies/minimal.yaml +44 -0
  751. package/examples/strategies/viper.yaml +59 -0
  752. package/examples/strategies/wolf.yaml +64 -0
  753. package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +115 -0
  754. package/openclaw.plugin.json +67 -0
  755. package/package.json +53 -0
package/dist/index.js ADDED
@@ -0,0 +1,772 @@
1
+ /**
2
+ * Senpi core trading plugin — single plugin exposing all core features:
3
+ * actions, scanners, dsl, risk, health.
4
+ * Default export: OpenClaw plugin entry (register(api)).
5
+ * Named export run(): programmatic/standalone entry.
6
+ */
7
+ import { join } from "node:path";
8
+ import { SenpiClient } from "./senpi/client.js";
9
+ import { buildRuntimeStateDir, archiveStateDir } from "./runtime/state-layout.js";
10
+ import { registerSenpiCli } from "./cli/senpi-commands.js";
11
+ import { readSenpiCliStore, resolveSenpiApiKeyFromStore, resolveSenpiBaseStateDir, resolveTelegramChatIdFromStore, } from "./cli/senpi-cli-config.js";
12
+ import { getDefaultStateDir } from "./runtime/default-state-dir.js";
13
+ import { createNotificationService } from "./runtime/notifications.js";
14
+ import { run } from "./runtime/run.js";
15
+ import { AutoUpdateCoordinator } from "./runtime/auto-update/coordinator.js";
16
+ import { runCommand } from "./runtime/auto-update/command-runner.js";
17
+ import { resolveAutoUpdateConfig } from "./runtime/auto-update/types.js";
18
+ import { createScannerProvidersForRun } from "./runtime/create-scanner-providers-for-run.js";
19
+ import { initDsl } from "./dsl/index.js";
20
+ import { initHealth } from "./health/index.js";
21
+ import { initRisk } from "./risk/index.js";
22
+ import { VERSION } from "./version.js";
23
+ import { setErrorNotifier, } from "./utils/logger.js";
24
+ /** Initialize all core features (DSL, risk, health) on the given event bus. */
25
+ export function initCore(bus) {
26
+ initDsl(bus);
27
+ initRisk(bus);
28
+ initHealth(bus);
29
+ }
30
+ // DSL feature (exit/dsl component, types, config)
31
+ export { initDsl, DslPlugin, dslLogger, setDslLogLevel, parseDslPluginConfig, DslConfigValidationError, dslValidationIssue, EVENTS as DslEvents, DSL_EVENTS, } from "./dsl/index.js";
32
+ // Risk feature (placeholder)
33
+ export { initRisk } from "./risk/index.js";
34
+ // Health feature
35
+ export { createHealthStateModule, initHealth } from "./health/index.js";
36
+ // Shared types
37
+ export { HOOK_EVENT } from './types/index.js';
38
+ export { ScanStatus } from './types/index.js';
39
+ export { DecisionEngine, LlmDecisionStrategy, NoDecisionStrategy, } from './actions/decision-engine.js';
40
+ export { OpenClawLlmDecision, AnthropicLlmDecision, createLlmDecision } from './actions/llm-decision/index.js';
41
+ /** @deprecated Use OpenClawLlmDecision instead */
42
+ export { OpenClawLlmDecision as LlmDecisionClient } from './actions/llm-decision/index.js';
43
+ export { OpenPositionAction, openPositionFactory, openPositionManifest, } from './actions/open-position/open-position.action.js';
44
+ export { ClosePositionAction, closePositionFactory, closePositionManifest, } from './actions/close-position/close-position.action.js';
45
+ // Senpi client
46
+ export { SenpiClient } from './senpi/index.js';
47
+ // Scanner runtime module
48
+ export { createScannerRuntimeModule, createSenpiScannerProviders, emergingMoversScanner, momentumScanner, oiTrackerScanner, providerInput, prescreenerScanner, PersistencePolicy, RetentionPolicy, ScanStatus as ScannerScanStatus, SkipScan, } from './scanners/index.js';
49
+ // Runtime loader — programmatic API and OpenClaw plugin entry
50
+ export { run } from "./runtime/run.js";
51
+ export { loadRuntimeConfig } from "./runtime/load-runtime-config.js";
52
+ export { Runtime } from "./runtime/runtime.js";
53
+ function toSerializable(value, seen = new WeakSet()) {
54
+ if (value instanceof Error) {
55
+ return {
56
+ name: value.name,
57
+ message: value.message,
58
+ stack: value.stack,
59
+ cause: toSerializable(value.cause, seen),
60
+ };
61
+ }
62
+ if (typeof value === "bigint")
63
+ return value.toString();
64
+ if (value == null ||
65
+ typeof value === "string" ||
66
+ typeof value === "number" ||
67
+ typeof value === "boolean") {
68
+ return value;
69
+ }
70
+ if (Array.isArray(value))
71
+ return value.map((v) => toSerializable(v, seen));
72
+ if (typeof value === "object") {
73
+ const obj = value;
74
+ if (seen.has(obj))
75
+ return "[Circular]";
76
+ seen.add(obj);
77
+ const out = {};
78
+ for (const key of Object.keys(obj).sort()) {
79
+ out[key] = toSerializable(obj[key], seen);
80
+ }
81
+ seen.delete(obj);
82
+ return out;
83
+ }
84
+ return String(value);
85
+ }
86
+ function stringifyForTelegram(value) {
87
+ try {
88
+ return JSON.stringify(toSerializable(value), null, 2);
89
+ }
90
+ catch {
91
+ return String(value);
92
+ }
93
+ }
94
+ function trimTelegramMessage(message, maxLength = 3900) {
95
+ if (message.length <= maxLength)
96
+ return message;
97
+ const clipped = message.slice(0, maxLength);
98
+ return `${clipped}\n...[truncated ${message.length - maxLength} chars]`;
99
+ }
100
+ function formatSharedLoggerErrorNotification(payload) {
101
+ const lines = [
102
+ "Senpi error log",
103
+ "source: shared-logger",
104
+ `timestamp: ${payload.timestamp}`,
105
+ `namespace: ${payload.namespace}`,
106
+ `level: ${payload.level}`,
107
+ `message: ${payload.message}`,
108
+ ];
109
+ if (payload.meta !== undefined) {
110
+ lines.push(`meta:\n${stringifyForTelegram(payload.meta)}`);
111
+ }
112
+ return trimTelegramMessage(lines.join("\n"));
113
+ }
114
+ function formatApiLoggerErrorNotification(message, meta) {
115
+ const msg = typeof message === "string" ? message : stringifyForTelegram(message);
116
+ const lines = [
117
+ "Senpi error log",
118
+ "source: plugin-api-logger",
119
+ `timestamp: ${new Date().toISOString()}`,
120
+ `message: ${msg}`,
121
+ ];
122
+ if (meta !== undefined) {
123
+ lines.push(`meta:\n${stringifyForTelegram(meta)}`);
124
+ }
125
+ return trimTelegramMessage(lines.join("\n"));
126
+ }
127
+ function fireAndForgetErrorNotification(notifications, message) {
128
+ if (!notifications)
129
+ return;
130
+ try {
131
+ void notifications.notify(message).catch(() => { });
132
+ }
133
+ catch {
134
+ // Intentionally swallow; error notifications must never fail call sites.
135
+ }
136
+ }
137
+ /**
138
+ * OpenClaw plugin entry.
139
+ * Boots from internal registry (installed_runtimes.json) in stateDir; does not read runtime list from config.
140
+ */
141
+ const senpiRuntimePlugin = {
142
+ id: "@senpi-ai/runtime",
143
+ name: "Senpi Trading Runtime",
144
+ version: VERSION,
145
+ description: "Senpi trading runtime plugin for OpenClaw — orchestrates scanners, actions, and DSL exit engine",
146
+ configSchema: {
147
+ parse(value) {
148
+ if (value && typeof value === "object" && !Array.isArray(value)) {
149
+ return value;
150
+ }
151
+ return {};
152
+ },
153
+ },
154
+ register(api) {
155
+ const pluginLogger = {
156
+ info: (...args) => api.logger.info(...args),
157
+ warn: (...args) => api.logger.warn(...args),
158
+ error: (message, meta) => api.logger.error(message, meta),
159
+ };
160
+ pluginLogger.info("[senpi-runtime] register(api) invoked");
161
+ const config = api.pluginConfig;
162
+ if (!config) {
163
+ pluginLogger.warn("[senpi-runtime] No plugin config found — skipping registration");
164
+ return;
165
+ }
166
+ const senpiCliStore = readSenpiCliStore();
167
+ const baseStateDir = resolveSenpiBaseStateDir({
168
+ store: senpiCliStore,
169
+ configStateDir: typeof config.stateDir === "string" ? config.stateDir : undefined,
170
+ resolveOpenclawStateDir: typeof api.runtime?.state?.resolveStateDir === "function"
171
+ ? () => api.runtime.state.resolveStateDir()
172
+ : undefined,
173
+ getDefaultStateDir,
174
+ });
175
+ const mcpTransport = api.mcpTransport;
176
+ const apiKey = resolveSenpiApiKeyFromStore(senpiCliStore, typeof config.apiKey === "string" && config.apiKey.length > 0 ? config.apiKey : undefined);
177
+ if (!mcpTransport && !apiKey) {
178
+ pluginLogger.error("[senpi-runtime] mcpTransport or apiKey is required (provide via gateway, api, or config)");
179
+ return;
180
+ }
181
+ const runtimeHandles = new Map();
182
+ const lifecycleChatId = resolveTelegramChatIdFromStore(senpiCliStore);
183
+ const lifecycleNotifications = lifecycleChatId
184
+ ? createNotificationService({
185
+ telegram_chat_id: lifecycleChatId,
186
+ gateway_url: process.env.OPENCLAW_GATEWAY_URL || "http://127.0.0.1:18789",
187
+ gateway_token: process.env.OPENCLAW_GATEWAY_TOKEN,
188
+ })
189
+ : undefined;
190
+ setErrorNotifier(lifecycleNotifications
191
+ ? (payload) => {
192
+ fireAndForgetErrorNotification(lifecycleNotifications, formatSharedLoggerErrorNotification(payload));
193
+ }
194
+ : null);
195
+ pluginLogger.error = (message, meta) => {
196
+ api.logger.error(message, meta);
197
+ fireAndForgetErrorNotification(lifecycleNotifications, formatApiLoggerErrorNotification(message, meta));
198
+ };
199
+ const autoUpdateConfig = resolveAutoUpdateConfig(config?.autoUpdate);
200
+ const autoUpdateCoordinator = new AutoUpdateCoordinator({
201
+ enabled: true,
202
+ config: autoUpdateConfig,
203
+ packageName: "@senpi-ai/runtime",
204
+ currentVersion: VERSION,
205
+ stateDir: join(baseStateDir, "auto-update"),
206
+ logger: pluginLogger,
207
+ notify: lifecycleNotifications
208
+ ? (msg) => lifecycleNotifications.notify(msg)
209
+ : async () => { },
210
+ stopRuntimesForUpdate: async () => {
211
+ for (const [, handle] of runtimeHandles) {
212
+ await handle.stop();
213
+ }
214
+ },
215
+ runUpdateCommand: async () => {
216
+ const result = await runCommand("sh", ["-lc", "yes | openclaw plugins update runtime"], {
217
+ timeoutMs: 120_000,
218
+ });
219
+ if (result.code !== 0) {
220
+ throw new Error(result.stderr || `openclaw plugins update failed with code ${result.code}`);
221
+ }
222
+ },
223
+ configFromApi: api.config,
224
+ loadConfig: api.runtime?.config
225
+ ? () => api.runtime.config.loadConfig()
226
+ : undefined,
227
+ writeConfigFile: api.runtime?.config
228
+ ? (c) => api.runtime.config.writeConfigFile(c)
229
+ : undefined,
230
+ pluginId: api.id,
231
+ });
232
+ api.registerService({
233
+ id: "senpi-runtime",
234
+ async start() {
235
+ await autoUpdateCoordinator.start();
236
+ const { readRegistry } = await import("./runtime/strategy-registry.js");
237
+ const registry = await readRegistry(baseStateDir);
238
+ const scannerProviders = await createScannerProvidersForRun({
239
+ mcpTransport,
240
+ apiKey,
241
+ });
242
+ const started = [];
243
+ try {
244
+ for (const entry of registry.runtimes) {
245
+ const hasPath = typeof entry.runtimeYamlPath === "string" && entry.runtimeYamlPath.length > 0;
246
+ const hasContent = typeof entry.runtimeYamlContent === "string";
247
+ if (hasPath && hasContent)
248
+ continue;
249
+ if (!hasPath && !hasContent)
250
+ continue;
251
+ const pathOrContent = entry.runtimeYamlPath ?? entry.runtimeYamlContent;
252
+ const entryStateDir = buildRuntimeStateDir(baseStateDir, entry.id, entry.wallet ?? "");
253
+ const handle = await run(pathOrContent, {
254
+ fromPath: hasPath,
255
+ stateDir: entryStateDir,
256
+ mcpTransport,
257
+ apiKey,
258
+ scannerProviders,
259
+ });
260
+ runtimeHandles.set(entry.id, handle);
261
+ started.push(entry.id);
262
+ }
263
+ }
264
+ catch (err) {
265
+ for (let i = started.length - 1; i >= 0; i--) {
266
+ const h = runtimeHandles.get(started[i]);
267
+ if (h)
268
+ await h.stop().catch(() => { });
269
+ runtimeHandles.delete(started[i]);
270
+ }
271
+ throw err;
272
+ }
273
+ pluginLogger.info(`[senpi-runtime] Started ${started.length} runtime${started.length === 1 ? "" : "s"}`);
274
+ if (lifecycleNotifications) {
275
+ const n = started.length;
276
+ lifecycleNotifications
277
+ .notify(`Senpi started. ${n} runtime${n === 1 ? "" : "s"} running.`)
278
+ .catch(() => { });
279
+ }
280
+ else if (started.length > 0) {
281
+ pluginLogger.info("[senpi-runtime] Lifecycle notification skipped (set telegram-chat-id via `openclaw senpi config set-chat-id` or TELEGRAM_CHAT_ID / SENPI_LIFECYCLE_TELEGRAM_CHAT_ID)");
282
+ }
283
+ },
284
+ async stop() {
285
+ if (lifecycleNotifications) {
286
+ lifecycleNotifications.notify("Senpi shutting down.").catch(() => { });
287
+ }
288
+ // Stop the coordinator first so it cannot schedule a new tick or call
289
+ // stopRuntimesForUpdate() while we are tearing down the handles below.
290
+ await autoUpdateCoordinator.stop();
291
+ const ids = Array.from(runtimeHandles.keys());
292
+ for (let i = ids.length - 1; i >= 0; i--) {
293
+ const h = runtimeHandles.get(ids[i]);
294
+ if (h)
295
+ await h.stop();
296
+ runtimeHandles.delete(ids[i]);
297
+ }
298
+ pluginLogger.info("[senpi-runtime] All runtimes stopped");
299
+ },
300
+ });
301
+ pluginLogger.info("[senpi-runtime] calling api.registerCli(..., { commands: ['senpi'] })");
302
+ api.registerCli((ctx) => {
303
+ pluginLogger.info("[senpi-runtime] CLI registrar callback invoked — attaching senpi subcommands to program");
304
+ registerSenpiCli(ctx.program);
305
+ }, { commands: ["senpi"] });
306
+ /** Gateway respond accepts (ok, payload?, error?) with error as { code, message }; plugin SDK types may omit the third arg. */
307
+ api.registerGatewayMethod("senpi.installRuntime", async (ctx) => {
308
+ const { params } = ctx;
309
+ const respond = ctx.respond;
310
+ const toError = (message) => ({ code: "INVALID_REQUEST", message });
311
+ const toUnavailable = (message) => ({ code: "UNAVAILABLE", message });
312
+ const { readRegistry, writeRegistry, validateEntry, hasId, deriveRuntimeId, sanitizeId } = await import("./runtime/strategy-registry.js");
313
+ const id = typeof params?.id === "string" ? params.id : undefined;
314
+ const runtimeYamlPath = typeof params?.runtimeYamlPath === "string" ? params.runtimeYamlPath : undefined;
315
+ const runtimeYamlContent = typeof params?.runtimeYamlContent === "string" ? params.runtimeYamlContent : undefined;
316
+ const hasPath = runtimeYamlPath !== undefined && runtimeYamlPath.length > 0;
317
+ const hasContent = runtimeYamlContent !== undefined;
318
+ if (!hasPath && !hasContent) {
319
+ respond(false, undefined, toError("Please provide your runtime YAML: use the create command with --path <file> or --content \"<yaml text>\"."));
320
+ return;
321
+ }
322
+ if (hasPath && hasContent) {
323
+ respond(false, undefined, toError("Please provide either a file path (--path) or YAML content (--content), not both."));
324
+ return;
325
+ }
326
+ const pathOrContent = runtimeYamlPath ?? runtimeYamlContent;
327
+ // Parse YAML first to extract name, version, and wallet for ID derivation.
328
+ let parsedSchemaVersion;
329
+ let runtimeName = "";
330
+ let wallet = "";
331
+ try {
332
+ const { loadRuntimeConfig } = await import("./runtime/load-runtime-config.js");
333
+ const { extractMajorVersion } = await import("./runtime/runtime-version.js");
334
+ const parsedConfig = await loadRuntimeConfig(pathOrContent, { fromPath: hasPath });
335
+ parsedSchemaVersion = extractMajorVersion(parsedConfig.version);
336
+ runtimeName = parsedConfig.name;
337
+ wallet = parsedConfig.strategy?.wallet ?? "";
338
+ }
339
+ catch (err) {
340
+ const msg = err instanceof Error ? err.message : String(err);
341
+ respond(false, undefined, toUnavailable(`Could not start the runtime. This is usually due to invalid or incomplete YAML.\n\n${msg}`));
342
+ return;
343
+ }
344
+ const registry = await readRegistry(baseStateDir);
345
+ const resolvedId = id && id.length > 0
346
+ ? (sanitizeId(id) || "runtime")
347
+ : deriveRuntimeId(runtimeName, wallet);
348
+ if (hasId(registry, resolvedId)) {
349
+ respond(false, undefined, toError(`A runtime with id "${resolvedId}" already exists. Use a different id (e.g. --runtime-id another-name) or remove the existing one first: openclaw senpi runtime delete ${resolvedId}`));
350
+ return;
351
+ }
352
+ // Enforce one running runtime per wallet address
353
+ if (wallet) {
354
+ for (const [existingId, existingHandle] of runtimeHandles) {
355
+ if (existingHandle.wallet === wallet) {
356
+ respond(false, undefined, toError(`A runtime for wallet "${wallet}" is already running (runtime "${existingId}"). ` +
357
+ `Stop it first: openclaw senpi runtime delete --id ${existingId}`));
358
+ return;
359
+ }
360
+ }
361
+ }
362
+ // Best-effort wallet ownership validation: calls the MCP server to check
363
+ // whether the wallet belongs to the authenticated user's strategies.
364
+ // If the MCP call fails (network issue, bad apiKey, server down), we warn
365
+ // and allow the install to proceed rather than blocking the user.
366
+ if (wallet) {
367
+ try {
368
+ const client = mcpTransport
369
+ ? new SenpiClient(mcpTransport)
370
+ : new SenpiClient({ apiKey });
371
+ if (!mcpTransport)
372
+ await client.connect();
373
+ try {
374
+ const strategies = await client.listStrategies({ strategyAddresses: [wallet] });
375
+ const match = strategies.find((s) => s.strategyWalletAddress.toLowerCase() === wallet.toLowerCase());
376
+ if (!match) {
377
+ pluginLogger.info("[senpi-runtime] Wallet validation failed: not owned", { wallet });
378
+ respond(false, undefined, toError(`Strategy wallet "${wallet}" (YAML field: strategy.wallet) was not found in your Senpi account's strategies. ` +
379
+ `Check the address for typos. ` +
380
+ `To list all your strategies and their wallet addresses, call the MCP tool: strategy_list (no arguments needed). ` +
381
+ `Each result includes "strategyWalletAddress" — use that value as strategy.wallet in your YAML.`));
382
+ // `return` triggers the inner `finally` (disconnect) before exiting.
383
+ return;
384
+ }
385
+ if (match.status !== "ACTIVE") {
386
+ pluginLogger.info("[senpi-runtime] Wallet validation failed: strategy not active", { wallet, status: match.status, strategyId: match.id });
387
+ respond(false, undefined, toError((() => {
388
+ const initializingStatuses = new Set([
389
+ "SET_REFERRER_CODE", "SET_BUILDER_FEE", "SUBSCRIBE_TRADER",
390
+ "CREATE_WALLET", "FUND_WALLET", "INITIALIZE_POSITIONS",
391
+ ]);
392
+ const terminalStatuses = new Set([
393
+ "CLOSED", "FAILED", "CLOSING_POSITIONS", "CLOSE_STRATEGY",
394
+ "UNSUBSCRIBE_TRADER", "FUND_SOURCE_WALLET", "INACTIVE",
395
+ ]);
396
+ let hint;
397
+ if (initializingStatuses.has(match.status)) {
398
+ hint =
399
+ `The strategy is still initializing (${match.status}). ` +
400
+ `It will reach ACTIVE automatically — wait a few minutes, then retry. ` +
401
+ `Initialization order: CREATE_WALLET → FUND_WALLET → INITIALIZE_POSITIONS → ACTIVE.`;
402
+ }
403
+ else if (match.status === "PAUSED") {
404
+ hint =
405
+ `The strategy is paused and cannot be used to create a runtime — please create a new strategy instead.`;
406
+ }
407
+ else if (terminalStatuses.has(match.status)) {
408
+ hint =
409
+ `The strategy is closing or already closed (${match.status}). ` +
410
+ `A runtime cannot be created for a closed strategy — please create a new strategy instead.`;
411
+ }
412
+ else {
413
+ hint = `Only ACTIVE strategies can run a runtime.`;
414
+ }
415
+ return (`Strategy wallet "${wallet}" (YAML field: strategy.wallet) has status "${match.status}" — a runtime requires ACTIVE status. ` +
416
+ hint +
417
+ ` To check the latest status, call the MCP tool: strategy_list.`);
418
+ })()));
419
+ return;
420
+ }
421
+ pluginLogger.info("[senpi-runtime] Wallet validation passed", { wallet, strategyId: match.id, status: match.status });
422
+ }
423
+ finally {
424
+ if (!mcpTransport)
425
+ await client.disconnect().catch(() => { });
426
+ }
427
+ }
428
+ catch (err) {
429
+ // Soft-fail: validation is best-effort. If connect() or listStrategies()
430
+ // throws, log a warning and let the install proceed.
431
+ const msg = err instanceof Error ? err.message : String(err);
432
+ pluginLogger.warn("[senpi-runtime] Could not validate strategy wallet ownership", { wallet, err: msg });
433
+ }
434
+ }
435
+ const entry = hasPath
436
+ ? { id: resolvedId, runtimeYamlPath, schemaVersion: parsedSchemaVersion, wallet }
437
+ : { id: resolvedId, runtimeYamlContent: runtimeYamlContent, schemaVersion: parsedSchemaVersion, wallet };
438
+ const valid = validateEntry(entry);
439
+ if (!valid.ok) {
440
+ respond(false, undefined, toError(valid.error));
441
+ return;
442
+ }
443
+ registry.runtimes.push(entry);
444
+ await writeRegistry(baseStateDir, registry);
445
+ try {
446
+ const scannerProviders = await createScannerProvidersForRun({
447
+ mcpTransport,
448
+ apiKey,
449
+ });
450
+ const entryStateDir = buildRuntimeStateDir(baseStateDir, resolvedId, wallet);
451
+ const handle = await run(pathOrContent, {
452
+ fromPath: hasPath,
453
+ stateDir: entryStateDir,
454
+ mcpTransport,
455
+ apiKey,
456
+ scannerProviders,
457
+ });
458
+ runtimeHandles.set(resolvedId, handle);
459
+ respond(true, { id: resolvedId, name: runtimeName, wallet });
460
+ }
461
+ catch (err) {
462
+ const next = registry.runtimes.filter((e) => e.id !== resolvedId);
463
+ await writeRegistry(baseStateDir, { ...registry, runtimes: next });
464
+ const msg = err instanceof Error ? err.message : String(err);
465
+ respond(false, undefined, toUnavailable(`Could not start the runtime. This is usually due to invalid or incomplete YAML.\n\n${msg}`));
466
+ }
467
+ });
468
+ api.registerGatewayMethod("senpi.listRuntimes", async (ctx) => {
469
+ const respond = ctx.respond;
470
+ const { readRegistry } = await import("./runtime/strategy-registry.js");
471
+ const registry = await readRegistry(baseStateDir);
472
+ const runtimes = registry.runtimes.map((e) => ({
473
+ id: e.id,
474
+ wallet: e.wallet ?? "",
475
+ source: typeof e.runtimeYamlPath === "string" && e.runtimeYamlPath.length > 0 ? e.runtimeYamlPath : "(inline)",
476
+ status: runtimeHandles.has(e.id) ? "running" : "stopped",
477
+ }));
478
+ respond(true, { runtimes });
479
+ });
480
+ api.registerGatewayMethod("senpi.deleteRuntime", async (ctx) => {
481
+ const { params } = ctx;
482
+ const respond = ctx.respond;
483
+ const { readRegistry, writeRegistry } = await import("./runtime/strategy-registry.js");
484
+ const registry = await readRegistry(baseStateDir);
485
+ let targetId = typeof params?.id === "string" ? params.id : undefined;
486
+ const targetAddress = typeof params?.address === "string" ? params.address : undefined;
487
+ // Resolve target by address if id not provided
488
+ if (!targetId && targetAddress) {
489
+ const entry = registry.runtimes.find((e) => e.wallet === targetAddress);
490
+ if (!entry) {
491
+ respond(false, undefined, {
492
+ code: "NOT_FOUND",
493
+ message: `No runtime found for wallet address "${targetAddress}".`,
494
+ });
495
+ return;
496
+ }
497
+ targetId = entry.id;
498
+ }
499
+ if (!targetId) {
500
+ respond(false, undefined, {
501
+ code: "INVALID_REQUEST",
502
+ message: "Please provide the runtime id or wallet address. Example: openclaw senpi runtime delete --id my-runtime",
503
+ });
504
+ return;
505
+ }
506
+ const handle = runtimeHandles.get(targetId);
507
+ if (handle) {
508
+ await handle.teardownDslForRuntimeDeletion();
509
+ await handle.stop();
510
+ runtimeHandles.delete(targetId);
511
+ }
512
+ // Archive state directory before removing from registry
513
+ const deletedEntry = registry.runtimes.find((e) => e.id === targetId);
514
+ if (deletedEntry) {
515
+ const runtimeStateDir = buildRuntimeStateDir(baseStateDir, targetId, deletedEntry.wallet ?? "");
516
+ const archivesDir = join(baseStateDir, "archives");
517
+ try {
518
+ const archivePath = await archiveStateDir(runtimeStateDir, archivesDir, targetId, deletedEntry.wallet ?? "");
519
+ api.logger.info(`[senpi-runtime] Archived state to ${archivePath}`);
520
+ }
521
+ catch (err) {
522
+ api.logger.warn("[senpi-runtime] Failed to archive state dir", { err });
523
+ }
524
+ }
525
+ const next = registry.runtimes.filter((e) => e.id !== targetId);
526
+ await writeRegistry(baseStateDir, { ...registry, runtimes: next });
527
+ respond(true, { id: targetId });
528
+ });
529
+ api.registerGatewayMethod("senpi.listDslPositions", async (ctx) => {
530
+ const respond = ctx.respond;
531
+ const runtimeId = typeof ctx.params?.runtimeId === "string" ? ctx.params.runtimeId : undefined;
532
+ const address = typeof ctx.params?.address === "string" ? ctx.params.address : undefined;
533
+ pluginLogger.info("[senpi-runtime] senpi.listDslPositions", { runtimeId, address });
534
+ const positions = [];
535
+ for (const [id, handle] of runtimeHandles) {
536
+ if (runtimeId && id !== runtimeId)
537
+ continue;
538
+ if (!handle.dsl)
539
+ continue;
540
+ try {
541
+ const items = handle.dsl.listActivePositions();
542
+ for (const s of items) {
543
+ if (address && s.address !== address)
544
+ continue;
545
+ positions.push({ ...s, runtimeId: id });
546
+ }
547
+ }
548
+ catch (err) {
549
+ pluginLogger.warn("[senpi-runtime] listDslPositions error", { runtimeId: id, err });
550
+ }
551
+ }
552
+ respond(true, { positions });
553
+ });
554
+ api.registerGatewayMethod("senpi.getDslPositionState", async (ctx) => {
555
+ const respond = ctx.respond;
556
+ const asset = typeof ctx.params?.asset === "string" ? ctx.params.asset : undefined;
557
+ if (!asset) {
558
+ respond(false, undefined, { code: "INVALID_REQUEST", message: "asset is required" });
559
+ return;
560
+ }
561
+ const runtimeId = typeof ctx.params?.runtimeId === "string" ? ctx.params.runtimeId : undefined;
562
+ const address = typeof ctx.params?.address === "string" ? ctx.params.address : undefined;
563
+ pluginLogger.info("[senpi-runtime] senpi.getDslPositionState", { asset, runtimeId, address });
564
+ const matches = [];
565
+ for (const [id, handle] of runtimeHandles) {
566
+ if (runtimeId && id !== runtimeId)
567
+ continue;
568
+ if (!handle.dsl)
569
+ continue;
570
+ try {
571
+ if (address) {
572
+ const state = handle.dsl.getPositionState(address, asset);
573
+ if (state)
574
+ matches.push({ runtimeId: id, address, state });
575
+ }
576
+ else {
577
+ const found = handle.dsl.findPositionByAsset(asset);
578
+ if (found)
579
+ matches.push({ runtimeId: id, address: found.address, state: found.state });
580
+ }
581
+ }
582
+ catch (err) {
583
+ pluginLogger.warn("[senpi-runtime] getDslPositionState error", { runtimeId: id, err });
584
+ }
585
+ }
586
+ if (matches.length === 0) {
587
+ respond(false, undefined, {
588
+ code: "NOT_FOUND",
589
+ message: `No active DSL position found for asset ${asset}`,
590
+ });
591
+ return;
592
+ }
593
+ respond(true, { positions: matches });
594
+ });
595
+ api.registerGatewayMethod("senpi.listDslArchives", async (ctx) => {
596
+ const respond = ctx.respond;
597
+ const runtimeId = typeof ctx.params?.runtimeId === "string" ? ctx.params.runtimeId : undefined;
598
+ const address = typeof ctx.params?.address === "string" ? ctx.params.address : undefined;
599
+ const limit = typeof ctx.params?.limit === "number" ? ctx.params.limit : undefined;
600
+ pluginLogger.info("[senpi-runtime] senpi.listDslArchives", { runtimeId, address, limit });
601
+ let closes = [];
602
+ for (const [id, handle] of runtimeHandles) {
603
+ if (runtimeId && id !== runtimeId)
604
+ continue;
605
+ if (!handle.dsl)
606
+ continue;
607
+ try {
608
+ const items = await handle.dsl.listArchivedCloses({ address });
609
+ for (const c of items)
610
+ closes.push({ ...c, runtimeId: id });
611
+ }
612
+ catch (err) {
613
+ pluginLogger.warn("[senpi-runtime] listDslArchives error", { runtimeId: id, err });
614
+ }
615
+ }
616
+ closes.sort((a, b) => (b.closedAt ?? "").localeCompare(a.closedAt ?? ""));
617
+ if (limit && limit > 0)
618
+ closes = closes.slice(0, limit);
619
+ respond(true, { closes });
620
+ });
621
+ api.registerGatewayMethod("senpi.getHealthStatus", async (ctx) => {
622
+ const respond = ctx.respond;
623
+ const updater = autoUpdateCoordinator.getSnapshot();
624
+ const runtimeId = typeof ctx.params?.runtimeId === "string" ? ctx.params.runtimeId : undefined;
625
+ if (runtimeId) {
626
+ const handle = getRuntimeHandleOrRespond(runtimeHandles, runtimeId, respond);
627
+ if (!handle) {
628
+ return;
629
+ }
630
+ try {
631
+ const status = await handle.getHealthStatus();
632
+ respond(true, {
633
+ status: status ? { ...status, runtimeId } : null,
634
+ updater,
635
+ });
636
+ }
637
+ catch (err) {
638
+ api.logger.warn("[senpi-runtime] getHealthStatus error", { runtimeId, err });
639
+ respond(false, undefined, {
640
+ code: "INTERNAL_ERROR",
641
+ message: `Failed to get health status for runtime ${runtimeId}: ${formatGatewayError(err)}`,
642
+ });
643
+ }
644
+ return;
645
+ }
646
+ const statuses = await collectRuntimeHealthStatuses(runtimeHandles, api.logger);
647
+ respond(true, { statuses, updater });
648
+ });
649
+ api.registerGatewayMethod("senpi.getSystemState", async (ctx) => {
650
+ const respond = ctx.respond;
651
+ const updater = autoUpdateCoordinator.getSnapshot();
652
+ const runtimeId = typeof ctx.params?.runtimeId === "string" ? ctx.params.runtimeId : undefined;
653
+ if (runtimeId) {
654
+ const handle = getRuntimeHandleOrRespond(runtimeHandles, runtimeId, respond);
655
+ if (!handle) {
656
+ return;
657
+ }
658
+ try {
659
+ const state = await handle.getSystemState();
660
+ respond(true, {
661
+ state: state ? { ...state, runtimeId } : null,
662
+ updater,
663
+ });
664
+ }
665
+ catch (err) {
666
+ api.logger.warn("[senpi-runtime] getSystemState error", { runtimeId, err });
667
+ respond(false, undefined, {
668
+ code: "INTERNAL_ERROR",
669
+ message: `Failed to get system state for runtime ${runtimeId}: ${formatGatewayError(err)}`,
670
+ });
671
+ }
672
+ return;
673
+ }
674
+ const states = await collectRuntimeSystemStates(runtimeHandles, api.logger, baseStateDir);
675
+ respond(true, { states, updater });
676
+ });
677
+ api.logger.info(`[senpi-runtime] v${VERSION} plugin registered — stateDir: ${baseStateDir}`);
678
+ },
679
+ };
680
+ function getRuntimeHandleOrRespond(runtimeHandles, runtimeId, respond) {
681
+ const handle = runtimeHandles.get(runtimeId);
682
+ if (handle) {
683
+ return handle;
684
+ }
685
+ respond(false, undefined, {
686
+ code: "NOT_FOUND",
687
+ message: `No running runtime found for id ${runtimeId}`,
688
+ });
689
+ return null;
690
+ }
691
+ async function collectRuntimeHealthStatuses(runtimeHandles, logger) {
692
+ return (await Promise.all(Array.from(runtimeHandles, async ([runtimeId, handle]) => {
693
+ try {
694
+ const status = await handle.getHealthStatus();
695
+ return status ? { ...status, runtimeId } : null;
696
+ }
697
+ catch (err) {
698
+ logger.warn("[senpi-runtime] getHealthStatus error", { runtimeId, err });
699
+ return createGatewayHealthErrorStatus(runtimeId, err);
700
+ }
701
+ }))).filter((status) => status !== null);
702
+ }
703
+ async function collectRuntimeSystemStates(runtimeHandles, logger, baseStateDir) {
704
+ return (await Promise.all(Array.from(runtimeHandles, async ([runtimeId, handle]) => {
705
+ try {
706
+ const state = await handle.getSystemState();
707
+ return state ? { ...state, runtimeId } : null;
708
+ }
709
+ catch (err) {
710
+ logger.warn("[senpi-runtime] getSystemState error", { runtimeId, err });
711
+ return createGatewaySystemStateError(runtimeId, join(baseStateDir, runtimeId), err);
712
+ }
713
+ }))).filter((state) => state !== null);
714
+ }
715
+ function createGatewayHealthErrorStatus(runtimeId, error) {
716
+ const now = new Date().toISOString();
717
+ const message = formatGatewayError(error);
718
+ return {
719
+ runtimeId,
720
+ runtimeName: runtimeId,
721
+ startedAt: now,
722
+ generatedAt: now,
723
+ health: "unhealthy",
724
+ components: {
725
+ scanners: {
726
+ component: "scanners",
727
+ health: "unhealthy",
728
+ updatedAt: now,
729
+ summary: "Failed to query scanners health.",
730
+ error: message,
731
+ totals: {
732
+ registered: 0,
733
+ enabled: 0,
734
+ inFlight: 0,
735
+ degraded: 0,
736
+ unhealthy: 1,
737
+ },
738
+ scanners: [],
739
+ },
740
+ },
741
+ };
742
+ }
743
+ function createGatewaySystemStateError(runtimeId, stateDir, error) {
744
+ const now = new Date().toISOString();
745
+ const message = formatGatewayError(error);
746
+ return {
747
+ runtimeId,
748
+ runtimeName: runtimeId,
749
+ stateDir,
750
+ startedAt: now,
751
+ generatedAt: now,
752
+ health: "unhealthy",
753
+ components: {
754
+ scanners: {
755
+ component: "scanners",
756
+ health: "unhealthy",
757
+ updatedAt: now,
758
+ error: message,
759
+ state: {
760
+ totalRegistered: 0,
761
+ totalEnabled: 0,
762
+ scanners: [],
763
+ },
764
+ },
765
+ },
766
+ };
767
+ }
768
+ function formatGatewayError(error) {
769
+ return error instanceof Error ? error.message : String(error);
770
+ }
771
+ export default senpiRuntimePlugin;
772
+ //# sourceMappingURL=index.js.map