@363045841yyt/klinechart-core 0.8.11-alpha.0 → 0.8.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (578) hide show
  1. package/dist/alerts/createAlertController.d.ts +30 -0
  2. package/dist/alerts/createAlertController.d.ts.map +1 -0
  3. package/dist/alerts/createAlertController.js +261 -0
  4. package/dist/alerts/createAlertController.js.map +1 -0
  5. package/dist/alerts/index.d.ts +5 -0
  6. package/dist/alerts/index.d.ts.map +1 -0
  7. package/dist/alerts/index.js +4 -0
  8. package/dist/alerts/index.js.map +1 -0
  9. package/dist/alerts/predicates.d.ts +28 -0
  10. package/dist/alerts/predicates.d.ts.map +1 -0
  11. package/dist/alerts/predicates.js +211 -0
  12. package/dist/alerts/predicates.js.map +1 -0
  13. package/dist/alerts/rollingVolume.d.ts +15 -0
  14. package/dist/alerts/rollingVolume.d.ts.map +1 -0
  15. package/dist/alerts/rollingVolume.js +42 -0
  16. package/dist/alerts/rollingVolume.js.map +1 -0
  17. package/dist/alerts/ruleSchema.d.ts +42 -0
  18. package/dist/alerts/ruleSchema.d.ts.map +1 -0
  19. package/dist/alerts/ruleSchema.js +240 -0
  20. package/dist/alerts/ruleSchema.js.map +1 -0
  21. package/dist/alerts/types.d.ts +169 -0
  22. package/dist/alerts/types.d.ts.map +1 -0
  23. package/dist/alerts/types.js +24 -0
  24. package/dist/alerts/types.js.map +1 -0
  25. package/dist/chartTypes/heikinAshi.d.ts +49 -0
  26. package/dist/chartTypes/heikinAshi.d.ts.map +1 -0
  27. package/dist/chartTypes/heikinAshi.js +94 -0
  28. package/dist/chartTypes/heikinAshi.js.map +1 -0
  29. package/dist/chartTypes/index.d.ts +6 -0
  30. package/dist/chartTypes/index.d.ts.map +1 -0
  31. package/dist/chartTypes/index.js +5 -0
  32. package/dist/chartTypes/index.js.map +1 -0
  33. package/dist/chartTypes/pointAndFigure.d.ts +83 -0
  34. package/dist/chartTypes/pointAndFigure.d.ts.map +1 -0
  35. package/dist/chartTypes/pointAndFigure.js +159 -0
  36. package/dist/chartTypes/pointAndFigure.js.map +1 -0
  37. package/dist/chartTypes/rangeBars.d.ts +61 -0
  38. package/dist/chartTypes/rangeBars.d.ts.map +1 -0
  39. package/dist/chartTypes/rangeBars.js +181 -0
  40. package/dist/chartTypes/rangeBars.js.map +1 -0
  41. package/dist/chartTypes/renko.d.ts +94 -0
  42. package/dist/chartTypes/renko.d.ts.map +1 -0
  43. package/dist/chartTypes/renko.js +207 -0
  44. package/dist/chartTypes/renko.js.map +1 -0
  45. package/dist/chartTypes/types.d.ts +97 -0
  46. package/dist/chartTypes/types.d.ts.map +1 -0
  47. package/dist/chartTypes/types.js +39 -0
  48. package/dist/chartTypes/types.js.map +1 -0
  49. package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts +76 -0
  50. package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts.map +1 -0
  51. package/dist/components/anchoredVwap/computeAnchoredVwap.js +155 -0
  52. package/dist/components/anchoredVwap/computeAnchoredVwap.js.map +1 -0
  53. package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts +28 -0
  54. package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts.map +1 -0
  55. package/dist/components/anchoredVwap/createAnchoredVwapController.js +282 -0
  56. package/dist/components/anchoredVwap/createAnchoredVwapController.js.map +1 -0
  57. package/dist/components/anchoredVwap/index.d.ts +11 -0
  58. package/dist/components/anchoredVwap/index.d.ts.map +1 -0
  59. package/dist/components/anchoredVwap/index.js +10 -0
  60. package/dist/components/anchoredVwap/index.js.map +1 -0
  61. package/dist/components/anchoredVwap/types.d.ts +171 -0
  62. package/dist/components/anchoredVwap/types.d.ts.map +1 -0
  63. package/dist/components/anchoredVwap/types.js +25 -0
  64. package/dist/components/anchoredVwap/types.js.map +1 -0
  65. package/dist/components/crosshairSync/createCrosshairSync.d.ts +94 -0
  66. package/dist/components/crosshairSync/createCrosshairSync.d.ts.map +1 -0
  67. package/dist/components/crosshairSync/createCrosshairSync.js +118 -0
  68. package/dist/components/crosshairSync/createCrosshairSync.js.map +1 -0
  69. package/dist/components/crosshairSync/index.d.ts +2 -0
  70. package/dist/components/crosshairSync/index.d.ts.map +1 -0
  71. package/dist/components/crosshairSync/index.js +2 -0
  72. package/dist/components/crosshairSync/index.js.map +1 -0
  73. package/dist/components/footprint/aggressor.d.ts +89 -0
  74. package/dist/components/footprint/aggressor.d.ts.map +1 -0
  75. package/dist/components/footprint/aggressor.js +106 -0
  76. package/dist/components/footprint/aggressor.js.map +1 -0
  77. package/dist/components/footprint/createFootprintController.d.ts +29 -0
  78. package/dist/components/footprint/createFootprintController.d.ts.map +1 -0
  79. package/dist/components/footprint/createFootprintController.js +264 -0
  80. package/dist/components/footprint/createFootprintController.js.map +1 -0
  81. package/dist/components/footprint/index.d.ts +7 -0
  82. package/dist/components/footprint/index.d.ts.map +1 -0
  83. package/dist/components/footprint/index.js +4 -0
  84. package/dist/components/footprint/index.js.map +1 -0
  85. package/dist/components/footprint/perBarStats.d.ts +63 -0
  86. package/dist/components/footprint/perBarStats.d.ts.map +1 -0
  87. package/dist/components/footprint/perBarStats.js +123 -0
  88. package/dist/components/footprint/perBarStats.js.map +1 -0
  89. package/dist/components/footprint/types.d.ts +197 -0
  90. package/dist/components/footprint/types.d.ts.map +1 -0
  91. package/dist/components/footprint/types.js +23 -0
  92. package/dist/components/footprint/types.js.map +1 -0
  93. package/dist/components/mtfOverlay/alignToBaseIndex.d.ts +45 -0
  94. package/dist/components/mtfOverlay/alignToBaseIndex.d.ts.map +1 -0
  95. package/dist/components/mtfOverlay/alignToBaseIndex.js +92 -0
  96. package/dist/components/mtfOverlay/alignToBaseIndex.js.map +1 -0
  97. package/dist/components/mtfOverlay/createMtfController.d.ts +7 -0
  98. package/dist/components/mtfOverlay/createMtfController.d.ts.map +1 -0
  99. package/dist/components/mtfOverlay/createMtfController.js +134 -0
  100. package/dist/components/mtfOverlay/createMtfController.js.map +1 -0
  101. package/dist/components/mtfOverlay/index.d.ts +19 -0
  102. package/dist/components/mtfOverlay/index.d.ts.map +1 -0
  103. package/dist/components/mtfOverlay/index.js +18 -0
  104. package/dist/components/mtfOverlay/index.js.map +1 -0
  105. package/dist/components/mtfOverlay/resampleBars.d.ts +37 -0
  106. package/dist/components/mtfOverlay/resampleBars.d.ts.map +1 -0
  107. package/dist/components/mtfOverlay/resampleBars.js +93 -0
  108. package/dist/components/mtfOverlay/resampleBars.js.map +1 -0
  109. package/dist/components/mtfOverlay/types.d.ts +132 -0
  110. package/dist/components/mtfOverlay/types.d.ts.map +1 -0
  111. package/dist/components/mtfOverlay/types.js +22 -0
  112. package/dist/components/mtfOverlay/types.js.map +1 -0
  113. package/dist/components/orderBookHeatmap/createHeatmapController.d.ts +21 -0
  114. package/dist/components/orderBookHeatmap/createHeatmapController.d.ts.map +1 -0
  115. package/dist/components/orderBookHeatmap/createHeatmapController.js +234 -0
  116. package/dist/components/orderBookHeatmap/createHeatmapController.js.map +1 -0
  117. package/dist/components/orderBookHeatmap/createOrderBookState.d.ts +18 -0
  118. package/dist/components/orderBookHeatmap/createOrderBookState.d.ts.map +1 -0
  119. package/dist/components/orderBookHeatmap/createOrderBookState.js +102 -0
  120. package/dist/components/orderBookHeatmap/createOrderBookState.js.map +1 -0
  121. package/dist/components/orderBookHeatmap/deltaArchive.d.ts +25 -0
  122. package/dist/components/orderBookHeatmap/deltaArchive.d.ts.map +1 -0
  123. package/dist/components/orderBookHeatmap/deltaArchive.js +106 -0
  124. package/dist/components/orderBookHeatmap/deltaArchive.js.map +1 -0
  125. package/dist/components/orderBookHeatmap/index.d.ts +13 -0
  126. package/dist/components/orderBookHeatmap/index.d.ts.map +1 -0
  127. package/dist/components/orderBookHeatmap/index.js +12 -0
  128. package/dist/components/orderBookHeatmap/index.js.map +1 -0
  129. package/dist/components/orderBookHeatmap/logColorScale.d.ts +20 -0
  130. package/dist/components/orderBookHeatmap/logColorScale.d.ts.map +1 -0
  131. package/dist/components/orderBookHeatmap/logColorScale.js +71 -0
  132. package/dist/components/orderBookHeatmap/logColorScale.js.map +1 -0
  133. package/dist/components/orderBookHeatmap/snapshotRing.d.ts +16 -0
  134. package/dist/components/orderBookHeatmap/snapshotRing.d.ts.map +1 -0
  135. package/dist/components/orderBookHeatmap/snapshotRing.js +61 -0
  136. package/dist/components/orderBookHeatmap/snapshotRing.js.map +1 -0
  137. package/dist/components/orderBookHeatmap/types.d.ts +128 -0
  138. package/dist/components/orderBookHeatmap/types.d.ts.map +1 -0
  139. package/dist/components/orderBookHeatmap/types.js +16 -0
  140. package/dist/components/orderBookHeatmap/types.js.map +1 -0
  141. package/dist/components/volumeProfile/binning.d.ts +54 -0
  142. package/dist/components/volumeProfile/binning.d.ts.map +1 -0
  143. package/dist/components/volumeProfile/binning.js +123 -0
  144. package/dist/components/volumeProfile/binning.js.map +1 -0
  145. package/dist/components/volumeProfile/createVolumeProfileController.d.ts +31 -0
  146. package/dist/components/volumeProfile/createVolumeProfileController.d.ts.map +1 -0
  147. package/dist/components/volumeProfile/createVolumeProfileController.js +179 -0
  148. package/dist/components/volumeProfile/createVolumeProfileController.js.map +1 -0
  149. package/dist/components/volumeProfile/index.d.ts +6 -0
  150. package/dist/components/volumeProfile/index.d.ts.map +1 -0
  151. package/dist/components/volumeProfile/index.js +5 -0
  152. package/dist/components/volumeProfile/index.js.map +1 -0
  153. package/dist/components/volumeProfile/poc.d.ts +35 -0
  154. package/dist/components/volumeProfile/poc.d.ts.map +1 -0
  155. package/dist/components/volumeProfile/poc.js +51 -0
  156. package/dist/components/volumeProfile/poc.js.map +1 -0
  157. package/dist/components/volumeProfile/types.d.ts +138 -0
  158. package/dist/components/volumeProfile/types.d.ts.map +1 -0
  159. package/dist/components/volumeProfile/types.js +19 -0
  160. package/dist/components/volumeProfile/types.js.map +1 -0
  161. package/dist/components/volumeProfile/valueArea.d.ts +58 -0
  162. package/dist/components/volumeProfile/valueArea.d.ts.map +1 -0
  163. package/dist/components/volumeProfile/valueArea.js +172 -0
  164. package/dist/components/volumeProfile/valueArea.js.map +1 -0
  165. package/dist/controllers/createChartController.d.ts.map +1 -1
  166. package/dist/controllers/createChartController.js +22 -11
  167. package/dist/controllers/createChartController.js.map +1 -1
  168. package/dist/controllers/types.d.ts +3 -1
  169. package/dist/controllers/types.d.ts.map +1 -1
  170. package/dist/data-fetchers/baostock.d.ts.map +1 -1
  171. package/dist/data-fetchers/baostock.js +2 -1
  172. package/dist/data-fetchers/baostock.js.map +1 -1
  173. package/dist/data-fetchers/dataBuffer.effects.d.ts.map +1 -1
  174. package/dist/data-fetchers/dataBuffer.effects.js +2 -1
  175. package/dist/data-fetchers/dataBuffer.effects.js.map +1 -1
  176. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
  177. package/dist/data-fetchers/fetcherDefinitionRegistry.js +2 -1
  178. package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
  179. package/dist/data-fetchers/gotdx.js +4 -3
  180. package/dist/data-fetchers/gotdx.js.map +1 -1
  181. package/dist/data-fetchers/router.d.ts.map +1 -1
  182. package/dist/data-fetchers/router.js +4 -3
  183. package/dist/data-fetchers/router.js.map +1 -1
  184. package/dist/data-fetchers/tradingview.js +3 -2
  185. package/dist/data-fetchers/tradingview.js.map +1 -1
  186. package/dist/engine/chart.d.ts +13 -0
  187. package/dist/engine/chart.d.ts.map +1 -1
  188. package/dist/engine/chart.js +109 -0
  189. package/dist/engine/chart.js.map +1 -1
  190. package/dist/engine/data/chartDataManager.d.ts +1 -0
  191. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  192. package/dist/engine/data/chartDataManager.js +27 -4
  193. package/dist/engine/data/chartDataManager.js.map +1 -1
  194. package/dist/engine/drawing/toolConfig.d.ts.map +1 -1
  195. package/dist/engine/drawing/toolConfig.js +2 -1
  196. package/dist/engine/drawing/toolConfig.js.map +1 -1
  197. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  198. package/dist/engine/indicators/chartIndicatorManager.js +2 -1
  199. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  200. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
  201. package/dist/engine/indicators/indicatorDefinitionRegistry.js +2 -1
  202. package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
  203. package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
  204. package/dist/engine/indicators/indicatorMetadata.js +2 -1
  205. package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
  206. package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
  207. package/dist/engine/indicators/indicatorRegistry.js +6 -5
  208. package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
  209. package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
  210. package/dist/engine/indicators/registerBuiltins.js +2 -1
  211. package/dist/engine/indicators/registerBuiltins.js.map +1 -1
  212. package/dist/engine/indicators/scheduler.d.ts +6 -0
  213. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  214. package/dist/engine/indicators/scheduler.js +12 -0
  215. package/dist/engine/indicators/scheduler.js.map +1 -1
  216. package/dist/engine/indicators/soa.d.ts.map +1 -1
  217. package/dist/engine/indicators/soa.js +2 -1
  218. package/dist/engine/indicators/soa.js.map +1 -1
  219. package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
  220. package/dist/engine/indicators/stateComposer.js +2 -1
  221. package/dist/engine/indicators/stateComposer.js.map +1 -1
  222. package/dist/engine/subPaneManager.d.ts.map +1 -1
  223. package/dist/engine/subPaneManager.js +2 -1
  224. package/dist/engine/subPaneManager.js.map +1 -1
  225. package/dist/engine/utils/chartZoomController.d.ts +2 -0
  226. package/dist/engine/utils/chartZoomController.d.ts.map +1 -1
  227. package/dist/engine/utils/chartZoomController.js +5 -1
  228. package/dist/engine/utils/chartZoomController.js.map +1 -1
  229. package/dist/errors-help.d.ts +72 -0
  230. package/dist/errors-help.d.ts.map +1 -0
  231. package/dist/errors-help.js +149 -0
  232. package/dist/errors-help.js.map +1 -0
  233. package/dist/errors.d.ts +64 -0
  234. package/dist/errors.d.ts.map +1 -0
  235. package/dist/errors.js +61 -0
  236. package/dist/errors.js.map +1 -0
  237. package/dist/index.d.ts +18 -0
  238. package/dist/index.d.ts.map +1 -1
  239. package/dist/index.js +22 -0
  240. package/dist/index.js.map +1 -1
  241. package/dist/indicators/alma.d.ts +27 -0
  242. package/dist/indicators/alma.d.ts.map +1 -0
  243. package/dist/indicators/alma.js +36 -0
  244. package/dist/indicators/alma.js.map +1 -0
  245. package/dist/indicators/awesomeOscillator.d.ts +19 -0
  246. package/dist/indicators/awesomeOscillator.d.ts.map +1 -0
  247. package/dist/indicators/awesomeOscillator.js +36 -0
  248. package/dist/indicators/awesomeOscillator.js.map +1 -0
  249. package/dist/indicators/dpo.d.ts +17 -0
  250. package/dist/indicators/dpo.d.ts.map +1 -0
  251. package/dist/indicators/dpo.js +24 -0
  252. package/dist/indicators/dpo.js.map +1 -0
  253. package/dist/indicators/fisherTransform.d.ts +26 -0
  254. package/dist/indicators/fisherTransform.d.ts.map +1 -0
  255. package/dist/indicators/fisherTransform.js +44 -0
  256. package/dist/indicators/fisherTransform.js.map +1 -0
  257. package/dist/indicators/frama.d.ts +25 -0
  258. package/dist/indicators/frama.d.ts.map +1 -0
  259. package/dist/indicators/frama.js +61 -0
  260. package/dist/indicators/frama.js.map +1 -0
  261. package/dist/indicators/index.d.ts +24 -0
  262. package/dist/indicators/index.d.ts.map +1 -0
  263. package/dist/indicators/index.js +26 -0
  264. package/dist/indicators/index.js.map +1 -0
  265. package/dist/indicators/lsma.d.ts +21 -0
  266. package/dist/indicators/lsma.d.ts.map +1 -0
  267. package/dist/indicators/lsma.js +37 -0
  268. package/dist/indicators/lsma.js.map +1 -0
  269. package/dist/indicators/schaffTrendCycle.d.ts +24 -0
  270. package/dist/indicators/schaffTrendCycle.d.ts.map +1 -0
  271. package/dist/indicators/schaffTrendCycle.js +70 -0
  272. package/dist/indicators/schaffTrendCycle.js.map +1 -0
  273. package/dist/indicators/stochRSI.d.ts +24 -0
  274. package/dist/indicators/stochRSI.d.ts.map +1 -0
  275. package/dist/indicators/stochRSI.js +86 -0
  276. package/dist/indicators/stochRSI.js.map +1 -0
  277. package/dist/indicators/t3.d.ts +31 -0
  278. package/dist/indicators/t3.d.ts.map +1 -0
  279. package/dist/indicators/t3.js +63 -0
  280. package/dist/indicators/t3.js.map +1 -0
  281. package/dist/indicators/ultimateOscillator.d.ts +26 -0
  282. package/dist/indicators/ultimateOscillator.d.ts.map +1 -0
  283. package/dist/indicators/ultimateOscillator.js +59 -0
  284. package/dist/indicators/ultimateOscillator.js.map +1 -0
  285. package/dist/indicators/vidya.d.ts +24 -0
  286. package/dist/indicators/vidya.d.ts.map +1 -0
  287. package/dist/indicators/vidya.js +54 -0
  288. package/dist/indicators/vidya.js.map +1 -0
  289. package/dist/indicators/zlema.d.ts +16 -0
  290. package/dist/indicators/zlema.d.ts.map +1 -0
  291. package/dist/indicators/zlema.js +26 -0
  292. package/dist/indicators/zlema.js.map +1 -0
  293. package/dist/input/gesture.d.ts +125 -0
  294. package/dist/input/gesture.d.ts.map +1 -0
  295. package/dist/input/gesture.js +249 -0
  296. package/dist/input/gesture.js.map +1 -0
  297. package/dist/input/index.d.ts +9 -0
  298. package/dist/input/index.d.ts.map +1 -0
  299. package/dist/input/index.js +9 -0
  300. package/dist/input/index.js.map +1 -0
  301. package/dist/input/keyboard.d.ts +140 -0
  302. package/dist/input/keyboard.d.ts.map +1 -0
  303. package/dist/input/keyboard.js +260 -0
  304. package/dist/input/keyboard.js.map +1 -0
  305. package/dist/mcp/chartBridge.d.ts +2 -2
  306. package/dist/mcp/chartBridge.d.ts.map +1 -1
  307. package/dist/mcp/chartBridge.js +27 -21
  308. package/dist/mcp/chartBridge.js.map +1 -1
  309. package/dist/plugin/PluginHost.d.ts +0 -3
  310. package/dist/plugin/PluginHost.d.ts.map +1 -1
  311. package/dist/plugin/PluginHost.js +7 -3
  312. package/dist/plugin/PluginHost.js.map +1 -1
  313. package/dist/plugin/PluginRegistry.d.ts +0 -3
  314. package/dist/plugin/PluginRegistry.d.ts.map +1 -1
  315. package/dist/plugin/PluginRegistry.js +5 -1
  316. package/dist/plugin/PluginRegistry.js.map +1 -1
  317. package/dist/render/Renderer.d.ts +116 -0
  318. package/dist/render/Renderer.d.ts.map +1 -0
  319. package/dist/render/Renderer.js +31 -0
  320. package/dist/render/Renderer.js.map +1 -0
  321. package/dist/render/SurfaceBackend.d.ts +83 -0
  322. package/dist/render/SurfaceBackend.d.ts.map +1 -0
  323. package/dist/render/SurfaceBackend.js +27 -0
  324. package/dist/render/SurfaceBackend.js.map +1 -0
  325. package/dist/render/index.d.ts +12 -0
  326. package/dist/render/index.d.ts.map +1 -0
  327. package/dist/render/index.js +11 -0
  328. package/dist/render/index.js.map +1 -0
  329. package/dist/renderer-tier/detectRendererTier.d.ts +57 -0
  330. package/dist/renderer-tier/detectRendererTier.d.ts.map +1 -0
  331. package/dist/renderer-tier/detectRendererTier.js +143 -0
  332. package/dist/renderer-tier/detectRendererTier.js.map +1 -0
  333. package/dist/renderer-tier/index.d.ts +12 -0
  334. package/dist/renderer-tier/index.d.ts.map +1 -0
  335. package/dist/renderer-tier/index.js +12 -0
  336. package/dist/renderer-tier/index.js.map +1 -0
  337. package/dist/renderer-tier/selectBackend.d.ts +106 -0
  338. package/dist/renderer-tier/selectBackend.d.ts.map +1 -0
  339. package/dist/renderer-tier/selectBackend.js +113 -0
  340. package/dist/renderer-tier/selectBackend.js.map +1 -0
  341. package/dist/renderer-tier/types.d.ts +50 -0
  342. package/dist/renderer-tier/types.d.ts.map +1 -0
  343. package/dist/renderer-tier/types.js +24 -0
  344. package/dist/renderer-tier/types.js.map +1 -0
  345. package/dist/replay/createReplayController.d.ts +3 -0
  346. package/dist/replay/createReplayController.d.ts.map +1 -0
  347. package/dist/replay/createReplayController.js +251 -0
  348. package/dist/replay/createReplayController.js.map +1 -0
  349. package/dist/replay/index.d.ts +5 -0
  350. package/dist/replay/index.d.ts.map +1 -0
  351. package/dist/replay/index.js +3 -0
  352. package/dist/replay/index.js.map +1 -0
  353. package/dist/replay/timeline.d.ts +50 -0
  354. package/dist/replay/timeline.d.ts.map +1 -0
  355. package/dist/replay/timeline.js +104 -0
  356. package/dist/replay/timeline.js.map +1 -0
  357. package/dist/replay/types.d.ts +94 -0
  358. package/dist/replay/types.d.ts.map +1 -0
  359. package/dist/replay/types.js +21 -0
  360. package/dist/replay/types.js.map +1 -0
  361. package/dist/scale/anchoredZoom.d.ts +64 -0
  362. package/dist/scale/anchoredZoom.d.ts.map +1 -0
  363. package/dist/scale/anchoredZoom.js +67 -0
  364. package/dist/scale/anchoredZoom.js.map +1 -0
  365. package/dist/scale/createPriceScale.d.ts +49 -0
  366. package/dist/scale/createPriceScale.d.ts.map +1 -0
  367. package/dist/scale/createPriceScale.js +175 -0
  368. package/dist/scale/createPriceScale.js.map +1 -0
  369. package/dist/scale/createTimeScale.d.ts +27 -0
  370. package/dist/scale/createTimeScale.d.ts.map +1 -0
  371. package/dist/scale/createTimeScale.js +139 -0
  372. package/dist/scale/createTimeScale.js.map +1 -0
  373. package/dist/scale/index.d.ts +6 -0
  374. package/dist/scale/index.d.ts.map +1 -0
  375. package/dist/scale/index.js +5 -0
  376. package/dist/scale/index.js.map +1 -0
  377. package/dist/scale/originShift.d.ts +69 -0
  378. package/dist/scale/originShift.d.ts.map +1 -0
  379. package/dist/scale/originShift.js +41 -0
  380. package/dist/scale/originShift.js.map +1 -0
  381. package/dist/scale/types.d.ts +90 -0
  382. package/dist/scale/types.d.ts.map +1 -0
  383. package/dist/scale/types.js +17 -0
  384. package/dist/scale/types.js.map +1 -0
  385. package/dist/scene/createScene.d.ts +22 -0
  386. package/dist/scene/createScene.d.ts.map +1 -0
  387. package/dist/scene/createScene.js +114 -0
  388. package/dist/scene/createScene.js.map +1 -0
  389. package/dist/scene/index.d.ts +13 -0
  390. package/dist/scene/index.d.ts.map +1 -0
  391. package/dist/scene/index.js +11 -0
  392. package/dist/scene/index.js.map +1 -0
  393. package/dist/scene/layerRegistry.d.ts +83 -0
  394. package/dist/scene/layerRegistry.d.ts.map +1 -0
  395. package/dist/scene/layerRegistry.js +43 -0
  396. package/dist/scene/layerRegistry.js.map +1 -0
  397. package/dist/scene/types.d.ts +128 -0
  398. package/dist/scene/types.d.ts.map +1 -0
  399. package/dist/scene/types.js +21 -0
  400. package/dist/scene/types.js.map +1 -0
  401. package/dist/scheduler/createFrameBudget.d.ts +91 -0
  402. package/dist/scheduler/createFrameBudget.d.ts.map +1 -0
  403. package/dist/scheduler/createFrameBudget.js +232 -0
  404. package/dist/scheduler/createFrameBudget.js.map +1 -0
  405. package/dist/scheduler/index.d.ts +2 -0
  406. package/dist/scheduler/index.d.ts.map +1 -0
  407. package/dist/scheduler/index.js +2 -0
  408. package/dist/scheduler/index.js.map +1 -0
  409. package/dist/tokens/themeToCssVars.d.ts.map +1 -1
  410. package/dist/tokens/themeToCssVars.js +2 -28
  411. package/dist/tokens/themeToCssVars.js.map +1 -1
  412. package/dist/version.d.ts +1 -1
  413. package/dist/version.d.ts.map +1 -1
  414. package/dist/version.js +1 -1
  415. package/dist/version.js.map +1 -1
  416. package/package.json +1 -1
  417. package/src/__bench__/indicators.bench.ts +215 -0
  418. package/src/__bench__/orderBookHeatmap.bench.ts +68 -0
  419. package/src/__bench__/scale.bench.ts +80 -0
  420. package/src/__bench__/signal.bench.ts +41 -0
  421. package/src/__bench__/volumeProfile.bench.ts +66 -0
  422. package/src/__tests__/errors-help.test.ts +184 -0
  423. package/src/__tests__/errors.test.ts +187 -0
  424. package/src/alerts/__tests__/controller.test.ts +231 -0
  425. package/src/alerts/__tests__/predicates.test.ts +374 -0
  426. package/src/alerts/__tests__/ruleSchema.test.ts +180 -0
  427. package/src/alerts/createAlertController.ts +312 -0
  428. package/src/alerts/index.ts +18 -0
  429. package/src/alerts/predicates.ts +231 -0
  430. package/src/alerts/rollingVolume.ts +51 -0
  431. package/src/alerts/ruleSchema.ts +278 -0
  432. package/src/alerts/types.ts +177 -0
  433. package/src/chartTypes/__tests__/heikinAshi.test.ts +122 -0
  434. package/src/chartTypes/__tests__/pointAndFigure.test.ts +167 -0
  435. package/src/chartTypes/__tests__/rangeBars.test.ts +146 -0
  436. package/src/chartTypes/__tests__/renko.test.ts +160 -0
  437. package/src/chartTypes/heikinAshi.ts +116 -0
  438. package/src/chartTypes/index.ts +5 -0
  439. package/src/chartTypes/pointAndFigure.ts +278 -0
  440. package/src/chartTypes/rangeBars.ts +303 -0
  441. package/src/chartTypes/renko.ts +311 -0
  442. package/src/chartTypes/types.ts +99 -0
  443. package/src/components/anchoredVwap/__tests__/computeAnchoredVwap.test.ts +331 -0
  444. package/src/components/anchoredVwap/__tests__/controller.test.ts +430 -0
  445. package/src/components/anchoredVwap/computeAnchoredVwap.ts +174 -0
  446. package/src/components/anchoredVwap/createAnchoredVwapController.ts +358 -0
  447. package/src/components/anchoredVwap/index.ts +17 -0
  448. package/src/components/anchoredVwap/types.ts +187 -0
  449. package/src/components/crosshairSync/__tests__/crosshairSync.test.ts +261 -0
  450. package/src/components/crosshairSync/createCrosshairSync.ts +187 -0
  451. package/src/components/crosshairSync/index.ts +5 -0
  452. package/src/components/footprint/__tests__/aggressor.test.ts +127 -0
  453. package/src/components/footprint/__tests__/controller.test.ts +130 -0
  454. package/src/components/footprint/__tests__/perBarStats.test.ts +114 -0
  455. package/src/components/footprint/aggressor.ts +165 -0
  456. package/src/components/footprint/createFootprintController.ts +338 -0
  457. package/src/components/footprint/index.ts +21 -0
  458. package/src/components/footprint/perBarStats.ts +137 -0
  459. package/src/components/footprint/types.ts +232 -0
  460. package/src/components/mtfOverlay/__tests__/alignToBaseIndex.test.ts +103 -0
  461. package/src/components/mtfOverlay/__tests__/controller.test.ts +172 -0
  462. package/src/components/mtfOverlay/__tests__/resampleBars.test.ts +106 -0
  463. package/src/components/mtfOverlay/alignToBaseIndex.ts +108 -0
  464. package/src/components/mtfOverlay/createMtfController.ts +180 -0
  465. package/src/components/mtfOverlay/index.ts +26 -0
  466. package/src/components/mtfOverlay/resampleBars.ts +134 -0
  467. package/src/components/mtfOverlay/types.ts +148 -0
  468. package/src/components/orderBookHeatmap/__tests__/controller.test.ts +237 -0
  469. package/src/components/orderBookHeatmap/__tests__/deltaArchive.test.ts +88 -0
  470. package/src/components/orderBookHeatmap/__tests__/logColorScale.test.ts +69 -0
  471. package/src/components/orderBookHeatmap/__tests__/orderBookState.test.ts +113 -0
  472. package/src/components/orderBookHeatmap/__tests__/snapshotRing.test.ts +53 -0
  473. package/src/components/orderBookHeatmap/computeShader.wgsl.md +130 -0
  474. package/src/components/orderBookHeatmap/createHeatmapController.ts +273 -0
  475. package/src/components/orderBookHeatmap/createOrderBookState.ts +116 -0
  476. package/src/components/orderBookHeatmap/deltaArchive.ts +113 -0
  477. package/src/components/orderBookHeatmap/index.ts +25 -0
  478. package/src/components/orderBookHeatmap/logColorScale.ts +77 -0
  479. package/src/components/orderBookHeatmap/snapshotRing.ts +65 -0
  480. package/src/components/orderBookHeatmap/types.ts +168 -0
  481. package/src/components/volumeProfile/__tests__/binning.test.ts +133 -0
  482. package/src/components/volumeProfile/__tests__/poc.test.ts +44 -0
  483. package/src/components/volumeProfile/__tests__/valueArea.test.ts +177 -0
  484. package/src/components/volumeProfile/binning.ts +133 -0
  485. package/src/components/volumeProfile/createVolumeProfileController.ts +213 -0
  486. package/src/components/volumeProfile/index.ts +12 -0
  487. package/src/components/volumeProfile/poc.ts +53 -0
  488. package/src/components/volumeProfile/types.ts +148 -0
  489. package/src/components/volumeProfile/valueArea.ts +187 -0
  490. package/src/controllers/createChartController.ts +23 -10
  491. package/src/controllers/types.ts +5 -1
  492. package/src/data-fetchers/baostock.ts +2 -1
  493. package/src/data-fetchers/dataBuffer.effects.ts +3 -1
  494. package/src/data-fetchers/fetcherDefinitionRegistry.ts +2 -1
  495. package/src/data-fetchers/gotdx.ts +4 -3
  496. package/src/data-fetchers/router.ts +6 -3
  497. package/src/data-fetchers/tradingview.ts +3 -2
  498. package/src/engine/chart.ts +126 -3
  499. package/src/engine/data/chartDataManager.ts +26 -4
  500. package/src/engine/drawing/toolConfig.ts +2 -1
  501. package/src/engine/indicators/chartIndicatorManager.ts +2 -1
  502. package/src/engine/indicators/indicatorDefinitionRegistry.ts +2 -1
  503. package/src/engine/indicators/indicatorMetadata.ts +2 -1
  504. package/src/engine/indicators/indicatorRegistry.ts +6 -5
  505. package/src/engine/indicators/registerBuiltins.ts +2 -1
  506. package/src/engine/indicators/scheduler.ts +15 -0
  507. package/src/engine/indicators/soa.ts +2 -1
  508. package/src/engine/indicators/stateComposer.ts +2 -1
  509. package/src/engine/subPaneManager.ts +2 -1
  510. package/src/engine/utils/chartZoomController.ts +7 -1
  511. package/src/errors-help.ts +218 -0
  512. package/src/errors.ts +128 -0
  513. package/src/index.ts +37 -0
  514. package/src/indicators/__tests__/maFamily.test.ts +159 -0
  515. package/src/indicators/__tests__/oscillators.test.ts +150 -0
  516. package/src/indicators/alma.ts +61 -0
  517. package/src/indicators/awesomeOscillator.ts +54 -0
  518. package/src/indicators/dpo.ts +37 -0
  519. package/src/indicators/fisherTransform.ts +63 -0
  520. package/src/indicators/frama.ts +87 -0
  521. package/src/indicators/index.ts +39 -0
  522. package/src/indicators/lsma.ts +58 -0
  523. package/src/indicators/schaffTrendCycle.ts +92 -0
  524. package/src/indicators/stochRSI.ts +108 -0
  525. package/src/indicators/t3.ts +96 -0
  526. package/src/indicators/ultimateOscillator.ts +83 -0
  527. package/src/indicators/vidya.ts +80 -0
  528. package/src/indicators/zlema.ts +41 -0
  529. package/src/input/__tests__/gesture.test.ts +271 -0
  530. package/src/input/__tests__/keyboard.test.ts +317 -0
  531. package/src/input/gesture.ts +357 -0
  532. package/src/input/index.ts +26 -0
  533. package/src/input/keyboard.ts +373 -0
  534. package/src/mcp/chartBridge.ts +98 -72
  535. package/src/plugin/PluginHost.ts +4 -3
  536. package/src/plugin/PluginRegistry.ts +2 -1
  537. package/src/render/Renderer.ts +127 -0
  538. package/src/render/SurfaceBackend.ts +94 -0
  539. package/src/render/__tests__/contract.test.ts +176 -0
  540. package/src/render/index.ts +27 -0
  541. package/src/renderer-tier/__tests__/detectRendererTier.test.ts +180 -0
  542. package/src/renderer-tier/__tests__/selectBackend.test.ts +253 -0
  543. package/src/renderer-tier/detectRendererTier.ts +168 -0
  544. package/src/renderer-tier/index.ts +30 -0
  545. package/src/renderer-tier/selectBackend.ts +201 -0
  546. package/src/renderer-tier/types.ts +59 -0
  547. package/src/replay/__tests__/controller.test.ts +309 -0
  548. package/src/replay/__tests__/timeline.test.ts +99 -0
  549. package/src/replay/createReplayController.ts +302 -0
  550. package/src/replay/index.ts +15 -0
  551. package/src/replay/timeline.ts +106 -0
  552. package/src/replay/types.ts +107 -0
  553. package/src/scale/__tests__/anchoredZoom.test.ts +125 -0
  554. package/src/scale/__tests__/originShift.test.ts +97 -0
  555. package/src/scale/__tests__/priceScale.test.ts +219 -0
  556. package/src/scale/__tests__/timeScale.test.ts +119 -0
  557. package/src/scale/anchoredZoom.ts +104 -0
  558. package/src/scale/createPriceScale.ts +226 -0
  559. package/src/scale/createTimeScale.ts +150 -0
  560. package/src/scale/index.ts +9 -0
  561. package/src/scale/originShift.ts +111 -0
  562. package/src/scale/types.ts +100 -0
  563. package/src/scene/__tests__/layerRegistry.test.ts +207 -0
  564. package/src/scene/__tests__/scene.test.ts +411 -0
  565. package/src/scene/createScene.ts +117 -0
  566. package/src/scene/index.ts +29 -0
  567. package/src/scene/layerRegistry.ts +117 -0
  568. package/src/scene/types.ts +143 -0
  569. package/src/scheduler/__tests__/createFrameBudget.test.ts +315 -0
  570. package/src/scheduler/createFrameBudget.ts +316 -0
  571. package/src/scheduler/index.ts +7 -0
  572. package/src/tokens/themeToCssVars.ts +3 -1
  573. package/src/version.ts +1 -1
  574. package/dist/data-fetchers/gotdx/gotdx.d.ts +0 -7
  575. package/dist/data-fetchers/gotdx/gotdx.d.ts.map +0 -1
  576. package/dist/data-fetchers/gotdx/gotdx.js +0 -7
  577. package/dist/data-fetchers/gotdx/gotdx.js.map +0 -1
  578. package/src/data-fetchers/gotdx/gotdx.ts +0 -6
