velo-plot 2.20.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/README.md +26 -12
  2. package/dist/ChartCore-AnR_3Xkb.js +7338 -0
  3. package/dist/ChartCore-AnR_3Xkb.js.map +1 -0
  4. package/dist/GpuChartRenderer-Dxc0hrQA.js +75 -0
  5. package/dist/GpuChartRenderer-Dxc0hrQA.js.map +1 -0
  6. package/dist/{index.core-COREBDNq.js → PluginRegistry-CzMHebYP.js} +24 -38
  7. package/dist/PluginRegistry-CzMHebYP.js.map +1 -0
  8. package/dist/a11y-Bw6urYpr.js +105 -0
  9. package/dist/a11y-Bw6urYpr.js.map +1 -0
  10. package/dist/angular/hooks-entry.d.ts +1 -0
  11. package/dist/angular/hooks.d.ts +26 -0
  12. package/dist/angular/index.d.ts +8 -0
  13. package/dist/angular/velo-plot.component.d.ts +46 -0
  14. package/dist/angular-hooks.d.ts +1 -0
  15. package/dist/angular-hooks.js +9 -0
  16. package/dist/angular-hooks.js.map +1 -0
  17. package/dist/angular.d.ts +1 -0
  18. package/dist/angular.js +166 -0
  19. package/dist/angular.js.map +1 -0
  20. package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -1
  21. package/dist/astro/StackedPlot.astro +19 -0
  22. package/dist/astro/VeloPlot.astro +23 -0
  23. package/dist/{axisFormat-CzumxpCL.js → axisFormat-Sz4WIJfQ.js} +2 -2
  24. package/dist/{axisFormat-CzumxpCL.js.map → axisFormat-Sz4WIJfQ.js.map} +1 -1
  25. package/dist/bindings/shared/a11y.d.ts +26 -0
  26. package/dist/bindings/shared/chartLifecycle.d.ts +16 -0
  27. package/dist/bindings/shared/chartSyncBridge.d.ts +8 -0
  28. package/dist/bindings/shared/dimensions.d.ts +1 -0
  29. package/dist/bindings/shared/index.d.ts +9 -0
  30. package/dist/bindings/shared/indicatorBridge.d.ts +11 -0
  31. package/dist/bindings/shared/optionsSync.d.ts +7 -0
  32. package/dist/bindings/shared/seriesDiff.d.ts +8 -0
  33. package/dist/bindings/shared/stackedSync.d.ts +9 -0
  34. package/dist/bindings/shared/types.d.ts +46 -0
  35. package/dist/bindings/test-utils/index.d.ts +35 -0
  36. package/dist/bindings/test-utils/mockLifecycle.d.ts +120 -0
  37. package/dist/bindings/test-utils/vitestSveltePlugin.d.ts +3 -0
  38. package/dist/chartSyncBridge-D_rCtbFq.js +58 -0
  39. package/dist/chartSyncBridge-D_rCtbFq.js.map +1 -0
  40. package/dist/core/Chart.d.ts +1 -1
  41. package/dist/core/ChartStatistics.d.ts +1 -1
  42. package/dist/core/InteractionManager.d.ts +7 -1
  43. package/dist/core/OverlayRenderer.d.ts +5 -0
  44. package/dist/core/annotations/types.d.ts +1 -1
  45. package/dist/core/chart/ChartCore.d.ts +14 -19
  46. package/dist/core/chart/ChartFeatureHooks.d.ts +7 -0
  47. package/dist/core/chart/chartExportPatch.d.ts +2 -0
  48. package/dist/core/chart/overlaySeriesRegistry.d.ts +7 -0
  49. package/dist/core/chart/series/SeriesActions.d.ts +1 -0
  50. package/dist/core/chart/series/SeriesBufferLite.d.ts +13 -0
  51. package/dist/core/chart/series/seriesOptionsRegistry.d.ts +8 -0
  52. package/dist/core/chart/series/seriesTypeRegistry.d.ts +5 -0
  53. package/dist/core/chart/types.d.ts +1 -1
  54. package/dist/core/clipboard/index.d.ts +1 -1
  55. package/dist/core/debug/index.d.ts +1 -1
  56. package/dist/core/keybindings/index.d.ts +1 -1
  57. package/dist/core/loading/index.d.ts +1 -1
  58. package/dist/core/locale/index.d.ts +1 -1
  59. package/dist/core/stacked/paneResize.d.ts +3 -0
  60. package/dist/core/stacked/types.d.ts +10 -0
  61. package/dist/core/theme-editor/index.d.ts +1 -1
  62. package/dist/createStackedChart-DqcLCFGS.js +1338 -0
  63. package/dist/createStackedChart-DqcLCFGS.js.map +1 -0
  64. package/dist/examples/PluginDemonstration.d.ts +1 -1
  65. package/dist/hooks-DH-3bewj.js +69 -0
  66. package/dist/hooks-DH-3bewj.js.map +1 -0
  67. package/dist/{index-BBpJwOct.js → index-0InEyj0q.js} +119 -121
  68. package/dist/index-0InEyj0q.js.map +1 -0
  69. package/dist/{index-qunX30Xu.js → index-B7PTX94B.js} +2133 -2133
  70. package/dist/index-B7PTX94B.js.map +1 -0
  71. package/dist/{index-BMiZoKmm.js → index-BgrvqltV.js} +67 -67
  72. package/dist/index-BgrvqltV.js.map +1 -0
  73. package/dist/{index-DoYxf1cV.js → index-CWxIHdwX.js} +38 -98
  74. package/dist/index-CWxIHdwX.js.map +1 -0
  75. package/dist/index-CaXWSOTk.js.map +1 -1
  76. package/dist/{mockDatafeed-927foCM4.js → index-Cv6ZDLWf.js} +227 -217
  77. package/dist/index-Cv6ZDLWf.js.map +1 -0
  78. package/dist/index-Dag88bW4.js.map +1 -1
  79. package/dist/index-qhscKTDy.js.map +1 -1
  80. package/dist/index.core.d.ts +9 -7
  81. package/dist/index.d.ts +2 -15
  82. package/dist/indicators--eJGmVox.js.map +1 -1
  83. package/dist/optionsSync-QUiN4Inw.js +119 -0
  84. package/dist/optionsSync-QUiN4Inw.js.map +1 -0
  85. package/dist/plugins/3d/index.d.ts +2 -2
  86. package/dist/plugins/3d.d.ts +2 -2
  87. package/dist/plugins/3d.js +3 -1
  88. package/dist/plugins/3d.js.map +1 -1
  89. package/dist/plugins/analysis/index.d.ts +1 -1
  90. package/dist/plugins/analysis/indicators.d.ts +1 -1
  91. package/dist/plugins/analysis.d.ts +2 -2
  92. package/dist/plugins/analysis.js +2 -2
  93. package/dist/plugins/analysis.js.map +1 -1
  94. package/dist/plugins/annotations/index.d.ts +1 -1
  95. package/dist/plugins/annotations.d.ts +2 -2
  96. package/dist/plugins/annotations.js.map +1 -1
  97. package/dist/plugins/anomaly-detection.js +1 -1
  98. package/dist/plugins/anomaly-detection.js.map +1 -1
  99. package/dist/plugins/broken-axis.d.ts +2 -2
  100. package/dist/plugins/builtins/crosshair/CrosshairPlugin.d.ts +1 -1
  101. package/dist/plugins/builtins/index.d.ts +1 -1
  102. package/dist/plugins/caching.d.ts +2 -2
  103. package/dist/plugins/clipboard/index.d.ts +2 -2
  104. package/dist/plugins/clipboard.d.ts +2 -2
  105. package/dist/plugins/clipboard.js.map +1 -1
  106. package/dist/plugins/context-menu/index.d.ts +1 -1
  107. package/dist/plugins/context-menu.d.ts +2 -2
  108. package/dist/plugins/context-menu.js +1 -1
  109. package/dist/plugins/context-menu.js.map +1 -1
  110. package/dist/plugins/createPlugin.d.ts +8 -0
  111. package/dist/plugins/data-export/index.d.ts +1 -1
  112. package/dist/plugins/data-export.d.ts +2 -2
  113. package/dist/plugins/data-export.js +2 -2
  114. package/dist/plugins/data-export.js.map +1 -1
  115. package/dist/plugins/data-transform.d.ts +2 -2
  116. package/dist/plugins/data-transform.js +19 -19
  117. package/dist/plugins/data-transform.js.map +1 -1
  118. package/dist/plugins/debug/index.d.ts +2 -2
  119. package/dist/plugins/debug.d.ts +2 -2
  120. package/dist/plugins/debug.js +33 -33
  121. package/dist/plugins/debug.js.map +1 -1
  122. package/dist/plugins/forecasting/index.d.ts +1 -1
  123. package/dist/plugins/forecasting.js.map +1 -1
  124. package/dist/plugins/gpu/index.d.ts +2 -2
  125. package/dist/plugins/gpu.d.ts +2 -2
  126. package/dist/plugins/gpu.js +2033 -209
  127. package/dist/plugins/gpu.js.map +1 -1
  128. package/dist/plugins/i18n/index.d.ts +2 -2
  129. package/dist/plugins/i18n.d.ts +2 -2
  130. package/dist/plugins/i18n.js +286 -23
  131. package/dist/plugins/i18n.js.map +1 -1
  132. package/dist/plugins/index.d.ts +1 -1
  133. package/dist/plugins/keyboard.d.ts +2 -2
  134. package/dist/plugins/keyboard.js +65 -5
  135. package/dist/plugins/keyboard.js.map +1 -1
  136. package/dist/plugins/latex.js +766 -207
  137. package/dist/plugins/latex.js.map +1 -1
  138. package/dist/plugins/lazy-load.d.ts +2 -2
  139. package/dist/plugins/loading/index.d.ts +2 -3
  140. package/dist/plugins/loading.d.ts +2 -2
  141. package/dist/plugins/loading.js +3 -4
  142. package/dist/plugins/ml-integration.d.ts +2 -2
  143. package/dist/plugins/ml-integration.js +5 -5
  144. package/dist/plugins/ml-integration.js.map +1 -1
  145. package/dist/plugins/offscreen.d.ts +2 -2
  146. package/dist/plugins/offscreen.js +11 -10
  147. package/dist/plugins/offscreen.js.map +1 -1
  148. package/dist/plugins/pattern-recognition.d.ts +2 -2
  149. package/dist/plugins/pattern-recognition.js +1 -1
  150. package/dist/plugins/pattern-recognition.js.map +1 -1
  151. package/dist/plugins/radar.d.ts +2 -2
  152. package/dist/plugins/regression.d.ts +2 -2
  153. package/dist/plugins/regression.js +255 -257
  154. package/dist/plugins/regression.js.map +1 -1
  155. package/dist/plugins/roi.js +9 -9
  156. package/dist/plugins/roi.js.map +1 -1
  157. package/dist/plugins/snapshot/index.d.ts +1 -1
  158. package/dist/plugins/snapshot/types.d.ts +1 -1
  159. package/dist/plugins/snapshot.d.ts +2 -2
  160. package/dist/plugins/snapshot.js.map +1 -1
  161. package/dist/plugins/streaming/index.d.ts +2 -2
  162. package/dist/plugins/streaming.d.ts +2 -2
  163. package/dist/plugins/streaming.js +1 -1
  164. package/dist/plugins/sync/index.d.ts +3 -2
  165. package/dist/plugins/sync.d.ts +2 -2
  166. package/dist/plugins/sync.js.map +1 -1
  167. package/dist/plugins/theme-editor/index.d.ts +1 -1
  168. package/dist/plugins/theme-editor.d.ts +2 -2
  169. package/dist/plugins/tools/index.d.ts +1 -1
  170. package/dist/plugins/tools/tooltip/index.d.ts +1 -1
  171. package/dist/plugins/tools.d.ts +2 -2
  172. package/dist/plugins/tools.js +1 -1
  173. package/dist/plugins/types.d.ts +1 -1
  174. package/dist/plugins/video-recorder.d.ts +2 -2
  175. package/dist/plugins/virtualization.d.ts +2 -2
  176. package/dist/plugins/virtualization.js +1 -1
  177. package/dist/pool-DZ8shSqv.js +109 -0
  178. package/dist/pool-DZ8shSqv.js.map +1 -0
  179. package/dist/react/StackedPlot.d.ts +31 -0
  180. package/dist/react/VeloPlot.d.ts +29 -0
  181. package/dist/react/index.d.ts +25 -3
  182. package/dist/react/useChartSync.d.ts +8 -0
  183. package/dist/react/useIndicator.d.ts +12 -0
  184. package/dist/react/useVeloPlot.d.ts +19 -0
  185. package/dist/react.js +325 -24
  186. package/dist/react.js.map +1 -1
  187. package/dist/renderer/NativeWebGLRenderer.d.ts +2 -1
  188. package/dist/renderer/native/NativeWebGLRenderer.d.ts +5 -1
  189. package/dist/renderer/native/draw.d.ts +2 -47
  190. package/dist/renderer/native/drawCore.d.ts +27 -0
  191. package/dist/renderer/native/drawExtended.d.ts +29 -0
  192. package/dist/renderer/native/frameRenderExtended.d.ts +1 -0
  193. package/dist/renderer/native/frameRenderRegistry.d.ts +27 -0
  194. package/dist/renderer/native/programFactoryCore.d.ts +6 -0
  195. package/dist/renderer/native/programFactoryExtended.d.ts +4 -0
  196. package/dist/renderer/native/utils.d.ts +3 -29
  197. package/dist/renderer/native/utilsCore.d.ts +14 -0
  198. package/dist/renderer/native/utilsExtended.d.ts +17 -0
  199. package/dist/renderer/overlaySeriesExtended.d.ts +1 -0
  200. package/dist/renderer/registerExtendedSeries.d.ts +1 -0
  201. package/dist/renderer/registerWebGPU.d.ts +2 -0
  202. package/dist/renderer/seriesBufferExtended.d.ts +4 -0
  203. package/dist/scientific/index.d.ts +44 -0
  204. package/dist/scientific/registerScientific.d.ts +1 -0
  205. package/dist/scientific.d.ts +1 -0
  206. package/dist/scientific.js +91 -0
  207. package/dist/scientific.js.map +1 -0
  208. package/dist/solid/VeloPlot.d.ts +16 -0
  209. package/dist/solid/index.d.ts +13 -0
  210. package/dist/solid/useChartSync.d.ts +6 -0
  211. package/dist/solid/useIndicator.d.ts +11 -0
  212. package/dist/solid/useStackedPlot.d.ts +14 -0
  213. package/dist/solid/useVeloPlot.d.ts +18 -0
  214. package/dist/solid.d.ts +1 -0
  215. package/dist/solid.js +169 -0
  216. package/dist/solid.js.map +1 -0
  217. package/dist/stackedSync-tnrunZMt.js +100 -0
  218. package/dist/stackedSync-tnrunZMt.js.map +1 -0
  219. package/dist/svelte/StackedPlot.svelte +29 -0
  220. package/dist/svelte/StackedPlot.test.ts +114 -0
  221. package/dist/svelte/VeloPlot.svelte +44 -0
  222. package/dist/svelte/VeloPlot.test.ts +105 -0
  223. package/dist/svelte/index.d.ts +11 -0
  224. package/dist/svelte/index.test.ts +20 -0
  225. package/dist/svelte/index.ts +15 -0
  226. package/dist/svelte/useChartSync.d.ts +8 -0
  227. package/dist/svelte/useChartSync.test.ts +49 -0
  228. package/dist/svelte/useChartSync.ts +29 -0
  229. package/dist/svelte/useIndicator.d.ts +13 -0
  230. package/dist/svelte/useIndicator.test.ts +67 -0
  231. package/dist/svelte/useIndicator.ts +43 -0
  232. package/dist/svelte/useStackedPlot.d.ts +16 -0
  233. package/dist/svelte/useStackedPlot.test.ts +76 -0
  234. package/dist/svelte/useStackedPlot.ts +54 -0
  235. package/dist/svelte/useVeloPlot.d.ts +21 -0
  236. package/dist/svelte/useVeloPlot.test.ts +100 -0
  237. package/dist/svelte/useVeloPlot.ts +81 -0
  238. package/dist/svelte.d.ts +1 -0
  239. package/dist/svelte.js +140 -0
  240. package/dist/svelte.js.map +1 -0
  241. package/dist/testing/index.d.ts +1 -1
  242. package/dist/theme/index.d.ts +2 -1
  243. package/dist/trading/index.d.ts +1 -4
  244. package/dist/trading/registerTrading.d.ts +3 -0
  245. package/dist/trading.js +42 -42
  246. package/dist/types.d.ts +4 -4
  247. package/dist/{utils-BK5UUXxj.js → utils-Dx0h0bgQ.js} +9 -9
  248. package/dist/{utils-BK5UUXxj.js.map → utils-Dx0h0bgQ.js.map} +1 -1
  249. package/dist/velo-plot.full.js +2216 -1346
  250. package/dist/velo-plot.full.js.map +1 -1
  251. package/dist/velo-plot.js +33 -28
  252. package/dist/velo-plot.js.map +1 -1
  253. package/dist/vue/StackedPlot.vue.d.ts +48 -0
  254. package/dist/vue/VeloPlot.vue.d.ts +64 -0
  255. package/dist/vue/index.d.ts +250 -0
  256. package/dist/vue/useChartSync.d.ts +52 -0
  257. package/dist/vue/useIndicator.d.ts +23 -0
  258. package/dist/vue/useStackedPlot.d.ts +15 -0
  259. package/dist/vue/useVeloPlot.d.ts +20 -0
  260. package/dist/vue.d.ts +1 -0
  261. package/dist/vue.js +309 -0
  262. package/dist/vue.js.map +1 -0
  263. package/dist/workers/indicatorsAsync.d.ts +2 -0
  264. package/dist/workers/pool.d.ts +9 -0
  265. package/package.json +96 -10
  266. package/dist/ChartCore-ivzLqxVb.js +0 -8350
  267. package/dist/ChartCore-ivzLqxVb.js.map +0 -1
  268. package/dist/SciPlot-CEU4ApgD.js +0 -463
  269. package/dist/SciPlot-CEU4ApgD.js.map +0 -1
  270. package/dist/createStackedChart-DxNW0VkF.js +0 -705
  271. package/dist/createStackedChart-DxNW0VkF.js.map +0 -1
  272. package/dist/gpuRenderer-BpaMYz-k.js +0 -1848
  273. package/dist/gpuRenderer-BpaMYz-k.js.map +0 -1
  274. package/dist/index-BBpJwOct.js.map +0 -1
  275. package/dist/index-BMiZoKmm.js.map +0 -1
  276. package/dist/index-DoYxf1cV.js.map +0 -1
  277. package/dist/index-qunX30Xu.js.map +0 -1
  278. package/dist/index-x4stH3jD.js +0 -282
  279. package/dist/index-x4stH3jD.js.map +0 -1
  280. package/dist/index.core-COREBDNq.js.map +0 -1
  281. package/dist/mockDatafeed-927foCM4.js.map +0 -1
  282. package/dist/pool-15HMCNv8.js +0 -88
  283. package/dist/pool-15HMCNv8.js.map +0 -1
  284. package/dist/react/SciPlot.d.ts +0 -60
  285. package/dist/react/useSciPlot.d.ts +0 -56
  286. package/dist/symbols-DT0eLlpW.js +0 -568
  287. package/dist/symbols-DT0eLlpW.js.map +0 -1
