@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,234 @@
1
+ /**
2
+ * HeatmapController — composes the order-book accumulator, snapshot ring,
3
+ * and delta archive into a single reactive surface.
4
+ *
5
+ * Timing (this is load-bearing): we do **not** schedule snapshots via
6
+ * `setInterval`. The controller treats incoming delta timestamps as the
7
+ * wall clock. When `ingestDelta` sees a delta whose timestamp is more than
8
+ * `snapshotIntervalMs` after the previous snapshot, it pushes a snapshot
9
+ * before applying the new delta. Two upsides:
10
+ *
11
+ * 1. Deterministic tests — no fake timers required.
12
+ * 2. Correct under bursty traffic — snapshot cadence follows market time,
13
+ * not real time, so replay and live observation see the same grid.
14
+ *
15
+ * The `state` signal updates once per delta ingested. It exposes the
16
+ * **latest** snapshot (for read-time convenience) plus the cumulative
17
+ * snapshot / delta counts so adapters can use it as a render trigger.
18
+ */
19
+ import { createSignal } from '../../reactivity';
20
+ import { KLineChartError } from '../../errors';
21
+ import { createDeltaArchive } from './deltaArchive';
22
+ import { createLogColorScale } from './logColorScale';
23
+ import { createOrderBookState } from './createOrderBookState';
24
+ import { createSnapshotRing } from './snapshotRing';
25
+ const DEFAULT_CONFIG = {
26
+ tickSize: 0.01,
27
+ snapshotIntervalMs: 100,
28
+ snapshotRingCapacity: 600,
29
+ deltaArchiveMaxSize: 1_000_000,
30
+ logColorRange: { sizeMin: 1, sizeMax: 1_000_000 },
31
+ };
32
+ export function createHeatmapController(init) {
33
+ let config = { ...DEFAULT_CONFIG, ...init };
34
+ if (init?.logColorRange) {
35
+ config = { ...config, logColorRange: { ...init.logColorRange } };
36
+ }
37
+ validateConfig(config);
38
+ let book = createOrderBookState({ tickSize: config.tickSize });
39
+ let ring = createSnapshotRing(config.snapshotRingCapacity);
40
+ let archive = createDeltaArchive({
41
+ maxSize: config.deltaArchiveMaxSize,
42
+ });
43
+ const colorScale = createLogColorScale(config.logColorRange.sizeMin, config.logColorRange.sizeMax);
44
+ const state = createSignal({
45
+ latestSnapshot: null,
46
+ snapshotCount: 0,
47
+ deltaCount: 0,
48
+ });
49
+ // `snapshotClock` is the timestamp of the LAST emitted (or anchored)
50
+ // snapshot column. It advances by exactly `snapshotIntervalMs` per
51
+ // emission so we never drift even if deltas cluster mid-interval, and
52
+ // we don't depend on `book.lastTimestamp()` (which lags behind the
53
+ // grid clock when the book is quiescent).
54
+ let snapshotClock = null;
55
+ let snapshotCount = 0;
56
+ let deltaCount = 0;
57
+ let disposed = false;
58
+ function pushSnapshotAt(ts) {
59
+ const raw = book.snapshot();
60
+ const snap = {
61
+ bids: raw.bids,
62
+ asks: raw.asks,
63
+ timestamp: ts,
64
+ };
65
+ ring.push(snap);
66
+ snapshotCount++;
67
+ return snap;
68
+ }
69
+ function publish(latest) {
70
+ state.set({
71
+ latestSnapshot: latest,
72
+ snapshotCount,
73
+ deltaCount,
74
+ });
75
+ }
76
+ function ingestDelta(delta) {
77
+ if (disposed)
78
+ return;
79
+ const interval = config.snapshotIntervalMs;
80
+ // 1. Anchor the snapshot clock to the first delta we ever see.
81
+ // The first delta does NOT trigger a snapshot — there is no
82
+ // prior column to emit. The snapshot for column N (timestamp
83
+ // `anchor + N * interval`) is emitted when a delta with
84
+ // timestamp ≥ `anchor + (N+1) * interval` arrives.
85
+ if (snapshotClock === null) {
86
+ snapshotClock = delta.timestamp;
87
+ archive.append(delta);
88
+ deltaCount++;
89
+ book.applyDelta(delta);
90
+ publish(state.peek().latestSnapshot);
91
+ return;
92
+ }
93
+ // 2. Emit one snapshot per interval boundary CROSSED. The snapshot
94
+ // captures the book state up to (but not including) `delta`.
95
+ const maxCatchUp = config.snapshotRingCapacity;
96
+ let emitted = 0;
97
+ let latest = state.peek().latestSnapshot;
98
+ while (delta.timestamp - snapshotClock >= interval &&
99
+ emitted < maxCatchUp) {
100
+ snapshotClock += interval;
101
+ latest = pushSnapshotAt(snapshotClock);
102
+ emitted++;
103
+ }
104
+ // 3. Record the raw delta and update the live book.
105
+ archive.append(delta);
106
+ deltaCount++;
107
+ book.applyDelta(delta);
108
+ publish(latest);
109
+ }
110
+ function forceSnapshot() {
111
+ if (disposed)
112
+ return;
113
+ // `forceSnapshot` uses the book's latest delta timestamp as the
114
+ // column timestamp — it's an out-of-band emission, not a
115
+ // grid-aligned one, so we don't advance `snapshotClock`.
116
+ const snap = pushSnapshotAt(book.lastTimestamp());
117
+ publish(snap);
118
+ }
119
+ function replay(fromTimestamp, toTimestamp, snapshotIntervalMs) {
120
+ if (disposed)
121
+ return [];
122
+ if (snapshotIntervalMs <= 0) {
123
+ throw new KLineChartError('HEATMAP_CONFIG_INVALID', 'replay: snapshotIntervalMs must be > 0');
124
+ }
125
+ if (toTimestamp < fromTimestamp)
126
+ return [];
127
+ // Reconstruct from a brand-new book. We don't reuse `book` because
128
+ // replay must be side-effect-free with respect to live state.
129
+ const replayBook = createOrderBookState({ tickSize: config.tickSize });
130
+ // We need ALL deltas up to `toTimestamp` to reach the correct state;
131
+ // we just don't emit snapshots before `fromTimestamp`.
132
+ const deltas = archive.range(Number.NEGATIVE_INFINITY, toTimestamp);
133
+ // Stable sort by timestamp (archive append order is mostly but not
134
+ // strictly monotonic — defending against out-of-order arrivals).
135
+ const sorted = [...deltas].sort((a, b) => a.timestamp - b.timestamp);
136
+ const out = [];
137
+ let nextSnapTs = fromTimestamp;
138
+ let cursor = 0;
139
+ while (nextSnapTs <= toTimestamp) {
140
+ // Apply every delta with ts ≤ nextSnapTs.
141
+ while (cursor < sorted.length && sorted[cursor].timestamp <= nextSnapTs) {
142
+ replayBook.applyDelta(sorted[cursor]);
143
+ cursor++;
144
+ }
145
+ const snap = replayBook.snapshot();
146
+ // Pin the snapshot timestamp to the grid column, not the latest
147
+ // delta — callers want a regular series.
148
+ out.push({
149
+ bids: snap.bids,
150
+ asks: snap.asks,
151
+ timestamp: nextSnapTs,
152
+ });
153
+ nextSnapTs += snapshotIntervalMs;
154
+ }
155
+ return out;
156
+ }
157
+ function setConfig(next) {
158
+ if (disposed)
159
+ return;
160
+ const merged = { ...config, ...next };
161
+ if (next.logColorRange) {
162
+ merged.logColorRange = { ...next.logColorRange };
163
+ }
164
+ validateConfig(merged);
165
+ const tickChanged = merged.tickSize !== config.tickSize;
166
+ const capacityChanged = merged.snapshotRingCapacity !== config.snapshotRingCapacity;
167
+ const archiveMaxChanged = merged.deltaArchiveMaxSize !== config.deltaArchiveMaxSize;
168
+ const colorChanged = merged.logColorRange.sizeMin !== config.logColorRange.sizeMin ||
169
+ merged.logColorRange.sizeMax !== config.logColorRange.sizeMax;
170
+ config = merged;
171
+ if (tickChanged) {
172
+ // Rebuild book against the new tick. Replay archive so the live
173
+ // view stays in sync with what we've already ingested.
174
+ book = createOrderBookState({ tickSize: config.tickSize });
175
+ const all = archive.range(Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY);
176
+ for (const d of all)
177
+ book.applyDelta(d);
178
+ }
179
+ if (capacityChanged) {
180
+ const old = ring.toArray();
181
+ ring = createSnapshotRing(config.snapshotRingCapacity);
182
+ // Replay tail into the new ring.
183
+ const start = Math.max(0, old.length - config.snapshotRingCapacity);
184
+ for (let i = start; i < old.length; i++)
185
+ ring.push(old[i]);
186
+ }
187
+ if (archiveMaxChanged) {
188
+ archive.trim(config.deltaArchiveMaxSize);
189
+ }
190
+ if (colorChanged) {
191
+ colorScale.setRange(config.logColorRange.sizeMin, config.logColorRange.sizeMax);
192
+ }
193
+ publish(state.peek().latestSnapshot);
194
+ }
195
+ function dispose() {
196
+ if (disposed)
197
+ return;
198
+ disposed = true;
199
+ book.clear();
200
+ ring.clear();
201
+ archive.clear();
202
+ }
203
+ return {
204
+ state,
205
+ // Canonical verb (API audit BLOCKER-001 harmonisation). Same impl
206
+ // as `ingestDelta` — existing consumers stay working.
207
+ ingest: ingestDelta,
208
+ ingestDelta,
209
+ forceSnapshot,
210
+ replay,
211
+ setConfig,
212
+ dispose,
213
+ };
214
+ }
215
+ function validateConfig(c) {
216
+ if (!(c.tickSize > 0))
217
+ throw new KLineChartError('HEATMAP_CONFIG_INVALID', 'HeatmapController: tickSize must be > 0');
218
+ if (!(c.snapshotIntervalMs > 0)) {
219
+ throw new KLineChartError('HEATMAP_CONFIG_INVALID', 'HeatmapController: snapshotIntervalMs must be > 0');
220
+ }
221
+ if (!Number.isInteger(c.snapshotRingCapacity) || c.snapshotRingCapacity <= 0) {
222
+ throw new KLineChartError('HEATMAP_CONFIG_INVALID', 'HeatmapController: snapshotRingCapacity must be a positive integer');
223
+ }
224
+ if (!(c.deltaArchiveMaxSize >= 0)) {
225
+ throw new KLineChartError('HEATMAP_CONFIG_INVALID', 'HeatmapController: deltaArchiveMaxSize must be ≥ 0');
226
+ }
227
+ if (!(c.logColorRange.sizeMin > 0) || !(c.logColorRange.sizeMax > 0)) {
228
+ throw new KLineChartError('HEATMAP_CONFIG_INVALID', 'HeatmapController: logColorRange bounds must be positive');
229
+ }
230
+ if (c.logColorRange.sizeMax < c.logColorRange.sizeMin) {
231
+ throw new KLineChartError('HEATMAP_CONFIG_INVALID', 'HeatmapController: logColorRange.sizeMax must be ≥ sizeMin');
232
+ }
233
+ }
234
+ //# sourceMappingURL=createHeatmapController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createHeatmapController.js","sourceRoot":"","sources":["../../../src/components/orderBookHeatmap/createHeatmapController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Streaming L2 order-book accumulator.
3
+ *
4
+ * Maintains two `Map<tickIndex, size>` (one per side). Prices are quantized
5
+ * to integer tick indices on the way in and dequantized on the way out, so
6
+ * consumers never need to know `tickSize`. A BTree is overkill here — the
7
+ * snapshot path sorts once per snapshot, which the controller calls at most
8
+ * every ~100ms, while applyDelta runs per-tick. Maps + lazy sort is the
9
+ * pragmatic choice the roadmap recommends.
10
+ *
11
+ * `maxLevels`, when set, truncates the snapshot to the levels closest to the
12
+ * best bid/ask. We do not drop levels from the underlying map — a quote that
13
+ * was outside the window may move back in via a subsequent delta. Truncation
14
+ * is purely a snapshot-time concern.
15
+ */
16
+ import type { OrderBookState, OrderBookStateOptions } from './types';
17
+ export declare function createOrderBookState(opts: OrderBookStateOptions): OrderBookState;
18
+ //# sourceMappingURL=createOrderBookState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createOrderBookState.d.ts","sourceRoot":"","sources":["../../../src/components/orderBookHeatmap/createOrderBookState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAGR,cAAc,EACd,qBAAqB,EACxB,MAAM,SAAS,CAAA;AAKhB,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,qBAAqB,GAC5B,cAAc,CAuFhB"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Streaming L2 order-book accumulator.
3
+ *
4
+ * Maintains two `Map<tickIndex, size>` (one per side). Prices are quantized
5
+ * to integer tick indices on the way in and dequantized on the way out, so
6
+ * consumers never need to know `tickSize`. A BTree is overkill here — the
7
+ * snapshot path sorts once per snapshot, which the controller calls at most
8
+ * every ~100ms, while applyDelta runs per-tick. Maps + lazy sort is the
9
+ * pragmatic choice the roadmap recommends.
10
+ *
11
+ * `maxLevels`, when set, truncates the snapshot to the levels closest to the
12
+ * best bid/ask. We do not drop levels from the underlying map — a quote that
13
+ * was outside the window may move back in via a subsequent delta. Truncation
14
+ * is purely a snapshot-time concern.
15
+ */
16
+ import { KLineChartError } from '../../errors';
17
+ const EMPTY = [];
18
+ export function createOrderBookState(opts) {
19
+ if (!(opts.tickSize > 0) || !Number.isFinite(opts.tickSize)) {
20
+ throw new KLineChartError('HEATMAP_CONFIG_INVALID', 'createOrderBookState: tickSize must be a positive finite number');
21
+ }
22
+ const tickSize = opts.tickSize;
23
+ const maxLevels = opts.maxLevels === undefined ? Infinity : Math.max(0, Math.floor(opts.maxLevels));
24
+ // tickIndex (integer) → size
25
+ const bids = new Map();
26
+ const asks = new Map();
27
+ let lastTs = 0;
28
+ function quantize(price) {
29
+ return Math.round(price / tickSize);
30
+ }
31
+ function dequantize(tick) {
32
+ // Multiplying back can introduce float dust (e.g. 0.1 * 3 !== 0.3). We
33
+ // round to the nearest representable multiple of tickSize. Because
34
+ // tickSize is fixed for the life of the book, the rounding is stable
35
+ // across snapshots so consumers see consistent prices.
36
+ const raw = tick * tickSize;
37
+ // Normalise float representation: derive precision from tickSize.
38
+ const log10 = Math.log10(tickSize);
39
+ const decimals = log10 < 0 ? Math.min(12, Math.ceil(-log10) + 2) : 0;
40
+ if (decimals === 0)
41
+ return raw;
42
+ const factor = Math.pow(10, decimals);
43
+ return Math.round(raw * factor) / factor;
44
+ }
45
+ function applyDelta(delta) {
46
+ if (!Number.isFinite(delta.price) || !Number.isFinite(delta.size))
47
+ return;
48
+ const tick = quantize(delta.price);
49
+ const map = delta.side === 'bid' ? bids : asks;
50
+ if (delta.size === 0) {
51
+ map.delete(tick);
52
+ }
53
+ else if (delta.size > 0) {
54
+ map.set(tick, delta.size);
55
+ }
56
+ else {
57
+ // negative sizes are nonsensical — treat as remove
58
+ map.delete(tick);
59
+ }
60
+ if (delta.timestamp > lastTs)
61
+ lastTs = delta.timestamp;
62
+ }
63
+ function sortAndTruncate(map, direction) {
64
+ if (map.size === 0)
65
+ return EMPTY;
66
+ // Pull entries → sort by tick index → dequantize.
67
+ const ticks = [];
68
+ for (const k of map.keys())
69
+ ticks.push(k);
70
+ if (direction === 'desc')
71
+ ticks.sort((a, b) => b - a);
72
+ else
73
+ ticks.sort((a, b) => a - b);
74
+ const limit = Number.isFinite(maxLevels)
75
+ ? Math.min(ticks.length, maxLevels)
76
+ : ticks.length;
77
+ const out = new Array(limit);
78
+ for (let i = 0; i < limit; i++) {
79
+ const tick = ticks[i];
80
+ const size = map.get(tick);
81
+ out[i] = [dequantize(tick), size];
82
+ }
83
+ return out;
84
+ }
85
+ function snapshot() {
86
+ return {
87
+ bids: sortAndTruncate(bids, 'desc'),
88
+ asks: sortAndTruncate(asks, 'asc'),
89
+ timestamp: lastTs,
90
+ };
91
+ }
92
+ function clear() {
93
+ bids.clear();
94
+ asks.clear();
95
+ lastTs = 0;
96
+ }
97
+ function lastTimestamp() {
98
+ return lastTs;
99
+ }
100
+ return { applyDelta, snapshot, clear, lastTimestamp };
101
+ }
102
+ //# sourceMappingURL=createOrderBookState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createOrderBookState.js","sourceRoot":"","sources":["../../../src/components/orderBookHeatmap/createOrderBookState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Append-only delta log for replay.
3
+ *
4
+ * Background (PR23 critique): the snapshot ring samples the book at fixed
5
+ * intervals — sub-interval "flash orders" (place + cancel within a single
6
+ * sampling window) never appear in the ring. The archive solves this by
7
+ * preserving the raw delta stream so replay can reconstruct any sub-interval
8
+ * state by fold-left.
9
+ *
10
+ * Storage: V8 handles `push` on large arrays well in practice, but holding
11
+ * one >1M-entry contiguous array makes shrink/trim more expensive than it
12
+ * needs to be (the engine reallocates the entire backing store). We chunk
13
+ * into 10 k-entry segments instead — the same total memory but trim drops
14
+ * whole chunks cheaply and range queries seek to the right chunk first.
15
+ *
16
+ * `range(from, to)` returns deltas with `from ≤ ts ≤ to` (inclusive both
17
+ * sides). Within a chunk we use a binary search on timestamps; deltas are
18
+ * appended in arrival order which is generally — but not strictly —
19
+ * monotonic in timestamp. We tolerate small out-of-order arrivals by
20
+ * widening the search window inside chunks; cross-chunk order is preserved
21
+ * by the chunk index alone.
22
+ */
23
+ import type { DeltaArchive, DeltaArchiveOptions } from './types';
24
+ export declare function createDeltaArchive(opts?: DeltaArchiveOptions): DeltaArchive;
25
+ //# sourceMappingURL=deltaArchive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deltaArchive.d.ts","sourceRoot":"","sources":["../../../src/components/orderBookHeatmap/deltaArchive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAkB,MAAM,SAAS,CAAA;AAIhF,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,YAAY,CAqF3E"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Append-only delta log for replay.
3
+ *
4
+ * Background (PR23 critique): the snapshot ring samples the book at fixed
5
+ * intervals — sub-interval "flash orders" (place + cancel within a single
6
+ * sampling window) never appear in the ring. The archive solves this by
7
+ * preserving the raw delta stream so replay can reconstruct any sub-interval
8
+ * state by fold-left.
9
+ *
10
+ * Storage: V8 handles `push` on large arrays well in practice, but holding
11
+ * one >1M-entry contiguous array makes shrink/trim more expensive than it
12
+ * needs to be (the engine reallocates the entire backing store). We chunk
13
+ * into 10 k-entry segments instead — the same total memory but trim drops
14
+ * whole chunks cheaply and range queries seek to the right chunk first.
15
+ *
16
+ * `range(from, to)` returns deltas with `from ≤ ts ≤ to` (inclusive both
17
+ * sides). Within a chunk we use a binary search on timestamps; deltas are
18
+ * appended in arrival order which is generally — but not strictly —
19
+ * monotonic in timestamp. We tolerate small out-of-order arrivals by
20
+ * widening the search window inside chunks; cross-chunk order is preserved
21
+ * by the chunk index alone.
22
+ */
23
+ const CHUNK_SIZE = 10_000;
24
+ export function createDeltaArchive(opts) {
25
+ const chunks = [[]];
26
+ let total = 0;
27
+ let maxSize = opts?.maxSize !== undefined ? Math.max(0, opts.maxSize) : Infinity;
28
+ function append(delta) {
29
+ let last = chunks[chunks.length - 1];
30
+ if (last.length >= CHUNK_SIZE) {
31
+ last = [];
32
+ chunks.push(last);
33
+ }
34
+ last.push(delta);
35
+ total++;
36
+ if (Number.isFinite(maxSize) && total > maxSize) {
37
+ trim(maxSize);
38
+ }
39
+ }
40
+ function range(fromTimestamp, toTimestamp) {
41
+ if (total === 0)
42
+ return [];
43
+ if (fromTimestamp > toTimestamp)
44
+ return [];
45
+ const out = [];
46
+ // Linear scan with early-exit per chunk on chunk-min timestamp.
47
+ // Cheaper than maintaining per-chunk indices and good enough since
48
+ // chunks are bounded; full scan worst-case is O(total) which the
49
+ // contract allows.
50
+ for (const chunk of chunks) {
51
+ if (chunk.length === 0)
52
+ continue;
53
+ // Find min/max timestamps in chunk by scanning the ends —
54
+ // because appends are mostly monotonic, ends are reliable
55
+ // bounds in the vast majority of cases. Wider safety: scan all.
56
+ for (const d of chunk) {
57
+ if (d.timestamp >= fromTimestamp && d.timestamp <= toTimestamp) {
58
+ out.push(d);
59
+ }
60
+ }
61
+ }
62
+ return out;
63
+ }
64
+ function size() {
65
+ return total;
66
+ }
67
+ function clear() {
68
+ chunks.length = 0;
69
+ chunks.push([]);
70
+ total = 0;
71
+ }
72
+ function trim(maxKeep) {
73
+ const target = Math.max(0, Math.floor(maxKeep));
74
+ if (total <= target)
75
+ return;
76
+ let toDrop = total - target;
77
+ // Drop whole oldest chunks first.
78
+ while (toDrop > 0 && chunks.length > 1 && chunks[0].length <= toDrop) {
79
+ toDrop -= chunks[0].length;
80
+ total -= chunks[0].length;
81
+ chunks.shift();
82
+ }
83
+ // Then drop from the head of the first surviving chunk.
84
+ if (toDrop > 0 && chunks.length > 0) {
85
+ const head = chunks[0];
86
+ if (toDrop >= head.length) {
87
+ total -= head.length;
88
+ head.length = 0;
89
+ }
90
+ else {
91
+ head.splice(0, toDrop);
92
+ total -= toDrop;
93
+ }
94
+ }
95
+ if (chunks.length === 0)
96
+ chunks.push([]);
97
+ }
98
+ return {
99
+ append,
100
+ range,
101
+ size,
102
+ clear,
103
+ trim,
104
+ };
105
+ }
106
+ //# sourceMappingURL=deltaArchive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deltaArchive.js","sourceRoot":"","sources":["../../../src/components/orderBookHeatmap/deltaArchive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Public surface of the order-book heatmap module.
3
+ *
4
+ * Consumers should import from this barrel; nothing here is wired into
5
+ * `packages/core/src/index.ts` yet (the renderer integration lands in P1).
6
+ */
7
+ export { createOrderBookState } from './createOrderBookState';
8
+ export { createSnapshotRing } from './snapshotRing';
9
+ export { createDeltaArchive } from './deltaArchive';
10
+ export { createLogColorScale } from './logColorScale';
11
+ export { createHeatmapController } from './createHeatmapController';
12
+ export type { BookSnapshot, DeltaArchive, DeltaArchiveOptions, HeatmapController, HeatmapControllerConfig, HeatmapState, LogColorScale, OrderBookDelta, OrderBookState, OrderBookStateOptions, SnapshotRing, } from './types';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/orderBookHeatmap/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,YAAY,EACR,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,YAAY,GACf,MAAM,SAAS,CAAA"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Public surface of the order-book heatmap module.
3
+ *
4
+ * Consumers should import from this barrel; nothing here is wired into
5
+ * `packages/core/src/index.ts` yet (the renderer integration lands in P1).
6
+ */
7
+ export { createOrderBookState } from './createOrderBookState';
8
+ export { createSnapshotRing } from './snapshotRing';
9
+ export { createDeltaArchive } from './deltaArchive';
10
+ export { createLogColorScale } from './logColorScale';
11
+ export { createHeatmapController } from './createHeatmapController';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/orderBookHeatmap/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Logarithmic intensity scale for heatmap coloring.
3
+ *
4
+ * ROADMAP §3.2 calls this out specifically. Order-book size distribution
5
+ * spans several orders of magnitude — a linear color scale washes out the
6
+ * fine structure. The mapping is:
7
+ *
8
+ * intensity = (ln(size) - ln(sizeMin)) / (ln(sizeMax) - ln(sizeMin))
9
+ *
10
+ * Edge cases (all return a value in `[0, 1]`):
11
+ *
12
+ * size ≤ 0 → 0
13
+ * size ≤ sizeMin → 0
14
+ * size ≥ sizeMax → 1
15
+ * sizeMin === sizeMax (degenerate) → 0.5 for any positive size
16
+ * sizeMin or sizeMax not strictly positive → throw at construction
17
+ */
18
+ import type { LogColorScale } from './types';
19
+ export declare function createLogColorScale(sizeMin: number, sizeMax: number): LogColorScale;
20
+ //# sourceMappingURL=logColorScale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logColorScale.d.ts","sourceRoot":"","sources":["../../../src/components/orderBookHeatmap/logColorScale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG5C,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAChB,aAAa,CAwCf"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Logarithmic intensity scale for heatmap coloring.
3
+ *
4
+ * ROADMAP §3.2 calls this out specifically. Order-book size distribution
5
+ * spans several orders of magnitude — a linear color scale washes out the
6
+ * fine structure. The mapping is:
7
+ *
8
+ * intensity = (ln(size) - ln(sizeMin)) / (ln(sizeMax) - ln(sizeMin))
9
+ *
10
+ * Edge cases (all return a value in `[0, 1]`):
11
+ *
12
+ * size ≤ 0 → 0
13
+ * size ≤ sizeMin → 0
14
+ * size ≥ sizeMax → 1
15
+ * sizeMin === sizeMax (degenerate) → 0.5 for any positive size
16
+ * sizeMin or sizeMax not strictly positive → throw at construction
17
+ */
18
+ import { KLineChartError } from '../../errors';
19
+ export function createLogColorScale(sizeMin, sizeMax) {
20
+ let lo = sizeMin;
21
+ let hi = sizeMax;
22
+ let lnLo = 0;
23
+ let lnHi = 0;
24
+ let lnSpan = 0;
25
+ function recompute() {
26
+ validate(lo, hi);
27
+ lnLo = Math.log(lo);
28
+ lnHi = Math.log(hi);
29
+ lnSpan = lnHi - lnLo;
30
+ }
31
+ function intensity(size) {
32
+ if (!(size > 0))
33
+ return 0;
34
+ if (lnSpan === 0) {
35
+ // Degenerate range: any positive size maps to the midpoint.
36
+ return 0.5;
37
+ }
38
+ if (size <= lo)
39
+ return 0;
40
+ if (size >= hi)
41
+ return 1;
42
+ const t = (Math.log(size) - lnLo) / lnSpan;
43
+ if (t <= 0)
44
+ return 0;
45
+ if (t >= 1)
46
+ return 1;
47
+ return t;
48
+ }
49
+ function setRange(nextMin, nextMax) {
50
+ lo = nextMin;
51
+ hi = nextMax;
52
+ recompute();
53
+ }
54
+ function range() {
55
+ return { sizeMin: lo, sizeMax: hi };
56
+ }
57
+ recompute();
58
+ return { intensity, setRange, range };
59
+ }
60
+ function validate(lo, hi) {
61
+ if (!(lo > 0) || !Number.isFinite(lo)) {
62
+ throw new KLineChartError('HEATMAP_CONFIG_INVALID', 'createLogColorScale: sizeMin must be a positive finite number');
63
+ }
64
+ if (!(hi > 0) || !Number.isFinite(hi)) {
65
+ throw new KLineChartError('HEATMAP_CONFIG_INVALID', 'createLogColorScale: sizeMax must be a positive finite number');
66
+ }
67
+ if (hi < lo) {
68
+ throw new KLineChartError('HEATMAP_CONFIG_INVALID', 'createLogColorScale: sizeMax must be ≥ sizeMin');
69
+ }
70
+ }
71
+ //# sourceMappingURL=logColorScale.js.map