drizzle-cube 0.11.2 → 0.12.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 (259) hide show
  1. package/dist/adapters/ActivityGridChart.config-D2pyoHSf.cjs +1 -0
  2. package/dist/adapters/ActivityGridChart.config-DW-AgFxA.js +2 -0
  3. package/dist/adapters/AreaChart.config-BP3BU4W2.js +2 -0
  4. package/dist/adapters/AreaChart.config-CRyAhIvc.cjs +1 -0
  5. package/dist/adapters/BarChart.config-A6F0Q9OX.cjs +1 -0
  6. package/dist/adapters/BarChart.config-BInCLrWt.js +2 -0
  7. package/dist/adapters/BoxPlotChart.config-DUTvglWv.cjs +1 -0
  8. package/dist/adapters/BoxPlotChart.config-DXvJdMSr.js +2 -0
  9. package/dist/adapters/BubbleChart.config-B66v-bb5.cjs +1 -0
  10. package/dist/adapters/BubbleChart.config-nIFyWuBW.js +2 -0
  11. package/dist/adapters/CandlestickChart.config-C05c1RMZ.cjs +1 -0
  12. package/dist/adapters/CandlestickChart.config-D4axcOge.js +2 -0
  13. package/dist/adapters/DataTable.config-BOIQnyoS.js +2 -0
  14. package/dist/adapters/DataTable.config-CeFswxJI.cjs +1 -0
  15. package/dist/adapters/DotStripChart.config-B4DU-F1R.cjs +1 -0
  16. package/dist/adapters/DotStripChart.config-BsWG7BRS.js +2 -0
  17. package/dist/adapters/FunnelChart.config-BuAkxiFx.js +2 -0
  18. package/dist/adapters/FunnelChart.config-CEVsDKfR.cjs +1 -0
  19. package/dist/adapters/GaugeChart.config-JhbBQ77o.cjs +1 -0
  20. package/dist/adapters/GaugeChart.config-g3iF-G9g.js +2 -0
  21. package/dist/adapters/HeatMapChart.config-BzSlU0B1.cjs +1 -0
  22. package/dist/adapters/HeatMapChart.config-C6D638Sr.js +2 -0
  23. package/dist/adapters/KpiDelta.config-B5UKJ4n-.js +2 -0
  24. package/dist/adapters/KpiDelta.config-C3E_pfdr.cjs +1 -0
  25. package/dist/adapters/KpiNumber.config-B8mACkJy.js +2 -0
  26. package/dist/adapters/KpiNumber.config-BgNPzbNS.cjs +1 -0
  27. package/dist/adapters/KpiText.config-BsXkIGNW.js +2 -0
  28. package/dist/adapters/KpiText.config-vp2VuogK.cjs +1 -0
  29. package/dist/adapters/LineChart.config-B3NcBB9q.cjs +1 -0
  30. package/dist/adapters/LineChart.config-D_CAQVHv.js +2 -0
  31. package/dist/adapters/MarkdownChart.config-D_oVj4zs.js +2 -0
  32. package/dist/adapters/MarkdownChart.config-zhKb-tLR.cjs +1 -0
  33. package/dist/adapters/MeasureProfileChart.config-B-wBjGdA.cjs +1 -0
  34. package/dist/adapters/MeasureProfileChart.config-bRBJlzNa.js +2 -0
  35. package/dist/adapters/PieChart.config-CR9SlQ2E.cjs +1 -0
  36. package/dist/adapters/PieChart.config-DeGWqMNO.js +2 -0
  37. package/dist/adapters/ProportionBarChart.config-Bz0ssM8J.cjs +1 -0
  38. package/dist/adapters/ProportionBarChart.config-CXhHPnpM.js +2 -0
  39. package/dist/adapters/RadarChart.config-ColTmOOV.js +2 -0
  40. package/dist/adapters/RadarChart.config-QV34AUcy.cjs +1 -0
  41. package/dist/adapters/RadialBarChart.config-BU4kj-pP.js +2 -0
  42. package/dist/adapters/RadialBarChart.config-CxBOhmiO.cjs +1 -0
  43. package/dist/adapters/RecordsTable.config-B51ugEpH.js +2 -0
  44. package/dist/adapters/RecordsTable.config-LxS0O10c.cjs +1 -0
  45. package/dist/adapters/RetentionCombinedChart.config-DjunHInA.cjs +1 -0
  46. package/dist/adapters/RetentionCombinedChart.config-Xna3wl8a.js +2 -0
  47. package/dist/adapters/RetentionHeatmap.config-DJBHUdn1.cjs +1 -0
  48. package/dist/adapters/RetentionHeatmap.config-DMAmGV7x.js +2 -0
  49. package/dist/adapters/SankeyChart.config-CKuUbXMt.js +2 -0
  50. package/dist/adapters/SankeyChart.config-JrhBtNH4.cjs +1 -0
  51. package/dist/adapters/ScatterChart.config-BARL2-vh.cjs +1 -0
  52. package/dist/adapters/ScatterChart.config-Ch4yWKYL.js +2 -0
  53. package/dist/adapters/SunburstChart.config-CbvgqJ8d.cjs +1 -0
  54. package/dist/adapters/SunburstChart.config-Q89VT8vO.js +2 -0
  55. package/dist/adapters/TreeMapChart.config-Bee0ahde.js +2 -0
  56. package/dist/adapters/TreeMapChart.config-Dz1mOrnC.cjs +1 -0
  57. package/dist/adapters/WaterfallChart.config-BCJ4ZD6x.cjs +1 -0
  58. package/dist/adapters/WaterfallChart.config-Bz3tEEKN.js +2 -0
  59. package/dist/adapters/{compiler-BhityGUO.js → compiler-Cfy_zqyJ.js} +1 -1
  60. package/dist/adapters/{compiler-B-yljK02.cjs → compiler-ia3Lmjpw.cjs} +1 -1
  61. package/dist/adapters/core/index.cjs +1 -1
  62. package/dist/adapters/core/index.js +1 -1
  63. package/dist/adapters/{core-CQOrzBNh.cjs → core-ClA09uBX.cjs} +1 -1
  64. package/dist/adapters/{core-xZE0miIu.js → core-D4mTEaeK.js} +2 -2
  65. package/dist/adapters/express/index.cjs +1 -1
  66. package/dist/adapters/express/index.js +5 -5
  67. package/dist/adapters/fastify/index.cjs +1 -1
  68. package/dist/adapters/fastify/index.js +5 -5
  69. package/dist/adapters/{handler-ByeQ0-1r.js → handler-Bnp5LEMQ.js} +34 -33
  70. package/dist/adapters/{handler-DSNmfv1R.cjs → handler-TCnGdCyr.cjs} +3 -3
  71. package/dist/adapters/hono/index.cjs +1 -1
  72. package/dist/adapters/hono/index.js +4 -4
  73. package/dist/adapters/mcp-app-html-D37s8SEa.js +5 -0
  74. package/dist/adapters/mcp-app-html-MZNCuL3w.cjs +1 -0
  75. package/dist/adapters/mcp-app-html.cjs +1 -1
  76. package/dist/adapters/mcp-app-html.js +1 -1
  77. package/dist/adapters/mcp-tools.cjs +1 -1
  78. package/dist/adapters/mcp-tools.js +3 -3
  79. package/dist/adapters/{mcp-transport-DnLP5FPL.cjs → mcp-transport-6CWmHVtJ.cjs} +2 -2
  80. package/dist/adapters/{mcp-transport-Cy6n4uj1.js → mcp-transport-cd2BlW-Z.js} +28 -4
  81. package/dist/adapters/nextjs/index.cjs +1 -1
  82. package/dist/adapters/nextjs/index.js +5 -5
  83. package/dist/adapters/{openai-D3Nt6Bj7.js → openai-CIIYPf0X.js} +1 -1
  84. package/dist/adapters/{openai-z1ai-G4Q.cjs → openai-Cl5zHeHg.cjs} +1 -1
  85. package/dist/adapters/{openai-C4HrjyJj.js → openai-DioFEjMP.js} +1 -1
  86. package/dist/adapters/{openai-BQl0yJCS.cjs → openai-yJ8nX3dq.cjs} +1 -1
  87. package/dist/adapters/{utils-BaxFceDq.js → utils-B3_hJWlf.js} +9 -0
  88. package/dist/adapters/{utils-a2p2B6x8.cjs → utils-CeveyqY3.cjs} +1 -1
  89. package/dist/adapters/utils.cjs +1 -1
  90. package/dist/adapters/utils.js +1 -1
  91. package/dist/cjs/client/charts/chartConfigs.d.ts +17 -0
  92. package/dist/cjs/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +9 -2
  93. package/dist/cjs/client/types.d.ts +15 -1
  94. package/dist/cjs/client/utils/recordsTableUtils.d.ts +6 -3
  95. package/dist/cjs/server/ai/chart-schema.d.ts +25 -2
  96. package/dist/client/charts/chartConfigs.d.ts +17 -0
  97. package/dist/client/charts.js +12 -12
  98. package/dist/client/chunks/{DashboardEditModal-BrZuaG5z.js → DashboardEditModal-BFC08Qog.js} +315 -198
  99. package/dist/client/chunks/DashboardEditModal-BFC08Qog.js.map +1 -0
  100. package/dist/client/chunks/{DotStripChart-B9IVCFPO.js → DotStripChart-BwitDmpR.js} +3 -3
  101. package/dist/client/chunks/{DotStripChart-B9IVCFPO.js.map → DotStripChart-BwitDmpR.js.map} +1 -1
  102. package/dist/client/chunks/{ProportionBarChart-DieF9AzP.js → ProportionBarChart-CpUHH9UH.js} +3 -3
  103. package/dist/client/chunks/{ProportionBarChart-DieF9AzP.js.map → ProportionBarChart-CpUHH9UH.js.map} +1 -1
  104. package/dist/client/chunks/{RecordsTable-Mo3ai5_M.js → RecordsTable-BoQZiVVM.js} +85 -63
  105. package/dist/client/chunks/RecordsTable-BoQZiVVM.js.map +1 -0
  106. package/dist/client/chunks/{RetentionCombinedChart-Bie4ADyA.js → RetentionCombinedChart-Dd07baUu.js} +3 -3
  107. package/dist/client/chunks/{RetentionCombinedChart-Bie4ADyA.js.map → RetentionCombinedChart-Dd07baUu.js.map} +1 -1
  108. package/dist/client/chunks/{RetentionHeatmap-qstIAx5B.js → RetentionHeatmap-DlD2XmJe.js} +2 -2
  109. package/dist/client/chunks/{RetentionHeatmap-qstIAx5B.js.map → RetentionHeatmap-DlD2XmJe.js.map} +1 -1
  110. package/dist/client/chunks/{analysis-builder-CwKFNoe7.js → analysis-builder-DVWOTd7e.js} +9 -9
  111. package/dist/client/chunks/{analysis-builder-CwKFNoe7.js.map → analysis-builder-DVWOTd7e.js.map} +1 -1
  112. package/dist/client/chunks/{analysis-builder-shared-D1SsD4qC.js → analysis-builder-shared-CXDGMDB-.js} +9 -9
  113. package/dist/client/chunks/{analysis-builder-shared-D1SsD4qC.js.map → analysis-builder-shared-CXDGMDB-.js.map} +1 -1
  114. package/dist/client/chunks/{chart-activity-grid-Ly_-2B-f.js → chart-activity-grid-BHaBagS8.js} +12 -3
  115. package/dist/client/chunks/chart-activity-grid-BHaBagS8.js.map +1 -0
  116. package/dist/client/chunks/{chart-area-D3l-71Wy.js → chart-area-9lHCX2OO.js} +2 -2
  117. package/dist/client/chunks/{chart-area-D3l-71Wy.js.map → chart-area-9lHCX2OO.js.map} +1 -1
  118. package/dist/client/chunks/{chart-bar-BaTyQOqs.js → chart-bar-Dk1CH41V.js} +3 -3
  119. package/dist/client/chunks/{chart-bar-BaTyQOqs.js.map → chart-bar-Dk1CH41V.js.map} +1 -1
  120. package/dist/client/chunks/{chart-box-plot-Cem6PHjz.js → chart-box-plot-CMkzjTFz.js} +2 -2
  121. package/dist/client/chunks/{chart-box-plot-Cem6PHjz.js.map → chart-box-plot-CMkzjTFz.js.map} +1 -1
  122. package/dist/client/chunks/{chart-bubble-DFlfqCDG.js → chart-bubble-q8f7wXlp.js} +2 -2
  123. package/dist/client/chunks/{chart-bubble-DFlfqCDG.js.map → chart-bubble-q8f7wXlp.js.map} +1 -1
  124. package/dist/client/chunks/{chart-candlestick-BkAFBXtZ.js → chart-candlestick-DTX3wu-1.js} +2 -2
  125. package/dist/client/chunks/{chart-candlestick-BkAFBXtZ.js.map → chart-candlestick-DTX3wu-1.js.map} +1 -1
  126. package/dist/client/chunks/{chart-data-table-Cxd0cdAl.js → chart-data-table-BYQzVqtc.js} +4 -3
  127. package/dist/client/chunks/chart-data-table-BYQzVqtc.js.map +1 -0
  128. package/dist/client/chunks/{chart-funnel-71Kn4eeF.js → chart-funnel-CxW1voDU.js} +2 -2
  129. package/dist/client/chunks/{chart-funnel-71Kn4eeF.js.map → chart-funnel-CxW1voDU.js.map} +1 -1
  130. package/dist/client/chunks/{chart-gauge-BddS_9oS.js → chart-gauge-0M-Jufnw.js} +3 -3
  131. package/dist/client/chunks/{chart-gauge-BddS_9oS.js.map → chart-gauge-0M-Jufnw.js.map} +1 -1
  132. package/dist/client/chunks/{chart-heat-map-BQIsrn8m.js → chart-heat-map-BZvPdZAu.js} +3 -3
  133. package/dist/client/chunks/{chart-heat-map-BQIsrn8m.js.map → chart-heat-map-BZvPdZAu.js.map} +1 -1
  134. package/dist/client/chunks/{chart-kpi-delta-DndbqdZT.js → chart-kpi-delta-De-F9NUk.js} +3 -3
  135. package/dist/client/chunks/{chart-kpi-delta-DndbqdZT.js.map → chart-kpi-delta-De-F9NUk.js.map} +1 -1
  136. package/dist/client/chunks/{chart-kpi-number-DAbfoHMt.js → chart-kpi-number-MSdv2_ha.js} +5 -5
  137. package/dist/client/chunks/{chart-kpi-number-DAbfoHMt.js.map → chart-kpi-number-MSdv2_ha.js.map} +1 -1
  138. package/dist/client/chunks/{chart-kpi-text-D8oQgpxL.js → chart-kpi-text-Zt9JlUi2.js} +3 -3
  139. package/dist/client/chunks/{chart-kpi-text-D8oQgpxL.js.map → chart-kpi-text-Zt9JlUi2.js.map} +1 -1
  140. package/dist/client/chunks/{chart-line-BNqjUowg.js → chart-line-VFRY7_Zn.js} +3 -3
  141. package/dist/client/chunks/{chart-line-BNqjUowg.js.map → chart-line-VFRY7_Zn.js.map} +1 -1
  142. package/dist/client/chunks/{chart-markdown-XWU1MyCy.js → chart-markdown-RumOX5HX.js} +2 -2
  143. package/dist/client/chunks/{chart-markdown-XWU1MyCy.js.map → chart-markdown-RumOX5HX.js.map} +1 -1
  144. package/dist/client/chunks/{chart-measure-profile-D5nZMWlI.js → chart-measure-profile-5FFyPuV_.js} +3 -3
  145. package/dist/client/chunks/{chart-measure-profile-D5nZMWlI.js.map → chart-measure-profile-5FFyPuV_.js.map} +1 -1
  146. package/dist/client/chunks/{chart-pie-D8r9HCZ4.js → chart-pie-Bf5SbxZt.js} +3 -3
  147. package/dist/client/chunks/{chart-pie-D8r9HCZ4.js.map → chart-pie-Bf5SbxZt.js.map} +1 -1
  148. package/dist/client/chunks/{chart-radar-R4PuCIWp.js → chart-radar-D9NgUbth.js} +3 -3
  149. package/dist/client/chunks/{chart-radar-R4PuCIWp.js.map → chart-radar-D9NgUbth.js.map} +1 -1
  150. package/dist/client/chunks/{chart-radial-bar-hmrSFa6O.js → chart-radial-bar-BlFXSc1c.js} +3 -3
  151. package/dist/client/chunks/{chart-radial-bar-hmrSFa6O.js.map → chart-radial-bar-BlFXSc1c.js.map} +1 -1
  152. package/dist/client/chunks/{chart-sankey-CFXPybny.js → chart-sankey-BkanN_ql.js} +2 -2
  153. package/dist/client/chunks/{chart-sankey-CFXPybny.js.map → chart-sankey-BkanN_ql.js.map} +1 -1
  154. package/dist/client/chunks/{chart-scatter-CH82md0L.js → chart-scatter-DqqWojlQ.js} +3 -3
  155. package/dist/client/chunks/{chart-scatter-CH82md0L.js.map → chart-scatter-DqqWojlQ.js.map} +1 -1
  156. package/dist/client/chunks/{chart-sunburst-CTj95eEC.js → chart-sunburst-BMhXLThV.js} +3 -3
  157. package/dist/client/chunks/{chart-sunburst-CTj95eEC.js.map → chart-sunburst-BMhXLThV.js.map} +1 -1
  158. package/dist/client/chunks/{chart-tree-map-CmysE4bF.js → chart-tree-map-eaHTIJ76.js} +3 -3
  159. package/dist/client/chunks/{chart-tree-map-CmysE4bF.js.map → chart-tree-map-eaHTIJ76.js.map} +1 -1
  160. package/dist/client/chunks/{chart-waterfall-Bv1mPvlB.js → chart-waterfall-4MOpuCrR.js} +3 -3
  161. package/dist/client/chunks/{chart-waterfall-Bv1mPvlB.js.map → chart-waterfall-4MOpuCrR.js.map} +1 -1
  162. package/dist/client/chunks/{charts-core-BdEQgbqN.js → charts-core-CTTLxFYp.js} +2 -2
  163. package/dist/client/chunks/{charts-core-BdEQgbqN.js.map → charts-core-CTTLxFYp.js.map} +1 -1
  164. package/dist/client/chunks/charts-loader-DQ7MgPWB.js +87 -0
  165. package/dist/client/chunks/{charts-loader-DMdE-Azc.js.map → charts-loader-DQ7MgPWB.js.map} +1 -1
  166. package/dist/client/chunks/{en-US-HP6FHuNy.js → en-US-CXODg-om.js} +3 -1
  167. package/dist/client/chunks/{en-US-HP6FHuNy.js.map → en-US-CXODg-om.js.map} +1 -1
  168. package/dist/client/chunks/{nl-NL-DVZXf8U7.js → nl-NL-CpH637df.js} +10 -1
  169. package/dist/client/chunks/nl-NL-CpH637df.js.map +1 -0
  170. package/dist/client/chunks/{schema-visualization-MlRrcJQH.js → schema-visualization-26uy1UwE.js} +3 -3
  171. package/dist/client/chunks/{schema-visualization-MlRrcJQH.js.map → schema-visualization-26uy1UwE.js.map} +1 -1
  172. package/dist/client/chunks/{useDirtyStateTracking-DUyYwuN_.js → useDirtyStateTracking-CnEIH78A.js} +4 -4
  173. package/dist/client/chunks/{useDirtyStateTracking-DUyYwuN_.js.map → useDirtyStateTracking-CnEIH78A.js.map} +1 -1
  174. package/dist/client/chunks/{useExplainAI-BtoS3tb5.js → useExplainAI-SbAIGXOr.js} +4 -4
  175. package/dist/client/chunks/{useExplainAI-BtoS3tb5.js.map → useExplainAI-SbAIGXOr.js.map} +1 -1
  176. package/dist/client/chunks/{vendor-BfBpNmMa.js → vendor-Cn44d7zS.js} +2 -2
  177. package/dist/client/chunks/{vendor-BfBpNmMa.js.map → vendor-Cn44d7zS.js.map} +1 -1
  178. package/dist/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +9 -2
  179. package/dist/client/components.js +1 -1
  180. package/dist/client/hooks.js +3 -3
  181. package/dist/client/icons.js +1 -1
  182. package/dist/client/index.js +13 -13
  183. package/dist/client/providers.js +1 -1
  184. package/dist/client/schema.js +1 -1
  185. package/dist/client/types.d.ts +15 -1
  186. package/dist/client/utils/recordsTableUtils.d.ts +6 -3
  187. package/dist/client/utils.js +4 -4
  188. package/dist/client-bundle-stats.html +1 -1
  189. package/dist/mcp-app/mcp-app.html +69 -69
  190. package/dist/server/ai/chart-schema.d.ts +25 -2
  191. package/dist/server/index.cjs +3 -3
  192. package/dist/server/index.js +37 -3
  193. package/package.json +1 -1
  194. package/dist/adapters/ActivityGridChart.config-XMtoteb6.js +0 -2
  195. package/dist/adapters/ActivityGridChart.config-h1AXPvn0.cjs +0 -1
  196. package/dist/adapters/AreaChart.config-DYf9wufo.cjs +0 -1
  197. package/dist/adapters/AreaChart.config-We6b53aT.js +0 -2
  198. package/dist/adapters/BarChart.config-4SX44IYv.cjs +0 -1
  199. package/dist/adapters/BarChart.config-CwBnyptL.js +0 -2
  200. package/dist/adapters/BoxPlotChart.config-BzNe-FlW.cjs +0 -1
  201. package/dist/adapters/BoxPlotChart.config-mfAHqmcp.js +0 -2
  202. package/dist/adapters/BubbleChart.config-CBT5jMdc.cjs +0 -1
  203. package/dist/adapters/BubbleChart.config-DxG_Umal.js +0 -2
  204. package/dist/adapters/CandlestickChart.config-Cqw3XP1h.js +0 -2
  205. package/dist/adapters/CandlestickChart.config-DPSSlzUD.cjs +0 -1
  206. package/dist/adapters/DataTable.config-DS1bvaDu.js +0 -2
  207. package/dist/adapters/DataTable.config-D_NsMeyz.cjs +0 -1
  208. package/dist/adapters/DotStripChart.config-BApWn6QV.cjs +0 -1
  209. package/dist/adapters/DotStripChart.config-Bdk5-YfB.js +0 -2
  210. package/dist/adapters/FunnelChart.config-BT5up_Bg.cjs +0 -1
  211. package/dist/adapters/FunnelChart.config-ISZiz9fn.js +0 -2
  212. package/dist/adapters/GaugeChart.config-Biaq1cKc.cjs +0 -1
  213. package/dist/adapters/GaugeChart.config-BjGfB84t.js +0 -2
  214. package/dist/adapters/HeatMapChart.config-Bmca8KiH.cjs +0 -1
  215. package/dist/adapters/HeatMapChart.config-uWvR0B-N.js +0 -2
  216. package/dist/adapters/KpiDelta.config-CJeDdj_1.js +0 -2
  217. package/dist/adapters/KpiDelta.config-CKr9pAxL.cjs +0 -1
  218. package/dist/adapters/KpiNumber.config-6YLEF2fy.cjs +0 -1
  219. package/dist/adapters/KpiNumber.config-C00M46GA.js +0 -2
  220. package/dist/adapters/KpiText.config-C8Av_D2W.cjs +0 -1
  221. package/dist/adapters/KpiText.config-bKTHob0C.js +0 -2
  222. package/dist/adapters/LineChart.config-DH68HT_B.js +0 -2
  223. package/dist/adapters/LineChart.config-DPq7GvL9.cjs +0 -1
  224. package/dist/adapters/MarkdownChart.config-CaaJPO3c.js +0 -2
  225. package/dist/adapters/MarkdownChart.config-ca_UyhWJ.cjs +0 -1
  226. package/dist/adapters/MeasureProfileChart.config-C1Il0IqL.cjs +0 -1
  227. package/dist/adapters/MeasureProfileChart.config-DMOnkmb6.js +0 -2
  228. package/dist/adapters/PieChart.config-Bg-8cxWK.js +0 -2
  229. package/dist/adapters/PieChart.config-joJcF--K.cjs +0 -1
  230. package/dist/adapters/ProportionBarChart.config-B2sltKsI.cjs +0 -1
  231. package/dist/adapters/ProportionBarChart.config-BlCedy1v.js +0 -2
  232. package/dist/adapters/RadarChart.config-DD1pX6FZ.js +0 -2
  233. package/dist/adapters/RadarChart.config-DVCCLSVw.cjs +0 -1
  234. package/dist/adapters/RadialBarChart.config--VIE2jMM.js +0 -2
  235. package/dist/adapters/RadialBarChart.config-BZwyWhTg.cjs +0 -1
  236. package/dist/adapters/RecordsTable.config-CTBQc-2r.js +0 -2
  237. package/dist/adapters/RecordsTable.config-DPdO0DL5.cjs +0 -1
  238. package/dist/adapters/RetentionCombinedChart.config-PGVxnkRL.js +0 -2
  239. package/dist/adapters/RetentionCombinedChart.config-mX5PMh82.cjs +0 -1
  240. package/dist/adapters/RetentionHeatmap.config-Co-JMzBm.js +0 -2
  241. package/dist/adapters/RetentionHeatmap.config-Cub3-ksy.cjs +0 -1
  242. package/dist/adapters/SankeyChart.config-BkIyUcAE.cjs +0 -1
  243. package/dist/adapters/SankeyChart.config-DGTnRmYg.js +0 -2
  244. package/dist/adapters/ScatterChart.config-CdZrBorg.js +0 -2
  245. package/dist/adapters/ScatterChart.config-CwN9niUL.cjs +0 -1
  246. package/dist/adapters/SunburstChart.config-D0ZkRSJv.cjs +0 -1
  247. package/dist/adapters/SunburstChart.config-RF3uu5Sa.js +0 -2
  248. package/dist/adapters/TreeMapChart.config-B2Yn_V7p.cjs +0 -1
  249. package/dist/adapters/TreeMapChart.config-diJtcs4D.js +0 -2
  250. package/dist/adapters/WaterfallChart.config-B10PxftT.cjs +0 -1
  251. package/dist/adapters/WaterfallChart.config-BImlkLmR.js +0 -2
  252. package/dist/adapters/mcp-app-html-BCkzy3a2.cjs +0 -1
  253. package/dist/adapters/mcp-app-html-WiSFu1oD.js +0 -5
  254. package/dist/client/chunks/DashboardEditModal-BrZuaG5z.js.map +0 -1
  255. package/dist/client/chunks/RecordsTable-Mo3ai5_M.js.map +0 -1
  256. package/dist/client/chunks/chart-activity-grid-Ly_-2B-f.js.map +0 -1
  257. package/dist/client/chunks/chart-data-table-Cxd0cdAl.js.map +0 -1
  258. package/dist/client/chunks/charts-loader-DMdE-Azc.js +0 -87
  259. package/dist/client/chunks/nl-NL-DVZXf8U7.js.map +0 -1
@@ -63,7 +63,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
63
63
 
64
64
  We employ **{{ rows | map:"employees_count" | sum }}** people across {{ rowCount }} teams.
65
65
 
66
- {{ labelled | table }}`,"chart.funnel.label":`Funnel Chart`,"chart.funnel.description":`Show conversion through sequential steps`,"chart.funnel.useCase":`Best for visualising user journey funnels, sales pipelines, or multi-step processes`,"chart.sankey.label":`Sankey Chart`,"chart.sankey.description":`Show flow between states or steps`,"chart.sankey.useCase":`Best for visualising user journey flows, path analysis, or state transitions`,"chart.sunburst.label":`Sunburst Chart`,"chart.sunburst.description":`Show hierarchical flow as radial rings`,"chart.sunburst.useCase":`Best for visualising forward paths from a starting event in a compact radial layout`,"chart.heatmap.label":`Heatmap`,"chart.heatmap.description":`Visualise intensity across two dimensions`,"chart.heatmap.useCase":`Best for showing patterns in matrix data like correlations, schedules, or category comparisons`,"chart.retentionHeatmap.label":`Retention Matrix`,"chart.retentionHeatmap.description":`Cohort retention matrix visualisation`,"chart.retentionHeatmap.useCase":`Visualise user retention over time by cohort`,"chart.retentionCombined.label":`Retention Chart`,"chart.retentionCombined.description":`Combined retention visualisation with line chart and heatmap modes`,"chart.retentionCombined.useCase":`Visualise user retention over time with optional breakdown segmentation`,"chart.boxPlot.label":`Box Plot`,"chart.boxPlot.description":`Show statistical distribution (median, IQR, whiskers) across categories`,"chart.boxPlot.useCase":`Best for P&L spread per symbol, trade size distribution, latency distribution across platforms`,"chart.dotStrip.label":`Dot Strip Plot`,"chart.dotStrip.description":`Show every individual value as a dot, grouped into category bands`,"chart.dotStrip.useCase":`Best for comparing individuals within a group — spread of output per team, salary per band, latency per endpoint`,"chart.waterfall.label":`Waterfall Chart`,"chart.waterfall.description":`Show cumulative effect of sequential positive and negative values`,"chart.waterfall.useCase":`Best for P&L decomposition, cash flow analysis, budget variance, or any sequential contribution breakdown`,"chart.candlestick.label":`Candlestick Chart`,"chart.candlestick.description":`Financial candlestick chart showing open/close body and high/low wicks`,"chart.candlestick.useCase":`Best for EOD quotes (bid/ask spread per date/symbol), markout distribution bands, or OHLC price data`,"chart.measureProfile.label":`Measure Profile`,"chart.measureProfile.description":`Plot N measures as sequential X-axis points to visualise a profile or shape across intervals`,"chart.measureProfile.useCase":`Best for markout interval analysis (e.g. avgMinus2m → avgAtEvent → avgPlus2h), metric profiles, or any pattern across ordered measures`,"chart.gauge.label":`Gauge Chart`,"chart.gauge.description":`Half-circle arc gauge for a single KPI value versus a maximum target`,"chart.gauge.useCase":`Best for high-water marks vs equity, margin utilisation, or any single value progress toward a goal`,"chart.config.chartType":`Chart Type`,"chart.config.loading":`Loading chart configuration...`,"chart.config.axisConfig":`Chart Configuration`,"chart.config.unassigned":`Unassigned Fields`,"chart.config.unassignedHint":`Drag fields to chart axes above`,"chart.config.noFields":`Add metrics and breakdowns in the Query tab to configure chart axes`,"chart.dropZone.xAxis.label":`X-Axis (Categories)`,"chart.dropZone.xAxis.description":`Dimensions and time dimensions for grouping`,"chart.dropZone.xAxis.empty":`Drop dimensions & time dimensions here`,"chart.dropZone.yAxis.label":`Y-Axis (Values)`,"chart.dropZone.yAxis.description":`Measures for values or dimensions for series`,"chart.dropZone.yAxis.empty":`Drop measures or dimensions here`,"chart.dropZone.series.label":`Series (Split into Multiple Series)`,"chart.dropZone.series.description":`Dimensions to create separate data series`,"chart.dropZone.series.empty":`Drop dimensions here to split data into series`,"chart.dropZone.maxReached":`Maximum items reached`,"chart.dropZone.default.empty":`Drop fields here`,"chart.bar.dropZone.xAxis.empty":`Drop dimensions & time dimensions here`,"chart.bar.dropZone.yAxis.empty":`Drop measures here`,"chart.bar.dropZone.series.empty":`Drop dimensions here to split data into series`,"chart.line.dropZone.xAxis.empty":`Drop time dimensions or dimensions here`,"chart.line.dropZone.yAxis.empty":`Drop measures here`,"chart.line.dropZone.series.empty":`Drop dimensions here for multiple lines`,"chart.area.dropZone.xAxis.empty":`Drop time dimensions or dimensions here`,"chart.area.dropZone.yAxis.empty":`Drop measures here`,"chart.area.dropZone.series.empty":`Drop dimensions here for stacked areas`,"chart.pie.dropZone.xAxis.empty":`Drop a dimension for categories`,"chart.pie.dropZone.yAxis.empty":`Drop a measure for values`,"chart.scatter.dropZone.xAxis.empty":`Drop a field for X-axis`,"chart.scatter.dropZone.yAxis.empty":`Drop a measure for Y-axis`,"chart.scatter.dropZone.series.empty":`Drop a dimension to colour points`,"chart.bubble.dropZone.xAxis.empty":`Drop a field for X-axis position`,"chart.bubble.dropZone.yAxis.empty":`Drop a measure for Y-axis position`,"chart.bubble.dropZone.sizeField.empty":`Drop a measure for bubble size`,"chart.bubble.dropZone.series.empty":`Drop a dimension for bubble labels`,"chart.bubble.dropZone.colorField.empty":`Drop a field for bubble colour (optional)`,"chart.radar.dropZone.xAxis.empty":`Drop dimensions for radar axes`,"chart.radar.dropZone.yAxis.empty":`Drop measures for values`,"chart.radar.dropZone.series.empty":`Drop dimensions for multiple shapes`,"chart.radialBar.dropZone.xAxis.empty":`Drop dimensions for categories`,"chart.radialBar.dropZone.yAxis.empty":`Drop a measure for values`,"chart.treemap.dropZone.xAxis.empty":`Drop dimensions for categories`,"chart.treemap.dropZone.yAxis.empty":`Drop a measure for size`,"chart.treemap.dropZone.series.empty":`Drop a dimension for colour grouping`,"chart.table.dropZone.xAxis.empty":`Drop fields to display as columns (or leave empty for all)`,"chart.recordsTable.dropZone.columns.label":`Columns`,"chart.recordsTable.dropZone.columns.description":`Fields rendered as columns, in this order`,"chart.recordsTable.dropZone.columns.empty":`Drop fields to display as columns (or leave empty for all)`,"chart.recordsTable.dropZone.hiddenColumns.label":`Hidden fields`,"chart.recordsTable.dropZone.hiddenColumns.description":`Fetched for row context and links, never displayed`,"chart.recordsTable.dropZone.hiddenColumns.empty":`Drop fields to fetch without showing them`,"chart.recordsTable.option.columnFormats.label":`Column formats`,"chart.recordsTable.option.columnFormats.description":`Choose how each column renders its value`,"chart.recordsTable.option.pageSize.label":`Rows per page`,"chart.recordsTable.option.pageSize.description":`How many records to show at a time`,"chart.recordsTable.option.pageSize.option.25":`25`,"chart.recordsTable.option.pageSize.option.50":`50`,"chart.recordsTable.option.pageSize.option.100":`100`,"chart.recordsTable.option.rowLink.label":`Row link`,"chart.recordsTable.option.rowLink.description":`Make each row a link. Use {Cube.field} tokens — hidden fields work too. Relative paths and http(s) URLs only.`,"chart.recordsTable.rowLink.urlTemplate":`URL template`,"chart.recordsTable.rowLink.placeholder":`/employees/{Employees.id}`,"chart.recordsTable.rowLink.target.self":`Same tab`,"chart.recordsTable.rowLink.target.blank":`New tab`,"chart.recordsTable.columnFormats.noColumns":`Assign columns first — each one can then be formatted here`,"chart.recordsTable.columnFormats.kind.text":`Text`,"chart.recordsTable.columnFormats.kind.number":`Number`,"chart.recordsTable.columnFormats.kind.date":`Date`,"chart.recordsTable.columnFormats.kind.badge":`Badge`,"chart.recordsTable.columnFormats.kind.progress":`Progress`,"chart.recordsTable.columnFormats.numberFormat":`Number format`,"chart.recordsTable.columnFormats.granularity":`Granularity`,"chart.recordsTable.columnFormats.badgeColours":`Value colours`,"chart.recordsTable.columnFormats.badgeColour":`Colour`,"chart.recordsTable.columnFormats.badgeValue":`Value`,"chart.recordsTable.columnFormats.badgeAdd":`Add value`,"chart.recordsTable.columnFormats.badgeRemove":`Remove value`,"chart.recordsTable.columnFormats.progressMin":`Minimum`,"chart.recordsTable.columnFormats.progressMax":`Maximum`,"chart.recordsTable.columnFormats.progressStyle":`Style`,"chart.recordsTable.columnFormats.progressStyle.bar":`Bar`,"chart.recordsTable.columnFormats.progressStyle.circle":`Circle`,"chart.recordsTable.columnFormats.header":`Header`,"chart.activityGrid.dropZone.dateField.empty":`Drop a time dimension (granularity affects grid structure)`,"chart.activityGrid.dropZone.valueField.empty":`Drop a measure for activity intensity`,"chart.kpiNumber.dropZone.yAxis.empty":`Drop a measure here`,"chart.kpiDelta.dropZone.yAxis.empty":`Drop a measure here`,"chart.kpiDelta.dropZone.xAxis.empty":`Drop a dimension for ordering`,"chart.kpiText.dropZone.yAxis.empty":`Drop a measure here`,"chart.funnel.dropZone.xAxis.empty":`Steps defined in funnel config`,"chart.funnel.dropZone.yAxis.empty":`Counts calculated from funnel execution`,"chart.sankey.dropZone.xAxis.empty":`Auto-populated from flow config`,"chart.sankey.dropZone.yAxis.empty":`Calculated from flow execution`,"chart.sunburst.dropZone.xAxis.empty":`Auto-populated from flow config`,"chart.sunburst.dropZone.yAxis.empty":`Calculated from flow execution`,"chart.heatmap.dropZone.xAxis.empty":`Drop one dimension here`,"chart.heatmap.dropZone.yAxis.empty":`Drop one dimension here`,"chart.heatmap.dropZone.valueField.empty":`Drop one measure here`,"chart.boxPlot.dropZone.xAxis.empty":`Drop a dimension here`,"chart.boxPlot.dropZone.yAxis.empty":`Drop 1, 3, or 5 measures here`,"chart.dotStrip.dropZone.xAxis.label":`Bands (rows)`,"chart.dotStrip.dropZone.xAxis.description":`Dimension that groups dots into rows, e.g. team, band, region`,"chart.dotStrip.dropZone.xAxis.empty":`Drop a dimension to band by`,"chart.dotStrip.dropZone.yAxis.label":`Value (horizontal position)`,"chart.dotStrip.dropZone.yAxis.description":`Measure that positions each dot along the horizontal axis`,"chart.dotStrip.dropZone.yAxis.empty":`Drop a measure here`,"chart.dotStrip.dropZone.series.label":`Dot identity`,"chart.dotStrip.dropZone.series.description":`Dimension that gives each dot its own row — one dot per value, named in the tooltip`,"chart.dotStrip.dropZone.series.empty":`Drop a dimension to split into individual dots`,"chart.waterfall.dropZone.xAxis.empty":`Drop a dimension here`,"chart.waterfall.dropZone.yAxis.empty":`Drop a measure here`,"chart.candlestick.dropZone.xAxis.empty":`Drop a time or dimension here`,"chart.candlestick.dropZone.yAxis.empty":`Drop 2+ measures here`,"chart.measureProfile.dropZone.yAxis.empty":`Drop 2+ measures here (displayed left → right)`,"chart.measureProfile.dropZone.series.empty":`Drop a dimension here to create multiple lines`,"chart.gauge.dropZone.yAxis.empty":`Drop 1 measure here (optional 2nd for dynamic max)`,"chart.activityGrid.validation.timeDimensionRequired":`Time dimension is required for activity grid`,"chart.activityGrid.validation.measureRequired":`Activity measure is required for intensity mapping`,"chart.kpiDelta.validation.measureRequired":`A measure is required for KPI Delta charts`,"chart.heatmap.validation.xAxisRequired":`X-axis dimension required`,"chart.heatmap.validation.yAxisRequired":`Y-axis dimension required`,"chart.heatmap.validation.valueRequired":`Value measure required`,"chart.option.stacking.label":`Stacking`,"chart.option.stacking.none":`None`,"chart.option.stacking.stacked":`Stacked`,"chart.option.stacking.percent":`Stacked 100%`,"chart.option.stacking.description":`How to stack multiple series`,"chart.option.target.label":`Target Values`,"chart.option.target.description":`Single value or comma-separated values to spread across X-axis`,"chart.option.connectNulls.label":`Connect Nulls`,"chart.option.connectNulls.description":`Draw continuous line through missing data points`,"chart.option.fillMissingDates.label":`Fill Missing Dates`,"chart.option.fillMissingDates.description":`Show missing time periods as the fill value (0 by default). Auto follows the cube definition.`,"chart.option.fillMissingDates.auto":`Auto`,"chart.option.fillMissingDates.on":`On`,"chart.option.fillMissingDates.off":`Off`,"chart.option.showAllXLabels.label":`Show All X Labels`,"chart.option.showAllXLabels.description":`Display every label on the X-axis instead of auto-hiding overlapping labels`,"chart.option.leftYAxisFormat.label":`Left Y-Axis Format`,"chart.option.leftYAxisFormat.description":`Number formatting for left Y-axis`,"chart.option.rightYAxisFormat.label":`Right Y-Axis Format`,"chart.option.rightYAxisFormat.description":`Number formatting for right Y-axis`,"chart.option.xAxisFormat.label":`X-Axis Format`,"chart.option.xAxisFormat.description":`Number formatting for X-axis`,"chart.option.yAxisFormat.label":`Y-Axis Format`,"chart.option.yAxisFormat.description":`Number formatting for Y-axis`,"chart.option.valueFormat.label":`Value Format`,"chart.option.valueFormat.description":`Number formatting for values`,"chart.option.innerRadius.label":`Inner Radius`,"chart.option.innerRadius.description":`Hollow centre size (0% = solid pie, higher = donut style)`,"chart.option.showLabels.label":`Show Cell Values`,"chart.option.showLabels.description":`Display values inside each cell`,"chart.option.cellShape.label":`Cell Shape`,"chart.option.cellShape.rectangle":`Rectangle`,"chart.option.cellShape.circle":`Circle`,"chart.option.funnelStyle.label":`Funnel Style`,"chart.option.funnelStyle.bars":`Bars`,"chart.option.funnelStyle.funnel":`Funnel`,"chart.option.funnelOrientation.label":`Orientation`,"chart.option.funnelOrientation.horizontal":`Horizontal`,"chart.option.funnelOrientation.vertical":`Vertical`,"chart.option.hideSummaryFooter.label":`Hide Summary Footer`,"chart.option.hideSummaryFooter.description":`Hide the summary footer showing steps count and overall conversion`,"chart.option.showConversion.label":`Show Conversion Rate`,"chart.option.showConversion.description":`Display step-to-step conversion percentage`,"chart.option.showAvgTime.label":`Show Avg Time`,"chart.option.showAvgTime.description":`Display average time to convert`,"chart.option.showMedianTime.label":`Show Median Time`,"chart.option.showMedianTime.description":`Display median time to convert`,"chart.option.showP90Time.label":`Show P90 Time`,"chart.option.showP90Time.description":`Display 90th percentile time to convert`,"chart.option.linkOpacity.label":`Link Opacity`,"chart.option.linkOpacity.light":`Light`,"chart.option.linkOpacity.medium":`Medium`,"chart.option.linkOpacity.dark":`Dark`,"chart.option.showNodeLabels.label":`Show Node Labels`,"chart.option.showNodeLabels.description":`Display labels on flow nodes`,"chart.option.prefix.label":`Prefix`,"chart.option.prefix.description":`Text to display before the number`,"chart.option.suffix.label":`Suffix`,"chart.option.suffix.description":`Text to display after the number`,"chart.option.decimals.label":`Decimal Places`,"chart.option.decimals.description":`Number of decimal places to display`,"chart.option.showHistogram.label":`Show Variance Histogram`,"chart.option.showHistogram.description":`Display historical variance chart below the delta`,"chart.option.useLastCompletePeriod.label":`Use Last Complete Period`,"chart.option.useLastCompletePeriod.description":`Exclude current incomplete period from calculation (e.g., partial week/month)`,"chart.option.skipLastPeriod.label":`Skip Last Period`,"chart.option.skipLastPeriod.description":`Always exclude the last period regardless of completeness`,"chart.option.retentionDisplayMode.label":`Display Mode`,"chart.option.retentionDisplayMode.lineChart":`Line Chart`,"chart.option.retentionDisplayMode.heatmapTable":`Heatmap Table`,"chart.option.retentionDisplayMode.combined":`Combined`,"chart.option.showLegend.label":`Show Legend`,"chart.option.showLegend.description":`Show the legend`,"chart.option.showGrid.label":`Show Grid`,"chart.option.showGrid.description":`Show grid lines on the chart`,"chart.option.showTooltip.label":`Show Tooltip`,"chart.option.showTooltip.description":`Show tooltip on hover with detailed stats`,"chart.option.priorPeriodStyle.label":`Prior Period Line Style`,"chart.option.priorPeriodStyle.dashed":`Dashed`,"chart.option.priorPeriodStyle.dotted":`Dotted`,"chart.option.priorPeriodStyle.solid":`Solid`,"chart.option.priorPeriodStyle.description":`Line style for prior period in comparison mode`,"chart.option.priorPeriodOpacity.label":`Prior Period Opacity`,"chart.option.priorPeriodOpacity.description":`Opacity for prior period lines (0.1 to 1)`,"chart.option.showTotal.label":`Show Total Bar`,"chart.option.showTotal.description":`Append a final bar showing the running total`,"chart.option.showConnectorLine.label":`Show Connector Line`,"chart.option.showConnectorLine.description":`Draw a dashed step-line connecting bar tops`,"chart.option.showDataLabels.label":`Show Data Labels`,"chart.option.showDataLabels.description":`Display the value at each data point`,"chart.option.showReferenceLineAtZero.label":`Show Zero Reference Line`,"chart.option.showReferenceLineAtZero.description":`Draw a dashed line at Y = 0`,"chart.option.showMedianMarker.label":`Show Median Marker`,"chart.option.showMedianMarker.description":`Draw a tick at each band's median value`,"chart.option.showBandStats.label":`Show Band Statistics`,"chart.option.showBandStats.description":`Show the dot count and spread beside each band name`,"chart.option.showExtremeLabels.label":`Label Extremes`,"chart.option.showExtremeLabels.description":`Name the lowest and highest dot in each band`,"chart.option.dotSize.label":`Dot Size`,"chart.option.dotSize.description":`Larger dots are easier to see but spread the swarm further`,"chart.option.dotSize.small":`Small`,"chart.option.dotSize.medium":`Medium`,"chart.option.dotSize.large":`Large`,"chart.option.bandSort.label":`Band Order`,"chart.option.bandSort.description":`How to order the bands from top to bottom`,"chart.option.bandSort.none":`Query order`,"chart.option.bandSort.valueDesc":`Highest median first`,"chart.option.bandSort.valueAsc":`Lowest median first`,"chart.option.bandSort.count":`Most dots first`,"chart.option.lineType.label":`Line Interpolation`,"chart.option.lineType.smooth":`Smooth (monotone)`,"chart.option.lineType.linear":`Linear`,"chart.option.lineType.step":`Step`,"chart.option.lineType.description":`How data points are connected`,"chart.option.rangeMode.label":`Chart Mode`,"chart.option.rangeMode.ohlc":`OHLC (open, close, high, low)`,"chart.option.rangeMode.range":`Range (high, low / bid, ask)`,"chart.option.rangeMode.description":`OHLC: 4 measures. Range: 2 measures (high + low).`,"chart.option.bullColor.label":`Bullish Colour`,"chart.option.bullColor.description":`Candle colour when close ≥ open`,"chart.option.bearColor.label":`Bearish Colour`,"chart.option.bearColor.description":`Candle colour when close < open`,"chart.option.showWicks.label":`Show Wicks`,"chart.option.showWicks.description":`Draw high/low wicks above and below the body`,"chart.option.minValue.label":`Minimum Value`,"chart.option.minValue.description":`Lower bound of the gauge arc (default 0)`,"chart.option.maxValue.label":`Maximum Value (static)`,"chart.option.maxValue.description":`Upper bound of the gauge. Leave empty to use yAxis[1] or default 100`,"chart.option.showCentreLabel.label":`Show Centre Label`,"chart.option.showCentreLabel.description":`Display current value and field name in the centre of the gauge`,"chart.option.showPercentage.label":`Show as Percentage`,"chart.option.showPercentage.description":`Display value as % of max instead of raw number`,"chart.option.fitToWidth.label":`Fit to Width`,"chart.option.fitToWidth.description":`Automatically size blocks to fill portlet width and height while maintaining aspect ratio`,"chart.option.fontSize.label":`Font Size`,"chart.option.fontSize.small":`Small`,"chart.option.fontSize.medium":`Medium`,"chart.option.fontSize.large":`Large`,"chart.option.alignment.label":`Text Alignment`,"chart.option.alignment.left":`Left`,"chart.option.alignment.center":`Center`,"chart.option.alignment.right":`Right`,"chart.option.hideHeader.label":`Hide Header`,"chart.option.hideHeader.description":`Hide the portlet header bar (title and action buttons)`,"chart.option.transparentBackground.label":`Transparent Background`,"chart.option.transparentBackground.description":`Remove card background, border, and shadow for seamless integration as section headers`,"chart.option.autoHeight.label":`Auto Height`,"chart.option.autoHeight.description":`In row and mobile layouts, size to markdown content instead of fixed row height`,"chart.option.accentBorder.label":`Accent Border`,"chart.option.accentBorder.none":`None`,"chart.option.accentBorder.left":`Left`,"chart.option.accentBorder.top":`Top`,"chart.option.accentBorder.bottom":`Bottom`,"chart.option.accentBorder.description":`Add an accent-coloured border on one side of the content`,"chart.configText.20_percent":`20%`,"chart.configText.40_percent":`40%`,"chart.configText.60_percent":`60%`,"chart.configText.80_percent":`80%`,"chart.configText.accent_color":`Accent Color`,"chart.configText.activity_measure":`Activity Measure`,"chart.configText.add_2_or_more_measures_they_become_the_x_axis_categories_in_the_order_li":`Add 2 or more measures — they become the X-axis categories in the order listed`,"chart.configText.add_an_accent_colored_border_on_one_side_of_the_content":`Add an accent-colored border on one side of the content`,"chart.configText.all_fields_to_display_as_columns":`All fields to display as columns`,"chart.gauge.thresholds.description":`Each band runs from its value up to the next one. Values are on the gauge’s own scale.`,"chart.configText.axes_categories":`Axes (Categories)`,"chart.configText.bubble_colour":`Bubble Colour`,"chart.configText.bubble_labels":`Bubble Labels`,"chart.configText.bubble_radius":`Bubble Radius`,"chart.configText.categories":`Categories`,"chart.configText.choose_how_to_visualize_retention_data":`Choose how to visualize retention data`,"chart.configText.color_bubbles_by_this_field_optional":`Color bubbles by this field (optional)`,"chart.configText.color_for_negative_changes_decreases":`Color for negative changes (decreases)`,"chart.configText.color_for_positive_changes_increases":`Color for positive changes (increases)`,"chart.configText.color_from_the_dashboard_palette_for_headers_bullets_and_links":`Color from the dashboard palette for headers, bullets, and links`,"chart.configText.color_from_the_dashboard_palette_for_the_kpi_value_text":`Color from the dashboard palette for the KPI value text`,"chart.configText.color_groups":`Color Groups`,"chart.configText.columns":`Columns`,"chart.configText.columns_x_axis":`Columns (X-Axis)`,"chart.configText.count_at_each_step_auto_calculated":`Count at each step (auto-calculated)`,"chart.configText.count_of_entities_following_each_path":`Count of entities following each path`,"chart.configText.current_value_to_display_on_the_gauge_e_g_current_equity_margin_used":`Current value to display on the gauge (e.g. current equity, margin used)`,"chart.configText.dimension_for_column_categories":`Dimension for column categories`,"chart.configText.dimension_for_ordering_data_typically_time":`Dimension for ordering data (typically time)`,"chart.configText.dimension_for_pie_slices":`Dimension for pie slices`,"chart.configText.dimension_for_row_categories":`Dimension for row categories`,"chart.configText.dimension_labels_for_each_bar_segment_e_g_symbol_transaction_type":`Dimension labels for each bar segment (e.g. symbol, transaction type)`,"chart.configText.dimension_optional":`Dimension (optional)`,"chart.configText.dimension_to_color_points_by_category":`Dimension to color points by category`,"chart.configText.dimension_to_color_rectangles_by_category":`Dimension to color rectangles by category`,"chart.configText.dimension_to_group_boxes_by_e_g_symbol_platform":`Dimension to group boxes by (e.g. symbol, platform)`,"chart.configText.dimension_to_split_data_into_separate_profile_lines_e_g_symbol_platform":`Dimension to split data into separate profile lines (e.g. symbol, platform)`,"chart.configText.dimensions_for_radar_axes":`Dimensions for radar axes`,"chart.configText.dimensions_for_radial_segments":`Dimensions for radial segments`,"chart.configText.dimensions_for_treemap_rectangles":`Dimensions for treemap rectangles`,"chart.configText.dimensions_to_create_multiple_radar_shapes":`Dimensions to create multiple radar shapes`,"chart.configText.dimensions_to_create_separate_lines":`Dimensions to create separate lines`,"chart.configText.dimensions_to_create_stacked_areas":`Dimensions to create stacked areas`,"chart.configText.display_the_value_above_each_bar_segment":`Display the value above each bar segment`,"chart.configText.display_value_at_each_data_point":`Display value at each data point`,"chart.configText.drop_1_measure_for_auto_mode_3_for_avg_stddev_median_mode_or_5_for_min_q":`Drop 1 measure for auto mode, 3 for avg/stddev/median mode, or 5 for min/q1/median/q3/max mode`,"chart.configText.drop_2_4_measures_in_order_open_close_high_low_ohlc_mode_for_range_mode_":`Drop 2–4 measures in order: open, close, high, low (OHLC mode). For range mode drop 2: high, low.`,"chart.configText.enter_markdown_text_supports_headers_bold_text_italic_text_links_text_ur":`Enter markdown text. Supports headers (#), bold (**text**), italic (*text*), links ([text](url)), lists (- item), and horizontal rules (---).`,"chart.configText.event_dimension_that_categorizes_flow_nodes":`Event dimension that categorizes flow nodes`,"chart.configText.event_type":`Event Type`,"chart.configText.exclude_current_incomplete_period_from_aggregation_e_g_partial_week_mont":`Exclude current incomplete period from aggregation (e.g., partial week/month)`,"chart.configText.exclude_current_incomplete_period_from_delta_calculation_e_g_partial_wee":`Exclude current incomplete period from delta calculation (e.g., partial week/month)`,"chart.configText.field_to_use_for_bubble_labels_and_identification":`Field to use for bubble labels and identification`,"chart.configText.flow_count":`Flow Count`,"chart.configText.hide_the_statistics_footer_below_the_chart":`Hide the statistics footer below the chart`,"chart.configText.hollow_center_size_0_percent_solid_pie_higher_donut_style":`Hollow center size (0% = solid pie, higher = donut style)`,"chart.configText.horizontal_alignment_of_the_markdown_content":`Horizontal alignment of the markdown content`,"chart.configText.horizontal_axis_position":`Horizontal axis position`,"chart.configText.how_to_stack_multiple_area_series":`How to stack multiple area series`,"chart.configText.how_to_stack_multiple_bar_series":`How to stack multiple bar series`,"chart.configText.markdown_content":`Markdown Content`,"chart.configText.measure_for_rectangle_sizes":`Measure for rectangle sizes`,"chart.configText.measure_for_slice_sizes":`Measure for slice sizes`,"chart.configText.measure_for_y_position":`Measure for Y position`,"chart.configText.measure_or_dimension_for_x_position":`Measure or dimension for X position`,"chart.configText.measure_that_determines_cell_color":`Measure that determines cell color`,"chart.configText.measure_to_display_as_kpi_number":`Measure to display as KPI number`,"chart.configText.measure_to_display_in_the_kpi_text_template":`Measure to display in the KPI text template`,"chart.configText.measure_to_track_changes_for":`Measure to track changes for`,"chart.configText.measure_used_for_activity_intensity_color_coding":`Measure used for activity intensity (color coding)`,"chart.configText.measures_for_area_values":`Measures for area values`,"chart.configText.measures_for_bar_heights":`Measures for bar heights`,"chart.configText.measures_for_line_values":`Measures for line values`,"chart.configText.measures_for_radar_values":`Measures for radar values`,"chart.configText.measures_for_radial_bar_lengths":`Measures for radial bar lengths`,"chart.configText.measures_x_axis_order":`Measures (X-Axis Order)`,"chart.configText.negative_change_color":`Negative Change Color`,"chart.configText.none_pie":`None (Pie)`,"chart.configText.number_formatting_for_cell_values_and_legend":`Number formatting for cell values and legend`,"chart.configText.number_formatting_for_numeric_values":`Number formatting for numeric values`,"chart.configText.number_formatting_for_size_values":`Number formatting for size values`,"chart.configText.number_formatting_for_the_displayed_value_and_axis_labels":`Number formatting for the displayed value and axis labels`,"chart.configText.number_formatting_for_the_price_axis":`Number formatting for the price axis`,"chart.configText.number_formatting_for_the_value_axis":`Number formatting for the value axis`,"chart.configText.number_formatting_for_the_y_axis":`Number formatting for the Y-axis`,"chart.configText.number_formatting_for_x_axis_labels":`Number formatting for X-axis labels`,"chart.configText.number_formatting_for_y_axis_and_values":`Number formatting for Y-axis and values`,"chart.configText.number_formatting_for_y_axis_labels":`Number formatting for Y-axis labels`,"chart.configText.number_of_decimal_places_to_display_for_numeric_values":`Number of decimal places to display for numeric values`,"chart.configText.ohlc_measures_open_close_high_low":`OHLC Measures (open, close, high, low)`,"chart.configText.opacity_of_flow_links":`Opacity of flow links`,"chart.configText.overall_text_size_for_the_markdown_content":`Overall text size for the markdown content`,"chart.configText.positive_change_color":`Positive Change Color`,"chart.configText.rows_y_axis":`Rows (Y-Axis)`,"chart.configText.series_color_groups":`Series (Color Groups)`,"chart.configText.series_multiple_lines":`Series (Multiple Lines)`,"chart.configText.series_multiple_shapes":`Series (Multiple Shapes)`,"chart.configText.series_split_into_multiple_lines":`Series (Split into Multiple Lines)`,"chart.configText.series_stack_areas":`Series (Stack Areas)`,"chart.configText.show_series_legend_only_visible_with_a_series_dimension":`Show series legend (only visible with a Series dimension)`,"chart.configText.show_the_color_intensity_legend":`Show the color intensity legend`,"chart.configText.show_the_legend_for_breakdown_segments":`Show the legend for breakdown segments`,"chart.configText.single_measure_whose_values_are_summed_cumulatively":`Single measure whose values are summed cumulatively`,"chart.configText.size":`Size`,"chart.configText.size_of_bubbles_based_on_this_measure":`Size of bubbles based on this measure`,"chart.configText.size_of_the_center_hole_0_for_full_circle":`Size of the center hole (0 for full circle)`,"chart.configText.step_count":`Step Count`,"chart.configText.step_name":`Step Name`,"chart.configText.step_names_auto_populated_from_funnel_steps":`Step names (auto-populated from funnel steps)`,"chart.configText.target_value_to_compare_against_first_value_used_if_multiple_provided":`Target value to compare against (first value used if multiple provided)`,"chart.configText.template_for_displaying_the_text_use_value_to_insert_the_measure_value":"Template for displaying the text. Use ${value} to insert the measure value.","chart.configText.text_template":`Text Template`,"chart.configText.threshold_bands":`Threshold Bands`,"chart.configText.time_dimension":`Time Dimension`,"chart.configText.time_dimension_or_category_for_each_candle_e_g_date_symbol":`Time dimension or category for each candle (e.g. date, symbol)`,"chart.configText.time_dimensions_or_dimensions_for_x_axis":`Time dimensions or dimensions for X-axis`,"chart.configText.time_field_that_determines_grid_structure_granularity_affects_layout":`Time field that determines grid structure (granularity affects layout)`,"chart.configText.value":`Value`,"chart.configText.value_color":`Value Color`,"chart.configText.value_color_intensity":`Value (Color Intensity)`,"chart.configText.value_measure":`Value Measure`,"chart.configText.values":`Values`,"chart.configText.vertical_axis_position":`Vertical axis position`,"chart.configText.visualization_style":`Visualization style`,"chart.configText.x_axis_groups":`X-Axis (Groups)`,"chart.configText.x_axis_time_categories":`X-Axis (Time/Categories)`,"chart.configText.x_axis_time_category":`X-Axis (Time / Category)`,"chart.configText.y_axis":`Y-Axis`,"chart.configText.y_axis_measures":`Y-Axis (Measures)`,"chart.configText.y_axis_value":`Y-Axis (Value)`,"display.loading":`Loading display options...`,"display.noOptions":`No display options available for this chart type.`,"display.heading":`Display Options`,"results.loading.title":`Executing Query...`,"results.loading.subtitle":`Running your query against the cube API`,"results.error.title":`Query Execution Failed`,"results.error.subtitle":`There was an error executing your query. Please check the query and try again.`,"results.waiting.title":`Preparing Query...`,"results.waiting.subtitle":`Your query will execute shortly`,"results.needsRefresh.title":`Ready to Execute`,"results.needsRefresh.subtitle":`Click refresh to run your query`,"results.needsRefresh.runButton":`Run Query`,"results.empty.query":`Add metrics or breakdowns from the panel on the right to see results`,"results.empty.retention":`Select a cube and configure retention settings to see results`,"results.empty.funnel":`Add funnel steps to see conversion analysis`,"results.empty.flow":`Configure flow analysis to see user journey paths`,"results.empty.title":`No Results Yet`,"results.ai.button":`Analyse with AI`,"results.noData.title":`Query Successful`,"results.noData.subtitle":`No data returned from the query`,"results.chart.noData":`No data to display`,"results.chart.noDataHint":`Run a query to see chart visualisation`,"results.chart.unsupported":`Unsupported chart type`,"results.refreshing":`Refreshing results...`,"results.header.rows":`rows`,"results.header.row":`row`,"results.header.stale":`Results may be outdated`,"results.header.failed":`Query failed`,"results.header.executing":`Executing...`,"results.header.noResults":`No results`,"results.view.chart":`Chart`,"results.view.merged":`Merged`,"results.warning.largeDataset":`Large dataset:`,"results.warning.configChanged":`Query configuration changed. Results may be outdated.`,"results.warning.refreshNow":`Refresh Now`,"results.share.copied":`Copied!`,"results.share.noChart":`(no chart)`,"server.errors.dbNotConfigured":`Database executor not configured`,"server.errors.cubeNotFound":`Cube '{cubeName}' not found`,"server.errors.noCubesInQuery":`No cubes found in query`,"server.errors.dbAdapterRequired":`DatabaseExecutor must have a databaseAdapter property`,"server.errors.rlsRequiresTransactions":`rlsSetup requires a database driver that supports transactions (db.transaction)`,"server.errors.queryExecutionFailed":`Query execution failed: {message}`,"server.errors.queryExecutionUnknown":`Query execution failed: Unknown error`,"server.errors.noCompareDateRange":`No compareDateRange found in query`,"server.errors.compareDateRangeInvalid":`compareDateRange requires at least 2 periods`,"server.errors.funnelValidationFailed":`Funnel validation failed: {errors}`,"server.errors.flowValidationFailed":`Flow validation failed: {errors}`,"server.errors.retentionValidationFailed":`Retention validation failed: {errors}`,"server.errors.cubeRefUnresolved":`{cubeName}.joins.{joinName}: target cube '{targetCube}' is not registered`,"server.errors.unresolvedCubeRefs":`Unresolved cube references:
66
+ {{ labelled | table }}`,"chart.funnel.label":`Funnel Chart`,"chart.funnel.description":`Show conversion through sequential steps`,"chart.funnel.useCase":`Best for visualising user journey funnels, sales pipelines, or multi-step processes`,"chart.sankey.label":`Sankey Chart`,"chart.sankey.description":`Show flow between states or steps`,"chart.sankey.useCase":`Best for visualising user journey flows, path analysis, or state transitions`,"chart.sunburst.label":`Sunburst Chart`,"chart.sunburst.description":`Show hierarchical flow as radial rings`,"chart.sunburst.useCase":`Best for visualising forward paths from a starting event in a compact radial layout`,"chart.heatmap.label":`Heatmap`,"chart.heatmap.description":`Visualise intensity across two dimensions`,"chart.heatmap.useCase":`Best for showing patterns in matrix data like correlations, schedules, or category comparisons`,"chart.retentionHeatmap.label":`Retention Matrix`,"chart.retentionHeatmap.description":`Cohort retention matrix visualisation`,"chart.retentionHeatmap.useCase":`Visualise user retention over time by cohort`,"chart.retentionCombined.label":`Retention Chart`,"chart.retentionCombined.description":`Combined retention visualisation with line chart and heatmap modes`,"chart.retentionCombined.useCase":`Visualise user retention over time with optional breakdown segmentation`,"chart.boxPlot.label":`Box Plot`,"chart.boxPlot.description":`Show statistical distribution (median, IQR, whiskers) across categories`,"chart.boxPlot.useCase":`Best for P&L spread per symbol, trade size distribution, latency distribution across platforms`,"chart.dotStrip.label":`Dot Strip Plot`,"chart.dotStrip.description":`Show every individual value as a dot, grouped into category bands`,"chart.dotStrip.useCase":`Best for comparing individuals within a group — spread of output per team, salary per band, latency per endpoint`,"chart.waterfall.label":`Waterfall Chart`,"chart.waterfall.description":`Show cumulative effect of sequential positive and negative values`,"chart.waterfall.useCase":`Best for P&L decomposition, cash flow analysis, budget variance, or any sequential contribution breakdown`,"chart.candlestick.label":`Candlestick Chart`,"chart.candlestick.description":`Financial candlestick chart showing open/close body and high/low wicks`,"chart.candlestick.useCase":`Best for EOD quotes (bid/ask spread per date/symbol), markout distribution bands, or OHLC price data`,"chart.measureProfile.label":`Measure Profile`,"chart.measureProfile.description":`Plot N measures as sequential X-axis points to visualise a profile or shape across intervals`,"chart.measureProfile.useCase":`Best for markout interval analysis (e.g. avgMinus2m → avgAtEvent → avgPlus2h), metric profiles, or any pattern across ordered measures`,"chart.gauge.label":`Gauge Chart`,"chart.gauge.description":`Half-circle arc gauge for a single KPI value versus a maximum target`,"chart.gauge.useCase":`Best for high-water marks vs equity, margin utilisation, or any single value progress toward a goal`,"chart.config.chartType":`Chart Type`,"chart.config.loading":`Loading chart configuration...`,"chart.config.axisConfig":`Chart Configuration`,"chart.config.unassigned":`Unassigned Fields`,"chart.config.unassignedHint":`Drag fields to chart axes above`,"chart.config.noFields":`Add metrics and breakdowns in the Query tab to configure chart axes`,"chart.dropZone.xAxis.label":`X-Axis (Categories)`,"chart.dropZone.xAxis.description":`Dimensions and time dimensions for grouping`,"chart.dropZone.xAxis.empty":`Drop dimensions & time dimensions here`,"chart.dropZone.yAxis.label":`Y-Axis (Values)`,"chart.dropZone.yAxis.description":`Measures for values or dimensions for series`,"chart.dropZone.yAxis.empty":`Drop measures or dimensions here`,"chart.dropZone.series.label":`Series (Split into Multiple Series)`,"chart.dropZone.series.description":`Dimensions to create separate data series`,"chart.dropZone.series.empty":`Drop dimensions here to split data into series`,"chart.dropZone.maxReached":`Maximum items reached`,"chart.dropZone.default.empty":`Drop fields here`,"chart.bar.dropZone.xAxis.empty":`Drop dimensions & time dimensions here`,"chart.bar.dropZone.yAxis.empty":`Drop measures here`,"chart.bar.dropZone.series.empty":`Drop dimensions here to split data into series`,"chart.line.dropZone.xAxis.empty":`Drop time dimensions or dimensions here`,"chart.line.dropZone.yAxis.empty":`Drop measures here`,"chart.line.dropZone.series.empty":`Drop dimensions here for multiple lines`,"chart.area.dropZone.xAxis.empty":`Drop time dimensions or dimensions here`,"chart.area.dropZone.yAxis.empty":`Drop measures here`,"chart.area.dropZone.series.empty":`Drop dimensions here for stacked areas`,"chart.pie.dropZone.xAxis.empty":`Drop a dimension for categories`,"chart.pie.dropZone.yAxis.empty":`Drop a measure for values`,"chart.scatter.dropZone.xAxis.empty":`Drop a field for X-axis`,"chart.scatter.dropZone.yAxis.empty":`Drop a measure for Y-axis`,"chart.scatter.dropZone.series.empty":`Drop a dimension to colour points`,"chart.bubble.dropZone.xAxis.empty":`Drop a field for X-axis position`,"chart.bubble.dropZone.yAxis.empty":`Drop a measure for Y-axis position`,"chart.bubble.dropZone.sizeField.empty":`Drop a measure for bubble size`,"chart.bubble.dropZone.series.empty":`Drop a dimension for bubble labels`,"chart.bubble.dropZone.colorField.empty":`Drop a field for bubble colour (optional)`,"chart.radar.dropZone.xAxis.empty":`Drop dimensions for radar axes`,"chart.radar.dropZone.yAxis.empty":`Drop measures for values`,"chart.radar.dropZone.series.empty":`Drop dimensions for multiple shapes`,"chart.radialBar.dropZone.xAxis.empty":`Drop dimensions for categories`,"chart.radialBar.dropZone.yAxis.empty":`Drop a measure for values`,"chart.treemap.dropZone.xAxis.empty":`Drop dimensions for categories`,"chart.treemap.dropZone.yAxis.empty":`Drop a measure for size`,"chart.treemap.dropZone.series.empty":`Drop a dimension for colour grouping`,"chart.table.dropZone.xAxis.empty":`Drop fields to display as columns (or leave empty for all)`,"chart.recordsTable.dropZone.columns.label":`Columns`,"chart.recordsTable.dropZone.columns.description":`Fields rendered as columns, in this order`,"chart.recordsTable.dropZone.columns.empty":`Drop fields to display as columns (or leave empty for all)`,"chart.recordsTable.dropZone.hiddenColumns.label":`Hidden fields`,"chart.recordsTable.dropZone.hiddenColumns.description":`Fetched for row context and links, never displayed`,"chart.recordsTable.dropZone.hiddenColumns.empty":`Drop fields to fetch without showing them`,"chart.recordsTable.option.columnFormats.label":`Column formats`,"chart.recordsTable.option.columnFormats.description":`Choose how each column renders its value`,"chart.recordsTable.option.pageSize.label":`Rows per page`,"chart.recordsTable.option.pageSize.description":`How many records to show at a time`,"chart.recordsTable.option.pageSize.option.25":`25`,"chart.recordsTable.option.pageSize.option.50":`50`,"chart.recordsTable.option.pageSize.option.100":`100`,"chart.recordsTable.option.rowLink.label":`Row link`,"chart.recordsTable.option.rowLink.description":`Make each row a link. Use {Cube.field} tokens — hidden fields work too. Relative paths and http(s) URLs only.`,"chart.recordsTable.rowLink.urlTemplate":`URL template`,"chart.recordsTable.rowLink.placeholder":`/employees/{Employees.id}`,"chart.recordsTable.rowLink.target.self":`Same tab`,"chart.recordsTable.rowLink.target.blank":`New tab`,"chart.recordsTable.columnFormats.noColumns":`Assign columns first — each one can then be formatted here`,"chart.recordsTable.columnFormats.kind.text":`Text`,"chart.recordsTable.columnFormats.kind.number":`Number`,"chart.recordsTable.columnFormats.kind.date":`Date`,"chart.recordsTable.columnFormats.kind.badge":`Badge`,"chart.recordsTable.columnFormats.kind.progress":`Progress`,"chart.recordsTable.columnFormats.kind.link":`Link`,"chart.recordsTable.columnFormats.numberFormat":`Number format`,"chart.recordsTable.columnFormats.granularity":`Granularity`,"chart.recordsTable.columnFormats.badgeColours":`Value colours`,"chart.recordsTable.columnFormats.badgeColour":`Colour`,"chart.recordsTable.columnFormats.badgeValue":`Value`,"chart.recordsTable.columnFormats.badgeAdd":`Add value`,"chart.recordsTable.columnFormats.badgeRemove":`Remove value`,"chart.recordsTable.columnFormats.progressMin":`Minimum`,"chart.recordsTable.columnFormats.progressMax":`Maximum`,"chart.recordsTable.columnFormats.progressStyle":`Style`,"chart.recordsTable.columnFormats.progressStyle.bar":`Bar`,"chart.recordsTable.columnFormats.progressStyle.circle":`Circle`,"chart.recordsTable.columnFormats.progressBandColours":`Colour bands`,"chart.recordsTable.columnFormats.progressBandColour":`Colour`,"chart.recordsTable.columnFormats.progressBandValue":`From value`,"chart.recordsTable.columnFormats.progressBandAdd":`Add band`,"chart.recordsTable.columnFormats.progressBandRemove":`Remove band`,"chart.recordsTable.columnFormats.header":`Header`,"chart.recordsTable.columnFormats.linkTemplate":`URL template`,"chart.recordsTable.columnFormats.linkTemplatePlaceholder":`/employees/{Employees.id}`,"chart.recordsTable.columnFormats.linkTemplateHelp":`Each cell links here and shows its own value. {Cube.field} tokens fill from the row, so add each field to the query — a hidden field works too. Relative paths and http(s) URLs only.`,"chart.activityGrid.dropZone.dateField.empty":`Drop a time dimension (granularity affects grid structure)`,"chart.activityGrid.dropZone.valueField.empty":`Drop a measure for activity intensity`,"chart.kpiNumber.dropZone.yAxis.empty":`Drop a measure here`,"chart.kpiDelta.dropZone.yAxis.empty":`Drop a measure here`,"chart.kpiDelta.dropZone.xAxis.empty":`Drop a dimension for ordering`,"chart.kpiText.dropZone.yAxis.empty":`Drop a measure here`,"chart.funnel.dropZone.xAxis.empty":`Steps defined in funnel config`,"chart.funnel.dropZone.yAxis.empty":`Counts calculated from funnel execution`,"chart.sankey.dropZone.xAxis.empty":`Auto-populated from flow config`,"chart.sankey.dropZone.yAxis.empty":`Calculated from flow execution`,"chart.sunburst.dropZone.xAxis.empty":`Auto-populated from flow config`,"chart.sunburst.dropZone.yAxis.empty":`Calculated from flow execution`,"chart.heatmap.dropZone.xAxis.empty":`Drop one dimension here`,"chart.heatmap.dropZone.yAxis.empty":`Drop one dimension here`,"chart.heatmap.dropZone.valueField.empty":`Drop one measure here`,"chart.boxPlot.dropZone.xAxis.empty":`Drop a dimension here`,"chart.boxPlot.dropZone.yAxis.empty":`Drop 1, 3, or 5 measures here`,"chart.dotStrip.dropZone.xAxis.label":`Bands (rows)`,"chart.dotStrip.dropZone.xAxis.description":`Dimension that groups dots into rows, e.g. team, band, region`,"chart.dotStrip.dropZone.xAxis.empty":`Drop a dimension to band by`,"chart.dotStrip.dropZone.yAxis.label":`Value (horizontal position)`,"chart.dotStrip.dropZone.yAxis.description":`Measure that positions each dot along the horizontal axis`,"chart.dotStrip.dropZone.yAxis.empty":`Drop a measure here`,"chart.dotStrip.dropZone.series.label":`Dot identity`,"chart.dotStrip.dropZone.series.description":`Dimension that gives each dot its own row — one dot per value, named in the tooltip`,"chart.dotStrip.dropZone.series.empty":`Drop a dimension to split into individual dots`,"chart.waterfall.dropZone.xAxis.empty":`Drop a dimension here`,"chart.waterfall.dropZone.yAxis.empty":`Drop a measure here`,"chart.candlestick.dropZone.xAxis.empty":`Drop a time or dimension here`,"chart.candlestick.dropZone.yAxis.empty":`Drop 2+ measures here`,"chart.measureProfile.dropZone.yAxis.empty":`Drop 2+ measures here (displayed left → right)`,"chart.measureProfile.dropZone.series.empty":`Drop a dimension here to create multiple lines`,"chart.gauge.dropZone.yAxis.empty":`Drop 1 measure here (optional 2nd for dynamic max)`,"chart.activityGrid.validation.timeDimensionRequired":`Time dimension is required for activity grid`,"chart.activityGrid.validation.measureRequired":`Activity measure is required for intensity mapping`,"chart.kpiDelta.validation.measureRequired":`A measure is required for KPI Delta charts`,"chart.heatmap.validation.xAxisRequired":`X-axis dimension required`,"chart.heatmap.validation.yAxisRequired":`Y-axis dimension required`,"chart.heatmap.validation.valueRequired":`Value measure required`,"chart.option.stacking.label":`Stacking`,"chart.option.stacking.none":`None`,"chart.option.stacking.stacked":`Stacked`,"chart.option.stacking.percent":`Stacked 100%`,"chart.option.stacking.description":`How to stack multiple series`,"chart.option.target.label":`Target Values`,"chart.option.target.description":`Single value or comma-separated values to spread across X-axis`,"chart.option.connectNulls.label":`Connect Nulls`,"chart.option.connectNulls.description":`Draw continuous line through missing data points`,"chart.option.fillMissingDates.label":`Fill Missing Dates`,"chart.option.fillMissingDates.description":`Show missing time periods as the fill value (0 by default). Auto follows the cube definition.`,"chart.option.fillMissingDates.auto":`Auto`,"chart.option.fillMissingDates.on":`On`,"chart.option.fillMissingDates.off":`Off`,"chart.option.showAllXLabels.label":`Show All X Labels`,"chart.option.showAllXLabels.description":`Display every label on the X-axis instead of auto-hiding overlapping labels`,"chart.option.leftYAxisFormat.label":`Left Y-Axis Format`,"chart.option.leftYAxisFormat.description":`Number formatting for left Y-axis`,"chart.option.rightYAxisFormat.label":`Right Y-Axis Format`,"chart.option.rightYAxisFormat.description":`Number formatting for right Y-axis`,"chart.option.xAxisFormat.label":`X-Axis Format`,"chart.option.xAxisFormat.description":`Number formatting for X-axis`,"chart.option.yAxisFormat.label":`Y-Axis Format`,"chart.option.yAxisFormat.description":`Number formatting for Y-axis`,"chart.option.valueFormat.label":`Value Format`,"chart.option.valueFormat.description":`Number formatting for values`,"chart.option.innerRadius.label":`Inner Radius`,"chart.option.innerRadius.description":`Hollow centre size (0% = solid pie, higher = donut style)`,"chart.option.showLabels.label":`Show Cell Values`,"chart.option.showLabels.description":`Display values inside each cell`,"chart.option.cellShape.label":`Cell Shape`,"chart.option.cellShape.rectangle":`Rectangle`,"chart.option.cellShape.circle":`Circle`,"chart.option.funnelStyle.label":`Funnel Style`,"chart.option.funnelStyle.bars":`Bars`,"chart.option.funnelStyle.funnel":`Funnel`,"chart.option.funnelOrientation.label":`Orientation`,"chart.option.funnelOrientation.horizontal":`Horizontal`,"chart.option.funnelOrientation.vertical":`Vertical`,"chart.option.hideSummaryFooter.label":`Hide Summary Footer`,"chart.option.hideSummaryFooter.description":`Hide the summary footer showing steps count and overall conversion`,"chart.option.showConversion.label":`Show Conversion Rate`,"chart.option.showConversion.description":`Display step-to-step conversion percentage`,"chart.option.showAvgTime.label":`Show Avg Time`,"chart.option.showAvgTime.description":`Display average time to convert`,"chart.option.showMedianTime.label":`Show Median Time`,"chart.option.showMedianTime.description":`Display median time to convert`,"chart.option.showP90Time.label":`Show P90 Time`,"chart.option.showP90Time.description":`Display 90th percentile time to convert`,"chart.option.linkOpacity.label":`Link Opacity`,"chart.option.linkOpacity.light":`Light`,"chart.option.linkOpacity.medium":`Medium`,"chart.option.linkOpacity.dark":`Dark`,"chart.option.showNodeLabels.label":`Show Node Labels`,"chart.option.showNodeLabels.description":`Display labels on flow nodes`,"chart.option.prefix.label":`Prefix`,"chart.option.prefix.description":`Text to display before the number`,"chart.option.suffix.label":`Suffix`,"chart.option.suffix.description":`Text to display after the number`,"chart.option.decimals.label":`Decimal Places`,"chart.option.decimals.description":`Number of decimal places to display`,"chart.option.showHistogram.label":`Show Variance Histogram`,"chart.option.showHistogram.description":`Display historical variance chart below the delta`,"chart.option.useLastCompletePeriod.label":`Use Last Complete Period`,"chart.option.useLastCompletePeriod.description":`Exclude current incomplete period from calculation (e.g., partial week/month)`,"chart.option.skipLastPeriod.label":`Skip Last Period`,"chart.option.skipLastPeriod.description":`Always exclude the last period regardless of completeness`,"chart.option.retentionDisplayMode.label":`Display Mode`,"chart.option.retentionDisplayMode.lineChart":`Line Chart`,"chart.option.retentionDisplayMode.heatmapTable":`Heatmap Table`,"chart.option.retentionDisplayMode.combined":`Combined`,"chart.option.showLegend.label":`Show Legend`,"chart.option.showLegend.description":`Show the legend`,"chart.option.showGrid.label":`Show Grid`,"chart.option.showGrid.description":`Show grid lines on the chart`,"chart.option.showTooltip.label":`Show Tooltip`,"chart.option.showTooltip.description":`Show tooltip on hover with detailed stats`,"chart.option.priorPeriodStyle.label":`Prior Period Line Style`,"chart.option.priorPeriodStyle.dashed":`Dashed`,"chart.option.priorPeriodStyle.dotted":`Dotted`,"chart.option.priorPeriodStyle.solid":`Solid`,"chart.option.priorPeriodStyle.description":`Line style for prior period in comparison mode`,"chart.option.priorPeriodOpacity.label":`Prior Period Opacity`,"chart.option.priorPeriodOpacity.description":`Opacity for prior period lines (0.1 to 1)`,"chart.option.showTotal.label":`Show Total Bar`,"chart.option.showTotal.description":`Append a final bar showing the running total`,"chart.option.showConnectorLine.label":`Show Connector Line`,"chart.option.showConnectorLine.description":`Draw a dashed step-line connecting bar tops`,"chart.option.showDataLabels.label":`Show Data Labels`,"chart.option.showDataLabels.description":`Display the value at each data point`,"chart.option.showReferenceLineAtZero.label":`Show Zero Reference Line`,"chart.option.showReferenceLineAtZero.description":`Draw a dashed line at Y = 0`,"chart.option.showMedianMarker.label":`Show Median Marker`,"chart.option.showMedianMarker.description":`Draw a tick at each band's median value`,"chart.option.showBandStats.label":`Show Band Statistics`,"chart.option.showBandStats.description":`Show the dot count and spread beside each band name`,"chart.option.showExtremeLabels.label":`Label Extremes`,"chart.option.showExtremeLabels.description":`Name the lowest and highest dot in each band`,"chart.option.dotSize.label":`Dot Size`,"chart.option.dotSize.description":`Larger dots are easier to see but spread the swarm further`,"chart.option.dotSize.small":`Small`,"chart.option.dotSize.medium":`Medium`,"chart.option.dotSize.large":`Large`,"chart.option.bandSort.label":`Band Order`,"chart.option.bandSort.description":`How to order the bands from top to bottom`,"chart.option.bandSort.none":`Query order`,"chart.option.bandSort.valueDesc":`Highest median first`,"chart.option.bandSort.valueAsc":`Lowest median first`,"chart.option.bandSort.count":`Most dots first`,"chart.option.lineType.label":`Line Interpolation`,"chart.option.lineType.smooth":`Smooth (monotone)`,"chart.option.lineType.linear":`Linear`,"chart.option.lineType.step":`Step`,"chart.option.lineType.description":`How data points are connected`,"chart.option.rangeMode.label":`Chart Mode`,"chart.option.rangeMode.ohlc":`OHLC (open, close, high, low)`,"chart.option.rangeMode.range":`Range (high, low / bid, ask)`,"chart.option.rangeMode.description":`OHLC: 4 measures. Range: 2 measures (high + low).`,"chart.option.bullColor.label":`Bullish Colour`,"chart.option.bullColor.description":`Candle colour when close ≥ open`,"chart.option.bearColor.label":`Bearish Colour`,"chart.option.bearColor.description":`Candle colour when close < open`,"chart.option.showWicks.label":`Show Wicks`,"chart.option.showWicks.description":`Draw high/low wicks above and below the body`,"chart.option.minValue.label":`Minimum Value`,"chart.option.minValue.description":`Lower bound of the gauge arc (default 0)`,"chart.option.maxValue.label":`Maximum Value (static)`,"chart.option.maxValue.description":`Upper bound of the gauge. Leave empty to use yAxis[1] or default 100`,"chart.option.showCentreLabel.label":`Show Centre Label`,"chart.option.showCentreLabel.description":`Display current value and field name in the centre of the gauge`,"chart.option.showPercentage.label":`Show as Percentage`,"chart.option.showPercentage.description":`Display value as % of max instead of raw number`,"chart.option.fitToWidth.label":`Fit to Width`,"chart.option.fitToWidth.description":`Automatically size blocks to fill portlet width and height while maintaining aspect ratio`,"chart.option.fontSize.label":`Font Size`,"chart.option.fontSize.small":`Small`,"chart.option.fontSize.medium":`Medium`,"chart.option.fontSize.large":`Large`,"chart.option.alignment.label":`Text Alignment`,"chart.option.alignment.left":`Left`,"chart.option.alignment.center":`Center`,"chart.option.alignment.right":`Right`,"chart.option.hideHeader.label":`Hide Header`,"chart.option.hideHeader.description":`Hide the portlet header bar (title and action buttons)`,"chart.option.transparentBackground.label":`Transparent Background`,"chart.option.transparentBackground.description":`Remove card background, border, and shadow for seamless integration as section headers`,"chart.option.autoHeight.label":`Auto Height`,"chart.option.autoHeight.description":`In row and mobile layouts, size to markdown content instead of fixed row height`,"chart.option.accentBorder.label":`Accent Border`,"chart.option.accentBorder.none":`None`,"chart.option.accentBorder.left":`Left`,"chart.option.accentBorder.top":`Top`,"chart.option.accentBorder.bottom":`Bottom`,"chart.option.accentBorder.description":`Add an accent-coloured border on one side of the content`,"chart.configText.20_percent":`20%`,"chart.configText.40_percent":`40%`,"chart.configText.60_percent":`60%`,"chart.configText.80_percent":`80%`,"chart.configText.accent_color":`Accent Color`,"chart.configText.activity_measure":`Activity Measure`,"chart.configText.add_2_or_more_measures_they_become_the_x_axis_categories_in_the_order_li":`Add 2 or more measures — they become the X-axis categories in the order listed`,"chart.configText.add_an_accent_colored_border_on_one_side_of_the_content":`Add an accent-colored border on one side of the content`,"chart.configText.all_fields_to_display_as_columns":`All fields to display as columns`,"chart.gauge.thresholds.description":`Each band runs from its value up to the next one. Values are on the gauge’s own scale.`,"chart.configText.axes_categories":`Axes (Categories)`,"chart.configText.bubble_colour":`Bubble Colour`,"chart.configText.bubble_labels":`Bubble Labels`,"chart.configText.bubble_radius":`Bubble Radius`,"chart.configText.categories":`Categories`,"chart.configText.choose_how_to_visualize_retention_data":`Choose how to visualize retention data`,"chart.configText.color_bubbles_by_this_field_optional":`Color bubbles by this field (optional)`,"chart.configText.color_for_negative_changes_decreases":`Color for negative changes (decreases)`,"chart.configText.color_for_positive_changes_increases":`Color for positive changes (increases)`,"chart.configText.color_from_the_dashboard_palette_for_headers_bullets_and_links":`Color from the dashboard palette for headers, bullets, and links`,"chart.configText.color_from_the_dashboard_palette_for_the_kpi_value_text":`Color from the dashboard palette for the KPI value text`,"chart.configText.color_groups":`Color Groups`,"chart.configText.columns":`Columns`,"chart.configText.columns_x_axis":`Columns (X-Axis)`,"chart.configText.count_at_each_step_auto_calculated":`Count at each step (auto-calculated)`,"chart.configText.count_of_entities_following_each_path":`Count of entities following each path`,"chart.configText.current_value_to_display_on_the_gauge_e_g_current_equity_margin_used":`Current value to display on the gauge (e.g. current equity, margin used)`,"chart.configText.dimension_for_column_categories":`Dimension for column categories`,"chart.configText.dimension_for_ordering_data_typically_time":`Dimension for ordering data (typically time)`,"chart.configText.dimension_for_pie_slices":`Dimension for pie slices`,"chart.configText.dimension_for_row_categories":`Dimension for row categories`,"chart.configText.dimension_labels_for_each_bar_segment_e_g_symbol_transaction_type":`Dimension labels for each bar segment (e.g. symbol, transaction type)`,"chart.configText.dimension_optional":`Dimension (optional)`,"chart.configText.dimension_to_color_points_by_category":`Dimension to color points by category`,"chart.configText.dimension_to_color_rectangles_by_category":`Dimension to color rectangles by category`,"chart.configText.dimension_to_group_boxes_by_e_g_symbol_platform":`Dimension to group boxes by (e.g. symbol, platform)`,"chart.configText.dimension_to_split_data_into_separate_profile_lines_e_g_symbol_platform":`Dimension to split data into separate profile lines (e.g. symbol, platform)`,"chart.configText.dimensions_for_radar_axes":`Dimensions for radar axes`,"chart.configText.dimensions_for_radial_segments":`Dimensions for radial segments`,"chart.configText.dimensions_for_treemap_rectangles":`Dimensions for treemap rectangles`,"chart.configText.dimensions_to_create_multiple_radar_shapes":`Dimensions to create multiple radar shapes`,"chart.configText.dimensions_to_create_separate_lines":`Dimensions to create separate lines`,"chart.configText.dimensions_to_create_stacked_areas":`Dimensions to create stacked areas`,"chart.configText.display_the_value_above_each_bar_segment":`Display the value above each bar segment`,"chart.configText.display_value_at_each_data_point":`Display value at each data point`,"chart.configText.drop_1_measure_for_auto_mode_3_for_avg_stddev_median_mode_or_5_for_min_q":`Drop 1 measure for auto mode, 3 for avg/stddev/median mode, or 5 for min/q1/median/q3/max mode`,"chart.configText.drop_2_4_measures_in_order_open_close_high_low_ohlc_mode_for_range_mode_":`Drop 2–4 measures in order: open, close, high, low (OHLC mode). For range mode drop 2: high, low.`,"chart.configText.enter_markdown_text_supports_headers_bold_text_italic_text_links_text_ur":`Enter markdown text. Supports headers (#), bold (**text**), italic (*text*), links ([text](url)), lists (- item), and horizontal rules (---).`,"chart.configText.event_dimension_that_categorizes_flow_nodes":`Event dimension that categorizes flow nodes`,"chart.configText.event_type":`Event Type`,"chart.configText.exclude_current_incomplete_period_from_aggregation_e_g_partial_week_mont":`Exclude current incomplete period from aggregation (e.g., partial week/month)`,"chart.configText.exclude_current_incomplete_period_from_delta_calculation_e_g_partial_wee":`Exclude current incomplete period from delta calculation (e.g., partial week/month)`,"chart.configText.field_to_use_for_bubble_labels_and_identification":`Field to use for bubble labels and identification`,"chart.configText.flow_count":`Flow Count`,"chart.configText.hide_the_statistics_footer_below_the_chart":`Hide the statistics footer below the chart`,"chart.configText.hollow_center_size_0_percent_solid_pie_higher_donut_style":`Hollow center size (0% = solid pie, higher = donut style)`,"chart.configText.horizontal_alignment_of_the_markdown_content":`Horizontal alignment of the markdown content`,"chart.configText.horizontal_axis_position":`Horizontal axis position`,"chart.configText.how_to_stack_multiple_area_series":`How to stack multiple area series`,"chart.configText.how_to_stack_multiple_bar_series":`How to stack multiple bar series`,"chart.configText.markdown_content":`Markdown Content`,"chart.configText.measure_for_rectangle_sizes":`Measure for rectangle sizes`,"chart.configText.measure_for_slice_sizes":`Measure for slice sizes`,"chart.configText.measure_for_y_position":`Measure for Y position`,"chart.configText.measure_or_dimension_for_x_position":`Measure or dimension for X position`,"chart.configText.measure_that_determines_cell_color":`Measure that determines cell color`,"chart.configText.measure_to_display_as_kpi_number":`Measure to display as KPI number`,"chart.configText.measure_to_display_in_the_kpi_text_template":`Measure to display in the KPI text template`,"chart.configText.measure_to_track_changes_for":`Measure to track changes for`,"chart.configText.measure_used_for_activity_intensity_color_coding":`Measure used for activity intensity (color coding)`,"chart.configText.measures_for_area_values":`Measures for area values`,"chart.configText.measures_for_bar_heights":`Measures for bar heights`,"chart.configText.measures_for_line_values":`Measures for line values`,"chart.configText.measures_for_radar_values":`Measures for radar values`,"chart.configText.measures_for_radial_bar_lengths":`Measures for radial bar lengths`,"chart.configText.measures_x_axis_order":`Measures (X-Axis Order)`,"chart.configText.negative_change_color":`Negative Change Color`,"chart.configText.none_pie":`None (Pie)`,"chart.configText.number_formatting_for_cell_values_and_legend":`Number formatting for cell values and legend`,"chart.configText.number_formatting_for_numeric_values":`Number formatting for numeric values`,"chart.configText.number_formatting_for_size_values":`Number formatting for size values`,"chart.configText.number_formatting_for_the_displayed_value_and_axis_labels":`Number formatting for the displayed value and axis labels`,"chart.configText.number_formatting_for_the_price_axis":`Number formatting for the price axis`,"chart.configText.number_formatting_for_the_value_axis":`Number formatting for the value axis`,"chart.configText.number_formatting_for_the_y_axis":`Number formatting for the Y-axis`,"chart.configText.number_formatting_for_x_axis_labels":`Number formatting for X-axis labels`,"chart.configText.number_formatting_for_y_axis_and_values":`Number formatting for Y-axis and values`,"chart.configText.number_formatting_for_y_axis_labels":`Number formatting for Y-axis labels`,"chart.configText.number_of_decimal_places_to_display_for_numeric_values":`Number of decimal places to display for numeric values`,"chart.configText.ohlc_measures_open_close_high_low":`OHLC Measures (open, close, high, low)`,"chart.configText.opacity_of_flow_links":`Opacity of flow links`,"chart.configText.overall_text_size_for_the_markdown_content":`Overall text size for the markdown content`,"chart.configText.positive_change_color":`Positive Change Color`,"chart.configText.rows_y_axis":`Rows (Y-Axis)`,"chart.configText.series_color_groups":`Series (Color Groups)`,"chart.configText.series_multiple_lines":`Series (Multiple Lines)`,"chart.configText.series_multiple_shapes":`Series (Multiple Shapes)`,"chart.configText.series_split_into_multiple_lines":`Series (Split into Multiple Lines)`,"chart.configText.series_stack_areas":`Series (Stack Areas)`,"chart.configText.show_series_legend_only_visible_with_a_series_dimension":`Show series legend (only visible with a Series dimension)`,"chart.configText.show_the_color_intensity_legend":`Show the color intensity legend`,"chart.configText.show_the_legend_for_breakdown_segments":`Show the legend for breakdown segments`,"chart.configText.single_measure_whose_values_are_summed_cumulatively":`Single measure whose values are summed cumulatively`,"chart.configText.size":`Size`,"chart.configText.size_of_bubbles_based_on_this_measure":`Size of bubbles based on this measure`,"chart.configText.size_of_the_center_hole_0_for_full_circle":`Size of the center hole (0 for full circle)`,"chart.configText.step_count":`Step Count`,"chart.configText.step_name":`Step Name`,"chart.configText.step_names_auto_populated_from_funnel_steps":`Step names (auto-populated from funnel steps)`,"chart.configText.target_value_to_compare_against_first_value_used_if_multiple_provided":`Target value to compare against (first value used if multiple provided)`,"chart.configText.template_for_displaying_the_text_use_value_to_insert_the_measure_value":"Template for displaying the text. Use ${value} to insert the measure value.","chart.configText.text_template":`Text Template`,"chart.configText.threshold_bands":`Threshold Bands`,"chart.configText.time_dimension":`Time Dimension`,"chart.configText.time_dimension_or_category_for_each_candle_e_g_date_symbol":`Time dimension or category for each candle (e.g. date, symbol)`,"chart.configText.time_dimensions_or_dimensions_for_x_axis":`Time dimensions or dimensions for X-axis`,"chart.configText.time_field_that_determines_grid_structure_granularity_affects_layout":`Time field that determines grid structure (granularity affects layout)`,"chart.configText.value":`Value`,"chart.configText.value_color":`Value Color`,"chart.configText.value_color_intensity":`Value (Color Intensity)`,"chart.configText.value_measure":`Value Measure`,"chart.configText.values":`Values`,"chart.configText.vertical_axis_position":`Vertical axis position`,"chart.configText.visualization_style":`Visualization style`,"chart.configText.x_axis_groups":`X-Axis (Groups)`,"chart.configText.x_axis_time_categories":`X-Axis (Time/Categories)`,"chart.configText.x_axis_time_category":`X-Axis (Time / Category)`,"chart.configText.y_axis":`Y-Axis`,"chart.configText.y_axis_measures":`Y-Axis (Measures)`,"chart.configText.y_axis_value":`Y-Axis (Value)`,"display.loading":`Loading display options...`,"display.noOptions":`No display options available for this chart type.`,"display.heading":`Display Options`,"results.loading.title":`Executing Query...`,"results.loading.subtitle":`Running your query against the cube API`,"results.error.title":`Query Execution Failed`,"results.error.subtitle":`There was an error executing your query. Please check the query and try again.`,"results.waiting.title":`Preparing Query...`,"results.waiting.subtitle":`Your query will execute shortly`,"results.needsRefresh.title":`Ready to Execute`,"results.needsRefresh.subtitle":`Click refresh to run your query`,"results.needsRefresh.runButton":`Run Query`,"results.empty.query":`Add metrics or breakdowns from the panel on the right to see results`,"results.empty.retention":`Select a cube and configure retention settings to see results`,"results.empty.funnel":`Add funnel steps to see conversion analysis`,"results.empty.flow":`Configure flow analysis to see user journey paths`,"results.empty.title":`No Results Yet`,"results.ai.button":`Analyse with AI`,"results.noData.title":`Query Successful`,"results.noData.subtitle":`No data returned from the query`,"results.chart.noData":`No data to display`,"results.chart.noDataHint":`Run a query to see chart visualisation`,"results.chart.unsupported":`Unsupported chart type`,"results.refreshing":`Refreshing results...`,"results.header.rows":`rows`,"results.header.row":`row`,"results.header.stale":`Results may be outdated`,"results.header.failed":`Query failed`,"results.header.executing":`Executing...`,"results.header.noResults":`No results`,"results.view.chart":`Chart`,"results.view.merged":`Merged`,"results.warning.largeDataset":`Large dataset:`,"results.warning.configChanged":`Query configuration changed. Results may be outdated.`,"results.warning.refreshNow":`Refresh Now`,"results.share.copied":`Copied!`,"results.share.noChart":`(no chart)`,"server.errors.dbNotConfigured":`Database executor not configured`,"server.errors.cubeNotFound":`Cube '{cubeName}' not found`,"server.errors.noCubesInQuery":`No cubes found in query`,"server.errors.dbAdapterRequired":`DatabaseExecutor must have a databaseAdapter property`,"server.errors.rlsRequiresTransactions":`rlsSetup requires a database driver that supports transactions (db.transaction)`,"server.errors.queryExecutionFailed":`Query execution failed: {message}`,"server.errors.queryExecutionUnknown":`Query execution failed: Unknown error`,"server.errors.noCompareDateRange":`No compareDateRange found in query`,"server.errors.compareDateRangeInvalid":`compareDateRange requires at least 2 periods`,"server.errors.funnelValidationFailed":`Funnel validation failed: {errors}`,"server.errors.flowValidationFailed":`Flow validation failed: {errors}`,"server.errors.retentionValidationFailed":`Retention validation failed: {errors}`,"server.errors.cubeRefUnresolved":`{cubeName}.joins.{joinName}: target cube '{targetCube}' is not registered`,"server.errors.unresolvedCubeRefs":`Unresolved cube references:
67
67
  {details}`,"server.errors.cubeSetIdEmpty":`Cube set id must not be empty — the empty id is reserved for the base cube set`,"server.errors.cubeSetNotFound":`No cube set registered for '{setId}'`,"server.errors.attributeIdRequired":`Attribute definitions must have a non-empty id`,"server.errors.calculatedMeasureValidation":`Calculated measure validation failed for cube '{cubeName}':
68
68
  {details}`,"server.errors.queryValidationFailed":`Query validation failed: {errors}`,"server.errors.queryContainsMultipleModes":`Query contains multiple query modes: {modes}`,"server.errors.primaryCubeNotFound":`Primary cube '{cubeName}' not found`,"server.errors.noJoinPath":`No join path found from '{fromCube}' to '{toCube}'`,"server.errors.cubeNotFoundForMeasure":`Cube '{cubeName}' not found for measure '{measure}'`,"server.errors.cubeNotFoundForDimension":`Cube '{cubeName}' not found for dimension '{dimension}'`,"server.errors.cubeNotFoundForTimeDimension":`Cube '{cubeName}' not found for time dimension '{timeDimension}'`,"server.errors.invalidFunnelConfig":`Query does not contain a valid funnel configuration`,"server.errors.invalidFlowConfig":`Query does not contain a valid flow configuration`,"server.errors.invalidRetentionConfig":`Query does not contain a valid retention configuration`,"server.errors.agentResponseTruncated":`The assistant ran out of response space and stopped part-way through. Ask it to continue, or raise maxTokens in the agent configuration.`,"server.errors.llmInitFailed":`Failed to initialize LLM provider`,"server.validation.ai.bindingKeyRequired.flow":`flow.bindingKey is required`,"server.validation.ai.bindingKeyRequired.funnel":`funnel.bindingKey is required`,"server.validation.ai.bindingKeyRequired.retention":`retention.bindingKey is required`,"server.validation.ai.cubeNotFoundInFilter":`Cube '{cubeName}' not found in filter`,"server.validation.ai.cubeNotFoundWithAvailable":`Cube '{cubeName}' not found`,"server.validation.ai.cubeNotFoundWithSuggestion":`Cube '{cubeName}' not found`,"server.validation.ai.dimensionNotFoundWithAvailable":`Dimension '{dimensionName}' not found on cube '{cubeName}'`,"server.validation.ai.dimensionNotFoundWithSuggestion":`Dimension '{dimensionName}' not found on cube '{cubeName}'`,"server.validation.ai.dimensionNotTimeType":`Dimension '{dimension}' is not a time type (it's '{type}')`,"server.validation.ai.emptyQuery":`Query must have at least one measure or dimension`,"server.validation.ai.eventDimensionRequired":`flow.eventDimension is required`,"server.validation.ai.filterFieldNotFound":`Filter field '{fieldName}' not found on cube '{cubeName}'`,"server.validation.ai.filterFieldNotFoundWithSuggestion":`Filter field '{fieldName}' not found on cube '{cubeName}'`,"server.validation.ai.funnelRequiresSteps":`funnel requires at least 2 steps`,"server.validation.ai.funnelStepsRequired":`funnel.steps array is required`,"server.validation.ai.granularityNotSpecified":`retention.granularity not specified`,"server.validation.ai.invalidDimensionFormat":`Invalid dimension format: '{dimension}'. Expected 'CubeName.dimensionName'`,"server.validation.ai.invalidFilterMemberFormat":`Invalid filter member format: '{member}'`,"server.validation.ai.invalidMeasureFormat":`Invalid measure format: '{measure}'. Expected 'CubeName.measureName'`,"server.validation.ai.measureNotFoundWithAvailable":`Measure '{measureName}' not found on cube '{cubeName}'`,"server.validation.ai.measureNotFoundWithSuggestion":`Measure '{measureName}' not found on cube '{cubeName}'`,"server.validation.ai.performanceManyDimensions":`Query has {count} dimensions, which may produce many rows`,"server.validation.ai.performanceManyMeasures":`Query has {count} measures, which may impact performance`,"server.validation.ai.periodsNotSpecified":`retention.periods not specified`,"server.validation.ai.retentionTimeDimensionRequired":`retention.timeDimension is required`,"server.validation.ai.stepMissingName":`Step {step} is missing a name`,"server.validation.ai.stepsBothMissing":`Neither stepsBefore nor stepsAfter specified`,"server.validation.ai.suggestAddDimensionFilters":`Consider adding filters or reducing dimensions`,"server.validation.ai.suggestAddStepNames":`Add descriptive names to funnel steps`,"server.validation.ai.suggestSetSteps":`Set stepsBefore and/or stepsAfter to see event sequences`,"server.validation.ai.suggestSpecifyGranularity":`Specify granularity: "day", "week", or "month"`,"server.validation.ai.suggestSpecifyPeriods":`Specify number of periods to analyze`,"server.validation.ai.suggestSplitQueries":`Consider splitting into multiple queries`,"server.validation.ai.suggestUseTimeDimension":`Use a dimension with type "time" for timeDimensions`,"server.validation.ai.timeDimensionRequired.flow":`flow.timeDimension is required`,"server.validation.ai.timeDimensionRequired.funnel":`funnel.timeDimension is required`,"server.validation.chart.barNeedsDimension":`Bar charts need an xAxis dimension for category labels. Add a dimension to the query or use "table" chart type instead.`,"server.validation.chart.barXAxisRequired":`chartConfig.xAxis is required for bar charts. Put a dimension in xAxis so bars have category labels.`,"server.validation.chart.dropZoneRequired":`chartConfig.{key} is required for {chartType} chart ({label}). Accepts: {acceptDesc}.`,"server.validation.chart.recordGrainNeedsUngrouped":`{chartType} lists one row per record, so its query must set "ungrouped": true. Add it to the query, and remove count/countDistinct measures — they cannot be ungrouped. An ungrouped query also cannot span two cubes joined by hasMany, so keep it to one cube plus its to-one joins.`,"server.validation.chart.seriesDuplicatesXAxis":`chartConfig.series must not contain the same field as xAxis (found: {duplicates}). The series field is only for splitting into grouped/stacked sub-series by a DIFFERENT dimension. Remove the duplicate from series.`,"server.validation.flow.bindingKeyCubeNotFound":`Binding key cube not found: {cubeName}`,"server.validation.flow.bindingKeyDimNotFound":`Binding key dimension not found: {dimName} in cube {cubeName}`,"server.validation.flow.bindingKeyMappingCubeNotFound":`Binding key mapping cube not found: {cubeName}`,"server.validation.flow.eventDimCubeNotFound":`Event dimension cube not found: {cubeName}`,"server.validation.flow.eventDimNotFound":`Event dimension not found: {dimName} in cube {cubeName}`,"server.validation.flow.eventDimRequired":`Event dimension is required for flow analysis`,"server.validation.flow.highStepDepthWarning":`High step depth (4-5) may impact query performance on large datasets`,"server.validation.flow.invalidBindingKeyFormat":`Invalid binding key format: {bindingKey}. Expected 'CubeName.dimensionName'`,"server.validation.flow.invalidEventDimFormat":`Invalid event dimension format: {eventDimension}. Expected 'CubeName.dimensionName'`,"server.validation.flow.invalidJoinStrategy":`Invalid joinStrategy: {joinStrategy}`,"server.validation.flow.invalidTimeDimFormat":`Invalid time dimension format: {timeDimension}. Expected 'CubeName.dimensionName'`,"server.validation.flow.lateralNotSupported":`Lateral joins are not supported on this database`,"server.validation.flow.lateralNotSupportedExec":`Lateral joins with CTE references are not supported on this database`,"server.validation.flow.sqliteNotSupported":`Flow queries are not supported on SQLite. Use PostgreSQL or MySQL for flow analysis.`,"server.validation.flow.startingStepFilterRequired":`Starting step must have at least one filter`,"server.validation.flow.startingStepNameMissing":`Starting step has no name - using default`,"server.validation.flow.startingStepRequired":`Starting step is required for flow analysis`,"server.validation.flow.stepsBeforeRange":`stepsBefore must be between 0 and 5, got: {value}`,"server.validation.flow.stepsAfterRange":`stepsAfter must be between 0 and 5, got: {value}`,"server.validation.flow.timeDimCubeNotFound":`Time dimension cube not found: {cubeName}`,"server.validation.flow.timeDimNotFound":`Time dimension not found: {dimName} in cube {cubeName}`,"server.validation.funnel.bindingKeyCubeNotFound":`Binding key cube not found: {cubeName}`,"server.validation.funnel.bindingKeyDimNotFound":`Binding key dimension not found: {dimName} in cube {cubeName}`,"server.validation.funnel.bindingKeyMappingCubeNotFound":`Binding key mapping cube not found: {cubeName}`,"server.validation.funnel.invalidBindingKeyFormat":`Invalid binding key format: {bindingKey}. Expected 'CubeName.dimensionName'`,"server.validation.funnel.invalidTimeDimFormat":`Invalid time dimension format: {timeDimension}. Expected 'CubeName.dimensionName'`,"server.validation.funnel.minSteps":`Funnel must have at least 2 steps`,"server.validation.funnel.stepCubeNotFound":`Step {step} cube not found: {cube}`,"server.validation.funnel.stepFilterCubeNotFound":`Step {step} filter cube not found: {cubeName}`,"server.validation.funnel.stepFilterIsMeasure":`Step {step} filter '{member}' is a measure. Funnel step filters only support dimensions, not measures.`,"server.validation.funnel.stepFilterMemberNotFound":`Step {step} filter member not found: {field} in cube {cubeName}`,"server.validation.funnel.stepFilterNoJoinPath":`Step {step} filter '{member}' requires a join from '{stepCube}' but no join path was found. Define a join relationship between these cubes.`,"server.validation.funnel.stepMustHaveName":`Step {step} must have a name`,"server.validation.funnel.stepTimeToConvertFormat":`Step {step} timeToConvert must be ISO 8601 duration format: {value}`,"server.validation.funnel.timeDimCubeNotFound":`Time dimension cube not found: {cubeName}`,"server.validation.funnel.timeDimNotFound":`Time dimension not found: {dimName} in cube {cubeName}`,"server.validation.retention.bindingKeyCubeNotFound":`Binding key cube not found: {cubeName}`,"server.validation.retention.bindingKeyDimNotFound":`Binding key dimension not found: {dimName} in cube {cubeName}`,"server.validation.retention.bindingKeyMappingCubeNotFound":`Binding key mapping cube not found: {cubeName}`,"server.validation.retention.breakdownDimCubeNotFound":`Breakdown dimension cube not found: {cubeName}`,"server.validation.retention.breakdownDimNotFound":`Breakdown dimension not found: {dimName} in cube {cubeName}`,"server.validation.retention.cubeNotFound":`Cube not found: {cubeName}`,"server.validation.retention.dateRangeEndRequired":`Date range end is required`,"server.validation.retention.dateRangeInvalidEnd":`Invalid date range end format`,"server.validation.retention.dateRangeInvalidStart":`Invalid date range start format`,"server.validation.retention.dateRangeRequired":`Date range is required`,"server.validation.retention.dateRangeStartBeforeEnd":`Date range start must be before or equal to end`,"server.validation.retention.dateRangeStartRequired":`Date range start is required`,"server.validation.retention.engineNotSupported":`Retention queries are not supported on {engine}. Use PostgreSQL or DuckDB for retention analysis.`,"server.validation.retention.invalidBindingKeyFormat":`Invalid binding key format: {bindingKey}. Expected 'CubeName.dimensionName'`,"server.validation.retention.invalidBreakdownDimFormat":`Invalid breakdown dimension format: {dimension}. Expected 'CubeName.dimensionName'`,"server.validation.retention.invalidGranularity":`Invalid granularity: {granularity}`,"server.validation.retention.invalidRetentionType":`Invalid retention type: {retentionType}`,"server.validation.retention.invalidTimeDimFormat":`Invalid time dimension format: {timeDimension}`,"server.validation.retention.noBindingKeyMapping":`No binding key mapping found for cube: {cubeName}`,"server.validation.retention.periodsMax":`Periods cannot exceed 52 (performance limit)`,"server.validation.retention.periodsMin":`Periods must be at least 1`,"server.validation.retention.timeDimNotFound":`Time dimension not found: {dimName}`,"server.validation.calculatedMeasure.mustHaveCalculatedSql":`Calculated measure '{cubeName}.{fieldName}' must have calculatedSql property`,"server.validation.calculatedMeasure.invalidSyntax":`Invalid calculatedSql syntax in '{cubeName}.{fieldName}': {errors}`,"server.validation.calculatedMeasure.circularDependency":`Circular dependency detected in calculated measures: {cycle}`,"server.validation.query.multipleQueryModes":`Query contains multiple query modes: {modes}`,"server.validation.query.funnelBindingKeyCubeNotFound":`Funnel binding key cube not found: {cubeName}`,"server.validation.query.flowBindingKeyCubeNotFound":`Flow binding key cube not found: {cubeName}`,"server.validation.query.retentionCubeNotFound":`Retention cube not found: {cubeName}`,"server.validation.query.retentionBindingKeyCubeNotFound":`Retention binding key cube not found: {cubeName}`,"server.validation.query.retentionBreakdownCubeNotFound":`Retention breakdown cube not found: {cubeName}`,"server.validation.query.invalidMeasureFormat":`Invalid measure format: {measure}. Expected format: 'CubeName.fieldName'`,"server.validation.query.cubeNotFoundForMeasure":`Cube '{cubeName}' not found (referenced in measure '{measure}')`,"server.validation.query.measureNotFound":`Measure '{fieldName}' not found on cube '{cubeName}'{hint}`,"server.validation.query.invalidDimensionFormat":`Invalid dimension format: {dimension}. Expected format: 'CubeName.fieldName'`,"server.validation.query.cubeNotFoundForDimension":`Cube '{cubeName}' not found (referenced in dimension '{dimension}')`,"server.validation.query.dimensionNotFound":`Dimension '{fieldName}' not found on cube '{cubeName}'{hint}`,"server.validation.query.invalidTimeDimensionFormat":`Invalid timeDimension format: {dimension}. Expected format: 'CubeName.fieldName'`,"server.validation.query.cubeNotFoundForTimeDimension":`Cube '{cubeName}' not found (referenced in timeDimension '{dimension}')`,"server.validation.query.timeDimensionNotFound":`TimeDimension '{fieldName}' not found on cube '{cubeName}' (must be a dimension with time type)`,"server.validation.query.mustReferenceAtLeastOneCube":`Query must reference at least one cube through measures, dimensions, or filters`,"server.validation.query.ungroupedRequiresDimension":`Ungrouped queries require at least one dimension or time dimension`,"server.validation.query.ungroupedIncompatibleFunnel":`Ungrouped queries are incompatible with funnel analysis`,"server.validation.query.ungroupedIncompatibleFlow":`Ungrouped queries are incompatible with flow analysis`,"server.validation.query.ungroupedIncompatibleRetention":`Ungrouped queries are incompatible with retention analysis`,"server.validation.query.ungroupedIncompatibleCompareDateRange":`Ungrouped queries are incompatible with compareDateRange`,"server.validation.query.ungroupedIncompatibleFillMissingDates":`Ungrouped queries are incompatible with fillMissingDates`,"server.validation.query.filterMustHaveMember":`Filter must have a member field`,"server.validation.query.invalidFilterMemberFormat":`Invalid filter member format: {member}. Expected format: 'CubeName.fieldName'`,"server.validation.query.cubeNotFoundForFilter":`Cube '{cubeName}' not found (referenced in filter '{member}')`,"server.validation.query.filterFieldNotFound":`Filter field '{fieldName}' not found on cube '{cubeName}' (must be a dimension or measure){hint}`,"server.validation.query.unknownFilterOperator":`Unknown filter operator '{operator}' on '{member}'. Valid operators: {operators}`,"server.validation.query.invalidInDateRangeValues":`Invalid inDateRange values for '{member}': {reason}`,"server.validation.query.invalidInDateRangeDateRange":`Invalid inDateRange dateRange for '{member}': {reason}`,"server.validation.query.inDateRangeConflictingInputs":`Invalid inDateRange filter for '{member}': {reason}`,"server.validation.query.inDateRangeReason.missing":`provide a date range`,"server.validation.query.inDateRangeReason.shape":`use a flat [start, end] pair of dates, or one relative range or date`,"server.validation.query.inDateRangeReason.invalidDate":`the date is invalid`,"server.validation.query.inDateRangeReason.invalidRelative":`the relative date range '{value}' is not supported`,"server.validation.query.inDateRangeReason.reverseOrder":`the start must not be after the end`,"server.validation.query.inDateRangeReason.conflict":`provide either values or dateRange, not both`,"server.validation.ai.dryRunFailed":`Could not generate SQL: {error}`,"server.validation.query.invalidDateRangeInput":`Invalid date range: {reason}`,"server.validation.query.invalidTimeDimensionDateRange":`Invalid dateRange for time dimension '{member}': {reason}`,"server.validation.query.invalidDateRange":`Cannot parse date range {dateRange} for '{member}'. Use a relative range ({examples}), a single date ('2024-01-15'), or a ['start', 'end'] pair of dates.`,"server.validation.query.invalidDateValue":`Filter on '{member}' uses '{operator}' but {value} is not a valid date.`,"server.validation.query.orMixesMeasuresAndDimensions":`An 'or' filter group cannot mix measure filters ({measures}) with dimension filters ({dimensions}): measures are filtered after aggregation and dimensions before it. Split them into separate top-level filters.`,"server.validation.query.granularityLessTimeDimensionOnly":`A time dimension without a granularity only filters by its dateRange and is not returned as a column. Add a granularity (e.g. 'month') to '{dimension}', or add a measure or dimension to the query.`,"server.errors.crossCubeOrFilterUnsupported":`Cannot apply the 'or' filter on '{member}': cube '{cubeName}' has no direct join to '{contextCube}', so the condition cannot be evaluated where it is needed. Restructure the filter so each 'or' group only references directly joined cubes.`,"server.errors.funnel.cubeNotFoundForStep":`Cube not found for step: {cube}`,"server.errors.funnel.cubeNotFoundForBindingKey":`Cube not found for binding key: {bindingKey}`,"server.errors.funnel.cannotResolveCubeForStep":`Cannot resolve cube for step - multi-cube funnel requires cube specification in each step`,"server.errors.funnel.bindingKeyDimNotFound":`Binding key dimension not found: {bindingKey}`,"server.errors.funnel.noBindingKeyMapping":`No binding key mapping found for cube: {cubeName}`,"server.errors.funnel.bindingKeyMappingDimNotFound":`Binding key dimension not found: {dimension}`,"server.errors.funnel.timeDimNotFound":`Time dimension not found: {timeDimension}`,"server.errors.funnel.noTimeDimMapping":`No time dimension mapping found for cube: {cubeName}`,"server.errors.funnel.timeDimMappingNotFound":`Time dimension not found: {dimension}`,"server.errors.flow.cannotResolveCube":`Cannot resolve cube for flow query`,"server.errors.flow.cubeNotFound":`Cube not found: {cubeName}`,"server.errors.flow.bindingKeyDimNotFound":`Binding key dimension not found: {bindingKey}`,"server.errors.flow.noBindingKeyMapping":`No binding key mapping found for cube: {cubeName}`,"server.errors.flow.bindingKeyMappingDimNotFound":`Binding key dimension not found: {dimension}`,"server.errors.flow.timeDimNotFound":`Time dimension not found: {timeDimension}`,"server.errors.flow.noTimeDimMapping":`No time dimension mapping found for cube: {cubeName}`,"server.errors.flow.timeDimMappingNotFound":`Time dimension not found: {dimension}`,"server.errors.flow.eventDimNotFound":`Event dimension not found: {eventDimension}`,"server.validation.template.emptyReference":`Empty member reference {} found in template`,"server.validation.template.invalidMemberReference":`Invalid member reference {ref}: must start with letter or underscore, and contain only letters, numbers, underscores, and dots`,"server.validation.template.multipleDots":`Invalid member reference {ref}: only one dot allowed (Cube.measure format)`,"server.validation.template.nestedBraces":`Nested braces are not allowed in member references`,"server.validation.template.substituteTargetCubeNotFound":`Cannot substitute {ref}: cube '{cubeName}' not found`,"server.validation.template.substituteMeasureNotResolved":`Cannot substitute {ref}: measure '{measureName}' not resolved yet. Ensure measures are resolved in dependency order.`,"server.validation.template.unmatchedClosingBrace":`Unmatched closing brace at position {position}`,"server.validation.template.unmatchedOpeningBrace":`Unmatched opening brace in template`,"notebook.aiAssistant":`AI Assistant`,"notebook.saveAsDashboard":`Save as Dashboard`,"notebook.saveAsDashboardTitle":`Save notebook as a dashboard`,"notebook.clearTitle":`Clear notebook and chat`,"notebook.feedbackThanks":`Thanks for your feedback!`,"notebook.feedbackQuestion":`Was this helpful?`,"notebook.feedbackYes":`Yes`,"notebook.feedbackNo":`No`,"notebook.thinking":`Thinking...`,"notebook.emptyState.title":`Data Analysis Assistant`,"notebook.emptyState.description":`Ask me about your data and I'll create visualizations and insights.`,"notebook.emptyState.example1":`"Show me employee productivity trends"`,"notebook.emptyState.example2":`"What are the top departments by headcount?"`,"notebook.emptyState.example3":`"Compare revenue across product categories"`,"notebook.saveAsDashboardPrompt":`Save the current notebook as a dashboard with a professional layout, section headers, and appropriate filters.`,"notebook.chatInput.placeholder":`Ask about your data...`,"notebook.chatInput.stop":`Stop`,"notebook.chatInput.continue":`Continue`,"notebook.chatInput.send":`Send`,"notebook.canvas.emptyTitle":`Your notebook is empty`,"notebook.canvas.emptyDescription":`Ask the AI assistant a question about your data. Charts and insights will appear here as the assistant analyzes your data.`,"notebook.canvas.editVisualization":`Edit Visualization`,"notebook.canvas.update":`Update`,"notebook.collapsed.noBlocks":`No blocks`,"notebook.collapsed.expandNotebook":`Expand notebook`,"notebook.collapsed.expandChat":`Expand AI chat`,"notebook.collapsed.aiChat":`AI Chat`,"notebook.collapsed.markdown":`Markdown`,"schema.loading":`Loading cube schema...`,"schema.error":`Failed to load cube schema`,"schema.noCubes":`No cubes found`,"schema.noCubesHint":`Register some cubes to see the relationship diagram`,"schema.computingLayout":`Computing layout...`,"schema.searchPlaceholder":`Search cubes and fields...`,"schema.autoLayout":`Auto Layout`,"schema.missingDeps.title":`Schema Visualization requires additional packages`,"schema.missingDeps.description":`Install the required dependencies to enable the interactive schema diagram:`,"schema.loadingVisualization":`Loading schema visualization...`,"schema.measures":`Measures ({count})`,"schema.timeDimensions":`Time Dimensions ({count})`,"schema.dimensions":`Dimensions ({count})`,"schema.cubeInfo":`Cube info`,"dataBrowser.selectCube":`Select a cube`,"dataBrowser.selectCubeHint":`Choose a cube from the sidebar to browse its data`,"dataBrowser.loadingData":`Loading data...`,"dataBrowser.noData":`No data`,"dataBrowser.noRows":`No rows returned for this query`,"dataBrowser.toolbar.filters":`Filters`,"dataBrowser.toolbar.columns":`Columns`,"dataBrowser.toolbar.rows":`{count} rows`,"dataBrowser.sidebar.cubes":`Cubes`,"dataBrowser.sidebar.searchPlaceholder":`Search...`,"dataBrowser.sidebar.noCubes":`No cubes found`,"queryAnalysis.summary":`Query Summary`,"queryAnalysis.summary.type":`Type`,"queryAnalysis.summary.cubes":`Cubes`,"queryAnalysis.summary.joins":`Joins`,"queryAnalysis.summary.ctes":`CTEs`,"queryAnalysis.summary.strategy":`Strategy`,"queryAnalysis.primaryCube":`Primary Cube (FROM table)`,"queryAnalysis.primaryCube.showCandidates":`Show candidates ({count})`,"queryAnalysis.primaryCube.reachable":`reachable`,"queryAnalysis.primaryCube.cannotReachAll":`cannot reach all`,"queryAnalysis.joinPaths":`Join Paths`,"queryAnalysis.joinPaths.steps":`{count} step`,"queryAnalysis.joinPaths.stepsPlural":`{count} steps`,"queryAnalysis.joinPaths.noPath":`No path`,"queryAnalysis.joinPaths.selection":`Selection:`,"queryAnalysis.joinPaths.pathCandidates":`Path scoring candidates ({count})`,"queryAnalysis.joinPaths.visitedCubes":`Cubes visited during search ({count})`,"queryAnalysis.preAggregations":`Pre-Aggregation CTEs`,"queryAnalysis.preAggregations.measures":`Measures:`,"queryAnalysis.preAggregations.joinKeys":`Join keys:`,"queryAnalysis.warnings":`Warnings`,"queryAnalysis.cubesInvolved":`Cubes involved:`,"common.actions.copied":`Copied`,"common.actions.copyToClipboard":`Copy to clipboard`,"chart.availability.requiresMeasure":`Requires at least 1 measure`,"chart.availability.requiresTwoMeasures":`Requires at least 2 measures`,"chart.availability.requiresDimension":`Requires at least 1 dimension`,"chart.availability.requiresTwoDimensions":`Requires at least 2 dimensions`,"chart.availability.requiresTimeDimension":`Requires a time dimension`,"chart.availability.scatter":`Requires 2 measures, or 1 measure plus 1 dimension`,"chart.availability.bubble":`Requires at least 2 measures and 1 dimension`,"chart.runtime.noData":`No data available`,"chart.runtime.noDataHint.bar":`No data points to display in bar chart`,"chart.runtime.noDataHint.line":`No data points to display in line chart`,"chart.runtime.noDataHint.area":`No data points to display in area chart`,"chart.runtime.noDataHint.pie":`No data points to display in pie chart`,"chart.runtime.noDataHint.scatter":`No data points to display in scatter chart`,"chart.runtime.noDataHint.radar":`No data points to display in radar chart`,"chart.runtime.noDataHint.radialBar":`No data points to display in radial bar chart`,"chart.runtime.noDataHint.treemap":`No data points to display in treemap chart`,"chart.runtime.noDataHint.bubble":`No data points to display in bubble chart`,"chart.runtime.noDataHint.boxPlot":`No data points to display in box plot chart`,"chart.runtime.noDataHint.dotStrip":`No data points to display in dot strip plot`,"chart.runtime.noDataHint.waterfall":`No data points to display in waterfall chart`,"chart.runtime.noDataHint.candlestick":`No data points to display in candlestick chart`,"chart.runtime.noDataHint.gauge":`No data points to display in gauge chart`,"chart.runtime.noDataHint.measureProfile":`No data points to display in measure profile chart`,"chart.runtime.noDataHint.activityGrid":`No data points to display in activity grid`,"chart.runtime.noDataHint.heatmap":`Run a query to see heatmap visualization`,"chart.runtime.noDataHint.table":`No data to display in table`,"chart.runtime.noDataHint.kpi":`No data points to display`,"chart.runtime.noDataHint.funnel":`Configure a funnel with at least 2 steps and a binding key`,"chart.runtime.noDataHint.flow":`Configure a flow analysis with a starting step and event dimension`,"chart.runtime.noDataHint.retention":`Configure retention analysis to see results`,"chart.runtime.noValidData":`No valid data`,"chart.runtime.noValidDataHint.bar":`No valid data points for bar chart after transformation`,"chart.runtime.noValidDataHint.line":`No valid data points for line chart after transformation`,"chart.runtime.noValidDataHint.area":`No valid data points for area chart after transformation`,"chart.runtime.noValidDataHint.scatter":`No valid data points for scatter chart after transformation`,"chart.runtime.noValidDataHint.radar":`No valid data points for radar chart after transformation`,"chart.runtime.noValidDataHint.radialBar":`No valid data points for radial bar chart after transformation`,"chart.runtime.noValidDataHint.treemap":`No valid data points for treemap chart after transformation`,"chart.runtime.noValidDataHint.pie":`No data points to display in pie chart`,"chart.runtime.noValidDataHint.pieFiltered":`Filtered out {count} data points (zero or invalid values)`,"chart.runtime.noValidDataHint.boxPlot":`Could not compute box plot statistics from the provided data`,"chart.runtime.noValidDataHint.dotStrip":`No valid numeric values for the dot strip plot`,"chart.runtime.configErrorHint.dotStrip":`Dot strip plot needs a dimension to band by and one measure`,"chart.runtime.dotStrip.unlabelledBand":`(no value)`,"chart.runtime.dotStrip.count":`n={count}`,"chart.runtime.dotStrip.countTruncated":`n={count}+`,"chart.runtime.dotStrip.noDataRecorded":`no data recorded`,"chart.runtime.dotStrip.spread":`spread {spread}×`,"chart.runtime.dotStrip.truncated":`Showing the first {max} bands`,"chart.runtime.noValidDataHint.gauge":`Gauge value is not a valid number`,"chart.runtime.noValidDataHint.kpiText":`All values are null or invalid`,"chart.runtime.configError":`Configuration Error`,"chart.runtime.configErrorHint.axisInvalid":`Invalid or missing chart axis configuration`,"chart.runtime.configErrorHint.axisFields":`Missing required X-axis or Y-axis fields`,"chart.runtime.configErrorHint.pieAxis":`chartConfig.x/y or chartConfig.xAxis/yAxis required for pie chart`,"chart.runtime.configErrorHint.radarNumeric":`No numeric fields found for radar chart values`,"chart.runtime.configErrorHint.radialBarNumeric":`No numeric field found for radial bar chart values`,"chart.runtime.configErrorHint.treemapNumeric":`No numeric field found for treemap chart size`,"chart.runtime.configErrorHint.noMeasure":`No measure field configured`,"chart.runtime.configErrorHint.noMeasures":`No measure fields configured`,"chart.runtime.configErrorHint.bubbleRequired":`Bubble chart requires xAxis, yAxis, series, and sizeField dimensions`,"chart.runtime.configErrorHint.bubbleOptional":`Optional: colorField for bubble coloring`,"chart.runtime.configErrorHint.activityGridRequired":`Activity grid requires a time dimension and a measure`,"chart.runtime.chartError":`{chartType} Error`,"chart.runtime.unknownError":`Unknown rendering error`,"chart.runtime.checkConfig":`Check the data and configuration`,"chart.runtime.unableToRender":`Unable to render retention data`,"chart.runtime.dataFormatIncorrect":`Data format may be incorrect`,"chart.runtime.measuringDimensions":`Measuring chart dimensions...`,"chart.runtime.unableToDisplay":`Unable to display chart`,"chart.runtime.responsiveContainerError":`Failed to create responsive container`,"chart.runtime.noDataToDisplay":`No data to display`,"chart.runtime.table.invalidStructure":`Data structure is invalid`,"chart.runtime.recordsTable.noColumns":`No columns available`,"chart.runtime.recordsTable.rowRange":`{from}–{to} of {total}`,"chart.runtime.recordsTable.pageOf":`Page {page} of {pages}`,"chart.runtime.recordsTable.previousPage":`Previous page`,"chart.runtime.recordsTable.nextPage":`Next page`,"chart.runtime.heatmapNoResults":`The query returned no results for the heatmap`,"chart.runtime.heatmapConfigRequired":`Configuration required`,"chart.runtime.heatmapXRequired":`X-axis dimension required. `,"chart.runtime.heatmapYRequired":`Y-axis dimension required. `,"chart.runtime.heatmapValueRequired":`Value measure required.`,"chart.runtime.heatmapTruncated":`Data truncated to {maxRows}x{maxCols} cells (original: {originalRows}x{originalCols}). Add filters to reduce dimensions.`,"chart.runtime.activityGridGranularityTooHigh":`Granularity Too High`,"chart.runtime.activityGridGranularityHint":`Activity grids work best with hour, day, week, month, or quarter granularity`,"chart.runtime.activityGridGranularityAction":`Please choose a lower granularity for your time dimension`,"chart.runtime.activityGridConfigRequired":`Configuration Required`,"chart.runtime.retention.cohort":`Cohort`,"chart.runtime.retention.segment":`Segment`,"chart.runtime.retention.users":`Users`,"chart.runtime.retention.cohortSize":`Cohort Size: {count}`,"chart.runtime.retention.retained":`Retained: {count}`,"chart.runtime.retention.rate":`Rate: {rate}`,"chart.runtime.retention.retentionPercent":`Retention %`,"chart.runtime.retention.periodLabel":`{cohort} - Period {period}`,"chart.runtime.retention.noData":`No data`,"chart.runtime.retention.total":`Total`,"chart.runtime.retention.retention":`Retention`,"chart.runtime.funnel.noData":`No funnel data`,"chart.runtime.funnel.steps":`steps`,"chart.runtime.funnel.overall":`Overall:`,"chart.runtime.funnel.completed":`{completed} / {total} completed`,"chart.runtime.flow.noData":`No flow data`,"chart.runtime.flow.events":`events`,"chart.runtime.flow.eventsAfter":`events (after)`,"chart.runtime.flow.paths":`Paths:`,"chart.runtime.flow.startingEntities":`starting entities`,"chart.runtime.flow.entities":`entities`,"chart.runtime.kpiDelta.insufficientData":`Insufficient Data`,"chart.runtime.kpiDelta.requiresTwoPoints":`Delta calculation requires at least 2 data points`,"chart.runtime.kpiDelta.currentPoints":`Current data points: {count}`,"chart.runtime.kpiDelta.noVariance":`No variance data`,"chart.runtime.kpiNumber.noData":`No data`,"chart.runtime.markdown.noContent":`No content`,"chart.runtime.markdown.addContent":`Add markdown content in the chart configuration`,"chart.runtime.markdown.templateError":`Template error`,"chart.runtime.markdown.templateWarning":`Unresolved references`,"chart.runtime.axisFormat.label":`Label`,"chart.runtime.axisFormat.autoLabel":`Auto-generated label`,"chart.runtime.axisFormat.unit":`Unit`,"chart.runtime.axisFormat.custom":`Custom`,"chart.runtime.axisFormat.prefix":`Prefix`,"chart.runtime.axisFormat.prefixExample":`e.g., $`,"chart.runtime.axisFormat.suffix":`Suffix`,"chart.runtime.axisFormat.suffixExample":`e.g., units`,"chart.runtime.axisFormat.currencyCode":`Currency code`,"chart.runtime.axisFormat.currencyCodeHint":`Leave blank to follow the viewer's locale`,"chart.runtime.axisFormat.abbreviation":`Abbreviation`,"chart.runtime.axisFormat.yes":`Yes`,"chart.runtime.axisFormat.no":`No`,"chart.runtime.axisFormat.decimals":`Decimals`,"chart.runtime.axisFormat.preview":`Preview`,"chart.runtime.axisFormat.leftYAxis":`Left Y-Axis`,"chart.runtime.axisFormat.rightYAxis":`Right Y-Axis`,"chart.runtime.axisFormat.xAxis":`X-Axis`,"chart.runtime.missingDep.title":`Missing Dependency`,"chart.runtime.missingDep.description":`The {chartType} chart requires the {packageName} package.`,"chart.runtime.missingDep.restartHint":`After installing, restart your development server.`,"chart.runtime.unknownChartType":`Unknown chart type`,"chart.runtime.unknownChartTypeHint":`"{chartType}" is not registered`,"chart.runtime.boxPlot.truncated":`Data truncated to {max} groups (original: {total})`,"chart.runtime.candlestick.truncated":`Showing first {max} candles (total: {total})`,"chart.runtime.bar.hiddenPoints":`{count} data point(s) with no values hidden`,"chart.runtime.waterfall.increase":`Increase`,"chart.runtime.waterfall.decrease":`Decrease`,"chart.runtime.waterfall.total":`Total`,"chart.runtime.tooltip.noData":`No data`,"chart.runtime.tooltip.targetValue":`Target Value`,"results.toolbar.refreshing":`Refreshing`,"results.toolbar.refresh":`Refresh`,"results.toolbar.refreshTitle":`Refresh data (Shift+click to bypass cache)`,"results.toolbar.refreshingTitle":`Refreshing...`,"results.toolbar.cacheBustTitle":`Click to refresh and bypass cache`,"results.toolbar.clear":`Clear`,"results.toolbar.clearFunnel":`Clear funnel`,"results.toolbar.clearQuery":`Clear all query data`,"results.toolbar.aiClose":`Close AI assistant`,"results.toolbar.aiOpen":`Analyse with AI`,"results.toolbar.shareTitle":`Share this analysis`,"results.toolbar.shareCopied":`Link copied!`,"results.toolbar.schemaHide":`Hide schema diagram`,"results.toolbar.schemaShow":`Show schema diagram`,"results.toolbar.debugHide":`Hide debug info`,"results.toolbar.debugShow":`Show debug info`,"results.toolbar.chartView":`Chart view`,"results.toolbar.chartDisabled":`Add metrics to enable chart view`,"results.toolbar.tableView":`Table view`,"results.toolbar.mergedTableView":`Merged table view`,"results.view.table":`Table`,"results.warning.filterHint":`Consider adding filters to improve performance.`,"results.debug.query":`Query:`,"results.debug.queryAnalysis":`Query Analysis`,"results.debug.copyMarkdownTitle":`Copy query, analysis, and SQL as markdown`,"results.debug.copyAsMarkdown":`Copy as Markdown`,"results.debug.analysisError":`Analysis unavailable due to error`,"results.debug.analysisEmpty":`Add metrics to see analysis`,"results.debug.cubeQuery":`Cube Query`,"results.debug.cubeQueryExecuted":`Executed Query (with funnel filters)`,"results.debug.funnelFilterHint":`This query includes an IN filter with binding key values from the previous step`,"results.debug.noQuery":`No query`,"results.debug.serverResponse":`Server Response`,"results.debug.noResults":`No results yet`,"results.debug.chartConfig":`Chart Config`,"results.debug.displayConfig":`Display Config`,"results.debug.generatedSql":`Generated SQL`,"results.debug.loadingSql":`Loading SQL...`,"results.debug.executionError":`Execution Error`,"results.confirm.clearFunnel":`Clear Funnel`,"results.confirm.clearQuery":`Clear Query`,"results.confirm.clearFunnelMessage":`Are you sure you want to clear this funnel? This action cannot be undone.`,"results.confirm.clearQueryMessage":`Are you sure you want to clear this query? This action cannot be undone.`,"results.table.noData":`No data to display`,"results.table.noDataHint":`Run a query to see table data`,"results.flow.noData":`No flow data to display`,"results.flow.noDataHint":`Configure flow analysis to see results`,"results.flow.nodes":`Nodes ({count})`,"results.flow.transitions":`Transitions ({count})`,"results.flow.layer":`Layer`,"results.flow.name":`Name`,"results.flow.count":`Count`,"results.flow.from":`From`,"results.flow.to":`To`,"results.debug.funnel.label":`Funnel Query`,"results.debug.funnel.steps":`{count} steps`,"results.debug.funnel.serverQuery":`Funnel Server Query`,"results.debug.funnel.noQuery":`No funnel query configured`,"results.debug.funnel.sqlPlaceholder":`Configure funnel binding key to generate SQL`,"results.debug.funnel.stepsTitle":`Funnel Steps`,"results.debug.flow.label":`Flow Query`,"results.debug.flow.badge":`{before} before, {after} after`,"results.debug.flow.serverQuery":`Flow Server Query`,"results.debug.flow.noQuery":`No flow query configured`,"results.debug.flow.sqlPlaceholder":`Configure flow to generate SQL`,"results.debug.flow.configTitle":`Flow Configuration`,"results.debug.flow.startingStep":`Starting Step:`,"results.debug.flow.eventDimension":`Event Dimension:`,"results.debug.flow.stepsBefore":`Steps Before:`,"results.debug.flow.stepsAfter":`Steps After:`,"results.debug.flow.notSet":`Not set`,"results.debug.flow.responseTitle":`Server Response (Sankey Data)`,"results.debug.retention.label":`Retention Query`,"results.debug.retention.badge":`{segments} segment(s), {users} users`,"results.debug.retention.serverQuery":`Retention Server Query`,"results.debug.retention.configIncomplete":`Configuration Incomplete`,"results.debug.retention.configHint":`Configure the retention analysis settings to generate a query.`,"results.debug.retention.sqlPlaceholder":`Configure retention to generate SQL`,"results.debug.retention.configTitle":`Retention Configuration`,"results.debug.retention.summaryTitle":`Retention Summary`,"results.debug.retention.retentionType":`Retention Type:`,"results.debug.retention.periods":`Periods:`,"results.debug.retention.granularity":`Granularity:`,"results.debug.retention.segments":`Segments:`,"results.debug.retention.avgPeriod1":`Avg Period 1:`,"results.debug.retention.maxPeriod1":`Max Period 1:`,"results.debug.retention.minPeriod1":`Min Period 1:`,"results.debug.standard.sqlPlaceholder":`Add metrics to generate SQL`,"flow.tabs.flow":`Flow`,"flow.tabs.display":`Display`,"flow.tabs.displayUnavailable":`Display options not available`,"flow.tabs.displayTitle":`Display options`,"flow.visualization.title":`Visualization`,"flow.visualization.description":`Choose how to visualize the flow data. This affects how data is aggregated.`,"flow.visualization.sankey":`Sankey`,"flow.visualization.sankeyHint":`Paths can converge`,"flow.visualization.sunburst":`Sunburst`,"flow.visualization.sunburstHint":`Unique paths only`,"flow.startingStep.title":`Starting Step`,"flow.startingStep.description":`Define the anchor event from which paths will be explored in both directions.`,"flow.startingStep.filterLabel":`Filter Conditions`,"flow.depth.title":`Exploration Depth`,"flow.depth.descriptionSankey":`How many steps to explore before and after the starting step.`,"flow.depth.descriptionSunburst":`How many steps to explore after the starting step.`,"flow.depth.stepsBefore":`Steps Before`,"flow.depth.stepsBeforeNA":`(N/A)`,"flow.depth.stepsAfter":`Steps After`,"flow.depth.performanceWarning":`High step depth (4-5) may impact query performance on large datasets.`,"flow.joinStrategy.title":`Join Strategy`,"flow.joinStrategy.description":`Control how before/after steps are fetched. Switch to window if lateral is slower on your DB.`,"flow.joinStrategy.auto":`Auto (prefer lateral if available)`,"flow.joinStrategy.lateral":`Lateral (index seeks)`,"flow.joinStrategy.window":`Window (ROW_NUMBER)`,"retention.tabs.retention":`Retention`,"retention.tabs.display":`Display`,"retention.tabs.displayUnavailable":`Display options not available`,"retention.tabs.displayTitle":`Display options`,"retention.dateRange.title":`Date Range`,"retention.dateRange.description":`Select the date range for cohort entry. Users who first appear within this range will be analyzed.`,"retention.dateRange.label":`Date Range`,"retention.dateRange.selectRange":`Select date range`,"retention.dateRange.customRange":`Custom Range`,"retention.dateRange.applyCustom":`Apply Custom Range`,"retention.cohortFilter.title":`Cohort Filter`,"retention.cohortFilter.description":`Define who enters the cohort. Users whose first event matches these filters within the date range are included.`,"retention.returnFilter.title":`Return Filter`,"retention.returnFilter.description":`Define what counts as a return. Events matching these filters in subsequent periods count as retention.`,"retention.breakdown.title":`Breakdown`,"retention.breakdown.description":`Optionally segment retention by dimensions (e.g., country, plan type).`,"retention.settings.title":`Settings`,"retention.settings.description":`Configure how retention is calculated and displayed.`,"retention.settings.granularityLabel":`Period Granularity`,"retention.settings.periodsLabel":`Number of Periods ({min}-{max})`,"retention.settings.periodsWarning":`High period count may impact query performance.`,"retention.settings.retentionTypeLabel":`Retention Type`,"debug.explainPlan":`Explain Plan`,"debug.explainRunning":`Running...`,"debug.explainIncludeTiming":`Include timing`,"debug.explainRunningAnalyze":`Running EXPLAIN ANALYZE...`,"debug.explainRunningBasic":`Running EXPLAIN...`,"debug.explainError":`Explain Error:`,"debug.sequentialScans":`Sequential Scans Detected`,"debug.indexesUsed":`{count} Index Used`,"debug.indexesUsedPlural":`{count} Indexes Used`,"debug.executionTime":`Execution: {time}ms`,"debug.planningTime":`Planning: {time}ms`,"debug.cost":`Cost: {cost}`,"debug.indexes":`Indexes:`,"debug.executionPlanTitle":`Execution Plan ({database})`,"debug.aiAnalyzing":`Analyzing...`,"debug.aiAnalysis":`AI Analysis`,"debug.aiAnalysisError":`AI Analysis Error:`,"explainAI.title":`AI Performance Analysis`,"explainAI.assessment.good":`Good`,"explainAI.assessment.warning":`Warning`,"explainAI.assessment.critical":`Critical`,"explainAI.summary":`Summary`,"explainAI.queryAnalysis":`Query Analysis`,"explainAI.issuesFound":`Issues Found ({count})`,"explainAI.recommendations":`Recommendations ({count})`,"explainAI.noRecommendations":`No specific recommendations. The query appears to be well-optimized.`,"explainAI.expectedImpact":`Expected impact:`,"explainAI.addToCube":`Add to {cubeName} cube:`,"explainAI.modelLabel":`Model:`,"explainAI.usingUserKey":`(using your API key)`,"explainAI.copied":`Copied!`,"explainAI.copy":`Copy`,"explainAI.type.index":`INDEX`,"explainAI.type.table":`TABLE`,"explainAI.type.cube":`CUBE`,"explainAI.type.general":`TIP`,"errorBoundary.modeError":`Mode Error`,"errorBoundary.modeErrorDescription":`There was a problem with the {mode} mode. This might be due to invalid configuration data.`,"errorBoundary.showDetails":`Show error details`,"errorBoundary.unknownError":`Unknown error`,"errorBoundary.tryAgain":`Try Again`,"errorBoundary.switchToQuery":`Switch to Query Mode`,"funnel.tabs.steps":`Steps`,"funnel.tabs.display":`Display`,"funnel.tabs.displayUnavailable":`Display options not available`,"funnel.tabs.displayTitle":`Display options`,"funnel.steps.title":`Funnel Steps`,"funnel.steps.emptyMessage":`No steps defined. Add at least 2 steps to create a funnel.`,"funnel.steps.addFirst":`Add First Step`,"funnel.steps.addStep":`Add Step`,"funnel.steps.validationHint":`Add at least one more step to create a valid funnel`,"funnel.step.removeTitle":`Remove step`,"funnel.step.editNameTitle":`Click to edit name`,"funnel.step.placeholder":`Step name`,"funnel.step.timeWindow":`Time Window`,"funnel.step.timeWindowHelp":`Max time from previous step to qualify`,"funnel.step.filters":`{count} filter`,"funnel.step.filtersPlural":`{count} filters`,"funnel.step.within":`within {time}`,"funnel.step.noFilters":`No filters configured`,"funnel.config.configuration":`Configuration`,"funnel.config.cube":`Cube`,"funnel.config.cubeHelp":`Select a cube configured for funnel analysis`,"funnel.config.cubePlaceholder":`Select event stream cube`,"funnel.config.bindingKey":`Binding Key`,"funnel.config.bindingKeyHelp":`Entity that connects steps (e.g., user ID, order ID)`,"funnel.config.bindingKeyPlaceholder":`Select binding key`,"funnel.config.selectCubeFirst":`Select cube first`,"funnel.config.timeDimension":`Time Dimension`,"funnel.config.timeDimensionHelp":`Timestamp field for step ordering`,"funnel.config.timeDimensionPlaceholder":`Select time dimension`,"funnel.config.noMatchingFields":`No matching fields found`,"funnel.bindingKey.searchPlaceholder":`Search dimensions...`,"funnel.bindingKey.noMatching":`No matching dimensions found`,"funnel.bindingKey.helpText":`Select a dimension that identifies entities across funnel steps (e.g., user ID, order ID)`,"funnel.bindingKey.clearTitle":`Clear binding key`,"flow.config.configuration":`Configuration`,"flow.config.cube":`Cube`,"flow.config.cubeHelp":`Select a cube configured for flow analysis`,"flow.config.cubePlaceholder":`Select event stream cube`,"flow.config.bindingKey":`Binding Key`,"flow.config.bindingKeyHelp":`Entity that links events together (e.g., user ID)`,"flow.config.bindingKeyPlaceholder":`Select binding key`,"flow.config.selectCubeFirst":`Select cube first`,"flow.config.timeDimension":`Time Dimension`,"flow.config.timeDimensionHelp":`Timestamp field for event ordering`,"flow.config.timeDimensionPlaceholder":`Select time dimension`,"flow.config.eventDimension":`Event Dimension`,"flow.config.eventDimensionHelp":`Dimension that categorizes events (node labels in Sankey)`,"flow.config.eventDimensionPlaceholder":`Select event dimension`,"flow.config.noMatchingFields":`No matching fields found`,"retention.config.configuration":`Configuration`,"retention.config.cube":`Cube`,"retention.config.cubeHelp":`Select the cube containing your user events`,"retention.config.cubePlaceholder":`Select cube`,"retention.config.bindingKey":`Binding Key`,"retention.config.bindingKeyHelp":`Dimension that identifies entities across events (e.g., user ID, customer ID)`,"retention.config.bindingKeyPlaceholder":`Select user identifier`,"retention.config.selectCubeFirst":`Select cube first`,"retention.config.timestamp":`Timestamp`,"retention.config.timestampHelp":`Timestamp field for cohort entry and activity`,"retention.config.timestampPlaceholder":`Select timestamp`,"retention.config.noMatchingFields":`No matching fields found`,"retention.config.searchPlaceholder":`Search...`,"display.showLegend":`Show Legend`,"display.showGrid":`Show Grid`,"display.showTooltip":`Show Tooltip`,"display.stacked":`Stacked`,"display.hideHeader":`Hide Header`,"fieldSearch.aria.closeDialog":`Close dialog`,"fieldSearch.aria.filterByCube":`Filter by cube`,"fieldSearch.aria.cubeCategories":`Cube categories`,"fieldSearch.aria.availableFields":`Available fields`,"chart.dropZone.required":`This field is required`,"common.actions.apply":`Apply`,"common.actions.done":`Done`,"common.actions.update":`Update`,"common.actions.retry":`Retry`,"common.actions.exit":`Exit`,"common.actions.selectAll":`Select All`,"common.saving":`Saving...`,"common.labels.title":`Title`,"dashboardFilter.editFilter":`Edit Filter`,"dashboardFilter.filterLabel":`Filter Label`,"dashboardFilter.enterFilterLabel":`Enter filter label`,"dashboardFilter.universalTimeFilter":`Universal Time Filter`,"dashboardFilter.universalTimeDescription":`This filter applies to all time dimensions in mapped portlets. Users can select the date range when viewing the dashboard.`,"dashboardFilter.field":`Field`,"dashboardFilter.showDashboardFields":`Show dashboard fields only`,"dashboardFilter.showAllFields":`Show all fields`,"dashboardFilter.dashboard":`Dashboard`,"dashboardFilter.all":`All`,"dashboardFilter.clickToSelectField":`Click to select a field`,"dashboardFilter.operator":`Operator`,"dashboardFilter.defaultValue":`Default Value`,"dashboardFilter.deleteFilter":`Delete Filter`,"dashboardFilter.noValueRequired":`No value required`,"dashboardFilter.to":`to`,"dashboardFilter.selectValue":`Select value...`,"dashboardFilter.search":`Search...`,"dashboardFilter.errorPrefix":`Error: `,"dashboardFilter.noValuesFound":`No values found`,"dashboardFilter.enterValue":`Enter value...`,"dashboardFilter.enterNumber":`Enter number`,"dashboardFilter.min":`Min`,"dashboardFilter.max":`Max`,"dashboardFilter.filterLabelRequired":`Filter label is required`,"dashboardFilter.selectFieldRequired":`Please select a field for the filter`,"dashboardFilter.notSet":`(not set)`,"dashboardFilter.clickToConfigure":`Click to configure`,"dashboardFilter.customDate.startDate":`Start Date`,"dashboardFilter.customDate.endDate":`End Date`,"dashboardFilter.customDate.sinceDate":`Since Date`,"dashboardFilter.customDate.fromSelectedToToday":`From selected date to today`,"dashboardFilter.customDate.number":`Number`,"dashboardFilter.customDate.unit":`Unit`,"dashboardFilter.customDate.lastNPreview":`Last {number} {unit}`,"dashboardFilter.editMode.filters":`Filters`,"dashboardFilter.editMode.noFilters":`No filters configured. Click "Add" to create one.`,"dashboardFilter.editMode.dateRange":`Date Range`,"dashboardFilter.editMode.filter":`Filter`,"dashboardFilter.editMode.editFilter":`Edit filter`,"dashboardFilter.editMode.removeFilter":`Remove filter`,"dashboardFilter.filterValue.editValue":`Edit value`,"dashboardFilter.readOnly.filters":`Filters`,"filter.shared.fieldsInQuery":`Fields in Query ({count})`,"filter.shared.allAvailableFields":`All Available Fields ({count})`,"filter.shared.noFieldsMatch":`No fields found matching "{searchTerm}"`,"filter.shared.searchFields":`Search fields...`,"filter.shared.selectField":`Select field...`,"filter.shared.schemaNotLoaded":`Schema not loaded`,"filter.shared.group.addFilter":`Add Filter`,"filter.shared.group.addAndGroup":`Add AND Group`,"filter.shared.group.addOrGroup":`Add OR Group`,"filter.shared.group.addCondition":`Add condition`,"filter.shared.group.noConditions":`No conditions in this group.`,"filter.shared.group.addFilterLink":`Add a filter`,"filter.shared.builder.filters":`Filters ({count})`,"filter.shared.builder.clearAll":`Clear all`,"filter.shared.builder.addFilter":`Add Filter`,"filter.shared.dateRange.title":`Date Ranges ({count})`,"filter.shared.dateRange.clearAll":`Clear all`,"filter.shared.dateRange.addDateRange":`Add Date Range`,"filter.shared.dateRange.allHaveDateRanges":`All time dimensions already have date ranges`,"filter.shared.valueSelector.noValueRequired":`No value required`,"filter.shared.valueSelector.to":`to`,"filter.shared.valueSelector.min":`Min`,"filter.shared.valueSelector.max":`Max`,"filter.shared.valueSelector.enterNumber":`Enter number`,"filter.shared.valueSelector.loadingValues":`Loading values...`,"filter.shared.valueSelector.selectValue":`Select value...`,"filter.shared.valueSelector.searchValues":`Search values...`,"filter.shared.valueSelector.searching":`Searching...`,"filter.shared.valueSelector.errorLoading":`Error loading values: {error}`,"filter.shared.valueSelector.noMatchingValues":`No matching values`,"filter.shared.valueSelector.noValuesAvailable":`No values available`,"filter.shared.valueSelector.enterValue":`Enter {type} value`,"dashboard.noPortlets":`No Portlets`,"dashboard.noPortletsDescription":`Add your first portlet to start visualizing your data`,"dashboard.addText":`Add Text`,"dashboard.addPortlet":`Add Portlet`,"dashboard.finishEditing":`Finish Editing`,"dashboard.edit":`Edit`,"dashboard.grid":`Grid`,"dashboard.rows":`Rows`,"dashboard.desktopRequired":`Desktop view required for editing`,"dashboard.editModeHint":`Drag • Resize • Auto-save`,"dashboard.filterSelectionMode":`Filter Selection Mode - Click portlets to toggle '{filterLabel}'`,"dashboard.filterSelectionEscHint":`• Press Enter or Esc to save`,"dashboard.filterFieldChipHint":`Click to change which field this filter applies to for this portlet`,"dashboard.editPortlet":`Edit Portlet`,"dashboard.addNewPortlet":`Add New Portlet`,"dashboard.updatePortlet":`Update Portlet`,"dashboard.deletePortlet":`Delete Portlet`,"dashboard.deletePortletConfirm":`Are you sure you want to delete`,"dashboard.deletePortletSuffix":`? This action cannot be undone.`,"dashboard.thisPortlet":`this portlet`,"dashboard.portlet.action.edit":`Edit portlet`,"dashboard.portlet.action.duplicate":`Duplicate portlet`,"dashboard.portlet.action.delete":`Delete portlet`,"dashboard.portlet.action.refresh":`Refresh portlet`,"dashboard.portlet.action.drag":`Drag portlet`,"dashboard.portlet.action.filterConfig":`Configure dashboard filters`,"dashboard.portlet.action.filterConfigActive":`Configure dashboard filters ({count} active)`,"dashboard.group.rename":`Rename group`,"dashboard.group.drag":`Drag group`,"dashboard.group.titlePlaceholder":`Group title`,"dashboard.group.ungroup":`Ungroup`,"dashboard.group.delete":`Delete group`,"dashboard.group.deleteTitle":`Delete Group`,"dashboard.group.deleteConfirm":`Are you sure you want to delete this group and all {count} portlets inside it? This action cannot be undone.`,"dashboard.editModal.dashboardName":`Dashboard Name`,"dashboard.editModal.enterDashboardName":`Enter dashboard name...`,"dashboard.editModal.descriptionOptional":`Description (optional)`,"dashboard.editModal.enterDescription":`Enter description...`,"portlet.configRequired":`Configuration Required`,"portlet.copyToClipboard":`Copy chart to clipboard`,"portlet.copied":`Copied!`,"portlet.downloadXlsx":`Download data as XLSX`,"portlet.exporting":`Exporting...`,"portlet.configRequiredHint":`Please configure this chart`,"portlet.queryError":`Query Error`,"portlet.queryWithFilters":`Query (with filters applied)`,"portlet.chartConfig":`Chart Config`,"portlet.noDataAvailable":`No data available`,"portlet.noDataDrilled":`No data points to display for the current filter`,"portlet.invalidQuery":`Invalid query or no results`,"portlet.unsupportedChartType":`Unsupported chart type`,"portlet.unableToRender":`Unable to render chart`,"portlet.droppedMembers":`Hidden — no longer in the model: {members}`,"portlet.enterTitle":`Enter portlet title...`,"portlet.enterPortletTitle":`Please enter a title for the portlet.`,"portlet.configureQuery":`Please configure a query before saving.`,"portlet.configureFlow":`Please configure the flow analysis (binding key, time dimension, event dimension, and starting step filter).`,"portlet.configureRetention":`Please configure the retention analysis (binding key, time dimension, and date range).`,"portlet.configureFunnel":`Please add at least two funnel steps.`,"portlet.addMetricOrBreakdown":`Please add at least one metric or breakdown to your query.`,"portlet.filterConfig.title":`Configure Dashboard Filters`,"portlet.filterConfig.subtitle":`Choose which dashboard filters apply to "{portletTitle}"`,"portlet.filterConfig.noFilters":`No dashboard filters available`,"portlet.filterConfig.noFiltersHint":`Add filters at the dashboard level first`,"portlet.filterConfig.availableFilters":`Available Filters`,"portlet.filterConfig.selectedCount":`{selected} of {total} selected`,"portlet.filterConfig.applied":`Applied`,"portlet.filterConfig.noValue":`no value`,"portlet.filterConfig.complexFilter":`Complex filter`,"portlet.filterConfig.groupFilter":`{type} group with {count} filter`,"portlet.filterConfig.groupFilterPlural":`{type} group with {count} filters`,"portlet.filterConfig.applyFilters":`Apply Filters`,"portlet.filterConfig.applyToField":`Apply to field`,"portlet.filterConfig.applyToFieldDefault":`Default ({field})`,"portlet.filterConfig.mappedTo":`Mapped to {field}`,"portlet.filterConfig.mappedFieldMissing":`The mapped field "{field}" is no longer available in the schema`,"portlet.filterConfig.applyToTimeDimensionsDefault":`Default (the portlet's time dimensions)`,"portlet.dateFilterNotApplied":`The dashboard date filter "{label}" does not narrow this portlet because it has no time dimension. Map the filter to a date field in the portlet's filter settings.`,"textPortlet.editText":`Edit Text`,"textPortlet.addText":`Add Text`,"textPortlet.markdownContent":`Markdown Content`,"textPortlet.markdownHint":`Supports headers (#), bold (**text**), italic (*text*), links ([text](url)), lists (- item), and horizontal rules (---).`,"textPortlet.preview":`Preview`,"debug.title":`Chart Debug Information`,"debug.chartType":`Chart Type`,"debug.fieldAnalysis":`Field Analysis`,"debug.chartConfig":`Chart Config`,"debug.displayConfig":`Display Config`,"debug.queryObject":`Query Object`,"debug.dataSample":`Data Sample (first 3 rows)`,"debug.cacheStatus":`Cache Status`,"debug.cacheHit":`Cache Hit`,"debug.cachedAt":`Cached At:`,"debug.ttl":`TTL:`,"debug.ttlRemaining":`TTL Remaining:`,"debug.freshQuery":`Fresh Query`,"debug.notFromCache":`Result not served from cache`,"debug.escToClose":`Press`,"debug.escKey":`ESC`,"debug.toClose":`to close`,"debug.tooltip":`Debug chart configuration`,"error.unableToRender":`Unable to render chart`,"error.unableToRenderNamed":`Unable to render {title}`,"error.renderDescription":`There was an error rendering this chart component. The error details are shown below.`,"error.errorLabel":`Error:`,"error.typeLabel":`Type:`,"error.portletConfig":`Portlet Configuration`,"error.cubeQuery":`Cube Query`,"error.componentStack":`Component Stack`,"error.tryAgain":`Try Again`,"drill.back":`Back`,"drill.goBackOneLevel":`Go back one level`,"drill.returnToTop":`Return to top level`,"drill.navigateTo":`Navigate to {label}`,"drill.empty":`(empty)`,"analyticsPage.title":`Analytics Page - Coming in Phase 4`,"dataHistogram.average":`Average of {count} values`,"dataHistogram.valuesInRange":`{count} values in this range`,"mcp.status.connecting":`Connecting...`,"mcp.status.loading":`Loading...`,"mcp.status.waiting":`Waiting for query results...`,"mcp.error.connectionLabel":`Connection error:`,"mcp.error.errorLabel":`Error:`,"mcp.error.noTextContent":`No text content in result`,"mcp.error.invalidResultFormat":`Invalid result format: missing data array`,"mcp.error.parseFailed":`Failed to parse result: {message}`,"mcp.error.queryFailed":`Query failed: {message}`,"mcp.footer.rows":`{count} row`,"mcp.footer.rowsPlural":`{count} rows`,"mcp.footer.measures":`{count} measure`,"mcp.footer.measuresPlural":`{count} measures`,"mcp.footer.dimensions":`{count} dimension`,"mcp.footer.dimensionsPlural":`{count} dimensions`,"chart.option.kpiLayout.label":`Layout`,"chart.option.kpiLayout.description":`Compact uses a fixed type size so several KPIs line up as a metric strip; auto scales the value to fill the portlet`,"chart.option.kpiLayout.auto":`Auto`,"chart.option.kpiLayout.compact":`Compact`,"chart.option.showBaseline.label":`Show baseline`,"chart.option.showBaseline.description":`Show the previous and current values as a before and after pair`,"chart.runtime.kpiVsTarget":`vs {target}`,"chart.runtime.kpiExcludesLastPeriod":`Excludes last {period}`,"chart.runtime.kpiExcludesIncompletePeriod":`Excludes current incomplete {period}`,"chart.runtime.kpiPeriodFallback":`period`,"chart.runtime.noDataShort":`No data`,"chart.option.showSummary.label":`Summary header`,"chart.option.showSummary.description":`Show each series' latest value above the chart, with its change since the start of the window on time-based charts`,"chart.runtime.summarySincePeriodStart":`since start of period`,"chart.proportionBar.label":`Proportion Bar`,"chart.proportionBar.description":`Show a part-to-whole breakdown as a single stacked horizontal bar`,"chart.proportionBar.useCase":`Perfect for work mix, budget splits or any share breakdown where comparing proportions matters more than exact values — flatter and easier to read than a pie chart`,"chart.proportionBar.dropZone.xAxis.empty":`Drop a dimension here`,"chart.proportionBar.dropZone.yAxis.empty":`Drop a measure here`,"chart.proportionBar.validation.dimensionRequired":`A dimension is required for proportion bar charts`,"chart.proportionBar.validation.measureRequired":`A measure is required for proportion bar charts`,"chart.configText.category":`Category`,"chart.configText.dimension_to_split_the_bar_into_segments":`Dimension to split the bar into segments`,"chart.configText.measure_that_determines_each_segments_share":`Measure that determines each segment's share`,"chart.option.showPercentages.label":`Show percentages`,"chart.option.showPercentages.description":`Show each segment's share as a percentage beneath the bar`,"chart.option.sortSegments.label":`Sort segments`,"chart.option.sortSegments.description":`Order segments largest first rather than keeping the query order`,"chart.option.proportionBarLabels.description":`Show the category name above each segment's share`,"chart.option.proportionBarDecimals.description":`Number of decimal places shown on each percentage`,"chart.runtime.noDataHint.proportionBar":`No data points to break down`,"chart.runtime.configErrorHint.proportionBar":`Add one dimension and one measure to show a breakdown`,"chart.runtime.noValidDataHint.proportionBar":`All values are zero, negative or invalid`,"chart.option.proportionBarLabels.label":`Show labels`,"chart.runtime.summarySince":`since {period}`,"chart.option.showPoints.label":`Show data points`,"chart.option.showPoints.description":`Draw a marker at every data point. Turn off for dense series, where the markers obscure the line`,"chart.gauge.thresholds.from":`Band starts at`,"chart.gauge.thresholds.colour":`Band colour`,"chart.gauge.thresholds.add":`Add band`,"chart.gauge.thresholds.remove":`Remove band`,"dashboard.export.button":`Export`,"dashboard.export.tooltip":`Download this dashboard as a JSON file`,"dashboard.import.button":`Import`,"dashboard.import.tooltip":`Replace this dashboard with a JSON export`,"dashboard.import.confirmTitle":`Import dashboard`,"dashboard.import.confirmMessage":`Replace everything on this dashboard with the {count} portlets in "{fileName}"? This cannot be undone.`,"dashboard.import.confirmRename":`The dashboard will also be renamed to "{name}".`,"dashboard.import.confirmAction":`Replace dashboard`,"dashboard.import.warningsTitle":`Warnings`,"dashboard.import.warning.unknownFilterMapping":`Portlet "{portlet}" is linked to a dashboard filter that is not in the file ({filterId}).`,"dashboard.import.errorTitle":`Could not import dashboard`,"dashboard.import.errorIntro":`"{fileName}" could not be imported:`,"dashboard.import.error.invalidJson":`The file is not valid JSON.`,"dashboard.import.error.unknownFormat":`The file is not a drizzle-cube dashboard export.`,"dashboard.import.error.invalidConfig":`The dashboard configuration is invalid ({path}).`,"dashboard.import.error.invalidPortlet":`Portlet {index} is invalid ({path}).`},at=it;function ot(e){return Object.prototype.hasOwnProperty.call(it,e)}function E(e,t){let n=at[e];return n?t?n.replace(/\{(\w+)\}/g,(e,n)=>{let r=t[n];return r===void 0?`{${n}}`:String(r)}):n:e}var st=e=>{let t=new Date(e);return t.setUTCHours(0,0,0,0),t},D=e=>{let t=new Date(e);return t.setUTCHours(23,59,59,999),t},ct={today:({now:e})=>({start:st(e),end:D(e)}),yesterday:({now:e,utcDate:t})=>{let n=new Date(e);n.setUTCDate(t-1),n.setUTCHours(0,0,0,0);let r=new Date(e);return r.setUTCDate(t-1),r.setUTCHours(23,59,59,999),{start:n,end:r}},"this week":({now:e,utcDate:t,utcDay:n})=>{let r=n===0?-6:1-n,i=new Date(e);i.setUTCDate(t+r),i.setUTCHours(0,0,0,0);let a=new Date(i);return a.setUTCDate(i.getUTCDate()+6),a.setUTCHours(23,59,59,999),{start:i,end:a}},"this month":({utcYear:e,utcMonth:t})=>({start:new Date(Date.UTC(e,t,1,0,0,0,0)),end:new Date(Date.UTC(e,t+1,0,23,59,59,999))}),"this quarter":({utcYear:e,utcMonth:t})=>{let n=Math.floor(t/3);return{start:new Date(Date.UTC(e,n*3,1,0,0,0,0)),end:new Date(Date.UTC(e,n*3+3,0,23,59,59,999))}},"this year":({utcYear:e})=>({start:new Date(Date.UTC(e,0,1,0,0,0,0)),end:new Date(Date.UTC(e,11,31,23,59,59,999))}),"last week":({now:e,utcDate:t,utcDay:n})=>{let r=n===0?-13:-6-n,i=new Date(e);i.setUTCDate(t+r),i.setUTCHours(0,0,0,0);let a=new Date(i);return a.setUTCDate(i.getUTCDate()+6),a.setUTCHours(23,59,59,999),{start:i,end:a}},"last month":({utcYear:e,utcMonth:t})=>({start:new Date(Date.UTC(e,t-1,1,0,0,0,0)),end:new Date(Date.UTC(e,t,0,23,59,59,999))}),"last quarter":({utcYear:e,utcMonth:t})=>{let n=Math.floor(t/3),r=n===0?3:n-1,i=n===0?e-1:e;return{start:new Date(Date.UTC(i,r*3,1,0,0,0,0)),end:new Date(Date.UTC(i,r*3+3,0,23,59,59,999))}},"last year":({utcYear:e})=>({start:new Date(Date.UTC(e-1,0,1,0,0,0,0)),end:new Date(Date.UTC(e-1,11,31,23,59,59,999))}),"last 12 months":({now:e,utcYear:t,utcMonth:n})=>({start:new Date(Date.UTC(t,n-11,1,0,0,0,0)),end:D(e)})},lt=[{re:/^last\s+(\d+)\s+days?$/,build:(e,{now:t,utcDate:n})=>{let r=new Date(t);return r.setUTCDate(n-e+1),r.setUTCHours(0,0,0,0),{start:r,end:D(t)}}},{re:/^last\s+(\d+)\s+weeks?$/,build:(e,{now:t,utcDate:n})=>{let r=new Date(t);return r.setUTCDate(n-e*7+1),r.setUTCHours(0,0,0,0),{start:r,end:D(t)}}},{re:/^last\s+(\d+)\s+months?$/,build:(e,{now:t,utcYear:n,utcMonth:r})=>({start:new Date(Date.UTC(n,r-e+1,1,0,0,0,0)),end:D(t)})},{re:/^last\s+(\d+)\s+quarters?$/,build:(e,{now:t,utcYear:n,utcMonth:r})=>({start:new Date(Date.UTC(n,(Math.floor(r/3)-e+1)*3,1,0,0,0,0)),end:D(t)})},{re:/^last\s+(\d+)\s+years?$/,build:(e,{now:t,utcYear:n})=>({start:new Date(Date.UTC(n-e,0,1,0,0,0,0)),end:D(t)})}],ut=({now:e,utcDate:t,utcDay:n})=>{let r=new Date(e);return r.setUTCDate(t+(n===0?-6:1-n)),r.setUTCHours(0,0,0,0),r},dt={tomorrow:({now:e,utcDate:t})=>{let n=new Date(e);n.setUTCDate(t+1),n.setUTCHours(0,0,0,0);let r=new Date(n);return r.setUTCHours(23,59,59,999),{start:n,end:r}},"next week":e=>{let t=ut(e);t.setUTCDate(t.getUTCDate()+7);let n=new Date(t);return n.setUTCDate(t.getUTCDate()+6),n.setUTCHours(23,59,59,999),{start:t,end:n}},"next month":({utcYear:e,utcMonth:t})=>({start:new Date(Date.UTC(e,t+1,1,0,0,0,0)),end:new Date(Date.UTC(e,t+2,0,23,59,59,999))}),"next quarter":({utcYear:e,utcMonth:t})=>{let n=(Math.floor(t/3)+1)*3;return{start:new Date(Date.UTC(e,n,1,0,0,0,0)),end:new Date(Date.UTC(e,n+3,0,23,59,59,999))}},"next year":({utcYear:e})=>({start:new Date(Date.UTC(e+1,0,1,0,0,0,0)),end:new Date(Date.UTC(e+1,11,31,23,59,59,999))})};function ft(e){let t=new Date,n=e.toLowerCase().trim(),r={now:t,utcYear:t.getUTCFullYear(),utcMonth:t.getUTCMonth(),utcDate:t.getUTCDate(),utcDay:t.getUTCDay()},i=Object.prototype.hasOwnProperty.call(ct,n)?ct[n]:Object.prototype.hasOwnProperty.call(dt,n)?dt[n]:void 0;if(i)return i(r);for(let{re:e,build:t}of lt){let i=n.match(e);if(i)return t(parseInt(i[1],10),r)}return null}function pt(e,t){return e.isTimestampInteger()?e.getEngineType()===`sqlite`?Math.floor(t/1e3):t:new Date(t).toISOString()}function mt(e,t){return pt(e,t.getTime())}function ht(e,t){return typeof t==`number`?new Date(t*(e.getEngineType()===`sqlite`?1e3:1)):new Date(t)}function gt(e){return typeof e==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(e.trim())}function _t(e){if(e instanceof Date)return Number.isFinite(e.getTime())?e:null;if(typeof e==`number`){if(!Number.isFinite(e))return null;let t=e<1e10?e*1e3:e,n=new Date(t);return isNaN(n.getTime())?null:n}if(typeof e==`string`){if(!e.trim()||e.includes(`\0`))return null;let t=gt(e)?new Date(e+`T00:00:00Z`):new Date(e);return!Number.isFinite(t.getTime())||gt(e)&&t.toISOString().slice(0,10)!==e.trim()?null:t}return null}function vt(e,t){if(t==null||t===``)return null;let n=_t(t);return n?mt(e,n):null}function yt(e){return ft(e)}function bt(e){return!!e&&_t(e)!==null}function xt(e){return typeof e==`string`?ft(e)!==null||bt(e):Array.isArray(e)?e.length===1?xt(e[0]):e.length>=2&&bt(e[0])&&bt(e[1]):!1}function St(e){return typeof e==`string`&&e.trim().length>0&&!e.includes(`\0`)||typeof e==`number`&&Number.isFinite(e)}function Ct(e){if(!Array.isArray(e)||e.length!==2||!e.every(St))return`shape`;let t=_t(e[0]),n=_t(e[1]);return!t||!n||!e.every(wt)?`invalidDate`:(gt(e[1])&&n.setUTCHours(23,59,59,999),t.getTime()>n.getTime()?`reverseOrder`:null)}function wt(e){if(typeof e!=`string`)return!0;let t=/^(\d{4})-(\d{2})-(\d{2})(?:T|$)/.exec(e.trim());if(!t)return!0;let[,n,r,i]=t,a=new Date(`${n}-${r}-${i}T00:00:00Z`);return Number.isFinite(a.getTime())&&a.toISOString().slice(0,10)===`${n}-${r}-${i}`}function Tt(e,t){return Array.isArray(e)&&e.length===1&&!Array.isArray(e[0])?Tt(e[0],t):Array.isArray(e)?Ct(e):t&&typeof e==`string`&&_t(e)&&wt(e)?null:typeof e!=`string`||!e.trim()||e.includes(`\0`)?`shape`:yt(e)?null:`invalidRelative`}function Et(e){return e.length===1?e[0]:e}function Dt(e){let t=Tt(e,!0);return t?{valid:!1,reason:t,input:`dateRange`,value:typeof e==`string`?e:void 0}:{valid:!0}}function Ot(e,t){let n=t??void 0,r=Array.isArray(e)&&e.length>0;if(n!==void 0)return r&&JSON.stringify(Et(e))!==JSON.stringify(n)?{valid:!1,reason:`conflict`,input:`values`}:Dt(n);if(!Array.isArray(e)||e.length===0)return{valid:!1,reason:e===void 0||Array.isArray(e)&&e.length===0?`missing`:`shape`,input:`values`};let i=e.length===1&&Array.isArray(e[0])?`shape`:e.length===1?Tt(e[0],!0):Ct(e);return i?{valid:!1,reason:i,input:`values`,value:typeof e[0]==`string`?e[0]:void 0}:{valid:!0}}function O(e){if(e.valid)throw Error(`Expected invalid date range`);return E(`server.validation.query.invalidDateRangeInput`,{reason:At(e)})}function kt(e,t){if(t.valid)throw Error(`Expected invalid date range`);return E(`server.validation.query.invalidTimeDimensionDateRange`,{member:e,reason:At(t)})}function At(e){return E(`server.validation.query.inDateRangeReason.${e.reason}`,{value:e.value??``})}function jt(e,t){if(t.valid)throw Error(`Expected invalid date range`);let n=At(t);return t.reason===`conflict`?E(`server.validation.query.inDateRangeConflictingInputs`,{member:e,reason:n}):E(t.input===`values`?`server.validation.query.invalidInDateRangeValues`:`server.validation.query.invalidInDateRangeDateRange`,{member:e,reason:n})}var Mt=class{databaseAdapter;constructor(e){this.databaseAdapter=e}buildTimeDimensionExpression(e,t,r){let i=w(e,r);return t?this.databaseAdapter.buildTimeDimension(t,i):i instanceof n.SQL?i:n.sql`${i}`}buildDateRangeCondition(e,t){if(t==null)return null;if(Array.isArray(t))return t.length===1&&typeof t[0]==`string`?this.buildStringDateRangeCondition(e,t[0]):this.buildArrayDateRangeCondition(e,t);if(typeof t==`string`)return this.buildStringDateRangeCondition(e,t);throw Error(O({valid:!1,reason:`shape`,input:`dateRange`}))}rangeBetween(e,t,r){return(0,n.and)((0,n.gte)(e,t),(0,n.lte)(e,r))}endOfDayValue(e){let t=ht(this.databaseAdapter,e);return t.setUTCHours(23,59,59,999),mt(this.databaseAdapter,t)}buildArrayDateRangeCondition(e,t){let n=Ct(t);if(n)throw Error(O({valid:!1,reason:n,input:`dateRange`}));let r=this.normalizeDate(t[0]),i=this.normalizeDate(t[1]);if(r===null||i===null)throw Error(O({valid:!1,reason:`invalidDate`,input:`dateRange`}));return gt(t[1])&&(i=this.endOfDayValue(i)),this.rangeBetween(e,r,i)}buildStringDateRangeCondition(e,t){let n=this.parseRelativeDateRange(t);if(n){let t=mt(this.databaseAdapter,n.start),r=mt(this.databaseAdapter,n.end);return this.rangeBetween(e,t,r)}let r=this.normalizeDate(t);if(r===null)throw Error(O({valid:!1,reason:`invalidRelative`,input:`dateRange`}));let i=ht(this.databaseAdapter,r),a=new Date(i);a.setUTCHours(0,0,0,0);let o=new Date(i);return o.setUTCHours(23,59,59,999),this.rangeBetween(e,mt(this.databaseAdapter,a),mt(this.databaseAdapter,o))}parseRelativeDateRange(e){return yt(e)}normalizeDate(e){return vt(this.databaseAdapter,e)}},Nt=e=>{let{fieldExpr:t,filteredValues:r,value:i,field:a,databaseAdapter:o,dateTimeBuilder:s}=e;if(r.length>1){if(a?.type===`time`){let e=r.map(e=>s.normalizeDate(e)||e);return(0,n.inArray)(t,e)}return(0,n.inArray)(t,r)}if(r.length===1){let e=a?.type===`time`&&s.normalizeDate(i)||i;return(0,n.eq)(t,e)}return o.buildBooleanLiteral(!1)},Pt=e=>{let{fieldExpr:t,filteredValues:r,value:i}=e;return r.length>1?(0,n.notInArray)(t,r):r.length===1?(0,n.ne)(t,i):null},k=e=>({fieldExpr:t,value:n,databaseAdapter:r})=>r.buildStringCondition(t,e,n),Ft=({fieldExpr:e,value:t})=>(0,n.gt)(e,t),It=({fieldExpr:e,value:t})=>(0,n.gte)(e,t),Lt=({fieldExpr:e,value:t})=>(0,n.lt)(e,t),Rt=({fieldExpr:e,value:t})=>(0,n.lte)(e,t),zt=({fieldExpr:e})=>(0,n.isNotNull)(e),Bt=({fieldExpr:e})=>(0,n.isNull)(e),Vt=e=>{let{fieldExpr:t,values:r,filteredValues:i,databaseAdapter:a,dateTimeBuilder:o}=e,s=Ot(r);if(!s.valid)throw Error(O(s));if(r.length===1)return o.buildDateRangeCondition(t,r[0]);let c=o.normalizeDate(i[0]),l=o.normalizeDate(i[1]);if(c===null||l===null)throw Error(O({valid:!1,reason:`invalidDate`,input:`values`}));let u=r[1];if(typeof u==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(u.trim())){let e=typeof l==`number`?new Date(l*(a.getEngineType()===`sqlite`?1e3:1)):new Date(l),t=new Date(e);t.setUTCHours(23,59,59,999),l=a.isTimestampInteger()?a.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}return(0,n.and)((0,n.gte)(t,c),(0,n.lte)(t,l))},Ht=({fieldExpr:e,value:t,dateTimeBuilder:r})=>{let i=r.normalizeDate(t);return i?(0,n.lt)(e,i):null},Ut=({fieldExpr:e,value:t,dateTimeBuilder:r})=>{let i=r.normalizeDate(t);return i?(0,n.gt)(e,i):null},Wt=({fieldExpr:e,filteredValues:t})=>t.length>=2?(0,n.and)((0,n.gte)(e,t[0]),(0,n.lte)(e,t[1])):null,Gt=({fieldExpr:e,filteredValues:t})=>t.length>=2?(0,n.or)((0,n.lt)(e,t[0]),(0,n.gt)(e,t[1])):null,Kt=({fieldExpr:e,filteredValues:t})=>t.length>0?(0,n.inArray)(e,t):null,qt=({fieldExpr:e,filteredValues:t})=>t.length>0?(0,n.notInArray)(e,t):null,Jt=({fieldExpr:e})=>(0,n.or)((0,n.isNull)(e),(0,n.eq)(e,``)),Yt=({fieldExpr:e})=>(0,n.and)((0,n.isNotNull)(e),(0,n.ne)(e,``)),Xt=e=>({fieldExpr:t,filteredValues:n,databaseAdapter:r})=>r.getEngineType()===`postgres`?e(t,n):null,Zt={equals:Nt,notEquals:Pt,contains:k(`contains`),notContains:k(`notContains`),startsWith:k(`startsWith`),notStartsWith:k(`notStartsWith`),endsWith:k(`endsWith`),notEndsWith:k(`notEndsWith`),gt:Ft,gte:It,lt:Lt,lte:Rt,set:zt,notSet:Bt,inDateRange:Vt,beforeDate:Ht,afterDate:Ut,between:Wt,notBetween:Gt,in:Kt,notIn:qt,like:k(`like`),notLike:k(`notLike`),ilike:k(`ilike`),regex:k(`regex`),notRegex:k(`notRegex`),isEmpty:Jt,isNotEmpty:Yt,arrayContains:Xt(n.arrayContains),arrayOverlaps:Xt(n.arrayOverlaps),arrayContained:Xt(n.arrayContained)},Qt=Object.keys(Zt);function $t(e){return typeof e==`string`&&Object.prototype.hasOwnProperty.call(Zt,e)}var en=new Set([`set`,`notSet`,`isEmpty`,`isNotEmpty`]);function tn(e,t){return $t(e)?Zt[e](t):null}function A(e){if(e.length!==0)return e.length===1?e[0]:(0,n.and)(...e)}function nn(e){if(`type`in e&&`filters`in e){let t=e;if(t.type===`and`||t.type===`or`)return{isAnd:t.type===`and`,filters:t.filters??[]}}return null}function rn(e){let t=e.split(`.`);return t.length>1?t[1]:t[0]}function an(e){return{noMapping:({cubeName:t})=>E(`${e}.noBindingKeyMapping`,{cubeName:t}),keyDimNotFound:({bindingKey:t})=>E(`${e}.bindingKeyDimNotFound`,{bindingKey:t}),mappingDimNotFound:({dimension:t})=>E(`${e}.bindingKeyMappingDimNotFound`,{dimension:t})}}function on(e,t,n,r){if(!n)return e;let i=n.get(t);if(!i)throw Error(r.cubeNotFound({cubeName:t}));return i}function sn(e,t,n,r,i){if(typeof e==`string`){let[a]=e.split(`.`),o=rn(e),s=on(t,a,i,r).dimensions?.[o];if(!s)throw Error(r.keyDimNotFound({bindingKey:e,cubeName:a,dimName:o}));return w(s.sql,n)}let a=e.find(e=>e.cube===t.name);if(!a)throw Error(r.noMapping({cubeName:t.name}));let o=rn(a.dimension),s=on(t,a.cube,i,r).dimensions?.[o];if(!s)throw Error(r.mappingDimNotFound({dimension:a.dimension,cubeName:a.cube,dimName:o}));return w(s.sql,n)}function cn(e,t,n,r){if(typeof e==`string`){let[,i]=e.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(E(`${r}.timeDimNotFound`,{timeDimension:e}));return w(a.sql,n)}let i=e.find(e=>e.cube===t.name);if(!i)throw Error(E(`${r}.noTimeDimMapping`,{cubeName:t.name}));let[,a]=i.dimension.split(`.`),o=t.dimensions?.[a];if(!o)throw Error(E(`${r}.timeDimMappingNotFound`,{dimension:i.dimension}));return w(o.sql,n)}var ln=class{databaseAdapter;dateTimeBuilder;constructor(e,t){this.databaseAdapter=e,this.dateTimeBuilder=t}buildFilterCondition(e,t,n,r,i){let a=i??void 0;if(t===`inDateRange`){let t=Ot(n,a);if(!t.valid)throw Error(O(t));if(a===void 0&&n.length===1)return this.dateTimeBuilder.buildDateRangeCondition(e,n[0])}if(a!==void 0){if(t!==`inDateRange`)throw Error(`dateRange can only be used with 'inDateRange' operator, but got '${t}'. Use explicit date values in the 'values' array for other date operators.`);if(r&&r.type!==`time`)throw Error(`dateRange can only be used on time dimensions, but field '${r.name||`unknown`}' has type '${r.type}'`);return this.dateTimeBuilder.buildDateRangeCondition(e,a)}if(en.has(t))return tn(t,{fieldExpr:e,values:n??[],filteredValues:[],value:void 0,field:r,databaseAdapter:this.databaseAdapter,dateTimeBuilder:this.dateTimeBuilder});if(!n||n.length===0)return t===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let o=n.filter(e=>!(e==null||e===``||typeof e==`string`&&e.includes(`\0`))).map(this.databaseAdapter.convertFilterValue);if(o.length===0)return t===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let s=o[0];return tn(t,{fieldExpr:e,values:n,filteredValues:o,value:s,field:r,databaseAdapter:this.databaseAdapter,dateTimeBuilder:this.dateTimeBuilder})}buildLogicalFilter(e,t,n){return`and`in e&&e.and?this.combineFilters(e.and,!0,t,n):`or`in e&&e.or?this.combineFilters(e.or,!1,t,n):null}combineFilters(e,t,r,i){let a=e.map(e=>this.buildSingleFilter(e,r,i)).filter(e=>e!==null);return a.length===0?null:a.length===1?a[0]:t?(0,n.and)(...a):(0,n.or)(...a)}buildSingleFilter(e,t,n){if(`and`in e||`or`in e)return this.buildLogicalFilter(e,t,n);let r=nn(e);if(r)return this.combineFilters(r.filters,r.isAnd,t,n);let i=e,[a,o]=i.member.split(`.`),s=t.get(a);if(!s)return null;let c=s.dimensions?.[o];if(!c)return null;let l=qe(c,n);return this.buildFilterCondition(l,i.operator,i.values,c,i.dateRange)}},un=[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`];function dn(e){return un.includes(e)}function fn(e){return dn(e.type)&&e.windowConfig?.measure!==void 0}function pn(e,t){if(!e.windowConfig?.measure)return null;let n=e.windowConfig.measure;return n.includes(`.`)?n:`${t}.${n}`}function mn(e){switch(e){case`lag`:case`lead`:return`difference`;default:return`raw`}}function hn(e,t){let n=[],r=[],i=new Set;for(let a of e){let[e,o]=a.split(`.`),s=t.get(e);if(s?.measures?.[o]){let t=s.measures[o];if(fn(t)){r.push(a);let n=pn(t,e);n&&i.add(n)}else dn(t.type)||n.push(a)}}return{aggregateMeasures:n,postAggWindowMeasures:r,requiredBaseMeasures:i}}function gn(e,t){return hn(e,t).postAggWindowMeasures.length>0}function _n(e){let t=[],n=[];for(let[n,r]of e)r.inDegree===0&&t.push(n);for(;t.length>0;){let r=t.shift();n.push(r);for(let[n,i]of e)i.dependencies.has(r)&&(i.inDegree--,i.inDegree===0&&t.push(n))}return n}var j=class{dependencyGraph;cubes;constructor(e){this.cubes=e instanceof Map?e:new Map([[e.name,e]]),this.dependencyGraph=new Map}extractDependencies(e){if(e.length>1e3)return[];let t=e.matchAll(/\{([^}]+)\}/g),n=[];for(let e of t){let t=e[1].trim();if(t.includes(`.`)){let[e,r]=t.split(`.`);n.push({measureName:t,cubeName:e.trim(),fieldName:r.trim()})}else n.push({measureName:t,cubeName:null,fieldName:t})}return n}buildGraph(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=`${e.name}.${t}`,i=this.extractDependencies(n.calculatedSql),a=new Set;for(let t of i){let n=`${t.cubeName||e.name}.${t.fieldName}`;a.add(n)}this.dependencyGraph.set(r,{id:r,dependencies:a,inDegree:0})}this.calculateInDegrees()}buildGraphForMultipleCubes(e){for(let t of e.values())this.buildGraph(t)}calculateInDegrees(){for(let e of this.dependencyGraph.values())e.inDegree=0;for(let e of this.dependencyGraph.values())for(let t of e.dependencies){let e=this.dependencyGraph.get(t);e&&e.inDegree++}}topologicalSort(e){let t=this.buildSubgraph(e),n=_n(t);if(n.length<t.size){let e=this.detectCycle();throw Error(`Circular dependency detected in calculated measures: ${e?e.join(` -> `):`unknown cycle`}`)}return n}buildSubgraph(e){let t=new Map;for(let n of e){let e=this.dependencyGraph.get(n);e&&t.set(n,{id:e.id,dependencies:new Set(e.dependencies),inDegree:0})}for(let e of t.values()){let n=0;for(let r of e.dependencies)t.has(r)&&n++;e.inDegree=n}return t}detectCycle(){let e=new Set,t=new Set,n=[];for(let r of this.dependencyGraph.keys())if(!e.has(r)){let i=this.dfs(r,e,t,n);if(i)return i}return null}dfs(e,t,n,r){t.add(e),n.add(e),r.push(e);let i=this.dependencyGraph.get(e);if(!i)return r.pop(),n.delete(e),null;for(let e of i.dependencies)if(!t.has(e)){let i=this.dfs(e,t,n,r);if(i)return i}else if(n.has(e)){let t=r.indexOf(e);return[...r.slice(t),e]}return r.pop(),n.delete(e),null}getAllDependencies(e){let t=new Set,n=new Set,r=e=>{if(n.has(e))return;n.add(e);let i=this.dependencyGraph.get(e);if(i)for(let e of i.dependencies)t.add(e),r(e)};return r(e),t}validateDependencies(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=this.extractDependencies(n.calculatedSql);for(let n of r){let r=n.cubeName||e.name,i=this.cubes.get(r);if(!i)throw Error(`Calculated measure '${e.name}.${t}' references unknown cube '${r}'`);if(!i.measures[n.fieldName])throw Error(`Calculated measure '${e.name}.${t}' references unknown measure '${n.measureName}'`);if(r===e.name&&n.fieldName===t)throw Error(`Calculated measure '${e.name}.${t}' cannot reference itself`)}}}populateDependencies(e){for(let[,t]of Object.entries(e.measures))t.type===`calculated`&&t.calculatedSql&&!t.dependencies&&(t.dependencies=this.extractDependencies(t.calculatedSql).map(e=>e.measureName))}static isCalculatedMeasure(e){return e.type===`calculated`&&!!e.calculatedSql}};function vn(e,t){let{cube:r,allCubes:i,resolvedMeasures:a}=t,o=yn(e),s=new Map;for(let e of o){let{originalRef:t,cubeName:o,fieldName:c}=e,l=o||r.name;if(!i.get(l))throw Error(E(`server.validation.template.substituteTargetCubeNotFound`,{ref:`{${t}}`,cubeName:l}));let u=`${l}.${c}`,d=a.get(u);if(!d)throw Error(E(`server.validation.template.substituteMeasureNotResolved`,{ref:`{${t}}`,measureName:u}));let f=d(),p=n.sql`${f}`;s.set(t,p)}let c=[],l=[],u=0;for(let t of o){let n=`{${t.originalRef}}`,r=e.indexOf(n,u);if(r>=0){c.push(e.substring(u,r));let i=s.get(t.originalRef);i&&l.push(i),u=r+n.length}}if(c.push(e.substring(u)),l.length===0)return n.sql.raw(e);let d=[];for(let e=0;e<c.length;e++)c[e]&&d.push(new n.StringChunk(c[e])),e<l.length&&d.push(l[e]);return n.sql.join(d,n.sql.raw(``))}function yn(e){if(e.length>1e3)return[];let t=e.matchAll(/\{([^}]+)\}/g),n=[];for(let e of t){let t=e[1].trim();if(t.includes(`.`)){let[e,r]=t.split(`.`).map(e=>e.trim());n.push({originalRef:t,cubeName:e,fieldName:r})}else n.push({originalRef:t,cubeName:null,fieldName:t})}return n}function bn(e){let t=[],n=0;for(let r=0;r<e.length;r++)if(e[r]===`{`)n++;else if(e[r]===`}`&&(n--,n<0)){t.push(E(`server.validation.template.unmatchedClosingBrace`,{position:r}));break}n>0&&t.push(E(`server.validation.template.unmatchedOpeningBrace`)),/\{\s*\}/.test(e)&&t.push(E(`server.validation.template.emptyReference`)),/\{[^}]*\{/.test(e)&&t.push(E(`server.validation.template.nestedBraces`));let r=yn(e);for(let e of r){let n=e.cubeName?`${e.cubeName}.${e.fieldName}`:e.fieldName;/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(n)||t.push(E(`server.validation.template.invalidMemberReference`,{ref:`{${e.originalRef}}`})),n.split(`.`).length>2&&t.push(E(`server.validation.template.multipleDots`,{ref:`{${e.originalRef}}`}))}return{isValid:t.length===0,errors:t}}function xn(e,t){let n=yn(e),r=new Set;for(let e of n){let n=`${e.cubeName||t}.${e.fieldName}`;r.add(n)}return Array.from(r)}var Sn=class e{databaseAdapter;constructor(e){this.databaseAdapter=e}buildResolvedMeasures(e,t,n,r){let i=new Map,a=[],o=[],s=new Set(e),c=new j(t);for(let e of t.values())c.buildGraph(e);for(let n of e)this.classifyRequestedMeasure(n,t,c,a,o,s);for(let e of s)this.classifyDependencyMeasure(e,t,a,o);for(let e of a){let[a,o]=e.split(`.`),s=t.get(a),c=s.measures[o];if(r){let t=r(e,c,s);i.set(e,()=>t)}else i.set(e,()=>this.buildMeasureExpression(c,n,s))}if(o.length>0){let e=c.topologicalSort(o);for(let r of e){let[e,a]=r.split(`.`),o=t.get(e),s=o.measures[a];i.set(r,()=>this.buildCalculatedMeasure(s,o,t,i,n))}}return i}classifyRequestedMeasure(t,n,r,i,a,o){let[s,c]=t.split(`.`),l=n.get(s)?.measures?.[c];if(l){if(e.isPostAggregationWindow(l)){let t=e.getWindowBaseMeasure(l,s);t&&o.add(t);return}if(!j.isCalculatedMeasure(l)){i.push(t);return}a.push(t),this.collectCalculatedDependencies(t,l,s,n,r,o)}}collectCalculatedDependencies(e,t,n,r,i,a){xn(t.calculatedSql,n).forEach(e=>a.add(e));for(let t of i.getAllDependencies(e)){let[e,n]=t.split(`.`),i=r.get(e)?.measures?.[n];i&&j.isCalculatedMeasure(i)&&xn(i.calculatedSql,e).forEach(e=>a.add(e))}}classifyDependencyMeasure(t,n,r,i){let[a,o]=t.split(`.`),s=n.get(a)?.measures?.[o];s&&(e.isPostAggregationWindow(s)||(j.isCalculatedMeasure(s)?i.includes(t)||i.push(t):r.includes(t)||r.push(t)))}buildCalculatedMeasure(e,t,n,r,i){if(!e.calculatedSql)throw Error(`Calculated measure '${t.name}.${e.name}' missing calculatedSql property`);return vn(this.databaseAdapter.preprocessCalculatedTemplate(e.calculatedSql),{cube:t,allCubes:n,resolvedMeasures:r,queryContext:i})}buildCTECalculatedMeasure(e,t,r,i,a){if(!e.calculatedSql)throw Error(`Calculated measure '${t.name}.${e.name||`unknown`}' missing calculatedSql property`);let o=new Map,s=xn(e.calculatedSql,t.name);for(let e of s){let[t,a]=e.split(`.`),s=i.get(t);if(s&&s.measures[a]){let t=s.measures[a];if(r.measures.includes(e)){let i=n.sql`${n.sql.identifier(r.cteAlias)}.${n.sql.identifier(a)}`,s=this.reAggregateCteColumn(t.type,i);o.set(e,()=>s)}}}return this.buildCalculatedMeasure(e,t,i,o,a)}reAggregateCteColumn(e,t){switch(e){case`avg`:return this.databaseAdapter.buildAvg(t);case`min`:return(0,n.min)(t);case`max`:return(0,n.max)(t);default:return(0,n.sum)(t)}}buildHavingMeasureExpression(e,t,n,r,i){let a=i?.preAggregationCTEs?.find(t=>t.cube.name===e);return a&&a.measures.includes(`${e}.${t}`)&&i?this.buildHavingCteMeasure(e,t,n,r,i,a):this.buildMeasureExpression(n,r)}buildHavingCteMeasure(e,t,r,i,a,o){if(r.type===`calculated`&&r.calculatedSql){let t=a.primaryCube.name===e?a.primaryCube:a.joinCubes?.find(t=>t.cube.name===e)?.cube;if(!t)throw Error(`Cube ${e} not found in query plan`);let n=new Map([[a.primaryCube.name,a.primaryCube]]);if(a.joinCubes)for(let e of a.joinCubes)n.set(e.cube.name,e.cube);return this.buildCTECalculatedMeasure(r,t,o,n,i)}let s=n.sql`${n.sql.identifier(o.cteAlias)}.${n.sql.identifier(t)}`;return this.reAggregateCteColumn(r.type,s)}buildMeasureExpression(t,n,r){if(t.type===`calculated`)throw Error(`Cannot build calculated measure '${t.name}' directly. Use buildCalculatedMeasure instead.`);if(e.isPostAggregationWindow(t))throw Error(`Post-aggregation window measure '${t.name}' should be built via buildPostAggregationWindowExpression, not buildMeasureExpression.`);if(!t.sql)throw Error(`Measure '${t.name}' of type '${t.type}' is missing required 'sql' property. Only calculated measures and post-aggregation window functions can omit 'sql'.`);let i=w(t.sql,n);if(n.ungrouped)return i;let a=this.applyMeasureFilters(t,i,n);return this.applyAggregation(t,a,n,r)}applyMeasureFilters(e,t,r){if(!e.filters||e.filters.length===0)return t;let i=e.filters.map(e=>{let t=e(r);return t?n.sql`(${t})`:void 0}).filter(Boolean);if(i.length===0)return t;let a=i.length===1?i[0]:(0,n.and)(...i);return this.databaseAdapter.buildCaseWhen([{when:a,then:t}])}applyAggregation(e,t,r,i){switch(e.type){case`count`:return(0,n.count)(t);case`countDistinct`:return(0,n.countDistinct)(t);case`sum`:return(0,n.sum)(t);case`avg`:return this.databaseAdapter.buildAvg(t);case`min`:return(0,n.min)(t);case`max`:return(0,n.max)(t);case`number`:return t;case`stddev`:case`stddevSamp`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildStddev(t,e.type===`stddevSamp`||e.statisticalConfig?.useSample));case`variance`:case`varianceSamp`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildVariance(t,e.type===`varianceSamp`||e.statisticalConfig?.useSample));case`percentile`:case`median`:case`p95`:case`p99`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildPercentile(t,this.resolvePercentile(e)));case`lag`:case`lead`:case`rank`:case`denseRank`:case`rowNumber`:case`ntile`:case`firstValue`:case`lastValue`:case`movingAvg`:case`movingSum`:return this.buildWindowMeasure(e,t,r,i);default:return(0,n.count)(t)}}buildStatistical(e,t,r){let i=r();return i===null?(console.warn(`[drizzle-cube] ${e.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),n.sql`MAX(NULL)`):i}resolvePercentile(e){switch(e.type){case`median`:return 50;case`p95`:return 95;case`p99`:return 99;default:return e.statisticalConfig?.percentile??50}}buildWindowMeasure(e,t,r,i){let a=e.windowConfig||{},o=this.resolveWindowPartitions(a,r,i),s=this.resolveWindowOrder(a,r,i),c=this.databaseAdapter.buildWindowFunction(e.type,[`rank`,`denseRank`,`rowNumber`].includes(e.type)?null:t,o,s,{offset:a.offset,defaultValue:a.defaultValue,nTile:a.nTile,frame:a.frame});return c===null?(console.warn(`[drizzle-cube] ${e.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),n.sql`NULL`):c}resolveWindowPartitions(e,t,n){if(!e.partitionBy||e.partitionBy.length===0||!n)return;let r=e.partitionBy.map(e=>{let r=e.includes(`.`)?e.split(`.`)[1]:e,i=n.dimensions?.[r];return i?w(i.sql,t):(console.warn(`[drizzle-cube] Window function partition dimension '${e}' not found in cube '${n.name}'`),null)}).filter(e=>e!==null);return r.length>0?r:void 0}resolveWindowOrder(e,t,n){if(!e.orderBy||e.orderBy.length===0||!n)return;let r=e.orderBy.map(e=>{let r=e.field.includes(`.`)?e.field.split(`.`)[1]:e.field,i=n.dimensions?.[r];if(i)return{field:w(i.sql,t),direction:e.direction};let a=n.measures?.[r];return a&&a.sql?{field:w(a.sql,t),direction:e.direction}:(console.warn(`[drizzle-cube] Window function order field '${e.field}' not found in cube '${n.name}'`),null)}).filter(e=>e!==null);return r.length>0?r:void 0}static WINDOW_FUNCTION_TYPES=un;static isWindowFunction(e){return dn(e)}static categorizeMeasures(t,n){let r=[],i=[];for(let a of t){let[t,o]=a.split(`.`),s=n.get(t);if(s?.measures?.[o]){let t=s.measures[o];e.isWindowFunction(t.type)?r.push(a):i.push(a)}}return{windowMeasures:r,aggregateMeasures:i}}static hasWindowFunctions(t,n){let{windowMeasures:r}=e.categorizeMeasures(t,n);return r.length>0}static isPostAggregationWindow(e){return fn(e)}static getWindowBaseMeasure(e,t){return pn(e,t)}static getDefaultWindowOperation(e){return mn(e)}static categorizeForPostAggregation(e,t){return hn(e,t)}static hasPostAggregationWindows(e,t){return gn(e,t)}},Cn=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=e}isWindowFunctionType(e){return[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`].includes(e)}isAggregateFunctionType(e){return[`count`,`countDistinct`,`sum`,`avg`,`min`,`max`,`stddev`,`stddevSamp`,`variance`,`varianceSamp`,`median`,`p95`,`p99`,`percentile`,`number`].includes(e)}buildGroupByFields(e,t,n,r){if(t.ungrouped)return[];let i=[],a=e instanceof Map?e:new Map([[e.name,e]]),o=t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0,s=t.measures&&t.measures.length>0,c=o&&!s;if(!this.hasAggregateMeasures(t,a)&&!c)return[];for(let e of t.dimensions||[]){let t=this.resolveDimensionGroupField(e,a,n,r);t&&i.push(t)}for(let e of t.timeDimensions||[]){let t=this.resolveTimeDimensionGroupField(e,a,n,r);t&&i.push(t)}return this.addCorrelationKeys(t,a,i),i}addCorrelationKeys(e,t,n){let r=new Set;for(let i of e.dimensions||[]){let[e,a]=i.split(`.`),o=t.get(e)?.dimensions?.[a]?.correlatesOn;o&&!r.has(o)&&(r.add(o),n.push(o))}}hasAggregateMeasures(e,t){for(let n of e.measures||[]){let[e,r]=n.split(`.`),i=t.get(e)?.measures?.[r];if(i&&(this.isAggregateFunctionType(i.type)||i.type===`calculated`||this.isWindowOverAggregate(i,e,t)))return!0}return!1}isWindowOverAggregate(e,t,n){if(!Sn.isPostAggregationWindow(e))return!1;let r=Sn.getWindowBaseMeasure(e,t);if(!r)return!1;let[i,a]=r.split(`.`),o=n.get(i)?.measures?.[a];return!!o&&this.isAggregateFunctionType(o.type)}resolveDimensionGroupField(e,t,r,i){let[a,o]=e.split(`.`),s=t.get(a);if(!s?.dimensions?.[o])return null;let c=i?.preAggregationCTEs?.find(e=>e.cube.name===a);if(c){let e=c.joinKeys.find(e=>e.targetColumn===o);return e&&e.sourceColumnObj?e.sourceColumnObj:n.sql`${n.sql.identifier(c.cteAlias)}.${n.sql.identifier(o)}`}return w(s.dimensions[o].sql,r)}resolveTimeDimensionGroupField(e,t,r,i){let[a,o]=e.dimension.split(`.`),s=t.get(a);if(!s?.dimensions?.[o])return null;let c=i?.preAggregationCTEs?.find(e=>e.cube.name===a);if(c){let t=c.joinKeys.find(e=>e.targetColumn===o);return t&&t.sourceColumnObj?this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj,e.granularity,r):n.sql`${n.sql.identifier(c.cteAlias)}.${n.sql.identifier(o)}`}return this.dateTimeBuilder.buildTimeDimensionExpression(s.dimensions[o].sql,e.granularity,r)}},wn=class{dateTimeBuilder;filterBuilder;groupByBuilder;measureBuilder;constructor(e){this.dateTimeBuilder=new Mt(e),this.filterBuilder=new ln(e,this.dateTimeBuilder),this.groupByBuilder=new Cn(this.dateTimeBuilder),this.measureBuilder=new Sn(e)}buildResolvedMeasures(e,t,n,r){return this.measureBuilder.buildResolvedMeasures(e,t,n,r)}buildSelections(e,t,r){let i={},a=e instanceof Map?e:new Map([[e.name,e]]);if(t.dimensions)for(let e of t.dimensions){let[t,o]=e.split(`.`),s=a.get(t);if(s&&s.dimensions&&s.dimensions[o]){let t=s.dimensions[o],a=w(t.sql,r);i[e]=n.sql`${a}`.as(e)}}if(t.measures){let e=this.buildResolvedMeasures(t.measures,a,r);for(let r of t.measures){let t=e.get(r);if(t&&typeof t==`function`){let e=t();i[r]=n.sql`${e}`.as(r)}}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,o]=e.dimension.split(`.`),s=a.get(t);if(s&&s.dimensions&&s.dimensions[o]){let t=s.dimensions[o],a=this.buildTimeDimensionExpression(t.sql,e.granularity,r);i[e.dimension]=n.sql`${a}`.as(e.dimension)}}return Object.keys(i).length===0&&(i.count=(0,n.count)()),i}buildCalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCalculatedMeasure(e,t,n,r,i)}buildCTECalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCTECalculatedMeasure(e,t,n,r,i)}buildHavingMeasureExpression(e,t,n,r,i){return this.measureBuilder.buildHavingMeasureExpression(e,t,n,r,i)}buildMeasureExpression(e,t,n){return this.measureBuilder.buildMeasureExpression(e,t,n)}buildTimeDimensionExpression(e,t,n){return this.dateTimeBuilder.buildTimeDimensionExpression(e,t,n)}buildWhereConditions(e,t,n,r,i){let a=[],o=e instanceof Map?e:new Map([[e.name,e]]),s=new Set;if(t.filters&&t.filters.length>0)for(let e of t.filters)this.appendWhereFilter(e,o,n,r,i,s,a);if(t.timeDimensions)for(let e of t.timeDimensions)this.appendTimeDimensionWhere(e,o,n,r,a);return a}appendWhereFilter(e,t,n,r,i,a,o){if(i&&`member`in e){let[n]=e.member.split(`.`);if(this.cubeIsInCTE(n,r))return;if(t.has(n)&&i.has(n)&&!a.has(n)){o.push(...i.get(n)),a.add(n);return}if(a.has(n))return}let s=this.processFilter(e,t,n,`where`,r);s&&o.push(s)}appendTimeDimensionWhere(e,t,n,r,i){let[a,o]=e.dimension.split(`.`),s=t.get(a);if(!s||!s.dimensions[o]||!e.dateRange||this.cubeIsInCTE(a,r))return;if(n.filterCache){let t=$e(e.dimension,e.dateRange),r=n.filterCache.get(t);if(r){i.push(r);return}}let c=s.dimensions[o],l=w(c.sql,n),u=this.buildDateRangeCondition(l,e.dateRange);u&&i.push(u)}cubeIsInCTE(e,t){return!!t?.preAggregationCTEs?.some(t=>t.cube.name===e)}buildHavingConditions(e,t,n,r){let i=[],a=e instanceof Map?e:new Map([[e.name,e]]);if(t.filters&&t.filters.length>0)for(let e of t.filters){let t=this.processFilter(e,a,n,`having`,r);t&&i.push(t)}return i}processFilter(e,t,r,i,a){if(`and`in e||`or`in e){let o=e;if(o.and){let e=o.and.map(e=>this.processFilter(e,t,r,i,a)).filter(e=>e!==null);return e.length>0?(0,n.and)(...e):null}if(o.or){if(i===`where`&&this.orNeedsSemiJoins(o.or,t,a))return this.buildFilterWithSemiJoins(o,t,r,a);let e=o.or.map(e=>this.processFilter(e,t,r,i,a)).filter(e=>e!==null);return e.length>0?(0,n.or)(...e):null}}let o=e,[s,c]=o.member.split(`.`),l=t.get(s);if(!l)return null;let u=l.dimensions[c],d=l.measures[c],f=u||d;if(!f)return null;if(i===`where`&&u)return this.processWhereDimensionFilter(e,o,u,f,s,r,a);if(i===`where`&&d)return null;if(i===`having`&&d){let e=this.buildHavingMeasureExpression(s,c,d,r,a);return this.buildFilterCondition(e,o.operator,o.values,f,o.dateRange)}return null}isCubeInScope(e,t,n){return t.has(e)&&!this.cubeIsInCTE(e,n)}orNeedsSemiJoins(e,t,n){let r=new Set(tt(e).map(e=>e.member.split(`.`)[0]));if(r.size<2)return!1;let i=[...r].filter(e=>this.isCubeInScope(e,t,n));return i.length>0&&i.length<r.size}buildFilterWithSemiJoins(e,t,r,i){if(`and`in e||`or`in e){let a=e,o=(a.and??a.or??[]).map(e=>this.buildFilterWithSemiJoins(e,t,r,i)).filter(e=>e!==null);return o.length===0?null:o.length===1?o[0]:a.and?(0,n.and)(...o):(0,n.or)(...o)}let a=e,[o]=a.member.split(`.`);return this.isCubeInScope(o,t,i)?this.processFilter(a,t,r,`where`,i):this.buildSemiJoinLeaf(a,t,r,i)}buildSemiJoinLeaf(e,t,n,r){let[i,a]=e.member.split(`.`),o=this.knownCubes(t,r);if(o.get(i)?.measures?.[a])return null;let s=this.findSemiJoinPath(i,t,o,r);if(!s)throw Error(E(`server.errors.crossCubeOrFilterUnsupported`,{member:e.member,cubeName:i,contextCube:[...t.keys()].filter(e=>this.isCubeInScope(e,t,r)).join(`, `)}));let c=s[s.length-1].cube,l=this.buildWhereConditions(new Map([[c.name,c]]),{filters:[e]},n);if(l.length===0)return null;let u=null;for(let e=s.length-1;e>=0;e--){let{cube:t,keyPairs:r}=s[e],i=t.sql(n),a=u?[u]:l;u=rt(n,i,r,i.where?[i.where,...a]:a)}return u}knownCubes(e,t){let n=new Map(e);if(t){let e=[t.primaryCube,...(t.joinCubes??[]).map(e=>e.cube),...(t.preAggregationCTEs??[]).map(e=>e.cube)];for(let t of e)n.has(t.name)||n.set(t.name,t)}return n}findSemiJoinPath(e,t,n,r){let i=r?.preAggregationCTEs?.find(t=>t.cube.name===e);if(i&&!(i.intermediateJoins&&i.intermediateJoins.length>0)){let e=[];for(let t of i.joinKeys)t.sourceColumnObj&&t.targetColumnObj&&e.push({outer:t.sourceColumnObj,inner:t.targetColumnObj});if(e.length>0&&e.length===i.joinKeys.length)return[{cube:i.cube,keyPairs:e}]}let a=new T(n),o=null;for(let n of t.keys()){if(!this.isCubeInScope(n,t,r))continue;let i=a.findPath(n,e);i&&i.length>0&&(!o||i.length<o.length)&&(o=i)}if(!o)return null;let s=[];for(let e of o){let t=n.get(e.toCube)??(e.reversed?null:C(e.joinDef.targetCube,n));if(!t||!Tn(e.joinDef))return null;s.push({cube:t,keyPairs:e.joinDef.on.map(t=>e.reversed?{outer:t.target,inner:t.source}:{outer:t.source,inner:t.target})})}return s}processWhereDimensionFilter(e,t,n,r,i,a,o){if(this.cubeIsInCTE(i,o))return null;let s=n.type===`time`;if(a.filterCache){let t=Qe(e),n=a.filterCache.get(t);if(n)return n}let c=s?w(n.sql,a):typeof n.sql==`function`?n.sql(a):n.sql;return this.buildFilterCondition(c,t.operator,t.values,r,t.dateRange)}buildFilterCondition(e,t,n,r,i){return this.filterBuilder.buildFilterCondition(e,t,n,r,i)}buildDateRangeCondition(e,t){return this.dateTimeBuilder.buildDateRangeCondition(e,t)}buildGroupByFields(e,t,n,r){return this.groupByBuilder.buildGroupByFields(e,t,n,r)}buildOrderBy(e,t){let r=[],i=t||[...e.measures||[],...e.dimensions||[],...e.timeDimensions?.map(e=>e.dimension)||[]];if(e.order&&Object.keys(e.order).length>0)for(let[t,a]of Object.entries(e.order)){if(!i.includes(t))throw Error(`Cannot order by '${t}': field is not selected in the query`);let e=a===`desc`?(0,n.desc)(n.sql.identifier(t)):(0,n.asc)(n.sql.identifier(t));r.push(e)}if(e.timeDimensions&&e.timeDimensions.length>0){let t=new Set(Object.keys(e.order||{})),i=[...e.timeDimensions].sort((e,t)=>e.dimension.localeCompare(t.dimension));for(let e of i)t.has(e.dimension)||r.push((0,n.asc)(n.sql.identifier(e.dimension)))}return r}collectNumericFields(e,t){let n=[],r=e instanceof Map?e:new Map([[e.name,e]]);if(t.measures&&n.push(...t.measures),t.dimensions)for(let e of t.dimensions){let[t,i]=e.split(`.`),a=r.get(t);if(a){let t=a.dimensions[i];t&&t.type===`number`&&n.push(e)}}return n}applyLimitAndOffset(e,t){let n=t.limit;t.offset!==void 0&&t.offset>0&&n===void 0&&(n=50);let r=e;if(n!==void 0){if(n<0)throw Error(`Limit must be non-negative`);r=r.limit(n)}if(t.offset!==void 0){if(t.offset<0)throw Error(`Offset must be non-negative`);r=r.offset(t.offset)}return r}buildFilterConditionPublic(e,t,n,r,i){return this.buildFilterCondition(e,t,n,r,i)}buildLogicalFilter(e,t,n){return this.filterBuilder.buildLogicalFilter(e,t,n)}};function Tn(e){return e.relationship!==`belongsToMany`&&e.on.length>0&&e.on.every(e=>!e.as)}var En=class{cache=new WeakMap;get(e){let t=this.cache.get(e);return t||(t=new T(e),this.cache.set(e,t)),t}};function Dn(e){let t=new Set;if(e.measures)for(let n of e.measures){let[e]=n.split(`.`);t.add(e)}if(e.dimensions)for(let n of e.dimensions){let[e]=n.split(`.`);t.add(e)}if(e.timeDimensions)for(let n of e.timeDimensions){let[e]=n.dimension.split(`.`);t.add(e)}if(e.filters)for(let n of e.filters)On(n,t);if(e.order)for(let n of Object.keys(e.order)){let[e]=n.split(`.`);e&&t.add(e)}return t}function On(e,t){if(`and`in e||`or`in e){let n=e.and||e.or||[];for(let e of n)On(e,t);return}if(`member`in e){let[n]=e.member.split(`.`);n&&t.add(n)}}var kn=class{resolverCache;constructor(e){this.resolverCache=e}buildJoinPlan(e,t,n,r,i){let a=this.resolverCache.get(e),o=[],s=new Set([t.name]),c=new Set;if(i.measures)for(let e of i.measures){let[t]=e.split(`.`);c.add(t)}let l=Dn(i),u=new Set;for(let n of c)n!==t.name&&this.findHasManyJoinDef(t,n,e)&&u.add(n);let d=n.filter(e=>e!==t.name);for(let n of d){if(s.has(n))continue;let r=new Set([...s].filter(e=>!u.has(e))),i=a.findPathPreferring(t.name,n,l,r);if(!i||i.length===0)throw Error(E(`server.errors.noJoinPath`,{fromCube:t.name,toCube:n}));for(let{fromCube:t,toCube:n,joinDef:r,reversed:a}of i){if(s.has(n))continue;let i=e.get(n);if(!i)throw Error(E(`server.errors.cubeNotFound`,{cubeName:n}));o.push(this.buildJoinRef(i,n,t,r,a)),s.add(n)}}return o}buildJoinRef(e,t,n,r,i){let a=i?Ue(r.relationship):r.relationship;if(a===`belongsToMany`&&r.through){let i=We(`belongsToMany`,r.sqlJoinType);return{target:{name:e.name,cube:e},alias:`${t.toLowerCase()}_cube`,joinType:i,joinDef:r,relationship:`belongsToMany`,junctionTable:{table:r.through.table,alias:`junction_${t.toLowerCase()}`,joinType:i,sourceCubeName:n}}}let o=We(a,r.sqlJoinType);return{target:{name:e.name,cube:e},alias:`${t.toLowerCase()}_cube`,joinType:o,joinDef:r,relationship:a}}findHasManyJoinDef(e,t,n){if(!e.joins)return null;for(let[,r]of Object.entries(e.joins)){let e=C(r.targetCube,n);if(e&&e.name===t&&r.relationship===`hasMany`)return r}return null}};function An(e,t){let n=e.joinDef.through;return e.sourceCube?.name===t.name&&!e.reversed?n.targetKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):n.sourceKey.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source}))}function jn(e,t){return e.joinDef.relationship===`belongsToMany`&&e.joinDef.through?An(e,t):e.reversed?e.joinDef.on.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source})):e.joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target}))}function Mn(e){return e.relationship===`belongsToMany`&&e.through?e.through.sourceKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):e.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target}))}function Nn(e,t,n){if(!e.joins)return null;for(let[,r]of Object.entries(e.joins)){let e=C(r.targetCube,n);if(e&&e.name===t)return r}return null}function Pn(e,t,n){let r=Nn(t,n,e);if(r)return{sourceCube:t,joinDef:r};let i=e.get(n);if(i){let n=Nn(i,t.name,e);if(n)return{sourceCube:i,joinDef:n,reversed:!0}}for(let[,r]of e){if(r.name===t.name||r.name===n)continue;let i=Nn(r,n,e);if(i)return{sourceCube:r,joinDef:i}}return null}function Fn(e,t){let n=new Set;if(e.dimensions)for(let r of e.dimensions){let[e]=r.split(`.`);e!==t&&n.add(e)}if(e.timeDimensions)for(let r of e.timeDimensions){let[e]=r.dimension.split(`.`);e!==t&&n.add(e)}if(e.filters){for(let t of e.filters)On(t,n);n.delete(t)}return n}var In=class{resolverCache;filterPropagation;constructor(e,t){this.resolverCache=e,this.filterPropagation=t}planPreAggregationCTEs(e,t,n,r,i){let a=[];if(!r.measures||r.measures.length===0)return a;let o=this.computeCTEReasons(t,n,r);if(o.size===0)return a;for(let i of n){let n=o.get(i.target.name);if(!n)continue;let s=this.buildCTEForJoinCube(i,n,e,t,r);s&&a.push(s)}return a}buildCTEForJoinCube(e,t,n,r,i){let a=e.target.cube,o=e.alias,s=(i.measures??[]).filter(e=>e.startsWith(a.name+`.`)),c=this.extractMeasuresFromFilters(i,a),l=[...new Set([...s,...c])];if(l.length===0)return null;let u=this.resolveCTEJoinKeys(n,r,a,i);if(!u)return null;let{joinKeys:d,intermediateJoins:f}=u,p=this.filterPropagation.findPropagatingFilters(i,a,n),{aggregateMeasures:m,requiredBaseMeasures:h}=hn(l,new Map([[a.name,a]])),g=[...new Set([...m,...Array.from(h).filter(e=>e.startsWith(a.name+`.`))])];if(g.length===0)return null;let _=this.expandCalculatedMeasureDependencies(a,g),v=this.findDownstreamJoinKeys(a,i,n);return{cube:a,alias:o,cteAlias:`${a.name.toLowerCase()}_agg`,joinKeys:d,measures:_,propagatingFilters:p.length>0?p:void 0,downstreamJoinKeys:v.length>0?v:void 0,intermediateJoins:f&&f.length>0?f:void 0,cteType:`aggregate`,cteReason:t}}resolveCTEJoinKeys(e,t,n,r){let i=this.analyzeJoinPathToPrimary(e,t,n.name,r);if(i?.hasIntermediateHasMany&&i.intermediateJoins.length>0)return{joinKeys:i.correctJoinKeys,intermediateJoins:i.intermediateJoins};let a=this.locateJoinInfo(e,t,n,i);return a?{joinKeys:jn(a,t),intermediateJoins:void 0}:null}locateJoinInfo(e,t,n,r){if(r?.path&&r.path.length>0){let t=r.path[r.path.length-1],n=e.get(t.fromCube);if(n)return{sourceCube:n,joinDef:t.joinDef,reversed:t.reversed}}return Pn(e,t,n.name)}analyzeJoinPathToPrimary(e,t,n,r){let i=this.resolverCache.get(e),a=Dn(r),o=a.size>0?i.findPathPreferring(t.name,n,a,new Set):i.findPath(t.name,n);if(!o||o.length===0)return null;let s=o.map(e=>({fromCube:e.fromCube,toCube:e.toCube,joinDef:e.joinDef,reversed:e.reversed}));if(!s.slice(0,-1).some(e=>(e.reversed?Ue(e.joinDef.relationship):e.joinDef.relationship)===`hasMany`))return{path:s,hasIntermediateHasMany:!1,intermediateJoins:[],correctJoinKeys:[]};let c=[];for(let t=0;t<s.length-1;t++){let n=s[t],r=s[t+1],i=e.get(n.toCube);if(!i)continue;let a=r.joinDef.on[0]?.source,o=n.joinDef.on[0]?.target;c.push({cube:i,joinDef:r.joinDef,primaryJoinColumn:o,cteJoinColumn:a})}return{path:s,hasIntermediateHasMany:!0,intermediateJoins:c,correctJoinKeys:s[0].joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target}))}}computeCTEReasons(e,t,n){let r=new Map,i=new Set,a=new Set,o=new Set;if(n.measures)for(let e of n.measures){let[t]=e.split(`.`);o.add(t)}for(let e of t)e.relationship===`hasMany`||e.relationship===`belongsToMany`?i.add(e.target.name):e.relationship===`belongsTo`&&o.has(e.target.name)&&a.add(e.target.name);if(i.size===0&&a.size===0)return r;for(let e of t)o.has(e.target.name)&&(i.has(e.target.name)?r.set(e.target.name,`hasMany`):(a.has(e.target.name)||i.size>0)&&r.set(e.target.name,`fanOutPrevention`));return r}findDownstreamJoinKeys(e,t,n){let r=[],i=Fn(t,e.name);if(!e.joins)return r;for(let[,t]of Object.entries(e.joins)){let e=C(t.targetCube,n);if(!e)continue;let a=e.name;i.has(a)&&r.push({targetCubeName:a,joinKeys:Mn(t)})}return r}expandCalculatedMeasureDependencies(e,t){let n=new Set,r=[...t];for(;r.length>0;){let t=r.pop();if(n.has(t))continue;n.add(t);let[,i]=t.split(`.`);if(!e.measures||!e.measures[i])continue;let a=e.measures[i];if(a.type===`calculated`&&a.calculatedSql){let t=this.extractDependenciesFromTemplate(a.calculatedSql,e.name);for(let e of t)n.has(e)||r.push(e)}}return Array.from(n)}extractDependenciesFromTemplate(e,t){if(e.length>1e3)return[];let n=e.matchAll(/\{([^}]+)\}/g),r=[];for(let e of n){let n=e[1].trim();n.includes(`.`)?r.push(n):r.push(`${t}.${n}`)}return r}extractMeasuresFromFilters(e,t){let n=[];if(!e.filters)return n;for(let r of e.filters)this.extractMeasuresFromFilter(r,t,n);return n}extractMeasuresFromFilter(e,t,n){if(`and`in e||`or`in e){let r=e.and||e.or||[];for(let e of r)this.extractMeasuresFromFilter(e,t,n);return}if(`member`in e){let r=e.member,[i,a]=r.split(`.`);i===t.name&&t.measures&&t.measures[a]&&n.push(r)}}},Ln=class{findPropagatingFilters(e,t,n){let r=[];if(!e.filters)return r;let i=this.collectFilterCubeNames(e);for(let a of i){if(a===t.name)continue;let i=n.get(a);if(i?.joins)for(let[,o]of Object.entries(i.joins)){let s=C(o.targetCube,n);if(!s||s.name!==t.name||o.relationship!==`hasMany`)continue;let c=this.buildPropagatingFilter(e,i,a,o);c&&r.push(c)}}return r}collectFilterCubeNames(e){let t=new Set;if(e.filters&&this.extractFilterCubeNamesToSet(e.filters,t),e.timeDimensions){for(let n of e.timeDimensions)if(n.dateRange){let[e]=n.dimension.split(`.`);e&&t.add(e)}}return t}buildPropagatingFilter(e,t,n,r){let i=this.extractFiltersForCube(e.filters??[],n),a=this.extractTimeDimensionFiltersForCube(e,n),o=[...i,...a];return o.length===0||r.on.length===0?null:{sourceCube:t,filters:o,joinConditions:r.on.map(e=>({source:e.source,target:e.target}))}}extractFilterCubeNamesToSet(e,t){for(let n of e){if(`and`in n||`or`in n){let e=n.and||n.or||[];this.extractFilterCubeNamesToSet(e,t);continue}if(`member`in n){let[e]=n.member.split(`.`);e&&t.add(e)}}}extractFiltersForCube(e,t){let n=[];for(let r of e){if(`and`in r){let e=this.extractFiltersForCube(r.and||[],t);e.length>0&&n.push({and:e});continue}if(`or`in r){let e=r.or||[];if(this.allFiltersFromCube(e,t)){let r=this.extractFiltersForCube(e,t);r.length>0&&n.push({or:r})}continue}if(`member`in r){let[e]=r.member.split(`.`);e===t&&n.push(r)}}return n}allFiltersFromCube(e,t){for(let n of e){if(`and`in n){if(!this.allFiltersFromCube(n.and||[],t))return!1;continue}if(`or`in n){if(!this.allFiltersFromCube(n.or||[],t))return!1;continue}if(`member`in n){let[e]=n.member.split(`.`);if(e!==t)return!1}}return!0}extractTimeDimensionFiltersForCube(e,t){let n=[];if(!e.timeDimensions)return n;for(let r of e.timeDimensions){let[e]=r.dimension.split(`.`);e===t&&r.dateRange&&n.push({member:r.dimension,operator:`inDateRange`,values:Array.isArray(r.dateRange)?r.dateRange:[r.dateRange]})}return n}},Rn=class{resolverCache;constructor(e){this.resolverCache=e}analyzePrimaryCubeSelection(e,t,n){if(e.length===1)return{selectedCube:e[0],reason:`single_cube`,explanation:`Only one cube is used in this query`};let r=this.buildPrimaryCubeCandidates(e,t,n);return this.selectByDimensions(t,r)||this.selectByConnectivity(r)||{selectedCube:[...e].sort()[0],reason:`alphabetical_fallback`,explanation:`Selected alphabetically as fallback (no cube could reach all others)`,candidates:r}}buildPrimaryCubeCandidates(e,t,n){let r=new Map;for(let e of t.dimensions||[]){let t=e.split(`.`)[0];r.set(t,(r.get(t)||0)+1)}let i=this.resolverCache.get(n);return e.map(t=>{let a=n.get(t);return{cubeName:t,dimensionCount:r.get(t)||0,joinCount:a?.joins?Object.keys(a.joins).length:0,canReachAll:i.canReachAll(t,e)}})}selectByDimensions(e,t){if(!e.dimensions||e.dimensions.length===0)return null;let n=Math.max(...t.map(e=>e.dimensionCount));if(n===0)return null;let r=t.filter(e=>e.dimensionCount===n).sort((e,t)=>e.cubeName.localeCompare(t.cubeName));for(let e of r)if(e.canReachAll)return{selectedCube:e.cubeName,reason:`most_dimensions`,explanation:`Selected because it has ${e.dimensionCount} dimension${e.dimensionCount===1?``:`s`} in the query (defines the analytical grain)`,candidates:t};return null}selectByConnectivity(e){let t=e.filter(e=>e.canReachAll);if(t.length===0)return null;let n=Math.max(...t.map(e=>e.joinCount)),r=t.filter(e=>e.joinCount===n).sort((e,t)=>e.cubeName.localeCompare(t.cubeName))[0];return{selectedCube:r.cubeName,reason:`most_connected`,explanation:`Selected because it has ${r.joinCount} join relationship${r.joinCount===1?``:`s`} and can reach all other cubes`,candidates:e}}analyzeJoinPath(e,t,n,r){let i=this.resolverCache.get(e),a=r?Dn(r):new Set,o=a.size>0?i.findPathPreferringDetailed(t,n,a):null,s=o?.selectedPath??i.findPath(t,n),c=[t];if(s)for(let e of s)c.push(e.toCube);if(!s||s.length===0)return{targetCube:n,pathFound:!1,error:`No join path found from '${t}' to '${n}'. Ensure the target cube has a relationship defined (belongsTo, hasOne, hasMany, or belongsToMany).`,visitedCubes:c,selection:this.buildJoinPathSelectionAnalysis(o)};let l=this.convertInternalPathToJoinPathSteps(s);return{targetCube:n,pathFound:!0,path:l,pathLength:l.length,visitedCubes:c,selection:this.buildJoinPathSelectionAnalysis(o)}}convertInternalPathToJoinPathSteps(e){return e.map(e=>{let t=e.reversed?Ue(e.joinDef.relationship):e.joinDef.relationship,n=We(t,e.joinDef.sqlJoinType),r=e.joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name})),i={fromCube:e.fromCube,toCube:e.toCube,relationship:t,joinType:n,joinColumns:r};if(e.reversed&&(i.reversed=!0),t===`belongsToMany`&&e.joinDef.through){let t=e.joinDef.through;i.junctionTable={tableName:t.table[Symbol.for(`drizzle:Name`)]||`junction_table`,sourceColumns:t.sourceKey.map(e=>e.target.name),targetColumns:t.targetKey.map(e=>e.source.name)}}return i})}buildJoinPathSelectionAnalysis(e){if(!e)return{strategy:`shortest`};let t=e.candidates.map((e,t)=>this.mapPreferredCandidate(e,t+1));return{strategy:e.strategy,preferredCubes:e.preferredCubes,selectedRank:e.selectedIndex>=0?e.selectedIndex+1:void 0,selectedScore:e.selectedIndex>=0?e.candidates[e.selectedIndex]?.score:void 0,candidates:t}}mapPreferredCandidate(e,t){return{rank:t,score:e.score,usesPreferredJoin:e.usesPreferredJoin,preferredCubesInPath:e.preferredCubesInPath,usesProcessed:e.usesProcessed,scoreBreakdown:e.scoreBreakdown,path:this.convertInternalPathToJoinPathSteps(e.path)}}generateWarnings(e,t){let n=[],r=this.checkFanOutNoDimensions(e,t);return r&&n.push(r),n}checkFanOutNoDimensions(e,t){if(!t||t.length===0||!e.measures||e.measures.length===0)return null;let n=new Set;for(let t of e.measures){let[e]=t.split(`.`);n.add(e)}if(n.size<2)return null;let r=e.dimensions&&e.dimensions.length>0,i=e.timeDimensions?.some(e=>e.granularity);return r||i?null:{code:`FAN_OUT_NO_DIMENSIONS`,message:`Query combines measures from multiple cubes with hasMany relationships but has no dimensions. Results are aggregated at the join key level, which may produce unexpected totals.`,severity:`warning`,cubes:[...n].sort(),measures:e.measures,suggestion:`Add a dimension to see per-group breakdowns, or add a time dimension with granularity.`}}},zn=class{resolverCache=new En;joinPlanner=new kn(this.resolverCache);ctePlanner=new In(this.resolverCache,new Ln);reporter=new Rn(this.resolverCache);analyzeCubeUsage(e){return Dn(e)}analyzePrimaryCube(e,t,n){return this.reporter.analyzePrimaryCubeSelection(e,t,n)}analyzeJoinPathForTarget(e,t,n,r){return this.reporter.analyzeJoinPath(e,t,n,r)}buildJoinPlanForPrimary(e,t,n,r,i){return this.joinPlanner.buildJoinPlan(e,t,n,r,i)}buildPreAggregationCTEs(e,t,n,r,i){return this.ctePlanner.planPreAggregationCTEs(e,t,n,r,i)}buildWarnings(e,t){return this.reporter.generateWarnings(e,t)}},Bn=class{queryBuilder;constructor(e){this.queryBuilder=e}buildPreAggregationCTE(e,t,r,i,a){let o=e.cube,s=o.sql(r),c=!!(e.intermediateJoins&&e.intermediateJoins.length>0),l=this.buildCTESelections(e,o,t,r,c);if(Object.keys(l).length===0)return null;let u=r.db.select(l).from(s.from);u=nt(u,s),u=this.applyIntermediateJoins(u,e,r,c);let d=this.buildCTEWhereConditions(e,o,t,r,i,a,s);if(d.length>0){let e=d.length===1?d[0]:(0,n.and)(...d);u=u.where(e)}let f=this.buildCTEGroupByFields(e,o,t,r,c);return f.length>0&&(u=u.groupBy(...f)),r.db.$with(e.cteAlias).as(u)}buildCTESelections(e,t,n,r,i){let a={};return this.addJoinKeySelections(a,e,t,i),this.addDownstreamKeySelections(a,e),this.addMeasureSelections(a,e,t,r),this.addDimensionSelections(a,t,n,r),a}addJoinKeySelections(e,t,r,i){if(i&&t.intermediateJoins){let n=t.intermediateJoins[0].primaryJoinColumn;n&&(e[n.name]=n);return}for(let i of t.joinKeys)if(i.targetColumnObj){e[i.targetColumn]=i.targetColumnObj;for(let[t,a]of Object.entries(r.dimensions||{}))a.sql===i.targetColumnObj&&t!==i.targetColumn&&(e[t]=n.sql`${i.targetColumnObj}`.as(t))}}addDownstreamKeySelections(e,t){if(t.downstreamJoinKeys)for(let n of t.downstreamJoinKeys)for(let t of n.joinKeys)t.sourceColumnObj&&(e[t.sourceColumn]=t.sourceColumnObj)}addMeasureSelections(e,t,r,i){let a=new Map([[r.name,r]]),o=this.queryBuilder.buildResolvedMeasures(t.measures,a,i);for(let r of t.measures){let[,t]=r.split(`.`),i=o.get(r);i&&(e[t]=n.sql`${i()}`.as(t))}}addDimensionSelections(e,t,r,i){let a=t.name;for(let o of r.dimensions||[]){let[r,s]=o.split(`.`);if(r===a&&t.dimensions?.[s]){let r=this.queryBuilder.buildMeasureExpression({sql:t.dimensions[s].sql,type:`number`},i);e[s]=n.sql`${r}`.as(s)}}for(let o of r.timeDimensions||[]){let[r,s]=o.dimension.split(`.`);if(r===a&&t.dimensions?.[s]){let r=this.queryBuilder.buildTimeDimensionExpression(t.dimensions[s].sql,o.granularity,i);e[s]=n.sql`${r}`.as(s)}}}applyIntermediateJoins(e,t,r,i){if(!i||!t.intermediateJoins)return e;let a=[...t.intermediateJoins].reverse();for(let t of a){let i=t.cube.sql(r),a=[(0,n.eq)(t.cteJoinColumn,t.joinDef.on[0]?.target)];i.where&&a.push(i.where),e=e.leftJoin(i.from,(0,n.and)(...a))}return e}buildCTEWhereConditions(e,t,n,r,i,a,o){let s=i?{...i,preAggregationCTEs:i.preAggregationCTEs?.filter(e=>e.cube.name!==t.name)}:void 0,c=this.queryBuilder.buildWhereConditions(t,n,r,s,a),l=this.buildCTETimeFilters(e,t,n,r),u=[];return o.where&&u.push(o.where),u.push(...c,...l),u}buildCTETimeFilters(e,t,n,r){let i=t.name,a=[];for(let e of n.timeDimensions||[]){let[n,o]=e.dimension.split(`.`);if(n===i&&t.dimensions?.[o]&&e.dateRange){let n=this.queryBuilder.buildMeasureExpression({sql:t.dimensions[o].sql,type:`number`},r),i=this.queryBuilder.buildDateRangeCondition(n,e.dateRange);i&&a.push(i)}}for(let e of n.filters||[]){if(`and`in e||`or`in e||!(`member`in e)||!(`operator`in e))continue;let n=e,[o,s]=n.member.split(`.`);if(o===i&&t.dimensions?.[s]&&n.operator===`inDateRange`){let e=this.queryBuilder.buildMeasureExpression({sql:t.dimensions[s].sql,type:`number`},r),i=this.queryBuilder.buildFilterConditionPublic(e,n.operator,n.values,t.dimensions[s],n.dateRange);i&&a.push(i)}}for(let t of e.propagatingFilters||[]){let e=this.buildPropagatingFilterSubquery(t,r);e&&a.push(e)}return a}buildCTEGroupByFields(e,t,n,r,i){let a=t.name,o=[],s=new Set;this.addJoinKeyGroupBy(e=>{let t=e?.name||(typeof e==`string`?e:null);t&&!s.has(t)?(s.add(t),o.push(e)):t||o.push(e)},e,i);for(let e of n.dimensions||[]){let[n,i]=e.split(`.`);n===a&&t.dimensions?.[i]&&o.push(w(t.dimensions[i].sql,r))}for(let e of n.timeDimensions||[]){let[n,i]=e.dimension.split(`.`);n===a&&t.dimensions?.[i]&&o.push(this.queryBuilder.buildTimeDimensionExpression(t.dimensions[i].sql,e.granularity,r))}return o}addJoinKeyGroupBy(e,t,n){if(n&&t.intermediateJoins){let n=t.intermediateJoins[0];n.primaryJoinColumn&&e(n.primaryJoinColumn)}else for(let n of t.joinKeys)n.targetColumnObj&&e(n.targetColumnObj);if(t.downstreamJoinKeys)for(let n of t.downstreamJoinKeys)for(let t of n.joinKeys)t.sourceColumnObj&&e(t.sourceColumnObj)}buildCTEJoinCondition(e,t,r){let i=r.preAggregationCTEs?.find(t=>t.cube.name===e.cube.name);if(!i)throw Error(`CTE info not found for cube ${e.cube.name}`);let a=[];if(i.intermediateJoins&&i.intermediateJoins.length>0){let e=i.intermediateJoins[0],o=this.resolveCTEJoinSourceColumn(i.joinKeys[0],i,r),s=n.sql`${n.sql.identifier(t)}.${n.sql.identifier(e.primaryJoinColumn.name)}`;a.push((0,n.eq)(o,s))}else for(let e of i.joinKeys){let o=this.resolveCTEJoinSourceColumn(e,i,r),s=n.sql`${n.sql.identifier(t)}.${n.sql.identifier(e.targetColumn)}`;a.push((0,n.eq)(o,s))}return a.length===1?a[0]:(0,n.and)(...a)}resolveCTEJoinSourceColumn(e,t,r){if(!e)throw Error(`Missing join key while building CTE join condition for '${t.cube.name}'`);let i=e.sourceColumnObj||n.sql.identifier(e.sourceColumn);if(!e.sourceColumnObj||!r.preAggregationCTEs)return i;for(let i of r.preAggregationCTEs)if(i.cube.name!==t.cube.name){for(let[t,r]of Object.entries(i.cube.dimensions||{}))if(typeof r.sql!=`function`&&r.sql===e.sourceColumnObj)return n.sql`${n.sql.identifier(i.cteAlias)}.${n.sql.identifier(t)}`}return i}buildPropagatingFilterSubquery(e,t){let n=e.sourceCube,r=n.sql(t),i=[];if(r.where&&i.push(r.where),e.preBuiltFilterSQL)i.push(e.preBuiltFilterSQL);else{let r={filters:e.filters},a=new Map([[n.name,n]]),o=this.queryBuilder.buildWhereConditions(a,r,t);i.push(...o)}return i.length===0?null:rt(t,r,e.joinConditions.map(({source:e,target:t})=>({outer:t,inner:e})),i)}};function Vn(e,t){let n=Hn(e);return{measures:Wn(t,n),dimensions:Gn(t,n),segments:{},timeDimensions:Kn(t,n)}}function Hn(e){let t=[e.primaryCube].filter(Boolean);if(e.joinCubes&&e.joinCubes.length>0&&t.push(...e.joinCubes.map(e=>e.cube).filter(Boolean)),e.multiFactMerge?.groups?.length)for(let n of e.multiFactMerge.groups)n.queryPlan.primaryCube&&t.push(n.queryPlan.primaryCube),n.queryPlan.joinCubes?.length&&t.push(...n.queryPlan.joinCubes.map(e=>e.cube).filter(Boolean));return t}function Un(e,t,n){return e.find(e=>e?.name===t)?.dimensions?.[n]}function Wn(e,t){let n={};if(!e.measures)return n;for(let r of e.measures){let[e,i]=r.split(`.`),a=t.find(t=>t?.name===e)?.measures?.[i];a&&(n[r]={title:a.title||i,shortTitle:a.title||i,type:a.type})}return n}function Gn(e,t){let n={};if(!e.dimensions)return n;for(let r of e.dimensions){let[e,i]=r.split(`.`),a=Un(t,e,i);a&&(n[r]={title:a.title||i,shortTitle:a.title||i,type:a.type})}return n}function Kn(e,t){let n={};if(!e.timeDimensions)return n;for(let r of e.timeDimensions){let[e,i]=r.dimension.split(`.`),a=Un(t,e,i);a&&(n[r.dimension]={title:a.title||i,shortTitle:a.title||i,type:a.type,granularity:r.granularity,...a.fillMissingDates!==void 0&&{fillMissingDates:a.fillMissingDates}})}return n}var qn=1e4;function Jn(e,t,n){let r=[],i=Yn(new Date(e),n),a=Yn(new Date(t),n);for(;i<=a&&r.length<1e4;)r.push(new Date(i)),i=Xn(i,n);return r}function Yn(e,t){let n=new Date(e);switch(t){case`second`:n.setUTCMilliseconds(0);break;case`minute`:n.setUTCSeconds(0,0);break;case`hour`:n.setUTCMinutes(0,0,0);break;case`day`:n.setUTCHours(0,0,0,0);break;case`week`:{let e=n.getUTCDay(),t=e===0?6:e-1;n.setUTCDate(n.getUTCDate()-t),n.setUTCHours(0,0,0,0);break}case`month`:n.setUTCDate(1),n.setUTCHours(0,0,0,0);break;case`quarter`:{let e=Math.floor(n.getUTCMonth()/3)*3;n.setUTCMonth(e,1),n.setUTCHours(0,0,0,0);break}case`year`:n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0)}return n}function Xn(e,t){let n=new Date(e);switch(t){case`second`:n.setUTCSeconds(n.getUTCSeconds()+1);break;case`minute`:n.setUTCMinutes(n.getUTCMinutes()+1);break;case`hour`:n.setUTCHours(n.getUTCHours()+1);break;case`day`:n.setUTCDate(n.getUTCDate()+1);break;case`week`:n.setUTCDate(n.getUTCDate()+7);break;case`month`:n.setUTCMonth(n.getUTCMonth()+1);break;case`quarter`:n.setUTCMonth(n.getUTCMonth()+3);break;case`year`:n.setUTCFullYear(n.getUTCFullYear()+1)}return n}function Zn(e,t){let n=null;if(e instanceof Date)n=e;else if(typeof e==`string`){let t=new Date(e);isNaN(t.getTime())||(n=t)}return!n||isNaN(n.getTime())?null:Yn(n,t).toISOString()}function Qn(e,t){return t.length===0?`__all__`:t.map(t=>String(e[t]??``)).join(`|||`)}function $n(e,t){let{timeDimensionKey:n,granularity:r,dateRange:i,dimensions:a}=t,o=Jn(i[0],i[1],r);if(o.length===0)return e;if(o.length>=1e4)return console.warn(`[drizzle-cube] Skipping gap filling for "${n}": the ${r} range exceeds the ${qn}-bucket limit. Returning unfilled data.`),e;let s=er(e,n,r,a),c=[];for(let[e,n]of s){let e=n.size>0?n.values().next().value:null;for(let r of o){let i=r.toISOString(),a=n.get(i);c.push(a??tr(i,e??null,t))}}return c}function er(e,t,n,r){let i=new Map;for(let a of e){let e=Qn(a,r),o=Zn(a[t],n)??String(a[t]),s=i.get(e);s||(s=new Map,i.set(e,s)),s.set(o,a)}return i.size===0&&r.length===0&&i.set(`__all__`,new Map),i}function tr(e,t,n){let{timeDimensionKey:r,fillValue:i,measures:a,dimensions:o}=n,s={[r]:e};if(t)for(let e of o)s[e]=t[e];for(let e of a)s[e]=i;return s}function nr(e){if(!e)return null;if(typeof e!=`string`){if(e.length<2)return null;let t=new Date(String(e[0])),n=new Date(String(e[1]));return isNaN(t.getTime())||isNaN(n.getTime())?null:[t,n]}let t=ft(e);if(t)return[t.start,t.end];let n=new Date(e);return isNaN(n.getTime())?null:[n,n]}function rr(e,t,n,r){if(!t.timeDimensions||t.timeDimensions.length===0)return e;let i=t.timeDimensions.filter(e=>{let n=!!e.granularity,i=e.dateRange||ir(e.dimension,t.filters);return n&&!!i&&r(e)});if(i.length===0)return e;let a=t.fillMissingDatesValue===void 0?0:t.fillMissingDatesValue,o=new Set(t.timeDimensions.map(e=>e.dimension)),s=(t.dimensions||[]).filter(e=>!o.has(e)),c=e;for(let e of i){let r=nr(e.dateRange)||ar(e.dimension,t.filters);if(!r)continue;let i={timeDimensionKey:e.dimension,granularity:e.granularity,dateRange:r,fillValue:a,measures:n,dimensions:s};c=$n(c,i)}return c}function ir(e,t){if(!t)return null;for(let n of t){if(`member`in n&&`operator`in n&&n.member===e&&n.operator===`inDateRange`)return n;if(`and`in n&&n.and){let t=ir(e,n.and);if(t)return t}if(`or`in n&&n.or){let t=ir(e,n.or);if(t)return t}}return null}function ar(e,t){let n=ir(e,t);if(!n)return null;if(n.dateRange){let e=nr(n.dateRange);if(e)return e}let r=n.values;if(!r||r.length===0)return null;if(r.length===1&&typeof r[0]==`string`){let e=ft(r[0]);return e?[e.start,e.end]:nr(r)}return r.length>=2?nr(r):null}function or(e,t){let[n,r]=t.split(`.`);return e?.get(n)?.dimensions?.[r]?.fillMissingDates}function sr(e,t,n,r=!1){return t.ungrouped?e:rr(e,t,t.measures||[],e=>e.fillMissingDates??or(n,e.dimension)??r)}function cr(e,t,n,r,i=!1){return sr(Array.isArray(e)?e.map(e=>{let r={...e};if(t.timeDimensions){for(let e of t.timeDimensions)if(e.dimension in r){let t=r[e.dimension];if(typeof t==`string`&&t.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)){let e=t.replace(` `,`T`),n=!e.endsWith(`Z`)&&!e.includes(`+`)?e+`Z`:e;t=new Date(n)}t=n.convertTimeDimensionResult(t),r[e.dimension]=t}}return r}):[e],t,r,i)}var lr=class{queryBuilder;constructor(e){this.queryBuilder=e}preload(e,t,n,r){if(e.filters&&e.filters.length>0)for(let i of tt(e.filters))this.preloadRegularFilter(i,t,n,r);if(e.timeDimensions)for(let i of e.timeDimensions)this.preloadTimeDimensionFilter(i,t,n,r)}resolveMemberDimension(e,t){let[n,r]=e.split(`.`),i=t.get(n);return i?i.dimensions?.[r]??null:null}preloadRegularFilter(e,t,n,r){let i=Qe(e);if(t.has(i))return;let a=this.resolveMemberDimension(e.member,n);if(!a||[`arrayContains`,`arrayOverlaps`,`arrayContained`].includes(e.operator))return;let o=qe(a,r),s=this.queryBuilder.buildFilterConditionPublic(o,e.operator,e.values,a,e.dateRange);s&&t.set(i,s)}preloadTimeDimensionFilter(e,t,n,r){if(!e.dateRange)return;let i=$e(e.dimension,e.dateRange);if(t.has(i))return;let a=this.resolveMemberDimension(e.dimension,n);if(!a)return;let o=w(a.sql,r),s=this.queryBuilder.buildDateRangeCondition(o,e.dateRange);s&&t.set(i,s)}};function ur(e){return e.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>=2)??!1}function dr(e){return e.funnel!=null&&(e.funnel.steps?.length??0)>=2}function fr(e){return e.flow!=null&&e.flow.startingStep!==void 0&&e.flow.eventDimension!==void 0}function pr(e){return e.retention!=null&&e.retention.timeDimension!=null&&e.retention.bindingKey!=null}function mr(e){return{comparison:ur(e),funnel:dr(e),flow:fr(e),retention:pr(e)}}function hr(e){let t=[];return ur(e)&&t.push(`comparison`),dr(e)&&t.push(`funnel`),fr(e)&&t.push(`flow`),pr(e)&&t.push(`retention`),t}function gr(e){return hr(e)[0]??`regular`}function _r(e){return!e.granularity&&!(e.compareDateRange&&e.compareDateRange.length>0)}function vr(e){if(e.ungrouped||!e.timeDimensions?.some(_r))return e;let t=e.timeDimensions.filter(e=>!_r(e)),n=e.timeDimensions.filter(_r).flatMap(e=>e.dateRange===void 0?[]:[{member:e.dimension,operator:`inDateRange`,values:[],dateRange:e.dateRange}]);return{...e,timeDimensions:t.length>0?t:void 0,filters:n.length>0?[...e.filters??[],...n]:e.filters}}var yr=class extends Error{issues;constructor(e,t){super(e),this.name=`QueryValidationError`,this.issues=t}},br=class{messages=[];issues=[];push(e){this.messages.push(e)}pushMissingMember(e,t,n){this.messages.push(n),this.issues.push({source:e,member:t,message:n})}};function xr(e){return hr(e)}function Sr(e,t){let n=new br,r=xr(t);if(r.length>1)return n.push(E(`server.validation.query.multipleQueryModes`,{modes:r.join(`, `)})),{isValid:!1,errors:n.messages,issues:n.issues};if(r.length===1&&r[0]!==`comparison`)return Cr(r[0],t,e,n),{isValid:n.messages.length===0,errors:n.messages,issues:n.issues};let i=new Set;if(Or(t,e,n,i),kr(t,e,n,i),Ar(t,e,n,i),t.filters)for(let r of t.filters)Vr(r,e,n,i);return i.size===0&&n.push(E(`server.validation.query.mustReferenceAtLeastOneCube`)),t.ungrouped&&Rr(t,e,n,i),{isValid:n.messages.length===0,errors:n.messages,issues:n.issues}}function Cr(e,t,n,r){e!==`comparison`&&(e===`funnel`?wr(t,n,r):e===`flow`?Tr(t,n,r):e===`retention`&&Er(t,n,r))}function wr(e,t,n){let r=e.funnel.bindingKey;if(typeof r==`string`){let[e]=r.split(`.`);e&&!t.has(e)&&n.push(E(`server.validation.query.funnelBindingKeyCubeNotFound`,{cubeName:e}))}else if(Array.isArray(r))for(let e of r)t.has(e.cube)||n.push(E(`server.validation.query.funnelBindingKeyCubeNotFound`,{cubeName:e.cube}))}function Tr(e,t,n){let r=e.flow.bindingKey;if(typeof r==`string`){let[e]=r.split(`.`);e&&!t.has(e)&&n.push(E(`server.validation.query.flowBindingKeyCubeNotFound`,{cubeName:e}))}}function Er(e,t,n){let r=e.retention,i=Gr(r.timeDimension);i&&!t.has(i)&&n.push(E(`server.validation.query.retentionCubeNotFound`,{cubeName:i}));let a=r.bindingKey;if(typeof a==`string`){let[e]=a.split(`.`);e&&!t.has(e)&&n.push(E(`server.validation.query.retentionBindingKeyCubeNotFound`,{cubeName:e}))}else if(Array.isArray(a))for(let e of a)t.has(e.cube)||n.push(E(`server.validation.query.retentionBindingKeyCubeNotFound`,{cubeName:e.cube}));if(r.breakdownDimensions&&Array.isArray(r.breakdownDimensions))for(let e of r.breakdownDimensions){let[r]=e.split(`.`);r&&!t.has(r)&&n.push(E(`server.validation.query.retentionBreakdownCubeNotFound`,{cubeName:r}))}}function Dr(e,t,n){return e===t?`. Did you mean one of: ${n.slice(0,5).map(e=>`'${t}.${e}'`).join(`, `)}?`:``}function Or(e,t,n,r){if(e.measures)for(let i of e.measures){let[e,a]=i.split(`.`);if(!e||!a){n.push(E(`server.validation.query.invalidMeasureFormat`,{measure:i}));continue}r.add(e);let o=t.get(e);if(!o){n.pushMissingMember(`measure`,i,E(`server.validation.query.cubeNotFoundForMeasure`,{cubeName:e,measure:i}));continue}if(!o.measures[a]){let t=Dr(a,e,Object.keys(o.measures));n.pushMissingMember(`measure`,i,E(`server.validation.query.measureNotFound`,{fieldName:a,cubeName:e,hint:t}))}}}function kr(e,t,n,r){if(e.dimensions)for(let i of e.dimensions){let[e,a]=i.split(`.`);if(!e||!a){n.push(E(`server.validation.query.invalidDimensionFormat`,{dimension:i}));continue}r.add(e);let o=t.get(e);if(!o){n.pushMissingMember(`dimension`,i,E(`server.validation.query.cubeNotFoundForDimension`,{cubeName:e,dimension:i}));continue}if(!o.dimensions[a]){let t=Dr(a,e,Object.keys(o.dimensions));n.pushMissingMember(`dimension`,i,E(`server.validation.query.dimensionNotFound`,{fieldName:a,cubeName:e,hint:t}))}}}function Ar(e,t,n,r){if(e.timeDimensions){for(let i of e.timeDimensions){let[e,a]=i.dimension.split(`.`);if(!e||!a){n.push(E(`server.validation.query.invalidTimeDimensionFormat`,{dimension:i.dimension}));continue}r.add(e);let o=t.get(e);if(!o){n.pushMissingMember(`timeDimension`,i.dimension,E(`server.validation.query.cubeNotFoundForTimeDimension`,{cubeName:e,dimension:i.dimension}));continue}o.dimensions[a]||n.pushMissingMember(`timeDimension`,i.dimension,E(`server.validation.query.timeDimensionNotFound`,{fieldName:a,cubeName:e})),Pr(i,n)}Fr(e,n)}}var jr=`'today', 'last 7 days', 'last 3 months', 'this month', 'last quarter', 'next week'`;function Mr(e,t,n){e.push(E(`server.validation.query.invalidDateRange`,{dateRange:JSON.stringify(n),member:t,examples:jr}))}function Nr(e,t,n){if(!xt(t)){Mr(n,e,t);return}let r=Dt(t);r.valid||n.push(kt(e,r))}function Pr(e,t){e.dateRange!==void 0&&Nr(e.dimension,e.dateRange,t);for(let n of e.compareDateRange??[])Nr(e.dimension,n,t)}function Fr(e,t){if(e.ungrouped||(e.measures?.length??0)>0||(e.dimensions?.length??0)>0)return;let n=e.timeDimensions??[],r=n.filter(_r);r.length>0&&r.length===n.length&&t.push(E(`server.validation.query.granularityLessTimeDimensionOnly`,{dimension:r[0].dimension}))}var Ir=new Set([`count`,`countDistinct`,`countDistinctApprox`,`calculated`,`stddev`,`stddevSamp`,`variance`,`varianceSamp`,`median`,`p95`,`p99`,`percentile`,`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`]),Lr=[`sum`,`avg`,`min`,`max`,`number`];function Rr(e,t,n,r){e.dimensions&&e.dimensions.length>0||e.timeDimensions&&e.timeDimensions.length>0||n.push(E(`server.validation.query.ungroupedRequiresDimension`)),e.funnel&&n.push(E(`server.validation.query.ungroupedIncompatibleFunnel`)),e.flow&&n.push(E(`server.validation.query.ungroupedIncompatibleFlow`)),e.retention&&n.push(E(`server.validation.query.ungroupedIncompatibleRetention`)),e.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>0)&&n.push(E(`server.validation.query.ungroupedIncompatibleCompareDateRange`)),e.timeDimensions?.some(e=>e.fillMissingDates===!0)&&n.push(E(`server.validation.query.ungroupedIncompatibleFillMissingDates`)),zr(e,t,n),Br(e,t,n,r)}function zr(e,t,n){if(e.measures)for(let r of e.measures){let[e,i]=r.split(`.`),a=t.get(e)?.measures[i];a&&(Ir.has(a.type)&&n.push(`Measure '${r}' has type '${a.type}' which is incompatible with ungrouped queries. Only ${Lr.join(`, `)} types are allowed.`),a.filters&&a.filters.length>0&&n.push(`Measure '${r}' has filters which are incompatible with ungrouped queries (measure filters require aggregation)`))}}function Br(e,t,n,r){let i=[...r].filter(e=>t.has(e));if(i.length<2)return;let a=new zn,o=a.analyzePrimaryCube(i,e,t).selectedCube;for(let r of i){if(r===o)continue;let i=a.analyzeJoinPathForTarget(t,o,r,e).path?.find(e=>e.relationship===`hasMany`);i&&n.push(`Ungrouped queries are incompatible with hasMany relationships (${i.fromCube} → ${i.toCube} is hasMany)`)}}function Vr(e,t,n,r){if(`and`in e||`or`in e){let i=e.and||e.or||[];for(let e of i)Vr(e,t,n,r);e.or&&Wr(e.or,t,n);return}if(!(`member`in e)){n.push(E(`server.validation.query.filterMustHaveMember`));return}let[i,a]=e.member.split(`.`);if(!i||!a){n.push(E(`server.validation.query.invalidFilterMemberFormat`,{member:e.member}));return}if(r.add(i),e.operator===`inDateRange`){let t=Ot(e.values,e.dateRange);t.valid||n.push(jt(e.member,t))}let o=t.get(i);if(!o){n.pushMissingMember(`filter`,e.member,E(`server.validation.query.cubeNotFoundForFilter`,{cubeName:i,member:e.member}));return}if(!o.dimensions[a]&&!o.measures[a]){let t=a===i?`. Did you mean one of: ${[...Object.keys(o.dimensions),...Object.keys(o.measures)].slice(0,5).map(e=>`'${i}.${e}'`).join(`, `)}?`:``;n.pushMissingMember(`filter`,e.member,E(`server.validation.query.filterFieldNotFound`,{fieldName:a,cubeName:i,hint:t}))}Ur(e,n)}var Hr=new Set([`beforeDate`,`afterDate`]);function Ur(e,t){let{member:n,operator:r}=e;if(!$t(r)){t.push(E(`server.validation.query.unknownFilterOperator`,{operator:String(r),member:n,operators:Qt.join(`, `)}));return}let i=Array.isArray(e.values)?e.values:[];r!==`inDateRange`&&Hr.has(r)&&i.length>0&&!bt(i[0])&&t.push(E(`server.validation.query.invalidDateValue`,{member:n,operator:r,value:JSON.stringify(i[0])}))}function Wr(e,t,n){let r=[],i=[];for(let{member:n}of tt(e)){let[e,a]=n.split(`.`),o=t.get(e);o?.measures[a]?r.push(n):o?.dimensions[a]&&i.push(n)}r.length>0&&i.length>0&&n.push(E(`server.validation.query.orMixesMeasuresAndDimensions`,{measures:r.join(`, `),dimensions:i.join(`, `)}))}function Gr(e){if(typeof e==`string`){let[t]=e.split(`.`);return t||null}return e.cube}var Kr=class{builders;constructor(e){this.builders=e}resolveMode(e){let t=[];if(this.builders.comparison.hasComparison(e)&&t.push(`comparison`),this.builders.funnel.hasFunnel(e)&&t.push(`funnel`),this.builders.flow.hasFlow(e)&&t.push(`flow`),this.builders.retention.hasRetention(e)&&t.push(`retention`),t.length===0)return`regular`;if(t.length>1)throw Error(E(`server.errors.queryContainsMultipleModes`,{modes:t.join(`, `)}));return t[0]}validateForMode(e,t,n){let r=()=>{let e=Sr(t,n);if(!e.isValid)throw new yr(E(`server.errors.queryValidationFailed`,{errors:e.errors.join(`, `)}),e.issues)};({regular:r,comparison:r,funnel:()=>{let e=this.builders.funnel.validateConfig(n.funnel,t);if(!e.isValid)throw Error(E(`server.errors.funnelValidationFailed`,{errors:e.errors.join(`, `)}))},flow:()=>{let e=this.builders.flow.validateConfig(n.flow,t);if(!e.isValid)throw Error(E(`server.errors.flowValidationFailed`,{errors:e.errors.join(`, `)}))},retention:()=>{let e=this.builders.retention.validateConfig(n.retention,t);if(!e.isValid)throw Error(E(`server.errors.retentionValidationFailed`,{errors:e.errors.join(`, `)}))}})[Ke(e)]()}};function qr(e,t,n={},r){let i=n.keyPrefix??`drizzle-cube:`,a=Jr(e),o=`${i}query:${ti(JSON.stringify(a))}`;if(n.includeSecurityContext!==!1){let e=ti(n.securityContextSerializer?n.securityContextSerializer(t):JSON.stringify($r(t)));o+=`:ctx:${e}`}return r&&(o+=`:cubes:${r}`),o}function Jr(e){return{measures:e.measures?[...e.measures].sort():void 0,dimensions:e.dimensions?[...e.dimensions].sort():void 0,filters:e.filters?M(e.filters):void 0,timeDimensions:e.timeDimensions?Qr(e.timeDimensions):void 0,limit:e.limit,offset:e.offset,order:e.order?$r(e.order):void 0,fillMissingDatesValue:e.fillMissingDatesValue,ungrouped:e.ungrouped,total:e.total,funnel:e.funnel?Yr(e.funnel):void 0,flow:e.flow?Xr(e.flow):void 0,retention:e.retention?Zr(e.retention):void 0}}function Yr(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,steps:e.steps.map(e=>{let t={name:e.name,filter:e.filter?Array.isArray(e.filter)?M(e.filter):M([e.filter])[0]:void 0,timeToConvert:e.timeToConvert};return`cube`in e&&e.cube&&(t.cube=e.cube),t}),includeTimeMetrics:e.includeTimeMetrics,globalTimeWindow:e.globalTimeWindow}}function Xr(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,eventDimension:e.eventDimension,startingStep:{name:e.startingStep.name,filter:e.startingStep.filter?Array.isArray(e.startingStep.filter)?M(e.startingStep.filter):M([e.startingStep.filter])[0]:void 0},stepsBefore:e.stepsBefore,stepsAfter:e.stepsAfter,entityLimit:e.entityLimit,outputMode:e.outputMode,joinStrategy:e.joinStrategy}}function Zr(e){return{timeDimension:e.timeDimension,bindingKey:e.bindingKey,dateRange:e.dateRange,granularity:e.granularity,periods:e.periods,retentionType:e.retentionType,cohortFilters:e.cohortFilters?Array.isArray(e.cohortFilters)?M(e.cohortFilters):M([e.cohortFilters])[0]:void 0,activityFilters:e.activityFilters?Array.isArray(e.activityFilters)?M(e.activityFilters):M([e.activityFilters])[0]:void 0,breakdownDimensions:e.breakdownDimensions}}function M(e){return[...e].map(e=>{if(`and`in e&&e.and)return{and:M(e.and)};if(`or`in e&&e.or)return{or:M(e.or)};let t=e;return{...t,values:t.values?[...t.values].sort():t.values}}).sort((e,t)=>JSON.stringify(e).localeCompare(JSON.stringify(t)))}function Qr(e){return[...e].map(e=>({dimension:e.dimension,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange?[...e.compareDateRange].sort((e,t)=>{let n=Array.isArray(e)?e.join(`-`):e,r=Array.isArray(t)?t.join(`-`):t;return n.localeCompare(r)}):void 0})).sort((e,t)=>e.dimension.localeCompare(t.dimension))}function $r(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map($r):Object.keys(e).sort().reduce((t,n)=>(t[n]=$r(e[n]),t),{})}function ei(e){let t=2166136261;for(let n=0;n<e.length;n++)t=Math.imul(t^e.charCodeAt(n),16777619)>>>0;return t.toString(16).padStart(8,`0`)}function ti(e){let t=2166136261,n=2246822519,r=3266489917,i=668265263,a=16777619;for(let o=0;o<e.length;o++){let s=e.charCodeAt(o);t=Math.imul(t^s,a)>>>0,n=Math.imul(n^s+o&65535,a)>>>0,r=Math.imul(r^(s^o&255),a)>>>0,i=Math.imul(i^s+Math.imul(o,131)&65535,a)>>>0}return t=(t^e.length)>>>0,t.toString(16).padStart(8,`0`)+n.toString(16).padStart(8,`0`)+r.toString(16).padStart(8,`0`)+i.toString(16).padStart(8,`0`)}function ni(e,t){return`${t??`drizzle-cube:`}*${e}*`}var ri=class{cacheConfig;constructor(e){this.cacheConfig=e}generateKey(e,t,n){if(this.cacheConfig?.enabled!==!1&&this.cacheConfig?.provider)return qr(e,t,this.cacheConfig,n)}async lookup(e,t){if(e&&this.cacheConfig?.provider){if(t){this.cacheConfig.onCacheEvent?.({type:`miss`,key:e,durationMs:0});return}try{let t=Date.now(),n=await this.cacheConfig.provider.get(e);if(n)return this.cacheConfig.onCacheEvent?.({type:`hit`,key:e,durationMs:Date.now()-t}),{...n.value,cache:n.metadata?{hit:!0,cachedAt:new Date(n.metadata.cachedAt).toISOString(),ttlMs:n.metadata.ttlMs,ttlRemainingMs:n.metadata.ttlRemainingMs}:{hit:!0,cachedAt:new Date().toISOString(),ttlMs:0,ttlRemainingMs:0}};this.cacheConfig.onCacheEvent?.({type:`miss`,key:e,durationMs:Date.now()-t})}catch(e){this.cacheConfig.onError?.(e,`get`)}}}async store(e,t){if(e&&this.cacheConfig?.provider)try{let n=Date.now();await this.cacheConfig.provider.set(e,t,this.cacheConfig.defaultTtlMs??3e5),this.cacheConfig.onCacheEvent?.({type:`set`,key:e,durationMs:Date.now()-n})}catch(e){this.cacheConfig.onError?.(e,`set`)}}},ii=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=new Mt(e)}hasComparison(e){return ur(e)}getComparisonTimeDimension(e){return e.timeDimensions?.find(e=>e.compareDateRange&&e.compareDateRange.length>=2)}normalizePeriods(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n],i,a,o;if(typeof r==`string`){let e=this.dateTimeBuilder.parseRelativeDateRange(r);if(e)i=e.start,a=e.end,o=r;else{let e=new Date(r);if(!isNaN(e.getTime()))i=new Date(e),i.setUTCHours(0,0,0,0),a=new Date(e),a.setUTCHours(23,59,59,999),o=r;else continue}}else{if(i=new Date(r[0]),a=new Date(r[1]),isNaN(i.getTime())||isNaN(a.getTime()))continue;/^\d{4}-\d{2}-\d{2}$/.test(r[1])&&a.setUTCHours(23,59,59,999),o=`${r[0]} - ${r[1]}`}t.push({start:i,end:a,label:o,index:n})}return t}createPeriodQuery(e,t){return{...e,timeDimensions:e.timeDimensions?.map(e=>e.compareDateRange?{...e,dateRange:[t.start.toISOString(),t.end.toISOString()],compareDateRange:void 0}:e)}}calculatePeriodDayIndex(e,t,n){let r=typeof e==`string`?new Date(e):e,i=t.getTime(),a=r.getTime();switch(n){case`second`:return Math.floor((a-i)/1e3);case`minute`:return Math.floor((a-i)/6e4);case`hour`:return Math.floor((a-i)/36e5);case`day`:return Math.floor((a-i)/864e5);case`week`:return Math.floor((a-i)/6048e5);case`month`:{let e=t.getUTCFullYear(),n=t.getUTCMonth(),i=r.getUTCFullYear(),a=r.getUTCMonth();return(i-e)*12+(a-n)}case`quarter`:{let e=t.getUTCFullYear(),n=Math.floor(t.getUTCMonth()/3),i=r.getUTCFullYear(),a=Math.floor(r.getUTCMonth()/3);return(i-e)*4+(a-n)}case`year`:return r.getUTCFullYear()-t.getUTCFullYear();default:return Math.floor((a-i)/864e5)}}addPeriodMetadata(e,t,n,r){return e.map(e=>{let i=e[n],a=0;if(i){let e=typeof i==`string`?new Date(i):i instanceof Date?i:null;e&&!isNaN(e.getTime())&&(a=this.calculatePeriodDayIndex(e,t.start,r))}return{...e,__period:t.label,__periodIndex:t.index,__periodDayIndex:a}})}mergeComparisonResults(e,t,n){let r=[],i={measures:{},dimensions:{},segments:{},timeDimensions:{}},a=e.map(e=>e.period);for(let{result:a,period:o}of e){let e=this.addPeriodMetadata(a.data,o,t.dimension,n);r.push(...e),i={measures:{...i.measures,...a.annotation.measures},dimensions:{...i.dimensions,...a.annotation.dimensions},segments:{...i.segments,...a.annotation.segments},timeDimensions:{...i.timeDimensions,...a.annotation.timeDimensions}}}let o={ranges:a.map(e=>[e.start.toISOString().split(`T`)[0],e.end.toISOString().split(`T`)[0]]),labels:a.map(e=>e.label),timeDimension:t.dimension,granularity:n};return{data:r,annotation:{...i,periods:o}}}sortComparisonResults(e,t){return[...e].sort((e,n)=>{let r=e.__periodIndex-n.__periodIndex;if(r!==0)return r;let i=e[t],a=n[t];return typeof i==`string`&&typeof a==`string`?new Date(i).getTime()-new Date(a).getTime():0})}},ai=class{databaseAdapter;filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new Mt(e),this.filterBuilder=new ln(e,this.dateTimeBuilder)}hasFunnel(e){return dr(e)}validateConfig(e,t){let n=[];e.steps.length<2&&n.push(E(`server.validation.funnel.minSteps`)),this.validateBindingKey(e,t,n),this.validateTimeDimension(e,t,n);for(let r=0;r<e.steps.length;r++)this.validateStep(e,e.steps[r],r,t,n);return{isValid:n.length===0,errors:n}}validateBindingKey(e,t,n){if(typeof e.bindingKey==`string`){let[r,i]=e.bindingKey.split(`.`);if(!r||!i){n.push(E(`server.validation.funnel.invalidBindingKeyFormat`,{bindingKey:e.bindingKey}));return}let a=t.get(r);a?a.dimensions?.[i]||n.push(E(`server.validation.funnel.bindingKeyDimNotFound`,{dimName:i,cubeName:r})):n.push(E(`server.validation.funnel.bindingKeyCubeNotFound`,{cubeName:r}));return}if(Array.isArray(e.bindingKey))for(let r of e.bindingKey){let e=t.get(r.cube);if(!e){n.push(E(`server.validation.funnel.bindingKeyMappingCubeNotFound`,{cubeName:r.cube}));continue}let[,i]=r.dimension.split(`.`);e.dimensions?.[i]||n.push(E(`server.validation.funnel.bindingKeyDimNotFound`,{dimName:i,cubeName:r.cube}))}}validateTimeDimension(e,t,n){if(typeof e.timeDimension!=`string`)return;let[r,i]=e.timeDimension.split(`.`);if(!r||!i){n.push(E(`server.validation.funnel.invalidTimeDimFormat`,{timeDimension:e.timeDimension}));return}let a=t.get(r);a?a.dimensions?.[i]||n.push(E(`server.validation.funnel.timeDimNotFound`,{dimName:i,cubeName:r})):n.push(E(`server.validation.funnel.timeDimCubeNotFound`,{cubeName:r}))}validateStep(e,t,n,r,i){t.name||i.push(E(`server.validation.funnel.stepMustHaveName`,{step:n})),`cube`in t&&t.cube&&!r.get(t.cube)&&i.push(E(`server.validation.funnel.stepCubeNotFound`,{step:n,cube:t.cube})),t.filter&&this.validateStepFilters(e,t,n,r,i),t.timeToConvert&&n>0&&(/^P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/.test(t.timeToConvert)||i.push(E(`server.validation.funnel.stepTimeToConvertFormat`,{step:n,value:t.timeToConvert})))}validateStepFilters(e,t,n,r,i){let a;`cube`in t&&t.cube?a=t.cube:typeof e.bindingKey==`string`&&([a]=e.bindingKey.split(`.`));let o=a?new T(r):null,s=Array.isArray(t.filter)?t.filter:[t.filter];for(let e of s){if(!(`member`in e))continue;let[t,s]=e.member.split(`.`),c=r.get(t);if(!c){i.push(E(`server.validation.funnel.stepFilterCubeNotFound`,{step:n,cubeName:t}));continue}if(c.dimensions?.[s]||(c.measures?.[s]?i.push(E(`server.validation.funnel.stepFilterIsMeasure`,{step:n,member:`${t}.${s}`})):i.push(E(`server.validation.funnel.stepFilterMemberNotFound`,{step:n,field:s,cubeName:t}))),a&&t!==a&&o){let e=o.findPath(a,t);(!e||e.length===0)&&i.push(E(`server.validation.funnel.stepFilterNoJoinPath`,{step:n,member:`${t}.${s}`,stepCube:a}))}}}buildFunnelQuery(e,t,n){let r=this.resolveSteps(e,t,n),i=[];for(let e=0;e<r.length;e++){let t=e>0?i[e-1]:void 0;i.push(this.buildStepCTE(r[e],n,t))}let a=this.buildFunnelResultsCTE(i,r,e,n),o=this.buildAggregationCTE(a,i,r,e,n),s=[...i,a,o];return n.db.with(...s).select().from(o)}transformResult(e,t){if(!e||e.length===0)return[];let n=e[0],r=[],i=Number(n.step_0_count)||0;for(let e=0;e<t.steps.length;e++){let a=t.steps[e],o=Number(n[`step_${e}_count`])||0,s=e>0&&Number(n[`step_${e-1}_count`])||0,c={step:a.name,stepIndex:e,count:o,conversionRate:e===0?null:s>0?o/s:0,cumulativeConversionRate:i>0?o/i:0};t.includeTimeMetrics&&e>0&&this.applyTimeMetrics(c,n,e),r.push(c)}return r}applyTimeMetrics(e,t,n){let r=e=>t[e]===null?null:Number(t[e]);e.avgSecondsToConvert=r(`step_${n}_avg_seconds`),e.minSecondsToConvert=r(`step_${n}_min_seconds`),e.maxSecondsToConvert=r(`step_${n}_max_seconds`),t[`step_${n}_median_seconds`]!==void 0&&(e.medianSecondsToConvert=r(`step_${n}_median_seconds`)),t[`step_${n}_p90_seconds`]!==void 0&&(e.p90SecondsToConvert=r(`step_${n}_p90_seconds`))}extractFilterCubeNames(e){let t=new Set;if(!e.filter)return t;let n=Array.isArray(e.filter)?e.filter:[e.filter],r=e=>{let n=nn(e);if(`and`in e&&e.and)for(let t of e.and)r(t);else if(`or`in e&&e.or)for(let t of e.or)r(t);else if(n)for(let e of n.filters)r(e);else if(`member`in e){let[n]=e.member.split(`.`);t.add(n)}};for(let e of n)r(e);return t}resolveSteps(e,t,n){let r=new T(t);return e.steps.map((i,a)=>{let o=this.resolveCubeForStep(i,e,t),s=this.resolveBindingKey(e,o,n),c=this.resolveTimeDimension(e,o,n),l=this.buildStepFilters(i,o,t,n),u=this.extractFilterCubeNames(i),d=[];for(let e of u)if(e!==o.name){let n=t.get(e);if(n){let t=r.findPath(o.name,e);t&&t.length>0&&d.push({cube:n,joinPath:t})}}return{name:i.name,index:a,cube:o,bindingKeyExpr:s,timeExpr:c,filterConditions:l,timeToConvert:i.timeToConvert,joinedCubes:d}})}resolveCubeForStep(e,t,n){if(`cube`in e&&e.cube){let t=n.get(e.cube);if(!t)throw Error(E(`server.errors.funnel.cubeNotFoundForStep`,{cube:e.cube}));return t}if(typeof t.bindingKey==`string`){let[e]=t.bindingKey.split(`.`),r=n.get(e);if(!r)throw Error(E(`server.errors.funnel.cubeNotFoundForBindingKey`,{bindingKey:t.bindingKey}));return r}throw Error(E(`server.errors.funnel.cannotResolveCubeForStep`))}resolveBindingKey(e,t,n){return sn(e.bindingKey,t,n,an(`server.errors.funnel`))}resolveTimeDimension(e,t,n){return cn(e.timeDimension,t,n,`server.errors.funnel`)}buildStepFilters(e,t,n,r){if(!e.filter)return[];let i=Array.isArray(e.filter)?e.filter:[e.filter],a=[];for(let e of i){let i=this.buildFilterCondition(e,t,n,r);i&&a.push(i)}return a}buildFilterCondition(e,t,n,r){let i=`and`in e||`or`in e,a=nn(e);return i||a?this.buildLogicalFilterCondition(e,a,t,n,r):this.buildSimpleFilterCondition(e,t,n,r)}buildLogicalFilterCondition(e,t,r,i,a){let o,s;if(t)o=t.isAnd,s=t.filters;else{let t=e;o=`and`in t&&!!t.and,s=t.and||t.or||[]}let c=[];for(let e of s){let t=this.buildFilterCondition(e,r,i,a);t&&c.push(t)}return c.length===0?null:c.length===1?c[0]:o?(0,n.and)(...c):n.sql`(${n.sql.join(c,n.sql` OR `)})`}buildSimpleFilterCondition(e,t,n,r){let[i,a]=e.member.split(`.`),o=e.dateRange!==void 0;if(!en.has(e.operator)&&!o&&(!e.values||e.values.length===0||e.values[0]===void 0||e.values[0]===``))return null;let s=n.get(i);if(!s)return null;if(i!==t.name){let e=new T(n).findPath(t.name,i);if(!e||e.length===0)return null}let c=s.dimensions?.[a];if(!c)return null;let l=qe(c,r);return this.filterBuilder.buildFilterCondition(l,e.operator,e.values||[],c,e.dateRange)}buildStepCTE(e,t,n){return e.index===0?this.buildFirstStepCTE(e,t):this.buildSubsequentStepCTE(e,t,n)}buildFirstStepCTE(e,t){let r=`step_${e.index}`,i=e.cube.sql(t),a=[];i.where&&a.push(i.where),a.push(...e.filterConditions);let o=t.db.select({binding_key:n.sql`${e.bindingKeyExpr}`.as(`binding_key`),step_time:n.sql`MIN(${e.timeExpr})`.as(`step_time`)}).from(i.from);return o=this.addCrossJoinsToQuery(o,e,t,a),a.length>0&&(o=o.where(A(a))),o=o.groupBy(e.bindingKeyExpr),t.db.$with(r).as(o)}buildSubsequentStepCTE(e,t,r){let i=`step_${e.index}`,a=`step_${e.index-1}`,o=e.cube.sql(t),s=[];o.where&&s.push(o.where),s.push(...e.filterConditions);let c=n.sql`${n.sql.identifier(a)}.step_time`,l=n.sql`${e.timeExpr} > ${c}`;if(e.timeToConvert){let t=this.databaseAdapter.buildDateAddInterval(c,e.timeToConvert);l=n.sql`${l} AND ${e.timeExpr} <= ${t}`}s.push(l);let u=t.db.select({binding_key:n.sql`${e.bindingKeyExpr}`.as(`binding_key`),step_time:n.sql`MIN(${e.timeExpr})`.as(`step_time`)}).from(o.from).innerJoin(r,n.sql`${e.bindingKeyExpr} = ${n.sql.identifier(a)}.binding_key`);return u=this.addCrossJoinsToQuery(u,e,t,s),s.length>0&&(u=u.where(A(s))),u=u.groupBy(e.bindingKeyExpr),t.db.$with(i).as(u)}addCrossJoinsToQuery(e,t,r,i){if(t.joinedCubes.length===0)return e;for(let a of t.joinedCubes)for(let t of a.joinPath){let o=t.joinDef,s=[];for(let e of o.on)e.as?s.push(e.as(e.source,e.target)):s.push((0,n.eq)(e.source,e.target));let c=A(s),l=a.cube.sql(r);e=e.leftJoin(l.from,c),l.where&&i.push(l.where)}return e}buildFunnelResultsCTE(e,t,r,i){let a={binding_key:n.sql`s0.binding_key`,step_0_time:n.sql`s0.step_time`};for(let e=1;e<t.length;e++)a[`step_${e}_time`]=n.sql`s${n.sql.raw(String(e))}.step_time`;let o=n.sql`${n.sql.identifier(`step_0`)} s0`;for(let e=1;e<t.length;e++)o=n.sql`${o}
69
69
  LEFT JOIN ${n.sql.identifier(`step_${e}`)} s${n.sql.raw(String(e))} ON s0.binding_key = s${n.sql.raw(String(e))}.binding_key`;let s=Object.entries(a).map(([e,t])=>n.sql`${t} AS ${n.sql.identifier(e)}`),c=n.sql`SELECT ${n.sql.join(s,n.sql`, `)} FROM ${o}`;return i.db.$with(`funnel_joined`).as(c)}buildAggregationCTE(e,t,r,i,a){let o={};o.step_0_count=n.sql`COUNT(*)`.as(`step_0_count`);for(let e=1;e<r.length;e++)o[`step_${e}_count`]=n.sql`COUNT(${n.sql.identifier(`step_${e}_time`)})`.as(`step_${e}_count`);if(i.includeTimeMetrics)for(let e=1;e<r.length;e++){let t=n.sql.identifier(`step_${e}_time`),r=n.sql.identifier(`step_${e-1}_time`),i=this.databaseAdapter.buildTimeDifferenceSeconds(n.sql`${t}`,n.sql`${r}`),a=n.sql`${t} IS NOT NULL`;if(o[`step_${e}_avg_seconds`]=this.databaseAdapter.buildConditionalAggregation(`avg`,i,a).as(`step_${e}_avg_seconds`),o[`step_${e}_min_seconds`]=this.databaseAdapter.buildConditionalAggregation(`min`,i,a).as(`step_${e}_min_seconds`),o[`step_${e}_max_seconds`]=this.databaseAdapter.buildConditionalAggregation(`max`,i,a).as(`step_${e}_max_seconds`),this.databaseAdapter.getCapabilities().supportsPercentileSubqueries){let r=this.databaseAdapter.buildPercentile(i,50);r&&(o[`step_${e}_median_seconds`]=n.sql`(SELECT ${r} FROM ${n.sql.identifier(`funnel_joined`)} WHERE ${t} IS NOT NULL)`.as(`step_${e}_median_seconds`));let a=this.databaseAdapter.buildPercentile(i,90);a&&(o[`step_${e}_p90_seconds`]=n.sql`(SELECT ${a} FROM ${n.sql.identifier(`funnel_joined`)} WHERE ${t} IS NOT NULL)`.as(`step_${e}_p90_seconds`))}}let s=a.db.select(o).from(e);return a.db.$with(`funnel_metrics`).as(s)}},oi=class{filterBuilder;dateTimeBuilder;databaseAdapter;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new Mt(e),this.filterBuilder=new ln(e,this.dateTimeBuilder)}hasFlow(e){return fr(e)}validateConfig(e,t){let n=[],r=[],i=this.databaseAdapter.getEngineType(),a=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE;return i===`sqlite`?(n.push(E(`server.validation.flow.sqliteNotSupported`)),{isValid:!1,errors:n,warnings:r}):(this.validateBindingKey(e,t,n),typeof e.timeDimension==`string`&&this.validateMemberDimension(e.timeDimension,t,n,{invalidFormat:()=>E(`server.validation.flow.invalidTimeDimFormat`,{timeDimension:e.timeDimension}),cubeNotFound:e=>E(`server.validation.flow.timeDimCubeNotFound`,{cubeName:e}),dimNotFound:(e,t)=>E(`server.validation.flow.timeDimNotFound`,{dimName:e,cubeName:t})}),e.eventDimension?this.validateMemberDimension(e.eventDimension,t,n,{invalidFormat:()=>E(`server.validation.flow.invalidEventDimFormat`,{eventDimension:e.eventDimension}),cubeNotFound:e=>E(`server.validation.flow.eventDimCubeNotFound`,{cubeName:e}),dimNotFound:(e,t)=>E(`server.validation.flow.eventDimNotFound`,{dimName:e,cubeName:t})}):n.push(E(`server.validation.flow.eventDimRequired`)),this.validateStartingStep(e,n,r),this.validateDepthBounds(e,n,r),this.validateJoinStrategy(e,a,n),{isValid:n.length===0,errors:n,warnings:r})}validateMemberDimension(e,t,n,r){let[i,a]=e.split(`.`);if(!i||!a){n.push(r.invalidFormat());return}let o=t.get(i);o?o.dimensions?.[a]||n.push(r.dimNotFound(a,i)):n.push(r.cubeNotFound(i))}validateBindingKey(e,t,n){if(typeof e.bindingKey==`string`){this.validateMemberDimension(e.bindingKey,t,n,{invalidFormat:()=>E(`server.validation.flow.invalidBindingKeyFormat`,{bindingKey:e.bindingKey}),cubeNotFound:e=>E(`server.validation.flow.bindingKeyCubeNotFound`,{cubeName:e}),dimNotFound:(e,t)=>E(`server.validation.flow.bindingKeyDimNotFound`,{dimName:e,cubeName:t})});return}if(Array.isArray(e.bindingKey))for(let r of e.bindingKey){let e=t.get(r.cube);if(!e){n.push(E(`server.validation.flow.bindingKeyMappingCubeNotFound`,{cubeName:r.cube}));continue}let[,i]=r.dimension.split(`.`);e.dimensions?.[i]||n.push(E(`server.validation.flow.bindingKeyDimNotFound`,{dimName:i,cubeName:r.cube}))}}validateStartingStep(e,t,n){if(!e.startingStep){t.push(E(`server.validation.flow.startingStepRequired`));return}e.startingStep.filter||t.push(E(`server.validation.flow.startingStepFilterRequired`)),e.startingStep.name||n.push(E(`server.validation.flow.startingStepNameMissing`))}validateDepthBounds(e,t,n){(e.stepsBefore<0||e.stepsBefore>5)&&t.push(E(`server.validation.flow.stepsBeforeRange`,{value:e.stepsBefore})),(e.stepsAfter<0||e.stepsAfter>5)&&t.push(E(`server.validation.flow.stepsAfterRange`,{value:e.stepsAfter})),(e.stepsBefore>=4||e.stepsAfter>=4)&&n.push(E(`server.validation.flow.highStepDepthWarning`))}validateJoinStrategy(e,t,n){e.joinStrategy&&![`auto`,`lateral`,`window`].includes(e.joinStrategy)?n.push(E(`server.validation.flow.invalidJoinStrategy`,{joinStrategy:e.joinStrategy})):e.joinStrategy===`lateral`&&!t&&n.push(E(`server.validation.flow.lateralNotSupported`))}buildFlowQuery(e,t,n){if(this.databaseAdapter.getEngineType()===`sqlite`)throw Error(E(`server.validation.flow.sqliteNotSupported`));let r=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE,i=e.joinStrategy??`auto`,a=i===`lateral`||i===`auto`&&r;if(i===`lateral`&&!r)throw Error(E(`server.validation.flow.lateralNotSupportedExec`));let o={...e,stepsBefore:e.outputMode===`sunburst`?0:e.stepsBefore},s=this.resolveFlowConfig(o,t,n),c=[],l=this.buildStartingEntitiesCTE(o,s,n);c.push(l);let u=a?this.buildDirectionalCTEsLateral(`before`,o,s,n):this.buildDirectionalCTEsWindow(`before`,o,s,n);c.push(...u);let d=a?this.buildDirectionalCTEsLateral(`after`,o,s,n):this.buildDirectionalCTEsWindow(`after`,o,s,n);c.push(...d);let f=this.buildNodesAggregationCTE(o,n);c.push(f);let p=this.buildLinksAggregationCTE(o,n);c.push(p);let m=this.buildFinalResultCTE(n);return c.push(m),n.db.with(...c).select().from(m)}transformResult(e){if(!e||e.length===0)return{nodes:[],links:[]};let t=[],n=[];for(let r of e){let e=r.record_type;e===`node`?t.push({id:String(r.id),name:String(r.name),layer:Number(r.layer),value:Number(r.value)}):e===`link`&&n.push({source:String(r.source_id),target:String(r.target_id),value:Number(r.value)})}return t.sort((e,t)=>e.layer-t.layer),{nodes:t,links:n}}resolveFlowConfig(e,t,n){let r=this.resolveCube(e,t);return{cube:r,cubeBase:r.sql(n),bindingKeyExpr:this.resolveBindingKey(e,r,n),timeExpr:this.resolveTimeDimension(e,r,n),eventExpr:this.resolveEventDimension(e,r,n),startingStepFilters:this.buildStartingStepFilters(e,r,n)}}resolveCube(e,t){let n;if(typeof e.bindingKey==`string`)[n]=e.bindingKey.split(`.`);else if(Array.isArray(e.bindingKey)&&e.bindingKey.length>0)n=e.bindingKey[0].cube;else throw Error(E(`server.errors.flow.cannotResolveCube`));let r=t.get(n);if(!r)throw Error(E(`server.errors.flow.cubeNotFound`,{cubeName:n}));return r}resolveBindingKey(e,t,n){return sn(e.bindingKey,t,n,an(`server.errors.flow`))}resolveTimeDimension(e,t,n){return cn(e.timeDimension,t,n,`server.errors.flow`)}resolveEventDimension(e,t,n){let[,r]=e.eventDimension.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(E(`server.errors.flow.eventDimNotFound`,{eventDimension:e.eventDimension}));return w(i.sql,n)}buildStartingStepFilters(e,t,n){if(!e.startingStep.filter)return[];let r=Array.isArray(e.startingStep.filter)?e.startingStep.filter:[e.startingStep.filter],i=[];for(let e of r){let r=this.buildFilterCondition(e,t,n);r&&i.push(r)}return i}buildFilterCondition(e,t,n){if(`and`in e||`or`in e){let r=e,i=r.and||r.or||[],a=this.buildSubConditions(i,t,n);return this.combineConditions(a,`and`in e)}let r=nn(e);if(r){let e=this.buildSubConditions(r.filters,t,n);return this.combineConditions(e,r.isAnd)}let i=e,[,a]=i.member.split(`.`),o=t.dimensions?.[a];if(!o)return null;let s=qe(o,n);return this.filterBuilder.buildFilterCondition(s,i.operator,i.values||[],o,i.dateRange)}buildSubConditions(e,t,n){let r=[];for(let i of e){let e=this.buildFilterCondition(i,t,n);e&&r.push(e)}return r}combineConditions(e,t){return e.length===0?null:e.length===1?e[0]:t?(0,n.and)(...e):n.sql`(${n.sql.join(e,n.sql` OR `)})`}buildStartingEntitiesCTE(e,t,r){let{cubeBase:i,bindingKeyExpr:a,timeExpr:o,eventExpr:s,startingStepFilters:c}=t,l=[];i.where&&l.push(i.where),l.push(...c);let u=r.db.select({binding_key:n.sql`${a}`.as(`binding_key`),start_time:n.sql`MIN(${o})`.as(`start_time`),event_type:n.sql`${s}`.as(`event_type`),event_path:n.sql`${s}`.as(`event_path`)}).from(i.from);return l.length>0&&(u=u.where(A(l))),u=u.groupBy(a,s),e.entityLimit&&(u=u.limit(e.entityLimit)),r.db.$with(`starting_entities`).as(u)}buildDirectionalCTEsLateral(e,t,r,i){let{cubeBase:a,bindingKeyExpr:o,timeExpr:s,eventExpr:c}=r,l=[],u=t.outputMode===`sunburst`,d=e===`before`,f=d?t.stepsBefore:t.stepsAfter,p=d?n.sql`<`:n.sql`>`,m=d?n.sql`DESC`:n.sql`ASC`;for(let t=1;t<=f;t++){let r=t===1?`starting_entities`:`${e}_step_${t-1}`,f=t===1?`start_time`:`step_time`,h=`${e}_step_${t}`,g=[];a.where&&g.push(a.where),g.push(n.sql`${o} = ${n.sql.identifier(r)}.binding_key`,n.sql`${s} ${p} ${n.sql.identifier(r)}.${n.sql.identifier(f)}`);let _=A(g),v=u?d?n.sql`${c} || ${`→`} || ${n.sql.identifier(r)}.event_path`:n.sql`${n.sql.identifier(r)}.event_path || ${`→`} || ${c}`:n.sql`${c}`,y=i.db.select({binding_key:n.sql`${o}`.as(`binding_key`),step_time:n.sql`${s}`.as(`step_time`),event_type:n.sql`${c}`.as(`event_type`),event_path:v.as(`event_path`)}).from(a.from).where(_).orderBy(n.sql`${s} ${m}`).limit(1),b=i.db.$with(h).as(i.db.select({binding_key:n.sql`e.binding_key`.as(`binding_key`),step_time:n.sql`e.step_time`.as(`step_time`),event_type:n.sql`e.event_type`.as(`event_type`),event_path:n.sql`e.event_path`.as(`event_path`)}).from(n.sql`${n.sql.identifier(r)}`).crossJoinLateral(y.as(`e`)));l.push(b)}return l}buildDirectionalCTEsWindow(e,t,r,i){let{cubeBase:a,bindingKeyExpr:o,timeExpr:s,eventExpr:c}=r,l=[],u=t.outputMode===`sunburst`,d=e===`before`,f=d?t.stepsBefore:t.stepsAfter,p=d?n.sql`<`:n.sql`>`,m=d?n.sql`DESC`:n.sql`ASC`;for(let t=1;t<=f;t++){let r=t===1?`starting_entities`:`${e}_step_${t-1}`,f=t===1?`start_time`:`step_time`,h=`${e}_step_${t}`,g=[];a.where&&g.push(a.where),g.push(n.sql`${s} ${p} ${n.sql.identifier(r)}.${n.sql.identifier(f)}`);let _=A(g),v=u?d?n.sql`${c} || ${`→`} || ${n.sql.identifier(r)}.event_path`:n.sql`${n.sql.identifier(r)}.event_path || ${`→`} || ${c}`:n.sql`${c}`,y=i.db.select({binding_key:n.sql`${o}`.as(`binding_key`),step_time:n.sql`${s}`.as(`step_time`),event_type:n.sql`${c}`.as(`event_type`),event_path:v.as(`event_path`),rn:n.sql`ROW_NUMBER() OVER (PARTITION BY ${o} ORDER BY ${s} ${m})`.as(`rn`)}).from(a.from).innerJoin(n.sql`${n.sql.identifier(r)}`,n.sql`${o} = ${n.sql.identifier(r)}.binding_key`).where(_),b=i.db.select({binding_key:n.sql`binding_key`.as(`binding_key`),step_time:n.sql`step_time`.as(`step_time`),event_type:n.sql`event_type`.as(`event_type`),event_path:n.sql`event_path`.as(`event_path`)}).from(y.as(`ranked`)).where(n.sql`rn = 1`);l.push(i.db.$with(h).as(b))}return l}buildNodeArm(e,t,r,i){let a=n.sql.raw(`'${e}_'`),o=n.sql.raw(String(t)),s=n.sql.identifier(r);return i?n.sql`
@@ -820,9 +820,9 @@ type RetentionQuery = {
820
820
  `)}function hf(e){return e.messages.map(e=>e.content.text).join(`
821
821
 
822
822
  `)}function gf(e){return[`# Drizzle Cube Analytics Agent`,``,`You are an analytics agent that helps users explore and visualize data.`,`You have access to a semantic layer with cubes (data models) that you can query.`,``,`## Your Workflow`,``,`For EACH insight, follow this cycle — do NOT batch all queries first:`,``,"1. **Discover** available cubes using `discover_cubes` (once at the start)",`2. **For each analysis point**, repeat this cycle:`," a. `execute_query` — get the data"," b. `add_markdown` — explain the results and insight"," c. `add_portlet` — visualize the results",``,`Call all three (query → markdown → portlet) in a single turn before moving on to the next analysis.`,`Do NOT run multiple queries first and add charts later — the user sees results in real-time.`,``,`## Important Guidelines`,``,`- ALWAYS discover cubes first before attempting queries`,"- Field names MUST be EXACTLY `CubeName.fieldName` — two parts separated by a single dot. Examples: `PullRequests.count`, `Teams.name`, `Employees.department`."," WRONG patterns that WILL FAIL: `Teams.Teams.name` (double-prefixed), `PullRequests.PullRequests.count` (double-prefixed), `PullRequests` (bare cube), `Teams_count` (underscore). Use the EXACT field names from discover results — copy them verbatim, do not prefix them again.",`- Order keys MUST be one of the measures or dimensions already listed in that query. You CANNOT order by a field that is not in measures or dimensions — add it to measures first, or remove it from order.`,"- After EVERY `execute_query`, IMMEDIATELY call `add_markdown` and `add_portlet` in the SAME turn — never defer visualizations to a later turn",`- Choose the chart type from the Chart Selection Guide below — match the chart to the question being asked, and vary chart types across the notebook`,`- If a query fails, explain the error and try an alternative approach`,``,`## Output Format Rules`,``,`### CRITICAL: Always think before acting`,`- EVERY single turn MUST begin with a text message (1-2 sentences) BEFORE any tool calls. This is your #1 rule — never violate it.`,`- This applies to EVERY turn, including turns where you are adding visualizations or explanations to the notebook.`,`- Even when adding multiple charts in sequence, each turn must start with a brief status like "Now I'll chart the productivity breakdown." or "Next, let me show the department comparison."`,`- Example good turn: "Let me see what data is available." → discover_cubes`,`- Example good turn: "I'll add a chart showing the top employees." → add_markdown → add_portlet`,`- Example bad turn: (no text) → add_portlet ← NEVER do this`,``,`### Text vs Notebook`,"- ALL analysis, findings, methodology, and insights MUST go through `add_markdown` tool calls — never in your text responses",`- Your text responses must be 1-2 short sentences (under 50 words) summarizing what you are about to do next — status updates only`,`- Never use markdown formatting (headers, bullets, bold, code blocks) in text responses — plain sentences only`,`- Write text responses as a friendly analyst would — use plain business language the user understands`,`- NEVER mention internal terms like "cube", "query syntax", "field names", "measures", "dimensions", "portlet", "prefix format", or tool names in text responses`,`- Instead of "Let me correct the query syntax and retry" → "Let me fix that and try again"`,`- Instead of "I'll query the PullRequests cube" → "I'll look at the pull request data"`,`- Instead of "Adding a portlet with the results" → "Here's a chart of the results"`,``,`### Notebook content rules`,"- Before each `add_portlet`, ALWAYS call `add_markdown` first to explain WHY you are adding this visualization and what it shows","- Before calling `add_portlet`, verify the query is valid: all fields in `order` must also appear in `measures` or `dimensions`",'- Never put data tables in markdown blocks — use `add_portlet` with chartType "table" instead',"- If a chart you already added is wrong, or the user asks to change one, call `update_portlet` with its id — do NOT add a second chart of the same data","- Think out loud in the notebook: use `add_markdown` to share your reasoning at each step so users can follow along",`- NEVER use emojis in text responses or markdown content — no 📊, 📈, ✅, 🔍, etc. Write in plain, professional language.`,``,`### Analysis Depth and Layout`,``,`- A good notebook answers the question and then earns its keep: aim for 4-6 distinct insights unless the user asked something narrow.`,`- Vary the angle, not just the chart: overall level → breakdown by a dimension → trend over time → outliers or concentration → a caveat about the data.`,`- Actively look for the surprising thing: the biggest mover, the outlier, the category carrying most of the total, the segment moving against the trend. Say so in the markdown, plainly.`,`- Never add a chart that restates the previous chart with a different chart type.`,`- Structure the notebook like a short report: a scene-setting markdown block, then alternating markdown/chart pairs, then a closing block with the takeaways and what you could NOT determine from the available data.`,`- If a result is boring — flat, evenly distributed, or too few rows to mean anything — say that in the markdown and move to a different angle rather than charting it.`,``,`## Chart Selection Guide`,``,`Pick the chart that answers the question, not the one that is easiest. Consider how many rows came back, whether the values are categorical or temporal, and whether the user is comparing, trending, or summarising. Do NOT default to the first option in this table.`,``,"`execute_query` returns a `dataShape` summary alongside the rows — use it. `distinctCount` on the dimension you are charting is the single most useful signal: 2-7 favours a part-of-whole treatment, 8-25 a ranking, and above that take a top-N with `order` + `limit` or show a table instead. Widely different `min`/`max` across measures means you need `yAxisAssignment`.",``,"Only the first rows are returned to you. When `truncated` is true the chart is still correct — the portlet re-runs the query itself — but do NOT state totals, counts or extremes you cannot see; use `rowCount` and `dataShape`, or run a narrower query.",``,`| Question the user is asking | Chart |`,`|---|---|`,"| Compare discrete categories or rankings | `bar` |","| Trend over time (one or few series) | `line` |","| Trend over time showing volume/magnitude | `area` |","| Part-of-whole breakdown | `pie` (2-7 slices) or `proportionBar` (one stacked bar, easier to read) |","| Contributions summing to a total, with signed ups and downs | `waterfall` (deltas only, never raw totals) |","| Long tail or nested breakdown, many categories | `treemap` |","| Categories as compact circular progress | `radialBar` |","| Correlation between two measures | `scatter` |","| Correlation with size/colour third dimension | `bubble` |","| Intensity across two categorical dimensions | `heatmap` (set `valueField`) |","| Activity per day across weeks or months | `activityGrid` (needs a `day`-granularity time dimension; set `dateField` and `valueField`) |","| Multi-variable comparison across categories | `radar` |","| Distribution/spread, summarised | `boxPlot` |","| Distribution/spread, every individual value | `dotStrip` |","| A shape across ordered measures (e.g. -2m, at event, +2h) | `measureProfile` (2+ measures on a comparable scale) |","| Detailed row-level data or many columns | `table` (aggregates) or `recordsTable` (one row per record) |","| Progress toward a known target or limit | `gauge` (ALWAYS set `maxValue`, or it scales to the data and reads as 100%) |","| Open/high/low/close price or range data | `candlestick` (put the measures in `yAxis` in OHLC order) |","| Narrative, caveats, methodology | `markdown` |","| Single headline number — ONLY when user explicitly asks for a KPI card or single number | `kpiNumber` |","| Headline metric with period-over-period change — ONLY when user asks about change in a single metric | `kpiDelta` |","| Headline number inside a sentence — same restraint as kpiNumber | `kpiText` |",``,`Analysis-mode-specific chart types (require the corresponding analysis mode):`,``,`| Analysis Mode | Chart Type | Description |`,`|---|---|---|`,"| Funnel | `funnel` | Sequential step conversion bars with conversion rates |","| Flow | `sankey` | Flow diagram showing paths between states/steps |","| Flow | `sunburst` | Radial rings showing forward paths from a starting event |","| Retention | `retentionHeatmap` | Cohort × period retention matrix |","| Retention | `retentionCombined` | Retention with line chart, heatmap, or combined modes |",``,"**Vary the chart types across a notebook.** A notebook of nothing but bars and tables is a failure even when every chart is individually valid. `kpiNumber`/`kpiDelta`/`kpiText` are a last resort — use them only when the user explicitly asks for a single headline number, never for a multi-row result.",``,'`recordsTable` lists one row per record, so its query MUST set `"ungrouped": true` — which also means one cube plus its to-one joins, since an ungrouped query cannot span a hasMany relationship.',``,`## Chart Axis Configuration Rules`,``,"**Bar charts need an xAxis dimension.** A bar chart over a measures-only query has no category axis to label its bars; if you send one it is converted to a `table` (or `kpiNumber` for a single measure) and you are told so. To get a real bar chart, put the category in the query's `dimensions` and use a single measure. To compare several measures as an ordered shape, use `measureProfile`.",``,"**Never duplicate xAxis in series.** Putting the same dimension in both `xAxis` and `series` creates a sparse, broken-looking chart. The `series` field is ONLY for splitting bars into grouped/stacked sub-series by a SECOND dimension.",``,`Correct bar chart examples:`,'- Categories only: `xAxis: ["Cube.category"], yAxis: ["Cube.count"]` — no series needed','- Grouped bars: `xAxis: ["Cube.category"], yAxis: ["Cube.count"], series: ["Cube.status"]` — series is a DIFFERENT dimension','- Multiple measures: `xAxis: ["Cube.category"], yAxis: ["Cube.count", "Cube.total"]` — each measure becomes a bar group',``,`Wrong:`,'- `xAxis: [], yAxis: ["Cube.avg1", "Cube.avg2"]` — missing xAxis, bars have no labels','- `xAxis: ["Cube.size"], series: ["Cube.size"]` — same field in both, creates sparse chart',``,"**Dual Y-axis for multi-measure charts.** When a `bar`, `line`, or `area` chart has 2+ measures with different scales (e.g. revenue in thousands vs conversion rate as a percentage), use `chartConfig.yAxisAssignment` to put them on separate axes:","```json",`{`,` "xAxis": ["Sales.month"],`,` "yAxis": ["Sales.revenue", "Sales.conversionRate"],`,` "yAxisAssignment": { "Sales.revenue": "left", "Sales.conversionRate": "right" }`,`}`,"```",`Only use dual axis when measures have genuinely different scales. If both measures share the same unit/scale, keep them on the same (left) axis — omit yAxisAssignment entirely.`,``,`## Analysis Mode Decision Tree`,``,`The default mode is **query** (standard measures/dimensions). Switch to a special mode only when the user's question matches:`,``,`- **Funnel mode** — "What is the conversion rate from step A → B → C?"`," - Requires: an event-stream cube with `capabilities.funnel = true` from `discover_cubes`"," - Execute: `execute_query` with `funnel` param:",' `{ bindingKey: "Events.userId", timeDimension: "Events.timestamp", steps: [{ name: "Signup", filter: { member: "Events.eventName", operator: "equals", values: ["signup"] }}, { name: "Purchase", filter: { member: "Events.eventName", operator: "equals", values: ["purchase"] }}] }`',' - Visualize: `add_portlet` with `chartType: "funnel"` and `query` as JSON string containing `{ "funnel": { ... } }`',``,`- **Flow mode** — "What paths do users take after signup?"`," - Requires: `capabilities.flow = true` from `discover_cubes`"," - Execute: `execute_query` with `flow` param:",' `{ bindingKey: "Events.userId", timeDimension: "Events.timestamp", eventDimension: "Events.eventName", startingStep: { name: "Signup", filter: { member: "Events.eventName", operator: "equals", values: ["signup"] }}, stepsBefore: 0, stepsAfter: 3 }`',' - Visualize: `add_portlet` with `chartType: "sankey"` (or `"sunburst"`) and `query` as JSON string containing `{ "flow": { ... } }`',``,`- **Retention mode** — "What % of users come back after 7 days?"`," - Requires: `capabilities.retention = true` from `discover_cubes`"," - Execute: `execute_query` with `retention` param:",' `{ timeDimension: "Events.timestamp", bindingKey: "Events.userId", dateRange: { start: "2024-01-01", end: "2024-03-31" }, granularity: "week", periods: 8, retentionType: "classic" }`',' - Visualize: `add_portlet` with `chartType: "retentionCombined"` (or `"retentionHeatmap"`) and `query` as JSON string containing `{ "retention": { ... } }`',``,"Before using funnel/flow/retention, check the `capabilities` object returned by `discover_cubes`. If the required capability is `false`, explain to the user that the data model does not support that analysis mode.",``,`Event-stream cubes are marked in the Available Cubes section below with **Event Stream: Yes** and list their binding key and time dimension.`,``,`---`,``,lf,``,`---`,``,hf(sf),``,`---`,``,hf(cf),``,`---`,``,`## Save as Dashboard`,``,"ONLY call `save_as_dashboard` when the user EXPLICITLY asks to save, export, or convert the notebook into a dashboard. NEVER save a dashboard on your own initiative — wait for the user to request it.",``,`### Layout Rules`,`- Dashboard grid is 12 columns wide`,`- KPI cards: w=3, h=3 — place at the top in a row of 4`,`- Overview charts (bar, line, area): w=6, h=4`,`- Wide charts (heatmap, table, recordsTable): w=12, h=5`,`- Section headers (markdown): w=12, h=1`,``,`### Section Headers`,'Use `chartType: "markdown"` portlets as section headers to organize the dashboard:',"```json",`{`,` "id": "header-overview",`,` "title": "Overview",`,` "chartType": "markdown",`,` "displayConfig": {`,` "content": "## Overview",`,` "hideHeader": true,`,` "transparentBackground": true,`,` "autoHeight": true`,` },`,` "w": 12, "h": 1, "x": 0, "y": 0`,`}`,"```",``,`### Dashboard Filters`,"- ALWAYS include a universal date filter with `isUniversalTime: true`",'- A universal date filter only reaches portlets through their `timeDimensions`. For KPI or breakdown portlets without a time dimension, map it as `{ filterId, member: "<Cube.timeField>" }` so it filters that field instead of leaving the portlet unfiltered',`- Add dimension filters for key fields used across portlets (e.g., department, status, region)`,`- Use human-readable labels (e.g., "Department" not "Employees.departmentName")`,"- Map filters to portlets using `dashboardFilterMapping` — list the filter IDs that apply","- To apply a filter to a different field for one portlet, use `{ filterId, member }` instead of a plain ID (e.g. remap a Customer filter to `Invoices.customerId`); the target field must be join-reachable from the portlet query",`- When promoting a hardcoded filter to a dashboard filter, REMOVE that filter from the portlet query`,``,`### Analysis Types`,'- Standard query portlets: `analysisType: "query"` (default)','- Funnel portlets: `analysisType: "funnel"`, query contains `{ "funnel": {...} }`, chartType `"funnel"`','- Flow portlets: `analysisType: "flow"`, query contains `{ "flow": {...} }`, chartType `"sankey"` or `"sunburst"`','- Retention portlets: `analysisType: "retention"`, query contains `{ "retention": {...} }`, chartType `"retentionHeatmap"` or `"retentionCombined"`',``,`### CRITICAL: Only use portlets from the notebook`,"- ONLY include portlets that you already added to the notebook via `add_portlet` during this conversation",`- Do NOT invent new queries or charts that were not part of the analysis — the dashboard is a direct conversion of the notebook`,`- Reuse the exact same queries, chart types, and chart configs from the notebook portlets`,`- Arrange the existing portlets in a sensible layout (KPIs at top, charts in middle, tables at bottom)`,`- You may add section header markdown portlets to organize the layout, but do not add new data portlets`,``,`---`,``,mf(e)].join(`
823
- `)}var _f={funnel:{description:`Track conversion through sequential steps. Entities (identified by bindingKey) move through ordered steps.`,structure:{funnel:{bindingKey:`Cube.dimension - identifies entities moving through funnel`,timeDimension:`Cube.dimension - time field for ordering events`,steps:[{name:`string - human readable step name`,filter:`{ member, operator, values } or array of filters. Put inDateRange ONLY on step 0.`,timeToConvert:`optional - ISO 8601 duration e.g. "P7D" for 7 days, "PT1H" for 1 hour`}],includeTimeMetrics:`optional boolean - include avg/median/p90 time-to-convert`,globalTimeWindow:`optional - ISO 8601 duration, all steps must complete within this window`}}},flow:{description:`Analyze paths users take before/after a specific event. Shows event sequences as Sankey/sunburst.`,structure:{flow:{bindingKey:`Cube.dimension - identifies entities`,timeDimension:`Cube.dimension - time field for ordering`,eventDimension:`Cube.dimension - the event type field (values become node labels)`,startingStep:{name:`string - display name for the starting step`,filter:`{ member, operator, values } - filter identifying the starting event`},stepsBefore:`number (0-5) - how many steps to show before starting step`,stepsAfter:`number (0-5) - how many steps to show after starting step`,entityLimit:`optional number - max entities to process (performance)`,outputMode:`optional "sankey" | "sunburst" (default: sankey)`}}},retention:{description:`Measure how many users return over time periods after initial activity.`,structure:{retention:{timeDimension:`Cube.dimension - time field for cohort assignment`,bindingKey:`Cube.dimension - identifies entities`,dateRange:{start:`YYYY-MM-DD - cohort start date`,end:`YYYY-MM-DD - cohort end date`},granularity:`day | week | month - period size`,periods:`number - how many periods to analyze`,retentionType:`"classic" (returned in period N) | "rolling" (returned in N or later)`,cohortFilters:`optional - filters on cohort entry events`,activityFilters:`optional - filters on return activity events`,breakdownDimensions:`optional string[] - segment by these dimensions`}}}};function vf(e,t,n){let r=0,i=t.name.split(`.`).pop()||t.name;return r=Math.max(r,n.fuzzyMatchScore(e,i)),r=Math.max(r,n.fuzzyMatchScore(e,t.title)),t.description&&(r=Math.max(r,n.fuzzyMatchScore(e,t.description)*.8)),t.synonyms&&(r=Math.max(r,n.matchAgainstArray(e,t.synonyms))),r}function yf(e,t,n,r,i){let a=0;for(let o of t){let t=vf(e,o,n);if(t>.4){a+=t,i.hit=!0;let e=r.get(o.name)||0;r.set(o.name,Math.max(e,t))}}return a}function bf(e,t){return Array.from(e.entries()).sort((e,t)=>t[1]-e[1]).slice(0,t).map(([e])=>e)}function xf(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function Sf(e,t){let n=new Set(t),r={};for(let t of e)n.has(t.name)&&t.title&&xf(t.name.split(`.`).pop()||t.name)!==xf(t.title)&&(r[t.name]=t.title);return Object.keys(r).length>0?r:void 0}function Cf(e,t,n){let r=t.name.split(`.`).pop()||t.name,i=n.fuzzyMatchScore(e,r);return i=Math.max(i,n.fuzzyMatchScore(e,t.title)),t.synonyms&&(i=Math.max(i,n.matchAgainstArray(e,t.synonyms))),i}function wf(e,t){if(e.length>500||t.length>500)return e.length+t.length;let n=[];for(let e=0;e<=t.length;e++)n[e]=[e];for(let t=0;t<=e.length;t++)n[0][t]=t;for(let r=1;r<=t.length;r++)for(let i=1;i<=e.length;i++)t.charAt(r-1)===e.charAt(i-1)?n[r][i]=n[r-1][i-1]:n[r][i]=Math.min(n[r-1][i-1]+1,n[r][i-1]+1,n[r-1][i]+1);return n[t.length][e.length]}function Tf(e,t){let n=e.toLowerCase().trim(),r=t.toLowerCase().trim();if(n===r)return 1;if(r.includes(n))return .9;let i=r.split(/[\s_-]+/);for(let e of i){if(e===n)return .85;if(e.startsWith(n))return .75}let a=1-wf(n,r)/Math.max(n.length,r.length);return a>.5?a*.7:0}function Ef(e,t){let n=0;for(let r of t){let t=Tf(e,r);t>n&&(n=t)}return n}function Df(e){let t=new Set(`a.an.the.is.are.was.were.be.been.being.have.has.had.do.does.did.will.would.could.should.may.might.must.can.and.or.but.if.then.else.when.where.why.how.what.which.who.this.that.these.those.i.me.my.we.our.you.your.he.she.it.they.them.their.in.on.at.to.for.of.with.by.from.up.down.out.over.under.about.into.through.during.before.after.above.below.between.show.me.get.find.list.give.tell.display.want.need.see.know`.split(`.`));return e.toLowerCase().replace(/[^\w\s]/g,` `).split(/\s+/).filter(e=>e.length>2&&!t.has(e))}var Of={fuzzyMatchScore:Tf,matchAgainstArray:Ef};function kf(e,t,n){let r=0,i=Tf(e,t.name);i>.5&&(r+=i*2,n.includes(`name`)||n.push(`name`));let a=Tf(e,t.title);if(a>.5&&(r+=a*1.5,n.includes(`title`)||n.push(`title`)),t.description){let i=Tf(e,t.description);i>.3&&(r+=i,n.includes(`description`)||n.push(`description`))}if(t.exampleQuestions)for(let i of t.exampleQuestions){let t=Tf(e,i);t>.3&&(r+=t*1.5,n.includes(`exampleQuestions`)||n.push(`exampleQuestions`))}return r}function Af(e,t){let n=0,r=[],i=new Map,a=new Map;for(let o of t){n+=kf(o,e,r);let t={hit:!1};n+=yf(o,e.measures,Of,i,t),t.hit&&!r.includes(`measures`)&&r.push(`measures`);let s={hit:!1};n+=yf(o,e.dimensions,Of,a,s),s.hit&&!r.includes(`dimensions`)&&r.push(`dimensions`)}return{score:Math.min(1,n/(t.length*2)),matchedOn:r,suggestedMeasures:bf(i,5),suggestedDimensions:bf(a,5)}}function jf(e){let t=!!e.meta?.eventStream,n=e.dimensions.some(e=>e.type===`time`),r=e.dimensions.some(t=>t.name.toLowerCase().includes(`id`)||t.type===`number`||e.meta?.eventStream?.bindingKey&&t.name===e.meta.eventStream.bindingKey),i=t||n&&r;return{query:!0,funnel:i,flow:i,retention:i}}function Mf(e){let t=jf(e);if(!t.funnel&&!t.flow&&!t.retention)return;let n=[];if(e.meta?.eventStream?.bindingKey){let t=e.dimensions.find(t=>t.name===e.meta?.eventStream?.bindingKey);n.push({dimension:e.meta.eventStream.bindingKey,description:t?.description||`Configured binding key`})}for(let t of e.dimensions)(t.name.split(`.`).pop()?.toLowerCase()||``).includes(`id`)&&!n.some(e=>e.dimension===t.name)&&n.push({dimension:t.name,description:t.description||`Potential entity identifier`});let r=[];if(e.meta?.eventStream?.timeDimension){let t=e.dimensions.find(t=>t.name===e.meta?.eventStream?.timeDimension);r.push({dimension:e.meta.eventStream.timeDimension,description:t?.description||`Configured time dimension`})}for(let t of e.dimensions)t.type===`time`&&!r.some(e=>e.dimension===t.name)&&r.push({dimension:t.name,description:t.description});let i=[];for(let t of e.dimensions){let e=t.name.split(`.`).pop()?.toLowerCase()||``;t.type===`string`&&(e.includes(`type`)||e.includes(`event`)||e.includes(`status`)||e.includes(`state`)||e.includes(`action`))&&i.push({dimension:t.name,description:t.description||`Potential event type dimension`})}return{candidateBindingKeys:n,candidateTimeDimensions:r,candidateEventDimensions:i}}function Nf(e,t){let n=[];if(!t)return n;if(t.candidateBindingKeys.length>1&&n.push(`Choose bindingKey based on what entity to track through the analysis`),t.candidateEventDimensions.length>0){let e=t.candidateEventDimensions[0].dimension;n.push(`Query ${e} dimension to discover available values for funnel steps`)}return n.push(`Use /mcp/load with a standard query to discover dimension values before building analysis queries`),n}function Pf(e,t={}){let{topic:n,intent:r,limit:i=10,minScore:a=.1}=t,o=[n,r].filter(Boolean).join(` `);if(!o.trim())return e.slice(0,i).map(e=>{let t=jf(e),n=Mf(e),r=Nf(e,n),i=t.funnel||t.flow||t.retention,a=e.measures.slice(0,5).map(e=>e.name),o=e.dimensions.slice(0,5).map(e=>e.name);return{cube:e.name,title:e.title,description:e.description,relevanceScore:1,matchedOn:[],suggestedMeasures:a,suggestedDimensions:o,fieldTitles:Sf([...e.measures,...e.dimensions],[...a,...o]),capabilities:t,analysisConfig:n,hints:r.length>0?r:void 0,querySchemas:i?_f:void 0}});let s=Df(o);if(s.length===0)return[];let c=[];for(let t of e){let{score:e,matchedOn:n,suggestedMeasures:r,suggestedDimensions:i}=Af(t,s);if(e>=a){let a=jf(t),o=Mf(t),s=Nf(t,o),l=a.funnel||a.flow||a.retention;c.push({cube:t.name,title:t.title,description:t.description,relevanceScore:e,matchedOn:n,suggestedMeasures:r,suggestedDimensions:i,fieldTitles:Sf([...t.measures,...t.dimensions],[...r,...i]),capabilities:a,analysisConfig:o,hints:s.length>0?s:void 0,querySchemas:l?_f:void 0})}}return c.sort((e,t)=>t.relevanceScore-e.relevanceScore).slice(0,i)}function Ff(e,t,n){let r=null,i=(e,n,i)=>{for(let a of n){let n=Cf(t,a,Of);n>.5&&(!r||n>r.score)&&(r={field:a.name,cube:e.name,score:n,type:i})}};for(let t of e)(!n||n===`measure`)&&i(t,t.measures,`measure`),(!n||n===`dimension`)&&i(t,t.dimensions,`dimension`);return r}var If=cf.messages[0]?.content.text??``;async function Lf(e,t,n){return{cubes:Pf(e.getMetadata(t),{topic:n.topic,intent:n.intent,limit:n.limit,minScore:n.minScore}),queryLanguageReference:of,dateFilteringGuide:If}}function Rf(e){let t=e.split(`.`);return t.length===3&&t[0]===t[1]?`${t[0]}.${t[2]}`:e}function zf(e){let t=e=>{if(Array.isArray(e))return e.map(e=>typeof e==`string`?Rf(e):e)};if(Array.isArray(e.measures)&&(e.measures=t(e.measures)),Array.isArray(e.dimensions)&&(e.dimensions=t(e.dimensions)),Array.isArray(e.filters))for(let t of e.filters)typeof t.member==`string`&&(t.member=Rf(t.member));if(Array.isArray(e.timeDimensions))for(let t of e.timeDimensions)typeof t.dimension==`string`&&(t.dimension=Rf(t.dimension));return Array.isArray(e.order)&&(e.order=Bf(e.order)),e.order&&typeof e.order==`object`&&!Array.isArray(e.order)&&(e.order=Uf(e.order,e)),e}function Bf(e){let t={};for(let n of e)n&&typeof n==`object`&&Object.assign(t,n);return t}function Vf(e){return new Set([...Array.isArray(e.measures)?e.measures:[],...Array.isArray(e.dimensions)?e.dimensions:[]])}function Hf(e,t){let n=Rf(e);if(t.has(n))return n;if(!e.includes(`.`)&&e.includes(`_`)){let n=Rf(e.replace(/_/g,`.`));if(t.has(n))return n;let r=[...t].find(t=>{let n=t.split(`.`)[1];return n&&(e.endsWith(`_${n}`)||e.endsWith(`.${n}`))});if(r)return r}return t.size>0&&!t.has(n)?null:n}function Uf(e,t){let n=Vf(t),r={};for(let[t,i]of Object.entries(e)){let e=Hf(t,n);e!==null&&(r[e]=i)}if(Object.keys(r).length===0&&n.size>0){let e=Array.isArray(t.measures)?t.measures[0]:void 0;e&&(r[e]=`desc`)}return r}async function Wf(e,t,n){let r=zf(n.query),i=e.validateQuery(r,t);if(!i.isValid)throw Error(`Query validation failed: ${i.errors.join(`, `)}`);let a=await e.executeMultiCubeQuery(r,t);return{data:a.data,annotation:a.annotation,query:r,...a.total===void 0?{}:{total:a.total}}}var Gf=e.n({barChartConfig:()=>Kf}),Kf={clickableElements:{bar:!0},dropZones:[{key:`xAxis`,label:`chart.dropZone.xAxis.label`,description:`chart.dropZone.xAxis.description`,mandatory:!1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.bar.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.dropZone.yAxis.label`,description:`chart.configText.measures_for_bar_heights`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.bar.dropZone.yAxis.empty`,enableDualAxis:!0},{key:`series`,label:`chart.dropZone.series.label`,description:`chart.dropZone.series.description`,mandatory:!1,acceptTypes:[`dimension`],emptyText:`chart.bar.dropZone.series.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`showAllXLabels`,`hideHeader`],displayOptionsConfig:[t.u(`chart.configText.how_to_stack_multiple_bar_series`),t.d,t.n,t.i,t.s]},qf=e.n({lineChartConfig:()=>Jf}),Jf={clickableElements:{point:!0},dropZones:[{key:`xAxis`,label:`chart.configText.x_axis_time_categories`,description:`chart.configText.time_dimensions_or_dimensions_for_x_axis`,mandatory:!0,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.line.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.dropZone.yAxis.label`,description:`chart.configText.measures_for_line_values`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.line.dropZone.yAxis.empty`,enableDualAxis:!0},{key:`series`,label:`chart.configText.series_multiple_lines`,description:`chart.configText.dimensions_to_create_separate_lines`,mandatory:!1,acceptTypes:[`dimension`],emptyText:`chart.line.dropZone.series.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`showAllXLabels`,`hideHeader`],displayOptionsConfig:[t.l,t.c(),t.t,t.n,t.d,{key:`priorPeriodStyle`,label:`chart.option.priorPeriodStyle.label`,type:`select`,defaultValue:`dashed`,options:[{value:`dashed`,label:`chart.option.priorPeriodStyle.dashed`},{value:`dotted`,label:`chart.option.priorPeriodStyle.dotted`},{value:`solid`,label:`chart.option.priorPeriodStyle.solid`}],description:`chart.option.priorPeriodStyle.description`},{key:`priorPeriodOpacity`,label:`chart.option.priorPeriodOpacity.label`,type:`number`,defaultValue:.5,min:.1,max:1,step:.1,description:`chart.option.priorPeriodOpacity.description`},t.i,t.s]},Yf=e.n({areaChartConfig:()=>Xf}),Xf={dropZones:[{key:`xAxis`,label:`chart.configText.x_axis_time_categories`,description:`chart.configText.time_dimensions_or_dimensions_for_x_axis`,mandatory:!0,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.area.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.dropZone.yAxis.label`,description:`chart.configText.measures_for_area_values`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.area.dropZone.yAxis.empty`,enableDualAxis:!0},{key:`series`,label:`chart.configText.series_stack_areas`,description:`chart.configText.dimensions_to_create_stacked_areas`,mandatory:!1,acceptTypes:[`dimension`],emptyText:`chart.area.dropZone.series.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`showAllXLabels`,`hideHeader`],displayOptionsConfig:[t.l,t.c(!1),t.u(`chart.configText.how_to_stack_multiple_area_series`),t.t,t.n,t.d,t.i,t.s]},Zf=e.n({pieChartConfig:()=>Qf}),Qf={clickableElements:{slice:!0},dropZones:[{key:`xAxis`,label:`chart.configText.categories`,description:`chart.configText.dimension_for_pie_slices`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.pie.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.values`,description:`chart.configText.measure_for_slice_sizes`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.pie.dropZone.yAxis.empty`}],displayOptions:[`showLegend`,`showTooltip`,`hideHeader`],displayOptionsConfig:[{key:`innerRadius`,label:`chart.option.innerRadius.label`,type:`select`,description:`chart.configText.hollow_center_size_0_percent_solid_pie_higher_donut_style`,defaultValue:`0%`,options:[{value:`0%`,label:`chart.configText.none_pie`},{value:`20%`,label:`chart.configText.20_percent`},{value:`40%`,label:`chart.configText.40_percent`},{value:`60%`,label:`chart.configText.60_percent`},{value:`80%`,label:`chart.configText.80_percent`}]},t.f()]},$f=e.n({scatterChartConfig:()=>ep}),ep={dropZones:[{key:`xAxis`,label:`chart.runtime.axisFormat.xAxis`,description:`chart.configText.measure_or_dimension_for_x_position`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`,`measure`],emptyText:`chart.scatter.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.y_axis`,description:`chart.configText.measure_for_y_position`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.scatter.dropZone.yAxis.empty`},{key:`series`,label:`chart.configText.series_color_groups`,description:`chart.configText.dimension_to_color_points_by_category`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.scatter.dropZone.series.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`hideHeader`],displayOptionsConfig:[{key:`xAxisFormat`,label:`chart.option.xAxisFormat.label`,type:`axisFormat`,description:`chart.option.xAxisFormat.description`},{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.option.yAxisFormat.description`}]},tp=e.n({bubbleChartConfig:()=>np}),np={dropZones:[{key:`xAxis`,label:`chart.runtime.axisFormat.xAxis`,description:`chart.configText.horizontal_axis_position`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`,`measure`],emptyText:`chart.bubble.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.y_axis`,description:`chart.configText.vertical_axis_position`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.bubble.dropZone.yAxis.empty`},{key:`sizeField`,label:`chart.configText.bubble_radius`,description:`chart.configText.size_of_bubbles_based_on_this_measure`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.bubble.dropZone.sizeField.empty`},{key:`series`,label:`chart.configText.bubble_labels`,description:`chart.configText.field_to_use_for_bubble_labels_and_identification`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.bubble.dropZone.series.empty`},{key:`colorField`,label:`chart.configText.bubble_colour`,description:`chart.configText.color_bubbles_by_this_field_optional`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`,`measure`],emptyText:`chart.bubble.dropZone.colorField.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`minBubbleSize`,`maxBubbleSize`,`bubbleOpacity`,`hideHeader`],displayOptionsConfig:[{key:`xAxisFormat`,label:`chart.option.xAxisFormat.label`,type:`axisFormat`,description:`chart.option.xAxisFormat.description`},{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_y_axis_and_values`}]},rp=e.n({radarChartConfig:()=>ip}),ip={dropZones:[{key:`xAxis`,label:`chart.configText.axes_categories`,description:`chart.configText.dimensions_for_radar_axes`,mandatory:!0,acceptTypes:[`dimension`],emptyText:`chart.radar.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.values`,description:`chart.configText.measures_for_radar_values`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.radar.dropZone.yAxis.empty`},{key:`series`,label:`chart.configText.series_multiple_shapes`,description:`chart.configText.dimensions_to_create_multiple_radar_shapes`,mandatory:!1,acceptTypes:[`dimension`],emptyText:`chart.radar.dropZone.series.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`hideHeader`],displayOptionsConfig:[t.f()]},ap=e.n({radialBarChartConfig:()=>op}),op={dropZones:[{key:`xAxis`,label:`chart.configText.categories`,description:`chart.configText.dimensions_for_radial_segments`,mandatory:!0,acceptTypes:[`dimension`],emptyText:`chart.radialBar.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.values`,description:`chart.configText.measures_for_radial_bar_lengths`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.radialBar.dropZone.yAxis.empty`}],displayOptions:[`showLegend`,`showTooltip`,`hideHeader`],displayOptionsConfig:[t.f()]},sp=e.n({treemapChartConfig:()=>cp}),cp={dropZones:[{key:`xAxis`,label:`chart.configText.categories`,description:`chart.configText.dimensions_for_treemap_rectangles`,mandatory:!0,acceptTypes:[`dimension`],emptyText:`chart.treemap.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.size`,description:`chart.configText.measure_for_rectangle_sizes`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.treemap.dropZone.yAxis.empty`},{key:`series`,label:`chart.configText.color_groups`,description:`chart.configText.dimension_to_color_rectangles_by_category`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.treemap.dropZone.series.empty`}],displayOptions:[`showLegend`,`showTooltip`,`hideHeader`],displayOptionsConfig:[t.f(`chart.configText.number_formatting_for_size_values`)],clickableElements:{cell:!0}},lp=e.n({dataTableConfig:()=>up}),up={dropZones:[{key:`xAxis`,label:`chart.configText.columns`,description:`chart.configText.all_fields_to_display_as_columns`,mandatory:!1,acceptTypes:[`dimension`,`timeDimension`,`measure`],emptyText:`chart.table.dropZone.xAxis.empty`}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`leftYAxisFormat`,label:`chart.option.valueFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_numeric_values`}]},dp=e.n({recordsTableConfig:()=>fp}),fp={dropZones:[{key:`columns`,label:`chart.recordsTable.dropZone.columns.label`,description:`chart.recordsTable.dropZone.columns.description`,mandatory:!1,acceptTypes:[`dimension`,`timeDimension`,`measure`],emptyText:`chart.recordsTable.dropZone.columns.empty`},{key:`hiddenColumns`,label:`chart.recordsTable.dropZone.hiddenColumns.label`,description:`chart.recordsTable.dropZone.hiddenColumns.description`,mandatory:!1,acceptTypes:[`dimension`,`timeDimension`,`measure`],emptyText:`chart.recordsTable.dropZone.hiddenColumns.empty`,excludeFromInference:!0}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`columnFormats`,label:`chart.recordsTable.option.columnFormats.label`,type:`columnFormats`,description:`chart.recordsTable.option.columnFormats.description`},{key:`rowLink`,label:`chart.recordsTable.option.rowLink.label`,type:`rowLink`,description:`chart.recordsTable.option.rowLink.description`},{key:`pageSize`,label:`chart.recordsTable.option.pageSize.label`,type:`select`,defaultValue:25,description:`chart.recordsTable.option.pageSize.description`,options:[{value:25,label:`chart.recordsTable.option.pageSize.option.25`},{value:50,label:`chart.recordsTable.option.pageSize.option.50`},{value:100,label:`chart.recordsTable.option.pageSize.option.100`}]}],clickableElements:{row:!0},recordGrain:!0},pp=e.n({activityGridChartConfig:()=>mp}),mp={dropZones:[{key:`dateField`,label:`chart.configText.time_dimension`,description:`chart.configText.time_field_that_determines_grid_structure_granularity_affects_layout`,mandatory:!0,maxItems:1,acceptTypes:[`timeDimension`],emptyText:`chart.activityGrid.dropZone.dateField.empty`},{key:`valueField`,label:`chart.configText.activity_measure`,description:`chart.configText.measure_used_for_activity_intensity_color_coding`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.activityGrid.dropZone.valueField.empty`}],displayOptions:[`showLabels`,`showTooltip`,`hideHeader`],displayOptionsConfig:[{key:`fitToWidth`,label:`chart.option.fitToWidth.label`,type:`boolean`,defaultValue:!1,description:`chart.option.fitToWidth.description`}],validate:e=>{let{dateField:t,valueField:n}=e;return!t||Array.isArray(t)&&t.length===0?{isValid:!1,message:`chart.activityGrid.validation.timeDimensionRequired`}:!n||Array.isArray(n)&&n.length===0?{isValid:!1,message:`chart.activityGrid.validation.measureRequired`}:{isValid:!0}},clickableElements:{cell:!0}},hp=e.n({kpiNumberConfig:()=>gp}),gp={dropZones:[{key:`yAxis`,label:`chart.configText.value`,description:`chart.configText.measure_to_display_as_kpi_number`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.kpiNumber.dropZone.yAxis.empty`}],displayOptionsConfig:[t.r,{key:`target`,label:`chart.runtime.tooltip.targetValue`,type:`string`,placeholder:`e.g., 100`,description:`chart.configText.target_value_to_compare_against_first_value_used_if_multiple_provided`},{key:`prefix`,label:`chart.option.prefix.label`,type:`string`,placeholder:`e.g., $, €, #`,description:`chart.option.prefix.description`},{key:`suffix`,label:`chart.option.suffix.label`,type:`string`,placeholder:`e.g., %, units, items`,description:`chart.option.suffix.description`},{key:`decimals`,label:`chart.option.decimals.label`,type:`number`,defaultValue:0,min:0,max:10,step:1,description:`chart.option.decimals.description`},{key:`valueColorIndex`,label:`chart.configText.value_color`,type:`paletteColor`,defaultValue:0,description:`chart.configText.color_from_the_dashboard_palette_for_the_kpi_value_text`},{key:`useLastCompletePeriod`,label:`chart.option.useLastCompletePeriod.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.exclude_current_incomplete_period_from_aggregation_e_g_partial_week_mont`},{key:`skipLastPeriod`,label:`chart.option.skipLastPeriod.label`,type:`boolean`,defaultValue:!1,description:`chart.option.skipLastPeriod.description`}],displayOptions:[`hideHeader`]},_p=e.n({kpiDeltaConfig:()=>vp}),vp={dropZones:[{key:`yAxis`,label:`chart.configText.value`,description:`chart.configText.measure_to_track_changes_for`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.kpiDelta.dropZone.yAxis.empty`},{key:`xAxis`,label:`chart.configText.dimension_optional`,description:`chart.configText.dimension_for_ordering_data_typically_time`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.kpiDelta.dropZone.xAxis.empty`}],displayOptionsConfig:[t.r,{key:`showBaseline`,label:`chart.option.showBaseline.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showBaseline.description`},{key:`prefix`,label:`chart.option.prefix.label`,type:`string`,placeholder:`e.g., $, €, #`,description:`chart.option.prefix.description`},{key:`suffix`,label:`chart.option.suffix.label`,type:`string`,placeholder:`e.g., %, units, items`,description:`chart.option.suffix.description`},{key:`decimals`,label:`chart.option.decimals.label`,type:`number`,defaultValue:1,min:0,max:10,step:1,description:`chart.option.decimals.description`},{key:`positiveColorIndex`,label:`chart.configText.positive_change_color`,type:`paletteColor`,defaultValue:2,description:`chart.configText.color_for_positive_changes_increases`},{key:`negativeColorIndex`,label:`chart.configText.negative_change_color`,type:`paletteColor`,defaultValue:3,description:`chart.configText.color_for_negative_changes_decreases`},{key:`showHistogram`,label:`chart.option.showHistogram.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showHistogram.description`},{key:`useLastCompletePeriod`,label:`chart.option.useLastCompletePeriod.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.exclude_current_incomplete_period_from_delta_calculation_e_g_partial_wee`},{key:`skipLastPeriod`,label:`chart.option.skipLastPeriod.label`,type:`boolean`,defaultValue:!1,description:`chart.option.skipLastPeriod.description`}],displayOptions:[`hideHeader`],validate:e=>!e.yAxis||Array.isArray(e.yAxis)&&e.yAxis.length===0?{isValid:!1,message:`chart.kpiDelta.validation.measureRequired`}:{isValid:!0}},yp=e.n({kpiTextConfig:()=>bp}),bp={dropZones:[{key:`yAxis`,label:`chart.configText.value`,description:`chart.configText.measure_to_display_in_the_kpi_text_template`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.kpiText.dropZone.yAxis.empty`}],displayOptionsConfig:[{key:`template`,label:`chart.configText.text_template`,type:`string`,placeholder:"e.g., Total Revenue: ${value}",description:`chart.configText.template_for_displaying_the_text_use_value_to_insert_the_measure_value`},{key:`decimals`,label:`chart.option.decimals.label`,type:`number`,defaultValue:0,min:0,max:10,step:1,description:`chart.configText.number_of_decimal_places_to_display_for_numeric_values`},{key:`valueColorIndex`,label:`chart.configText.value_color`,type:`paletteColor`,defaultValue:0,description:`chart.configText.color_from_the_dashboard_palette_for_the_kpi_value_text`}],displayOptions:[`hideHeader`]},xp=e.n({markdownConfig:()=>Sp}),Sp={skipQuery:!0,dropZones:[],displayOptionsConfig:[{key:`content`,label:`chart.configText.markdown_content`,type:`string`,placement:`chart`,rows:18,syntax:`markdownTemplate`,placeholder:`chart.markdown.contentPlaceholder`,description:`chart.markdown.contentDescription`,docsUrl:`https://knap.md/variables`,docsLabel:`chart.markdown.contentDocsLabel`},{key:`accentColorIndex`,label:`chart.configText.accent_color`,type:`paletteColor`,defaultValue:0,description:`chart.configText.color_from_the_dashboard_palette_for_headers_bullets_and_links`},{key:`fontSize`,label:`chart.option.fontSize.label`,type:`select`,defaultValue:`medium`,options:[{value:`small`,label:`chart.option.fontSize.small`},{value:`medium`,label:`chart.option.fontSize.medium`},{value:`large`,label:`chart.option.fontSize.large`}],description:`chart.configText.overall_text_size_for_the_markdown_content`},{key:`alignment`,label:`chart.option.alignment.label`,type:`select`,defaultValue:`left`,options:[{value:`left`,label:`chart.option.accentBorder.left`},{value:`center`,label:`chart.option.alignment.center`},{value:`right`,label:`chart.option.alignment.right`}],description:`chart.configText.horizontal_alignment_of_the_markdown_content`},{key:`hideHeader`,label:`chart.option.hideHeader.label`,type:`boolean`,defaultValue:!0,description:`chart.option.hideHeader.description`},{key:`transparentBackground`,label:`chart.option.transparentBackground.label`,type:`boolean`,defaultValue:!1,description:`chart.option.transparentBackground.description`},{key:`autoHeight`,label:`chart.option.autoHeight.label`,type:`boolean`,defaultValue:!0,description:`chart.option.autoHeight.description`},{key:`accentBorder`,label:`chart.option.accentBorder.label`,type:`select`,defaultValue:`none`,options:[{value:`none`,label:`chart.option.accentBorder.none`},{value:`left`,label:`chart.option.accentBorder.left`},{value:`top`,label:`chart.option.accentBorder.top`},{value:`bottom`,label:`chart.option.accentBorder.bottom`}],description:`chart.configText.add_an_accent_colored_border_on_one_side_of_the_content`}]},Cp=e.n({funnelChartConfig:()=>wp}),wp={dropZones:[{key:`xAxis`,label:`chart.configText.step_name`,description:`chart.configText.step_names_auto_populated_from_funnel_steps`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.funnel.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.step_count`,description:`chart.configText.count_at_each_step_auto_calculated`,mandatory:!1,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.funnel.dropZone.yAxis.empty`}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`funnelStyle`,label:`chart.option.funnelStyle.label`,type:`buttonGroup`,defaultValue:`bars`,options:[{value:`bars`,label:`chart.option.funnelStyle.bars`},{value:`funnel`,label:`chart.option.funnelStyle.funnel`}],description:`chart.configText.visualization_style`},{key:`funnelOrientation`,label:`chart.option.funnelOrientation.label`,type:`buttonGroup`,defaultValue:`horizontal`,options:[{value:`horizontal`,label:`chart.option.funnelOrientation.horizontal`},{value:`vertical`,label:`chart.option.funnelOrientation.vertical`}]},{key:`hideSummaryFooter`,label:`chart.option.hideSummaryFooter.label`,type:`boolean`,defaultValue:!1,description:`chart.option.hideSummaryFooter.description`},{key:`showFunnelConversion`,label:`chart.option.showConversion.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showConversion.description`},{key:`showFunnelAvgTime`,label:`chart.option.showAvgTime.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showAvgTime.description`},{key:`showFunnelMedianTime`,label:`chart.option.showMedianTime.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showMedianTime.description`},{key:`showFunnelP90Time`,label:`chart.option.showP90Time.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showP90Time.description`}]},Tp=e.n({sankeyChartConfig:()=>Ep}),Ep={dropZones:[{key:`xAxis`,label:`chart.configText.event_type`,description:`chart.configText.event_dimension_that_categorizes_flow_nodes`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.sankey.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.flow_count`,description:`chart.configText.count_of_entities_following_each_path`,mandatory:!1,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.sankey.dropZone.yAxis.empty`}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`linkOpacity`,label:`chart.option.linkOpacity.label`,type:`buttonGroup`,defaultValue:`0.5`,options:[{value:`0.3`,label:`chart.option.linkOpacity.light`},{value:`0.5`,label:`chart.option.fontSize.medium`},{value:`0.7`,label:`chart.option.linkOpacity.dark`}],description:`chart.configText.opacity_of_flow_links`},{key:`showNodeLabels`,label:`chart.option.showNodeLabels.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showNodeLabels.description`},{key:`hideSummaryFooter`,label:`chart.option.hideSummaryFooter.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.hide_the_statistics_footer_below_the_chart`}]},Dp=e.n({sunburstChartConfig:()=>Op}),Op={dropZones:[{key:`xAxis`,label:`chart.configText.event_type`,description:`chart.configText.event_dimension_that_categorizes_flow_nodes`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.sunburst.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.flow_count`,description:`chart.configText.count_of_entities_following_each_path`,mandatory:!1,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.sunburst.dropZone.yAxis.empty`}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`innerRadius`,label:`chart.option.innerRadius.label`,type:`number`,defaultValue:40,min:0,max:100,step:10,description:`chart.configText.size_of_the_center_hole_0_for_full_circle`},{key:`hideSummaryFooter`,label:`chart.option.hideSummaryFooter.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.hide_the_statistics_footer_below_the_chart`}]},kp=e.n({heatmapChartConfig:()=>Ap}),Ap={dropZones:[{key:`xAxis`,label:`chart.configText.columns_x_axis`,description:`chart.configText.dimension_for_column_categories`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.heatmap.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.rows_y_axis`,description:`chart.configText.dimension_for_row_categories`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.heatmap.dropZone.yAxis.empty`},{key:`valueField`,label:`chart.configText.value_color_intensity`,description:`chart.configText.measure_that_determines_cell_color`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.heatmap.dropZone.valueField.empty`}],displayOptions:[`showLegend`,`showTooltip`],displayOptionsConfig:[{key:`showLabels`,label:`chart.option.showLabels.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showLabels.description`},{key:`cellShape`,label:`chart.option.cellShape.label`,type:`select`,defaultValue:`rect`,options:[{value:`rect`,label:`chart.option.cellShape.rectangle`},{value:`circle`,label:`chart.option.cellShape.circle`}]},{key:`xAxisFormat`,label:`chart.option.xAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_x_axis_labels`},{key:`yAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_y_axis_labels`},{key:`valueFormat`,label:`chart.option.valueFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_cell_values_and_legend`}],validate:e=>e.xAxis?.length?e.yAxis?.length?e.valueField?.length?{isValid:!0}:{isValid:!1,message:`chart.heatmap.validation.valueRequired`}:{isValid:!1,message:`chart.heatmap.validation.yAxisRequired`}:{isValid:!1,message:`chart.heatmap.validation.xAxisRequired`}},jp=e.n({retentionHeatmapConfig:()=>Mp}),Mp={dropZones:[],displayOptionsConfig:[{key:`showLegend`,label:`chart.option.showLegend.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.show_the_color_intensity_legend`},{key:`showTooltip`,label:`chart.option.showTooltip.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showTooltip.description`}]},Np=e.n({retentionCombinedConfig:()=>Pp}),Pp={dropZones:[],displayOptionsConfig:[{key:`retentionDisplayMode`,label:`chart.option.retentionDisplayMode.label`,type:`select`,defaultValue:`line`,options:[{value:`line`,label:`chart.option.retentionDisplayMode.lineChart`},{value:`heatmap`,label:`chart.option.retentionDisplayMode.heatmapTable`},{value:`combined`,label:`chart.option.retentionDisplayMode.combined`}],description:`chart.configText.choose_how_to_visualize_retention_data`},{key:`showLegend`,label:`chart.option.showLegend.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.show_the_legend_for_breakdown_segments`},{key:`showGrid`,label:`chart.option.showGrid.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showGrid.description`},{key:`showTooltip`,label:`chart.option.showTooltip.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showTooltip.description`}]},Fp=e.n({boxPlotChartConfig:()=>Ip}),Ip={displayOptions:[`hideHeader`],dropZones:[{key:`xAxis`,label:`chart.configText.x_axis_groups`,description:`chart.configText.dimension_to_group_boxes_by_e_g_symbol_platform`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.boxPlot.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.y_axis_measures`,description:`chart.configText.drop_1_measure_for_auto_mode_3_for_avg_stddev_median_mode_or_5_for_min_q`,mandatory:!0,maxItems:5,acceptTypes:[`measure`],emptyText:`chart.boxPlot.dropZone.yAxis.empty`}],displayOptionsConfig:[{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_the_value_axis`}]},Lp=e.n({dotStripChartConfig:()=>Rp}),Rp={displayOptions:[`showGrid`,`showTooltip`,`hideHeader`],dropZones:[{key:`xAxis`,label:`chart.dotStrip.dropZone.xAxis.label`,description:`chart.dotStrip.dropZone.xAxis.description`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.dotStrip.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.dotStrip.dropZone.yAxis.label`,description:`chart.dotStrip.dropZone.yAxis.description`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.dotStrip.dropZone.yAxis.empty`},{key:`series`,label:`chart.dotStrip.dropZone.series.label`,description:`chart.dotStrip.dropZone.series.description`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.dotStrip.dropZone.series.empty`}],clickableElements:{point:!0},displayOptionsConfig:[{key:`showMedianMarker`,label:`chart.option.showMedianMarker.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showMedianMarker.description`},{key:`showBandStats`,label:`chart.option.showBandStats.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showBandStats.description`},{key:`showExtremeLabels`,label:`chart.option.showExtremeLabels.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showExtremeLabels.description`},{key:`dotSize`,label:`chart.option.dotSize.label`,type:`select`,defaultValue:`medium`,options:[{value:`small`,label:`chart.option.dotSize.small`},{value:`medium`,label:`chart.option.dotSize.medium`},{value:`large`,label:`chart.option.dotSize.large`}],description:`chart.option.dotSize.description`},{key:`bandSort`,label:`chart.option.bandSort.label`,type:`select`,defaultValue:`none`,options:[{value:`none`,label:`chart.option.bandSort.none`},{value:`valueDesc`,label:`chart.option.bandSort.valueDesc`},{value:`valueAsc`,label:`chart.option.bandSort.valueAsc`},{value:`count`,label:`chart.option.bandSort.count`}],description:`chart.option.bandSort.description`},{key:`xAxisFormat`,label:`chart.option.xAxisFormat.label`,type:`axisFormat`,description:`chart.option.xAxisFormat.description`}]},zp=e.n({waterfallChartConfig:()=>Bp}),Bp={clickableElements:{bar:!0},displayOptions:[`showTooltip`,`hideHeader`],dropZones:[{key:`xAxis`,label:`chart.dropZone.xAxis.label`,description:`chart.configText.dimension_labels_for_each_bar_segment_e_g_symbol_transaction_type`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.waterfall.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.y_axis_value`,description:`chart.configText.single_measure_whose_values_are_summed_cumulatively`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.waterfall.dropZone.yAxis.empty`}],displayOptionsConfig:[{key:`showTotal`,label:`chart.option.showTotal.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showTotal.description`},{key:`showConnectorLine`,label:`chart.option.showConnectorLine.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showConnectorLine.description`},{key:`showDataLabels`,label:`chart.option.showDataLabels.label`,type:`boolean`,defaultValue:!1,description:`chart.configText.display_the_value_above_each_bar_segment`},{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_the_y_axis`}]},Vp=e.n({candlestickChartConfig:()=>Hp}),Hp={clickableElements:{bar:!0},displayOptions:[`hideHeader`],dropZones:[{key:`xAxis`,label:`chart.configText.x_axis_time_category`,description:`chart.configText.time_dimension_or_category_for_each_candle_e_g_date_symbol`,mandatory:!0,maxItems:1,acceptTypes:[`timeDimension`,`dimension`],emptyText:`chart.candlestick.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.ohlc_measures_open_close_high_low`,description:`chart.configText.drop_2_4_measures_in_order_open_close_high_low_ohlc_mode_for_range_mode_`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.candlestick.dropZone.yAxis.empty`}],displayOptionsConfig:[{key:`rangeMode`,label:`chart.option.rangeMode.label`,type:`select`,defaultValue:`ohlc`,options:[{value:`ohlc`,label:`chart.option.rangeMode.ohlc`},{value:`range`,label:`chart.option.rangeMode.range`}],description:`chart.option.rangeMode.description`},{key:`bullColor`,label:`chart.option.bullColor.label`,type:`color`,defaultValue:`#22c55e`,description:`chart.option.bullColor.description`},{key:`bearColor`,label:`chart.option.bearColor.label`,type:`color`,defaultValue:`#ef4444`,description:`chart.option.bearColor.description`},{key:`showWicks`,label:`chart.option.showWicks.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showWicks.description`},{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_the_price_axis`}]},Up=e.n({measureProfileChartConfig:()=>Wp}),Wp={displayOptions:[`showLegend`,`showTooltip`,`hideHeader`],dropZones:[{key:`yAxis`,label:`chart.configText.measures_x_axis_order`,description:`chart.configText.add_2_or_more_measures_they_become_the_x_axis_categories_in_the_order_li`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.measureProfile.dropZone.yAxis.empty`},{key:`series`,label:`chart.configText.series_split_into_multiple_lines`,description:`chart.configText.dimension_to_split_data_into_separate_profile_lines_e_g_symbol_platform`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.measureProfile.dropZone.series.empty`}],displayOptionsConfig:[{key:`showReferenceLineAtZero`,label:`chart.option.showReferenceLineAtZero.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showReferenceLineAtZero.description`},{key:`showDataLabels`,label:`chart.option.showDataLabels.label`,type:`boolean`,defaultValue:!1,description:`chart.configText.display_value_at_each_data_point`},{key:`showLegend`,label:`chart.option.showLegend.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.show_series_legend_only_visible_with_a_series_dimension`},{key:`lineType`,label:`chart.option.lineType.label`,type:`select`,defaultValue:`monotone`,options:[{value:`monotone`,label:`chart.option.lineType.smooth`},{value:`linear`,label:`chart.option.lineType.linear`},{value:`step`,label:`chart.option.lineType.step`}],description:`chart.option.lineType.description`},{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_the_y_axis`}]},Gp=e.n({proportionBarChartConfig:()=>Kp}),Kp={dropZones:[{key:`xAxis`,label:`chart.configText.category`,description:`chart.configText.dimension_to_split_the_bar_into_segments`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.proportionBar.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.value`,description:`chart.configText.measure_that_determines_each_segments_share`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.proportionBar.dropZone.yAxis.empty`}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`showLabels`,label:`chart.option.proportionBarLabels.label`,type:`boolean`,defaultValue:!0,description:`chart.option.proportionBarLabels.description`},{key:`showPercentages`,label:`chart.option.showPercentages.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showPercentages.description`},{key:`sortSegments`,label:`chart.option.sortSegments.label`,type:`boolean`,defaultValue:!1,description:`chart.option.sortSegments.description`},{key:`decimals`,label:`chart.option.decimals.label`,type:`number`,defaultValue:0,min:0,max:2,description:`chart.option.proportionBarDecimals.description`}],validate:e=>!e?.xAxis||Array.isArray(e.xAxis)&&e.xAxis.length===0?{isValid:!1,message:`chart.proportionBar.validation.dimensionRequired`}:!e?.yAxis||Array.isArray(e.yAxis)&&e.yAxis.length===0?{isValid:!1,message:`chart.proportionBar.validation.measureRequired`}:{isValid:!0}},qp=e.n({gaugeChartConfig:()=>Jp}),Jp={clickableElements:{},displayOptions:[`hideHeader`],dropZones:[{key:`yAxis`,label:`chart.configText.value_measure`,description:`chart.configText.current_value_to_display_on_the_gauge_e_g_current_equity_margin_used`,mandatory:!0,maxItems:2,acceptTypes:[`measure`],emptyText:`chart.gauge.dropZone.yAxis.empty`}],displayOptionsConfig:[{key:`minValue`,label:`chart.option.minValue.label`,type:`number`,defaultValue:0,description:`chart.option.minValue.description`},{key:`maxValue`,label:`chart.option.maxValue.label`,type:`number`,description:`chart.option.maxValue.description`},{key:`thresholds`,label:`chart.configText.threshold_bands`,type:`thresholdBands`,description:`chart.gauge.thresholds.description`},{key:`showCenterLabel`,label:`chart.option.showCentreLabel.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showCentreLabel.description`},{key:`showPercentage`,label:`chart.option.showPercentage.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showPercentage.description`},{key:`leftYAxisFormat`,label:`chart.option.valueFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_the_displayed_value_and_axis_labels`}]},Q={packageName:`recharts`,installCommand:`npm install recharts`},Yp={bar:{label:`chart.bar.label`,icon:`chartBar`,description:`chart.bar.description`,useCase:`chart.bar.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Gf)).barChartConfig},line:{label:`chart.line.label`,icon:`chartLine`,description:`chart.line.description`,useCase:`chart.line.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>qf)).lineChartConfig},area:{label:`chart.area.label`,icon:`chartArea`,description:`chart.area.description`,useCase:`chart.area.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Yf)).areaChartConfig},pie:{label:`chart.pie.label`,icon:`chartPie`,description:`chart.pie.description`,useCase:`chart.pie.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Zf)).pieChartConfig},scatter:{label:`chart.scatter.label`,icon:`chartScatter`,description:`chart.scatter.description`,useCase:`chart.scatter.useCase`,isAvailable:({measureCount:e,dimensionCount:t})=>e<1?{available:!1,reason:`chart.availability.requiresMeasure`}:e<2&&t<1?{available:!1,reason:`chart.availability.scatter`}:{available:!0},dependencies:Q,config:async()=>(await Promise.resolve().then(()=>$f)).scatterChartConfig},bubble:{label:`chart.bubble.label`,icon:`chartBubble`,description:`chart.bubble.description`,useCase:`chart.bubble.useCase`,isAvailable:({measureCount:e,dimensionCount:t})=>e<2?{available:!1,reason:`chart.availability.requiresTwoMeasures`}:t<1?{available:!1,reason:`chart.availability.bubble`}:{available:!0},dependencies:Q,config:async()=>(await Promise.resolve().then(()=>tp)).bubbleChartConfig},radar:{label:`chart.radar.label`,icon:`chartRadar`,description:`chart.radar.description`,useCase:`chart.radar.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>rp)).radarChartConfig},radialBar:{label:`chart.radialBar.label`,icon:`chartRadialBar`,description:`chart.radialBar.description`,useCase:`chart.radialBar.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>ap)).radialBarChartConfig},treemap:{label:`chart.treemap.label`,icon:`chartTreemap`,description:`chart.treemap.description`,useCase:`chart.treemap.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>sp)).treemapChartConfig},table:{label:`chart.table.label`,icon:`chartTable`,description:`chart.table.description`,useCase:`chart.table.useCase`,config:async()=>(await Promise.resolve().then(()=>lp)).dataTableConfig},recordsTable:{label:`chart.recordsTable.label`,icon:`chartRecordsTable`,description:`chart.recordsTable.description`,useCase:`chart.recordsTable.useCase`,config:async()=>(await Promise.resolve().then(()=>dp)).recordsTableConfig},activityGrid:{label:`chart.activityGrid.label`,icon:`chartActivityGrid`,description:`chart.activityGrid.description`,useCase:`chart.activityGrid.useCase`,isAvailable:({measureCount:e,timeDimensionCount:t})=>e<1?{available:!1,reason:`chart.availability.requiresMeasure`}:t<1?{available:!1,reason:`chart.availability.requiresTimeDimension`}:{available:!0},config:async()=>(await Promise.resolve().then(()=>pp)).activityGridChartConfig},kpiNumber:{label:`chart.kpiNumber.label`,icon:`chartKpiNumber`,description:`chart.kpiNumber.description`,useCase:`chart.kpiNumber.useCase`,isAvailable:t.a,config:async()=>(await Promise.resolve().then(()=>hp)).kpiNumberConfig},kpiDelta:{label:`chart.kpiDelta.label`,icon:`chartKpiDelta`,description:`chart.kpiDelta.description`,useCase:`chart.kpiDelta.useCase`,isAvailable:t.o,config:async()=>(await Promise.resolve().then(()=>_p)).kpiDeltaConfig},kpiText:{label:`chart.kpiText.label`,icon:`chartKpiText`,description:`chart.kpiText.description`,useCase:`chart.kpiText.useCase`,isAvailable:t.a,config:async()=>(await Promise.resolve().then(()=>yp)).kpiTextConfig},markdown:{label:`chart.markdown.label`,icon:`chartMarkdown`,description:`chart.markdown.description`,useCase:`chart.markdown.useCase`,config:async()=>(await Promise.resolve().then(()=>xp)).markdownConfig},funnel:{label:`chart.funnel.label`,icon:`chartFunnel`,description:`chart.funnel.description`,useCase:`chart.funnel.useCase`,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Cp)).funnelChartConfig},sankey:{label:`chart.sankey.label`,icon:`chartSankey`,description:`chart.sankey.description`,useCase:`chart.sankey.useCase`,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Tp)).sankeyChartConfig},sunburst:{label:`chart.sunburst.label`,icon:`chartSunburst`,description:`chart.sunburst.description`,useCase:`chart.sunburst.useCase`,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Dp)).sunburstChartConfig},heatmap:{label:`chart.heatmap.label`,icon:`chartHeatmap`,description:`chart.heatmap.description`,useCase:`chart.heatmap.useCase`,isAvailable:({measureCount:e,dimensionCount:t})=>e<1?{available:!1,reason:`chart.availability.requiresMeasure`}:t<2?{available:!1,reason:`chart.availability.requiresTwoDimensions`}:{available:!0},dependencies:{packageName:`@nivo/heatmap`,installCommand:`npm install @nivo/heatmap`},config:async()=>(await Promise.resolve().then(()=>kp)).heatmapChartConfig},retentionHeatmap:{label:`chart.retentionHeatmap.label`,icon:`chartRetention`,description:`chart.retentionHeatmap.description`,useCase:`chart.retentionHeatmap.useCase`,config:async()=>(await Promise.resolve().then(()=>jp)).retentionHeatmapConfig},retentionCombined:{label:`chart.retentionCombined.label`,icon:`chartRetention`,description:`chart.retentionCombined.description`,useCase:`chart.retentionCombined.useCase`,config:async()=>(await Promise.resolve().then(()=>Np)).retentionCombinedConfig},boxPlot:{label:`chart.boxPlot.label`,icon:`chartBoxPlot`,description:`chart.boxPlot.description`,useCase:`chart.boxPlot.useCase`,isAvailable:t.o,config:async()=>(await Promise.resolve().then(()=>Fp)).boxPlotChartConfig},dotStrip:{label:`chart.dotStrip.label`,icon:`chartDotStrip`,description:`chart.dotStrip.description`,useCase:`chart.dotStrip.useCase`,isAvailable:t.o,config:async()=>(await Promise.resolve().then(()=>Lp)).dotStripChartConfig},waterfall:{label:`chart.waterfall.label`,icon:`chartWaterfall`,description:`chart.waterfall.description`,useCase:`chart.waterfall.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>zp)).waterfallChartConfig},candlestick:{label:`chart.candlestick.label`,icon:`chartCandlestick`,description:`chart.candlestick.description`,useCase:`chart.candlestick.useCase`,isAvailable:({measureCount:e,dimensionCount:t})=>e<2?{available:!1,reason:`chart.availability.requiresTwoMeasures`}:t<1?{available:!1,reason:`chart.availability.requiresDimension`}:{available:!0},config:async()=>(await Promise.resolve().then(()=>Vp)).candlestickChartConfig},measureProfile:{label:`chart.measureProfile.label`,icon:`chartMeasureProfile`,description:`chart.measureProfile.description`,useCase:`chart.measureProfile.useCase`,isAvailable:({measureCount:e})=>e<2?{available:!1,reason:`chart.availability.requiresTwoMeasures`}:{available:!0},dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Up)).measureProfileChartConfig},proportionBar:{label:`chart.proportionBar.label`,icon:`chartProportionBar`,description:`chart.proportionBar.description`,useCase:`chart.proportionBar.useCase`,isAvailable:t.o,config:async()=>(await Promise.resolve().then(()=>Gp)).proportionBarChartConfig},gauge:{label:`chart.gauge.label`,icon:`chartGauge`,description:`chart.gauge.description`,useCase:`chart.gauge.useCase`,isAvailable:t.a,dependencies:{packageName:`d3-shape`,installCommand:`npm install d3-shape`},config:async()=>(await Promise.resolve().then(()=>qp)).gaugeChartConfig}};function Xp(e,t){return{...t,label:e.label,description:e.description,useCase:e.useCase,isAvailable:e.isAvailable}}var Zp={bar:Kf,line:Jf,area:Xf,pie:Qf,scatter:ep,bubble:np,radar:ip,radialBar:op,treemap:cp,table:up,recordsTable:fp,activityGrid:mp,kpiNumber:gp,kpiDelta:vp,kpiText:bp,markdown:Sp,funnel:wp,sankey:Ep,sunburst:Op,heatmap:Ap,retentionHeatmap:Mp,retentionCombined:Pp,boxPlot:Ip,dotStrip:Rp,waterfall:Bp,candlestick:Hp,measureProfile:Wp,proportionBar:Kp,gauge:Jp},Qp=Object.fromEntries(Object.keys(Yp).map(e=>[e,Xp(Yp[e],Zp[e])]));function $p(e){return Qp[e]?.recordGrain===!0}function em(e){return Array.isArray(e)?e.length>0:!!e}function tm(e){let t=e.timeDimensions??[];return e.ungrouped?t:t.filter(e=>!!e.granularity)}function nm(e,t,n,r){for(let i of e.dropZones){if(!i.mandatory||em(n?.[i.key]))continue;let e=i.acceptTypes?.join(`/`)??`fields`;r.push(E(`server.validation.chart.dropZoneRequired`,{key:i.key,chartType:t,label:i.label,acceptDesc:e}))}}function rm(e,t,n){if(em(e?.xAxis))return;let r=t.dimensions??[],i=tm(t),a=r.length>0||i.length>0;n.push(E(a?`server.validation.chart.barXAxisRequired`:`server.validation.chart.barNeedsDimension`))}function im(e){return Array.isArray(e)?e:[e]}function am(e,t){if(!e?.xAxis||!e?.series)return;let n=new Set(im(e.xAxis)),r=im(e.series).filter(e=>n.has(e));r.length>0&&t.push(E(`server.validation.chart.seriesDuplicatesXAxis`,{duplicates:r.join(`, `)}))}function om(e,t,n){$p(e)&&t.ungrouped!==!0&&n.push(E(`server.validation.chart.recordGrainNeedsUngrouped`,{chartType:e}))}function sm(e,t,n){let r=Qp[e];if(!r||r.skipQuery)return{isValid:!0,errors:[]};let i=[];return nm(r,e,t,i),om(e,n,i),e===`bar`&&rm(t,n,i),am(t,i),{isValid:i.length===0,errors:i}}function cm(e,t,n){if(e!==`bar`||em(t?.xAxis))return{chartType:e};let r=n.dimensions??[],i=tm(n);if(r.length>0||i.length>0)return{chartType:e};let a=(n.measures??[]).length===1?`kpiNumber`:`table`;return{chartType:a,note:`Note: chartType was changed from "bar" to "${a}" because the query has no dimension, so a bar chart would have no category axis to label its bars. For a real bar chart, put the category in the query's dimensions and use a single measure. To plot several measures as an ordered profile instead, use "measureProfile".`}}function lm(e,t,n,r){if(!(e.acceptTypes??[]).includes(`measure`))return;let i=new Set;for(let r of t.dropZones){if(r.key===e.key)continue;let t=n[r.key];Array.isArray(t)?t.forEach(e=>i.add(e)):typeof t==`string`&&i.add(t)}let a=r.filter(e=>!i.has(e));a.length>0&&(n[e.key]=a[0])}function um(e,t){let n=new Set;for(let[r,i]of Object.entries(e))if(r!==t){if(Array.isArray(i))for(let e of i)typeof e==`string`&&n.add(e);else typeof i==`string`&&n.add(i)}return n}function dm(e,t,n){let r=e.acceptTypes??[],i=[];if(r.includes(`dimension`)&&i.push(...n.dimensions),r.includes(`timeDimension`)&&i.push(...n.timeDimFields),r.includes(`measure`)&&i.push(...n.measures),i.length===0)return;let a=um(t,e.key),o=i.filter(e=>!a.has(e));if(o.length===0)return;let s=e.maxItems??1/0,c=o.slice(0,s);c.length>0&&(t[e.key]=c)}function fm(e,t,n){let r=Qp[e];if(!r)return t??{};let i={...t},a=tm(n),o={measures:n.measures??[],dimensions:n.dimensions??[],timeDimFields:a.map(e=>e.dimension)};for(let e of r.dropZones)e.excludeFromInference||em(i[e.key])||(e.key===`sizeField`||e.key===`colorField`?lm(e,r,i,o.measures):dm(e,i,o));return i}function pm(e){return e?ot(e)?E(e):e:``}function mm(e){let t=[`
823
+ `)}var _f={funnel:{description:`Track conversion through sequential steps. Entities (identified by bindingKey) move through ordered steps.`,structure:{funnel:{bindingKey:`Cube.dimension - identifies entities moving through funnel`,timeDimension:`Cube.dimension - time field for ordering events`,steps:[{name:`string - human readable step name`,filter:`{ member, operator, values } or array of filters. Put inDateRange ONLY on step 0.`,timeToConvert:`optional - ISO 8601 duration e.g. "P7D" for 7 days, "PT1H" for 1 hour`}],includeTimeMetrics:`optional boolean - include avg/median/p90 time-to-convert`,globalTimeWindow:`optional - ISO 8601 duration, all steps must complete within this window`}}},flow:{description:`Analyze paths users take before/after a specific event. Shows event sequences as Sankey/sunburst.`,structure:{flow:{bindingKey:`Cube.dimension - identifies entities`,timeDimension:`Cube.dimension - time field for ordering`,eventDimension:`Cube.dimension - the event type field (values become node labels)`,startingStep:{name:`string - display name for the starting step`,filter:`{ member, operator, values } - filter identifying the starting event`},stepsBefore:`number (0-5) - how many steps to show before starting step`,stepsAfter:`number (0-5) - how many steps to show after starting step`,entityLimit:`optional number - max entities to process (performance)`,outputMode:`optional "sankey" | "sunburst" (default: sankey)`}}},retention:{description:`Measure how many users return over time periods after initial activity.`,structure:{retention:{timeDimension:`Cube.dimension - time field for cohort assignment`,bindingKey:`Cube.dimension - identifies entities`,dateRange:{start:`YYYY-MM-DD - cohort start date`,end:`YYYY-MM-DD - cohort end date`},granularity:`day | week | month - period size`,periods:`number - how many periods to analyze`,retentionType:`"classic" (returned in period N) | "rolling" (returned in N or later)`,cohortFilters:`optional - filters on cohort entry events`,activityFilters:`optional - filters on return activity events`,breakdownDimensions:`optional string[] - segment by these dimensions`}}}};function vf(e,t,n){let r=0,i=t.name.split(`.`).pop()||t.name;return r=Math.max(r,n.fuzzyMatchScore(e,i)),r=Math.max(r,n.fuzzyMatchScore(e,t.title)),t.description&&(r=Math.max(r,n.fuzzyMatchScore(e,t.description)*.8)),t.synonyms&&(r=Math.max(r,n.matchAgainstArray(e,t.synonyms))),r}function yf(e,t,n,r,i){let a=0;for(let o of t){let t=vf(e,o,n);if(t>.4){a+=t,i.hit=!0;let e=r.get(o.name)||0;r.set(o.name,Math.max(e,t))}}return a}function bf(e,t){return Array.from(e.entries()).sort((e,t)=>t[1]-e[1]).slice(0,t).map(([e])=>e)}function xf(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function Sf(e,t){let n=new Set(t),r={};for(let t of e)n.has(t.name)&&t.title&&xf(t.name.split(`.`).pop()||t.name)!==xf(t.title)&&(r[t.name]=t.title);return Object.keys(r).length>0?r:void 0}function Cf(e,t,n){let r=t.name.split(`.`).pop()||t.name,i=n.fuzzyMatchScore(e,r);return i=Math.max(i,n.fuzzyMatchScore(e,t.title)),t.synonyms&&(i=Math.max(i,n.matchAgainstArray(e,t.synonyms))),i}function wf(e,t){if(e.length>500||t.length>500)return e.length+t.length;let n=[];for(let e=0;e<=t.length;e++)n[e]=[e];for(let t=0;t<=e.length;t++)n[0][t]=t;for(let r=1;r<=t.length;r++)for(let i=1;i<=e.length;i++)t.charAt(r-1)===e.charAt(i-1)?n[r][i]=n[r-1][i-1]:n[r][i]=Math.min(n[r-1][i-1]+1,n[r][i-1]+1,n[r-1][i]+1);return n[t.length][e.length]}function Tf(e,t){let n=e.toLowerCase().trim(),r=t.toLowerCase().trim();if(n===r)return 1;if(r.includes(n))return .9;let i=r.split(/[\s_-]+/);for(let e of i){if(e===n)return .85;if(e.startsWith(n))return .75}let a=1-wf(n,r)/Math.max(n.length,r.length);return a>.5?a*.7:0}function Ef(e,t){let n=0;for(let r of t){let t=Tf(e,r);t>n&&(n=t)}return n}function Df(e){let t=new Set(`a.an.the.is.are.was.were.be.been.being.have.has.had.do.does.did.will.would.could.should.may.might.must.can.and.or.but.if.then.else.when.where.why.how.what.which.who.this.that.these.those.i.me.my.we.our.you.your.he.she.it.they.them.their.in.on.at.to.for.of.with.by.from.up.down.out.over.under.about.into.through.during.before.after.above.below.between.show.me.get.find.list.give.tell.display.want.need.see.know`.split(`.`));return e.toLowerCase().replace(/[^\w\s]/g,` `).split(/\s+/).filter(e=>e.length>2&&!t.has(e))}var Of={fuzzyMatchScore:Tf,matchAgainstArray:Ef};function kf(e,t,n){let r=0,i=Tf(e,t.name);i>.5&&(r+=i*2,n.includes(`name`)||n.push(`name`));let a=Tf(e,t.title);if(a>.5&&(r+=a*1.5,n.includes(`title`)||n.push(`title`)),t.description){let i=Tf(e,t.description);i>.3&&(r+=i,n.includes(`description`)||n.push(`description`))}if(t.exampleQuestions)for(let i of t.exampleQuestions){let t=Tf(e,i);t>.3&&(r+=t*1.5,n.includes(`exampleQuestions`)||n.push(`exampleQuestions`))}return r}function Af(e,t){let n=0,r=[],i=new Map,a=new Map;for(let o of t){n+=kf(o,e,r);let t={hit:!1};n+=yf(o,e.measures,Of,i,t),t.hit&&!r.includes(`measures`)&&r.push(`measures`);let s={hit:!1};n+=yf(o,e.dimensions,Of,a,s),s.hit&&!r.includes(`dimensions`)&&r.push(`dimensions`)}return{score:Math.min(1,n/(t.length*2)),matchedOn:r,suggestedMeasures:bf(i,5),suggestedDimensions:bf(a,5)}}function jf(e){let t=!!e.meta?.eventStream,n=e.dimensions.some(e=>e.type===`time`),r=e.dimensions.some(t=>t.name.toLowerCase().includes(`id`)||t.type===`number`||e.meta?.eventStream?.bindingKey&&t.name===e.meta.eventStream.bindingKey),i=t||n&&r;return{query:!0,funnel:i,flow:i,retention:i}}function Mf(e){let t=jf(e);if(!t.funnel&&!t.flow&&!t.retention)return;let n=[];if(e.meta?.eventStream?.bindingKey){let t=e.dimensions.find(t=>t.name===e.meta?.eventStream?.bindingKey);n.push({dimension:e.meta.eventStream.bindingKey,description:t?.description||`Configured binding key`})}for(let t of e.dimensions)(t.name.split(`.`).pop()?.toLowerCase()||``).includes(`id`)&&!n.some(e=>e.dimension===t.name)&&n.push({dimension:t.name,description:t.description||`Potential entity identifier`});let r=[];if(e.meta?.eventStream?.timeDimension){let t=e.dimensions.find(t=>t.name===e.meta?.eventStream?.timeDimension);r.push({dimension:e.meta.eventStream.timeDimension,description:t?.description||`Configured time dimension`})}for(let t of e.dimensions)t.type===`time`&&!r.some(e=>e.dimension===t.name)&&r.push({dimension:t.name,description:t.description});let i=[];for(let t of e.dimensions){let e=t.name.split(`.`).pop()?.toLowerCase()||``;t.type===`string`&&(e.includes(`type`)||e.includes(`event`)||e.includes(`status`)||e.includes(`state`)||e.includes(`action`))&&i.push({dimension:t.name,description:t.description||`Potential event type dimension`})}return{candidateBindingKeys:n,candidateTimeDimensions:r,candidateEventDimensions:i}}function Nf(e,t){let n=[];if(!t)return n;if(t.candidateBindingKeys.length>1&&n.push(`Choose bindingKey based on what entity to track through the analysis`),t.candidateEventDimensions.length>0){let e=t.candidateEventDimensions[0].dimension;n.push(`Query ${e} dimension to discover available values for funnel steps`)}return n.push(`Use /mcp/load with a standard query to discover dimension values before building analysis queries`),n}function Pf(e,t={}){let{topic:n,intent:r,limit:i=10,minScore:a=.1}=t,o=[n,r].filter(Boolean).join(` `);if(!o.trim())return e.slice(0,i).map(e=>{let t=jf(e),n=Mf(e),r=Nf(e,n),i=t.funnel||t.flow||t.retention,a=e.measures.slice(0,5).map(e=>e.name),o=e.dimensions.slice(0,5).map(e=>e.name);return{cube:e.name,title:e.title,description:e.description,relevanceScore:1,matchedOn:[],suggestedMeasures:a,suggestedDimensions:o,fieldTitles:Sf([...e.measures,...e.dimensions],[...a,...o]),capabilities:t,analysisConfig:n,hints:r.length>0?r:void 0,querySchemas:i?_f:void 0}});let s=Df(o);if(s.length===0)return[];let c=[];for(let t of e){let{score:e,matchedOn:n,suggestedMeasures:r,suggestedDimensions:i}=Af(t,s);if(e>=a){let a=jf(t),o=Mf(t),s=Nf(t,o),l=a.funnel||a.flow||a.retention;c.push({cube:t.name,title:t.title,description:t.description,relevanceScore:e,matchedOn:n,suggestedMeasures:r,suggestedDimensions:i,fieldTitles:Sf([...t.measures,...t.dimensions],[...r,...i]),capabilities:a,analysisConfig:o,hints:s.length>0?s:void 0,querySchemas:l?_f:void 0})}}return c.sort((e,t)=>t.relevanceScore-e.relevanceScore).slice(0,i)}function Ff(e,t,n){let r=null,i=(e,n,i)=>{for(let a of n){let n=Cf(t,a,Of);n>.5&&(!r||n>r.score)&&(r={field:a.name,cube:e.name,score:n,type:i})}};for(let t of e)(!n||n===`measure`)&&i(t,t.measures,`measure`),(!n||n===`dimension`)&&i(t,t.dimensions,`dimension`);return r}var If=cf.messages[0]?.content.text??``;async function Lf(e,t,n){return{cubes:Pf(e.getMetadata(t),{topic:n.topic,intent:n.intent,limit:n.limit,minScore:n.minScore}),queryLanguageReference:of,dateFilteringGuide:If}}function Rf(e){let t=e.split(`.`);return t.length===3&&t[0]===t[1]?`${t[0]}.${t[2]}`:e}function zf(e){let t=e=>{if(Array.isArray(e))return e.map(e=>typeof e==`string`?Rf(e):e)};if(Array.isArray(e.measures)&&(e.measures=t(e.measures)),Array.isArray(e.dimensions)&&(e.dimensions=t(e.dimensions)),Array.isArray(e.filters))for(let t of e.filters)typeof t.member==`string`&&(t.member=Rf(t.member));if(Array.isArray(e.timeDimensions))for(let t of e.timeDimensions)typeof t.dimension==`string`&&(t.dimension=Rf(t.dimension));return Array.isArray(e.order)&&(e.order=Bf(e.order)),e.order&&typeof e.order==`object`&&!Array.isArray(e.order)&&(e.order=Uf(e.order,e)),e}function Bf(e){let t={};for(let n of e)n&&typeof n==`object`&&Object.assign(t,n);return t}function Vf(e){return new Set([...Array.isArray(e.measures)?e.measures:[],...Array.isArray(e.dimensions)?e.dimensions:[]])}function Hf(e,t){let n=Rf(e);if(t.has(n))return n;if(!e.includes(`.`)&&e.includes(`_`)){let n=Rf(e.replace(/_/g,`.`));if(t.has(n))return n;let r=[...t].find(t=>{let n=t.split(`.`)[1];return n&&(e.endsWith(`_${n}`)||e.endsWith(`.${n}`))});if(r)return r}return t.size>0&&!t.has(n)?null:n}function Uf(e,t){let n=Vf(t),r={};for(let[t,i]of Object.entries(e)){let e=Hf(t,n);e!==null&&(r[e]=i)}if(Object.keys(r).length===0&&n.size>0){let e=Array.isArray(t.measures)?t.measures[0]:void 0;e&&(r[e]=`desc`)}return r}async function Wf(e,t,n){let r=zf(n.query),i=e.validateQuery(r,t);if(!i.isValid)throw Error(`Query validation failed: ${i.errors.join(`, `)}`);let a=await e.executeMultiCubeQuery(r,t);return{data:a.data,annotation:a.annotation,query:r,...a.total===void 0?{}:{total:a.total}}}var Gf=e.n({barChartConfig:()=>Kf}),Kf={clickableElements:{bar:!0},dropZones:[{key:`xAxis`,label:`chart.dropZone.xAxis.label`,description:`chart.dropZone.xAxis.description`,mandatory:!1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.bar.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.dropZone.yAxis.label`,description:`chart.configText.measures_for_bar_heights`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.bar.dropZone.yAxis.empty`,enableDualAxis:!0},{key:`series`,label:`chart.dropZone.series.label`,description:`chart.dropZone.series.description`,mandatory:!1,acceptTypes:[`dimension`],emptyText:`chart.bar.dropZone.series.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`showAllXLabels`,`hideHeader`],displayOptionsConfig:[t.u(`chart.configText.how_to_stack_multiple_bar_series`),t.d,t.n,t.i,t.s]},qf=e.n({lineChartConfig:()=>Jf}),Jf={clickableElements:{point:!0},dropZones:[{key:`xAxis`,label:`chart.configText.x_axis_time_categories`,description:`chart.configText.time_dimensions_or_dimensions_for_x_axis`,mandatory:!0,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.line.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.dropZone.yAxis.label`,description:`chart.configText.measures_for_line_values`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.line.dropZone.yAxis.empty`,enableDualAxis:!0},{key:`series`,label:`chart.configText.series_multiple_lines`,description:`chart.configText.dimensions_to_create_separate_lines`,mandatory:!1,acceptTypes:[`dimension`],emptyText:`chart.line.dropZone.series.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`showAllXLabels`,`hideHeader`],displayOptionsConfig:[t.l,t.c(),t.t,t.n,t.d,{key:`priorPeriodStyle`,label:`chart.option.priorPeriodStyle.label`,type:`select`,defaultValue:`dashed`,options:[{value:`dashed`,label:`chart.option.priorPeriodStyle.dashed`},{value:`dotted`,label:`chart.option.priorPeriodStyle.dotted`},{value:`solid`,label:`chart.option.priorPeriodStyle.solid`}],description:`chart.option.priorPeriodStyle.description`},{key:`priorPeriodOpacity`,label:`chart.option.priorPeriodOpacity.label`,type:`number`,defaultValue:.5,min:.1,max:1,step:.1,description:`chart.option.priorPeriodOpacity.description`},t.i,t.s]},Yf=e.n({areaChartConfig:()=>Xf}),Xf={dropZones:[{key:`xAxis`,label:`chart.configText.x_axis_time_categories`,description:`chart.configText.time_dimensions_or_dimensions_for_x_axis`,mandatory:!0,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.area.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.dropZone.yAxis.label`,description:`chart.configText.measures_for_area_values`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.area.dropZone.yAxis.empty`,enableDualAxis:!0},{key:`series`,label:`chart.configText.series_stack_areas`,description:`chart.configText.dimensions_to_create_stacked_areas`,mandatory:!1,acceptTypes:[`dimension`],emptyText:`chart.area.dropZone.series.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`showAllXLabels`,`hideHeader`],displayOptionsConfig:[t.l,t.c(!1),t.u(`chart.configText.how_to_stack_multiple_area_series`),t.t,t.n,t.d,t.i,t.s]},Zf=e.n({pieChartConfig:()=>Qf}),Qf={clickableElements:{slice:!0},dropZones:[{key:`xAxis`,label:`chart.configText.categories`,description:`chart.configText.dimension_for_pie_slices`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.pie.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.values`,description:`chart.configText.measure_for_slice_sizes`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.pie.dropZone.yAxis.empty`}],displayOptions:[`showLegend`,`showTooltip`,`hideHeader`],displayOptionsConfig:[{key:`innerRadius`,label:`chart.option.innerRadius.label`,type:`select`,description:`chart.configText.hollow_center_size_0_percent_solid_pie_higher_donut_style`,defaultValue:`0%`,options:[{value:`0%`,label:`chart.configText.none_pie`},{value:`20%`,label:`chart.configText.20_percent`},{value:`40%`,label:`chart.configText.40_percent`},{value:`60%`,label:`chart.configText.60_percent`},{value:`80%`,label:`chart.configText.80_percent`}]},t.f()]},$f=e.n({scatterChartConfig:()=>ep}),ep={dropZones:[{key:`xAxis`,label:`chart.runtime.axisFormat.xAxis`,description:`chart.configText.measure_or_dimension_for_x_position`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`,`measure`],emptyText:`chart.scatter.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.y_axis`,description:`chart.configText.measure_for_y_position`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.scatter.dropZone.yAxis.empty`},{key:`series`,label:`chart.configText.series_color_groups`,description:`chart.configText.dimension_to_color_points_by_category`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.scatter.dropZone.series.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`hideHeader`],displayOptionsConfig:[{key:`xAxisFormat`,label:`chart.option.xAxisFormat.label`,type:`axisFormat`,description:`chart.option.xAxisFormat.description`},{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.option.yAxisFormat.description`}]},tp=e.n({bubbleChartConfig:()=>np}),np={dropZones:[{key:`xAxis`,label:`chart.runtime.axisFormat.xAxis`,description:`chart.configText.horizontal_axis_position`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`,`measure`],emptyText:`chart.bubble.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.y_axis`,description:`chart.configText.vertical_axis_position`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.bubble.dropZone.yAxis.empty`},{key:`sizeField`,label:`chart.configText.bubble_radius`,description:`chart.configText.size_of_bubbles_based_on_this_measure`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.bubble.dropZone.sizeField.empty`},{key:`series`,label:`chart.configText.bubble_labels`,description:`chart.configText.field_to_use_for_bubble_labels_and_identification`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.bubble.dropZone.series.empty`},{key:`colorField`,label:`chart.configText.bubble_colour`,description:`chart.configText.color_bubbles_by_this_field_optional`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`,`measure`],emptyText:`chart.bubble.dropZone.colorField.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`minBubbleSize`,`maxBubbleSize`,`bubbleOpacity`,`hideHeader`],displayOptionsConfig:[{key:`xAxisFormat`,label:`chart.option.xAxisFormat.label`,type:`axisFormat`,description:`chart.option.xAxisFormat.description`},{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_y_axis_and_values`}]},rp=e.n({radarChartConfig:()=>ip}),ip={dropZones:[{key:`xAxis`,label:`chart.configText.axes_categories`,description:`chart.configText.dimensions_for_radar_axes`,mandatory:!0,acceptTypes:[`dimension`],emptyText:`chart.radar.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.values`,description:`chart.configText.measures_for_radar_values`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.radar.dropZone.yAxis.empty`},{key:`series`,label:`chart.configText.series_multiple_shapes`,description:`chart.configText.dimensions_to_create_multiple_radar_shapes`,mandatory:!1,acceptTypes:[`dimension`],emptyText:`chart.radar.dropZone.series.empty`}],displayOptions:[`showLegend`,`showGrid`,`showTooltip`,`hideHeader`],displayOptionsConfig:[t.f()]},ap=e.n({radialBarChartConfig:()=>op}),op={dropZones:[{key:`xAxis`,label:`chart.configText.categories`,description:`chart.configText.dimensions_for_radial_segments`,mandatory:!0,acceptTypes:[`dimension`],emptyText:`chart.radialBar.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.values`,description:`chart.configText.measures_for_radial_bar_lengths`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.radialBar.dropZone.yAxis.empty`}],displayOptions:[`showLegend`,`showTooltip`,`hideHeader`],displayOptionsConfig:[t.f()]},sp=e.n({treemapChartConfig:()=>cp}),cp={dropZones:[{key:`xAxis`,label:`chart.configText.categories`,description:`chart.configText.dimensions_for_treemap_rectangles`,mandatory:!0,acceptTypes:[`dimension`],emptyText:`chart.treemap.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.size`,description:`chart.configText.measure_for_rectangle_sizes`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.treemap.dropZone.yAxis.empty`},{key:`series`,label:`chart.configText.color_groups`,description:`chart.configText.dimension_to_color_rectangles_by_category`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.treemap.dropZone.series.empty`}],displayOptions:[`showLegend`,`showTooltip`,`hideHeader`],displayOptionsConfig:[t.f(`chart.configText.number_formatting_for_size_values`)],clickableElements:{cell:!0}},lp=e.n({dataTableConfig:()=>up}),up={dropZones:[{key:`xAxis`,label:`chart.configText.columns`,description:`chart.configText.all_fields_to_display_as_columns`,mandatory:!1,acceptTypes:[`dimension`,`timeDimension`,`measure`],emptyText:`chart.table.dropZone.xAxis.empty`}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`leftYAxisFormat`,label:`chart.option.valueFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_numeric_values`}]},dp=e.n({recordsTableConfig:()=>fp}),fp={dropZones:[{key:`columns`,label:`chart.recordsTable.dropZone.columns.label`,description:`chart.recordsTable.dropZone.columns.description`,mandatory:!1,acceptTypes:[`dimension`,`timeDimension`,`measure`],emptyText:`chart.recordsTable.dropZone.columns.empty`},{key:`hiddenColumns`,label:`chart.recordsTable.dropZone.hiddenColumns.label`,description:`chart.recordsTable.dropZone.hiddenColumns.description`,mandatory:!1,acceptTypes:[`dimension`,`timeDimension`,`measure`],emptyText:`chart.recordsTable.dropZone.hiddenColumns.empty`,excludeFromInference:!0}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`columnFormats`,label:`chart.recordsTable.option.columnFormats.label`,type:`columnFormats`,description:`chart.recordsTable.option.columnFormats.description`,progressBands:!0},{key:`rowLink`,label:`chart.recordsTable.option.rowLink.label`,type:`rowLink`,description:`chart.recordsTable.option.rowLink.description`},{key:`pageSize`,label:`chart.recordsTable.option.pageSize.label`,type:`select`,defaultValue:25,description:`chart.recordsTable.option.pageSize.description`,options:[{value:25,label:`chart.recordsTable.option.pageSize.option.25`},{value:50,label:`chart.recordsTable.option.pageSize.option.50`},{value:100,label:`chart.recordsTable.option.pageSize.option.100`}]}],clickableElements:{row:!0},recordGrain:!0},pp=e.n({activityGridChartConfig:()=>mp}),mp={dropZones:[{key:`dateField`,label:`chart.configText.time_dimension`,description:`chart.configText.time_field_that_determines_grid_structure_granularity_affects_layout`,mandatory:!0,maxItems:1,acceptTypes:[`timeDimension`],emptyText:`chart.activityGrid.dropZone.dateField.empty`},{key:`valueField`,label:`chart.configText.activity_measure`,description:`chart.configText.measure_used_for_activity_intensity_color_coding`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.activityGrid.dropZone.valueField.empty`}],displayOptions:[`showLabels`,`showTooltip`,`hideHeader`],displayOptionsConfig:[{key:`fitToWidth`,label:`chart.option.fitToWidth.label`,type:`boolean`,defaultValue:!1,description:`chart.option.fitToWidth.description`}],validate:e=>{let{dateField:t,valueField:n}=e;return!t||Array.isArray(t)&&t.length===0?{isValid:!1,message:`chart.activityGrid.validation.timeDimensionRequired`}:!n||Array.isArray(n)&&n.length===0?{isValid:!1,message:`chart.activityGrid.validation.measureRequired`}:{isValid:!0}},clickableElements:{cell:!0}},hp=e.n({kpiNumberConfig:()=>gp}),gp={dropZones:[{key:`yAxis`,label:`chart.configText.value`,description:`chart.configText.measure_to_display_as_kpi_number`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.kpiNumber.dropZone.yAxis.empty`}],displayOptionsConfig:[t.r,{key:`target`,label:`chart.runtime.tooltip.targetValue`,type:`string`,placeholder:`e.g., 100`,description:`chart.configText.target_value_to_compare_against_first_value_used_if_multiple_provided`},{key:`prefix`,label:`chart.option.prefix.label`,type:`string`,placeholder:`e.g., $, €, #`,description:`chart.option.prefix.description`},{key:`suffix`,label:`chart.option.suffix.label`,type:`string`,placeholder:`e.g., %, units, items`,description:`chart.option.suffix.description`},{key:`decimals`,label:`chart.option.decimals.label`,type:`number`,defaultValue:0,min:0,max:10,step:1,description:`chart.option.decimals.description`},{key:`valueColorIndex`,label:`chart.configText.value_color`,type:`paletteColor`,defaultValue:0,description:`chart.configText.color_from_the_dashboard_palette_for_the_kpi_value_text`},{key:`useLastCompletePeriod`,label:`chart.option.useLastCompletePeriod.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.exclude_current_incomplete_period_from_aggregation_e_g_partial_week_mont`},{key:`skipLastPeriod`,label:`chart.option.skipLastPeriod.label`,type:`boolean`,defaultValue:!1,description:`chart.option.skipLastPeriod.description`}],displayOptions:[`hideHeader`]},_p=e.n({kpiDeltaConfig:()=>vp}),vp={dropZones:[{key:`yAxis`,label:`chart.configText.value`,description:`chart.configText.measure_to_track_changes_for`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.kpiDelta.dropZone.yAxis.empty`},{key:`xAxis`,label:`chart.configText.dimension_optional`,description:`chart.configText.dimension_for_ordering_data_typically_time`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.kpiDelta.dropZone.xAxis.empty`}],displayOptionsConfig:[t.r,{key:`showBaseline`,label:`chart.option.showBaseline.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showBaseline.description`},{key:`prefix`,label:`chart.option.prefix.label`,type:`string`,placeholder:`e.g., $, €, #`,description:`chart.option.prefix.description`},{key:`suffix`,label:`chart.option.suffix.label`,type:`string`,placeholder:`e.g., %, units, items`,description:`chart.option.suffix.description`},{key:`decimals`,label:`chart.option.decimals.label`,type:`number`,defaultValue:1,min:0,max:10,step:1,description:`chart.option.decimals.description`},{key:`positiveColorIndex`,label:`chart.configText.positive_change_color`,type:`paletteColor`,defaultValue:2,description:`chart.configText.color_for_positive_changes_increases`},{key:`negativeColorIndex`,label:`chart.configText.negative_change_color`,type:`paletteColor`,defaultValue:3,description:`chart.configText.color_for_negative_changes_decreases`},{key:`showHistogram`,label:`chart.option.showHistogram.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showHistogram.description`},{key:`useLastCompletePeriod`,label:`chart.option.useLastCompletePeriod.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.exclude_current_incomplete_period_from_delta_calculation_e_g_partial_wee`},{key:`skipLastPeriod`,label:`chart.option.skipLastPeriod.label`,type:`boolean`,defaultValue:!1,description:`chart.option.skipLastPeriod.description`}],displayOptions:[`hideHeader`],validate:e=>!e.yAxis||Array.isArray(e.yAxis)&&e.yAxis.length===0?{isValid:!1,message:`chart.kpiDelta.validation.measureRequired`}:{isValid:!0}},yp=e.n({kpiTextConfig:()=>bp}),bp={dropZones:[{key:`yAxis`,label:`chart.configText.value`,description:`chart.configText.measure_to_display_in_the_kpi_text_template`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.kpiText.dropZone.yAxis.empty`}],displayOptionsConfig:[{key:`template`,label:`chart.configText.text_template`,type:`string`,placeholder:"e.g., Total Revenue: ${value}",description:`chart.configText.template_for_displaying_the_text_use_value_to_insert_the_measure_value`},{key:`decimals`,label:`chart.option.decimals.label`,type:`number`,defaultValue:0,min:0,max:10,step:1,description:`chart.configText.number_of_decimal_places_to_display_for_numeric_values`},{key:`valueColorIndex`,label:`chart.configText.value_color`,type:`paletteColor`,defaultValue:0,description:`chart.configText.color_from_the_dashboard_palette_for_the_kpi_value_text`}],displayOptions:[`hideHeader`]},xp=e.n({markdownConfig:()=>Sp}),Sp={skipQuery:!0,dropZones:[],displayOptionsConfig:[{key:`content`,label:`chart.configText.markdown_content`,type:`string`,placement:`chart`,rows:18,syntax:`markdownTemplate`,placeholder:`chart.markdown.contentPlaceholder`,description:`chart.markdown.contentDescription`,docsUrl:`https://knap.md/variables`,docsLabel:`chart.markdown.contentDocsLabel`},{key:`accentColorIndex`,label:`chart.configText.accent_color`,type:`paletteColor`,defaultValue:0,description:`chart.configText.color_from_the_dashboard_palette_for_headers_bullets_and_links`},{key:`fontSize`,label:`chart.option.fontSize.label`,type:`select`,defaultValue:`medium`,options:[{value:`small`,label:`chart.option.fontSize.small`},{value:`medium`,label:`chart.option.fontSize.medium`},{value:`large`,label:`chart.option.fontSize.large`}],description:`chart.configText.overall_text_size_for_the_markdown_content`},{key:`alignment`,label:`chart.option.alignment.label`,type:`select`,defaultValue:`left`,options:[{value:`left`,label:`chart.option.accentBorder.left`},{value:`center`,label:`chart.option.alignment.center`},{value:`right`,label:`chart.option.alignment.right`}],description:`chart.configText.horizontal_alignment_of_the_markdown_content`},{key:`hideHeader`,label:`chart.option.hideHeader.label`,type:`boolean`,defaultValue:!0,description:`chart.option.hideHeader.description`},{key:`transparentBackground`,label:`chart.option.transparentBackground.label`,type:`boolean`,defaultValue:!1,description:`chart.option.transparentBackground.description`},{key:`autoHeight`,label:`chart.option.autoHeight.label`,type:`boolean`,defaultValue:!0,description:`chart.option.autoHeight.description`},{key:`accentBorder`,label:`chart.option.accentBorder.label`,type:`select`,defaultValue:`none`,options:[{value:`none`,label:`chart.option.accentBorder.none`},{value:`left`,label:`chart.option.accentBorder.left`},{value:`top`,label:`chart.option.accentBorder.top`},{value:`bottom`,label:`chart.option.accentBorder.bottom`}],description:`chart.configText.add_an_accent_colored_border_on_one_side_of_the_content`}]},Cp=e.n({funnelChartConfig:()=>wp}),wp={dropZones:[{key:`xAxis`,label:`chart.configText.step_name`,description:`chart.configText.step_names_auto_populated_from_funnel_steps`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.funnel.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.step_count`,description:`chart.configText.count_at_each_step_auto_calculated`,mandatory:!1,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.funnel.dropZone.yAxis.empty`}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`funnelStyle`,label:`chart.option.funnelStyle.label`,type:`buttonGroup`,defaultValue:`bars`,options:[{value:`bars`,label:`chart.option.funnelStyle.bars`},{value:`funnel`,label:`chart.option.funnelStyle.funnel`}],description:`chart.configText.visualization_style`},{key:`funnelOrientation`,label:`chart.option.funnelOrientation.label`,type:`buttonGroup`,defaultValue:`horizontal`,options:[{value:`horizontal`,label:`chart.option.funnelOrientation.horizontal`},{value:`vertical`,label:`chart.option.funnelOrientation.vertical`}]},{key:`hideSummaryFooter`,label:`chart.option.hideSummaryFooter.label`,type:`boolean`,defaultValue:!1,description:`chart.option.hideSummaryFooter.description`},{key:`showFunnelConversion`,label:`chart.option.showConversion.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showConversion.description`},{key:`showFunnelAvgTime`,label:`chart.option.showAvgTime.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showAvgTime.description`},{key:`showFunnelMedianTime`,label:`chart.option.showMedianTime.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showMedianTime.description`},{key:`showFunnelP90Time`,label:`chart.option.showP90Time.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showP90Time.description`}]},Tp=e.n({sankeyChartConfig:()=>Ep}),Ep={dropZones:[{key:`xAxis`,label:`chart.configText.event_type`,description:`chart.configText.event_dimension_that_categorizes_flow_nodes`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.sankey.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.flow_count`,description:`chart.configText.count_of_entities_following_each_path`,mandatory:!1,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.sankey.dropZone.yAxis.empty`}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`linkOpacity`,label:`chart.option.linkOpacity.label`,type:`buttonGroup`,defaultValue:`0.5`,options:[{value:`0.3`,label:`chart.option.linkOpacity.light`},{value:`0.5`,label:`chart.option.fontSize.medium`},{value:`0.7`,label:`chart.option.linkOpacity.dark`}],description:`chart.configText.opacity_of_flow_links`},{key:`showNodeLabels`,label:`chart.option.showNodeLabels.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showNodeLabels.description`},{key:`hideSummaryFooter`,label:`chart.option.hideSummaryFooter.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.hide_the_statistics_footer_below_the_chart`}]},Dp=e.n({sunburstChartConfig:()=>Op}),Op={dropZones:[{key:`xAxis`,label:`chart.configText.event_type`,description:`chart.configText.event_dimension_that_categorizes_flow_nodes`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.sunburst.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.flow_count`,description:`chart.configText.count_of_entities_following_each_path`,mandatory:!1,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.sunburst.dropZone.yAxis.empty`}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`innerRadius`,label:`chart.option.innerRadius.label`,type:`number`,defaultValue:40,min:0,max:100,step:10,description:`chart.configText.size_of_the_center_hole_0_for_full_circle`},{key:`hideSummaryFooter`,label:`chart.option.hideSummaryFooter.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.hide_the_statistics_footer_below_the_chart`}]},kp=e.n({heatmapChartConfig:()=>Ap}),Ap={dropZones:[{key:`xAxis`,label:`chart.configText.columns_x_axis`,description:`chart.configText.dimension_for_column_categories`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.heatmap.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.rows_y_axis`,description:`chart.configText.dimension_for_row_categories`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.heatmap.dropZone.yAxis.empty`},{key:`valueField`,label:`chart.configText.value_color_intensity`,description:`chart.configText.measure_that_determines_cell_color`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.heatmap.dropZone.valueField.empty`}],displayOptions:[`showLegend`,`showTooltip`],displayOptionsConfig:[{key:`showLabels`,label:`chart.option.showLabels.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showLabels.description`},{key:`cellShape`,label:`chart.option.cellShape.label`,type:`select`,defaultValue:`rect`,options:[{value:`rect`,label:`chart.option.cellShape.rectangle`},{value:`circle`,label:`chart.option.cellShape.circle`}]},{key:`xAxisFormat`,label:`chart.option.xAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_x_axis_labels`},{key:`yAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_y_axis_labels`},{key:`valueFormat`,label:`chart.option.valueFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_cell_values_and_legend`}],validate:e=>e.xAxis?.length?e.yAxis?.length?e.valueField?.length?{isValid:!0}:{isValid:!1,message:`chart.heatmap.validation.valueRequired`}:{isValid:!1,message:`chart.heatmap.validation.yAxisRequired`}:{isValid:!1,message:`chart.heatmap.validation.xAxisRequired`}},jp=e.n({retentionHeatmapConfig:()=>Mp}),Mp={dropZones:[],displayOptionsConfig:[{key:`showLegend`,label:`chart.option.showLegend.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.show_the_color_intensity_legend`},{key:`showTooltip`,label:`chart.option.showTooltip.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showTooltip.description`}]},Np=e.n({retentionCombinedConfig:()=>Pp}),Pp={dropZones:[],displayOptionsConfig:[{key:`retentionDisplayMode`,label:`chart.option.retentionDisplayMode.label`,type:`select`,defaultValue:`line`,options:[{value:`line`,label:`chart.option.retentionDisplayMode.lineChart`},{value:`heatmap`,label:`chart.option.retentionDisplayMode.heatmapTable`},{value:`combined`,label:`chart.option.retentionDisplayMode.combined`}],description:`chart.configText.choose_how_to_visualize_retention_data`},{key:`showLegend`,label:`chart.option.showLegend.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.show_the_legend_for_breakdown_segments`},{key:`showGrid`,label:`chart.option.showGrid.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showGrid.description`},{key:`showTooltip`,label:`chart.option.showTooltip.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showTooltip.description`}]},Fp=e.n({boxPlotChartConfig:()=>Ip}),Ip={displayOptions:[`hideHeader`],dropZones:[{key:`xAxis`,label:`chart.configText.x_axis_groups`,description:`chart.configText.dimension_to_group_boxes_by_e_g_symbol_platform`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.boxPlot.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.y_axis_measures`,description:`chart.configText.drop_1_measure_for_auto_mode_3_for_avg_stddev_median_mode_or_5_for_min_q`,mandatory:!0,maxItems:5,acceptTypes:[`measure`],emptyText:`chart.boxPlot.dropZone.yAxis.empty`}],displayOptionsConfig:[{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_the_value_axis`}]},Lp=e.n({dotStripChartConfig:()=>Rp}),Rp={displayOptions:[`showGrid`,`showTooltip`,`hideHeader`],dropZones:[{key:`xAxis`,label:`chart.dotStrip.dropZone.xAxis.label`,description:`chart.dotStrip.dropZone.xAxis.description`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.dotStrip.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.dotStrip.dropZone.yAxis.label`,description:`chart.dotStrip.dropZone.yAxis.description`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.dotStrip.dropZone.yAxis.empty`},{key:`series`,label:`chart.dotStrip.dropZone.series.label`,description:`chart.dotStrip.dropZone.series.description`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.dotStrip.dropZone.series.empty`}],clickableElements:{point:!0},displayOptionsConfig:[{key:`showMedianMarker`,label:`chart.option.showMedianMarker.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showMedianMarker.description`},{key:`showBandStats`,label:`chart.option.showBandStats.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showBandStats.description`},{key:`showExtremeLabels`,label:`chart.option.showExtremeLabels.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showExtremeLabels.description`},{key:`dotSize`,label:`chart.option.dotSize.label`,type:`select`,defaultValue:`medium`,options:[{value:`small`,label:`chart.option.dotSize.small`},{value:`medium`,label:`chart.option.dotSize.medium`},{value:`large`,label:`chart.option.dotSize.large`}],description:`chart.option.dotSize.description`},{key:`bandSort`,label:`chart.option.bandSort.label`,type:`select`,defaultValue:`none`,options:[{value:`none`,label:`chart.option.bandSort.none`},{value:`valueDesc`,label:`chart.option.bandSort.valueDesc`},{value:`valueAsc`,label:`chart.option.bandSort.valueAsc`},{value:`count`,label:`chart.option.bandSort.count`}],description:`chart.option.bandSort.description`},{key:`xAxisFormat`,label:`chart.option.xAxisFormat.label`,type:`axisFormat`,description:`chart.option.xAxisFormat.description`}]},zp=e.n({waterfallChartConfig:()=>Bp}),Bp={clickableElements:{bar:!0},displayOptions:[`showTooltip`,`hideHeader`],dropZones:[{key:`xAxis`,label:`chart.dropZone.xAxis.label`,description:`chart.configText.dimension_labels_for_each_bar_segment_e_g_symbol_transaction_type`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.waterfall.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.y_axis_value`,description:`chart.configText.single_measure_whose_values_are_summed_cumulatively`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.waterfall.dropZone.yAxis.empty`}],displayOptionsConfig:[{key:`showTotal`,label:`chart.option.showTotal.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showTotal.description`},{key:`showConnectorLine`,label:`chart.option.showConnectorLine.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showConnectorLine.description`},{key:`showDataLabels`,label:`chart.option.showDataLabels.label`,type:`boolean`,defaultValue:!1,description:`chart.configText.display_the_value_above_each_bar_segment`},{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_the_y_axis`}]},Vp=e.n({candlestickChartConfig:()=>Hp}),Hp={clickableElements:{bar:!0},displayOptions:[`hideHeader`],dropZones:[{key:`xAxis`,label:`chart.configText.x_axis_time_category`,description:`chart.configText.time_dimension_or_category_for_each_candle_e_g_date_symbol`,mandatory:!0,maxItems:1,acceptTypes:[`timeDimension`,`dimension`],emptyText:`chart.candlestick.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.ohlc_measures_open_close_high_low`,description:`chart.configText.drop_2_4_measures_in_order_open_close_high_low_ohlc_mode_for_range_mode_`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.candlestick.dropZone.yAxis.empty`}],displayOptionsConfig:[{key:`rangeMode`,label:`chart.option.rangeMode.label`,type:`select`,defaultValue:`ohlc`,options:[{value:`ohlc`,label:`chart.option.rangeMode.ohlc`},{value:`range`,label:`chart.option.rangeMode.range`}],description:`chart.option.rangeMode.description`},{key:`bullColor`,label:`chart.option.bullColor.label`,type:`color`,defaultValue:`#22c55e`,description:`chart.option.bullColor.description`},{key:`bearColor`,label:`chart.option.bearColor.label`,type:`color`,defaultValue:`#ef4444`,description:`chart.option.bearColor.description`},{key:`showWicks`,label:`chart.option.showWicks.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showWicks.description`},{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_the_price_axis`}]},Up=e.n({measureProfileChartConfig:()=>Wp}),Wp={displayOptions:[`showLegend`,`showTooltip`,`hideHeader`],dropZones:[{key:`yAxis`,label:`chart.configText.measures_x_axis_order`,description:`chart.configText.add_2_or_more_measures_they_become_the_x_axis_categories_in_the_order_li`,mandatory:!0,acceptTypes:[`measure`],emptyText:`chart.measureProfile.dropZone.yAxis.empty`},{key:`series`,label:`chart.configText.series_split_into_multiple_lines`,description:`chart.configText.dimension_to_split_data_into_separate_profile_lines_e_g_symbol_platform`,mandatory:!1,maxItems:1,acceptTypes:[`dimension`],emptyText:`chart.measureProfile.dropZone.series.empty`}],displayOptionsConfig:[{key:`showReferenceLineAtZero`,label:`chart.option.showReferenceLineAtZero.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showReferenceLineAtZero.description`},{key:`showDataLabels`,label:`chart.option.showDataLabels.label`,type:`boolean`,defaultValue:!1,description:`chart.configText.display_value_at_each_data_point`},{key:`showLegend`,label:`chart.option.showLegend.label`,type:`boolean`,defaultValue:!0,description:`chart.configText.show_series_legend_only_visible_with_a_series_dimension`},{key:`lineType`,label:`chart.option.lineType.label`,type:`select`,defaultValue:`monotone`,options:[{value:`monotone`,label:`chart.option.lineType.smooth`},{value:`linear`,label:`chart.option.lineType.linear`},{value:`step`,label:`chart.option.lineType.step`}],description:`chart.option.lineType.description`},{key:`leftYAxisFormat`,label:`chart.option.yAxisFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_the_y_axis`}]},Gp=e.n({proportionBarChartConfig:()=>Kp}),Kp={dropZones:[{key:`xAxis`,label:`chart.configText.category`,description:`chart.configText.dimension_to_split_the_bar_into_segments`,mandatory:!0,maxItems:1,acceptTypes:[`dimension`,`timeDimension`],emptyText:`chart.proportionBar.dropZone.xAxis.empty`},{key:`yAxis`,label:`chart.configText.value`,description:`chart.configText.measure_that_determines_each_segments_share`,mandatory:!0,maxItems:1,acceptTypes:[`measure`],emptyText:`chart.proportionBar.dropZone.yAxis.empty`}],displayOptions:[`hideHeader`],displayOptionsConfig:[{key:`showLabels`,label:`chart.option.proportionBarLabels.label`,type:`boolean`,defaultValue:!0,description:`chart.option.proportionBarLabels.description`},{key:`showPercentages`,label:`chart.option.showPercentages.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showPercentages.description`},{key:`sortSegments`,label:`chart.option.sortSegments.label`,type:`boolean`,defaultValue:!1,description:`chart.option.sortSegments.description`},{key:`decimals`,label:`chart.option.decimals.label`,type:`number`,defaultValue:0,min:0,max:2,description:`chart.option.proportionBarDecimals.description`}],validate:e=>!e?.xAxis||Array.isArray(e.xAxis)&&e.xAxis.length===0?{isValid:!1,message:`chart.proportionBar.validation.dimensionRequired`}:!e?.yAxis||Array.isArray(e.yAxis)&&e.yAxis.length===0?{isValid:!1,message:`chart.proportionBar.validation.measureRequired`}:{isValid:!0}},qp=e.n({gaugeChartConfig:()=>Jp}),Jp={clickableElements:{},displayOptions:[`hideHeader`],dropZones:[{key:`yAxis`,label:`chart.configText.value_measure`,description:`chart.configText.current_value_to_display_on_the_gauge_e_g_current_equity_margin_used`,mandatory:!0,maxItems:2,acceptTypes:[`measure`],emptyText:`chart.gauge.dropZone.yAxis.empty`}],displayOptionsConfig:[{key:`minValue`,label:`chart.option.minValue.label`,type:`number`,defaultValue:0,description:`chart.option.minValue.description`},{key:`maxValue`,label:`chart.option.maxValue.label`,type:`number`,description:`chart.option.maxValue.description`},{key:`thresholds`,label:`chart.configText.threshold_bands`,type:`thresholdBands`,description:`chart.gauge.thresholds.description`},{key:`showCenterLabel`,label:`chart.option.showCentreLabel.label`,type:`boolean`,defaultValue:!0,description:`chart.option.showCentreLabel.description`},{key:`showPercentage`,label:`chart.option.showPercentage.label`,type:`boolean`,defaultValue:!1,description:`chart.option.showPercentage.description`},{key:`leftYAxisFormat`,label:`chart.option.valueFormat.label`,type:`axisFormat`,description:`chart.configText.number_formatting_for_the_displayed_value_and_axis_labels`}]},Q={packageName:`recharts`,installCommand:`npm install recharts`},Yp={bar:{label:`chart.bar.label`,icon:`chartBar`,description:`chart.bar.description`,useCase:`chart.bar.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Gf)).barChartConfig},line:{label:`chart.line.label`,icon:`chartLine`,description:`chart.line.description`,useCase:`chart.line.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>qf)).lineChartConfig},area:{label:`chart.area.label`,icon:`chartArea`,description:`chart.area.description`,useCase:`chart.area.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Yf)).areaChartConfig},pie:{label:`chart.pie.label`,icon:`chartPie`,description:`chart.pie.description`,useCase:`chart.pie.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Zf)).pieChartConfig},scatter:{label:`chart.scatter.label`,icon:`chartScatter`,description:`chart.scatter.description`,useCase:`chart.scatter.useCase`,isAvailable:({measureCount:e,dimensionCount:t})=>e<1?{available:!1,reason:`chart.availability.requiresMeasure`}:e<2&&t<1?{available:!1,reason:`chart.availability.scatter`}:{available:!0},dependencies:Q,config:async()=>(await Promise.resolve().then(()=>$f)).scatterChartConfig},bubble:{label:`chart.bubble.label`,icon:`chartBubble`,description:`chart.bubble.description`,useCase:`chart.bubble.useCase`,isAvailable:({measureCount:e,dimensionCount:t})=>e<2?{available:!1,reason:`chart.availability.requiresTwoMeasures`}:t<1?{available:!1,reason:`chart.availability.bubble`}:{available:!0},dependencies:Q,config:async()=>(await Promise.resolve().then(()=>tp)).bubbleChartConfig},radar:{label:`chart.radar.label`,icon:`chartRadar`,description:`chart.radar.description`,useCase:`chart.radar.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>rp)).radarChartConfig},radialBar:{label:`chart.radialBar.label`,icon:`chartRadialBar`,description:`chart.radialBar.description`,useCase:`chart.radialBar.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>ap)).radialBarChartConfig},treemap:{label:`chart.treemap.label`,icon:`chartTreemap`,description:`chart.treemap.description`,useCase:`chart.treemap.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>sp)).treemapChartConfig},table:{label:`chart.table.label`,icon:`chartTable`,description:`chart.table.description`,useCase:`chart.table.useCase`,config:async()=>(await Promise.resolve().then(()=>lp)).dataTableConfig},recordsTable:{label:`chart.recordsTable.label`,icon:`chartRecordsTable`,description:`chart.recordsTable.description`,useCase:`chart.recordsTable.useCase`,config:async()=>(await Promise.resolve().then(()=>dp)).recordsTableConfig},activityGrid:{label:`chart.activityGrid.label`,icon:`chartActivityGrid`,description:`chart.activityGrid.description`,useCase:`chart.activityGrid.useCase`,isAvailable:({measureCount:e,timeDimensionCount:t})=>e<1?{available:!1,reason:`chart.availability.requiresMeasure`}:t<1?{available:!1,reason:`chart.availability.requiresTimeDimension`}:{available:!0},config:async()=>(await Promise.resolve().then(()=>pp)).activityGridChartConfig},kpiNumber:{label:`chart.kpiNumber.label`,icon:`chartKpiNumber`,description:`chart.kpiNumber.description`,useCase:`chart.kpiNumber.useCase`,isAvailable:t.a,config:async()=>(await Promise.resolve().then(()=>hp)).kpiNumberConfig},kpiDelta:{label:`chart.kpiDelta.label`,icon:`chartKpiDelta`,description:`chart.kpiDelta.description`,useCase:`chart.kpiDelta.useCase`,isAvailable:t.o,config:async()=>(await Promise.resolve().then(()=>_p)).kpiDeltaConfig},kpiText:{label:`chart.kpiText.label`,icon:`chartKpiText`,description:`chart.kpiText.description`,useCase:`chart.kpiText.useCase`,isAvailable:t.a,config:async()=>(await Promise.resolve().then(()=>yp)).kpiTextConfig},markdown:{label:`chart.markdown.label`,icon:`chartMarkdown`,description:`chart.markdown.description`,useCase:`chart.markdown.useCase`,config:async()=>(await Promise.resolve().then(()=>xp)).markdownConfig},funnel:{label:`chart.funnel.label`,icon:`chartFunnel`,description:`chart.funnel.description`,useCase:`chart.funnel.useCase`,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Cp)).funnelChartConfig},sankey:{label:`chart.sankey.label`,icon:`chartSankey`,description:`chart.sankey.description`,useCase:`chart.sankey.useCase`,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Tp)).sankeyChartConfig},sunburst:{label:`chart.sunburst.label`,icon:`chartSunburst`,description:`chart.sunburst.description`,useCase:`chart.sunburst.useCase`,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Dp)).sunburstChartConfig},heatmap:{label:`chart.heatmap.label`,icon:`chartHeatmap`,description:`chart.heatmap.description`,useCase:`chart.heatmap.useCase`,isAvailable:({measureCount:e,dimensionCount:t})=>e<1?{available:!1,reason:`chart.availability.requiresMeasure`}:t<2?{available:!1,reason:`chart.availability.requiresTwoDimensions`}:{available:!0},dependencies:{packageName:`@nivo/heatmap`,installCommand:`npm install @nivo/heatmap`},config:async()=>(await Promise.resolve().then(()=>kp)).heatmapChartConfig},retentionHeatmap:{label:`chart.retentionHeatmap.label`,icon:`chartRetention`,description:`chart.retentionHeatmap.description`,useCase:`chart.retentionHeatmap.useCase`,config:async()=>(await Promise.resolve().then(()=>jp)).retentionHeatmapConfig},retentionCombined:{label:`chart.retentionCombined.label`,icon:`chartRetention`,description:`chart.retentionCombined.description`,useCase:`chart.retentionCombined.useCase`,config:async()=>(await Promise.resolve().then(()=>Np)).retentionCombinedConfig},boxPlot:{label:`chart.boxPlot.label`,icon:`chartBoxPlot`,description:`chart.boxPlot.description`,useCase:`chart.boxPlot.useCase`,isAvailable:t.o,config:async()=>(await Promise.resolve().then(()=>Fp)).boxPlotChartConfig},dotStrip:{label:`chart.dotStrip.label`,icon:`chartDotStrip`,description:`chart.dotStrip.description`,useCase:`chart.dotStrip.useCase`,isAvailable:t.o,config:async()=>(await Promise.resolve().then(()=>Lp)).dotStripChartConfig},waterfall:{label:`chart.waterfall.label`,icon:`chartWaterfall`,description:`chart.waterfall.description`,useCase:`chart.waterfall.useCase`,isAvailable:t.o,dependencies:Q,config:async()=>(await Promise.resolve().then(()=>zp)).waterfallChartConfig},candlestick:{label:`chart.candlestick.label`,icon:`chartCandlestick`,description:`chart.candlestick.description`,useCase:`chart.candlestick.useCase`,isAvailable:({measureCount:e,dimensionCount:t})=>e<2?{available:!1,reason:`chart.availability.requiresTwoMeasures`}:t<1?{available:!1,reason:`chart.availability.requiresDimension`}:{available:!0},config:async()=>(await Promise.resolve().then(()=>Vp)).candlestickChartConfig},measureProfile:{label:`chart.measureProfile.label`,icon:`chartMeasureProfile`,description:`chart.measureProfile.description`,useCase:`chart.measureProfile.useCase`,isAvailable:({measureCount:e})=>e<2?{available:!1,reason:`chart.availability.requiresTwoMeasures`}:{available:!0},dependencies:Q,config:async()=>(await Promise.resolve().then(()=>Up)).measureProfileChartConfig},proportionBar:{label:`chart.proportionBar.label`,icon:`chartProportionBar`,description:`chart.proportionBar.description`,useCase:`chart.proportionBar.useCase`,isAvailable:t.o,config:async()=>(await Promise.resolve().then(()=>Gp)).proportionBarChartConfig},gauge:{label:`chart.gauge.label`,icon:`chartGauge`,description:`chart.gauge.description`,useCase:`chart.gauge.useCase`,isAvailable:t.a,dependencies:{packageName:`d3-shape`,installCommand:`npm install d3-shape`},config:async()=>(await Promise.resolve().then(()=>qp)).gaugeChartConfig}};function Xp(e,t){return{...t,label:e.label,description:e.description,useCase:e.useCase,isAvailable:e.isAvailable}}var Zp={bar:Kf,line:Jf,area:Xf,pie:Qf,scatter:ep,bubble:np,radar:ip,radialBar:op,treemap:cp,table:up,recordsTable:fp,activityGrid:mp,kpiNumber:gp,kpiDelta:vp,kpiText:bp,markdown:Sp,funnel:wp,sankey:Ep,sunburst:Op,heatmap:Ap,retentionHeatmap:Mp,retentionCombined:Pp,boxPlot:Ip,dotStrip:Rp,waterfall:Bp,candlestick:Hp,measureProfile:Wp,proportionBar:Kp,gauge:Jp},Qp=Object.fromEntries(Object.keys(Yp).map(e=>[e,Xp(Yp[e],Zp[e])]));function $p(e){return Qp[e]?.recordGrain===!0}function em(e){return Array.isArray(e)?e.length>0:!!e}function tm(e){let t=e.timeDimensions??[];return e.ungrouped?t:t.filter(e=>!!e.granularity)}function nm(e,t,n,r){for(let i of e.dropZones){if(!i.mandatory||em(n?.[i.key]))continue;let e=i.acceptTypes?.join(`/`)??`fields`;r.push(E(`server.validation.chart.dropZoneRequired`,{key:i.key,chartType:t,label:i.label,acceptDesc:e}))}}function rm(e,t,n){if(em(e?.xAxis))return;let r=t.dimensions??[],i=tm(t),a=r.length>0||i.length>0;n.push(E(a?`server.validation.chart.barXAxisRequired`:`server.validation.chart.barNeedsDimension`))}function im(e){return Array.isArray(e)?e:[e]}function am(e,t){if(!e?.xAxis||!e?.series)return;let n=new Set(im(e.xAxis)),r=im(e.series).filter(e=>n.has(e));r.length>0&&t.push(E(`server.validation.chart.seriesDuplicatesXAxis`,{duplicates:r.join(`, `)}))}function om(e,t,n){$p(e)&&t.ungrouped!==!0&&n.push(E(`server.validation.chart.recordGrainNeedsUngrouped`,{chartType:e}))}function sm(e,t,n){let r=Qp[e];if(!r||r.skipQuery)return{isValid:!0,errors:[]};let i=[];return nm(r,e,t,i),om(e,n,i),e===`bar`&&rm(t,n,i),am(t,i),{isValid:i.length===0,errors:i}}function cm(e,t,n){if(e!==`bar`||em(t?.xAxis))return{chartType:e};let r=n.dimensions??[],i=tm(n);if(r.length>0||i.length>0)return{chartType:e};let a=(n.measures??[]).length===1?`kpiNumber`:`table`;return{chartType:a,note:`Note: chartType was changed from "bar" to "${a}" because the query has no dimension, so a bar chart would have no category axis to label its bars. For a real bar chart, put the category in the query's dimensions and use a single measure. To plot several measures as an ordered profile instead, use "measureProfile".`}}function lm(e,t,n,r){if(!(e.acceptTypes??[]).includes(`measure`))return;let i=new Set;for(let r of t.dropZones){if(r.key===e.key)continue;let t=n[r.key];Array.isArray(t)?t.forEach(e=>i.add(e)):typeof t==`string`&&i.add(t)}let a=r.filter(e=>!i.has(e));a.length>0&&(n[e.key]=a[0])}function um(e,t){let n=new Set;for(let[r,i]of Object.entries(e))if(r!==t){if(Array.isArray(i))for(let e of i)typeof e==`string`&&n.add(e);else typeof i==`string`&&n.add(i)}return n}function dm(e,t,n){let r=e.acceptTypes??[],i=[];if(r.includes(`dimension`)&&i.push(...n.dimensions),r.includes(`timeDimension`)&&i.push(...n.timeDimFields),r.includes(`measure`)&&i.push(...n.measures),i.length===0)return;let a=um(t,e.key),o=i.filter(e=>!a.has(e));if(o.length===0)return;let s=e.maxItems??1/0,c=o.slice(0,s);c.length>0&&(t[e.key]=c)}function fm(e,t,n){let r=Qp[e];if(!r)return t??{};let i={...t},a=tm(n),o={measures:n.measures??[],dimensions:n.dimensions??[],timeDimFields:a.map(e=>e.dimension)};for(let e of r.dropZones)e.excludeFromInference||em(i[e.key])||(e.key===`sizeField`||e.key===`colorField`?lm(e,r,i,o.measures):dm(e,i,o));return i}function pm(e){return e?ot(e)?E(e):e:``}function mm(e){let t=[`
824
824
  Chart config requirements by type:`];for(let n of e){let e=Qp[n];if(!e)continue;let r=[pm(e.description),pm(e.useCase)].filter(Boolean).join(`. `),i=r?` — ${r}.`:``,a=$p(n)?` Query MUST set "ungrouped": true, which also means one cube plus its to-one joins — an ungrouped query cannot span a hasMany relationship.`:``,o=e.dropZones.filter(e=>e.mandatory);if(o.length===0&&!e.skipQuery){t.push(` ${n}${i}${a} chartConfig auto-inferred from query.`);continue}if(e.skipQuery){t.push(` ${n}${i} Query optional: omit it for static text, or supply one to render displayConfig.content as a data template.`);continue}let s=o.map(e=>{let t=e.acceptTypes?.join(`/`)??`any`,n=e.maxItems?` (max ${e.maxItems})`:``;return`${e.key}=[${t}]${n}`});t.push(` ${n}${i}${a} Requires ${s.join(`, `)}.`)}return t.join(`
825
- `)}function hm(e,t,n,r){let i=new Set,a=0,o,s,c=!0;for(let n of e){let e=n[t];if(e==null){a++;continue}i.add(e);let r=typeof e==`number`?e:Number(e);typeof e==`boolean`||Number.isNaN(r)?c=!1:(o=o===void 0||r<o?r:o,s=s===void 0||r>s?r:s)}return{field:t,kind:n,...r?{type:r}:{},distinctCount:i.size,nullCount:a,...c&&o!==void 0?{min:o,max:s}:{}}}function gm(e,t){if(e.length===0)return[];let n=[],r=new Set,i=[[`dimension`,t?.dimensions],[`timeDimension`,t?.timeDimensions],[`measure`,t?.measures]];for(let[t,a]of i)for(let[i,o]of Object.entries(a??{}))r.add(i),n.push(hm(e,i,t,o?.type));for(let t of Object.keys(e[0]))r.has(t)||n.push(hm(e,t,`dimension`,void 0));return n}var _m={valueField:{type:`array`,items:{type:`string`},description:`heatmap and activityGrid: single measure driving cell colour intensity. Required for both — the chart renders empty without it.`},dateField:{type:`array`,items:{type:`string`},description:`activityGrid only: single time dimension laying out the grid. Query it with day granularity over several months, or the grid has nothing to show.`}},vm={minValue:{type:`number`,description:`gauge only: scale minimum (defaults to 0).`},maxValue:{type:`number`,description:`gauge only: scale maximum. ALWAYS set this — without it the gauge scales to the data it was given, so a single value always reads as 100%.`},template:{type:`string`,description:'kpiText only: sentence template around the value, e.g. "${fieldLabel}: ${value}". Defaults to that if omitted.'}},ym={columns:{type:`array`,items:{type:`string`},description:`recordsTable only: fields to render as columns, in this order. Omit to show every field the query returns, in query order.`},hiddenColumns:{type:`array`,items:{type:`string`},description:`recordsTable only: fields fetched for row context or rowLink tokens but never displayed (e.g. an id used in the URL template). Leave empty unless a field is genuinely only needed behind the scenes — anything listed here disappears from the table.`}},bm={columnFormats:{type:`object`,description:`recordsTable only: how each column renders, keyed by field name (e.g. "Employees.salary"). Formats are never inferred from the data — a column is plain text unless you say otherwise, so set this for any numeric, date, status or ratio column.`,additionalProperties:{type:`object`,required:[`kind`],properties:{kind:{type:`string`,enum:[`text`,`number`,`date`,`badge`,`progress`],description:`Required on every entry. text: as-is. number: formatted numeric. date: formatted date. badge: coloured pill for statuses/categories. progress: bar or ring for a bounded value. Use "text" when you only want to set a label.`},numberFormat:{type:`object`,description:`kind "number": { unit: "currency"|"percent"|"number"|"custom", decimals, abbreviate (K/M/B), currencyCode, customPrefix, customSuffix }.`},dateGranularity:{type:`string`,description:`kind "date": granularity to render at (e.g. "day", "month", "year").`},badgeColors:{type:`array`,description:`kind "badge": an ARRAY of { value, colorIndex } entries, not an object keyed by value. colorIndex is a number index into the dashboard palette (0, 1, 2, …), never a colour name like "green" — the palette is themed, so names would not follow it. A value with no entry renders neutral rather than being assigned a guessed colour.`,items:{type:`object`,required:[`value`,`colorIndex`],properties:{value:{type:`string`,description:`Cell value to colour, matched exactly`},colorIndex:{type:`number`,description:`Index into the dashboard colour palette`}}}},progressMin:{type:`number`,description:`kind "progress": lower bound (default 0). Values are clamped.`},progressMax:{type:`number`,description:`kind "progress": upper bound (default 100). Values are clamped.`},progressStyle:{type:`string`,enum:[`bar`,`circle`],description:`kind "progress": full-width bar, or a compact ring for narrow columns.`},label:{type:`string`,description:`Header override; defaults to the field title from the cube metadata.`},align:{type:`string`,enum:[`left`,`right`],description:`Cell alignment. Numbers usually read better right-aligned.`}}}},rowLink:{type:`object`,description:`recordsTable only: makes each row a link.`,required:[`urlTemplate`],properties:{urlTemplate:{type:`string`,description:`URL with {Cube.field} tokens substituted from the row, including hidden columns (e.g. "/employees/{Employees.id}"). Relative paths and http(s) URLs only.`},target:{type:`string`,enum:[`self`,`blank`],description:`Open in the same tab (default) or a new one.`}}},pageSize:{type:`number`,enum:[25,50,100],description:`recordsTable only: rows per page (default 25).`}};function xm(e){if(!e||typeof e!=`object`)return!1;let t=e=>Array.isArray(e)?e.length:0;return t(e.measures)>0||t(e.dimensions)>0||t(e.timeDimensions)>0}var Sm='With a query attached, `content` is rendered as a Knap template over the result rows. Variables: `rows` (rows keyed by snake_case alias, so Employees.avgSalary becomes employees_avg_salary), `labelled` (same rows keyed by field label — use this for `{{ labelled | table }}` so column headers read well), `data` (raw rows, addressed as `{{ data[0]["Employees.count"] }}`), `rowCount`, `first` and `last`. Filters include sum, map, join, length, sort, reverse, slice, round, number_format, date and table. Example: `We employ {{ rows | map:"employees_count" | sum }} people across {{ rowCount }} teams.` A template cannot sort and then index, so rely on the query\'s own order via `first` and `last`.',Cm=`bar.line.area.pie.scatter.radar.bubble.table.kpiNumber.kpiDelta.kpiText.funnel.heatmap.sankey.sunburst.retentionHeatmap.retentionCombined.boxPlot.markdown.recordsTable.treemap.radialBar.proportionBar.dotStrip.waterfall.measureProfile.activityGrid.gauge.candlestick`.split(`.`);function wm(){return[{name:`discover_cubes`,description:`Search for available data cubes by topic or intent. Call this FIRST to understand what data is available. Returns cube names, measures, dimensions, and relationships.`,parameters:{type:`object`,properties:{topic:{type:`string`,description:`Keyword to search (e.g., "sales", "employees")`},intent:{type:`string`,description:`Natural language goal (e.g., "analyze productivity trends")`},limit:{type:`number`,description:`Max results (default: 10)`},minScore:{type:`number`,description:`Min relevance 0-1 (default: 0.1)`}}}},{name:`get_cube_metadata`,description:`Get full metadata for all registered cubes including all measures, dimensions, types, and relationships. Use this for detailed schema information.`,parameters:{type:`object`,properties:{}}},{name:`execute_query`,description:`Execute a semantic query and return data results. Supports standard queries (measures/dimensions) and analysis modes (funnel/flow/retention). Only provide ONE mode per call.`,parameters:{type:`object`,properties:af}},{name:`add_portlet`,description:`Add a chart visualization to the notebook.
825
+ `)}function hm(e,t,n,r){let i=new Set,a=0,o,s,c=!0;for(let n of e){let e=n[t];if(e==null){a++;continue}i.add(e);let r=typeof e==`number`?e:Number(e);typeof e==`boolean`||Number.isNaN(r)?c=!1:(o=o===void 0||r<o?r:o,s=s===void 0||r>s?r:s)}return{field:t,kind:n,...r?{type:r}:{},distinctCount:i.size,nullCount:a,...c&&o!==void 0?{min:o,max:s}:{}}}function gm(e,t){if(e.length===0)return[];let n=[],r=new Set,i=[[`dimension`,t?.dimensions],[`timeDimension`,t?.timeDimensions],[`measure`,t?.measures]];for(let[t,a]of i)for(let[i,o]of Object.entries(a??{}))r.add(i),n.push(hm(e,i,t,o?.type));for(let t of Object.keys(e[0]))r.has(t)||n.push(hm(e,t,`dimension`,void 0));return n}var _m={valueField:{type:`array`,items:{type:`string`},description:`heatmap and activityGrid: single measure driving cell colour intensity. Required for both — the chart renders empty without it.`},dateField:{type:`array`,items:{type:`string`},description:`activityGrid only: single time dimension laying out the grid. Query it with day granularity over several months, or the grid has nothing to show.`}},vm={minValue:{type:`number`,description:`gauge only: scale minimum (defaults to 0).`},maxValue:{type:`number`,description:`gauge only: scale maximum. ALWAYS set this — without it the gauge scales to the data it was given, so a single value always reads as 100%.`},template:{type:`string`,description:'kpiText only: sentence template around the value, e.g. "${fieldLabel}: ${value}". Defaults to that if omitted.'}},ym={columns:{type:`array`,items:{type:`string`},description:`recordsTable only: fields to render as columns, in this order. Omit to show every field the query returns, in query order.`},hiddenColumns:{type:`array`,items:{type:`string`},description:`recordsTable only: fields fetched for row context or rowLink tokens but never displayed (e.g. an id used in the URL template). Leave empty unless a field is genuinely only needed behind the scenes — anything listed here disappears from the table.`}},bm={columnFormats:{type:`object`,description:`recordsTable only: how each column renders, keyed by field name (e.g. "Employees.salary"). Formats are never inferred from the data — a column is plain text unless you say otherwise, so set this for any numeric, date, status or ratio column.`,additionalProperties:{type:`object`,required:[`kind`],properties:{kind:{type:`string`,enum:[`text`,`number`,`date`,`badge`,`progress`,`link`],description:`Required on every entry. text: as-is. number: formatted numeric. date: formatted date. badge: coloured pill for statuses/categories. progress: bar or ring for a bounded value. link: the value as a link to linkTemplate. Use "text" when you only want to set a label.`},numberFormat:{type:`object`,description:`kind "number": { unit: "currency"|"percent"|"number"|"custom", decimals, abbreviate (K/M/B), currencyCode, customPrefix, customSuffix }.`},dateGranularity:{type:`string`,description:`kind "date": granularity to render at (e.g. "day", "month", "year").`},badgeColors:{type:`array`,description:`kind "badge": an ARRAY of { value, colorIndex } entries, not an object keyed by value. colorIndex is a number index into the dashboard palette (0, 1, 2, …), never a colour name like "green" — the palette is themed, so names would not follow it. A value with no entry renders neutral rather than being assigned a guessed colour.`,items:{type:`object`,required:[`value`,`colorIndex`],properties:{value:{type:`string`,description:`Cell value to colour, matched exactly`},colorIndex:{type:`number`,description:`Index into the dashboard colour palette`}}}},progressMin:{type:`number`,description:`kind "progress": lower bound (default 0). Values are clamped.`},progressMax:{type:`number`,description:`kind "progress": upper bound (default 100). Values are clamped.`},progressStyle:{type:`string`,enum:[`bar`,`circle`],description:`kind "progress": full-width bar, or a compact ring for narrow columns.`},progressBands:{type:`array`,description:`kind "progress": colour bands, as an ARRAY of { value, colorIndex } entries. A cell takes the colour of the highest band whose value is at or below the cell value, so { value: 0, colorIndex: 3 }, { value: 50, colorIndex: 2 }, { value: 80, colorIndex: 1 } reads red below 50, then yellow, then green from 80. Below every band the bar keeps its default colour. colorIndex is a number index into the dashboard palette, never a colour name.`,items:{type:`object`,required:[`value`,`colorIndex`],properties:{value:{type:`number`,description:`Where the band starts, in the column's own units`},colorIndex:{type:`integer`,minimum:0,description:`Index into the dashboard colour palette`}}}},label:{type:`string`,description:`Header override; defaults to the field title from the cube metadata.`},align:{type:`string`,enum:[`left`,`right`],description:`Cell alignment. Numbers usually read better right-aligned.`},linkTemplate:{type:`string`,description:`kind "link": URL with {Cube.field} tokens substituted from the row, including hidden columns (e.g. "/employees/{Employees.id}"). Relative paths and http(s) URLs only. The cell link wins over rowLink for that cell.`}}}},rowLink:{type:`object`,description:`recordsTable only: makes each row a link.`,required:[`urlTemplate`],properties:{urlTemplate:{type:`string`,description:`URL with {Cube.field} tokens substituted from the row, including hidden columns (e.g. "/employees/{Employees.id}"). Relative paths and http(s) URLs only.`},target:{type:`string`,enum:[`self`,`blank`],description:`Open in the same tab (default) or a new one.`}}},pageSize:{type:`number`,enum:[25,50,100],description:`recordsTable only: rows per page (default 25).`}};function xm(e){if(!e||typeof e!=`object`)return!1;let t=e=>Array.isArray(e)?e.length:0;return t(e.measures)>0||t(e.dimensions)>0||t(e.timeDimensions)>0}var Sm='With a query attached, `content` is rendered as a Knap template over the result rows. Variables: `rows` (rows keyed by snake_case alias, so Employees.avgSalary becomes employees_avg_salary), `labelled` (same rows keyed by field label — use this for `{{ labelled | table }}` so column headers read well), `data` (raw rows, addressed as `{{ data[0]["Employees.count"] }}`), `rowCount`, `first` and `last`. Filters include sum, map, join, length, sort, reverse, slice, round, number_format, date and table. Example: `We employ {{ rows | map:"employees_count" | sum }} people across {{ rowCount }} teams.` A template cannot sort and then index, so rely on the query\'s own order via `first` and `last`.',Cm=`bar.line.area.pie.scatter.radar.bubble.table.kpiNumber.kpiDelta.kpiText.funnel.heatmap.sankey.sunburst.retentionHeatmap.retentionCombined.boxPlot.markdown.recordsTable.treemap.radialBar.proportionBar.dotStrip.waterfall.measureProfile.activityGrid.gauge.candlestick`.split(`.`);function wm(){return[{name:`discover_cubes`,description:`Search for available data cubes by topic or intent. Call this FIRST to understand what data is available. Returns cube names, measures, dimensions, and relationships.`,parameters:{type:`object`,properties:{topic:{type:`string`,description:`Keyword to search (e.g., "sales", "employees")`},intent:{type:`string`,description:`Natural language goal (e.g., "analyze productivity trends")`},limit:{type:`number`,description:`Max results (default: 10)`},minScore:{type:`number`,description:`Min relevance 0-1 (default: 0.1)`}}}},{name:`get_cube_metadata`,description:`Get full metadata for all registered cubes including all measures, dimensions, types, and relationships. Use this for detailed schema information.`,parameters:{type:`object`,properties:{}}},{name:`execute_query`,description:`Execute a semantic query and return data results. Supports standard queries (measures/dimensions) and analysis modes (funnel/flow/retention). Only provide ONE mode per call.`,parameters:{type:`object`,properties:af}},{name:`add_portlet`,description:`Add a chart visualization to the notebook.
826
826
  `+mm(Cm)+`
827
827
  The query is validated before adding. The portlet fetches its own data.`,parameters:{type:`object`,properties:{title:{type:`string`,description:`Title for the visualization`},query:{type:`string`,description:`JSON string of the query. Standard: {"measures":[...],"dimensions":[...]}. Funnel: {"funnel":{"bindingKey":"...","timeDimension":"...","steps":[...]}}. Flow: {"flow":{"bindingKey":"...","timeDimension":"...","eventDimension":"...","startingStep":{...}}}. Retention: {"retention":{"timeDimension":"...","bindingKey":"...","dateRange":{"start":"...","end":"..."},"granularity":"...","periods":N}}.`},chartType:{type:`string`,enum:Cm,description:`Chart type to render`},chartConfig:{type:`object`,properties:{xAxis:{type:`array`,items:{type:`string`}},yAxis:{type:`array`,items:{type:`string`}},series:{type:`array`,items:{type:`string`}},sizeField:{type:`string`},colorField:{type:`string`},yAxisAssignment:{type:`object`,description:`Dual Y-axis: map measure fields to "left" or "right" axis. Only for bar, line, area charts with 2+ measures of different scales. Example: {"Sales.revenue": "left", "Sales.conversionRate": "right"}`},...ym,..._m},description:`Chart axis configuration`},displayConfig:{type:`object`,properties:{showLegend:{type:`boolean`},showGrid:{type:`boolean`},showTooltip:{type:`boolean`},stacked:{type:`boolean`},orientation:{type:`string`,enum:[`horizontal`,`vertical`]},content:{type:`string`,description:`Markdown body, for the "markdown" chart type. `+Sm},...bm,...vm},description:`Chart display configuration`}},required:[`title`,`query`,`chartType`]}},{name:`update_portlet`,description:"Amend a visualization you already added in this conversation, in place. Use this instead of add_portlet when a chart came back wrong or the user asks to change one — adding a second chart of the same data clutters the notebook. Only the fields you pass are changed; the rest are kept. The same validation as add_portlet applies. For a portlet added earlier in the conversation rather than this turn, pass the full `query` and `chartType` as well as the fields you are changing.",parameters:{type:`object`,properties:{portletId:{type:`string`,description:`The id returned by add_portlet`},title:{type:`string`,description:`New title`},query:{type:`string`,description:`Replacement query, as a JSON string (same shape as add_portlet)`},chartType:{type:`string`,enum:Cm,description:`Replacement chart type`},chartConfig:{type:`object`,description:`Replacement chart axis configuration (replaces, does not merge)`},displayConfig:{type:`object`,description:`Replacement chart display configuration (replaces, does not merge)`}},required:[`portletId`]}},{name:`add_markdown`,description:`Add an explanation or analysis text block to the notebook. Use markdown formatting. Use this to explain findings, methodology, and insights alongside visualizations.`,parameters:{type:`object`,properties:{title:{type:`string`,description:`Optional title for the text block`},content:{type:`string`,description:`Markdown content to display`}},required:[`content`]}},{name:`save_as_dashboard`,description:`Convert the current notebook analysis into a persistent dashboard. Constructs a professional DashboardConfig with proper grid layout, section headers (markdown portlets), and dashboard-level filters. Call this when the user asks to save/export the notebook as a dashboard.`,parameters:{type:`object`,properties:{title:{type:`string`,description:`Dashboard title`},description:{type:`string`,description:`Optional dashboard description`},portlets:{type:`array`,items:{type:`object`,properties:{id:{type:`string`,description:`Unique portlet ID`},title:{type:`string`,description:`Portlet title`},chartType:{type:`string`,enum:Cm,description:`Chart type. Use "markdown" for section headers.`},query:{type:`string`,description:`JSON string of the query. For a markdown portlet this is optional: omit it for a static text block or section header, or supply one to render displayConfig.content as a template over the result rows.`},chartConfig:{type:`object`,properties:{xAxis:{type:`array`,items:{type:`string`}},yAxis:{type:`array`,items:{type:`string`}},series:{type:`array`,items:{type:`string`}},sizeField:{type:`string`},colorField:{type:`string`},...ym,..._m},description:`Chart axis configuration`},displayConfig:{type:`object`,description:`Chart display configuration (for markdown: { content, hideHeader, transparentBackground, autoHeight }). `+Sm,properties:{...bm,...vm}},dashboardFilterMapping:{type:`array`,items:{anyOf:[{type:`string`},{type:`object`,properties:{filterId:{type:`string`,description:`Dashboard filter ID`},member:{type:`string`,description:`Optional field to remap the filter to for this portlet (e.g. "Invoices.customerId")`}},required:[`filterId`]}]},description:`Dashboard filters that apply to this portlet: filter IDs, or { filterId, member } entries to remap a filter to a different field for this portlet`},analysisType:{type:`string`,enum:[`query`,`funnel`,`flow`,`retention`],description:`Analysis type (default: "query")`},w:{type:`number`,description:`Grid width (1-12)`},h:{type:`number`,description:`Grid height in row units`},x:{type:`number`,description:`Grid x position (0-11)`},y:{type:`number`,description:`Grid y position`}},required:[`id`,`title`,`chartType`,`w`,`h`,`x`,`y`]},description:`Array of portlet configurations for the dashboard`},filters:{type:`array`,items:{type:`object`,properties:{id:{type:`string`,description:`Unique filter ID`},label:{type:`string`,description:`Display label for the filter`},filter:{type:`object`,properties:{member:{type:`string`},operator:{type:`string`},values:{type:`array`,items:{}}},required:[`member`,`operator`],description:`The filter definition`},isUniversalTime:{type:`boolean`,description:`When true, applies to all time dimensions in portlets`}},required:[`id`,`label`,`filter`]},description:`Dashboard-level filters`},colorPalette:{type:`string`,description:`Color palette name`}},required:[`title`,`portlets`]}}]}function Tm(e){let{semanticLayer:t,securityContext:n}=e,r=new Map,i=new Map;r.set(`discover_cubes`,async e=>{let r={cubes:(await Lf(t,n,{topic:e.topic,intent:e.intent,limit:e.limit,minScore:e.minScore})).cubes.map(e=>({cube:e.cube,title:e.title,description:e.description,relevanceScore:e.relevanceScore,suggestedMeasures:e.suggestedMeasures,suggestedDimensions:e.suggestedDimensions,...e.fieldTitles?{fieldTitles:e.fieldTitles}:{},capabilities:e.capabilities,...e.capabilities.funnel||e.capabilities.flow||e.capabilities.retention?{analysisConfig:{candidateBindingKeys:e.analysisConfig?.candidateBindingKeys?.map(e=>e.dimension)??[],candidateTimeDimensions:e.analysisConfig?.candidateTimeDimensions?.map(e=>e.dimension)??[],...e.analysisConfig?.candidateEventDimensions?.length?{candidateEventDimensions:e.analysisConfig.candidateEventDimensions.map(e=>e.dimension)}:{}}}:{}}))};return{result:JSON.stringify(r)+`
828
828
  [IMPORTANT: Your next response MUST start with a brief text message BEFORE any tool calls.]`}}),r.set(`get_cube_metadata`,async()=>{let e=t.getMetadata(n);return{result:JSON.stringify(e)}});let a=new Map;for(let e of t.getMetadata(n))a.set(e.name,{measures:(e.measures||[]).map(e=>e.name),dimensions:(e.dimensions||[]).map(e=>e.name)});let o=(e,t)=>{let n=a.get(e),r=t===`measures`?n?.measures:n?.dimensions;return!r||r.length===0?``:` Available ${t}: ${r.slice(0,5).map(e=>`"${e}"`).join(`, `)}`};r.set(`execute_query`,async e=>{try{let r=(e,t)=>{if(!Array.isArray(e))return;let n=[];for(let r of e){if(typeof r!=`string`)continue;let e=r.split(`.`);e.length===1?n.push(`"${r}" is not valid — must be "CubeName.fieldName".${o(r,t)}`):e.length===2&&e[0]===e[1]&&n.push(`"${r}" is WRONG — "${e[0]}" is the cube name, not a ${t.replace(/s$/,``)}.${o(e[0],t)}`)}if(n.length>0)throw Error(`Invalid ${t}:\n${n.join(`