@@ -0,0 +1,30 @@
1
+ /**
2
+ * AlertController — framework-agnostic, signal-based.
3
+ *
4
+ * Same dispose-guard pattern as the other core controllers (volume-profile,
5
+ * indicator-selector). Adapters (React/Vue/Angular) subscribe to the
6
+ * `rules` and `events` signals via their native reactivity.
7
+ *
8
+ * Per-rule prev-snapshot:
9
+ * Cross-style predicates compare prev vs. curr. Rather than asking the
10
+ * caller to thread that state, the controller stashes the previous
11
+ * evaluation snapshot per rule id and feeds it back into the predicate.
12
+ * When a rule is added or re-enabled, its prev is reset — that prevents
13
+ * a spurious fire on first evaluation (a newly-added "price-cross 100"
14
+ * rule should NOT fire just because the current close happens to be 105).
15
+ *
16
+ * Cooldown:
17
+ * For non-oneShot rules we record `lastFiredAt` and suppress re-fires
18
+ * within `cooldownMs`. oneShot ignores cooldown — it just flips
19
+ * `enabled` to false on first fire.
20
+ *
21
+ * Crash safety:
22
+ * `kind: 'custom'` predicates run inside try/catch. A throwing predicate
23
+ * is caught, marked internally, and skipped for this pass; the rest of
24
+ * the rules continue to evaluate. Errors are swallowed at the boundary
25
+ * (no console.* per coding-style.md) — observability hooks are a future
26
+ * addition (`onError` listener on the controller).
27
+ */
28
+ import type { AlertController, AlertControllerOptions } from './types';
29
+ export declare function createAlertController(opts?: AlertControllerOptions): AlertController;
30
+ //# sourceMappingURL=createAlertController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAlertController.d.ts","sourceRoot":"","sources":["../../src/alerts/createAlertController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EACR,eAAe,EACf,sBAAsB,EAIzB,MAAM,SAAS,CAAA;AAWhB,wBAAgB,qBAAqB,CACjC,IAAI,CAAC,EAAE,sBAAsB,GAC9B,eAAe,CAsQjB"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * AlertController — framework-agnostic, signal-based.
3
+ *
4
+ * Same dispose-guard pattern as the other core controllers (volume-profile,
5
+ * indicator-selector). Adapters (React/Vue/Angular) subscribe to the
6
+ * `rules` and `events` signals via their native reactivity.
7
+ *
8
+ * Per-rule prev-snapshot:
9
+ * Cross-style predicates compare prev vs. curr. Rather than asking the
10
+ * caller to thread that state, the controller stashes the previous
11
+ * evaluation snapshot per rule id and feeds it back into the predicate.
12
+ * When a rule is added or re-enabled, its prev is reset — that prevents
13
+ * a spurious fire on first evaluation (a newly-added "price-cross 100"
14
+ * rule should NOT fire just because the current close happens to be 105).
15
+ *
16
+ * Cooldown:
17
+ * For non-oneShot rules we record `lastFiredAt` and suppress re-fires
18
+ * within `cooldownMs`. oneShot ignores cooldown — it just flips
19
+ * `enabled` to false on first fire.
20
+ *
21
+ * Crash safety:
22
+ * `kind: 'custom'` predicates run inside try/catch. A throwing predicate
23
+ * is caught, marked internally, and skipped for this pass; the rest of
24
+ * the rules continue to evaluate. Errors are swallowed at the boundary
25
+ * (no console.* per coding-style.md) — observability hooks are a future
26
+ * addition (`onError` listener on the controller).
27
+ */
28
+ import { createSignal } from '../reactivity/signal';
29
+ import { evaluatePredicate } from './predicates';
30
+ const DEFAULT_MAX_EVENTS = 100;
31
+ export function createAlertController(opts) {
32
+ const maxEvents = (() => {
33
+ const raw = opts?.maxEvents;
34
+ if (raw === undefined)
35
+ return DEFAULT_MAX_EVENTS;
36
+ if (!Number.isFinite(raw) || raw < 1)
37
+ return DEFAULT_MAX_EVENTS;
38
+ return Math.floor(raw);
39
+ })();
40
+ // -----------------------------------------------------------------------
41
+ // Signals — frozen arrays so React/Vue see new identity on every change.
42
+ // -----------------------------------------------------------------------
43
+ const rules = createSignal([]);
44
+ const events = createSignal([]);
45
+ // -----------------------------------------------------------------------
46
+ // Private state
47
+ // -----------------------------------------------------------------------
48
+ const runtime = new Map();
49
+ const listeners = new Set();
50
+ let disposed = false;
51
+ function findIndex(id) {
52
+ const arr = rules.peek();
53
+ for (let i = 0; i < arr.length; i++) {
54
+ if (arr[i].id === id)
55
+ return i;
56
+ }
57
+ return -1;
58
+ }
59
+ function replaceAt(arr, i, next) {
60
+ const copy = arr.slice();
61
+ copy[i] = next;
62
+ return copy;
63
+ }
64
+ // -----------------------------------------------------------------------
65
+ // addRule / removeRule / setRuleEnabled / updateRule
66
+ // -----------------------------------------------------------------------
67
+ function addRule(rule) {
68
+ if (findIndex(rule.id) >= 0)
69
+ return false;
70
+ // Defensive shallow copy so external mutation of the caller's object
71
+ // does not affect controller state.
72
+ const stored = {
73
+ ...rule,
74
+ metadata: rule.metadata !== undefined ? { ...rule.metadata } : undefined,
75
+ };
76
+ rules.set([...rules.peek(), stored]);
77
+ runtime.set(rule.id, { prev: null, lastFiredAt: undefined });
78
+ return true;
79
+ }
80
+ function removeRule(id) {
81
+ const idx = findIndex(id);
82
+ if (idx < 0)
83
+ return false;
84
+ const copy = rules.peek().slice();
85
+ copy.splice(idx, 1);
86
+ rules.set(copy);
87
+ runtime.delete(id);
88
+ return true;
89
+ }
90
+ function setRuleEnabled(id, enabled) {
91
+ const idx = findIndex(id);
92
+ if (idx < 0)
93
+ return false;
94
+ const cur = rules.peek()[idx];
95
+ if (cur.enabled === enabled)
96
+ return true; // no-op but reports success
97
+ const next = { ...cur, enabled };
98
+ rules.set(replaceAt(rules.peek(), idx, next));
99
+ // Re-enabling resets prev — a freshly enabled cross rule should not
100
+ // fire on the first eval just because the level is already broken.
101
+ if (enabled) {
102
+ runtime.set(id, { prev: null, lastFiredAt: undefined });
103
+ }
104
+ return true;
105
+ }
106
+ function updateRule(id, patch) {
107
+ const idx = findIndex(id);
108
+ if (idx < 0)
109
+ return false;
110
+ const cur = rules.peek()[idx];
111
+ const next = {
112
+ ...cur,
113
+ ...patch,
114
+ id: cur.id, // id is invariant
115
+ metadata: patch.metadata !== undefined
116
+ ? { ...patch.metadata }
117
+ : cur.metadata,
118
+ };
119
+ rules.set(replaceAt(rules.peek(), idx, next));
120
+ // Changing the predicate invalidates prev — different predicates may
121
+ // need different prev fields, and a stale prev could cause a spurious
122
+ // fire on next eval.
123
+ if (patch.predicate !== undefined) {
124
+ runtime.set(id, { prev: null, lastFiredAt: undefined });
125
+ }
126
+ return true;
127
+ }
128
+ // -----------------------------------------------------------------------
129
+ // evaluate — the hot path. Safe to call every frame.
130
+ // -----------------------------------------------------------------------
131
+ function evaluate(snapshot, now) {
132
+ const fired = [];
133
+ const currentRules = rules.peek();
134
+ // We may need to flip oneShot rules off — collect indices and apply
135
+ // once at the end to avoid mutating `currentRules` mid-loop.
136
+ const toDisable = [];
137
+ for (let i = 0; i < currentRules.length; i++) {
138
+ const rule = currentRules[i];
139
+ if (!rule.enabled)
140
+ continue;
141
+ const rt = runtime.get(rule.id) ?? {
142
+ prev: null,
143
+ lastFiredAt: undefined,
144
+ };
145
+ // Cooldown gate (applies to non-oneShot rules; oneShot rules
146
+ // can only fire once anyway).
147
+ if (!rule.oneShot &&
148
+ rule.cooldownMs !== undefined &&
149
+ rule.cooldownMs > 0 &&
150
+ rt.lastFiredAt !== undefined &&
151
+ now - rt.lastFiredAt < rule.cooldownMs) {
152
+ // Still update prev so the next eval after cooldown has the
153
+ // right reference point for cross detection.
154
+ rt.prev = snapshot;
155
+ runtime.set(rule.id, rt);
156
+ continue;
157
+ }
158
+ // Evaluate. Custom predicates can throw — wrap.
159
+ let hit = false;
160
+ try {
161
+ hit = evaluatePredicate(rule.predicate, snapshot, rt.prev);
162
+ }
163
+ catch {
164
+ // Swallow per crash-safety contract. Do NOT fire. Continue.
165
+ hit = false;
166
+ }
167
+ if (hit) {
168
+ const event = {
169
+ ruleId: rule.id,
170
+ ruleName: rule.name,
171
+ triggeredAt: now,
172
+ snapshotBar: snapshot.bar !== null ? { ...snapshot.bar } : null,
173
+ metadata: rule.metadata,
174
+ };
175
+ fired.push(event);
176
+ rt.lastFiredAt = now;
177
+ if (rule.oneShot) {
178
+ toDisable.push(i);
179
+ }
180
+ }
181
+ rt.prev = snapshot;
182
+ runtime.set(rule.id, rt);
183
+ }
184
+ if (fired.length > 0) {
185
+ // Append fired events to the ring, capped at maxEvents.
186
+ const prevEvents = events.peek();
187
+ const merged = prevEvents.concat(fired);
188
+ const trimmed = merged.length > maxEvents
189
+ ? merged.slice(merged.length - maxEvents)
190
+ : merged;
191
+ events.set(trimmed);
192
+ // Notify per-event listeners. Copy first so a listener that
193
+ // unsubscribes during fire-out doesn't mutate the iteration.
194
+ const snapshotListeners = [...listeners];
195
+ for (const ev of fired) {
196
+ for (const l of snapshotListeners) {
197
+ try {
198
+ l(ev);
199
+ }
200
+ catch {
201
+ // listener errors are isolated — never leak across.
202
+ }
203
+ }
204
+ }
205
+ }
206
+ if (toDisable.length > 0) {
207
+ const copy = rules.peek().slice();
208
+ for (const i of toDisable) {
209
+ const r = copy[i];
210
+ if (r !== undefined)
211
+ copy[i] = { ...r, enabled: false };
212
+ }
213
+ rules.set(copy);
214
+ }
215
+ return fired;
216
+ }
217
+ // -----------------------------------------------------------------------
218
+ // events / listener management
219
+ // -----------------------------------------------------------------------
220
+ function clearEvents() {
221
+ if (events.peek().length === 0)
222
+ return;
223
+ events.set([]);
224
+ }
225
+ function onEvent(listener) {
226
+ listeners.add(listener);
227
+ return () => {
228
+ listeners.delete(listener);
229
+ };
230
+ }
231
+ // -----------------------------------------------------------------------
232
+ // dispose
233
+ // -----------------------------------------------------------------------
234
+ function dispose() {
235
+ if (disposed)
236
+ return;
237
+ disposed = true;
238
+ listeners.clear();
239
+ runtime.clear();
240
+ }
241
+ function guard(fn, fallback) {
242
+ return ((...args) => {
243
+ if (disposed)
244
+ return fallback;
245
+ return fn(...args);
246
+ });
247
+ }
248
+ return {
249
+ rules,
250
+ events,
251
+ addRule: guard(addRule, false),
252
+ removeRule: guard(removeRule, false),
253
+ setRuleEnabled: guard(setRuleEnabled, false),
254
+ updateRule: guard(updateRule, false),
255
+ evaluate: guard(evaluate, []),
256
+ clearEvents: guard(clearEvents, undefined),
257
+ onEvent: guard(onEvent, (() => undefined)),
258
+ dispose,
259
+ };
260
+ }
261
+ //# sourceMappingURL=createAlertController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAlertController.js","sourceRoot":"","sources":["../../src/alerts/createAlertController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { AlertController, AlertControllerOptions, AlertEvent, AlertPredicate, AlertPredicateKind, AlertRule, CrossDirection, IndicatorCrossPairDirection, MarketSnapshot, } from './types';
2
+ export { createAlertController } from './createAlertController';
3
+ export { evaluatePredicate } from './predicates';
4
+ export { AlertRuleSchemaError, deserializeRule, serializeRule, } from './ruleSchema';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/alerts/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,eAAe,EACf,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,2BAA2B,EAC3B,cAAc,GACjB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EACH,oBAAoB,EACpB,eAAe,EACf,aAAa,GAChB,MAAM,cAAc,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { createAlertController } from './createAlertController';
2
+ export { evaluatePredicate } from './predicates';
3
+ export { AlertRuleSchemaError, deserializeRule, serializeRule, } from './ruleSchema';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/alerts/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EACH,oBAAoB,EACpB,eAAe,EACf,aAAa,GAChB,MAAM,cAAc,CAAA"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Built-in predicate kit.
3
+ *
4
+ * Each predicate is a pure function over `(predicate, curr, prev)`:
5
+ * - `curr` is the snapshot at the current evaluation.
6
+ * - `prev` is the snapshot from the previous evaluation of the SAME rule
7
+ * (the controller threads it through). For cross-style predicates the
8
+ * prev value is what makes "just-crossed" detectable vs. "is above".
9
+ * - When `prev` is null (first evaluation), cross predicates must NOT fire —
10
+ * we cannot distinguish "already above" from "just crossed up" without a
11
+ * reference point.
12
+ *
13
+ * All predicates are O(1) — no scanning of history. The caller pre-computes
14
+ * any rolling state (e.g. `rollingVolume[N]`).
15
+ *
16
+ * Defensive: predicates return `false` for any required field that is null,
17
+ * undefined, or non-finite. We never throw — a bad snapshot must not crash
18
+ * an entire alert pass.
19
+ */
20
+ import type { AlertPredicate, MarketSnapshot } from './types';
21
+ /**
22
+ * Returns `true` iff the predicate fires for this (prev, curr) pair.
23
+ *
24
+ * The controller wraps `kind: 'custom'` in its own try/catch — but we still
25
+ * defensively guard against the function being missing here.
26
+ */
27
+ export declare function evaluatePredicate(predicate: AlertPredicate, curr: MarketSnapshot, prev: MarketSnapshot | null): boolean;
28
+ //# sourceMappingURL=predicates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicates.d.ts","sourceRoot":"","sources":["../../src/alerts/predicates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACR,cAAc,EAGd,cAAc,EACjB,MAAM,SAAS,CAAA;AAmEhB;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,cAAc,GAAG,IAAI,GAC5B,OAAO,CAgIT"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Built-in predicate kit.
3
+ *
4
+ * Each predicate is a pure function over `(predicate, curr, prev)`:
5
+ * - `curr` is the snapshot at the current evaluation.
6
+ * - `prev` is the snapshot from the previous evaluation of the SAME rule
7
+ * (the controller threads it through). For cross-style predicates the
8
+ * prev value is what makes "just-crossed" detectable vs. "is above".
9
+ * - When `prev` is null (first evaluation), cross predicates must NOT fire —
10
+ * we cannot distinguish "already above" from "just crossed up" without a
11
+ * reference point.
12
+ *
13
+ * All predicates are O(1) — no scanning of history. The caller pre-computes
14
+ * any rolling state (e.g. `rollingVolume[N]`).
15
+ *
16
+ * Defensive: predicates return `false` for any required field that is null,
17
+ * undefined, or non-finite. We never throw — a bad snapshot must not crash
18
+ * an entire alert pass.
19
+ */
20
+ // ---------------------------------------------------------------------------
21
+ // Helpers
22
+ // ---------------------------------------------------------------------------
23
+ function isFiniteNumber(x) {
24
+ return typeof x === 'number' && Number.isFinite(x);
25
+ }
26
+ /**
27
+ * Generic numeric cross check.
28
+ * - up : prev < threshold && curr >= threshold
29
+ * - down : prev > threshold && curr <= threshold
30
+ * - any : either
31
+ *
32
+ * Returns false if either side is non-finite. The `>=` / `<=` on the curr side
33
+ * is intentional — a value landing exactly on the threshold counts as a cross
34
+ * the instant it arrives (matches trader intuition: "alert me when price hits
35
+ * 100" should fire at 100, not require 100.01).
36
+ */
37
+ function crossed(prevValue, currValue, threshold, direction) {
38
+ if (prevValue === null || !isFiniteNumber(prevValue))
39
+ return false;
40
+ if (!isFiniteNumber(currValue) || !isFiniteNumber(threshold))
41
+ return false;
42
+ const up = prevValue < threshold && currValue >= threshold;
43
+ const down = prevValue > threshold && currValue <= threshold;
44
+ if (direction === 'up')
45
+ return up;
46
+ if (direction === 'down')
47
+ return down;
48
+ return up || down;
49
+ }
50
+ /**
51
+ * Cross of two series A vs B (indicator vs indicator). Direction:
52
+ * - a-above-b : A was <= B and is now > B (A crossed UP through B)
53
+ * - a-below-b : A was >= B and is now < B (A crossed DOWN through B)
54
+ * - any : either
55
+ *
56
+ * Note the asymmetric strictness vs. `crossed`: here we use strict inequality
57
+ * on the post side because equality of two floats is rare and ambiguous — we
58
+ * wait for the next tick of separation.
59
+ */
60
+ function crossedPair(prevA, prevB, currA, currB, direction) {
61
+ if (prevA === null || prevB === null)
62
+ return false;
63
+ if (!isFiniteNumber(prevA) || !isFiniteNumber(prevB))
64
+ return false;
65
+ if (!isFiniteNumber(currA) || !isFiniteNumber(currB))
66
+ return false;
67
+ const aAboveB = prevA <= prevB && currA > currB;
68
+ const aBelowB = prevA >= prevB && currA < currB;
69
+ if (direction === 'a-above-b')
70
+ return aAboveB;
71
+ if (direction === 'a-below-b')
72
+ return aBelowB;
73
+ return aAboveB || aBelowB;
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // evaluatePredicate — the dispatch
77
+ // ---------------------------------------------------------------------------
78
+ /**
79
+ * Returns `true` iff the predicate fires for this (prev, curr) pair.
80
+ *
81
+ * The controller wraps `kind: 'custom'` in its own try/catch — but we still
82
+ * defensively guard against the function being missing here.
83
+ */
84
+ export function evaluatePredicate(predicate, curr, prev) {
85
+ switch (predicate.kind) {
86
+ case 'price-cross': {
87
+ const cBar = curr.bar;
88
+ const pBar = prev?.bar ?? null;
89
+ if (cBar === null || !isFiniteNumber(cBar.close))
90
+ return false;
91
+ const prevClose = pBar !== null && isFiniteNumber(pBar.close) ? pBar.close : null;
92
+ return crossed(prevClose, cBar.close, predicate.price, predicate.direction);
93
+ }
94
+ case 'price-in-range': {
95
+ const cBar = curr.bar;
96
+ if (cBar === null || !isFiniteNumber(cBar.close))
97
+ return false;
98
+ const { min, max } = predicate;
99
+ if (!isFiniteNumber(min) || !isFiniteNumber(max))
100
+ return false;
101
+ return cBar.close >= min && cBar.close <= max;
102
+ }
103
+ case 'price-out-of-range': {
104
+ const cBar = curr.bar;
105
+ if (cBar === null || !isFiniteNumber(cBar.close))
106
+ return false;
107
+ const { min, max } = predicate;
108
+ if (!isFiniteNumber(min) || !isFiniteNumber(max))
109
+ return false;
110
+ return cBar.close < min || cBar.close > max;
111
+ }
112
+ case 'indicator-cross': {
113
+ const id = predicate.indicatorId;
114
+ const cVal = curr.indicators[id];
115
+ if (cVal === undefined || !isFiniteNumber(cVal))
116
+ return false;
117
+ const pRaw = prev?.indicators[id];
118
+ const pVal = pRaw !== undefined && isFiniteNumber(pRaw) ? pRaw : null;
119
+ return crossed(pVal, cVal, predicate.threshold, predicate.direction);
120
+ }
121
+ case 'indicator-cross-indicator': {
122
+ const { aId, bId, direction } = predicate;
123
+ const cA = curr.indicators[aId];
124
+ const cB = curr.indicators[bId];
125
+ if (cA === undefined ||
126
+ cB === undefined ||
127
+ !isFiniteNumber(cA) ||
128
+ !isFiniteNumber(cB)) {
129
+ return false;
130
+ }
131
+ const pARaw = prev?.indicators[aId];
132
+ const pBRaw = prev?.indicators[bId];
133
+ const pA = pARaw !== undefined && isFiniteNumber(pARaw) ? pARaw : null;
134
+ const pB = pBRaw !== undefined && isFiniteNumber(pBRaw) ? pBRaw : null;
135
+ return crossedPair(pA, pB, cA, cB, direction);
136
+ }
137
+ case 'volume-spike': {
138
+ const cBar = curr.bar;
139
+ if (cBar === null || !isFiniteNumber(cBar.volume))
140
+ return false;
141
+ const avg = curr.rollingVolume[predicate.lookbackBars];
142
+ // Missing avg or zero avg → no useful baseline; do not fire.
143
+ if (avg === undefined || !isFiniteNumber(avg) || avg <= 0)
144
+ return false;
145
+ if (!isFiniteNumber(predicate.multipleOfAvg))
146
+ return false;
147
+ return cBar.volume >= avg * predicate.multipleOfAvg;
148
+ }
149
+ case 'volume-profile-poc-touch': {
150
+ const cBar = curr.bar;
151
+ const vp = curr.volumeProfile;
152
+ if (cBar === null || !isFiniteNumber(cBar.close))
153
+ return false;
154
+ if (vp === undefined || !isFiniteNumber(vp.poc) || vp.poc === 0)
155
+ return false;
156
+ if (!isFiniteNumber(predicate.bandPercent))
157
+ return false;
158
+ const distance = Math.abs(cBar.close - vp.poc) / Math.abs(vp.poc);
159
+ return distance <= predicate.bandPercent;
160
+ }
161
+ case 'order-book-wall': {
162
+ const ob = curr.orderBook;
163
+ if (ob === undefined)
164
+ return false;
165
+ const { sizeMultipleOfMedian: k } = predicate;
166
+ if (!isFiniteNumber(k))
167
+ return false;
168
+ const bidHit = isFiniteNumber(ob.medianBidSize) &&
169
+ isFiniteNumber(ob.maxBidSize) &&
170
+ ob.medianBidSize > 0 &&
171
+ ob.maxBidSize >= ob.medianBidSize * k;
172
+ const askHit = isFiniteNumber(ob.medianAskSize) &&
173
+ isFiniteNumber(ob.maxAskSize) &&
174
+ ob.medianAskSize > 0 &&
175
+ ob.maxAskSize >= ob.medianAskSize * k;
176
+ return bidHit || askHit;
177
+ }
178
+ case 'footprint-imbalance': {
179
+ const fp = curr.footprint;
180
+ if (fp === undefined)
181
+ return false;
182
+ if (!isFiniteNumber(fp.latestBarMaxImbalanceRatio) ||
183
+ !isFiniteNumber(fp.latestBarImbalanceCount)) {
184
+ return false;
185
+ }
186
+ return (fp.latestBarMaxImbalanceRatio >= predicate.minImbalanceRatio &&
187
+ fp.latestBarImbalanceCount >= predicate.consecutivePriceLevels);
188
+ }
189
+ case 'custom': {
190
+ if (typeof predicate.evaluate !== 'function')
191
+ return false;
192
+ // The controller also wraps this call in try/catch; the inner
193
+ // guard here protects callers that invoke predicates directly
194
+ // (e.g. tests or third-party tooling).
195
+ try {
196
+ return predicate.evaluate(curr) === true;
197
+ }
198
+ catch {
199
+ return false;
200
+ }
201
+ }
202
+ default: {
203
+ // Exhaustiveness check — adding a new kind without a case here
204
+ // will surface as a TS error on this line.
205
+ const _exhaustive = predicate;
206
+ void _exhaustive;
207
+ return false;
208
+ }
209
+ }
210
+ }
211
+ //# sourceMappingURL=predicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../src/alerts/predicates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { MarketSnapshot } from './types';
2
+ export declare class RollingVolumeCalculator {
3
+ readonly size: number;
4
+ private buffer;
5
+ private sum;
6
+ private cursor;
7
+ private filled;
8
+ constructor(size: number);
9
+ push(volume: number): number;
10
+ get mean(): number;
11
+ }
12
+ export type VolumeLookbacks = Map<number, RollingVolumeCalculator>;
13
+ export declare function createVolumeLookbacks(sizes: number[]): VolumeLookbacks;
14
+ export declare function pushToVolumeLookbacks(lookbacks: VolumeLookbacks, volume: number): MarketSnapshot['rollingVolume'];
15
+ //# sourceMappingURL=rollingVolume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollingVolume.d.ts","sourceRoot":"","sources":["../../src/alerts/rollingVolume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,qBAAa,uBAAuB;aAMN,IAAI,EAAE,MAAM;IALxC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,GAAG,CAAI;IACf,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,MAAM,CAAQ;gBAEM,IAAI,EAAE,MAAM;IAIxC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAa5B,IAAI,IAAI,IAAI,MAAM,CAGjB;CACF;AAED,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAA;AAElE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,CAMtE;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,GACb,cAAc,CAAC,eAAe,CAAC,CAMjC"}
@@ -0,0 +1,42 @@
1
+ export class RollingVolumeCalculator {
2
+ size;
3
+ buffer;
4
+ sum = 0;
5
+ cursor = 0;
6
+ filled = false;
7
+ constructor(size) {
8
+ this.size = size;
9
+ this.buffer = new Array(size);
10
+ }
11
+ push(volume) {
12
+ if (this.filled) {
13
+ this.sum -= this.buffer[this.cursor];
14
+ }
15
+ this.buffer[this.cursor] = volume;
16
+ this.sum += volume;
17
+ this.cursor = (this.cursor + 1) % this.size;
18
+ if (!this.filled && this.cursor === 0) {
19
+ this.filled = true;
20
+ }
21
+ return this.mean;
22
+ }
23
+ get mean() {
24
+ const count = this.filled ? this.size : this.cursor;
25
+ return count > 0 ? this.sum / count : 0;
26
+ }
27
+ }
28
+ export function createVolumeLookbacks(sizes) {
29
+ const map = new Map();
30
+ for (const size of sizes) {
31
+ map.set(size, new RollingVolumeCalculator(size));
32
+ }
33
+ return map;
34
+ }
35
+ export function pushToVolumeLookbacks(lookbacks, volume) {
36
+ const result = {};
37
+ for (const [size, calc] of lookbacks) {
38
+ result[size] = calc.push(volume);
39
+ }
40
+ return result;
41
+ }
42
+ //# sourceMappingURL=rollingVolume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollingVolume.js","sourceRoot":"","sources":["../../src/alerts/rollingVolume.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,uBAAuB;IAMN;IALpB,MAAM,CAAU;IAChB,GAAG,GAAG,CAAC,CAAA;IACP,MAAM,GAAG,CAAC,CAAA;IACV,MAAM,GAAG,KAAK,CAAA;IAEtB,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAE,CAAA;QACvC,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;QACjC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QACpB,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,IAAI,IAAI;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QACnD,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACzC,CAAC;CACF;AAID,MAAM,UAAU,qBAAqB,CAAC,KAAe;IACnD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmC,CAAA;IACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,SAA0B,EAC1B,MAAc;IAEd,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}