drizzle-cube 0.8.0 → 0.8.1

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 (318) hide show
  1. package/dist/adapters/ActivityGridChart.config-DXUUgx0N.cjs +1 -0
  2. package/dist/adapters/ActivityGridChart.config-Dyozu3VW.js +2 -0
  3. package/dist/adapters/AreaChart.config-Di5odBXp.cjs +1 -0
  4. package/dist/adapters/AreaChart.config-KEaXP_4K.js +2 -0
  5. package/dist/adapters/BarChart.config-B-hBHykR.cjs +1 -0
  6. package/dist/adapters/BarChart.config-C5sqbn0A.js +2 -0
  7. package/dist/adapters/BoxPlotChart.config-B1R4Br7L.js +2 -0
  8. package/dist/adapters/BoxPlotChart.config-C82Fhd3c.cjs +1 -0
  9. package/dist/adapters/BubbleChart.config-CoBxmmfp.js +2 -0
  10. package/dist/adapters/BubbleChart.config-DfOnNjL-.cjs +1 -0
  11. package/dist/adapters/CandlestickChart.config-C5ggV_3j.cjs +1 -0
  12. package/dist/adapters/CandlestickChart.config-ZaJpWVuL.js +2 -0
  13. package/dist/adapters/DataTable.config-Cx2_ACdY.cjs +1 -0
  14. package/dist/adapters/DataTable.config-DkAgD-iz.js +2 -0
  15. package/dist/adapters/FunnelChart.config-CvzcECUB.js +2 -0
  16. package/dist/adapters/FunnelChart.config-DVH7IFnb.cjs +1 -0
  17. package/dist/adapters/GaugeChart.config-Csx8rt8o.cjs +1 -0
  18. package/dist/adapters/GaugeChart.config-DEmrNgMa.js +2 -0
  19. package/dist/adapters/HeatMapChart.config-BfD_dpP7.js +2 -0
  20. package/dist/adapters/HeatMapChart.config-D_jlyPJL.cjs +1 -0
  21. package/dist/adapters/KpiDelta.config-CVBdUL_n.cjs +1 -0
  22. package/dist/adapters/KpiDelta.config-D4dCXOxl.js +2 -0
  23. package/dist/adapters/KpiNumber.config-BK5pgIKz.cjs +1 -0
  24. package/dist/adapters/KpiNumber.config-D6XqjZrm.js +2 -0
  25. package/dist/adapters/KpiText.config-ChphMwG5.js +2 -0
  26. package/dist/adapters/KpiText.config-fO1wc6FH.cjs +1 -0
  27. package/dist/adapters/LineChart.config-CXJrgz1s.js +2 -0
  28. package/dist/adapters/LineChart.config-Cg_h-SiJ.cjs +1 -0
  29. package/dist/adapters/MarkdownChart.config-ByPjX-4O.cjs +1 -0
  30. package/dist/adapters/MarkdownChart.config-Df2yY9AT.js +2 -0
  31. package/dist/adapters/MeasureProfileChart.config-BBWGIteF.cjs +1 -0
  32. package/dist/adapters/MeasureProfileChart.config-C9OFbN9Z.js +2 -0
  33. package/dist/adapters/PieChart.config-C6jJj6xm.js +2 -0
  34. package/dist/adapters/PieChart.config-CmCw_8eN.cjs +1 -0
  35. package/dist/adapters/ProportionBarChart.config-B9NEyFEe.js +2 -0
  36. package/dist/adapters/ProportionBarChart.config-C3GAVPWn.cjs +1 -0
  37. package/dist/adapters/RadarChart.config-5AMwEqUJ.cjs +1 -0
  38. package/dist/adapters/RadarChart.config-Ct_b7IM5.js +2 -0
  39. package/dist/adapters/RadialBarChart.config-Bp-Sl0cm.js +2 -0
  40. package/dist/adapters/RadialBarChart.config-D14yoexI.cjs +1 -0
  41. package/dist/adapters/RecordsTable.config-D2-qmG06.cjs +1 -0
  42. package/dist/adapters/RecordsTable.config-DIwoqZCU.js +2 -0
  43. package/dist/adapters/RetentionCombinedChart.config-BWHipi5M.cjs +1 -0
  44. package/dist/adapters/RetentionCombinedChart.config-D40UgTcl.js +2 -0
  45. package/dist/adapters/RetentionHeatmap.config-GlnSLrjn.js +2 -0
  46. package/dist/adapters/RetentionHeatmap.config-MlhZf26c.cjs +1 -0
  47. package/dist/adapters/SankeyChart.config-Bf1_NHiv.js +2 -0
  48. package/dist/adapters/SankeyChart.config-BoYf6BFE.cjs +1 -0
  49. package/dist/adapters/ScatterChart.config-CV2rdGJp.js +2 -0
  50. package/dist/adapters/ScatterChart.config-DywduGF3.cjs +1 -0
  51. package/dist/adapters/SunburstChart.config-CrqiE1UZ.js +2 -0
  52. package/dist/adapters/SunburstChart.config-D5tbF_GJ.cjs +1 -0
  53. package/dist/adapters/TreeMapChart.config-BJ8HnZU0.cjs +1 -0
  54. package/dist/adapters/TreeMapChart.config-DxgIqIIj.js +2 -0
  55. package/dist/adapters/WaterfallChart.config-Cns8fLFu.js +2 -0
  56. package/dist/adapters/WaterfallChart.config-D_kdL9SN.cjs +1 -0
  57. package/dist/adapters/compiler-BxZHh0UD.cjs +166 -0
  58. package/dist/adapters/{compiler-CQJ5GOwF.js → compiler-CBGD_4Et.js} +1160 -1861
  59. package/dist/adapters/core/index.cjs +1 -1
  60. package/dist/adapters/core/index.js +1 -1
  61. package/dist/adapters/{core-DgTGXxDu.cjs → core-CIGuwGuI.cjs} +1 -1
  62. package/dist/adapters/{core-DXkuSUBg.js → core-DAAnqPyN.js} +3 -3
  63. package/dist/adapters/express/index.cjs +1 -1
  64. package/dist/adapters/express/index.js +5 -5
  65. package/dist/adapters/fastify/index.cjs +1 -1
  66. package/dist/adapters/fastify/index.js +23 -23
  67. package/dist/{server/google-eKAc20al.js → adapters/google-DRY7jnOh.js} +46 -28
  68. package/dist/adapters/{google-BhvizbFR.cjs → google-PsZzwedr.cjs} +2 -2
  69. package/dist/adapters/{handler-DrRT6c14.cjs → handler-BcYTw6zB.cjs} +12 -12
  70. package/dist/adapters/{handler-CphYSZRh.js → handler-eA0VJDHj.js} +334 -237
  71. package/dist/adapters/hono/index.cjs +1 -1
  72. package/dist/adapters/hono/index.js +4 -4
  73. package/dist/adapters/mcp-tools.cjs +1 -1
  74. package/dist/adapters/mcp-tools.js +2 -2
  75. package/dist/adapters/mcp-transport-BpG44Fvn.js +730 -0
  76. package/dist/adapters/mcp-transport-CDxZXpc-.cjs +42 -0
  77. package/dist/adapters/nextjs/index.cjs +1 -1
  78. package/dist/adapters/nextjs/index.js +5 -5
  79. package/dist/adapters/{openai-D-VMcPao.js → openai-BZ48ioYp.js} +1 -1
  80. package/dist/adapters/{openai-CSzWluuv.cjs → openai-Bw1j-OiP.cjs} +1 -1
  81. package/dist/adapters/{openai-CI9vGKSf.cjs → openai-CLjyL5_J.cjs} +2 -2
  82. package/dist/adapters/{openai-CBrN4nxl.js → openai-CYYjUG_3.js} +3 -3
  83. package/dist/adapters/{utils-DkmShl5f.js → utils-BagURNRb.js} +1947 -1122
  84. package/dist/adapters/utils-BiKIg2tk.cjs +128 -0
  85. package/dist/adapters/utils.cjs +1 -1
  86. package/dist/adapters/utils.d.ts +17 -3
  87. package/dist/adapters/utils.js +1 -1
  88. package/dist/cjs/adapters/utils.d.ts +17 -3
  89. package/dist/cjs/client/charts/chartConfigRegistry.d.ts +7 -0
  90. package/dist/cjs/client/charts/chartConfigs.d.ts +17 -1
  91. package/dist/cjs/client/client/CubeClient.d.ts +11 -1
  92. package/dist/cjs/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +4 -2
  93. package/dist/cjs/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +10 -0
  94. package/dist/cjs/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +3 -2
  95. package/dist/cjs/client/components/AnalysisBuilder/utils/queryUtils.d.ts +7 -1
  96. package/dist/cjs/client/components/analyticsPortlet/PortletChart.d.ts +2 -1
  97. package/dist/cjs/client/components/analyticsPortlet/PortletChartView.d.ts +4 -1
  98. package/dist/cjs/client/components/analyticsPortlet/usePortletDeadMembers.d.ts +24 -0
  99. package/dist/cjs/client/components/analyticsPortlet/usePortletPagination.d.ts +21 -0
  100. package/dist/cjs/client/components/charts/RecordsTable.config.d.ts +10 -0
  101. package/dist/cjs/client/components/charts/RecordsTable.d.ts +4 -0
  102. package/dist/cjs/client/components/charts/recordsTableHooks.d.ts +68 -0
  103. package/dist/cjs/client/icons/types.d.ts +1 -0
  104. package/dist/cjs/client/index.d.ts +2 -2
  105. package/dist/cjs/client/types.d.ts +92 -1
  106. package/dist/cjs/client/utils/recordsTableUtils.d.ts +71 -0
  107. package/dist/cjs/client/utils/rowLinkUtils.d.ts +35 -0
  108. package/dist/cjs/server/agent/chart-validation.d.ts +1 -1
  109. package/dist/cjs/server/ai/chart-schema.d.ts +117 -0
  110. package/dist/cjs/server/ai/discovery-helpers.d.ts +14 -0
  111. package/dist/cjs/server/ai/discovery.d.ts +6 -0
  112. package/dist/cjs/server/ai/query-schema.d.ts +1 -1
  113. package/dist/cjs/server/attribute-dimensions.d.ts +11 -8
  114. package/dist/cjs/server/builders/group-by-builder.d.ts +15 -0
  115. package/dist/cjs/server/compiler.d.ts +3 -4
  116. package/dist/cjs/server/executor.d.ts +15 -0
  117. package/dist/cjs/server/index.d.ts +2 -0
  118. package/dist/cjs/server/query-handlers.d.ts +1 -0
  119. package/dist/cjs/server/query-validator.d.ts +36 -4
  120. package/dist/cjs/server/types/core.d.ts +5 -0
  121. package/dist/cjs/server/types/cube.d.ts +12 -0
  122. package/dist/cjs/server/types/query.d.ts +8 -0
  123. package/dist/cli/index.cjs +130 -52
  124. package/dist/client/charts/chartConfigRegistry.d.ts +7 -0
  125. package/dist/client/charts/chartConfigs.d.ts +17 -1
  126. package/dist/client/charts.js +13 -13
  127. package/dist/client/chunks/{DashboardEditModal-9An5EDAz.js → DashboardEditModal-_ZDMwaGX.js} +1653 -1188
  128. package/dist/client/chunks/DashboardEditModal-_ZDMwaGX.js.map +1 -0
  129. package/dist/client/chunks/{ProportionBarChart-BVcbGY2C.js → ProportionBarChart-qfpAWhIg.js} +3 -3
  130. package/dist/client/chunks/{ProportionBarChart-BVcbGY2C.js.map → ProportionBarChart-qfpAWhIg.js.map} +1 -1
  131. package/dist/client/chunks/RecordsTable-KmJy94xN.js +556 -0
  132. package/dist/client/chunks/RecordsTable-KmJy94xN.js.map +1 -0
  133. package/dist/client/chunks/{RetentionCombinedChart-D68Rvdi-.js → RetentionCombinedChart-C7X6aj97.js} +3 -3
  134. package/dist/client/chunks/{RetentionCombinedChart-D68Rvdi-.js.map → RetentionCombinedChart-C7X6aj97.js.map} +1 -1
  135. package/dist/client/chunks/{RetentionHeatmap-CE7BAjrB.js → RetentionHeatmap-PpRpiqR_.js} +2 -2
  136. package/dist/client/chunks/{RetentionHeatmap-CE7BAjrB.js.map → RetentionHeatmap-PpRpiqR_.js.map} +1 -1
  137. package/dist/client/chunks/{analysis-builder-D1pYvvwc.js → analysis-builder-DaqyOjLX.js} +169 -168
  138. package/dist/client/chunks/{analysis-builder-D1pYvvwc.js.map → analysis-builder-DaqyOjLX.js.map} +1 -1
  139. package/dist/client/chunks/{analysis-builder-shared-BQvwUc6z.js → analysis-builder-shared-ow9KAHDP.js} +965 -954
  140. package/dist/client/chunks/analysis-builder-shared-ow9KAHDP.js.map +1 -0
  141. package/dist/client/chunks/{chart-activity-grid-DvD_4wJz.js → chart-activity-grid-DO82rrbW.js} +137 -84
  142. package/dist/client/chunks/chart-activity-grid-DO82rrbW.js.map +1 -0
  143. package/dist/client/chunks/{chart-area-DPp3hSOK.js → chart-area-9SBeG0GM.js} +21 -21
  144. package/dist/client/chunks/{chart-area-DPp3hSOK.js.map → chart-area-9SBeG0GM.js.map} +1 -1
  145. package/dist/client/chunks/{chart-bar-Od3pOyZ0.js → chart-bar-tfgmLK2D.js} +5 -5
  146. package/dist/client/chunks/{chart-bar-Od3pOyZ0.js.map → chart-bar-tfgmLK2D.js.map} +1 -1
  147. package/dist/client/chunks/{chart-box-plot-l0iFn2n2.js → chart-box-plot-BuYW6j6g.js} +2 -2
  148. package/dist/client/chunks/{chart-box-plot-l0iFn2n2.js.map → chart-box-plot-BuYW6j6g.js.map} +1 -1
  149. package/dist/client/chunks/{chart-bubble-Dl0RcP8N.js → chart-bubble-BNmonWqW.js} +2 -2
  150. package/dist/client/chunks/{chart-bubble-Dl0RcP8N.js.map → chart-bubble-BNmonWqW.js.map} +1 -1
  151. package/dist/client/chunks/{chart-candlestick-DZMqbscF.js → chart-candlestick-BYeWNkKl.js} +2 -2
  152. package/dist/client/chunks/{chart-candlestick-DZMqbscF.js.map → chart-candlestick-BYeWNkKl.js.map} +1 -1
  153. package/dist/client/chunks/{chart-data-table-DgiNBOWf.js → chart-data-table-C_oHiK6N.js} +1094 -1029
  154. package/dist/client/chunks/chart-data-table-C_oHiK6N.js.map +1 -0
  155. package/dist/client/chunks/{chart-funnel-YLZlyN1X.js → chart-funnel-B_CWC3cL.js} +2 -2
  156. package/dist/client/chunks/{chart-funnel-YLZlyN1X.js.map → chart-funnel-B_CWC3cL.js.map} +1 -1
  157. package/dist/client/chunks/{chart-gauge-BsqE2wwF.js → chart-gauge-D7VxwPnx.js} +3 -3
  158. package/dist/client/chunks/{chart-gauge-BsqE2wwF.js.map → chart-gauge-D7VxwPnx.js.map} +1 -1
  159. package/dist/client/chunks/{chart-heat-map-BsND8RM_.js → chart-heat-map-q7Vf_dog.js} +3 -3
  160. package/dist/client/chunks/{chart-heat-map-BsND8RM_.js.map → chart-heat-map-q7Vf_dog.js.map} +1 -1
  161. package/dist/client/chunks/{chart-kpi-delta-m0azuva-.js → chart-kpi-delta-PEuA3iGs.js} +3 -3
  162. package/dist/client/chunks/{chart-kpi-delta-m0azuva-.js.map → chart-kpi-delta-PEuA3iGs.js.map} +1 -1
  163. package/dist/client/chunks/{chart-kpi-number-6JS15SqF.js → chart-kpi-number-DlxrO6Pq.js} +5 -5
  164. package/dist/client/chunks/{chart-kpi-number-6JS15SqF.js.map → chart-kpi-number-DlxrO6Pq.js.map} +1 -1
  165. package/dist/client/chunks/{chart-kpi-text-BqX8p8Jn.js → chart-kpi-text-Cx6cJu2s.js} +3 -3
  166. package/dist/client/chunks/{chart-kpi-text-BqX8p8Jn.js.map → chart-kpi-text-Cx6cJu2s.js.map} +1 -1
  167. package/dist/client/chunks/{chart-line-NCmpxBfE.js → chart-line-pDe25JzB.js} +3 -3
  168. package/dist/client/chunks/{chart-line-NCmpxBfE.js.map → chart-line-pDe25JzB.js.map} +1 -1
  169. package/dist/client/chunks/{chart-markdown-ZOobqiiX.js → chart-markdown-CRY15yp0.js} +2 -2
  170. package/dist/client/chunks/{chart-markdown-ZOobqiiX.js.map → chart-markdown-CRY15yp0.js.map} +1 -1
  171. package/dist/client/chunks/{chart-measure-profile-CBAZaicJ.js → chart-measure-profile-DyQ-vvuC.js} +3 -3
  172. package/dist/client/chunks/{chart-measure-profile-CBAZaicJ.js.map → chart-measure-profile-DyQ-vvuC.js.map} +1 -1
  173. package/dist/client/chunks/{chart-pie-ChrasEI8.js → chart-pie-ZrnBycy1.js} +15 -15
  174. package/dist/client/chunks/{chart-pie-ChrasEI8.js.map → chart-pie-ZrnBycy1.js.map} +1 -1
  175. package/dist/client/chunks/{chart-radar-CxSVF7yL.js → chart-radar-BXbnYMUJ.js} +13 -13
  176. package/dist/client/chunks/{chart-radar-CxSVF7yL.js.map → chart-radar-BXbnYMUJ.js.map} +1 -1
  177. package/dist/client/chunks/{chart-radial-bar--SN0Wph0.js → chart-radial-bar-CYxH3ryh.js} +3 -3
  178. package/dist/client/chunks/{chart-radial-bar--SN0Wph0.js.map → chart-radial-bar-CYxH3ryh.js.map} +1 -1
  179. package/dist/client/chunks/{chart-sankey-CDOSGg9r.js → chart-sankey-C9R_TDDh.js} +2 -2
  180. package/dist/client/chunks/{chart-sankey-CDOSGg9r.js.map → chart-sankey-C9R_TDDh.js.map} +1 -1
  181. package/dist/client/chunks/{chart-scatter-DgcEF-kI.js → chart-scatter-DrwRkzzl.js} +3 -3
  182. package/dist/client/chunks/{chart-scatter-DgcEF-kI.js.map → chart-scatter-DrwRkzzl.js.map} +1 -1
  183. package/dist/client/chunks/{chart-sunburst-MB-jlGBm.js → chart-sunburst-Bs1yqIPp.js} +3 -3
  184. package/dist/client/chunks/{chart-sunburst-MB-jlGBm.js.map → chart-sunburst-Bs1yqIPp.js.map} +1 -1
  185. package/dist/client/chunks/{chart-tree-map-DeDXveVd.js → chart-tree-map-BNjHhhVq.js} +3 -3
  186. package/dist/client/chunks/{chart-tree-map-DeDXveVd.js.map → chart-tree-map-BNjHhhVq.js.map} +1 -1
  187. package/dist/client/chunks/{chart-waterfall-ur4vkO1j.js → chart-waterfall-CyoC0uLT.js} +3 -3
  188. package/dist/client/chunks/{chart-waterfall-ur4vkO1j.js.map → chart-waterfall-CyoC0uLT.js.map} +1 -1
  189. package/dist/client/chunks/charts-core-DCQ7od_L.js +190 -0
  190. package/dist/client/chunks/charts-core-DCQ7od_L.js.map +1 -0
  191. package/dist/client/chunks/charts-loader-Bya_zDIA.js +86 -0
  192. package/dist/client/chunks/charts-loader-Bya_zDIA.js.map +1 -0
  193. package/dist/client/chunks/{en-US-BE6VoG0o.js → en-US-HP6FHuNy.js} +3 -1
  194. package/dist/client/chunks/{en-US-BE6VoG0o.js.map → en-US-HP6FHuNy.js.map} +1 -1
  195. package/dist/client/chunks/{nl-NL-CMXHDBr0.js → nl-NL-CEdoCz6Q.js} +51 -1
  196. package/dist/client/chunks/nl-NL-CEdoCz6Q.js.map +1 -0
  197. package/dist/client/chunks/{schema-visualization-BEbFtUIL.js → schema-visualization-DfXxFBIY.js} +3 -3
  198. package/dist/client/chunks/{schema-visualization-BEbFtUIL.js.map → schema-visualization-DfXxFBIY.js.map} +1 -1
  199. package/dist/client/chunks/{useDirtyStateTracking-CSDg96Rw.js → useDirtyStateTracking-BFJHiiVK.js} +15 -15
  200. package/dist/client/chunks/{useDirtyStateTracking-CSDg96Rw.js.map → useDirtyStateTracking-BFJHiiVK.js.map} +1 -1
  201. package/dist/client/chunks/{useExplainAI-BnkoZ-zS.js → useExplainAI-_C4WQE5I.js} +16 -16
  202. package/dist/client/chunks/{useExplainAI-BnkoZ-zS.js.map → useExplainAI-_C4WQE5I.js.map} +1 -1
  203. package/dist/client/chunks/{vendor-BmJDaduD.js → vendor-Gb3lH0cc.js} +49 -49
  204. package/dist/client/chunks/{vendor-BmJDaduD.js.map → vendor-Gb3lH0cc.js.map} +1 -1
  205. package/dist/client/client/CubeClient.d.ts +11 -1
  206. package/dist/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +4 -2
  207. package/dist/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +10 -0
  208. package/dist/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +3 -2
  209. package/dist/client/components/AnalysisBuilder/utils/queryUtils.d.ts +7 -1
  210. package/dist/client/components/analyticsPortlet/PortletChart.d.ts +2 -1
  211. package/dist/client/components/analyticsPortlet/PortletChartView.d.ts +4 -1
  212. package/dist/client/components/analyticsPortlet/usePortletDeadMembers.d.ts +24 -0
  213. package/dist/client/components/analyticsPortlet/usePortletPagination.d.ts +21 -0
  214. package/dist/client/components/charts/RecordsTable.config.d.ts +10 -0
  215. package/dist/client/components/charts/RecordsTable.d.ts +4 -0
  216. package/dist/client/components/charts/recordsTableHooks.d.ts +68 -0
  217. package/dist/client/components.js +1 -1
  218. package/dist/client/hooks.js +3 -3
  219. package/dist/client/icons/types.d.ts +1 -0
  220. package/dist/client/icons.js +2 -2
  221. package/dist/client/index.d.ts +2 -2
  222. package/dist/client/index.js +213 -213
  223. package/dist/client/providers.js +1 -1
  224. package/dist/client/schema.js +1 -1
  225. package/dist/client/styles.css +1 -1
  226. package/dist/client/types.d.ts +92 -1
  227. package/dist/client/utils/recordsTableUtils.d.ts +71 -0
  228. package/dist/client/utils/rowLinkUtils.d.ts +35 -0
  229. package/dist/client/utils.js +14 -14
  230. package/dist/client-bundle-stats.html +1 -1
  231. package/dist/mcp-app/mcp-app.html +107 -107
  232. package/dist/server/agent/chart-validation.d.ts +1 -1
  233. package/dist/server/ai/chart-schema.d.ts +117 -0
  234. package/dist/server/ai/discovery-helpers.d.ts +14 -0
  235. package/dist/server/ai/discovery.d.ts +6 -0
  236. package/dist/server/ai/query-schema.d.ts +1 -1
  237. package/dist/server/attribute-dimensions.d.ts +11 -8
  238. package/dist/server/builders/group-by-builder.d.ts +15 -0
  239. package/dist/server/compiler.d.ts +3 -4
  240. package/dist/server/executor.d.ts +15 -0
  241. package/dist/{adapters/google-eKAc20al.js → server/google-DRY7jnOh.js} +46 -28
  242. package/dist/server/{google-BhvizbFR.cjs → google-PsZzwedr.cjs} +2 -2
  243. package/dist/server/index.cjs +34 -34
  244. package/dist/server/index.d.ts +2 -0
  245. package/dist/server/index.js +1755 -1445
  246. package/dist/server/query-handlers.d.ts +1 -0
  247. package/dist/server/query-validator.d.ts +36 -4
  248. package/dist/server/types/core.d.ts +5 -0
  249. package/dist/server/types/cube.d.ts +12 -0
  250. package/dist/server/types/query.d.ts +8 -0
  251. package/package.json +1 -1
  252. package/dist/adapters/ActivityGridChart.config-BQhBE_Mr.js +0 -2
  253. package/dist/adapters/ActivityGridChart.config-C3tSuOGV.cjs +0 -1
  254. package/dist/adapters/AreaChart.config-3cme8HyQ.js +0 -2
  255. package/dist/adapters/AreaChart.config-BSxrT52Z.cjs +0 -1
  256. package/dist/adapters/BarChart.config-BKS8IecE.cjs +0 -1
  257. package/dist/adapters/BarChart.config-lt_7PdIi.js +0 -2
  258. package/dist/adapters/BoxPlotChart.config-B7qvRnrF.cjs +0 -1
  259. package/dist/adapters/BoxPlotChart.config-Dv6ECj2j.js +0 -2
  260. package/dist/adapters/BubbleChart.config-BrIH7OAy.cjs +0 -1
  261. package/dist/adapters/BubbleChart.config-Fhotb7Pg.js +0 -2
  262. package/dist/adapters/CandlestickChart.config-CWH41FmF.cjs +0 -1
  263. package/dist/adapters/CandlestickChart.config-RPtXuxsX.js +0 -2
  264. package/dist/adapters/DataTable.config-71L0GzlT.js +0 -2
  265. package/dist/adapters/DataTable.config-BsOMQq3J.cjs +0 -1
  266. package/dist/adapters/FunnelChart.config-Cqte9C04.cjs +0 -1
  267. package/dist/adapters/FunnelChart.config-DJtwWeNz.js +0 -2
  268. package/dist/adapters/GaugeChart.config-WkwZ9VdS.cjs +0 -1
  269. package/dist/adapters/GaugeChart.config-vpVQlP5B.js +0 -2
  270. package/dist/adapters/HeatMapChart.config-DcmkDl07.cjs +0 -1
  271. package/dist/adapters/HeatMapChart.config-DsmMgGxJ.js +0 -2
  272. package/dist/adapters/KpiDelta.config-DVy561BH.js +0 -2
  273. package/dist/adapters/KpiDelta.config-dpqwLHNE.cjs +0 -1
  274. package/dist/adapters/KpiNumber.config-927l8nq8.js +0 -2
  275. package/dist/adapters/KpiNumber.config-BqFBMfPf.cjs +0 -1
  276. package/dist/adapters/KpiText.config-C-fZXuHq.cjs +0 -1
  277. package/dist/adapters/KpiText.config-CWoXuhMA.js +0 -2
  278. package/dist/adapters/LineChart.config-DTp7pqOY.js +0 -2
  279. package/dist/adapters/LineChart.config-DUGvSjcH.cjs +0 -1
  280. package/dist/adapters/MarkdownChart.config-23Dmv2Ty.cjs +0 -1
  281. package/dist/adapters/MarkdownChart.config-Cb2TnS0I.js +0 -2
  282. package/dist/adapters/MeasureProfileChart.config-B2qbWdhy.cjs +0 -1
  283. package/dist/adapters/MeasureProfileChart.config-CvBCeI5b.js +0 -2
  284. package/dist/adapters/PieChart.config-BzJb13QA.js +0 -2
  285. package/dist/adapters/PieChart.config-plCn5Ehr.cjs +0 -1
  286. package/dist/adapters/ProportionBarChart.config-1r-_moBH.cjs +0 -1
  287. package/dist/adapters/ProportionBarChart.config-CN6TtHTp.js +0 -2
  288. package/dist/adapters/RadarChart.config-BYhdj9M7.js +0 -2
  289. package/dist/adapters/RadarChart.config-CeUMP-1g.cjs +0 -1
  290. package/dist/adapters/RadialBarChart.config-B88yXNsq.cjs +0 -1
  291. package/dist/adapters/RadialBarChart.config-ZMK9HMoh.js +0 -2
  292. package/dist/adapters/RetentionCombinedChart.config-B5yvgUHM.cjs +0 -1
  293. package/dist/adapters/RetentionCombinedChart.config-Dd-YMdK8.js +0 -2
  294. package/dist/adapters/RetentionHeatmap.config-BYzDleoV.cjs +0 -1
  295. package/dist/adapters/RetentionHeatmap.config-Dvj7yTB0.js +0 -2
  296. package/dist/adapters/SankeyChart.config-CPFRmgFb.cjs +0 -1
  297. package/dist/adapters/SankeyChart.config-ClgqXM1N.js +0 -2
  298. package/dist/adapters/ScatterChart.config-CvJiqPa5.cjs +0 -1
  299. package/dist/adapters/ScatterChart.config-DLZ3rYMq.js +0 -2
  300. package/dist/adapters/SunburstChart.config-C_1V5hoQ.cjs +0 -1
  301. package/dist/adapters/SunburstChart.config-FNU75NCg.js +0 -2
  302. package/dist/adapters/TreeMapChart.config-CprZk_YF.js +0 -2
  303. package/dist/adapters/TreeMapChart.config-DNwd0ge9.cjs +0 -1
  304. package/dist/adapters/WaterfallChart.config-BBhcN_Fh.cjs +0 -1
  305. package/dist/adapters/WaterfallChart.config-H7s6SSV3.js +0 -2
  306. package/dist/adapters/compiler-BaLO10VN.cjs +0 -166
  307. package/dist/adapters/mcp-transport-BGkSz-ZT.cjs +0 -40
  308. package/dist/adapters/mcp-transport-fJud19xz.js +0 -606
  309. package/dist/adapters/utils-BY0-KFyI.cjs +0 -128
  310. package/dist/client/chunks/DashboardEditModal-9An5EDAz.js.map +0 -1
  311. package/dist/client/chunks/analysis-builder-shared-BQvwUc6z.js.map +0 -1
  312. package/dist/client/chunks/chart-activity-grid-DvD_4wJz.js.map +0 -1
  313. package/dist/client/chunks/chart-data-table-DgiNBOWf.js.map +0 -1
  314. package/dist/client/chunks/charts-core-BAH5pkSB.js +0 -215
  315. package/dist/client/chunks/charts-core-BAH5pkSB.js.map +0 -1
  316. package/dist/client/chunks/charts-loader-eToV8je7.js +0 -85
  317. package/dist/client/chunks/charts-loader-eToV8je7.js.map +0 -1
  318. package/dist/client/chunks/nl-NL-CMXHDBr0.js.map +0 -1