@@ -1,13 +1,13 @@
1
1
  var p = Object.defineProperty;
2
2
  var m = (o, e, r) => e in o ? p(o, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : o[e] = r;
3
- var f = (o, e, r) => m(o, typeof e != "symbol" ? e + "" : e, r);
3
+ var c = (o, e, r) => m(o, typeof e != "symbol" ? e + "" : e, r);
4
4
  class g {
5
5
  // taskId => workerIndex
6
6
  constructor(e) {
7
- f(this, "workers", []);
8
- f(this, "availableWorkers", /* @__PURE__ */ new Set());
9
- f(this, "taskQueue", []);
10
- f(this, "activeJobs", /* @__PURE__ */ new Map());
7
+ c(this, "workers", []);
8
+ c(this, "availableWorkers", /* @__PURE__ */ new Set());
9
+ c(this, "taskQueue", []);
10
+ c(this, "activeJobs", /* @__PURE__ */ new Map());
11
11
  this.size = e, this.initialize();
12
12
  }
13
13
  initialize() {
@@ -104,14 +104,15 @@ const w = {
104
104
  };
105
105
  function y(o = {}) {
106
106
  const e = { ...v, ...o };
107
- let r = null, t = null, s = {
107
+ let r = null, t = null;
108
+ const s = {
108
109
  enabled: e.enabled,
109
110
  frames: 0,
110
111
  lastFrameTime: 0,
111
112
  lastFrameTimestamp: 0
112
113
  };
113
- function i(a, ...c) {
114
- e.debug && r && r.log.info(`[Offscreen] ${a}`, ...c);
114
+ function i(a, ...f) {
115
+ e.debug && r && r.log.info(`[Offscreen] ${a}`, ...f);
115
116
  }
116
117
  function n() {
117
118
  return typeof globalThis.OffscreenCanvas < "u";
@@ -156,8 +157,8 @@ function y(o = {}) {
156
157
  onDestroy(a) {
157
158
  d(), delete a.chart.offscreen, r = null;
158
159
  },
159
- onAfterRender(a, c) {
160
- s.frames += 1, s.lastFrameTime = c.renderTime, s.lastFrameTimestamp = c.timestamp, e.enabled;
160
+ onAfterRender(a, f) {
161
+ s.frames += 1, s.lastFrameTime = f.renderTime, s.lastFrameTimestamp = f.timestamp, e.enabled;
161
162
  },
162
163
  api: u
163
164
  };
@@ -1 +1 @@
1
- {"version":3,"file":"offscreen.js","sources":["../../src/plugins/offscreen/pool.ts","../../src/plugins/offscreen/index.ts"],"sourcesContent":["/**\n * @fileoverview Worker Pool Manager for Offscreen Rendering\n * @module plugins/offscreen/pool\n */\n\nexport interface WorkerTask {\n id: string;\n priority: number;\n timestamp: number;\n resolve: (value: ImageBitmap) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private availableWorkers: Set<number> = new Set();\n private taskQueue: WorkerTask[] = [];\n private activeJobs: Map<string, number> = new Map(); // taskId => workerIndex\n\n constructor(private size: number) {\n this.initialize();\n }\n\n private initialize(): void {\n const workerCode = `\n // Simple offscreen worker\n self.onmessage = (e) => {\n const { type, width, height, dpr } = e.data;\n \n if (type === 'render') {\n // Echo back - actual rendering logic would go here\n self.postMessage({ type: 'response', taskId: e.data.taskId });\n }\n };\n `;\n\n const blob = new Blob([workerCode], { type: 'application/javascript' });\n const workerUrl = URL.createObjectURL(blob);\n\n for (let i = 0; i < this.size; i++) {\n try {\n const worker = new Worker(workerUrl);\n worker.onmessage = (e) => this.handleWorkerMessage(i, e);\n worker.onerror = (e) => this.handleWorkerError(i, e);\n this.workers.push(worker);\n this.availableWorkers.add(i);\n } catch (error) {\n console.error(`Failed to create worker ${i}:`, error);\n }\n }\n\n URL.revokeObjectURL(workerUrl);\n }\n\n private handleWorkerMessage(workerIndex: number, event: MessageEvent): void {\n const { type, taskId, imageData, error } = event.data;\n\n if (type === 'response') {\n const task = this.findTask(taskId);\n if (task) {\n if (error) {\n task.reject(new Error(error));\n } else if (imageData) {\n task.resolve(imageData);\n }\n this.activeJobs.delete(taskId);\n this.availableWorkers.add(workerIndex);\n this.processQueue();\n }\n }\n }\n\n private handleWorkerError(workerIndex: number, error: ErrorEvent): void {\n console.error(`Worker ${workerIndex} error:`, error);\n // Find and reject any active task for this worker\n for (const [taskId, wIndex] of this.activeJobs.entries()) {\n if (wIndex === workerIndex) {\n const task = this.findTask(taskId);\n if (task) {\n task.reject(new Error(`Worker error: ${error.message}`));\n this.activeJobs.delete(taskId);\n }\n }\n }\n this.availableWorkers.add(workerIndex);\n this.processQueue();\n }\n\n private findTask(taskId: string): WorkerTask | undefined {\n return this.taskQueue.find(t => t.id === taskId);\n }\n\n private processQueue(): void {\n while (this.availableWorkers.size > 0 && this.taskQueue.length > 0) {\n // Sort by priority and timestamp\n this.taskQueue.sort((a, b) => {\n if (a.priority !== b.priority) return b.priority - a.priority;\n return a.timestamp - b.timestamp;\n });\n\n const task = this.taskQueue.shift();\n if (!task) break;\n\n const workerIndex = Array.from(this.availableWorkers)[0];\n this.availableWorkers.delete(workerIndex);\n this.activeJobs.set(task.id, workerIndex);\n\n // Send task to worker\n this.workers[workerIndex].postMessage({\n type: 'render',\n taskId: task.id,\n });\n }\n }\n\n public submit(priority: number = 0): Promise<ImageBitmap> {\n return new Promise((resolve, reject) => {\n const task: WorkerTask = {\n id: Math.random().toString(36).substring(7),\n priority,\n timestamp: Date.now(),\n resolve,\n reject,\n };\n\n this.taskQueue.push(task);\n this.processQueue();\n });\n }\n\n public getStats() {\n return {\n total: this.workers.length,\n active: this.activeJobs.size,\n idle: this.availableWorkers.size,\n queued: this.taskQueue.length,\n };\n }\n\n public destroy(): void {\n for (const worker of this.workers) {\n worker.terminate();\n }\n this.workers = [];\n this.availableWorkers.clear();\n this.taskQueue = [];\n this.activeJobs.clear();\n }\n}\n","/**\n * @fileoverview Offscreen rendering plugin (skeleton with stats + feature detection)\n * @module plugins/offscreen\n */\n\nimport type {\n PluginOffscreenConfig,\n OffscreenAPI,\n OffscreenStats,\n} from \"./types\";\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-offscreen\",\n version: \"1.0.0\",\n description: \"Offscreen rendering support with worker-ready scaffolding\",\n provides: [\"performance\", \"offscreen\"],\n tags: [\"performance\", \"offscreen\", \"worker\"],\n};\n\nconst DEFAULT_CONFIG: Required<PluginOffscreenConfig> = {\n enabled: false,\n mode: \"auto\",\n workerPool: 1,\n transfer: \"offscreen\",\n fallback: \"main-thread\",\n debug: false,\n};\n\nimport { WorkerPool } from \"./pool\";\n\nexport function PluginOffscreen(\n userConfig: Partial<PluginOffscreenConfig> = {}\n): ChartPlugin<PluginOffscreenConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n let pool: WorkerPool | null = null;\n let stats: OffscreenStats = {\n enabled: config.enabled,\n frames: 0,\n lastFrameTime: 0,\n lastFrameTimestamp: 0,\n };\n\n function log(message: string, ...args: unknown[]) {\n if (config.debug && ctx) {\n ctx.log.info(`[Offscreen] ${message}`, ...args);\n }\n }\n\n function isSupported(): boolean {\n return typeof (globalThis as any).OffscreenCanvas !== \"undefined\";\n }\n\n function enable(): void {\n if (!isSupported()) {\n log(\"OffscreenCanvas not supported. Falling back to main thread.\");\n if (config.fallback === \"disable\") {\n stats.enabled = false;\n return;\n }\n }\n \n if (!pool) {\n pool = new WorkerPool(config.workerPool || 1);\n }\n \n stats.enabled = true;\n config.enabled = true;\n }\n\n function disable(): void {\n if (pool) {\n pool.destroy();\n pool = null;\n }\n stats.enabled = false;\n config.enabled = false;\n }\n\n function updateConfig(newConfig: Partial<PluginOffscreenConfig>): void {\n Object.assign(config, newConfig);\n if (config.enabled) enable();\n else disable();\n stats.enabled = !!config.enabled;\n }\n\n function getStats(): OffscreenStats {\n const poolStats = pool?.getStats();\n return { \n ...stats,\n activeWorkers: poolStats?.active || 0,\n queuedTasks: poolStats?.queued || 0\n } as any;\n }\n\n function flush(): void {\n ctx?.requestRender();\n }\n\n const api: OffscreenAPI & Record<string, unknown> = {\n enable,\n disable,\n isEnabled: () => stats.enabled,\n updateConfig,\n getStats,\n flush,\n };\n\n return {\n manifest,\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n (ctx.chart as any).offscreen = api;\n if (config.enabled) enable();\n log(`Initialized (pool=${config.workerPool})`);\n },\n onDestroy(pluginCtx: PluginContext) {\n disable();\n delete (pluginCtx.chart as any).offscreen;\n ctx = null;\n },\n onAfterRender(_ctx, event) {\n stats.frames += 1;\n stats.lastFrameTime = event.renderTime;\n stats.lastFrameTimestamp = event.timestamp;\n \n if (config.enabled && pool) {\n // In a real implementation, we would offload the next render piece here\n // For now, we just track that we could have used the pool\n }\n },\n api,\n };\n}\n\nexport default PluginOffscreen;\n\n// Type exports\nexport type {\n PluginOffscreenConfig,\n OffscreenAPI,\n OffscreenStats,\n OffscreenMode,\n OffscreenTransferMode,\n OffscreenFallbackMode,\n} from \"./types\";\n"],"names":["WorkerPool","size","__publicField","workerCode","blob","workerUrl","i","worker","e","error","workerIndex","event","type","taskId","imageData","task","wIndex","t","a","b","priority","resolve","reject","manifest","DEFAULT_CONFIG","PluginOffscreen","userConfig","config","ctx","pool","stats","log","message","args","isSupported","enable","disable","updateConfig","newConfig","getStats","poolStats","flush","api","pluginCtx","_ctx"],"mappings":"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"}
1
+ {"version":3,"file":"offscreen.js","sources":["../../src/plugins/offscreen/pool.ts","../../src/plugins/offscreen/index.ts"],"sourcesContent":["/**\n * @fileoverview Worker Pool Manager for Offscreen Rendering\n * @module plugins/offscreen/pool\n */\n\nexport interface WorkerTask {\n id: string;\n priority: number;\n timestamp: number;\n resolve: (value: ImageBitmap) => void;\n reject: (error: Error) => void;\n}\n\nexport class WorkerPool {\n private workers: Worker[] = [];\n private availableWorkers: Set<number> = new Set();\n private taskQueue: WorkerTask[] = [];\n private activeJobs: Map<string, number> = new Map(); // taskId => workerIndex\n\n constructor(private size: number) {\n this.initialize();\n }\n\n private initialize(): void {\n const workerCode = `\n // Simple offscreen worker\n self.onmessage = (e) => {\n const { type, width, height, dpr } = e.data;\n \n if (type === 'render') {\n // Echo back - actual rendering logic would go here\n self.postMessage({ type: 'response', taskId: e.data.taskId });\n }\n };\n `;\n\n const blob = new Blob([workerCode], { type: 'application/javascript' });\n const workerUrl = URL.createObjectURL(blob);\n\n for (let i = 0; i < this.size; i++) {\n try {\n const worker = new Worker(workerUrl);\n worker.onmessage = (e) => this.handleWorkerMessage(i, e);\n worker.onerror = (e) => this.handleWorkerError(i, e);\n this.workers.push(worker);\n this.availableWorkers.add(i);\n } catch (error) {\n console.error(`Failed to create worker ${i}:`, error);\n }\n }\n\n URL.revokeObjectURL(workerUrl);\n }\n\n private handleWorkerMessage(workerIndex: number, event: MessageEvent): void {\n const { type, taskId, imageData, error } = event.data;\n\n if (type === 'response') {\n const task = this.findTask(taskId);\n if (task) {\n if (error) {\n task.reject(new Error(error));\n } else if (imageData) {\n task.resolve(imageData);\n }\n this.activeJobs.delete(taskId);\n this.availableWorkers.add(workerIndex);\n this.processQueue();\n }\n }\n }\n\n private handleWorkerError(workerIndex: number, error: ErrorEvent): void {\n console.error(`Worker ${workerIndex} error:`, error);\n // Find and reject any active task for this worker\n for (const [taskId, wIndex] of this.activeJobs.entries()) {\n if (wIndex === workerIndex) {\n const task = this.findTask(taskId);\n if (task) {\n task.reject(new Error(`Worker error: ${error.message}`));\n this.activeJobs.delete(taskId);\n }\n }\n }\n this.availableWorkers.add(workerIndex);\n this.processQueue();\n }\n\n private findTask(taskId: string): WorkerTask | undefined {\n return this.taskQueue.find(t => t.id === taskId);\n }\n\n private processQueue(): void {\n while (this.availableWorkers.size > 0 && this.taskQueue.length > 0) {\n // Sort by priority and timestamp\n this.taskQueue.sort((a, b) => {\n if (a.priority !== b.priority) return b.priority - a.priority;\n return a.timestamp - b.timestamp;\n });\n\n const task = this.taskQueue.shift();\n if (!task) break;\n\n const workerIndex = Array.from(this.availableWorkers)[0];\n this.availableWorkers.delete(workerIndex);\n this.activeJobs.set(task.id, workerIndex);\n\n // Send task to worker\n this.workers[workerIndex].postMessage({\n type: 'render',\n taskId: task.id,\n });\n }\n }\n\n public submit(priority: number = 0): Promise<ImageBitmap> {\n return new Promise((resolve, reject) => {\n const task: WorkerTask = {\n id: Math.random().toString(36).substring(7),\n priority,\n timestamp: Date.now(),\n resolve,\n reject,\n };\n\n this.taskQueue.push(task);\n this.processQueue();\n });\n }\n\n public getStats() {\n return {\n total: this.workers.length,\n active: this.activeJobs.size,\n idle: this.availableWorkers.size,\n queued: this.taskQueue.length,\n };\n }\n\n public destroy(): void {\n for (const worker of this.workers) {\n worker.terminate();\n }\n this.workers = [];\n this.availableWorkers.clear();\n this.taskQueue = [];\n this.activeJobs.clear();\n }\n}\n","/**\n * @fileoverview Offscreen rendering plugin (skeleton with stats + feature detection)\n * @module plugins/offscreen\n */\n\nimport type {\n PluginOffscreenConfig,\n OffscreenAPI,\n OffscreenStats,\n} from \"./types\";\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-offscreen\",\n version: \"1.0.0\",\n description: \"Offscreen rendering support with worker-ready scaffolding\",\n provides: [\"performance\", \"offscreen\"],\n tags: [\"performance\", \"offscreen\", \"worker\"],\n};\n\nconst DEFAULT_CONFIG: Required<PluginOffscreenConfig> = {\n enabled: false,\n mode: \"auto\",\n workerPool: 1,\n transfer: \"offscreen\",\n fallback: \"main-thread\",\n debug: false,\n};\n\nimport { WorkerPool } from \"./pool\";\n\nexport function PluginOffscreen(\n userConfig: Partial<PluginOffscreenConfig> = {}\n): ChartPlugin<PluginOffscreenConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n let pool: WorkerPool | null = null;\n const stats: OffscreenStats = {\n enabled: config.enabled,\n frames: 0,\n lastFrameTime: 0,\n lastFrameTimestamp: 0,\n };\n\n function log(message: string, ...args: unknown[]) {\n if (config.debug && ctx) {\n ctx.log.info(`[Offscreen] ${message}`, ...args);\n }\n }\n\n function isSupported(): boolean {\n return typeof (globalThis as any).OffscreenCanvas !== \"undefined\";\n }\n\n function enable(): void {\n if (!isSupported()) {\n log(\"OffscreenCanvas not supported. Falling back to main thread.\");\n if (config.fallback === \"disable\") {\n stats.enabled = false;\n return;\n }\n }\n \n if (!pool) {\n pool = new WorkerPool(config.workerPool || 1);\n }\n \n stats.enabled = true;\n config.enabled = true;\n }\n\n function disable(): void {\n if (pool) {\n pool.destroy();\n pool = null;\n }\n stats.enabled = false;\n config.enabled = false;\n }\n\n function updateConfig(newConfig: Partial<PluginOffscreenConfig>): void {\n Object.assign(config, newConfig);\n if (config.enabled) enable();\n else disable();\n stats.enabled = !!config.enabled;\n }\n\n function getStats(): OffscreenStats {\n const poolStats = pool?.getStats();\n return { \n ...stats,\n activeWorkers: poolStats?.active || 0,\n queuedTasks: poolStats?.queued || 0\n } as any;\n }\n\n function flush(): void {\n ctx?.requestRender();\n }\n\n const api: OffscreenAPI & Record<string, unknown> = {\n enable,\n disable,\n isEnabled: () => stats.enabled,\n updateConfig,\n getStats,\n flush,\n };\n\n return {\n manifest,\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n (ctx.chart as any).offscreen = api;\n if (config.enabled) enable();\n log(`Initialized (pool=${config.workerPool})`);\n },\n onDestroy(pluginCtx: PluginContext) {\n disable();\n delete (pluginCtx.chart as any).offscreen;\n ctx = null;\n },\n onAfterRender(_ctx, event) {\n stats.frames += 1;\n stats.lastFrameTime = event.renderTime;\n stats.lastFrameTimestamp = event.timestamp;\n \n if (config.enabled && pool) {\n // In a real implementation, we would offload the next render piece here\n // For now, we just track that we could have used the pool\n }\n },\n api,\n };\n}\n\nexport default PluginOffscreen;\n\n// Type exports\nexport type {\n PluginOffscreenConfig,\n OffscreenAPI,\n OffscreenStats,\n OffscreenMode,\n OffscreenTransferMode,\n OffscreenFallbackMode,\n} from \"./types\";\n"],"names":["WorkerPool","size","__publicField","workerCode","blob","workerUrl","i","worker","e","error","workerIndex","event","type","taskId","imageData","task","wIndex","t","a","b","priority","resolve","reject","manifest","DEFAULT_CONFIG","PluginOffscreen","userConfig","config","ctx","pool","stats","log","message","args","isSupported","enable","disable","updateConfig","newConfig","getStats","poolStats","flush","api","pluginCtx","_ctx"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  export * from './pattern-recognition/index'
2
- import SciPlot from './pattern-recognition/index'
3
- export default SciPlot
2
+ import VeloPlot from './pattern-recognition/index'
3
+ export default VeloPlot
@@ -363,7 +363,7 @@ const A = {
363
363
  name: "pattern-recognition",
364
364
  version: "1.0.0",
365
365
  description: "Technical pattern recognition for financial and scientific data",
366
- author: "Sci Plot Team",
366
+ author: "Velo Plot Team",
367
367
  provides: ["patterns", "technical-analysis", "chart-patterns"]
368
368
  }, H = {
369
369
  defaultParameters: {
@@ -1 +1 @@
1
- {"version":3,"file":"pattern-recognition.js","sources":["../../src/plugins/pattern-recognition/patterns.ts","../../src/plugins/pattern-recognition/index.ts"],"sourcesContent":["/**\n * Pattern Recognition Plugin - Pattern Definitions\n * \n * Implements common technical analysis patterns for financial and scientific data.\n * Includes head-shoulders, double tops/bottoms, triangles, and more.\n * \n * @packageDocumentation\n * @module plugins/pattern-recognition\n */\n\nimport type {\n PatternDefinition,\n PatternType,\n PatternPoint,\n PatternValidationResult,\n PatternSegment,\n PatternMeasurements\n} from './types';\n\n// ============================================\n// Utility Functions\n// ============================================\n\nfunction findPeaksAndValleys(points: PatternPoint[]): { peaks: PatternPoint[], valleys: PatternPoint[] } {\n const peaks: PatternPoint[] = [];\n const valleys: PatternPoint[] = [];\n \n for (let i = 1; i < points.length - 1; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n const next = points[i + 1];\n \n // Peak detection\n if (curr.y > prev.y && curr.y > next.y) {\n peaks.push({ ...curr, type: 'peak' });\n }\n // Valley detection\n else if (curr.y < prev.y && curr.y < next.y) {\n valleys.push({ ...curr, type: 'valley' });\n }\n }\n \n return { peaks, valleys };\n}\n\nfunction calculateSlope(p1: PatternPoint, p2: PatternPoint): number {\n return (p2.y - p1.y) / (p2.x - p1.x);\n}\n\nfunction calculatePatternMeasurements(points: PatternPoint[]): PatternMeasurements {\n const yValues = points.map(p => p.y);\n const xValues = points.map(p => p.x);\n \n const height = Math.max(...yValues) - Math.min(...yValues);\n const width = Math.max(...xValues) - Math.min(...xValues);\n const slope = calculateSlope(points[0], points[points.length - 1]);\n \n return {\n height,\n width,\n slope,\n volumeProfile: {\n increasing: 0.4, // Mock values\n decreasing: 0.3,\n neutral: 0.3\n },\n breakoutTarget: Math.max(...yValues) + height * 0.8,\n stopLoss: Math.min(...yValues) - height * 0.2\n };\n}\n\n// ============================================\n// Head and Shoulders Pattern\n// ============================================\n\nfunction validateHeadShoulders(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 5) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for head-shoulders pattern'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n // Need at least 3 peaks and 2 valleys for head-shoulders\n if (peaks.length < 3 || valleys.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n // Find left shoulder, head, and right shoulder\n const leftShoulder = peaks[0];\n const head = peaks[1];\n const rightShoulder = peaks[2];\n \n // Find the valleys between shoulders and head\n const leftValley = valleys[0];\n const rightValley = valleys[1];\n \n // Validate pattern structure\n const headHigherThanShoulders = head.y > leftShoulder.y && head.y > rightShoulder.y;\n const shouldersApproximatelyEqual = Math.abs(leftShoulder.y - rightShoulder.y) / leftShoulder.y < 0.1;\n const valleyBelowShoulders = leftValley.y < leftShoulder.y && rightValley.y < rightShoulder.y;\n \n if (!headHigherThanShoulders || !shouldersApproximatelyEqual || !valleyBelowShoulders) {\n return { \n valid: false, \n confidence: 0, \n segments: [], \n keyPoints: [], \n errors: ['Invalid head-shoulders structure'] \n };\n }\n \n // Create segments\n const segments: PatternSegment[] = [\n { start: leftShoulder, end: leftValley, type: 'resistance', strength: 0.8 },\n { start: leftValley, end: head, type: 'support', strength: 0.7 },\n { start: head, end: rightValley, type: 'resistance', strength: 0.8 },\n { start: rightValley, end: rightShoulder, type: 'support', strength: 0.7 }\n ];\n \n const keyPoints = [leftShoulder, leftValley, head, rightValley, rightShoulder];\n const measurements = calculatePatternMeasurements(points);\n \n // Calculate confidence based on pattern symmetry\n const shoulderSymmetry = 1 - Math.abs(leftShoulder.y - rightShoulder.y) / head.y;\n const valleySymmetry = 1 - Math.abs(leftValley.y - rightValley.y) / head.y;\n const confidence = (shoulderSymmetry + valleySymmetry) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Double Top/Bottom Pattern\n// ============================================\n\nfunction validateDoubleTop(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for double top'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n if (peaks.length < 2 || valleys.length < 1) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const firstTop = peaks[0];\n const secondTop = peaks[1];\n const valley = valleys[0];\n \n // Validate double top structure\n const topsApproximatelyEqual = Math.abs(firstTop.y - secondTop.y) / firstTop.y < 0.05;\n const valleyBelowTops = valley.y < firstTop.y && valley.y < secondTop.y;\n const significantDrop = (firstTop.y - valley.y) / firstTop.y > 0.1;\n \n if (!topsApproximatelyEqual || !valleyBelowTops || !significantDrop) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Invalid double top structure'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstTop, end: valley, type: 'resistance', strength: 0.9 },\n { start: valley, end: secondTop, type: 'support', strength: 0.8 },\n { start: firstTop, end: secondTop, type: 'resistance', strength: 0.9 }\n ];\n \n const keyPoints = [firstTop, valley, secondTop];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on top equality and depth of valley\n const topEquality = 1 - Math.abs(firstTop.y - secondTop.y) / firstTop.y;\n const depthRatio = (firstTop.y - valley.y) / firstTop.y;\n const confidence = (topEquality + Math.min(depthRatio * 2, 1)) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\nfunction validateDoubleBottom(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for double bottom'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n if (valleys.length < 2 || peaks.length < 1) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const firstBottom = valleys[0];\n const secondBottom = valleys[1];\n const peak = peaks[0];\n \n // Validate double bottom structure\n const bottomsApproximatelyEqual = Math.abs(firstBottom.y - secondBottom.y) / firstBottom.y < 0.05;\n const peakAboveBottoms = peak.y > firstBottom.y && peak.y > secondBottom.y;\n const significantRise = (peak.y - firstBottom.y) / firstBottom.y > 0.1;\n \n if (!bottomsApproximatelyEqual || !peakAboveBottoms || !significantRise) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Invalid double bottom structure'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstBottom, end: peak, type: 'support', strength: 0.9 },\n { start: peak, end: secondBottom, type: 'resistance', strength: 0.8 },\n { start: firstBottom, end: secondBottom, type: 'support', strength: 0.9 }\n ];\n \n const keyPoints = [firstBottom, peak, secondBottom];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on bottom equality and height of peak\n const bottomEquality = 1 - Math.abs(firstBottom.y - secondBottom.y) / firstBottom.y;\n const heightRatio = (peak.y - firstBottom.y) / firstBottom.y;\n const confidence = (bottomEquality + Math.min(heightRatio * 2, 1)) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Triangle Patterns\n// ============================================\n\nfunction validateAscendingTriangle(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for ascending triangle'] };\n }\n \n // Find horizontal resistance line and ascending support line\n const yValues = points.map(p => p.y);\n const resistanceLevel = Math.max(...yValues);\n const resistancePoints = points.filter(p => Math.abs(p.y - resistanceLevel) / resistanceLevel < 0.02);\n \n if (resistancePoints.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient resistance points'] };\n }\n \n // Check for ascending support (higher lows)\n const lows = points.filter((p, i) => i === 0 || p.y < points[i - 1].y);\n if (lows.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient low points'] };\n }\n \n const firstLow = lows[0];\n const lastLow = lows[lows.length - 1];\n const supportSlope = calculateSlope(firstLow, lastLow);\n \n // Support should be ascending (positive slope)\n if (supportSlope <= 0) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Support not ascending'] };\n }\n \n const segments: PatternSegment[] = [\n { start: resistancePoints[0], end: resistancePoints[resistancePoints.length - 1], type: 'resistance', strength: 0.8 },\n { start: firstLow, end: lastLow, type: 'support', strength: 0.7 }\n ];\n \n const keyPoints = [...resistancePoints.slice(0, 2), firstLow, lastLow];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on horizontal resistance and ascending support\n const resistanceFlatness = 1 - Math.abs(resistancePoints[0].y - resistancePoints[resistancePoints.length - 1].y) / resistanceLevel;\n const supportAscending = Math.min(supportSlope / 0.01, 1); // Normalize slope\n const confidence = (resistanceFlatness + supportAscending) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Pattern Definitions Registry\n// ============================================\n\nexport const BUILTIN_PATTERNS: Record<PatternType, PatternDefinition> = {\n 'head-shoulders': {\n id: 'head-shoulders',\n type: 'head-shoulders',\n name: 'Head and Shoulders',\n description: 'Bearish reversal pattern with three peaks',\n minPoints: 5,\n maxPoints: 7,\n validator: validateHeadShoulders\n },\n \n 'inverse-head-shoulders': {\n id: 'inverse-head-shoulders',\n type: 'inverse-head-shoulders',\n name: 'Inverse Head and Shoulders',\n description: 'Bullish reversal pattern with three valleys',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n // Invert points and validate as regular head-shoulders\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = validateHeadShoulders(invertedPoints);\n return result;\n }\n },\n \n 'double-top': {\n id: 'double-top',\n type: 'double-top',\n name: 'Double Top',\n description: 'Bearish reversal pattern with two equal peaks',\n minPoints: 4,\n maxPoints: 6,\n validator: validateDoubleTop\n },\n \n 'double-bottom': {\n id: 'double-bottom',\n type: 'double-bottom',\n name: 'Double Bottom',\n description: 'Bullish reversal pattern with two equal valleys',\n minPoints: 4,\n maxPoints: 6,\n validator: validateDoubleBottom\n },\n \n 'triple-top': {\n id: 'triple-top',\n type: 'triple-top',\n name: 'Triple Top',\n description: 'Bearish reversal pattern with three equal peaks',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n if (points.length < 5) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const { peaks } = findPeaksAndValleys(points);\n if (peaks.length < 3) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Need at least 3 peaks'] };\n }\n \n const peak1 = peaks[0].y;\n const peak2 = peaks[1].y;\n const peak3 = peaks[2].y;\n \n const tolerance = 0.05;\n const peaksEqual = Math.abs(peak1 - peak2) / peak1 < tolerance && Math.abs(peak2 - peak3) / peak2 < tolerance;\n \n if (!peaksEqual) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Peaks not equal'] };\n }\n \n const segments: PatternSegment[] = [\n { start: peaks[0], end: peaks[1], type: 'resistance', strength: 0.8 },\n { start: peaks[1], end: peaks[2], type: 'resistance', strength: 0.8 }\n ];\n \n const keyPoints = [peaks[0], peaks[1], peaks[2]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.8,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'triple-bottom': {\n id: 'triple-bottom',\n type: 'triple-bottom',\n name: 'Triple Bottom',\n description: 'Bullish reversal pattern with three equal valleys',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n return BUILTIN_PATTERNS['triple-top'].validator(invertedPoints);\n }\n },\n \n 'ascending-triangle': {\n id: 'ascending-triangle',\n type: 'ascending-triangle',\n name: 'Ascending Triangle',\n description: 'Continuation pattern with horizontal resistance and ascending support',\n minPoints: 4,\n maxPoints: 8,\n validator: validateAscendingTriangle\n },\n \n 'descending-triangle': {\n id: 'descending-triangle',\n type: 'descending-triangle',\n name: 'Descending Triangle',\n description: 'Continuation pattern with horizontal support and descending resistance',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Invert points and validate as ascending triangle\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = validateAscendingTriangle(invertedPoints);\n return result;\n }\n },\n \n 'symmetrical-triangle': {\n id: 'symmetrical-triangle',\n type: 'symmetrical-triangle',\n name: 'Symmetrical Triangle',\n description: 'Continuation pattern with converging support and resistance',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Simplified validation for symmetrical triangle\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n // Check for converging trendlines\n const firstHalf = points.slice(0, Math.floor(points.length / 2));\n const secondHalf = points.slice(Math.floor(points.length / 2));\n \n const firstSlope = calculateSlope(firstHalf[0], firstHalf[firstHalf.length - 1]);\n const secondSlope = calculateSlope(secondHalf[0], secondHalf[secondHalf.length - 1]);\n \n // Slopes should be converging (opposite signs)\n const converging = (firstSlope > 0 && secondSlope < 0) || (firstSlope < 0 && secondSlope > 0);\n \n if (!converging) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Lines not converging'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstHalf[0], end: firstHalf[firstHalf.length - 1], type: 'trendline', strength: 0.7 },\n { start: secondHalf[0], end: secondHalf[secondHalf.length - 1], type: 'trendline', strength: 0.7 }\n ];\n \n const keyPoints = [firstHalf[0], firstHalf[firstHalf.length - 1], secondHalf[0], secondHalf[secondHalf.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.7,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'rising-wedge': {\n id: 'rising-wedge',\n type: 'rising-wedge',\n name: 'Rising Wedge',\n description: 'Bearish reversal pattern with two converging upward lines',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Simplified rising wedge validation\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n if (peaks.length < 2 || valleys.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const peakSlope = calculateSlope(peaks[0], peaks[peaks.length - 1]);\n const valleySlope = calculateSlope(valleys[0], valleys[valleys.length - 1]);\n \n // Both lines should be rising but converging (valley slope > peak slope)\n const wedgePattern = peakSlope > 0 && valleySlope > 0 && valleySlope > peakSlope;\n \n if (!wedgePattern) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Not a rising wedge pattern'] };\n }\n \n const segments: PatternSegment[] = [\n { start: peaks[0], end: peaks[peaks.length - 1], type: 'resistance', strength: 0.8 },\n { start: valleys[0], end: valleys[valleys.length - 1], type: 'support', strength: 0.8 }\n ];\n \n const keyPoints = [peaks[0], peaks[peaks.length - 1], valleys[0], valleys[valleys.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.75,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'falling-wedge': {\n id: 'falling-wedge',\n type: 'falling-wedge',\n name: 'Falling Wedge',\n description: 'Bullish reversal pattern with two converging downward lines',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Invert points and validate as rising wedge\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = BUILTIN_PATTERNS['rising-wedge'].validator(invertedPoints);\n return result;\n }\n },\n \n 'rectangle': {\n id: 'rectangle',\n type: 'rectangle',\n name: 'Rectangle',\n description: 'Continuation pattern with horizontal support and resistance',\n minPoints: 4,\n maxPoints: 10,\n validator: (points) => {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const yValues = points.map(p => p.y);\n const resistance = Math.max(...yValues);\n const support = Math.min(...yValues);\n \n // Check for relatively flat top and bottom\n const resistancePoints = points.filter(p => Math.abs(p.y - resistance) / resistance < 0.05);\n const supportPoints = points.filter(p => Math.abs(p.y - support) / support < 0.05);\n \n if (resistancePoints.length < 2 || supportPoints.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient horizontal lines'] };\n }\n \n const segments: PatternSegment[] = [\n { start: resistancePoints[0], end: resistancePoints[resistancePoints.length - 1], type: 'resistance', strength: 0.9 },\n { start: supportPoints[0], end: supportPoints[supportPoints.length - 1], type: 'support', strength: 0.9 }\n ];\n \n const keyPoints = [resistancePoints[0], resistancePoints[resistancePoints.length - 1], supportPoints[0], supportPoints[supportPoints.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.8,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'flag': {\n id: 'flag',\n type: 'flag',\n name: 'Flag',\n description: 'Short-term continuation pattern after strong move',\n minPoints: 3,\n maxPoints: 6,\n validator: (points) => {\n // Simplified flag validation\n if (points.length < 3) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const slope = calculateSlope(points[0], points[points.length - 1]);\n \n // Flag should be relatively horizontal (small slope)\n const horizontal = Math.abs(slope) < 0.01;\n \n if (!horizontal) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Not horizontal enough'] };\n }\n \n const segments: PatternSegment[] = [\n { start: points[0], end: points[points.length - 1], type: 'trendline', strength: 0.6 }\n ];\n \n const keyPoints = [points[0], points[points.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.6,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'pennant': {\n id: 'pennant',\n type: 'pennant',\n name: 'Pennant',\n description: 'Short-term continuation pattern with converging lines',\n minPoints: 3,\n maxPoints: 5,\n validator: (points) => {\n // Similar to symmetrical triangle but smaller\n return BUILTIN_PATTERNS['symmetrical-triangle'].validator(points);\n }\n },\n \n 'custom': {\n id: 'custom',\n type: 'custom',\n name: 'Custom Pattern',\n description: 'User-defined pattern',\n minPoints: 3,\n validator: (_points) => {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Custom pattern not implemented'] };\n }\n }\n};","/**\n * Pattern Recognition Plugin - Main Implementation\n * \n * Provides technical pattern recognition for financial and scientific data.\n * Supports common chart patterns and custom pattern definitions.\n * \n * @example\n * ```typescript\n * import { PluginPatternRecognition } from 'velo-plot/plugins/pattern-recognition';\n * \n * chart.use(PluginPatternRecognition({\n * defaultParameters: {\n * minConfidence: 0.7,\n * patternTypes: ['head-shoulders', 'double-top', 'ascending-triangle'],\n * sensitivity: 0.5\n * },\n * enableRealtime: true,\n * visualization: {\n * showPatterns: true,\n * showLabels: true,\n * colorScheme: {\n * 'head-shoulders': '#ff6b6b',\n * 'double-top': '#4ecdc4',\n * 'ascending-triangle': '#45b7d1'\n * }\n * }\n * }));\n * \n * // Detect patterns\n * const result = await chart.patterns.detectPatterns('series1', dataPoints);\n * console.log(`Found ${result.matches.length} patterns`);\n * \n * // Enable real-time detection\n * chart.patterns.enableRealtimeDetection('series1');\n * ```\n * \n * @packageDocumentation\n * @module plugins/pattern-recognition\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n BeforeRenderEvent,\n DataUpdateEvent\n} from '../types';\n\nimport type {\n PluginPatternRecognitionConfig,\n PatternRecognitionAPI,\n PatternDetectionResult,\n PatternMatch,\n PatternPoint,\n PatternDetectionParameters,\n PatternType,\n CustomPatternConfig,\n PatternDefinition,\n PatternValidationResult,\n PatternDetectedEvent,\n PatternSignalEvent\n} from './types';\n\nimport { BUILTIN_PATTERNS } from './patterns';\n\n// ============================================\n// Plugin Manifest\n// ============================================\n\nconst manifestPatternRecognition: PluginManifest = {\n name: 'pattern-recognition',\n version: '1.0.0',\n description: 'Technical pattern recognition for financial and scientific data',\n author: 'Sci Plot Team',\n provides: ['patterns', 'technical-analysis', 'chart-patterns']\n};\n\n// ============================================\n// Default Configuration\n// ============================================\n\nconst DEFAULT_CONFIG: Required<PluginPatternRecognitionConfig> = {\n defaultParameters: {\n minConfidence: 0.7,\n maxPatterns: 10,\n patternTypes: ['head-shoulders', 'double-top', 'double-bottom', 'ascending-triangle', 'descending-triangle'],\n sensitivity: 0.5,\n minPatternSize: 5,\n maxPatternSize: 50,\n overlapTolerance: 0.3,\n enableVolumeConfirmation: false,\n enableTrendConfirmation: true\n },\n customPatterns: [],\n enableRealtime: false,\n debounceTime: 500,\n maxStoredPatterns: 100,\n visualization: {\n showPatterns: true,\n showLabels: true,\n showTargets: true,\n colorScheme: {\n 'head-shoulders': '#ff6b6b',\n 'inverse-head-shoulders': '#4ecdc4',\n 'double-top': '#ff9f43',\n 'double-bottom': '#00d2d3',\n 'triple-top': '#ff6b6b',\n 'triple-bottom': '#4ecdc4',\n 'ascending-triangle': '#45b7d1',\n 'descending-triangle': '#f39c12',\n 'symmetrical-triangle': '#9b59b6',\n 'rising-wedge': '#e74c3c',\n 'falling-wedge': '#27ae60',\n 'rectangle': '#34495e',\n 'flag': '#f1c40f',\n 'pennant': '#e67e22',\n 'custom': '#95a5a6'\n },\n opacity: 0.7,\n lineWidth: 2\n },\n notifications: {\n enableAlerts: false,\n minAlertConfidence: 0.8,\n alertTypes: ['head-shoulders', 'double-top', 'double-bottom']\n }\n};\n\n// ============================================\n// Pattern Recognition Plugin Implementation\n// ============================================\n\nexport function PluginPatternRecognition(\n userConfig: Partial<PluginPatternRecognitionConfig> = {}\n): ChartPlugin<PluginPatternRecognitionConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n \n // Pattern storage\n const patternMatches = new Map<string, PatternMatch[]>();\n const registeredPatterns = new Map<PatternType, PatternDefinition>(Object.entries(BUILTIN_PATTERNS) as [PatternType, PatternDefinition][]);\n // Named custom patterns, keyed by their unique id (task 3.6).\n const customPatterns = new Map<string, PatternDefinition>();\n const realtimeSeries = new Set<string>();\n const debounceTimers = new Map<string, any>();\n\n /**\n * Maps a pattern type to the directional trading bias it implies, so the\n * signal can be consumed by the Stage 2 alert system (task 3.8).\n */\n const SIGNAL_DIRECTION: Record<PatternType, 'bullish' | 'bearish' | 'neutral'> = {\n 'head-shoulders': 'bearish',\n 'inverse-head-shoulders': 'bullish',\n 'double-top': 'bearish',\n 'double-bottom': 'bullish',\n 'triple-top': 'bearish',\n 'triple-bottom': 'bullish',\n 'ascending-triangle': 'bullish',\n 'descending-triangle': 'bearish',\n 'symmetrical-triangle': 'neutral',\n 'rising-wedge': 'bearish',\n 'falling-wedge': 'bullish',\n 'rectangle': 'neutral',\n 'flag': 'neutral',\n 'pennant': 'neutral',\n 'custom': 'neutral',\n };\n\n /**\n * Scan a single pattern definition over the processed points with a sliding\n * window, pushing valid matches. Returns true when maxPatterns is reached.\n */\n function scanPattern(\n pattern: PatternDefinition,\n patternKey: PatternType | string,\n processedPoints: PatternPoint[],\n params: PatternDetectionParameters,\n seriesId: string,\n matches: PatternMatch[],\n patternsByType: Record<string, number>\n ): boolean {\n for (let i = params.minPatternSize; i <= Math.min(processedPoints.length, params.maxPatternSize); i++) {\n const window = processedPoints.slice(Math.max(0, i - params.maxPatternSize), i);\n if (window.length < pattern.minPoints) continue;\n if (pattern.maxPoints && window.length > pattern.maxPoints) continue;\n\n const validation = pattern.validator(window);\n if (validation.valid && validation.confidence >= params.minConfidence) {\n const match: PatternMatch = {\n pattern,\n confidence: validation.confidence,\n location: {\n startIndex: Math.max(0, i - params.maxPatternSize),\n endIndex: i,\n startPoint: window[0],\n endPoint: window[window.length - 1],\n },\n validation,\n timestamp: Date.now(),\n seriesId,\n };\n\n if (!hasSignificantOverlap(match, matches, params.overlapTolerance)) {\n matches.push(match);\n patternsByType[patternKey] = (patternsByType[patternKey] || 0) + 1;\n if (matches.length >= params.maxPatterns!) return true;\n }\n }\n }\n return false;\n }\n\n /** Emit a normalized trading signal for a detected pattern. */\n function emitSignal(match: PatternMatch): void {\n const direction = SIGNAL_DIRECTION[match.pattern.type] ?? 'neutral';\n ctx?.events.emit('pattern:signal', {\n seriesId: match.seriesId,\n patternType: match.pattern.type,\n patternName: match.pattern.name,\n direction,\n confidence: match.confidence,\n price: match.location.endPoint.y,\n x: match.location.endPoint.x,\n target: match.validation.measurements?.breakoutTarget,\n stopLoss: match.validation.measurements?.stopLoss,\n timestamp: match.timestamp,\n });\n }\n \n // ============================================\n // Pattern Detection Engine\n // ============================================\n \n async function detectPatterns(\n seriesId: string, \n dataPoints: PatternPoint[], \n parameters?: Partial<PatternDetectionParameters>\n ): Promise<PatternDetectionResult> {\n const params = { ...config.defaultParameters, ...parameters };\n const startTime = performance.now();\n \n const matches: PatternMatch[] = [];\n const patternsByType: Record<PatternType, number> = {} as any;\n \n // Preprocess data - find peaks and valleys\n const processedPoints = preprocessData(dataPoints, params.sensitivity);\n \n // Check each requested built-in pattern type\n let reachedLimit = false;\n for (const patternType of params.patternTypes) {\n const pattern = registeredPatterns.get(patternType);\n if (!pattern) continue;\n if (scanPattern(pattern, patternType, processedPoints, params, seriesId, matches, patternsByType)) {\n reachedLimit = true;\n break;\n }\n }\n\n // Also scan named custom patterns when the caller opts into 'custom'\n // (or provides no explicit list). Each custom pattern is keyed by its id.\n if (!reachedLimit && customPatterns.size > 0 && params.patternTypes.includes('custom')) {\n for (const [id, pattern] of customPatterns) {\n if (scanPattern(pattern, id, processedPoints, params, seriesId, matches, patternsByType)) {\n break;\n }\n }\n }\n \n // Sort by confidence\n matches.sort((a, b) => b.confidence - a.confidence);\n \n // Store matches\n patternMatches.set(seriesId, matches);\n \n const detectionTime = performance.now() - startTime;\n \n // Emit events for high-confidence patterns\n for (const match of matches) {\n // Trading signal bridge (task 3.8): every match at or above the alert\n // threshold emits a normalized directional signal.\n if (match.confidence >= config.notifications.minAlertConfidence) {\n emitSignal(match);\n }\n if (match.confidence >= config.notifications.minAlertConfidence &&\n config.notifications.alertTypes.includes(match.pattern.type)) {\n ctx?.events.emit('pattern:detected', {\n match,\n seriesId,\n timestamp: Date.now()\n } as PatternDetectedEvent);\n }\n }\n \n const result: PatternDetectionResult = {\n matches,\n summary: {\n totalPatterns: matches.length,\n patternsByType,\n averageConfidence: matches.length > 0 ? matches.reduce((sum, m) => sum + m.confidence, 0) / matches.length : 0,\n detectionTime\n },\n processedPoints: processedPoints.length,\n parameters: params\n };\n \n ctx?.log.info(`Pattern detection completed for ${seriesId}: ${matches.length} patterns found`);\n \n return result;\n }\n \n function preprocessData(dataPoints: PatternPoint[], sensitivity: number): PatternPoint[] {\n return dataPoints.filter((point, index) => {\n if (index === 0 || index === dataPoints.length - 1) return true;\n \n const prev = dataPoints[index - 1];\n \n const priceChange = Math.abs(point.y - prev.y) / prev.y;\n return priceChange >= sensitivity * 0.01;\n });\n }\n \n function hasSignificantOverlap(newMatch: PatternMatch, existingMatches: PatternMatch[], tolerance: number): boolean {\n for (const existing of existingMatches) {\n const overlapStart = Math.max(newMatch.location.startIndex, existing.location.startIndex);\n const overlapEnd = Math.min(newMatch.location.endIndex, existing.location.endIndex);\n const overlapSize = overlapEnd - overlapStart;\n \n const newMatchSize = newMatch.location.endIndex - newMatch.location.startIndex;\n const existingMatchSize = existing.location.endIndex - existing.location.startIndex;\n \n const overlapRatio = overlapSize / Math.min(newMatchSize, existingMatchSize);\n \n if (overlapRatio > tolerance) {\n return true;\n }\n }\n return false;\n }\n \n // ============================================\n // Custom Pattern Registration\n // ============================================\n \n function registerCustomPattern(customConfig: CustomPatternConfig): void {\n const pattern: PatternDefinition = {\n id: customConfig.id,\n type: 'custom',\n name: customConfig.name,\n minPoints: customConfig.pointSequence.length,\n maxPoints: customConfig.pointSequence.length,\n validator: (points) => validateCustomPattern(points, customConfig)\n };\n\n customPatterns.set(customConfig.id, pattern);\n ctx?.log.info(`Custom pattern registered: ${customConfig.id}`);\n }\n\n /**\n * Register a named custom pattern (task 3.6).\n *\n * The template can be either a full {@link PatternDefinition} (with its own\n * `validator`) or a declarative {@link CustomPatternConfig}. Multiple named\n * patterns coexist because each is stored under its own id.\n *\n * @example\n * chart.patterns.register('my-spike', {\n * name: 'Volatility Spike',\n * minPoints: 3,\n * validator: (pts) => ({ valid: true, confidence: 1, segments: [], keyPoints: pts })\n * });\n */\n function register(\n id: string,\n template: (Partial<PatternDefinition> & { validator: PatternDefinition['validator'] }) | CustomPatternConfig\n ): void {\n if ('pointSequence' in template) {\n registerCustomPattern({ ...(template as CustomPatternConfig), id });\n return;\n }\n\n const def = template as Partial<PatternDefinition> & { validator: PatternDefinition['validator'] };\n if (typeof def.validator !== 'function') {\n ctx?.log.error(`Cannot register pattern '${id}': a validator function is required`);\n return;\n }\n const pattern: PatternDefinition = {\n id,\n type: 'custom',\n name: def.name ?? id,\n description: def.description,\n minPoints: def.minPoints ?? 3,\n maxPoints: def.maxPoints,\n validator: def.validator,\n confidenceCalculator: def.confidenceCalculator,\n };\n customPatterns.set(id, pattern);\n ctx?.log.info(`Custom pattern registered: ${id}`);\n }\n\n /** Remove a previously registered custom pattern. */\n function unregister(id: string): boolean {\n const removed = customPatterns.delete(id);\n if (removed) ctx?.log.info(`Custom pattern removed: ${id}`);\n return removed;\n }\n \n function validateCustomPattern(points: PatternPoint[], config: CustomPatternConfig): PatternValidationResult {\n if (points.length < config.pointSequence.length) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n let confidence = 1.0;\n const errors: string[] = [];\n \n for (let i = 0; i < config.pointSequence.length; i++) {\n const sequencePoint = config.pointSequence[i];\n const actualPoint = points[i];\n \n if (sequencePoint.constraints) {\n const constraints = sequencePoint.constraints;\n \n if (constraints.higherThanPrevious && i > 0) {\n if (actualPoint.y <= points[i - 1].y) {\n confidence *= 0.8;\n errors.push(`Point ${i} not higher than previous`);\n }\n }\n \n if (constraints.lowerThanPrevious && i > 0) {\n if (actualPoint.y >= points[i - 1].y) {\n confidence *= 0.8;\n errors.push(`Point ${i} not lower than previous`);\n }\n }\n \n if (constraints.withinRange) {\n const [min, max] = constraints.withinRange;\n if (actualPoint.y < min || actualPoint.y > max) {\n confidence *= 0.7;\n errors.push(`Point ${i} not within range [${min}, ${max}]`);\n }\n }\n }\n }\n \n return {\n valid: confidence >= 0.5,\n confidence,\n segments: [],\n keyPoints: points,\n errors: errors.length > 0 ? errors : undefined\n };\n }\n \n // ============================================\n // API Implementation\n // ============================================\n \n const api: PatternRecognitionAPI & Record<string, unknown> = {\n detectPatterns,\n \n registerCustomPattern,\n\n register,\n\n unregister,\n\n onSignal(handler: (signal: PatternSignalEvent) => void): () => void {\n return ctx?.events.onPlugin('pattern:signal', (data) => handler(data as PatternSignalEvent)) ?? (() => {});\n },\n \n getRegisteredPatterns(): PatternDefinition[] {\n return [...registeredPatterns.values(), ...customPatterns.values()];\n },\n \n getPatternMatches(seriesId: string): PatternMatch[] {\n return patternMatches.get(seriesId) || [];\n },\n \n clearPatternMatches(seriesId: string): void {\n patternMatches.delete(seriesId);\n ctx?.log.info(`Pattern matches cleared for series: ${seriesId}`);\n },\n \n enableRealtimeDetection(seriesId: string, parameters?: Partial<PatternDetectionParameters>): void {\n realtimeSeries.add(seriesId);\n \n const chart = ctx?.chart;\n if (chart) {\n const targetSeries = chart.getSeries(seriesId);\n if (targetSeries) {\n const data = targetSeries.getData();\n if (data && data.x.length > 0) {\n const points: PatternPoint[] = Array.from(data.x).map((x, i) => ({\n x: x as number,\n y: data.y[i]\n }));\n \n detectPatterns(seriesId, points, parameters);\n }\n }\n }\n \n ctx?.log.info(`Real-time pattern detection enabled for series: ${seriesId}`);\n },\n \n disableRealtimeDetection(seriesId: string): void {\n realtimeSeries.delete(seriesId);\n \n const timer = debounceTimers.get(seriesId);\n if (timer) {\n clearTimeout(timer);\n debounceTimers.delete(seriesId);\n }\n \n ctx?.log.info(`Real-time pattern detection disabled for series: ${seriesId}`);\n },\n \n getStatistics(seriesId?: string) {\n if (seriesId) {\n const matches = patternMatches.get(seriesId) || [];\n const patternsByType: Record<PatternType, number> = {} as any;\n \n for (const match of matches) {\n patternsByType[match.pattern.type] = (patternsByType[match.pattern.type] || 0) + 1;\n }\n \n return {\n totalDetections: matches.length,\n patternsByType,\n averageConfidence: matches.length > 0 ? matches.reduce((sum, m) => sum + m.confidence, 0) / matches.length : 0,\n detectionRate: matches.length / 100\n };\n } else {\n let totalDetections = 0;\n const allPatternsByType: Record<PatternType, number> = {} as any;\n const allConfidences: number[] = [];\n \n for (const matches of patternMatches.values()) {\n totalDetections += matches.length;\n allConfidences.push(...matches.map(m => m.confidence));\n \n for (const match of matches) {\n allPatternsByType[match.pattern.type] = (allPatternsByType[match.pattern.type] || 0) + 1;\n }\n }\n \n return {\n totalDetections,\n patternsByType: allPatternsByType,\n averageConfidence: allConfidences.length > 0 ? allConfidences.reduce((sum, c) => sum + c, 0) / allConfidences.length : 0,\n detectionRate: totalDetections / 100\n };\n }\n },\n \n updateConfig: (newConfig: Partial<PluginPatternRecognitionConfig>) => {\n Object.assign(config, newConfig);\n },\n \n getConfig: () => ({ ...config }),\n \n visualizePatterns(seriesId: string, showTypes?: PatternType[]): void {\n const chart = ctx?.chart;\n if (!chart) return;\n \n const matches = patternMatches.get(seriesId) || [];\n const filteredMatches = showTypes ? matches.filter(m => showTypes.includes(m.pattern.type)) : matches;\n \n api.hidePatterns(seriesId);\n \n for (const match of filteredMatches) {\n const color = config.visualization.colorScheme[match.pattern.type] || '#666666';\n \n for (const segment of match.validation.segments) {\n const lineId = `${seriesId}_pattern_${match.pattern.id}_${match.location.startIndex}`;\n \n chart.addSeries({\n id: lineId,\n type: 'line',\n data: {\n x: new Float32Array([segment.start.x, segment.end.x]),\n y: new Float32Array([segment.start.y, segment.end.y])\n },\n style: {\n color,\n width: config.visualization.lineWidth,\n opacity: config.visualization.opacity,\n lineDash: [5, 5]\n }\n });\n }\n \n if (config.visualization.showLabels) {\n const labelId = `${seriesId}_label_${match.pattern.id}_${match.location.startIndex}`;\n const centerX = (match.location.startPoint.x + match.location.endPoint.x) / 2;\n const centerY = (match.location.startPoint.y + match.location.endPoint.y) / 2;\n \n chart.addAnnotation({\n id: labelId,\n type: 'text',\n text: match.pattern.name,\n x: centerX,\n y: centerY,\n style: {\n color,\n fontSize: 12,\n backgroundColor: 'rgba(255, 255, 255, 0.8)'\n }\n } as any);\n }\n }\n },\n \n hidePatterns(seriesId: string): void {\n const chart = ctx?.chart;\n if (!chart) return;\n \n const matches = patternMatches.get(seriesId) || [];\n \n for (const match of matches) {\n for (let i = 0; i < match.validation.segments.length; i++) {\n const lineId = `${seriesId}_pattern_${match.pattern.id}_${match.location.startIndex}`;\n if (chart.getSeries(lineId)) {\n chart.removeSeries(lineId);\n }\n }\n \n const labelId = `${seriesId}_label_${match.pattern.id}_${match.location.startIndex}`;\n if (chart.getAnnotation(labelId)) {\n chart.removeAnnotation(labelId);\n }\n }\n }\n };\n \n // ============================================\n // Event Handlers\n // ============================================\n \n function handleDataUpdate(context: PluginContext, event: DataUpdateEvent): void {\n if (!config.enableRealtime) return;\n \n const { seriesId } = event;\n \n if (realtimeSeries.has(seriesId)) {\n const timer = debounceTimers.get(seriesId);\n if (timer) {\n clearTimeout(timer);\n }\n \n const newTimer = setTimeout(() => {\n const chart = context.chart;\n if (chart) {\n const series = chart.getSeries(seriesId);\n if (series) {\n const data = series.getData();\n if (data && data.x.length > 0) {\n const points: PatternPoint[] = Array.from(data.x).map((x, i) => ({\n x: x as number,\n y: data.y[i]\n }));\n \n detectPatterns(seriesId, points);\n \n if (config.visualization.showPatterns) {\n api.visualizePatterns(seriesId);\n }\n }\n }\n }\n }, config.debounceTime);\n \n debounceTimers.set(seriesId, newTimer);\n }\n }\n \n // ============================================\n // Plugin Definition\n // ============================================\n \n return {\n manifest: manifestPatternRecognition,\n \n onInit(context: PluginContext) {\n ctx = context;\n \n if (config.customPatterns) {\n for (const customPattern of config.customPatterns) {\n registerCustomPattern(customPattern);\n }\n }\n \n ctx.log.info(`Pattern Recognition plugin initialized with ${registeredPatterns.size} patterns`);\n },\n \n onConfigChange(_context: PluginContext, _newConfig: PluginPatternRecognitionConfig) {\n // Handle config changes\n },\n \n onBeforeRender(_context: PluginContext, _event: BeforeRenderEvent) {\n // Handle pre-render tasks if needed\n },\n \n onDataUpdate: handleDataUpdate,\n \n onDestroy(_context: PluginContext) {\n for (const timer of debounceTimers.values()) {\n clearTimeout(timer);\n }\n debounceTimers.clear();\n \n patternMatches.clear();\n realtimeSeries.clear();\n registeredPatterns.clear();\n customPatterns.clear();\n },\n \n api\n };\n}\n\nexport default PluginPatternRecognition;\n\nexport type {\n PatternType,\n PatternDefinition,\n PatternPoint,\n PatternSegment,\n PatternValidationResult,\n PatternMeasurements,\n PatternMatch,\n PatternDetectionResult,\n PatternDetectionParameters,\n CustomPatternConfig,\n PluginPatternRecognitionConfig,\n PatternDetectedEvent,\n PatternCompletedEvent,\n PatternFailedEvent,\n PatternRecognitionAPI\n} from './types';\n"],"names":["findPeaksAndValleys","points","peaks","valleys","i","prev","curr","next","calculateSlope","p1","p2","calculatePatternMeasurements","yValues","p","xValues","height","width","slope","validateHeadShoulders","leftShoulder","head","rightShoulder","leftValley","rightValley","headHigherThanShoulders","shouldersApproximatelyEqual","valleyBelowShoulders","segments","keyPoints","measurements","shoulderSymmetry","valleySymmetry","validateDoubleTop","firstTop","secondTop","valley","topsApproximatelyEqual","valleyBelowTops","significantDrop","topEquality","depthRatio","validateDoubleBottom","firstBottom","secondBottom","peak","bottomsApproximatelyEqual","peakAboveBottoms","significantRise","bottomEquality","heightRatio","validateAscendingTriangle","resistanceLevel","resistancePoints","lows","firstLow","lastLow","supportSlope","resistanceFlatness","supportAscending","BUILTIN_PATTERNS","invertedPoints","peak1","peak2","peak3","tolerance","firstHalf","secondHalf","firstSlope","secondSlope","peakSlope","valleySlope","resistance","support","supportPoints","_points","manifestPatternRecognition","DEFAULT_CONFIG","PluginPatternRecognition","userConfig","config","ctx","patternMatches","registeredPatterns","customPatterns","realtimeSeries","debounceTimers","SIGNAL_DIRECTION","scanPattern","pattern","patternKey","processedPoints","params","seriesId","matches","patternsByType","window","validation","match","hasSignificantOverlap","emitSignal","_a","_b","direction","detectPatterns","dataPoints","parameters","startTime","preprocessData","reachedLimit","patternType","id","a","b","detectionTime","result","sum","m","sensitivity","point","index","newMatch","existingMatches","existing","overlapStart","overlapSize","newMatchSize","existingMatchSize","registerCustomPattern","customConfig","validateCustomPattern","register","template","def","unregister","removed","confidence","errors","sequencePoint","actualPoint","constraints","min","max","api","handler","data","chart","targetSeries","x","timer","totalDetections","allPatternsByType","allConfidences","c","newConfig","showTypes","filteredMatches","color","segment","lineId","labelId","centerX","centerY","handleDataUpdate","context","event","newTimer","series","customPattern","_context","_newConfig","_event"],"mappings":"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"}
1
+ {"version":3,"file":"pattern-recognition.js","sources":["../../src/plugins/pattern-recognition/patterns.ts","../../src/plugins/pattern-recognition/index.ts"],"sourcesContent":["/**\n * Pattern Recognition Plugin - Pattern Definitions\n * \n * Implements common technical analysis patterns for financial and scientific data.\n * Includes head-shoulders, double tops/bottoms, triangles, and more.\n * \n * @packageDocumentation\n * @module plugins/pattern-recognition\n */\n\nimport type {\n PatternDefinition,\n PatternType,\n PatternPoint,\n PatternValidationResult,\n PatternSegment,\n PatternMeasurements\n} from './types';\n\n// ============================================\n// Utility Functions\n// ============================================\n\nfunction findPeaksAndValleys(points: PatternPoint[]): { peaks: PatternPoint[], valleys: PatternPoint[] } {\n const peaks: PatternPoint[] = [];\n const valleys: PatternPoint[] = [];\n \n for (let i = 1; i < points.length - 1; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n const next = points[i + 1];\n \n // Peak detection\n if (curr.y > prev.y && curr.y > next.y) {\n peaks.push({ ...curr, type: 'peak' });\n }\n // Valley detection\n else if (curr.y < prev.y && curr.y < next.y) {\n valleys.push({ ...curr, type: 'valley' });\n }\n }\n \n return { peaks, valleys };\n}\n\nfunction calculateSlope(p1: PatternPoint, p2: PatternPoint): number {\n return (p2.y - p1.y) / (p2.x - p1.x);\n}\n\nfunction calculatePatternMeasurements(points: PatternPoint[]): PatternMeasurements {\n const yValues = points.map(p => p.y);\n const xValues = points.map(p => p.x);\n \n const height = Math.max(...yValues) - Math.min(...yValues);\n const width = Math.max(...xValues) - Math.min(...xValues);\n const slope = calculateSlope(points[0], points[points.length - 1]);\n \n return {\n height,\n width,\n slope,\n volumeProfile: {\n increasing: 0.4, // Mock values\n decreasing: 0.3,\n neutral: 0.3\n },\n breakoutTarget: Math.max(...yValues) + height * 0.8,\n stopLoss: Math.min(...yValues) - height * 0.2\n };\n}\n\n// ============================================\n// Head and Shoulders Pattern\n// ============================================\n\nfunction validateHeadShoulders(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 5) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for head-shoulders pattern'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n // Need at least 3 peaks and 2 valleys for head-shoulders\n if (peaks.length < 3 || valleys.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n // Find left shoulder, head, and right shoulder\n const leftShoulder = peaks[0];\n const head = peaks[1];\n const rightShoulder = peaks[2];\n \n // Find the valleys between shoulders and head\n const leftValley = valleys[0];\n const rightValley = valleys[1];\n \n // Validate pattern structure\n const headHigherThanShoulders = head.y > leftShoulder.y && head.y > rightShoulder.y;\n const shouldersApproximatelyEqual = Math.abs(leftShoulder.y - rightShoulder.y) / leftShoulder.y < 0.1;\n const valleyBelowShoulders = leftValley.y < leftShoulder.y && rightValley.y < rightShoulder.y;\n \n if (!headHigherThanShoulders || !shouldersApproximatelyEqual || !valleyBelowShoulders) {\n return { \n valid: false, \n confidence: 0, \n segments: [], \n keyPoints: [], \n errors: ['Invalid head-shoulders structure'] \n };\n }\n \n // Create segments\n const segments: PatternSegment[] = [\n { start: leftShoulder, end: leftValley, type: 'resistance', strength: 0.8 },\n { start: leftValley, end: head, type: 'support', strength: 0.7 },\n { start: head, end: rightValley, type: 'resistance', strength: 0.8 },\n { start: rightValley, end: rightShoulder, type: 'support', strength: 0.7 }\n ];\n \n const keyPoints = [leftShoulder, leftValley, head, rightValley, rightShoulder];\n const measurements = calculatePatternMeasurements(points);\n \n // Calculate confidence based on pattern symmetry\n const shoulderSymmetry = 1 - Math.abs(leftShoulder.y - rightShoulder.y) / head.y;\n const valleySymmetry = 1 - Math.abs(leftValley.y - rightValley.y) / head.y;\n const confidence = (shoulderSymmetry + valleySymmetry) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Double Top/Bottom Pattern\n// ============================================\n\nfunction validateDoubleTop(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for double top'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n if (peaks.length < 2 || valleys.length < 1) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const firstTop = peaks[0];\n const secondTop = peaks[1];\n const valley = valleys[0];\n \n // Validate double top structure\n const topsApproximatelyEqual = Math.abs(firstTop.y - secondTop.y) / firstTop.y < 0.05;\n const valleyBelowTops = valley.y < firstTop.y && valley.y < secondTop.y;\n const significantDrop = (firstTop.y - valley.y) / firstTop.y > 0.1;\n \n if (!topsApproximatelyEqual || !valleyBelowTops || !significantDrop) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Invalid double top structure'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstTop, end: valley, type: 'resistance', strength: 0.9 },\n { start: valley, end: secondTop, type: 'support', strength: 0.8 },\n { start: firstTop, end: secondTop, type: 'resistance', strength: 0.9 }\n ];\n \n const keyPoints = [firstTop, valley, secondTop];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on top equality and depth of valley\n const topEquality = 1 - Math.abs(firstTop.y - secondTop.y) / firstTop.y;\n const depthRatio = (firstTop.y - valley.y) / firstTop.y;\n const confidence = (topEquality + Math.min(depthRatio * 2, 1)) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\nfunction validateDoubleBottom(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for double bottom'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n \n if (valleys.length < 2 || peaks.length < 1) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const firstBottom = valleys[0];\n const secondBottom = valleys[1];\n const peak = peaks[0];\n \n // Validate double bottom structure\n const bottomsApproximatelyEqual = Math.abs(firstBottom.y - secondBottom.y) / firstBottom.y < 0.05;\n const peakAboveBottoms = peak.y > firstBottom.y && peak.y > secondBottom.y;\n const significantRise = (peak.y - firstBottom.y) / firstBottom.y > 0.1;\n \n if (!bottomsApproximatelyEqual || !peakAboveBottoms || !significantRise) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Invalid double bottom structure'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstBottom, end: peak, type: 'support', strength: 0.9 },\n { start: peak, end: secondBottom, type: 'resistance', strength: 0.8 },\n { start: firstBottom, end: secondBottom, type: 'support', strength: 0.9 }\n ];\n \n const keyPoints = [firstBottom, peak, secondBottom];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on bottom equality and height of peak\n const bottomEquality = 1 - Math.abs(firstBottom.y - secondBottom.y) / firstBottom.y;\n const heightRatio = (peak.y - firstBottom.y) / firstBottom.y;\n const confidence = (bottomEquality + Math.min(heightRatio * 2, 1)) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Triangle Patterns\n// ============================================\n\nfunction validateAscendingTriangle(points: PatternPoint[]): PatternValidationResult {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points for ascending triangle'] };\n }\n \n // Find horizontal resistance line and ascending support line\n const yValues = points.map(p => p.y);\n const resistanceLevel = Math.max(...yValues);\n const resistancePoints = points.filter(p => Math.abs(p.y - resistanceLevel) / resistanceLevel < 0.02);\n \n if (resistancePoints.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient resistance points'] };\n }\n \n // Check for ascending support (higher lows)\n const lows = points.filter((p, i) => i === 0 || p.y < points[i - 1].y);\n if (lows.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient low points'] };\n }\n \n const firstLow = lows[0];\n const lastLow = lows[lows.length - 1];\n const supportSlope = calculateSlope(firstLow, lastLow);\n \n // Support should be ascending (positive slope)\n if (supportSlope <= 0) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Support not ascending'] };\n }\n \n const segments: PatternSegment[] = [\n { start: resistancePoints[0], end: resistancePoints[resistancePoints.length - 1], type: 'resistance', strength: 0.8 },\n { start: firstLow, end: lastLow, type: 'support', strength: 0.7 }\n ];\n \n const keyPoints = [...resistancePoints.slice(0, 2), firstLow, lastLow];\n const measurements = calculatePatternMeasurements(points);\n \n // Confidence based on horizontal resistance and ascending support\n const resistanceFlatness = 1 - Math.abs(resistancePoints[0].y - resistancePoints[resistancePoints.length - 1].y) / resistanceLevel;\n const supportAscending = Math.min(supportSlope / 0.01, 1); // Normalize slope\n const confidence = (resistanceFlatness + supportAscending) / 2;\n \n return {\n valid: true,\n confidence,\n segments,\n keyPoints,\n measurements\n };\n}\n\n// ============================================\n// Pattern Definitions Registry\n// ============================================\n\nexport const BUILTIN_PATTERNS: Record<PatternType, PatternDefinition> = {\n 'head-shoulders': {\n id: 'head-shoulders',\n type: 'head-shoulders',\n name: 'Head and Shoulders',\n description: 'Bearish reversal pattern with three peaks',\n minPoints: 5,\n maxPoints: 7,\n validator: validateHeadShoulders\n },\n \n 'inverse-head-shoulders': {\n id: 'inverse-head-shoulders',\n type: 'inverse-head-shoulders',\n name: 'Inverse Head and Shoulders',\n description: 'Bullish reversal pattern with three valleys',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n // Invert points and validate as regular head-shoulders\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = validateHeadShoulders(invertedPoints);\n return result;\n }\n },\n \n 'double-top': {\n id: 'double-top',\n type: 'double-top',\n name: 'Double Top',\n description: 'Bearish reversal pattern with two equal peaks',\n minPoints: 4,\n maxPoints: 6,\n validator: validateDoubleTop\n },\n \n 'double-bottom': {\n id: 'double-bottom',\n type: 'double-bottom',\n name: 'Double Bottom',\n description: 'Bullish reversal pattern with two equal valleys',\n minPoints: 4,\n maxPoints: 6,\n validator: validateDoubleBottom\n },\n \n 'triple-top': {\n id: 'triple-top',\n type: 'triple-top',\n name: 'Triple Top',\n description: 'Bearish reversal pattern with three equal peaks',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n if (points.length < 5) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const { peaks } = findPeaksAndValleys(points);\n if (peaks.length < 3) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Need at least 3 peaks'] };\n }\n \n const peak1 = peaks[0].y;\n const peak2 = peaks[1].y;\n const peak3 = peaks[2].y;\n \n const tolerance = 0.05;\n const peaksEqual = Math.abs(peak1 - peak2) / peak1 < tolerance && Math.abs(peak2 - peak3) / peak2 < tolerance;\n \n if (!peaksEqual) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Peaks not equal'] };\n }\n \n const segments: PatternSegment[] = [\n { start: peaks[0], end: peaks[1], type: 'resistance', strength: 0.8 },\n { start: peaks[1], end: peaks[2], type: 'resistance', strength: 0.8 }\n ];\n \n const keyPoints = [peaks[0], peaks[1], peaks[2]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.8,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'triple-bottom': {\n id: 'triple-bottom',\n type: 'triple-bottom',\n name: 'Triple Bottom',\n description: 'Bullish reversal pattern with three equal valleys',\n minPoints: 5,\n maxPoints: 7,\n validator: (points) => {\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n return BUILTIN_PATTERNS['triple-top'].validator(invertedPoints);\n }\n },\n \n 'ascending-triangle': {\n id: 'ascending-triangle',\n type: 'ascending-triangle',\n name: 'Ascending Triangle',\n description: 'Continuation pattern with horizontal resistance and ascending support',\n minPoints: 4,\n maxPoints: 8,\n validator: validateAscendingTriangle\n },\n \n 'descending-triangle': {\n id: 'descending-triangle',\n type: 'descending-triangle',\n name: 'Descending Triangle',\n description: 'Continuation pattern with horizontal support and descending resistance',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Invert points and validate as ascending triangle\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = validateAscendingTriangle(invertedPoints);\n return result;\n }\n },\n \n 'symmetrical-triangle': {\n id: 'symmetrical-triangle',\n type: 'symmetrical-triangle',\n name: 'Symmetrical Triangle',\n description: 'Continuation pattern with converging support and resistance',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Simplified validation for symmetrical triangle\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n // Check for converging trendlines\n const firstHalf = points.slice(0, Math.floor(points.length / 2));\n const secondHalf = points.slice(Math.floor(points.length / 2));\n \n const firstSlope = calculateSlope(firstHalf[0], firstHalf[firstHalf.length - 1]);\n const secondSlope = calculateSlope(secondHalf[0], secondHalf[secondHalf.length - 1]);\n \n // Slopes should be converging (opposite signs)\n const converging = (firstSlope > 0 && secondSlope < 0) || (firstSlope < 0 && secondSlope > 0);\n \n if (!converging) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Lines not converging'] };\n }\n \n const segments: PatternSegment[] = [\n { start: firstHalf[0], end: firstHalf[firstHalf.length - 1], type: 'trendline', strength: 0.7 },\n { start: secondHalf[0], end: secondHalf[secondHalf.length - 1], type: 'trendline', strength: 0.7 }\n ];\n \n const keyPoints = [firstHalf[0], firstHalf[firstHalf.length - 1], secondHalf[0], secondHalf[secondHalf.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.7,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'rising-wedge': {\n id: 'rising-wedge',\n type: 'rising-wedge',\n name: 'Rising Wedge',\n description: 'Bearish reversal pattern with two converging upward lines',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Simplified rising wedge validation\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const { peaks, valleys } = findPeaksAndValleys(points);\n if (peaks.length < 2 || valleys.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient peaks/valleys'] };\n }\n \n const peakSlope = calculateSlope(peaks[0], peaks[peaks.length - 1]);\n const valleySlope = calculateSlope(valleys[0], valleys[valleys.length - 1]);\n \n // Both lines should be rising but converging (valley slope > peak slope)\n const wedgePattern = peakSlope > 0 && valleySlope > 0 && valleySlope > peakSlope;\n \n if (!wedgePattern) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Not a rising wedge pattern'] };\n }\n \n const segments: PatternSegment[] = [\n { start: peaks[0], end: peaks[peaks.length - 1], type: 'resistance', strength: 0.8 },\n { start: valleys[0], end: valleys[valleys.length - 1], type: 'support', strength: 0.8 }\n ];\n \n const keyPoints = [peaks[0], peaks[peaks.length - 1], valleys[0], valleys[valleys.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.75,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'falling-wedge': {\n id: 'falling-wedge',\n type: 'falling-wedge',\n name: 'Falling Wedge',\n description: 'Bullish reversal pattern with two converging downward lines',\n minPoints: 4,\n maxPoints: 8,\n validator: (points) => {\n // Invert points and validate as rising wedge\n const invertedPoints = points.map(p => ({ ...p, y: -p.y }));\n const result = BUILTIN_PATTERNS['rising-wedge'].validator(invertedPoints);\n return result;\n }\n },\n \n 'rectangle': {\n id: 'rectangle',\n type: 'rectangle',\n name: 'Rectangle',\n description: 'Continuation pattern with horizontal support and resistance',\n minPoints: 4,\n maxPoints: 10,\n validator: (points) => {\n if (points.length < 4) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const yValues = points.map(p => p.y);\n const resistance = Math.max(...yValues);\n const support = Math.min(...yValues);\n \n // Check for relatively flat top and bottom\n const resistancePoints = points.filter(p => Math.abs(p.y - resistance) / resistance < 0.05);\n const supportPoints = points.filter(p => Math.abs(p.y - support) / support < 0.05);\n \n if (resistancePoints.length < 2 || supportPoints.length < 2) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient horizontal lines'] };\n }\n \n const segments: PatternSegment[] = [\n { start: resistancePoints[0], end: resistancePoints[resistancePoints.length - 1], type: 'resistance', strength: 0.9 },\n { start: supportPoints[0], end: supportPoints[supportPoints.length - 1], type: 'support', strength: 0.9 }\n ];\n \n const keyPoints = [resistancePoints[0], resistancePoints[resistancePoints.length - 1], supportPoints[0], supportPoints[supportPoints.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.8,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'flag': {\n id: 'flag',\n type: 'flag',\n name: 'Flag',\n description: 'Short-term continuation pattern after strong move',\n minPoints: 3,\n maxPoints: 6,\n validator: (points) => {\n // Simplified flag validation\n if (points.length < 3) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n const slope = calculateSlope(points[0], points[points.length - 1]);\n \n // Flag should be relatively horizontal (small slope)\n const horizontal = Math.abs(slope) < 0.01;\n \n if (!horizontal) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Not horizontal enough'] };\n }\n \n const segments: PatternSegment[] = [\n { start: points[0], end: points[points.length - 1], type: 'trendline', strength: 0.6 }\n ];\n \n const keyPoints = [points[0], points[points.length - 1]];\n const measurements = calculatePatternMeasurements(points);\n \n return {\n valid: true,\n confidence: 0.6,\n segments,\n keyPoints,\n measurements\n };\n }\n },\n \n 'pennant': {\n id: 'pennant',\n type: 'pennant',\n name: 'Pennant',\n description: 'Short-term continuation pattern with converging lines',\n minPoints: 3,\n maxPoints: 5,\n validator: (points) => {\n // Similar to symmetrical triangle but smaller\n return BUILTIN_PATTERNS['symmetrical-triangle'].validator(points);\n }\n },\n \n 'custom': {\n id: 'custom',\n type: 'custom',\n name: 'Custom Pattern',\n description: 'User-defined pattern',\n minPoints: 3,\n validator: (_points) => {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Custom pattern not implemented'] };\n }\n }\n};","/**\n * Pattern Recognition Plugin - Main Implementation\n * \n * Provides technical pattern recognition for financial and scientific data.\n * Supports common chart patterns and custom pattern definitions.\n * \n * @example\n * ```typescript\n * import { PluginPatternRecognition } from 'velo-plot/plugins/pattern-recognition';\n * \n * chart.use(PluginPatternRecognition({\n * defaultParameters: {\n * minConfidence: 0.7,\n * patternTypes: ['head-shoulders', 'double-top', 'ascending-triangle'],\n * sensitivity: 0.5\n * },\n * enableRealtime: true,\n * visualization: {\n * showPatterns: true,\n * showLabels: true,\n * colorScheme: {\n * 'head-shoulders': '#ff6b6b',\n * 'double-top': '#4ecdc4',\n * 'ascending-triangle': '#45b7d1'\n * }\n * }\n * }));\n * \n * // Detect patterns\n * const result = await chart.patterns.detectPatterns('series1', dataPoints);\n * console.log(`Found ${result.matches.length} patterns`);\n * \n * // Enable real-time detection\n * chart.patterns.enableRealtimeDetection('series1');\n * ```\n * \n * @packageDocumentation\n * @module plugins/pattern-recognition\n */\n\nimport type { \n PluginManifest, \n ChartPlugin, \n PluginContext,\n BeforeRenderEvent,\n DataUpdateEvent\n} from '../types';\n\nimport type {\n PluginPatternRecognitionConfig,\n PatternRecognitionAPI,\n PatternDetectionResult,\n PatternMatch,\n PatternPoint,\n PatternDetectionParameters,\n PatternType,\n CustomPatternConfig,\n PatternDefinition,\n PatternValidationResult,\n PatternDetectedEvent,\n PatternSignalEvent\n} from './types';\n\nimport { BUILTIN_PATTERNS } from './patterns';\n\n// ============================================\n// Plugin Manifest\n// ============================================\n\nconst manifestPatternRecognition: PluginManifest = {\n name: 'pattern-recognition',\n version: '1.0.0',\n description: 'Technical pattern recognition for financial and scientific data',\n author: 'Velo Plot Team',\n provides: ['patterns', 'technical-analysis', 'chart-patterns']\n};\n\n// ============================================\n// Default Configuration\n// ============================================\n\nconst DEFAULT_CONFIG: Required<PluginPatternRecognitionConfig> = {\n defaultParameters: {\n minConfidence: 0.7,\n maxPatterns: 10,\n patternTypes: ['head-shoulders', 'double-top', 'double-bottom', 'ascending-triangle', 'descending-triangle'],\n sensitivity: 0.5,\n minPatternSize: 5,\n maxPatternSize: 50,\n overlapTolerance: 0.3,\n enableVolumeConfirmation: false,\n enableTrendConfirmation: true\n },\n customPatterns: [],\n enableRealtime: false,\n debounceTime: 500,\n maxStoredPatterns: 100,\n visualization: {\n showPatterns: true,\n showLabels: true,\n showTargets: true,\n colorScheme: {\n 'head-shoulders': '#ff6b6b',\n 'inverse-head-shoulders': '#4ecdc4',\n 'double-top': '#ff9f43',\n 'double-bottom': '#00d2d3',\n 'triple-top': '#ff6b6b',\n 'triple-bottom': '#4ecdc4',\n 'ascending-triangle': '#45b7d1',\n 'descending-triangle': '#f39c12',\n 'symmetrical-triangle': '#9b59b6',\n 'rising-wedge': '#e74c3c',\n 'falling-wedge': '#27ae60',\n 'rectangle': '#34495e',\n 'flag': '#f1c40f',\n 'pennant': '#e67e22',\n 'custom': '#95a5a6'\n },\n opacity: 0.7,\n lineWidth: 2\n },\n notifications: {\n enableAlerts: false,\n minAlertConfidence: 0.8,\n alertTypes: ['head-shoulders', 'double-top', 'double-bottom']\n }\n};\n\n// ============================================\n// Pattern Recognition Plugin Implementation\n// ============================================\n\nexport function PluginPatternRecognition(\n userConfig: Partial<PluginPatternRecognitionConfig> = {}\n): ChartPlugin<PluginPatternRecognitionConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n \n // Pattern storage\n const patternMatches = new Map<string, PatternMatch[]>();\n const registeredPatterns = new Map<PatternType, PatternDefinition>(Object.entries(BUILTIN_PATTERNS) as [PatternType, PatternDefinition][]);\n // Named custom patterns, keyed by their unique id (task 3.6).\n const customPatterns = new Map<string, PatternDefinition>();\n const realtimeSeries = new Set<string>();\n const debounceTimers = new Map<string, any>();\n\n /**\n * Maps a pattern type to the directional trading bias it implies, so the\n * signal can be consumed by the Stage 2 alert system (task 3.8).\n */\n const SIGNAL_DIRECTION: Record<PatternType, 'bullish' | 'bearish' | 'neutral'> = {\n 'head-shoulders': 'bearish',\n 'inverse-head-shoulders': 'bullish',\n 'double-top': 'bearish',\n 'double-bottom': 'bullish',\n 'triple-top': 'bearish',\n 'triple-bottom': 'bullish',\n 'ascending-triangle': 'bullish',\n 'descending-triangle': 'bearish',\n 'symmetrical-triangle': 'neutral',\n 'rising-wedge': 'bearish',\n 'falling-wedge': 'bullish',\n 'rectangle': 'neutral',\n 'flag': 'neutral',\n 'pennant': 'neutral',\n 'custom': 'neutral',\n };\n\n /**\n * Scan a single pattern definition over the processed points with a sliding\n * window, pushing valid matches. Returns true when maxPatterns is reached.\n */\n function scanPattern(\n pattern: PatternDefinition,\n patternKey: PatternType | string,\n processedPoints: PatternPoint[],\n params: PatternDetectionParameters,\n seriesId: string,\n matches: PatternMatch[],\n patternsByType: Record<string, number>\n ): boolean {\n for (let i = params.minPatternSize; i <= Math.min(processedPoints.length, params.maxPatternSize); i++) {\n const window = processedPoints.slice(Math.max(0, i - params.maxPatternSize), i);\n if (window.length < pattern.minPoints) continue;\n if (pattern.maxPoints && window.length > pattern.maxPoints) continue;\n\n const validation = pattern.validator(window);\n if (validation.valid && validation.confidence >= params.minConfidence) {\n const match: PatternMatch = {\n pattern,\n confidence: validation.confidence,\n location: {\n startIndex: Math.max(0, i - params.maxPatternSize),\n endIndex: i,\n startPoint: window[0],\n endPoint: window[window.length - 1],\n },\n validation,\n timestamp: Date.now(),\n seriesId,\n };\n\n if (!hasSignificantOverlap(match, matches, params.overlapTolerance)) {\n matches.push(match);\n patternsByType[patternKey] = (patternsByType[patternKey] || 0) + 1;\n if (matches.length >= params.maxPatterns!) return true;\n }\n }\n }\n return false;\n }\n\n /** Emit a normalized trading signal for a detected pattern. */\n function emitSignal(match: PatternMatch): void {\n const direction = SIGNAL_DIRECTION[match.pattern.type] ?? 'neutral';\n ctx?.events.emit('pattern:signal', {\n seriesId: match.seriesId,\n patternType: match.pattern.type,\n patternName: match.pattern.name,\n direction,\n confidence: match.confidence,\n price: match.location.endPoint.y,\n x: match.location.endPoint.x,\n target: match.validation.measurements?.breakoutTarget,\n stopLoss: match.validation.measurements?.stopLoss,\n timestamp: match.timestamp,\n });\n }\n \n // ============================================\n // Pattern Detection Engine\n // ============================================\n \n async function detectPatterns(\n seriesId: string, \n dataPoints: PatternPoint[], \n parameters?: Partial<PatternDetectionParameters>\n ): Promise<PatternDetectionResult> {\n const params = { ...config.defaultParameters, ...parameters };\n const startTime = performance.now();\n \n const matches: PatternMatch[] = [];\n const patternsByType: Record<PatternType, number> = {} as any;\n \n // Preprocess data - find peaks and valleys\n const processedPoints = preprocessData(dataPoints, params.sensitivity);\n \n // Check each requested built-in pattern type\n let reachedLimit = false;\n for (const patternType of params.patternTypes) {\n const pattern = registeredPatterns.get(patternType);\n if (!pattern) continue;\n if (scanPattern(pattern, patternType, processedPoints, params, seriesId, matches, patternsByType)) {\n reachedLimit = true;\n break;\n }\n }\n\n // Also scan named custom patterns when the caller opts into 'custom'\n // (or provides no explicit list). Each custom pattern is keyed by its id.\n if (!reachedLimit && customPatterns.size > 0 && params.patternTypes.includes('custom')) {\n for (const [id, pattern] of customPatterns) {\n if (scanPattern(pattern, id, processedPoints, params, seriesId, matches, patternsByType)) {\n break;\n }\n }\n }\n \n // Sort by confidence\n matches.sort((a, b) => b.confidence - a.confidence);\n \n // Store matches\n patternMatches.set(seriesId, matches);\n \n const detectionTime = performance.now() - startTime;\n \n // Emit events for high-confidence patterns\n for (const match of matches) {\n // Trading signal bridge (task 3.8): every match at or above the alert\n // threshold emits a normalized directional signal.\n if (match.confidence >= config.notifications.minAlertConfidence) {\n emitSignal(match);\n }\n if (match.confidence >= config.notifications.minAlertConfidence &&\n config.notifications.alertTypes.includes(match.pattern.type)) {\n ctx?.events.emit('pattern:detected', {\n match,\n seriesId,\n timestamp: Date.now()\n } as PatternDetectedEvent);\n }\n }\n \n const result: PatternDetectionResult = {\n matches,\n summary: {\n totalPatterns: matches.length,\n patternsByType,\n averageConfidence: matches.length > 0 ? matches.reduce((sum, m) => sum + m.confidence, 0) / matches.length : 0,\n detectionTime\n },\n processedPoints: processedPoints.length,\n parameters: params\n };\n \n ctx?.log.info(`Pattern detection completed for ${seriesId}: ${matches.length} patterns found`);\n \n return result;\n }\n \n function preprocessData(dataPoints: PatternPoint[], sensitivity: number): PatternPoint[] {\n return dataPoints.filter((point, index) => {\n if (index === 0 || index === dataPoints.length - 1) return true;\n \n const prev = dataPoints[index - 1];\n \n const priceChange = Math.abs(point.y - prev.y) / prev.y;\n return priceChange >= sensitivity * 0.01;\n });\n }\n \n function hasSignificantOverlap(newMatch: PatternMatch, existingMatches: PatternMatch[], tolerance: number): boolean {\n for (const existing of existingMatches) {\n const overlapStart = Math.max(newMatch.location.startIndex, existing.location.startIndex);\n const overlapEnd = Math.min(newMatch.location.endIndex, existing.location.endIndex);\n const overlapSize = overlapEnd - overlapStart;\n \n const newMatchSize = newMatch.location.endIndex - newMatch.location.startIndex;\n const existingMatchSize = existing.location.endIndex - existing.location.startIndex;\n \n const overlapRatio = overlapSize / Math.min(newMatchSize, existingMatchSize);\n \n if (overlapRatio > tolerance) {\n return true;\n }\n }\n return false;\n }\n \n // ============================================\n // Custom Pattern Registration\n // ============================================\n \n function registerCustomPattern(customConfig: CustomPatternConfig): void {\n const pattern: PatternDefinition = {\n id: customConfig.id,\n type: 'custom',\n name: customConfig.name,\n minPoints: customConfig.pointSequence.length,\n maxPoints: customConfig.pointSequence.length,\n validator: (points) => validateCustomPattern(points, customConfig)\n };\n\n customPatterns.set(customConfig.id, pattern);\n ctx?.log.info(`Custom pattern registered: ${customConfig.id}`);\n }\n\n /**\n * Register a named custom pattern (task 3.6).\n *\n * The template can be either a full {@link PatternDefinition} (with its own\n * `validator`) or a declarative {@link CustomPatternConfig}. Multiple named\n * patterns coexist because each is stored under its own id.\n *\n * @example\n * chart.patterns.register('my-spike', {\n * name: 'Volatility Spike',\n * minPoints: 3,\n * validator: (pts) => ({ valid: true, confidence: 1, segments: [], keyPoints: pts })\n * });\n */\n function register(\n id: string,\n template: (Partial<PatternDefinition> & { validator: PatternDefinition['validator'] }) | CustomPatternConfig\n ): void {\n if ('pointSequence' in template) {\n registerCustomPattern({ ...(template as CustomPatternConfig), id });\n return;\n }\n\n const def = template as Partial<PatternDefinition> & { validator: PatternDefinition['validator'] };\n if (typeof def.validator !== 'function') {\n ctx?.log.error(`Cannot register pattern '${id}': a validator function is required`);\n return;\n }\n const pattern: PatternDefinition = {\n id,\n type: 'custom',\n name: def.name ?? id,\n description: def.description,\n minPoints: def.minPoints ?? 3,\n maxPoints: def.maxPoints,\n validator: def.validator,\n confidenceCalculator: def.confidenceCalculator,\n };\n customPatterns.set(id, pattern);\n ctx?.log.info(`Custom pattern registered: ${id}`);\n }\n\n /** Remove a previously registered custom pattern. */\n function unregister(id: string): boolean {\n const removed = customPatterns.delete(id);\n if (removed) ctx?.log.info(`Custom pattern removed: ${id}`);\n return removed;\n }\n \n function validateCustomPattern(points: PatternPoint[], config: CustomPatternConfig): PatternValidationResult {\n if (points.length < config.pointSequence.length) {\n return { valid: false, confidence: 0, segments: [], keyPoints: [], errors: ['Insufficient points'] };\n }\n \n let confidence = 1.0;\n const errors: string[] = [];\n \n for (let i = 0; i < config.pointSequence.length; i++) {\n const sequencePoint = config.pointSequence[i];\n const actualPoint = points[i];\n \n if (sequencePoint.constraints) {\n const constraints = sequencePoint.constraints;\n \n if (constraints.higherThanPrevious && i > 0) {\n if (actualPoint.y <= points[i - 1].y) {\n confidence *= 0.8;\n errors.push(`Point ${i} not higher than previous`);\n }\n }\n \n if (constraints.lowerThanPrevious && i > 0) {\n if (actualPoint.y >= points[i - 1].y) {\n confidence *= 0.8;\n errors.push(`Point ${i} not lower than previous`);\n }\n }\n \n if (constraints.withinRange) {\n const [min, max] = constraints.withinRange;\n if (actualPoint.y < min || actualPoint.y > max) {\n confidence *= 0.7;\n errors.push(`Point ${i} not within range [${min}, ${max}]`);\n }\n }\n }\n }\n \n return {\n valid: confidence >= 0.5,\n confidence,\n segments: [],\n keyPoints: points,\n errors: errors.length > 0 ? errors : undefined\n };\n }\n \n // ============================================\n // API Implementation\n // ============================================\n \n const api: PatternRecognitionAPI & Record<string, unknown> = {\n detectPatterns,\n \n registerCustomPattern,\n\n register,\n\n unregister,\n\n onSignal(handler: (signal: PatternSignalEvent) => void): () => void {\n return ctx?.events.onPlugin('pattern:signal', (data) => handler(data as PatternSignalEvent)) ?? (() => {});\n },\n \n getRegisteredPatterns(): PatternDefinition[] {\n return [...registeredPatterns.values(), ...customPatterns.values()];\n },\n \n getPatternMatches(seriesId: string): PatternMatch[] {\n return patternMatches.get(seriesId) || [];\n },\n \n clearPatternMatches(seriesId: string): void {\n patternMatches.delete(seriesId);\n ctx?.log.info(`Pattern matches cleared for series: ${seriesId}`);\n },\n \n enableRealtimeDetection(seriesId: string, parameters?: Partial<PatternDetectionParameters>): void {\n realtimeSeries.add(seriesId);\n \n const chart = ctx?.chart;\n if (chart) {\n const targetSeries = chart.getSeries(seriesId);\n if (targetSeries) {\n const data = targetSeries.getData();\n if (data && data.x.length > 0) {\n const points: PatternPoint[] = Array.from(data.x).map((x, i) => ({\n x: x as number,\n y: data.y[i]\n }));\n \n detectPatterns(seriesId, points, parameters);\n }\n }\n }\n \n ctx?.log.info(`Real-time pattern detection enabled for series: ${seriesId}`);\n },\n \n disableRealtimeDetection(seriesId: string): void {\n realtimeSeries.delete(seriesId);\n \n const timer = debounceTimers.get(seriesId);\n if (timer) {\n clearTimeout(timer);\n debounceTimers.delete(seriesId);\n }\n \n ctx?.log.info(`Real-time pattern detection disabled for series: ${seriesId}`);\n },\n \n getStatistics(seriesId?: string) {\n if (seriesId) {\n const matches = patternMatches.get(seriesId) || [];\n const patternsByType: Record<PatternType, number> = {} as any;\n \n for (const match of matches) {\n patternsByType[match.pattern.type] = (patternsByType[match.pattern.type] || 0) + 1;\n }\n \n return {\n totalDetections: matches.length,\n patternsByType,\n averageConfidence: matches.length > 0 ? matches.reduce((sum, m) => sum + m.confidence, 0) / matches.length : 0,\n detectionRate: matches.length / 100\n };\n } else {\n let totalDetections = 0;\n const allPatternsByType: Record<PatternType, number> = {} as any;\n const allConfidences: number[] = [];\n \n for (const matches of patternMatches.values()) {\n totalDetections += matches.length;\n allConfidences.push(...matches.map(m => m.confidence));\n \n for (const match of matches) {\n allPatternsByType[match.pattern.type] = (allPatternsByType[match.pattern.type] || 0) + 1;\n }\n }\n \n return {\n totalDetections,\n patternsByType: allPatternsByType,\n averageConfidence: allConfidences.length > 0 ? allConfidences.reduce((sum, c) => sum + c, 0) / allConfidences.length : 0,\n detectionRate: totalDetections / 100\n };\n }\n },\n \n updateConfig: (newConfig: Partial<PluginPatternRecognitionConfig>) => {\n Object.assign(config, newConfig);\n },\n \n getConfig: () => ({ ...config }),\n \n visualizePatterns(seriesId: string, showTypes?: PatternType[]): void {\n const chart = ctx?.chart;\n if (!chart) return;\n \n const matches = patternMatches.get(seriesId) || [];\n const filteredMatches = showTypes ? matches.filter(m => showTypes.includes(m.pattern.type)) : matches;\n \n api.hidePatterns(seriesId);\n \n for (const match of filteredMatches) {\n const color = config.visualization.colorScheme[match.pattern.type] || '#666666';\n \n for (const segment of match.validation.segments) {\n const lineId = `${seriesId}_pattern_${match.pattern.id}_${match.location.startIndex}`;\n \n chart.addSeries({\n id: lineId,\n type: 'line',\n data: {\n x: new Float32Array([segment.start.x, segment.end.x]),\n y: new Float32Array([segment.start.y, segment.end.y])\n },\n style: {\n color,\n width: config.visualization.lineWidth,\n opacity: config.visualization.opacity,\n lineDash: [5, 5]\n }\n });\n }\n \n if (config.visualization.showLabels) {\n const labelId = `${seriesId}_label_${match.pattern.id}_${match.location.startIndex}`;\n const centerX = (match.location.startPoint.x + match.location.endPoint.x) / 2;\n const centerY = (match.location.startPoint.y + match.location.endPoint.y) / 2;\n \n chart.addAnnotation({\n id: labelId,\n type: 'text',\n text: match.pattern.name,\n x: centerX,\n y: centerY,\n style: {\n color,\n fontSize: 12,\n backgroundColor: 'rgba(255, 255, 255, 0.8)'\n }\n } as any);\n }\n }\n },\n \n hidePatterns(seriesId: string): void {\n const chart = ctx?.chart;\n if (!chart) return;\n \n const matches = patternMatches.get(seriesId) || [];\n \n for (const match of matches) {\n for (let i = 0; i < match.validation.segments.length; i++) {\n const lineId = `${seriesId}_pattern_${match.pattern.id}_${match.location.startIndex}`;\n if (chart.getSeries(lineId)) {\n chart.removeSeries(lineId);\n }\n }\n \n const labelId = `${seriesId}_label_${match.pattern.id}_${match.location.startIndex}`;\n if (chart.getAnnotation(labelId)) {\n chart.removeAnnotation(labelId);\n }\n }\n }\n };\n \n // ============================================\n // Event Handlers\n // ============================================\n \n function handleDataUpdate(context: PluginContext, event: DataUpdateEvent): void {\n if (!config.enableRealtime) return;\n \n const { seriesId } = event;\n \n if (realtimeSeries.has(seriesId)) {\n const timer = debounceTimers.get(seriesId);\n if (timer) {\n clearTimeout(timer);\n }\n \n const newTimer = setTimeout(() => {\n const chart = context.chart;\n if (chart) {\n const series = chart.getSeries(seriesId);\n if (series) {\n const data = series.getData();\n if (data && data.x.length > 0) {\n const points: PatternPoint[] = Array.from(data.x).map((x, i) => ({\n x: x as number,\n y: data.y[i]\n }));\n \n detectPatterns(seriesId, points);\n \n if (config.visualization.showPatterns) {\n api.visualizePatterns(seriesId);\n }\n }\n }\n }\n }, config.debounceTime);\n \n debounceTimers.set(seriesId, newTimer);\n }\n }\n \n // ============================================\n // Plugin Definition\n // ============================================\n \n return {\n manifest: manifestPatternRecognition,\n \n onInit(context: PluginContext) {\n ctx = context;\n \n if (config.customPatterns) {\n for (const customPattern of config.customPatterns) {\n registerCustomPattern(customPattern);\n }\n }\n \n ctx.log.info(`Pattern Recognition plugin initialized with ${registeredPatterns.size} patterns`);\n },\n \n onConfigChange(_context: PluginContext, _newConfig: PluginPatternRecognitionConfig) {\n // Handle config changes\n },\n \n onBeforeRender(_context: PluginContext, _event: BeforeRenderEvent) {\n // Handle pre-render tasks if needed\n },\n \n onDataUpdate: handleDataUpdate,\n \n onDestroy(_context: PluginContext) {\n for (const timer of debounceTimers.values()) {\n clearTimeout(timer);\n }\n debounceTimers.clear();\n \n patternMatches.clear();\n realtimeSeries.clear();\n registeredPatterns.clear();\n customPatterns.clear();\n },\n \n api\n };\n}\n\nexport default PluginPatternRecognition;\n\nexport type {\n PatternType,\n PatternDefinition,\n PatternPoint,\n PatternSegment,\n PatternValidationResult,\n PatternMeasurements,\n PatternMatch,\n PatternDetectionResult,\n PatternDetectionParameters,\n CustomPatternConfig,\n PluginPatternRecognitionConfig,\n PatternDetectedEvent,\n PatternCompletedEvent,\n PatternFailedEvent,\n PatternRecognitionAPI\n} from './types';\n"],"names":["findPeaksAndValleys","points","peaks","valleys","i","prev","curr","next","calculateSlope","p1","p2","calculatePatternMeasurements","yValues","p","xValues","height","width","slope","validateHeadShoulders","leftShoulder","head","rightShoulder","leftValley","rightValley","headHigherThanShoulders","shouldersApproximatelyEqual","valleyBelowShoulders","segments","keyPoints","measurements","shoulderSymmetry","valleySymmetry","validateDoubleTop","firstTop","secondTop","valley","topsApproximatelyEqual","valleyBelowTops","significantDrop","topEquality","depthRatio","validateDoubleBottom","firstBottom","secondBottom","peak","bottomsApproximatelyEqual","peakAboveBottoms","significantRise","bottomEquality","heightRatio","validateAscendingTriangle","resistanceLevel","resistancePoints","lows","firstLow","lastLow","supportSlope","resistanceFlatness","supportAscending","BUILTIN_PATTERNS","invertedPoints","peak1","peak2","peak3","tolerance","firstHalf","secondHalf","firstSlope","secondSlope","peakSlope","valleySlope","resistance","support","supportPoints","_points","manifestPatternRecognition","DEFAULT_CONFIG","PluginPatternRecognition","userConfig","config","ctx","patternMatches","registeredPatterns","customPatterns","realtimeSeries","debounceTimers","SIGNAL_DIRECTION","scanPattern","pattern","patternKey","processedPoints","params","seriesId","matches","patternsByType","window","validation","match","hasSignificantOverlap","emitSignal","_a","_b","direction","detectPatterns","dataPoints","parameters","startTime","preprocessData","reachedLimit","patternType","id","a","b","detectionTime","result","sum","m","sensitivity","point","index","newMatch","existingMatches","existing","overlapStart","overlapSize","newMatchSize","existingMatchSize","registerCustomPattern","customConfig","validateCustomPattern","register","template","def","unregister","removed","confidence","errors","sequencePoint","actualPoint","constraints","min","max","api","handler","data","chart","targetSeries","x","timer","totalDetections","allPatternsByType","allConfidences","c","newConfig","showTypes","filteredMatches","color","segment","lineId","labelId","centerX","centerY","handleDataUpdate","context","event","newTimer","series","customPattern","_context","_newConfig","_event"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  export * from './radar/index'
2
- import SciPlot from './radar/index'
3
- export default SciPlot
2
+ import VeloPlot from './radar/index'
3
+ export default VeloPlot
@@ -1,3 +1,3 @@
1
1
  export * from './regression/index'
2
- import SciPlot from './regression/index'
3
- export default SciPlot
2
+ import VeloPlot from './regression/index'
3
+ export default VeloPlot