@@ -1,6 +1,6 @@
1
- import { c as e, l as t } from "./vendor-BmJDaduD.js";
2
- import { H as n, k as r, ot as i, z as a } from "./chart-data-table-DgiNBOWf.js";
3
- import { C as o, w as s } from "./useDirtyStateTracking-CSDg96Rw.js";
1
+ import { c as e, l as t } from "./vendor-Gb3lH0cc.js";
2
+ import { A as n, B as r, W as i, ct as a } from "./chart-data-table-C_oHiK6N.js";
3
+ import { C as o, w as s } from "./useDirtyStateTracking-BFJHiiVK.js";
4
4
  import { useCallback as c, useMemo as l, useState as u } from "react";
5
5
  //#region src/client/hooks/queries/useDryRunQuery.ts
6
6
  function d(e) {
@@ -33,18 +33,18 @@ function p(e) {
33
33
  };
34
34
  }
35
35
  function m(e, t = {}) {
36
- let { skip: r = !1, staleTime: i = 3e5 } = t, { cubeApi: o } = a(), c = l(() => {
36
+ let { skip: n = !1, staleTime: a = 3e5 } = t, { cubeApi: o } = r(), c = l(() => {
37
37
  if (!e) return null;
38
38
  let t = e;
39
39
  return t.funnel || t.flow || t.retention ? e : s(e);
40
- }, [e]), u = n({
40
+ }, [e]), u = i({
41
41
  queryKey: d(c),
42
42
  queryFn: async () => {
43
43
  if (!c) throw Error("No query provided");
44
44
  return p(await o.dryRun(c));
45
45
  },
46
- enabled: !!c && !r,
47
- staleTime: i
46
+ enabled: !!c && !n,
47
+ staleTime: a
48
48
  });
49
49
  return {
50
50
  debugData: {
@@ -64,11 +64,11 @@ function m(e, t = {}) {
64
64
  };
65
65
  }
66
66
  function h(e, n = {}) {
67
- let { skip: r = !1, staleTime: i = 3e5 } = n, { cubeApi: o } = a(), c = l(() => e.map((e) => s(e)), [e]), u = t({ queries: c.map((e) => ({
67
+ let { skip: i = !1, staleTime: a = 3e5 } = n, { cubeApi: o } = r(), c = l(() => e.map((e) => s(e)), [e]), u = t({ queries: c.map((e) => ({
68
68
  queryKey: d(e),
69
69
  queryFn: async () => p(await o.dryRun(e)),
70
- enabled: !r,
71
- staleTime: i
70
+ enabled: !i,
71
+ staleTime: a
72
72
  })) });
73
73
  return {
74
74
  debugDataPerQuery: u.map((e) => ({
@@ -122,11 +122,11 @@ function b(e) {
122
122
  return !e || typeof e != "object" ? !1 : Object.prototype.hasOwnProperty.call(e, "retention");
123
123
  }
124
124
  function x(e, t = {}) {
125
- let { skip: r = !1 } = t, { cubeApi: i } = a(), [o, d] = u(null), [f, p] = u(!1), m = l(() => e ? v(e) || y(e) || b(e) ? e : s(e) : null, [e]), h = !!m && !r && f, g = n({
125
+ let { skip: n = !1 } = t, { cubeApi: a } = r(), [o, d] = u(null), [f, p] = u(!1), m = l(() => e ? v(e) || y(e) || b(e) ? e : s(e) : null, [e]), h = !!m && !n && f, g = i({
126
126
  queryKey: _(m, o ?? void 0),
127
127
  queryFn: async () => {
128
128
  if (!m) throw Error("No query provided");
129
- return await i.explain(m, o ?? void 0);
129
+ return await a.explain(m, o ?? void 0);
130
130
  },
131
131
  enabled: h,
132
132
  staleTime: 0,
@@ -135,9 +135,9 @@ function x(e, t = {}) {
135
135
  refetchOnReconnect: !1,
136
136
  refetchOnMount: !1
137
137
  }), x = c((e) => {
138
- r || !m || (d(e ?? null), p(!0), f && g.refetch());
138
+ n || !m || (d(e ?? null), p(!0), f && g.refetch());
139
139
  }, [
140
- r,
140
+ n,
141
141
  m,
142
142
  f,
143
143
  g
@@ -161,7 +161,7 @@ var S = [
161
161
  "ai"
162
162
  ];
163
163
  function C(t = {}) {
164
- let { features: n } = r(), { apiOptions: o } = a(), s = n.enableAI ?? !0, l = i(), u = t.aiEndpoint ?? "/api/ai/explain/analyze", d = e({
164
+ let { features: i } = n(), { apiOptions: o } = r(), s = i.enableAI ?? !0, l = a(), u = t.aiEndpoint ?? "/api/ai/explain/analyze", d = e({
165
165
  mutationKey: S,
166
166
  mutationFn: async ({ explainResult: e, query: t }) => {
167
167
  if (!s) throw Error("AI features are disabled");
@@ -203,4 +203,4 @@ function C(t = {}) {
203
203
  //#endregion
204
204
  export { m as a, g as i, _ as n, h as o, x as r, C as t };
205
205
 
206
- //# sourceMappingURL=useExplainAI-BnkoZ-zS.js.map
206
+ //# sourceMappingURL=useExplainAI-_C4WQE5I.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useExplainAI-BnkoZ-zS.js","names":[],"sources":["../../../src/client/hooks/queries/useDryRunQuery.ts","../../../src/client/hooks/queries/useExplainQuery.ts","../../../src/client/hooks/queries/useExplainAI.ts"],"sourcesContent":["/**\n * useDryRunQuery - TanStack Query hook for dry-run (debug) data\n *\n * Features:\n * - Fetch SQL and analysis data for query debugging\n * - Support for single and multi-query modes\n * - Built-in caching with TanStack Query\n * - Parallel fetching for multiple queries\n *\n * This hook replaces the debug data useEffect in AnalysisBuilder.\n */\n\nimport { useQuery, useQueries } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useCubeApi } from '../../providers/CubeApiProvider.js'\nimport type { CubeQuery } from '../../types.js'\nimport type { QueryAnalysis } from '../../components/AnalysisBuilder/types.js'\nimport { cleanQueryForServer } from '../../shared/utils.js'\nimport { stableStringify } from '../../shared/queryKey.js'\n\nexport type DryRunMode = 'regular' | 'comparison' | 'funnel' | 'flow' | 'retention'\n\ninterface DryRunResponsePayload {\n sql?: { sql: string; params?: unknown[] }\n analysis?: QueryAnalysis | null\n mode?: DryRunMode\n queryType?: string\n joinType?: string\n cubesUsed?: string[]\n modeMetadata?: unknown\n}\n\n/**\n * Debug data entry for a single query\n */\nexport interface DebugDataEntry {\n /** Generated SQL and parameters */\n sql: { sql: string; params: unknown[] } | null\n /** Query analysis (dimensions, measures, complexity, etc.) */\n analysis: QueryAnalysis | null\n /** Server-reported dry-run mode */\n mode?: DryRunMode | null\n /** Query type label from server */\n queryType?: string | null\n /** Join strategy label from server */\n joinType?: string | null\n /** Referenced cubes from server */\n cubesUsed?: string[]\n /** Mode-specific metadata (replaces funnel/flow/retention split) */\n modeMetadata?: unknown\n /** Whether this entry is loading */\n loading: boolean\n /** Error if fetch failed */\n error: Error | null\n}\n\n/**\n * Create a stable query key for dry-run\n */\nexport function createDryRunQueryKey(\n query: CubeQuery | null\n): readonly unknown[] {\n if (!query) return ['cube', 'dryRun', null] as const\n return ['cube', 'dryRun', stableStringify(query)] as const\n}\n\nexport interface UseDryRunQueryOptions {\n /**\n * Whether to skip the query\n * @default false\n */\n skip?: boolean\n /**\n * Stale time in milliseconds\n * @default 5 * 60 * 1000 (5 minutes)\n */\n staleTime?: number\n}\n\nexport interface UseDryRunQueryResult {\n /** Debug data for the query */\n debugData: DebugDataEntry\n /** Manually refetch */\n refetch: () => void\n}\n\nfunction inferModeFromPayload(payload: DryRunResponsePayload): DryRunMode | null {\n if (payload.mode) return payload.mode\n if (payload.queryType === 'comparisonQuery') return 'comparison'\n if (payload.queryType === 'funnelQuery') return 'funnel'\n if (payload.queryType === 'flowQuery') return 'flow'\n if (payload.queryType === 'retentionQuery') return 'retention'\n if (payload.queryType === 'regularQuery') return 'regular'\n return null\n}\n\nfunction normalizeDryRunResult(payload: DryRunResponsePayload): Omit<DebugDataEntry, 'loading' | 'error'> {\n const mode = inferModeFromPayload(payload)\n return {\n sql: payload.sql ? { sql: payload.sql.sql, params: payload.sql.params || [] } : null,\n analysis: (payload.analysis || null) as QueryAnalysis | null,\n mode,\n queryType: payload.queryType || null,\n joinType: payload.joinType || null,\n cubesUsed: payload.cubesUsed || [],\n modeMetadata: payload.modeMetadata\n }\n}\n\n/**\n * TanStack Query hook for single query dry-run (debug) data\n *\n * Usage:\n * ```tsx\n * const { debugData } = useDryRunQuery(query, { skip: !isValidQuery })\n * ```\n */\nexport function useDryRunQuery(\n query: CubeQuery | null,\n options: UseDryRunQueryOptions = {}\n): UseDryRunQueryResult {\n const { skip = false, staleTime = 5 * 60 * 1000 } = options\n const { cubeApi } = useCubeApi()\n\n // Transform query for server\n const serverQuery = useMemo(() => {\n if (!query) return null\n const modeQuery = query as CubeQuery & { funnel?: unknown; flow?: unknown; retention?: unknown }\n // Preserve specialized mode payloads as-is; cleanQueryForServer strips non-Cube.js keys.\n if (modeQuery.funnel || modeQuery.flow || modeQuery.retention) {\n return query\n }\n return cleanQueryForServer(query)\n }, [query])\n\n const queryResult = useQuery({\n queryKey: createDryRunQueryKey(serverQuery),\n queryFn: async () => {\n if (!serverQuery) throw new Error('No query provided')\n const result = await cubeApi.dryRun(serverQuery)\n return normalizeDryRunResult(result as DryRunResponsePayload)\n },\n enabled: !!serverQuery && !skip,\n staleTime,\n })\n\n const debugData: DebugDataEntry = {\n ...(queryResult.data || {\n sql: null,\n analysis: null,\n mode: null,\n queryType: null,\n joinType: null,\n cubesUsed: [],\n modeMetadata: undefined\n }),\n loading: queryResult.isLoading,\n error: queryResult.error ?? null,\n }\n\n return {\n debugData,\n refetch: () => queryResult.refetch(),\n }\n}\n\nexport interface UseMultiDryRunQueriesOptions {\n /**\n * Whether to skip all queries\n * @default false\n */\n skip?: boolean\n /**\n * Stale time in milliseconds\n * @default 5 * 60 * 1000 (5 minutes)\n */\n staleTime?: number\n}\n\nexport interface UseMultiDryRunQueriesResult {\n /** Debug data for each query */\n debugDataPerQuery: DebugDataEntry[]\n /** Whether any query is loading */\n isLoading: boolean\n /** Manually refetch all */\n refetchAll: () => void\n}\n\n/**\n * TanStack Query hook for multiple query dry-runs (debug) data\n *\n * Fetches debug data for multiple queries in parallel.\n *\n * Usage:\n * ```tsx\n * const { debugDataPerQuery, isLoading } = useMultiDryRunQueries(queries, {\n * skip: !isMultiQueryMode\n * })\n * ```\n */\nexport function useMultiDryRunQueries(\n queries: CubeQuery[],\n options: UseMultiDryRunQueriesOptions = {}\n): UseMultiDryRunQueriesResult {\n const { skip = false, staleTime = 5 * 60 * 1000 } = options\n const { cubeApi } = useCubeApi()\n\n // Transform queries for server\n const serverQueries = useMemo(() => {\n return queries.map((q) => cleanQueryForServer(q))\n }, [queries])\n\n // Use useQueries for parallel fetching\n const queryResults = useQueries({\n queries: serverQueries.map((query) => ({\n queryKey: createDryRunQueryKey(query),\n queryFn: async () => {\n const result = await cubeApi.dryRun(query)\n return normalizeDryRunResult(result as DryRunResponsePayload)\n },\n enabled: !skip,\n staleTime,\n })),\n })\n\n // Transform results to DebugDataEntry array\n const debugDataPerQuery: DebugDataEntry[] = queryResults.map((result) => ({\n ...(result.data || {\n sql: null,\n analysis: null,\n mode: null,\n queryType: null,\n joinType: null,\n cubesUsed: [],\n modeMetadata: undefined\n }),\n loading: result.isLoading,\n error: result.error ?? null,\n }))\n\n // Check if any query is loading\n const isLoading = queryResults.some((r) => r.isLoading)\n\n // Refetch all queries\n const refetchAll = () => {\n queryResults.forEach((r) => r.refetch())\n }\n\n return {\n debugDataPerQuery,\n isLoading,\n refetchAll,\n }\n}\n\n/**\n * Combined hook for single or multi-query dry-run based on mode\n *\n * This is a convenience wrapper that automatically chooses between\n * single and multi-query dry-run based on the number of queries.\n *\n * Usage:\n * ```tsx\n * const { debugDataPerQuery } = useDryRunQueries({\n * queries: isMultiQueryMode ? allQueries : [currentQuery],\n * isMultiQueryMode,\n * skip: !isValidQuery\n * })\n * ```\n */\nexport function useDryRunQueries(options: {\n queries: CubeQuery[]\n isMultiQueryMode: boolean\n skip?: boolean\n staleTime?: number\n}): UseMultiDryRunQueriesResult {\n const { queries, isMultiQueryMode, skip = false, staleTime } = options\n\n // For single query mode, wrap in array for consistent interface\n const queriesToFetch = isMultiQueryMode ? queries : queries.slice(0, 1)\n\n return useMultiDryRunQueries(queriesToFetch, { skip, staleTime })\n}\n\nexport type FunnelDebugDataEntry = DebugDataEntry\n\n/**\n * TanStack Query hook for funnel query dry-run (debug) data\n *\n * Usage:\n * ```tsx\n * const { debugData } = useFunnelDryRunQuery(serverQuery, { skip: !isFunnelMode })\n * ```\n */\nexport function useFunnelDryRunQuery(\n serverQuery: unknown | null,\n options: UseDryRunQueryOptions = {}\n): { debugData: FunnelDebugDataEntry; refetch: () => void } {\n return useDryRunQuery(serverQuery as CubeQuery | null, options)\n}\n\nexport type FlowDebugDataEntry = DebugDataEntry\n\n/**\n * TanStack Query hook for flow query dry-run (debug) data\n *\n * Usage:\n * ```tsx\n * const { debugData } = useFlowDryRunQuery(serverQuery, { skip: !isFlowMode })\n * ```\n */\nexport function useFlowDryRunQuery(\n serverQuery: unknown | null,\n options: UseDryRunQueryOptions = {}\n): { debugData: FlowDebugDataEntry; refetch: () => void } {\n return useDryRunQuery(serverQuery as CubeQuery | null, options)\n}\n\nexport type RetentionDebugDataEntry = DebugDataEntry\n\n/**\n * TanStack Query hook for retention query dry-run (debug) data\n *\n * Usage:\n * ```tsx\n * const { debugData } = useRetentionDryRunQuery(serverQuery, { skip: !isRetentionMode })\n * ```\n */\nexport function useRetentionDryRunQuery(\n serverQuery: unknown | null,\n options: UseDryRunQueryOptions = {}\n): { debugData: RetentionDebugDataEntry; refetch: () => void } {\n return useDryRunQuery(serverQuery as CubeQuery | null, options)\n}\n","/**\n * useExplainQuery - TanStack Query hook for EXPLAIN PLAN execution\n *\n * Features:\n * - Manually triggered (not automatic like useCubeLoadQuery)\n * - Returns normalized execution plan across PostgreSQL, MySQL, and SQLite\n * - Supports EXPLAIN ANALYZE for actual timing data\n * - No caching - always fetches fresh data to reflect schema/index changes\n *\n * Usage:\n * ```tsx\n * const { explainResult, isLoading, error, runExplain } = useExplainQuery(query)\n *\n * // Trigger explain manually\n * <button onClick={() => runExplain({ analyze: true })}>Explain with Timing</button>\n * ```\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useCallback, useMemo, useState } from 'react'\nimport { useCubeApi } from '../../providers/CubeApiProvider.js'\nimport type { CubeQuery, ExplainResult, ExplainOptions } from '../../types.js'\nimport { cleanQueryForServer } from '../../shared/utils.js'\nimport { stableStringify } from '../../shared/queryKey.js'\n\n/**\n * Query type that can be explained - includes standard queries, funnel queries, flow queries, and retention queries\n */\nexport type ExplainableQuery = CubeQuery | { funnel: unknown } | { flow: unknown } | { retention: unknown } | unknown\n\n/**\n * Create a stable query key for explain\n */\nexport function createExplainQueryKey(\n query: ExplainableQuery | null,\n options?: ExplainOptions\n): readonly unknown[] {\n if (!query) return ['cube', 'explain', null, null] as const\n return ['cube', 'explain', stableStringify(query), options?.analyze ?? false] as const\n}\n\nexport interface UseExplainQueryOptions {\n /**\n * Whether to skip the query (prevent execution even when triggered)\n * @default false\n */\n skip?: boolean\n}\n\nexport interface UseExplainQueryResult {\n /** The explain result from the server */\n explainResult: ExplainResult | null\n /** Whether the explain query is loading */\n isLoading: boolean\n /** Whether an explain has been triggered */\n hasRun: boolean\n /** Error if explain failed */\n error: Error | null\n /**\n * Manually trigger the explain query\n * @param options - Optional explain options (e.g., { analyze: true } for actual timing)\n */\n runExplain: (options?: ExplainOptions) => void\n /** Clear the explain result */\n clearExplain: () => void\n}\n\n/**\n * Check if query is a funnel query\n */\nfunction isFunnelQuery(query: unknown): query is { funnel: unknown } {\n if (!query || typeof query !== 'object') return false\n return Object.prototype.hasOwnProperty.call(query, 'funnel')\n}\n\n/**\n * Check if query is a flow query\n */\nfunction isFlowQuery(query: unknown): query is { flow: unknown } {\n if (!query || typeof query !== 'object') return false\n return Object.prototype.hasOwnProperty.call(query, 'flow')\n}\n\n/**\n * Check if query is a retention query\n */\nfunction isRetentionQuery(query: unknown): query is { retention: unknown } {\n if (!query || typeof query !== 'object') return false\n return Object.prototype.hasOwnProperty.call(query, 'retention')\n}\n\n/**\n * TanStack Query hook for EXPLAIN PLAN execution\n *\n * Unlike useDryRunQuery, this hook is manually triggered via `runExplain()`.\n * This is intentional because:\n * 1. EXPLAIN queries have performance overhead\n * 2. EXPLAIN ANALYZE actually executes the query\n * 3. Users should explicitly choose when to run explain\n *\n * Supports standard queries, funnel queries, and flow queries.\n *\n * Usage:\n * ```tsx\n * const { explainResult, isLoading, runExplain } = useExplainQuery(query, { skip: !isValidQuery })\n *\n * // Trigger explain\n * <button onClick={() => runExplain()}>Explain Plan</button>\n *\n * // Trigger explain with timing\n * <button onClick={() => runExplain({ analyze: true })}>Explain with Timing</button>\n * ```\n */\nexport function useExplainQuery(\n query: ExplainableQuery | null,\n options: UseExplainQueryOptions = {}\n): UseExplainQueryResult {\n const { skip = false } = options\n const { cubeApi } = useCubeApi()\n\n // Track whether explain has been triggered and with what options\n const [explainOptions, setExplainOptions] = useState<ExplainOptions | null>(null)\n const [hasTriggered, setHasTriggered] = useState(false)\n\n // Transform query for server\n // For funnel/flow/retention queries, pass them directly without cleaning\n const serverQuery = useMemo(() => {\n if (!query) return null\n // Funnel, flow, and retention queries have their own format, don't clean them\n if (isFunnelQuery(query) || isFlowQuery(query) || isRetentionQuery(query)) {\n return query\n }\n // Standard queries get cleaned\n return cleanQueryForServer(query as CubeQuery)\n }, [query])\n\n // Query is enabled only when:\n // 1. We have a query\n // 2. Skip is false\n // 3. User has triggered the explain\n const queryEnabled = !!serverQuery && !skip && hasTriggered\n\n const queryResult = useQuery({\n queryKey: createExplainQueryKey(serverQuery, explainOptions ?? undefined),\n queryFn: async () => {\n if (!serverQuery) throw new Error('No query provided')\n const result = await cubeApi.explain(serverQuery, explainOptions ?? undefined)\n return result\n },\n enabled: queryEnabled,\n // EXPLAIN queries should never be cached - always fetch fresh data\n // This ensures users see the latest execution plan after schema/index changes\n staleTime: 0,\n gcTime: 0,\n // Don't refetch automatically - this is manually triggered\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n refetchOnMount: false,\n })\n\n // Manual trigger function\n const runExplain = useCallback((opts?: ExplainOptions) => {\n if (skip || !serverQuery) return\n setExplainOptions(opts ?? null)\n setHasTriggered(true)\n // If already triggered with same options, refetch\n if (hasTriggered) {\n queryResult.refetch()\n }\n }, [skip, serverQuery, hasTriggered, queryResult])\n\n // Clear function\n const clearExplain = useCallback(() => {\n setHasTriggered(false)\n setExplainOptions(null)\n }, [])\n\n return {\n explainResult: queryResult.data ?? null,\n isLoading: queryResult.isLoading || queryResult.isFetching,\n hasRun: hasTriggered,\n error: queryResult.error ?? null,\n runExplain,\n clearExplain,\n }\n}\n","/**\n * useExplainAI - TanStack Query hook for AI analysis of EXPLAIN plans\n *\n * Features:\n * - Manually triggered via useMutation (not automatic)\n * - Analyzes execution plans and provides actionable recommendations\n * - Returns structured recommendations (indexes, table changes, cube improvements)\n * - No caching - always fetches fresh analysis\n * - Uses the /api/ai/explain/analyze endpoint\n *\n * Usage:\n * ```tsx\n * const { analysis, isAnalyzing, error, analyze, clearAnalysis } = useExplainAI()\n *\n * // After getting an explain result, trigger AI analysis\n * <button onClick={() => analyze(explainResult, query)}>Analyze with AI</button>\n * ```\n */\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useCallback } from 'react'\nimport type { ExplainResult, AIExplainAnalysis } from '../../types.js'\nimport { useCubeFeatures } from '../../providers/CubeFeaturesProvider.js'\nimport { useCubeApi } from '../../providers/CubeApiProvider.js'\n\nexport interface UseExplainAIOptions {\n /**\n * Custom AI endpoint for explain analysis\n * @default '/api/ai/explain/analyze'\n */\n aiEndpoint?: string\n}\n\nexport interface UseExplainAIResult {\n /** The AI analysis result */\n analysis: AIExplainAnalysis | null\n /** Whether AI analysis is in progress */\n isAnalyzing: boolean\n /** Error if AI analysis failed */\n error: Error | null\n /**\n * Trigger AI analysis of an explain result\n * @param explainResult - The EXPLAIN result to analyze\n * @param query - The original semantic query\n */\n analyze: (explainResult: ExplainResult, query: unknown) => void\n /** Clear the analysis result */\n clearAnalysis: () => void\n}\n\n/**\n * Query key for AI explain analysis\n */\nexport const EXPLAIN_AI_QUERY_KEY = ['cube', 'explain', 'ai'] as const\n\n/**\n * TanStack Query hook for AI analysis of EXPLAIN plans\n *\n * This hook uses useMutation to call the AI endpoint and analyze execution plans,\n * providing actionable recommendations for performance improvement.\n *\n * Recommendations focus on what users CAN control:\n * - Index creation (with CREATE INDEX statements)\n * - Table structure changes\n * - Cube definition improvements (segments, pre-aggregations, joins)\n *\n * Usage:\n * ```tsx\n * const { analysis, isAnalyzing, analyze } = useExplainAI()\n *\n * // After running EXPLAIN\n * if (explainResult) {\n * <button onClick={() => analyze(explainResult, query)}>\n * {isAnalyzing ? 'Analyzing...' : 'Analyze with AI'}\n * </button>\n * }\n *\n * // Display recommendations\n * {analysis?.recommendations.map(rec => (\n * <div key={rec.title}>\n * <h4>{rec.title}</h4>\n * <p>{rec.description}</p>\n * {rec.sql && <pre>{rec.sql}</pre>}\n * {rec.cubeCode && <pre>{rec.cubeCode}</pre>}\n * </div>\n * ))}\n * ```\n */\nexport function useExplainAI(options: UseExplainAIOptions = {}): UseExplainAIResult {\n const { features } = useCubeFeatures()\n const { apiOptions } = useCubeApi()\n const enableAI = features.enableAI ?? true\n const queryClient = useQueryClient()\n\n // AI endpoint - defaults to /api/ai/explain/analyze\n // This is the standard path for AI routes in the dev server\n const aiEndpoint = options.aiEndpoint ?? '/api/ai/explain/analyze'\n\n const mutation = useMutation({\n mutationKey: EXPLAIN_AI_QUERY_KEY,\n mutationFn: async ({ explainResult, query }: { explainResult: ExplainResult; query: unknown }) => {\n // Check if AI is enabled\n if (!enableAI) {\n throw new Error('AI features are disabled')\n }\n\n const response = await fetch(aiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...apiOptions?.headers,\n },\n credentials: 'include',\n body: JSON.stringify({\n explainResult,\n query,\n }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(\n errorData.error ||\n errorData.message ||\n `AI analysis failed: ${response.status} ${response.statusText}`\n )\n }\n\n const result: AIExplainAnalysis = await response.json()\n return result\n },\n // No caching - each mutation is independent\n gcTime: 0,\n })\n\n const analyze = useCallback((explainResult: ExplainResult, query: unknown) => {\n mutation.mutate({ explainResult, query })\n }, [mutation])\n\n const clearAnalysis = useCallback(() => {\n mutation.reset()\n // Also invalidate any cached queries\n queryClient.removeQueries({ queryKey: EXPLAIN_AI_QUERY_KEY })\n }, [mutation, queryClient])\n\n return {\n analysis: mutation.data ?? null,\n isAnalyzing: mutation.isPending,\n error: mutation.error ?? null,\n analyze,\n clearAnalysis,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useExplainAI-_C4WQE5I.js","names":[],"sources":["../../../src/client/hooks/queries/useDryRunQuery.ts","../../../src/client/hooks/queries/useExplainQuery.ts","../../../src/client/hooks/queries/useExplainAI.ts"],"sourcesContent":["/**\n * useDryRunQuery - TanStack Query hook for dry-run (debug) data\n *\n * Features:\n * - Fetch SQL and analysis data for query debugging\n * - Support for single and multi-query modes\n * - Built-in caching with TanStack Query\n * - Parallel fetching for multiple queries\n *\n * This hook replaces the debug data useEffect in AnalysisBuilder.\n */\n\nimport { useQuery, useQueries } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useCubeApi } from '../../providers/CubeApiProvider.js'\nimport type { CubeQuery } from '../../types.js'\nimport type { QueryAnalysis } from '../../components/AnalysisBuilder/types.js'\nimport { cleanQueryForServer } from '../../shared/utils.js'\nimport { stableStringify } from '../../shared/queryKey.js'\n\nexport type DryRunMode = 'regular' | 'comparison' | 'funnel' | 'flow' | 'retention'\n\ninterface DryRunResponsePayload {\n sql?: { sql: string; params?: unknown[] }\n analysis?: QueryAnalysis | null\n mode?: DryRunMode\n queryType?: string\n joinType?: string\n cubesUsed?: string[]\n modeMetadata?: unknown\n}\n\n/**\n * Debug data entry for a single query\n */\nexport interface DebugDataEntry {\n /** Generated SQL and parameters */\n sql: { sql: string; params: unknown[] } | null\n /** Query analysis (dimensions, measures, complexity, etc.) */\n analysis: QueryAnalysis | null\n /** Server-reported dry-run mode */\n mode?: DryRunMode | null\n /** Query type label from server */\n queryType?: string | null\n /** Join strategy label from server */\n joinType?: string | null\n /** Referenced cubes from server */\n cubesUsed?: string[]\n /** Mode-specific metadata (replaces funnel/flow/retention split) */\n modeMetadata?: unknown\n /** Whether this entry is loading */\n loading: boolean\n /** Error if fetch failed */\n error: Error | null\n}\n\n/**\n * Create a stable query key for dry-run\n */\nexport function createDryRunQueryKey(\n query: CubeQuery | null\n): readonly unknown[] {\n if (!query) return ['cube', 'dryRun', null] as const\n return ['cube', 'dryRun', stableStringify(query)] as const\n}\n\nexport interface UseDryRunQueryOptions {\n /**\n * Whether to skip the query\n * @default false\n */\n skip?: boolean\n /**\n * Stale time in milliseconds\n * @default 5 * 60 * 1000 (5 minutes)\n */\n staleTime?: number\n}\n\nexport interface UseDryRunQueryResult {\n /** Debug data for the query */\n debugData: DebugDataEntry\n /** Manually refetch */\n refetch: () => void\n}\n\nfunction inferModeFromPayload(payload: DryRunResponsePayload): DryRunMode | null {\n if (payload.mode) return payload.mode\n if (payload.queryType === 'comparisonQuery') return 'comparison'\n if (payload.queryType === 'funnelQuery') return 'funnel'\n if (payload.queryType === 'flowQuery') return 'flow'\n if (payload.queryType === 'retentionQuery') return 'retention'\n if (payload.queryType === 'regularQuery') return 'regular'\n return null\n}\n\nfunction normalizeDryRunResult(payload: DryRunResponsePayload): Omit<DebugDataEntry, 'loading' | 'error'> {\n const mode = inferModeFromPayload(payload)\n return {\n sql: payload.sql ? { sql: payload.sql.sql, params: payload.sql.params || [] } : null,\n analysis: (payload.analysis || null) as QueryAnalysis | null,\n mode,\n queryType: payload.queryType || null,\n joinType: payload.joinType || null,\n cubesUsed: payload.cubesUsed || [],\n modeMetadata: payload.modeMetadata\n }\n}\n\n/**\n * TanStack Query hook for single query dry-run (debug) data\n *\n * Usage:\n * ```tsx\n * const { debugData } = useDryRunQuery(query, { skip: !isValidQuery })\n * ```\n */\nexport function useDryRunQuery(\n query: CubeQuery | null,\n options: UseDryRunQueryOptions = {}\n): UseDryRunQueryResult {\n const { skip = false, staleTime = 5 * 60 * 1000 } = options\n const { cubeApi } = useCubeApi()\n\n // Transform query for server\n const serverQuery = useMemo(() => {\n if (!query) return null\n const modeQuery = query as CubeQuery & { funnel?: unknown; flow?: unknown; retention?: unknown }\n // Preserve specialized mode payloads as-is; cleanQueryForServer strips non-Cube.js keys.\n if (modeQuery.funnel || modeQuery.flow || modeQuery.retention) {\n return query\n }\n return cleanQueryForServer(query)\n }, [query])\n\n const queryResult = useQuery({\n queryKey: createDryRunQueryKey(serverQuery),\n queryFn: async () => {\n if (!serverQuery) throw new Error('No query provided')\n const result = await cubeApi.dryRun(serverQuery)\n return normalizeDryRunResult(result as DryRunResponsePayload)\n },\n enabled: !!serverQuery && !skip,\n staleTime,\n })\n\n const debugData: DebugDataEntry = {\n ...(queryResult.data || {\n sql: null,\n analysis: null,\n mode: null,\n queryType: null,\n joinType: null,\n cubesUsed: [],\n modeMetadata: undefined\n }),\n loading: queryResult.isLoading,\n error: queryResult.error ?? null,\n }\n\n return {\n debugData,\n refetch: () => queryResult.refetch(),\n }\n}\n\nexport interface UseMultiDryRunQueriesOptions {\n /**\n * Whether to skip all queries\n * @default false\n */\n skip?: boolean\n /**\n * Stale time in milliseconds\n * @default 5 * 60 * 1000 (5 minutes)\n */\n staleTime?: number\n}\n\nexport interface UseMultiDryRunQueriesResult {\n /** Debug data for each query */\n debugDataPerQuery: DebugDataEntry[]\n /** Whether any query is loading */\n isLoading: boolean\n /** Manually refetch all */\n refetchAll: () => void\n}\n\n/**\n * TanStack Query hook for multiple query dry-runs (debug) data\n *\n * Fetches debug data for multiple queries in parallel.\n *\n * Usage:\n * ```tsx\n * const { debugDataPerQuery, isLoading } = useMultiDryRunQueries(queries, {\n * skip: !isMultiQueryMode\n * })\n * ```\n */\nexport function useMultiDryRunQueries(\n queries: CubeQuery[],\n options: UseMultiDryRunQueriesOptions = {}\n): UseMultiDryRunQueriesResult {\n const { skip = false, staleTime = 5 * 60 * 1000 } = options\n const { cubeApi } = useCubeApi()\n\n // Transform queries for server\n const serverQueries = useMemo(() => {\n return queries.map((q) => cleanQueryForServer(q))\n }, [queries])\n\n // Use useQueries for parallel fetching\n const queryResults = useQueries({\n queries: serverQueries.map((query) => ({\n queryKey: createDryRunQueryKey(query),\n queryFn: async () => {\n const result = await cubeApi.dryRun(query)\n return normalizeDryRunResult(result as DryRunResponsePayload)\n },\n enabled: !skip,\n staleTime,\n })),\n })\n\n // Transform results to DebugDataEntry array\n const debugDataPerQuery: DebugDataEntry[] = queryResults.map((result) => ({\n ...(result.data || {\n sql: null,\n analysis: null,\n mode: null,\n queryType: null,\n joinType: null,\n cubesUsed: [],\n modeMetadata: undefined\n }),\n loading: result.isLoading,\n error: result.error ?? null,\n }))\n\n // Check if any query is loading\n const isLoading = queryResults.some((r) => r.isLoading)\n\n // Refetch all queries\n const refetchAll = () => {\n queryResults.forEach((r) => r.refetch())\n }\n\n return {\n debugDataPerQuery,\n isLoading,\n refetchAll,\n }\n}\n\n/**\n * Combined hook for single or multi-query dry-run based on mode\n *\n * This is a convenience wrapper that automatically chooses between\n * single and multi-query dry-run based on the number of queries.\n *\n * Usage:\n * ```tsx\n * const { debugDataPerQuery } = useDryRunQueries({\n * queries: isMultiQueryMode ? allQueries : [currentQuery],\n * isMultiQueryMode,\n * skip: !isValidQuery\n * })\n * ```\n */\nexport function useDryRunQueries(options: {\n queries: CubeQuery[]\n isMultiQueryMode: boolean\n skip?: boolean\n staleTime?: number\n}): UseMultiDryRunQueriesResult {\n const { queries, isMultiQueryMode, skip = false, staleTime } = options\n\n // For single query mode, wrap in array for consistent interface\n const queriesToFetch = isMultiQueryMode ? queries : queries.slice(0, 1)\n\n return useMultiDryRunQueries(queriesToFetch, { skip, staleTime })\n}\n\nexport type FunnelDebugDataEntry = DebugDataEntry\n\n/**\n * TanStack Query hook for funnel query dry-run (debug) data\n *\n * Usage:\n * ```tsx\n * const { debugData } = useFunnelDryRunQuery(serverQuery, { skip: !isFunnelMode })\n * ```\n */\nexport function useFunnelDryRunQuery(\n serverQuery: unknown | null,\n options: UseDryRunQueryOptions = {}\n): { debugData: FunnelDebugDataEntry; refetch: () => void } {\n return useDryRunQuery(serverQuery as CubeQuery | null, options)\n}\n\nexport type FlowDebugDataEntry = DebugDataEntry\n\n/**\n * TanStack Query hook for flow query dry-run (debug) data\n *\n * Usage:\n * ```tsx\n * const { debugData } = useFlowDryRunQuery(serverQuery, { skip: !isFlowMode })\n * ```\n */\nexport function useFlowDryRunQuery(\n serverQuery: unknown | null,\n options: UseDryRunQueryOptions = {}\n): { debugData: FlowDebugDataEntry; refetch: () => void } {\n return useDryRunQuery(serverQuery as CubeQuery | null, options)\n}\n\nexport type RetentionDebugDataEntry = DebugDataEntry\n\n/**\n * TanStack Query hook for retention query dry-run (debug) data\n *\n * Usage:\n * ```tsx\n * const { debugData } = useRetentionDryRunQuery(serverQuery, { skip: !isRetentionMode })\n * ```\n */\nexport function useRetentionDryRunQuery(\n serverQuery: unknown | null,\n options: UseDryRunQueryOptions = {}\n): { debugData: RetentionDebugDataEntry; refetch: () => void } {\n return useDryRunQuery(serverQuery as CubeQuery | null, options)\n}\n","/**\n * useExplainQuery - TanStack Query hook for EXPLAIN PLAN execution\n *\n * Features:\n * - Manually triggered (not automatic like useCubeLoadQuery)\n * - Returns normalized execution plan across PostgreSQL, MySQL, and SQLite\n * - Supports EXPLAIN ANALYZE for actual timing data\n * - No caching - always fetches fresh data to reflect schema/index changes\n *\n * Usage:\n * ```tsx\n * const { explainResult, isLoading, error, runExplain } = useExplainQuery(query)\n *\n * // Trigger explain manually\n * <button onClick={() => runExplain({ analyze: true })}>Explain with Timing</button>\n * ```\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { useCallback, useMemo, useState } from 'react'\nimport { useCubeApi } from '../../providers/CubeApiProvider.js'\nimport type { CubeQuery, ExplainResult, ExplainOptions } from '../../types.js'\nimport { cleanQueryForServer } from '../../shared/utils.js'\nimport { stableStringify } from '../../shared/queryKey.js'\n\n/**\n * Query type that can be explained - includes standard queries, funnel queries, flow queries, and retention queries\n */\nexport type ExplainableQuery = CubeQuery | { funnel: unknown } | { flow: unknown } | { retention: unknown } | unknown\n\n/**\n * Create a stable query key for explain\n */\nexport function createExplainQueryKey(\n query: ExplainableQuery | null,\n options?: ExplainOptions\n): readonly unknown[] {\n if (!query) return ['cube', 'explain', null, null] as const\n return ['cube', 'explain', stableStringify(query), options?.analyze ?? false] as const\n}\n\nexport interface UseExplainQueryOptions {\n /**\n * Whether to skip the query (prevent execution even when triggered)\n * @default false\n */\n skip?: boolean\n}\n\nexport interface UseExplainQueryResult {\n /** The explain result from the server */\n explainResult: ExplainResult | null\n /** Whether the explain query is loading */\n isLoading: boolean\n /** Whether an explain has been triggered */\n hasRun: boolean\n /** Error if explain failed */\n error: Error | null\n /**\n * Manually trigger the explain query\n * @param options - Optional explain options (e.g., { analyze: true } for actual timing)\n */\n runExplain: (options?: ExplainOptions) => void\n /** Clear the explain result */\n clearExplain: () => void\n}\n\n/**\n * Check if query is a funnel query\n */\nfunction isFunnelQuery(query: unknown): query is { funnel: unknown } {\n if (!query || typeof query !== 'object') return false\n return Object.prototype.hasOwnProperty.call(query, 'funnel')\n}\n\n/**\n * Check if query is a flow query\n */\nfunction isFlowQuery(query: unknown): query is { flow: unknown } {\n if (!query || typeof query !== 'object') return false\n return Object.prototype.hasOwnProperty.call(query, 'flow')\n}\n\n/**\n * Check if query is a retention query\n */\nfunction isRetentionQuery(query: unknown): query is { retention: unknown } {\n if (!query || typeof query !== 'object') return false\n return Object.prototype.hasOwnProperty.call(query, 'retention')\n}\n\n/**\n * TanStack Query hook for EXPLAIN PLAN execution\n *\n * Unlike useDryRunQuery, this hook is manually triggered via `runExplain()`.\n * This is intentional because:\n * 1. EXPLAIN queries have performance overhead\n * 2. EXPLAIN ANALYZE actually executes the query\n * 3. Users should explicitly choose when to run explain\n *\n * Supports standard queries, funnel queries, and flow queries.\n *\n * Usage:\n * ```tsx\n * const { explainResult, isLoading, runExplain } = useExplainQuery(query, { skip: !isValidQuery })\n *\n * // Trigger explain\n * <button onClick={() => runExplain()}>Explain Plan</button>\n *\n * // Trigger explain with timing\n * <button onClick={() => runExplain({ analyze: true })}>Explain with Timing</button>\n * ```\n */\nexport function useExplainQuery(\n query: ExplainableQuery | null,\n options: UseExplainQueryOptions = {}\n): UseExplainQueryResult {\n const { skip = false } = options\n const { cubeApi } = useCubeApi()\n\n // Track whether explain has been triggered and with what options\n const [explainOptions, setExplainOptions] = useState<ExplainOptions | null>(null)\n const [hasTriggered, setHasTriggered] = useState(false)\n\n // Transform query for server\n // For funnel/flow/retention queries, pass them directly without cleaning\n const serverQuery = useMemo(() => {\n if (!query) return null\n // Funnel, flow, and retention queries have their own format, don't clean them\n if (isFunnelQuery(query) || isFlowQuery(query) || isRetentionQuery(query)) {\n return query\n }\n // Standard queries get cleaned\n return cleanQueryForServer(query as CubeQuery)\n }, [query])\n\n // Query is enabled only when:\n // 1. We have a query\n // 2. Skip is false\n // 3. User has triggered the explain\n const queryEnabled = !!serverQuery && !skip && hasTriggered\n\n const queryResult = useQuery({\n queryKey: createExplainQueryKey(serverQuery, explainOptions ?? undefined),\n queryFn: async () => {\n if (!serverQuery) throw new Error('No query provided')\n const result = await cubeApi.explain(serverQuery, explainOptions ?? undefined)\n return result\n },\n enabled: queryEnabled,\n // EXPLAIN queries should never be cached - always fetch fresh data\n // This ensures users see the latest execution plan after schema/index changes\n staleTime: 0,\n gcTime: 0,\n // Don't refetch automatically - this is manually triggered\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n refetchOnMount: false,\n })\n\n // Manual trigger function\n const runExplain = useCallback((opts?: ExplainOptions) => {\n if (skip || !serverQuery) return\n setExplainOptions(opts ?? null)\n setHasTriggered(true)\n // If already triggered with same options, refetch\n if (hasTriggered) {\n queryResult.refetch()\n }\n }, [skip, serverQuery, hasTriggered, queryResult])\n\n // Clear function\n const clearExplain = useCallback(() => {\n setHasTriggered(false)\n setExplainOptions(null)\n }, [])\n\n return {\n explainResult: queryResult.data ?? null,\n isLoading: queryResult.isLoading || queryResult.isFetching,\n hasRun: hasTriggered,\n error: queryResult.error ?? null,\n runExplain,\n clearExplain,\n }\n}\n","/**\n * useExplainAI - TanStack Query hook for AI analysis of EXPLAIN plans\n *\n * Features:\n * - Manually triggered via useMutation (not automatic)\n * - Analyzes execution plans and provides actionable recommendations\n * - Returns structured recommendations (indexes, table changes, cube improvements)\n * - No caching - always fetches fresh analysis\n * - Uses the /api/ai/explain/analyze endpoint\n *\n * Usage:\n * ```tsx\n * const { analysis, isAnalyzing, error, analyze, clearAnalysis } = useExplainAI()\n *\n * // After getting an explain result, trigger AI analysis\n * <button onClick={() => analyze(explainResult, query)}>Analyze with AI</button>\n * ```\n */\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useCallback } from 'react'\nimport type { ExplainResult, AIExplainAnalysis } from '../../types.js'\nimport { useCubeFeatures } from '../../providers/CubeFeaturesProvider.js'\nimport { useCubeApi } from '../../providers/CubeApiProvider.js'\n\nexport interface UseExplainAIOptions {\n /**\n * Custom AI endpoint for explain analysis\n * @default '/api/ai/explain/analyze'\n */\n aiEndpoint?: string\n}\n\nexport interface UseExplainAIResult {\n /** The AI analysis result */\n analysis: AIExplainAnalysis | null\n /** Whether AI analysis is in progress */\n isAnalyzing: boolean\n /** Error if AI analysis failed */\n error: Error | null\n /**\n * Trigger AI analysis of an explain result\n * @param explainResult - The EXPLAIN result to analyze\n * @param query - The original semantic query\n */\n analyze: (explainResult: ExplainResult, query: unknown) => void\n /** Clear the analysis result */\n clearAnalysis: () => void\n}\n\n/**\n * Query key for AI explain analysis\n */\nexport const EXPLAIN_AI_QUERY_KEY = ['cube', 'explain', 'ai'] as const\n\n/**\n * TanStack Query hook for AI analysis of EXPLAIN plans\n *\n * This hook uses useMutation to call the AI endpoint and analyze execution plans,\n * providing actionable recommendations for performance improvement.\n *\n * Recommendations focus on what users CAN control:\n * - Index creation (with CREATE INDEX statements)\n * - Table structure changes\n * - Cube definition improvements (segments, pre-aggregations, joins)\n *\n * Usage:\n * ```tsx\n * const { analysis, isAnalyzing, analyze } = useExplainAI()\n *\n * // After running EXPLAIN\n * if (explainResult) {\n * <button onClick={() => analyze(explainResult, query)}>\n * {isAnalyzing ? 'Analyzing...' : 'Analyze with AI'}\n * </button>\n * }\n *\n * // Display recommendations\n * {analysis?.recommendations.map(rec => (\n * <div key={rec.title}>\n * <h4>{rec.title}</h4>\n * <p>{rec.description}</p>\n * {rec.sql && <pre>{rec.sql}</pre>}\n * {rec.cubeCode && <pre>{rec.cubeCode}</pre>}\n * </div>\n * ))}\n * ```\n */\nexport function useExplainAI(options: UseExplainAIOptions = {}): UseExplainAIResult {\n const { features } = useCubeFeatures()\n const { apiOptions } = useCubeApi()\n const enableAI = features.enableAI ?? true\n const queryClient = useQueryClient()\n\n // AI endpoint - defaults to /api/ai/explain/analyze\n // This is the standard path for AI routes in the dev server\n const aiEndpoint = options.aiEndpoint ?? '/api/ai/explain/analyze'\n\n const mutation = useMutation({\n mutationKey: EXPLAIN_AI_QUERY_KEY,\n mutationFn: async ({ explainResult, query }: { explainResult: ExplainResult; query: unknown }) => {\n // Check if AI is enabled\n if (!enableAI) {\n throw new Error('AI features are disabled')\n }\n\n const response = await fetch(aiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...apiOptions?.headers,\n },\n credentials: 'include',\n body: JSON.stringify({\n explainResult,\n query,\n }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(\n errorData.error ||\n errorData.message ||\n `AI analysis failed: ${response.status} ${response.statusText}`\n )\n }\n\n const result: AIExplainAnalysis = await response.json()\n return result\n },\n // No caching - each mutation is independent\n gcTime: 0,\n })\n\n const analyze = useCallback((explainResult: ExplainResult, query: unknown) => {\n mutation.mutate({ explainResult, query })\n }, [mutation])\n\n const clearAnalysis = useCallback(() => {\n mutation.reset()\n // Also invalidate any cached queries\n queryClient.removeQueries({ queryKey: EXPLAIN_AI_QUERY_KEY })\n }, [mutation, queryClient])\n\n return {\n analysis: mutation.data ?? null,\n isAnalyzing: mutation.isPending,\n error: mutation.error ?? null,\n analyze,\n clearAnalysis,\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./rolldown-runtime-DArdT4gl.js";
2
- import { $ as t, G as n, J as r, K as i, Q as a, U as o, W as s, X as c, Y as l, Z as u, at as d, et as f, it as p, nt as m, ot as h, q as g, rt as _, tt as v } from "./chart-data-table-DgiNBOWf.js";
2
+ import { $ as t, G as n, J as r, K as i, Q as a, X as o, Y as s, Z as c, at as l, ct as u, et as d, it as f, nt as p, ot as m, q as h, rt as g, st as _, tt as v } from "./chart-data-table-C_oHiK6N.js";
3
3
  import * as y from "react";
4
4
  import b from "react";
5
5
  //#region node_modules/react-intersection-observer/dist/index.mjs
@@ -144,7 +144,7 @@ function te({ threshold: e, delay: t, trackVisibility: n, rootMargin: r, scrollM
144
144
  }
145
145
  //#endregion
146
146
  //#region node_modules/@tanstack/query-core/build/modern/mutationObserver.js
147
- var ne = class extends f {
147
+ var ne = class extends p {
148
148
  #e;
149
149
  #t = void 0;
150
150
  #n;
@@ -157,11 +157,11 @@ var ne = class extends f {
157
157
  }
158
158
  setOptions(e) {
159
159
  let t = this.options;
160
- this.options = this.#e.defaultMutationOptions(e), p(this.options, t) || this.#e.getMutationCache().notify({
160
+ this.options = this.#e.defaultMutationOptions(e), m(this.options, t) || this.#e.getMutationCache().notify({
161
161
  type: "observerOptionsUpdated",
162
162
  mutation: this.#n,
163
163
  observer: this
164
- }), t?.mutationKey && this.options.mutationKey && v(t.mutationKey) !== v(this.options.mutationKey) ? this.reset() : this.#n?.state.status === "pending" && this.#n.setOptions(this.options);
164
+ }), t?.mutationKey && this.options.mutationKey && g(t.mutationKey) !== g(this.options.mutationKey) ? this.reset() : this.#n?.state.status === "pending" && this.#n.setOptions(this.options);
165
165
  }
166
166
  onSubscribe() {
167
167
  this.listeners.size === 1 && this.#n && (this.#n.addObserver(this), this.#i());
@@ -182,7 +182,7 @@ var ne = class extends f {
182
182
  return this.#r = t, this.#n?.removeObserver(this), this.#n = this.#e.getMutationCache().build(this.#e, this.options), this.#n.addObserver(this), this.#n.execute(e);
183
183
  }
184
184
  #i() {
185
- let e = this.#n?.state ?? u();
185
+ let e = this.#n?.state ?? t();
186
186
  this.#t = {
187
187
  ...e,
188
188
  isPending: e.status === "pending",
@@ -194,7 +194,7 @@ var ne = class extends f {
194
194
  };
195
195
  }
196
196
  #a(e) {
197
- t.batch(() => {
197
+ v.batch(() => {
198
198
  if (this.#r && this.hasListeners()) {
199
199
  let t = this.#t.variables, n = this.#t.context, r = {
200
200
  client: this.#e,
@@ -237,7 +237,7 @@ function P(e, t) {
237
237
  let n = new Set(t);
238
238
  return e.filter((e) => !n.has(e));
239
239
  }
240
- var re = class extends f {
240
+ var re = class extends p {
241
241
  #e;
242
242
  #t;
243
243
  #n;
@@ -266,17 +266,17 @@ var re = class extends f {
266
266
  e.destroy();
267
267
  });
268
268
  }
269
- setQueries(e, n) {
270
- if (this.#n = e, this.#r = n, process.env.NODE_ENV !== "production") {
269
+ setQueries(e, t) {
270
+ if (this.#n = e, this.#r = t, process.env.NODE_ENV !== "production") {
271
271
  let t = e.map((e) => this.#e.defaultQueryOptions(e).queryHash);
272
272
  new Set(t).size !== t.length && console.warn("[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.");
273
273
  }
274
- t.batch(() => {
274
+ v.batch(() => {
275
275
  let e = this.#i, t = this.#p(this.#n);
276
276
  t.forEach((e) => e.observer.setOptions(e.defaultedQueryOptions));
277
277
  let n = t.map((e) => e.observer), r = n.map((e) => e.getCurrentResult()), i = e.length !== n.length, a = n.some((t, n) => t !== e[n]), o = i || a, s = o ? !0 : r.some((e, t) => {
278
278
  let n = this.#t[t];
279
- return !n || !p(e, n);
279
+ return !n || !m(e, n);
280
280
  });
281
281
  !o && !s || (o && (this.#l = t, this.#i = n), this.#t = r, this.hasListeners() && (o && (P(e, n).forEach((e) => {
282
282
  e.destroy();
@@ -318,7 +318,7 @@ var re = class extends f {
318
318
  #d(e, t, n) {
319
319
  if (t) {
320
320
  let r = this.#c, i = n !== void 0 && r !== void 0 && (r.length !== n.length || n.some((e, t) => e !== r[t]));
321
- return (this.#t !== this.#s || i || t !== this.#o) && (this.#o = t, this.#s = this.#t, n !== void 0 && (this.#c = n), this.#a = _(this.#a, t(e))), this.#a;
321
+ return (this.#t !== this.#s || i || t !== this.#o) && (this.#o = t, this.#s = this.#t, n !== void 0 && (this.#c = n), this.#a = l(this.#a, t(e))), this.#a;
322
322
  }
323
323
  return e;
324
324
  }
@@ -335,7 +335,7 @@ var re = class extends f {
335
335
  });
336
336
  let n = [];
337
337
  return e.forEach((e) => {
338
- let r = this.#e.defaultQueryOptions(e), i = t.get(r.queryHash)?.shift() ?? new a(this.#e, r);
338
+ let r = this.#e.defaultQueryOptions(e), i = t.get(r.queryHash)?.shift() ?? new d(this.#e, r);
339
339
  n.push({
340
340
  defaultedQueryOptions: r,
341
341
  observer: i
@@ -348,8 +348,8 @@ var re = class extends f {
348
348
  }
349
349
  #h() {
350
350
  if (this.hasListeners()) {
351
- let e = this.#f(), n = this.#a, r = e ? n : this.#d(this.#u(this.#t, this.#l), this.#r?.combine);
352
- (e || n !== r) && t.batch(() => {
351
+ let e = this.#f(), t = this.#a, n = e ? t : this.#d(this.#u(this.#t, this.#l), this.#r?.combine);
352
+ (e || t !== n) && v.batch(() => {
353
353
  this.listeners.forEach((e) => {
354
354
  e(this.#t);
355
355
  });
@@ -359,45 +359,45 @@ var re = class extends f {
359
359
  };
360
360
  //#endregion
361
361
  //#region node_modules/@tanstack/react-query/build/modern/useQueries.js
362
- function ie({ queries: e, ...u }, d) {
363
- let f = h(d), p = c(), _ = l(), v = u.subscribed !== !1, b = y.useMemo(() => e.map((e) => {
364
- let t = f.defaultQueryOptions(e);
365
- return t._optimisticResults = p ? "isRestoring" : v ? "optimistic" : void 0, t;
362
+ function ie({ queries: e, ...t }, l) {
363
+ let p = u(l), m = a(), g = c(), _ = t.subscribed !== !1, b = y.useMemo(() => e.map((e) => {
364
+ let t = p.defaultQueryOptions(e);
365
+ return t._optimisticResults = m ? "isRestoring" : _ ? "optimistic" : void 0, t;
366
366
  }), [
367
367
  e,
368
- f,
369
368
  p,
370
- v
369
+ m,
370
+ _
371
371
  ]);
372
372
  b.forEach((e) => {
373
- o(e);
374
- let t = f.getQueryCache().get(e.queryHash);
375
- i(e, _, t);
376
- }), r(_);
377
- let [x] = y.useState(() => new re(f, b, u)), [S, C, w] = x.getOptimisticResult(b, u.combine), T = !p && v;
378
- y.useSyncExternalStore(y.useCallback((e) => T ? x.subscribe(t.batchCalls(e)) : m, [x, T]), () => x.getCurrentResult(), () => x.getCurrentResult()), y.useEffect(() => {
379
- x.setQueries(b, u);
373
+ n(e);
374
+ let t = p.getQueryCache().get(e.queryHash);
375
+ r(e, g, t);
376
+ }), o(g);
377
+ let [x] = y.useState(() => new re(p, b, t)), [S, C, w] = x.getOptimisticResult(b, t.combine), T = !m && _;
378
+ y.useSyncExternalStore(y.useCallback((e) => T ? x.subscribe(v.batchCalls(e)) : f, [x, T]), () => x.getCurrentResult(), () => x.getCurrentResult()), y.useEffect(() => {
379
+ x.setQueries(b, t);
380
380
  }, [
381
381
  b,
382
- u,
382
+ t,
383
383
  x
384
384
  ]);
385
- let E = S.some((e, t) => n(b[t], e)) ? S.flatMap((e, t) => {
386
- let r = b[t];
387
- if (r && n(r, e)) {
388
- let e = new a(f, r);
389
- return s(r, e, _);
385
+ let E = S.some((e, t) => h(b[t], e)) ? S.flatMap((e, t) => {
386
+ let n = b[t];
387
+ if (n && h(n, e)) {
388
+ let e = new d(p, n);
389
+ return i(n, e, g);
390
390
  }
391
391
  return [];
392
392
  }) : [];
393
393
  if (E.length > 0) throw Promise.all(E);
394
394
  let D = S.find((e, t) => {
395
395
  let n = b[t];
396
- return n && g({
396
+ return n && s({
397
397
  result: e,
398
- errorResetBoundary: _,
398
+ errorResetBoundary: g,
399
399
  throwOnError: n.throwOnError,
400
- query: f.getQueryCache().get(n.queryHash),
400
+ query: p.getQueryCache().get(n.queryHash),
401
401
  suspense: n.suspense
402
402
  });
403
403
  });
@@ -406,19 +406,19 @@ function ie({ queries: e, ...u }, d) {
406
406
  }
407
407
  //#endregion
408
408
  //#region node_modules/@tanstack/react-query/build/modern/useMutation.js
409
- function ae(e, n) {
410
- let r = h(n), [i] = y.useState(() => new ne(r, e));
409
+ function ae(e, t) {
410
+ let n = u(t), [r] = y.useState(() => new ne(n, e));
411
411
  y.useEffect(() => {
412
- i.setOptions(e);
413
- }, [i, e]);
414
- let a = y.useSyncExternalStore(y.useCallback((e) => i.subscribe(t.batchCalls(e)), [i]), () => i.getCurrentResult(), () => i.getCurrentResult()), o = y.useCallback((...e) => {
415
- i.mutate(e[0], e[1]).catch(m);
416
- }, [i]);
417
- if (a.error && d(i.options.throwOnError, [a.error])) throw a.error;
412
+ r.setOptions(e);
413
+ }, [r, e]);
414
+ let i = y.useSyncExternalStore(y.useCallback((e) => r.subscribe(v.batchCalls(e)), [r]), () => r.getCurrentResult(), () => r.getCurrentResult()), a = y.useCallback((...e) => {
415
+ r.mutate(e[0], e[1]).catch(f);
416
+ }, [r]);
417
+ if (i.error && _(r.options.throwOnError, [i.error])) throw i.error;
418
418
  return {
419
- ...a,
420
- mutate: o,
421
- mutateAsync: a.mutate
419
+ ...i,
420
+ mutate: a,
421
+ mutateAsync: i.mutate
422
422
  };
423
423
  }
424
424
  //#endregion
@@ -890,4 +890,4 @@ var de = /* @__PURE__ */ e(((e, t) => {
890
890
  //#endregion
891
891
  export { oe as a, ae as c, ce as i, ie as l, ue as n, R as o, q as r, I as s, de as t, te as u };
892
892
 
893
- //# sourceMappingURL=vendor-BmJDaduD.js.map
893
+ //# sourceMappingURL=vendor-Gb3lH0cc.js.map