drizzle-cube 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/dist/adapters/ActivityGridChart.config-BQhBE_Mr.js +2 -0
  2. package/dist/adapters/ActivityGridChart.config-C3tSuOGV.cjs +1 -0
  3. package/dist/adapters/AreaChart.config-3cme8HyQ.js +2 -0
  4. package/dist/adapters/AreaChart.config-BSxrT52Z.cjs +1 -0
  5. package/dist/adapters/BarChart.config-BKS8IecE.cjs +1 -0
  6. package/dist/adapters/BarChart.config-lt_7PdIi.js +2 -0
  7. package/dist/adapters/BoxPlotChart.config-B7qvRnrF.cjs +1 -0
  8. package/dist/adapters/BoxPlotChart.config-Dv6ECj2j.js +2 -0
  9. package/dist/adapters/BubbleChart.config-BrIH7OAy.cjs +1 -0
  10. package/dist/adapters/BubbleChart.config-Fhotb7Pg.js +2 -0
  11. package/dist/adapters/CandlestickChart.config-CWH41FmF.cjs +1 -0
  12. package/dist/adapters/CandlestickChart.config-RPtXuxsX.js +2 -0
  13. package/dist/adapters/DataTable.config-71L0GzlT.js +2 -0
  14. package/dist/adapters/DataTable.config-BsOMQq3J.cjs +1 -0
  15. package/dist/adapters/FunnelChart.config-Cqte9C04.cjs +1 -0
  16. package/dist/adapters/FunnelChart.config-DJtwWeNz.js +2 -0
  17. package/dist/adapters/GaugeChart.config-WkwZ9VdS.cjs +1 -0
  18. package/dist/adapters/GaugeChart.config-vpVQlP5B.js +2 -0
  19. package/dist/adapters/HeatMapChart.config-DcmkDl07.cjs +1 -0
  20. package/dist/adapters/HeatMapChart.config-DsmMgGxJ.js +2 -0
  21. package/dist/adapters/KpiDelta.config-DVy561BH.js +2 -0
  22. package/dist/adapters/KpiDelta.config-dpqwLHNE.cjs +1 -0
  23. package/dist/adapters/KpiNumber.config-927l8nq8.js +2 -0
  24. package/dist/adapters/KpiNumber.config-BqFBMfPf.cjs +1 -0
  25. package/dist/adapters/KpiText.config-C-fZXuHq.cjs +1 -0
  26. package/dist/adapters/KpiText.config-CWoXuhMA.js +2 -0
  27. package/dist/adapters/LineChart.config-DTp7pqOY.js +2 -0
  28. package/dist/adapters/LineChart.config-DUGvSjcH.cjs +1 -0
  29. package/dist/adapters/MarkdownChart.config-23Dmv2Ty.cjs +1 -0
  30. package/dist/adapters/MarkdownChart.config-Cb2TnS0I.js +2 -0
  31. package/dist/adapters/MeasureProfileChart.config-B2qbWdhy.cjs +1 -0
  32. package/dist/adapters/MeasureProfileChart.config-CvBCeI5b.js +2 -0
  33. package/dist/adapters/PieChart.config-BzJb13QA.js +2 -0
  34. package/dist/adapters/PieChart.config-plCn5Ehr.cjs +1 -0
  35. package/dist/adapters/ProportionBarChart.config-1r-_moBH.cjs +1 -0
  36. package/dist/adapters/ProportionBarChart.config-CN6TtHTp.js +2 -0
  37. package/dist/adapters/RadarChart.config-BYhdj9M7.js +2 -0
  38. package/dist/adapters/RadarChart.config-CeUMP-1g.cjs +1 -0
  39. package/dist/adapters/RadialBarChart.config-B88yXNsq.cjs +1 -0
  40. package/dist/adapters/RadialBarChart.config-ZMK9HMoh.js +2 -0
  41. package/dist/adapters/RetentionCombinedChart.config-B5yvgUHM.cjs +1 -0
  42. package/dist/adapters/RetentionCombinedChart.config-Dd-YMdK8.js +2 -0
  43. package/dist/adapters/RetentionHeatmap.config-BYzDleoV.cjs +1 -0
  44. package/dist/adapters/RetentionHeatmap.config-Dvj7yTB0.js +2 -0
  45. package/dist/adapters/SankeyChart.config-CPFRmgFb.cjs +1 -0
  46. package/dist/adapters/SankeyChart.config-ClgqXM1N.js +2 -0
  47. package/dist/adapters/ScatterChart.config-CvJiqPa5.cjs +1 -0
  48. package/dist/adapters/ScatterChart.config-DLZ3rYMq.js +2 -0
  49. package/dist/adapters/SunburstChart.config-C_1V5hoQ.cjs +1 -0
  50. package/dist/adapters/SunburstChart.config-FNU75NCg.js +2 -0
  51. package/dist/adapters/TreeMapChart.config-CprZk_YF.js +2 -0
  52. package/dist/adapters/TreeMapChart.config-DNwd0ge9.cjs +1 -0
  53. package/dist/adapters/WaterfallChart.config-BBhcN_Fh.cjs +1 -0
  54. package/dist/adapters/WaterfallChart.config-H7s6SSV3.js +2 -0
  55. package/dist/adapters/{compiler-BNjqYdmc.cjs → compiler-BaLO10VN.cjs} +7 -7
  56. package/dist/adapters/{compiler-DiYxWAKg.js → compiler-CQJ5GOwF.js} +286 -119
  57. package/dist/adapters/core/http-port.d.ts +34 -7
  58. package/dist/adapters/core/index.cjs +1 -1
  59. package/dist/adapters/core/index.d.ts +1 -0
  60. package/dist/adapters/core/index.js +2 -2
  61. package/dist/adapters/core/rest-handlers.d.ts +1 -1
  62. package/dist/adapters/{core-BOPRmxPc.js → core-DXkuSUBg.js} +80 -64
  63. package/dist/adapters/core-DgTGXxDu.cjs +1 -0
  64. package/dist/adapters/express/index.cjs +2 -2
  65. package/dist/adapters/express/index.d.ts +11 -2
  66. package/dist/adapters/express/index.js +14 -14
  67. package/dist/adapters/fastify/index.cjs +2 -2
  68. package/dist/adapters/fastify/index.d.ts +11 -2
  69. package/dist/adapters/fastify/index.js +12 -12
  70. package/dist/adapters/{handler-DGud-C-w.js → handler-CphYSZRh.js} +74 -74
  71. package/dist/adapters/{handler-m6WgA9xu.cjs → handler-DrRT6c14.cjs} +8 -8
  72. package/dist/adapters/hono/index.cjs +1 -1
  73. package/dist/adapters/hono/index.js +9 -9
  74. package/dist/adapters/mcp-tools-handlers.d.ts +10 -3
  75. package/dist/adapters/mcp-tools.cjs +1 -1
  76. package/dist/adapters/mcp-tools.js +18 -20
  77. package/dist/adapters/mcp-transport-BGkSz-ZT.cjs +40 -0
  78. package/dist/adapters/mcp-transport-fJud19xz.js +606 -0
  79. package/dist/adapters/mcp-transport.d.ts +13 -2
  80. package/dist/adapters/nextjs/index.cjs +1 -1
  81. package/dist/adapters/nextjs/index.d.ts +5 -2
  82. package/dist/adapters/nextjs/index.js +32 -32
  83. package/dist/adapters/{openai-CGJM6Qun.js → openai-CBrN4nxl.js} +2 -2
  84. package/dist/adapters/{openai-Dwt9bxOE.cjs → openai-CI9vGKSf.cjs} +1 -1
  85. package/dist/adapters/{openai-CmdN7Sj1.cjs → openai-CSzWluuv.cjs} +1 -1
  86. package/dist/{server/openai-Czk1BdHa.js → adapters/openai-D-VMcPao.js} +1 -1
  87. package/dist/adapters/{utils-BoOeig94.cjs → utils-BY0-KFyI.cjs} +2 -2
  88. package/dist/adapters/{utils-DboNUT3A.js → utils-DkmShl5f.js} +23 -20
  89. package/dist/adapters/utils.cjs +1 -1
  90. package/dist/adapters/utils.d.ts +2 -2
  91. package/dist/adapters/utils.js +1 -1
  92. package/dist/cjs/adapters/core/http-port.d.ts +34 -7
  93. package/dist/cjs/adapters/core/index.d.ts +1 -0
  94. package/dist/cjs/adapters/core/rest-handlers.d.ts +1 -1
  95. package/dist/cjs/adapters/express/index.d.ts +11 -2
  96. package/dist/cjs/adapters/fastify/index.d.ts +11 -2
  97. package/dist/cjs/adapters/mcp-tools-handlers.d.ts +10 -3
  98. package/dist/cjs/adapters/mcp-transport.d.ts +13 -2
  99. package/dist/cjs/adapters/nextjs/index.d.ts +5 -2
  100. package/dist/cjs/adapters/utils.d.ts +2 -2
  101. package/dist/cjs/server/adapters/base-adapter.d.ts +46 -0
  102. package/dist/cjs/server/adapters/databend-adapter.d.ts +5 -0
  103. package/dist/cjs/server/adapters/duckdb-adapter.d.ts +5 -0
  104. package/dist/cjs/server/adapters/mysql-adapter.d.ts +14 -0
  105. package/dist/cjs/server/adapters/postgres-adapter.d.ts +15 -0
  106. package/dist/cjs/server/adapters/snowflake-adapter.d.ts +6 -0
  107. package/dist/cjs/server/adapters/sqlite-adapter.d.ts +21 -0
  108. package/dist/cjs/server/attribute-dimensions.d.ts +99 -0
  109. package/dist/cjs/server/cache-utils.d.ts +5 -1
  110. package/dist/cjs/server/compiler-metadata.d.ts +24 -3
  111. package/dist/cjs/server/compiler.d.ts +157 -10
  112. package/dist/cjs/server/execution/query-result-cache.d.ts +1 -1
  113. package/dist/cjs/server/index.d.ts +11 -3
  114. package/dist/cjs/server/query-handlers.d.ts +1 -1
  115. package/dist/cjs/server/types/core.d.ts +8 -0
  116. package/dist/cjs/server/types/cube.d.ts +27 -2
  117. package/dist/client/charts.js +12 -12
  118. package/dist/client/chunks/{DashboardEditModal-BOfLdTgV.js → DashboardEditModal-9An5EDAz.js} +12 -12
  119. package/dist/client/chunks/{DashboardEditModal-BOfLdTgV.js.map → DashboardEditModal-9An5EDAz.js.map} +1 -1
  120. package/dist/client/chunks/{ProportionBarChart-DwoXU5VP.js → ProportionBarChart-BVcbGY2C.js} +3 -3
  121. package/dist/client/chunks/{ProportionBarChart-DwoXU5VP.js.map → ProportionBarChart-BVcbGY2C.js.map} +1 -1
  122. package/dist/client/chunks/{RetentionCombinedChart-BqlSV7yF.js → RetentionCombinedChart-D68Rvdi-.js} +3 -3
  123. package/dist/client/chunks/{RetentionCombinedChart-BqlSV7yF.js.map → RetentionCombinedChart-D68Rvdi-.js.map} +1 -1
  124. package/dist/client/chunks/{RetentionHeatmap-VdVkBg8Q.js → RetentionHeatmap-CE7BAjrB.js} +2 -2
  125. package/dist/client/chunks/{RetentionHeatmap-VdVkBg8Q.js.map → RetentionHeatmap-CE7BAjrB.js.map} +1 -1
  126. package/dist/client/chunks/{analysis-builder-DXw60SEs.js → analysis-builder-D1pYvvwc.js} +9 -9
  127. package/dist/client/chunks/{analysis-builder-DXw60SEs.js.map → analysis-builder-D1pYvvwc.js.map} +1 -1
  128. package/dist/client/chunks/{analysis-builder-shared-CEvHIlmk.js → analysis-builder-shared-BQvwUc6z.js} +9 -9
  129. package/dist/client/chunks/{analysis-builder-shared-CEvHIlmk.js.map → analysis-builder-shared-BQvwUc6z.js.map} +1 -1
  130. package/dist/client/chunks/{chart-activity-grid-4jfS8khG.js → chart-activity-grid-DvD_4wJz.js} +5 -2
  131. package/dist/client/chunks/chart-activity-grid-DvD_4wJz.js.map +1 -0
  132. package/dist/client/chunks/{chart-area-Dol6s9no.js → chart-area-DPp3hSOK.js} +2 -2
  133. package/dist/client/chunks/{chart-area-Dol6s9no.js.map → chart-area-DPp3hSOK.js.map} +1 -1
  134. package/dist/client/chunks/{chart-bar-5_niozi2.js → chart-bar-Od3pOyZ0.js} +3 -3
  135. package/dist/client/chunks/{chart-bar-5_niozi2.js.map → chart-bar-Od3pOyZ0.js.map} +1 -1
  136. package/dist/client/chunks/{chart-box-plot-Dhp-VwhD.js → chart-box-plot-l0iFn2n2.js} +2 -2
  137. package/dist/client/chunks/{chart-box-plot-Dhp-VwhD.js.map → chart-box-plot-l0iFn2n2.js.map} +1 -1
  138. package/dist/client/chunks/{chart-bubble-BM2BAMSo.js → chart-bubble-Dl0RcP8N.js} +2 -2
  139. package/dist/client/chunks/{chart-bubble-BM2BAMSo.js.map → chart-bubble-Dl0RcP8N.js.map} +1 -1
  140. package/dist/client/chunks/{chart-candlestick-BNwLIBfm.js → chart-candlestick-DZMqbscF.js} +2 -2
  141. package/dist/client/chunks/{chart-candlestick-BNwLIBfm.js.map → chart-candlestick-DZMqbscF.js.map} +1 -1
  142. package/dist/client/chunks/{chart-data-table-DoDHQRe7.js → chart-data-table-DgiNBOWf.js} +3 -3
  143. package/dist/client/chunks/chart-data-table-DgiNBOWf.js.map +1 -0
  144. package/dist/client/chunks/{chart-funnel-Cd7da_sa.js → chart-funnel-YLZlyN1X.js} +2 -2
  145. package/dist/client/chunks/{chart-funnel-Cd7da_sa.js.map → chart-funnel-YLZlyN1X.js.map} +1 -1
  146. package/dist/client/chunks/{chart-gauge-DOpul-Oz.js → chart-gauge-BsqE2wwF.js} +3 -3
  147. package/dist/client/chunks/{chart-gauge-DOpul-Oz.js.map → chart-gauge-BsqE2wwF.js.map} +1 -1
  148. package/dist/client/chunks/{chart-heat-map-CeKbK655.js → chart-heat-map-BsND8RM_.js} +3 -3
  149. package/dist/client/chunks/{chart-heat-map-CeKbK655.js.map → chart-heat-map-BsND8RM_.js.map} +1 -1
  150. package/dist/client/chunks/{chart-kpi-delta-Dq8qUOOT.js → chart-kpi-delta-m0azuva-.js} +3 -3
  151. package/dist/client/chunks/{chart-kpi-delta-Dq8qUOOT.js.map → chart-kpi-delta-m0azuva-.js.map} +1 -1
  152. package/dist/client/chunks/{chart-kpi-number-DgiqTi9g.js → chart-kpi-number-6JS15SqF.js} +5 -5
  153. package/dist/client/chunks/{chart-kpi-number-DgiqTi9g.js.map → chart-kpi-number-6JS15SqF.js.map} +1 -1
  154. package/dist/client/chunks/{chart-kpi-text-CsZMVEnM.js → chart-kpi-text-BqX8p8Jn.js} +3 -3
  155. package/dist/client/chunks/{chart-kpi-text-CsZMVEnM.js.map → chart-kpi-text-BqX8p8Jn.js.map} +1 -1
  156. package/dist/client/chunks/{chart-line-DlwOB7C7.js → chart-line-NCmpxBfE.js} +3 -3
  157. package/dist/client/chunks/{chart-line-DlwOB7C7.js.map → chart-line-NCmpxBfE.js.map} +1 -1
  158. package/dist/client/chunks/{chart-markdown-DPE34SjC.js → chart-markdown-ZOobqiiX.js} +2 -2
  159. package/dist/client/chunks/{chart-markdown-DPE34SjC.js.map → chart-markdown-ZOobqiiX.js.map} +1 -1
  160. package/dist/client/chunks/{chart-measure-profile-BpTz1fce.js → chart-measure-profile-CBAZaicJ.js} +3 -3
  161. package/dist/client/chunks/{chart-measure-profile-BpTz1fce.js.map → chart-measure-profile-CBAZaicJ.js.map} +1 -1
  162. package/dist/client/chunks/{chart-pie-FGw66XAH.js → chart-pie-ChrasEI8.js} +3 -3
  163. package/dist/client/chunks/{chart-pie-FGw66XAH.js.map → chart-pie-ChrasEI8.js.map} +1 -1
  164. package/dist/client/chunks/{chart-radar-D-eRDoiA.js → chart-radar-CxSVF7yL.js} +3 -3
  165. package/dist/client/chunks/{chart-radar-D-eRDoiA.js.map → chart-radar-CxSVF7yL.js.map} +1 -1
  166. package/dist/client/chunks/{chart-radial-bar-DgtkNTs3.js → chart-radial-bar--SN0Wph0.js} +3 -3
  167. package/dist/client/chunks/{chart-radial-bar-DgtkNTs3.js.map → chart-radial-bar--SN0Wph0.js.map} +1 -1
  168. package/dist/client/chunks/{chart-sankey-D0hhb_EQ.js → chart-sankey-CDOSGg9r.js} +2 -2
  169. package/dist/client/chunks/{chart-sankey-D0hhb_EQ.js.map → chart-sankey-CDOSGg9r.js.map} +1 -1
  170. package/dist/client/chunks/{chart-scatter-D9EcAiMQ.js → chart-scatter-DgcEF-kI.js} +3 -3
  171. package/dist/client/chunks/{chart-scatter-D9EcAiMQ.js.map → chart-scatter-DgcEF-kI.js.map} +1 -1
  172. package/dist/client/chunks/{chart-sunburst-DCYmJ5DU.js → chart-sunburst-MB-jlGBm.js} +3 -3
  173. package/dist/client/chunks/{chart-sunburst-DCYmJ5DU.js.map → chart-sunburst-MB-jlGBm.js.map} +1 -1
  174. package/dist/client/chunks/{chart-tree-map-D_ACSSiB.js → chart-tree-map-DeDXveVd.js} +3 -3
  175. package/dist/client/chunks/{chart-tree-map-D_ACSSiB.js.map → chart-tree-map-DeDXveVd.js.map} +1 -1
  176. package/dist/client/chunks/{chart-waterfall-CVUVNa1R.js → chart-waterfall-ur4vkO1j.js} +3 -3
  177. package/dist/client/chunks/{chart-waterfall-CVUVNa1R.js.map → chart-waterfall-ur4vkO1j.js.map} +1 -1
  178. package/dist/client/chunks/{charts-core-BPD_hLaL.js → charts-core-BAH5pkSB.js} +2 -2
  179. package/dist/client/chunks/{charts-core-BPD_hLaL.js.map → charts-core-BAH5pkSB.js.map} +1 -1
  180. package/dist/client/chunks/charts-loader-eToV8je7.js +85 -0
  181. package/dist/client/chunks/{charts-loader-CwMcOfwT.js.map → charts-loader-eToV8je7.js.map} +1 -1
  182. package/dist/client/chunks/{exceljs.min-DWC_b8G9.js → exceljs.min-CiByP8VQ.js} +2 -3
  183. package/dist/client/chunks/{exceljs.min-DWC_b8G9.js.map → exceljs.min-CiByP8VQ.js.map} +1 -1
  184. package/dist/client/chunks/{nl-NL-DFLVORiD.js → nl-NL-CMXHDBr0.js} +4 -1
  185. package/dist/client/chunks/nl-NL-CMXHDBr0.js.map +1 -0
  186. package/dist/client/chunks/{schema-visualization-C6g_LCiA.js → schema-visualization-BEbFtUIL.js} +3 -3
  187. package/dist/client/chunks/{schema-visualization-C6g_LCiA.js.map → schema-visualization-BEbFtUIL.js.map} +1 -1
  188. package/dist/client/chunks/{useDirtyStateTracking-ZfChDEd3.js → useDirtyStateTracking-CSDg96Rw.js} +4 -4
  189. package/dist/client/chunks/{useDirtyStateTracking-ZfChDEd3.js.map → useDirtyStateTracking-CSDg96Rw.js.map} +1 -1
  190. package/dist/client/chunks/{useExplainAI-im9e1rVb.js → useExplainAI-BnkoZ-zS.js} +4 -4
  191. package/dist/client/chunks/{useExplainAI-im9e1rVb.js.map → useExplainAI-BnkoZ-zS.js.map} +1 -1
  192. package/dist/client/chunks/{vendor-Qa1s8oSX.js → vendor-BmJDaduD.js} +2 -2
  193. package/dist/client/chunks/vendor-BmJDaduD.js.map +1 -0
  194. package/dist/client/components.js +1 -1
  195. package/dist/client/hooks.js +3 -3
  196. package/dist/client/icons.js +1 -1
  197. package/dist/client/index.js +13 -13
  198. package/dist/client/providers.js +1 -1
  199. package/dist/client/schema.js +1 -1
  200. package/dist/client/utils.js +4 -4
  201. package/dist/client-bundle-stats.html +1 -1
  202. package/dist/mcp-app/mcp-app.html +43 -43
  203. package/dist/server/adapters/base-adapter.d.ts +46 -0
  204. package/dist/server/adapters/databend-adapter.d.ts +5 -0
  205. package/dist/server/adapters/duckdb-adapter.d.ts +5 -0
  206. package/dist/server/adapters/mysql-adapter.d.ts +14 -0
  207. package/dist/server/adapters/postgres-adapter.d.ts +15 -0
  208. package/dist/server/adapters/snowflake-adapter.d.ts +6 -0
  209. package/dist/server/adapters/sqlite-adapter.d.ts +21 -0
  210. package/dist/server/attribute-dimensions.d.ts +99 -0
  211. package/dist/server/cache-utils.d.ts +5 -1
  212. package/dist/server/compiler-metadata.d.ts +24 -3
  213. package/dist/server/compiler.d.ts +157 -10
  214. package/dist/server/execution/query-result-cache.d.ts +1 -1
  215. package/dist/server/index.cjs +39 -35
  216. package/dist/server/index.d.ts +11 -3
  217. package/dist/server/index.js +673 -477
  218. package/dist/{adapters/openai-Crp3X_zg.js → server/openai-6uUf7h-5.js} +1 -1
  219. package/dist/server/{openai-DBwI1OSu.cjs → openai-BBe1XbZd.cjs} +1 -1
  220. package/dist/server/{openai-Cu4TXXjl.cjs → openai-BmADmD1e.cjs} +1 -1
  221. package/dist/server/{openai-CUf4vc3Q.js → openai-C1gLuR-0.js} +1 -1
  222. package/dist/server/query-handlers.d.ts +1 -1
  223. package/dist/server/types/core.d.ts +8 -0
  224. package/dist/server/types/cube.d.ts +27 -2
  225. package/package.json +2 -2
  226. package/dist/adapters/ActivityGridChart.config-D6hhj345.cjs +0 -1
  227. package/dist/adapters/ActivityGridChart.config-QZKs_NYg.js +0 -2
  228. package/dist/adapters/AreaChart.config-B5XM6G22.js +0 -2
  229. package/dist/adapters/AreaChart.config-NP34BH5y.cjs +0 -1
  230. package/dist/adapters/BarChart.config-Bqlmr81N.js +0 -2
  231. package/dist/adapters/BarChart.config-C3bw-cAP.cjs +0 -1
  232. package/dist/adapters/BoxPlotChart.config-BOAvoj6x.cjs +0 -1
  233. package/dist/adapters/BoxPlotChart.config-CTXiycYY.js +0 -2
  234. package/dist/adapters/BubbleChart.config-CGFIkl4H.cjs +0 -1
  235. package/dist/adapters/BubbleChart.config-Njxx4Eq1.js +0 -2
  236. package/dist/adapters/CandlestickChart.config-BZ_yWaSo.cjs +0 -1
  237. package/dist/adapters/CandlestickChart.config-D4Svhmef.js +0 -2
  238. package/dist/adapters/DataTable.config-B-bT9puT.js +0 -2
  239. package/dist/adapters/DataTable.config-BHtt1cPM.cjs +0 -1
  240. package/dist/adapters/FunnelChart.config-C1e07O7B.cjs +0 -1
  241. package/dist/adapters/FunnelChart.config-CVEy0tV9.js +0 -2
  242. package/dist/adapters/GaugeChart.config-5PLNlQlu.js +0 -2
  243. package/dist/adapters/GaugeChart.config-Cdv6knjZ.cjs +0 -1
  244. package/dist/adapters/HeatMapChart.config-MGTfYpWJ.js +0 -2
  245. package/dist/adapters/HeatMapChart.config-jfBEi1ZI.cjs +0 -1
  246. package/dist/adapters/KpiDelta.config-D2IUsEYz.cjs +0 -1
  247. package/dist/adapters/KpiDelta.config-DT_MmAHw.js +0 -2
  248. package/dist/adapters/KpiNumber.config-ChgbKmx8.cjs +0 -1
  249. package/dist/adapters/KpiNumber.config-CvZ_FhyL.js +0 -2
  250. package/dist/adapters/KpiText.config-Bgkw8gr2.js +0 -2
  251. package/dist/adapters/KpiText.config-Bz9orqt6.cjs +0 -1
  252. package/dist/adapters/LineChart.config-BVew35dI.cjs +0 -1
  253. package/dist/adapters/LineChart.config-DSCCKXNg.js +0 -2
  254. package/dist/adapters/MarkdownChart.config-Bu6XUuhI.js +0 -2
  255. package/dist/adapters/MarkdownChart.config-E4aSVTf3.cjs +0 -1
  256. package/dist/adapters/MeasureProfileChart.config-BF249hc_.cjs +0 -1
  257. package/dist/adapters/MeasureProfileChart.config-lERVe38G.js +0 -2
  258. package/dist/adapters/PieChart.config-7Ujwp8R5.cjs +0 -1
  259. package/dist/adapters/PieChart.config-jQl2HIcA.js +0 -2
  260. package/dist/adapters/ProportionBarChart.config-o0w_Pnlt.js +0 -2
  261. package/dist/adapters/ProportionBarChart.config-phNohhhY.cjs +0 -1
  262. package/dist/adapters/RadarChart.config-BmrYBd9x.js +0 -2
  263. package/dist/adapters/RadarChart.config-Dlt3UflG.cjs +0 -1
  264. package/dist/adapters/RadialBarChart.config-CeEm8xRb.cjs +0 -1
  265. package/dist/adapters/RadialBarChart.config-Dishh6bC.js +0 -2
  266. package/dist/adapters/RetentionCombinedChart.config-BaD4ev85.cjs +0 -1
  267. package/dist/adapters/RetentionCombinedChart.config-m2FjBUi9.js +0 -2
  268. package/dist/adapters/RetentionHeatmap.config-DiMplGdk.js +0 -2
  269. package/dist/adapters/RetentionHeatmap.config-Dp6oYwQZ.cjs +0 -1
  270. package/dist/adapters/SankeyChart.config-C4Y6qzCS.cjs +0 -1
  271. package/dist/adapters/SankeyChart.config-CJHqgjQ1.js +0 -2
  272. package/dist/adapters/ScatterChart.config-C0QqvDrN.cjs +0 -1
  273. package/dist/adapters/ScatterChart.config-DywOsWPW.js +0 -2
  274. package/dist/adapters/SunburstChart.config-DE8RxpDR.cjs +0 -1
  275. package/dist/adapters/SunburstChart.config-DohowrO3.js +0 -2
  276. package/dist/adapters/TreeMapChart.config-D2gXz-zC.cjs +0 -1
  277. package/dist/adapters/TreeMapChart.config-HMlI29GG.js +0 -2
  278. package/dist/adapters/WaterfallChart.config-BO2WV2VB.js +0 -2
  279. package/dist/adapters/WaterfallChart.config-CzwGiheB.cjs +0 -1
  280. package/dist/adapters/core-CzFfrJzu.cjs +0 -1
  281. package/dist/adapters/mcp-transport-B0b27YUB.cjs +0 -40
  282. package/dist/adapters/mcp-transport-BXyA4dTk.js +0 -603
  283. package/dist/client/chunks/chart-activity-grid-4jfS8khG.js.map +0 -1
  284. package/dist/client/chunks/chart-data-table-DoDHQRe7.js.map +0 -1
  285. package/dist/client/chunks/charts-loader-CwMcOfwT.js +0 -85
  286. package/dist/client/chunks/nl-NL-DFLVORiD.js.map +0 -1
  287. package/dist/client/chunks/vendor-Qa1s8oSX.js.map +0 -1
@@ -7,8 +7,16 @@
7
7
  * (Hono/Next.js). Implementations are constructed per request by each adapter.
8
8
  *
9
9
  * This interface is public — third parties implement it to build adapters for
10
- * other frameworks. Add new capabilities as optional members or via a separate
11
- * extension interface; a new required member is a breaking change.
10
+ * other frameworks. Prefer optional members or a separate extension interface
11
+ * for new capabilities, because a new required member is a breaking change for
12
+ * those adapters.
13
+ *
14
+ * `setHeader` was promoted from {@link McpHttpPort} to this interface in the
15
+ * per-tenant cube sets release, so that the core can stamp `Cache-Control` on
16
+ * every REST response (see {@link withRestCacheHeaders}). Every REST body is now
17
+ * tenant-scoped, and that guarantee cannot be left to each adapter. The break is
18
+ * accepted for this release: third-party REST-only adapters must add
19
+ * `setHeader`, which all four first-party adapters already implemented.
12
20
  */
13
21
  export interface HttpPort<TRes> {
14
22
  /** Read a request header by (case-insensitive) name. Synchronous. */
@@ -17,23 +25,42 @@ export interface HttpPort<TRes> {
17
25
  getBody(): Promise<unknown>;
18
26
  /** Read a raw query-string value by name (used by GET). */
19
27
  getQueryParam(name: string): string | undefined;
28
+ /** Set a response header. Must be called before `send`/`sendSse`/`sendEmpty`. */
29
+ setHeader(name: string, value: string): void;
20
30
  /** Send a response with the given status and JSON body; returns the framework's response value. */
21
31
  send(status: number, body: unknown): TRes;
22
32
  }
23
33
  /**
24
- * Extension of {@link HttpPort} for the MCP POST handler, which needs to set
25
- * response headers (WWW-Authenticate, MCP-Session-Id), emit a single-event SSE
26
- * response, and send an empty-body acknowledgement (202 for notifications).
34
+ * Extension of {@link HttpPort} for the MCP POST handler, which needs to emit a
35
+ * single-event SSE response and send an empty-body acknowledgement (202 for
36
+ * notifications).
27
37
  *
28
38
  * Kept separate from the minimal REST port so third-party adapters only
29
39
  * implement these when they wire up MCP. New required members on this interface
30
40
  * are still a breaking change for MCP-capable adapters.
31
41
  */
32
42
  export interface McpHttpPort<TRes> extends HttpPort<TRes> {
33
- /** Set a response header. Must be called before `send`/`sendSse`/`sendEmpty`. */
34
- setHeader(name: string, value: string): void;
35
43
  /** Send a single-event SSE response (status 200): write the pre-serialized body, then end. */
36
44
  sendSse(status: number, body: string): TRes;
37
45
  /** Send an empty-body response (no JSON), e.g. a 202 notification acknowledgement. */
38
46
  sendEmpty(status: number): TRes;
39
47
  }
48
+ /**
49
+ * `Cache-Control` stamped on every REST response.
50
+ *
51
+ * Every REST body varies by tenant: `/meta` returns the caller's cube set, and
52
+ * `/load`, `/sql`, `/dry-run`, `/batch` and `/explain` return that tenant's data
53
+ * or SQL. With no `Cache-Control` a shared cache may store and reuse these
54
+ * responses heuristically, which would cross-serve one tenant's cubes to
55
+ * another. `private` bars shared caches; `no-store` bars storage entirely.
56
+ */
57
+ export declare const REST_CACHE_CONTROL = "private, no-store";
58
+ /**
59
+ * Wrap a port so every response it sends carries {@link REST_CACHE_CONTROL}.
60
+ *
61
+ * Applied once over the whole REST surface in `createCubeHttpHandler`, not per
62
+ * route, so no endpoint can forget it — including the 400/500 error paths.
63
+ * Deliberately NOT applied to MCP: its SSE responses set their own
64
+ * `Cache-Control`, and JSON-RPC POSTs are not heuristically cacheable.
65
+ */
66
+ export declare function withRestCacheHeaders<TRes>(port: HttpPort<TRes>): HttpPort<TRes>;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core-CzFfrJzu.cjs");exports.createCubeHttpHandler=e.t,exports.resolveSecurityContext=e.n,exports.withLocaleFromHeaders=e.r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core-DgTGXxDu.cjs");exports.REST_CACHE_CONTROL=e.i,exports.createCubeHttpHandler=e.t,exports.resolveSecurityContext=e.n,exports.withLocaleFromHeaders=e.r,exports.withRestCacheHeaders=e.a;
@@ -6,6 +6,7 @@
6
6
  * {@link createCubeHttpHandler}.
7
7
  */
8
8
  export type { HttpPort, McpHttpPort } from './http-port.js';
9
+ export { withRestCacheHeaders, REST_CACHE_CONTROL } from './http-port.js';
9
10
  export { withLocaleFromHeaders, resolveSecurityContext, type HeaderReader, type BaseSecurityContextThunk } from './security-context.js';
10
11
  export { createCubeHttpHandler, type CubeHttpHandler, type CubeHttpHandlerOptions } from './cube-http-handler.js';
11
12
  export type { RestHandlers } from './rest-handlers.js';
@@ -1,2 +1,2 @@
1
- import { n as e, r as t, t as n } from "../core-BOPRmxPc.js";
2
- export { n as createCubeHttpHandler, e as resolveSecurityContext, t as withLocaleFromHeaders };
1
+ import { a as e, i as t, n, r, t as i } from "../core-DXkuSUBg.js";
2
+ export { t as REST_CACHE_CONTROL, i as createCubeHttpHandler, n as resolveSecurityContext, r as withLocaleFromHeaders, e as withRestCacheHeaders };
@@ -3,7 +3,7 @@ import { HttpPort } from './http-port.js';
3
3
  import { BaseSecurityContextThunk } from './security-context.js';
4
4
  /** REST handlers keyed by endpoint; each closes over the shared semantic layer. */
5
5
  export interface RestHandlers {
6
- handleMetaGet<TRes>(port: HttpPort<TRes>): TRes;
6
+ handleMetaGet<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
7
7
  handleSqlGet<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
8
8
  handleSqlPost<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
9
9
  handleDryRunGet<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
@@ -1,5 +1,5 @@
1
- import { a as e, i as t, l as n, o as r, r as i, u as a } from "./utils-DboNUT3A.js";
2
- import { C as o, S as s, _ as c, a as l, b as u, c as d, g as f, h as p, i as m, l as h, m as g, o as _, r as v, u as y, v as b, w as x, x as S, y as C } from "./mcp-transport-BXyA4dTk.js";
1
+ import { a as e, i as t, l as n, o as r, r as i, u as a } from "./utils-DkmShl5f.js";
2
+ import { C as o, S as s, _ as c, a as l, b as u, c as d, g as f, h as p, i as m, l as h, m as g, p as _, r as v, s as y, v as b, w as x, x as S, y as C } from "./mcp-transport-fJud19xz.js";
3
3
  //#region src/adapters/locale.ts
4
4
  var w = "x-dc-locale";
5
5
  function T(e) {
@@ -22,30 +22,43 @@ function O(e) {
22
22
  return t.some((e) => e.toLowerCase() === "x-dc-locale") || t.push("X-DC-Locale"), t;
23
23
  }
24
24
  //#endregion
25
+ //#region src/adapters/core/http-port.ts
26
+ var k = "private, no-store";
27
+ function A(e) {
28
+ return {
29
+ getHeader: (t) => e.getHeader(t),
30
+ getBody: () => e.getBody(),
31
+ getQueryParam: (t) => e.getQueryParam(t),
32
+ setHeader: (t, n) => e.setHeader(t, n),
33
+ send: (t, n) => (e.setHeader("Cache-Control", k), e.send(t, n))
34
+ };
35
+ }
36
+ //#endregion
25
37
  //#region src/adapters/core/security-context.ts
26
- function k(e, t) {
38
+ function j(e, t) {
27
39
  return D(e, E(t));
28
40
  }
29
- async function A(e, t) {
30
- return k(await e(), t);
41
+ async function M(e, t) {
42
+ return j(await e(), t);
31
43
  }
32
- function j(e) {
44
+ function N(e) {
33
45
  return String(e).replace(/\n|\r/g, "");
34
46
  }
35
47
  //#endregion
36
48
  //#region src/adapters/core/rest-handlers.ts
37
- function M(i) {
49
+ function P(i) {
38
50
  async function o(e, n, a) {
39
- let o = i.validateQuery(e);
51
+ let o = i.validateQuery(e, n);
40
52
  if (!o.isValid) return a.send(400, t(`Query validation failed: ${o.errors.join(", ")}`, 400));
41
53
  let s = e.measures?.[0] || e.dimensions?.[0];
42
54
  if (!s) return a.send(400, t("No measures or dimensions specified", 400));
43
55
  let c = s.split(".")[0], l = await i.generateSQL(c, e, n);
44
56
  return a.send(200, r(e, l));
45
57
  }
46
- function s(n) {
58
+ async function s(n, r) {
47
59
  try {
48
- return n.send(200, e(i.getMetadata()));
60
+ let t = await M(r, (e) => n.getHeader(e));
61
+ return n.send(200, e(i.getMetadata(t)));
49
62
  } catch (e) {
50
63
  return console.error("Metadata error:", e), n.send(500, t(e instanceof Error ? e.message : "Failed to fetch metadata", 500));
51
64
  }
@@ -53,9 +66,9 @@ function M(i) {
53
66
  async function c(e, n) {
54
67
  try {
55
68
  let t = await e.getBody();
56
- return await o(t?.query || t, await A(n, (t) => e.getHeader(t)), e);
69
+ return await o(t?.query || t, await M(n, (t) => e.getHeader(t)), e);
57
70
  } catch (n) {
58
- return console.error("SQL generation error:", j(n)), e.send(500, t(n instanceof Error ? n.message : "SQL generation failed", 500));
71
+ return console.error("SQL generation error:", N(n)), e.send(500, t(n instanceof Error ? n.message : "SQL generation failed", 500));
59
72
  }
60
73
  }
61
74
  async function l(e, n) {
@@ -68,15 +81,15 @@ function M(i) {
68
81
  } catch {
69
82
  return e.send(400, t("Invalid JSON in query parameter", 400));
70
83
  }
71
- let a = await A(n, (t) => e.getHeader(t));
84
+ let a = await M(n, (t) => e.getHeader(t));
72
85
  return await o(i, a, e);
73
86
  } catch (n) {
74
- return console.error("SQL generation error:", j(n)), e.send(500, t(n instanceof Error ? n.message : "SQL generation failed", 500));
87
+ return console.error("SQL generation error:", N(n)), e.send(500, t(n instanceof Error ? n.message : "SQL generation failed", 500));
75
88
  }
76
89
  }
77
90
  async function u(e, t) {
78
91
  try {
79
- let n = await e.getBody(), r = n?.query || n, o = await A(t, (t) => e.getHeader(t)), s = await a(r, o, i);
92
+ let n = await e.getBody(), r = n?.query || n, o = await M(t, (t) => e.getHeader(t)), s = await a(r, o, i);
80
93
  return e.send(200, s);
81
94
  } catch (t) {
82
95
  return console.error("Dry-run error:", t), e.send(400, {
@@ -92,7 +105,7 @@ function M(i) {
92
105
  error: "Query parameter is required",
93
106
  valid: !1
94
107
  });
95
- let r = JSON.parse(n), o = await A(t, (t) => e.getHeader(t)), s = await a(r, o, i);
108
+ let r = JSON.parse(n), o = await M(t, (t) => e.getHeader(t)), s = await a(r, o, i);
96
109
  return e.send(200, s);
97
110
  } catch (t) {
98
111
  return console.error("Dry-run error:", t), e.send(400, {
@@ -106,7 +119,7 @@ function M(i) {
106
119
  let a = (await e.getBody())?.queries;
107
120
  if (!a || !Array.isArray(a)) return e.send(400, t("Request body must contain a \"queries\" array", 400));
108
121
  if (a.length === 0) return e.send(400, t("Queries array cannot be empty", 400));
109
- let o = await A(r, (t) => e.getHeader(t)), s = e.getHeader("x-cache-control") === "no-cache", c = await n(a, o, i, { skipCache: s });
122
+ let o = await M(r, (t) => e.getHeader(t)), s = e.getHeader("x-cache-control") === "no-cache", c = await n(a, o, i, { skipCache: s });
110
123
  return e.send(200, c);
111
124
  } catch (n) {
112
125
  return console.error("Batch execution error:", n), e.send(500, t(n instanceof Error ? n.message : "Batch execution failed", 500));
@@ -114,7 +127,7 @@ function M(i) {
114
127
  }
115
128
  async function p(e, t) {
116
129
  try {
117
- let n = await e.getBody(), r = n?.query || n, a = n?.options || {}, o = await A(t, (t) => e.getHeader(t)), s = i.validateQuery(r);
130
+ let n = await e.getBody(), r = n?.query || n, a = n?.options || {}, o = await M(t, (t) => e.getHeader(t)), s = i.validateQuery(r, o);
118
131
  if (!s.isValid) return e.send(400, { error: `Query validation failed: ${s.errors.join(", ")}` });
119
132
  let c = await i.explainQuery(r, o, a);
120
133
  return e.send(200, c);
@@ -134,78 +147,75 @@ function M(i) {
134
147
  }
135
148
  //#endregion
136
149
  //#region src/adapters/core/mcp-handler.ts
137
- function N(e, t) {
150
+ function F(e, t) {
138
151
  let n = e?.code ?? -32603, r = e?.data, i = e.message || "MCP request failed";
139
152
  return m(t ?? null, n, i, r);
140
153
  }
141
- function P(e, t) {
142
- let n = !!t.app, r = typeof t.app == "object" ? t.app : void 0, i;
143
- function a() {
144
- return i ||= {
145
- resources: _(e, t.resources),
146
- prompts: u(t.prompts),
147
- instructions: C(t.instructions)
148
- }, i;
149
- }
150
- async function w(i, u) {
151
- if (t.resourceMetadataUrl && !y(i.getHeader("authorization"))) return i.setHeader("WWW-Authenticate", d(t.resourceMetadataUrl)), i.send(401, { error: "Bearer token required" });
152
- let _ = o(i.getHeader("origin"), f(t));
153
- if (!_.valid) return i.send(403, m(null, -32600, _.reason));
154
- let C = i.getHeader("accept");
155
- if (!s(C)) return i.send(400, m(null, -32600, "Accept header must include both application/json and text/event-stream"));
156
- let w = p({ "mcp-protocol-version": i.getHeader("mcp-protocol-version") });
157
- if (!w.ok) return i.send(426, {
154
+ function I(e, t) {
155
+ let n = !!t.app, r = typeof t.app == "object" ? t.app : void 0, i = {
156
+ resources: u(t.resources),
157
+ prompts: C(t.prompts),
158
+ instructions: b(t.instructions)
159
+ };
160
+ async function a(a, u) {
161
+ if (t.resourceMetadataUrl && !h(a.getHeader("authorization"))) return a.setHeader("WWW-Authenticate", y(t.resourceMetadataUrl)), a.send(401, { error: "Bearer token required" });
162
+ let b = o(a.getHeader("origin"), p(t));
163
+ if (!b.valid) return a.send(403, m(null, -32600, b.reason));
164
+ let C = a.getHeader("accept");
165
+ if (!s(C)) return a.send(400, m(null, -32600, "Accept header must include both application/json and text/event-stream"));
166
+ let w = g({ "mcp-protocol-version": a.getHeader("mcp-protocol-version") });
167
+ if (!w.ok) return a.send(426, {
158
168
  error: "Unsupported MCP protocol version",
159
169
  supported: w.supported
160
170
  });
161
- let T = c(await i.getBody());
162
- if (!T) return i.send(400, m(null, -32600, "Invalid JSON-RPC 2.0 request"));
163
- let E = x(C), D = T.method === "initialize", { resources: O, prompts: k, instructions: M } = a();
171
+ let T = f(await a.getBody());
172
+ if (!T) return a.send(400, m(null, -32600, "Invalid JSON-RPC 2.0 request"));
173
+ let E = x(C), D = T.method === "initialize", { resources: O, prompts: k, instructions: A } = i;
164
174
  try {
165
- let a = await h(T.method, T.params, {
175
+ let i = await d(T.method, T.params, {
166
176
  semanticLayer: e,
167
- extractSecurityContext: () => A(u, (e) => i.getHeader(e)),
177
+ extractSecurityContext: () => M(u, (e) => a.getHeader(e)),
168
178
  rawRequest: void 0,
169
179
  rawResponse: void 0,
170
180
  negotiatedProtocol: w.negotiated,
171
181
  resources: O,
172
182
  prompts: k,
173
- instructions: M,
183
+ instructions: A,
174
184
  appEnabled: n,
175
185
  appConfig: r,
176
186
  serverName: t.serverName
177
187
  });
178
- if (g(T)) return i.sendEmpty(202);
179
- let o = D && a && typeof a == "object" && "sessionId" in a ? a.sessionId : void 0;
180
- o && i.setHeader(v, o);
181
- let s = l(T.id ?? null, a);
188
+ if (_(T)) return a.sendEmpty(202);
189
+ let o = D && i && typeof i == "object" && "sessionId" in i ? i.sessionId : void 0;
190
+ o && a.setHeader(v, o);
191
+ let s = l(T.id ?? null, i);
182
192
  if (E) {
183
- let e = b();
184
- return i.sendSse(200, `id: ${e}\n\n` + S(s, e));
193
+ let e = c();
194
+ return a.sendSse(200, `id: ${e}\n\n` + S(s, e));
185
195
  }
186
- return i.send(200, s);
196
+ return a.send(200, s);
187
197
  } catch (e) {
188
- if (g(T)) return console.error("MCP notification processing error:", j(e)), i.sendEmpty(202);
189
- console.error("MCP RPC error:", j(e));
190
- let t = N(e, T.id);
198
+ if (_(T)) return console.error("MCP notification processing error:", N(e)), a.sendEmpty(202);
199
+ console.error("MCP RPC error:", N(e));
200
+ let t = F(e, T.id);
191
201
  if (E) {
192
- let e = b();
193
- return i.sendSse(200, `id: ${e}\n\n` + S(t, e));
202
+ let e = c();
203
+ return a.sendSse(200, `id: ${e}\n\n` + S(t, e));
194
204
  }
195
- return i.send(200, t);
205
+ return a.send(200, t);
196
206
  }
197
207
  }
198
- return { handleMcpPost: w };
208
+ return { handleMcpPost: a };
199
209
  }
200
210
  //#endregion
201
211
  //#region src/adapters/core/cube-http-handler.ts
202
- function F(e) {
203
- let { semanticLayer: n, onError: r, mcp: a = {} } = e, o = M(n), { handleMcpPost: s } = P(n, a);
212
+ function L(e) {
213
+ let { semanticLayer: n, onError: r, mcp: a = {} } = e, o = P(n), { handleMcpPost: s } = I(n, a);
204
214
  function c(e, n) {
205
215
  return r(e), n.send(500, t(e instanceof Error ? e.message : "Query execution failed", 500));
206
216
  }
207
217
  async function l(e, r, a) {
208
- let o = await A(a, (e) => r.getHeader(e)), s = n.validateQuery(e);
218
+ let o = await M(a, (e) => r.getHeader(e)), s = n.validateQuery(e, o);
209
219
  if (!s.isValid) return r.send(400, t(`Query validation failed: ${s.errors.join(", ")}`, 400));
210
220
  let c = r.getHeader("x-cache-control") === "no-cache", l = await n.executeMultiCubeQuery(e, o, { skipCache: c });
211
221
  return r.send(200, i(e, l, n));
@@ -234,11 +244,17 @@ function F(e) {
234
244
  }
235
245
  }
236
246
  return {
237
- handleLoadGet: d,
238
- handleLoadPost: u,
239
- handleMcpPost: s,
240
- ...o
247
+ handleLoadGet: (e, t) => d(A(e), t),
248
+ handleLoadPost: (e, t) => u(A(e), t),
249
+ handleMetaGet: (e, t) => o.handleMetaGet(A(e), t),
250
+ handleSqlGet: (e, t) => o.handleSqlGet(A(e), t),
251
+ handleSqlPost: (e, t) => o.handleSqlPost(A(e), t),
252
+ handleDryRunGet: (e, t) => o.handleDryRunGet(A(e), t),
253
+ handleDryRunPost: (e, t) => o.handleDryRunPost(A(e), t),
254
+ handleBatchPost: (e, t) => o.handleBatchPost(A(e), t),
255
+ handleExplainPost: (e, t) => o.handleExplainPost(A(e), t),
256
+ handleMcpPost: s
241
257
  };
242
258
  }
243
259
  //#endregion
244
- export { E as a, O as i, A as n, D as o, k as r, F as t };
260
+ export { A as a, D as c, k as i, M as n, O as o, j as r, E as s, L as t };
@@ -0,0 +1 @@
1
+ const e=require("./utils-BY0-KFyI.cjs"),t=require("./mcp-transport-BGkSz-ZT.cjs");var n=`x-dc-locale`;function r(e){if(!e)return;let t=(Array.isArray(e)?e[0]:e).split(`,`)[0]?.trim();if(t&&/^[A-Za-z0-9-]{2,35}$/.test(t))return t}function i(e){return r(e(n))}function a(e,t){let n=e&&typeof e==`object`?e:{},r=typeof n.locale==`string`?n.locale:void 0,i=t??r??`en-GB`;return r===i?n:{...n,locale:i}}function o(e){let t=Array.isArray(e)?[...e]:(e??``).split(`,`).map(e=>e.trim()).filter(Boolean);return t.some(e=>e.toLowerCase()===`x-dc-locale`)||t.push(`X-DC-Locale`),t}var s=`private, no-store`;function c(e){return{getHeader:t=>e.getHeader(t),getBody:()=>e.getBody(),getQueryParam:t=>e.getQueryParam(t),setHeader:(t,n)=>e.setHeader(t,n),send:(t,n)=>(e.setHeader(`Cache-Control`,s),e.send(t,n))}}function l(e,t){return a(e,i(t))}async function u(e,t){return l(await e(),t)}function d(e){return String(e).replace(/\n|\r/g,``)}function f(t){async function n(n,r,i){let a=t.validateQuery(n,r);if(!a.isValid)return i.send(400,e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=n.measures?.[0]||n.dimensions?.[0];if(!o)return i.send(400,e.i(`No measures or dimensions specified`,400));let s=o.split(`.`)[0],c=await t.generateSQL(s,n,r);return i.send(200,e.o(n,c))}async function r(n,r){try{let i=await u(r,e=>n.getHeader(e));return n.send(200,e.a(t.getMetadata(i)))}catch(t){return console.error(`Metadata error:`,t),n.send(500,e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500))}}async function i(t,r){try{let e=await t.getBody();return await n(e?.query||e,await u(r,e=>t.getHeader(e)),t)}catch(n){return console.error(`SQL generation error:`,d(n)),t.send(500,e.i(n instanceof Error?n.message:`SQL generation failed`,500))}}async function a(t,r){try{let i=t.getQueryParam(`query`);if(!i)return t.send(400,e.i(`Query parameter is required`,400));let a;try{a=JSON.parse(i)}catch{return t.send(400,e.i(`Invalid JSON in query parameter`,400))}let o=await u(r,e=>t.getHeader(e));return await n(a,o,t)}catch(n){return console.error(`SQL generation error:`,d(n)),t.send(500,e.i(n instanceof Error?n.message:`SQL generation failed`,500))}}async function o(n,r){try{let i=await n.getBody(),a=i?.query||i,o=await u(r,e=>n.getHeader(e)),s=await e.u(a,o,t);return n.send(200,s)}catch(e){return console.error(`Dry-run error:`,e),n.send(400,{error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}async function s(n,r){try{let i=n.getQueryParam(`query`);if(!i)return n.send(400,{error:`Query parameter is required`,valid:!1});let a=JSON.parse(i),o=await u(r,e=>n.getHeader(e)),s=await e.u(a,o,t);return n.send(200,s)}catch(e){return console.error(`Dry-run error:`,e),n.send(400,{error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}async function c(n,r){try{let i=(await n.getBody())?.queries;if(!i||!Array.isArray(i))return n.send(400,e.i(`Request body must contain a "queries" array`,400));if(i.length===0)return n.send(400,e.i(`Queries array cannot be empty`,400));let a=await u(r,e=>n.getHeader(e)),o=n.getHeader(`x-cache-control`)===`no-cache`,s=await e.l(i,a,t,{skipCache:o});return n.send(200,s)}catch(t){return console.error(`Batch execution error:`,t),n.send(500,e.i(t instanceof Error?t.message:`Batch execution failed`,500))}}async function l(e,n){try{let r=await e.getBody(),i=r?.query||r,a=r?.options||{},o=await u(n,t=>e.getHeader(t)),s=t.validateQuery(i,o);if(!s.isValid)return e.send(400,{error:`Query validation failed: ${s.errors.join(`, `)}`});let c=await t.explainQuery(i,o,a);return e.send(200,c)}catch(t){return console.error(`Explain error:`,t),e.send(500,{error:t instanceof Error?t.message:`Explain query failed`})}}return{handleMetaGet:r,handleSqlGet:a,handleSqlPost:i,handleDryRunGet:s,handleDryRunPost:o,handleBatchPost:c,handleExplainPost:l}}function p(e,n){let r=e?.code??-32603,i=e?.data,a=e.message||`MCP request failed`;return t.i(n??null,r,a,i)}function m(e,n){let r=!!n.app,i=typeof n.app==`object`?n.app:void 0,a={resources:t.b(n.resources),prompts:t.y(n.prompts),instructions:t.v(n.instructions)};async function o(o,s){if(n.resourceMetadataUrl&&!t.l(o.getHeader(`authorization`)))return o.setHeader(`WWW-Authenticate`,t.s(n.resourceMetadataUrl)),o.send(401,{error:`Bearer token required`});let c=t.C(o.getHeader(`origin`),t.h(n));if(!c.valid)return o.send(403,t.i(null,-32600,c.reason));let l=o.getHeader(`accept`);if(!t.S(l))return o.send(400,t.i(null,-32600,`Accept header must include both application/json and text/event-stream`));let f=t.m({"mcp-protocol-version":o.getHeader(`mcp-protocol-version`)});if(!f.ok)return o.send(426,{error:`Unsupported MCP protocol version`,supported:f.supported});let m=t.g(await o.getBody());if(!m)return o.send(400,t.i(null,-32600,`Invalid JSON-RPC 2.0 request`));let h=t.w(l),g=m.method===`initialize`,{resources:_,prompts:v,instructions:y}=a;try{let a=await t.c(m.method,m.params,{semanticLayer:e,extractSecurityContext:()=>u(s,e=>o.getHeader(e)),rawRequest:void 0,rawResponse:void 0,negotiatedProtocol:f.negotiated,resources:_,prompts:v,instructions:y,appEnabled:r,appConfig:i,serverName:n.serverName});if(t.p(m))return o.sendEmpty(202);let c=g&&a&&typeof a==`object`&&`sessionId`in a?a.sessionId:void 0;c&&o.setHeader(t.r,c);let l=t.a(m.id??null,a);if(h){let e=t._();return o.sendSse(200,`id: ${e}\n\n`+t.x(l,e))}return o.send(200,l)}catch(e){if(t.p(m))return console.error(`MCP notification processing error:`,d(e)),o.sendEmpty(202);console.error(`MCP RPC error:`,d(e));let n=p(e,m.id);if(h){let e=t._();return o.sendSse(200,`id: ${e}\n\n`+t.x(n,e))}return o.send(200,n)}}return{handleMcpPost:o}}function h(t){let{semanticLayer:n,onError:r,mcp:i={}}=t,a=f(n),{handleMcpPost:o}=m(n,i);function s(t,n){return r(t),n.send(500,e.i(t instanceof Error?t.message:`Query execution failed`,500))}async function l(t,r,i){let a=await u(i,e=>r.getHeader(e)),o=n.validateQuery(t,a);if(!o.isValid)return r.send(400,e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=r.getHeader(`x-cache-control`)===`no-cache`,c=await n.executeMultiCubeQuery(t,a,{skipCache:s});return r.send(200,e.r(t,c,n))}async function d(e,t){try{let n=await e.getBody();return await l(n?.query||n,e,t)}catch(t){return s(t,e)}}async function p(t,n){try{let r=t.getQueryParam(`query`);if(!r)return t.send(400,e.i(`Query parameter is required`,400));let i;try{i=JSON.parse(r)}catch{return t.send(400,e.i(`Invalid JSON in query parameter`,400))}return await l(i,t,n)}catch(e){return s(e,t)}}return{handleLoadGet:(e,t)=>p(c(e),t),handleLoadPost:(e,t)=>d(c(e),t),handleMetaGet:(e,t)=>a.handleMetaGet(c(e),t),handleSqlGet:(e,t)=>a.handleSqlGet(c(e),t),handleSqlPost:(e,t)=>a.handleSqlPost(c(e),t),handleDryRunGet:(e,t)=>a.handleDryRunGet(c(e),t),handleDryRunPost:(e,t)=>a.handleDryRunPost(c(e),t),handleBatchPost:(e,t)=>a.handleBatchPost(c(e),t),handleExplainPost:(e,t)=>a.handleExplainPost(c(e),t),handleMcpPost:o}}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return h}});
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils-BoOeig94.cjs"),t=require("../compiler-BNjqYdmc.cjs"),n=require("../mcp-transport-B0b27YUB.cjs"),r=require("../core-CzFfrJzu.cjs");let i=require("express");i=e.j(i,1);let a=require("cors");a=e.j(a,1);function o(e,t){return{getHeader:t=>e.get(t),getBody:async()=>e.body,getQueryParam:t=>e.query[t],send:(e,n)=>t.status(e).json(n),setHeader:(e,n)=>{t.setHeader(e,n)},sendEmpty:e=>t.status(e).end(),sendSse:(e,n)=>(t.status(e),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.write(n),t.end())}}function s(s){let{cubes:c,drizzle:l,schema:u,extractSecurityContext:d,engineType:f,cors:p,basePath:m=`/cubejs-api/v1`,jsonLimit:h=`10mb`,cache:g,mcp:_={enabled:!0},agent:v}=s;if(!c||c.length===0)throw Error(`At least one cube must be provided in the cubes array`);let y=(0,i.Router)();if(p){let e={...p,allowedHeaders:r.i(p.allowedHeaders)};y.use((0,a.default)(e))}y.use(i.default.json({limit:h})),y.use(i.default.urlencoded({extended:!0,limit:h}));let b=new t.t({drizzle:l,schema:u,engineType:f,cache:g,rlsSetup:s.rlsSetup});c.forEach(e=>{b.registerCube(e)});let x=r.t({semanticLayer:b,onError:e=>console.error(`Query execution error:`,e),mcp:_}),S=(e,t)=>()=>d(e,t);if(y.post(`${m}/load`,async(e,t)=>{await x.handleLoadPost(o(e,t),S(e,t))}),y.get(`${m}/load`,async(e,t)=>{await x.handleLoadGet(o(e,t),S(e,t))}),y.post(`${m}/batch`,async(e,t)=>{await x.handleBatchPost(o(e,t),S(e,t))}),y.get(`${m}/meta`,(e,t)=>{x.handleMetaGet(o(e,t))}),y.post(`${m}/sql`,async(e,t)=>{await x.handleSqlPost(o(e,t),S(e,t))}),y.get(`${m}/sql`,async(e,t)=>{await x.handleSqlGet(o(e,t),S(e,t))}),y.post(`${m}/dry-run`,async(e,t)=>{await x.handleDryRunPost(o(e,t),S(e,t))}),y.get(`${m}/dry-run`,async(e,t)=>{await x.handleDryRunGet(o(e,t),S(e,t))}),y.post(`${m}/explain`,async(e,t)=>{await x.handleExplainPost(o(e,t),S(e,t))}),v&&y.post(`${m}/agent/chat`,async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require("../handler-m6WgA9xu.cjs")),{message:i,sessionId:a,history:o}=e.body;if(!i||typeof i!=`string`)return t.status(400).json({error:`message is required and must be a string`});let s=(v.apiKey||``).trim();if(v.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(s=t.trim())}if(!s)return t.status(401).json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let c=v.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,l=v.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=v.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,f=r.r(await d(e,t),t=>e.get(t)),p=v.buildSystemContext?.(f);t.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:i,sessionId:a,history:o,semanticLayer:b,securityContext:f,agentConfig:v,apiKey:s,systemContext:p,providerOverride:c,modelOverride:l,baseURLOverride:u});for await(let n of e)t.write(`data: ${JSON.stringify(n)}\n\n`)}catch(e){let n={type:`error`,data:{message:e instanceof Error?e.message:`Stream failed`}};t.write(`data: ${JSON.stringify(n)}\n\n`)}finally{t.end()}}catch(e){console.error(`Agent chat error:`,e),t.headersSent||t.status(500).json({error:e instanceof Error?e.message:`Agent chat failed`})}}),_.enabled!==!1){let e=_.basePath??`/mcp`;y.post(`${e}`,async(e,t)=>{await x.handleMcpPost(o(e,t),S(e,t))}),y.get(`${e}`,async(e,t)=>{let r=n.C(e.headers.origin,n.g(_));if(!r.valid)return t.status(403).json({error:r.reason});if(_.resourceMetadataUrl&&!n.u(e.headers.authorization))return t.setHeader(`WWW-Authenticate`,n.c(_.resourceMetadataUrl)),t.status(401).json({error:`Bearer token required`});let i=n.v();t.status(200),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.write(n.x({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},i,15e3));let a=setInterval(()=>{t.write(`: keep-alive
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils-BY0-KFyI.cjs"),t=require("../compiler-BaLO10VN.cjs"),n=require("../mcp-transport-BGkSz-ZT.cjs"),r=require("../core-DgTGXxDu.cjs");let i=require("express");i=e.j(i,1);let a=require("cors");a=e.j(a,1);function o(e,t){return{getHeader:t=>e.get(t),getBody:async()=>e.body,getQueryParam:t=>e.query[t],send:(e,n)=>t.status(e).json(n),setHeader:(e,n)=>{t.setHeader(e,n)},sendEmpty:e=>t.status(e).end(),sendSse:(e,n)=>(t.status(e),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.write(n),t.end())}}function s(s){let{cubes:c,drizzle:l,schema:u,extractSecurityContext:d,engineType:f,cors:p,basePath:m=`/cubejs-api/v1`,jsonLimit:h=`10mb`,cache:g,mcp:_={enabled:!0},agent:v}=s;if(!s.semanticLayer&&(!c||c.length===0))throw Error(`At least one cube must be provided in the cubes array, or pass a pre-configured semanticLayer`);let y=(0,i.Router)();if(p){let e={...p,allowedHeaders:r.o(p.allowedHeaders)};y.use((0,a.default)(e))}y.use(i.default.json({limit:h})),y.use(i.default.urlencoded({extended:!0,limit:h}));let b=s.semanticLayer??new t.t({drizzle:l,schema:u,engineType:f,cache:g,rlsSetup:s.rlsSetup});!s.semanticLayer&&c&&c.forEach(e=>{b.registerCube(e)});let x=r.t({semanticLayer:b,onError:e=>console.error(`Query execution error:`,e),mcp:_}),S=(e,t)=>()=>d(e,t);if(y.post(`${m}/load`,async(e,t)=>{await x.handleLoadPost(o(e,t),S(e,t))}),y.get(`${m}/load`,async(e,t)=>{await x.handleLoadGet(o(e,t),S(e,t))}),y.post(`${m}/batch`,async(e,t)=>{await x.handleBatchPost(o(e,t),S(e,t))}),y.get(`${m}/meta`,async(e,t)=>{await x.handleMetaGet(o(e,t),S(e,t))}),y.post(`${m}/sql`,async(e,t)=>{await x.handleSqlPost(o(e,t),S(e,t))}),y.get(`${m}/sql`,async(e,t)=>{await x.handleSqlGet(o(e,t),S(e,t))}),y.post(`${m}/dry-run`,async(e,t)=>{await x.handleDryRunPost(o(e,t),S(e,t))}),y.get(`${m}/dry-run`,async(e,t)=>{await x.handleDryRunGet(o(e,t),S(e,t))}),y.post(`${m}/explain`,async(e,t)=>{await x.handleExplainPost(o(e,t),S(e,t))}),v&&y.post(`${m}/agent/chat`,async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require("../handler-DrRT6c14.cjs")),{message:i,sessionId:a,history:o}=e.body;if(!i||typeof i!=`string`)return t.status(400).json({error:`message is required and must be a string`});let s=(v.apiKey||``).trim();if(v.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(s=t.trim())}if(!s)return t.status(401).json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let c=v.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,l=v.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=v.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,f=r.r(await d(e,t),t=>e.get(t)),p=v.buildSystemContext?.(f);t.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:i,sessionId:a,history:o,semanticLayer:b,securityContext:f,agentConfig:v,apiKey:s,systemContext:p,providerOverride:c,modelOverride:l,baseURLOverride:u});for await(let n of e)t.write(`data: ${JSON.stringify(n)}\n\n`)}catch(e){let n={type:`error`,data:{message:e instanceof Error?e.message:`Stream failed`}};t.write(`data: ${JSON.stringify(n)}\n\n`)}finally{t.end()}}catch(e){console.error(`Agent chat error:`,e),t.headersSent||t.status(500).json({error:e instanceof Error?e.message:`Agent chat failed`})}}),_.enabled!==!1){let e=_.basePath??`/mcp`;y.post(`${e}`,async(e,t)=>{await x.handleMcpPost(o(e,t),S(e,t))}),y.get(`${e}`,async(e,t)=>{let r=n.C(e.headers.origin,n.h(_));if(!r.valid)return t.status(403).json({error:r.reason});if(_.resourceMetadataUrl&&!n.l(e.headers.authorization))return t.setHeader(`WWW-Authenticate`,n.s(_.resourceMetadataUrl)),t.status(401).json({error:`Bearer token required`});let i=n._();t.status(200),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.write(n.x({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},i,15e3));let a=setInterval(()=>{t.write(`: keep-alive
2
2
 
3
- `)},15e3);e.on(`close`,()=>{clearInterval(a)})}),y.delete(`${e}`,(e,t)=>{let r=n.C(e.headers.origin,n.g(_));return r.valid?_.resourceMetadataUrl&&!n.u(e.headers.authorization)?(t.setHeader(`WWW-Authenticate`,n.c(_.resourceMetadataUrl)),t.status(401).json({error:`Bearer token required`})):t.status(405).json({error:`Session termination not supported`}):t.status(403).json({error:r.reason})})}return y.use((t,n,r,i)=>{console.error(`Express adapter error:`,t),r.headersSent||r.status(500).json(e.i(t,500))}),y}function c(e,t){let n=s(t);return e.use(`/`,n),e}function l(e){return c((0,i.default)(),e)}exports.createCubeApp=l,exports.createCubeRouter=s,exports.mountCubeRoutes=c;
3
+ `)},15e3);e.on(`close`,()=>{clearInterval(a)})}),y.delete(`${e}`,(e,t)=>{let r=n.C(e.headers.origin,n.h(_));return r.valid?_.resourceMetadataUrl&&!n.l(e.headers.authorization)?(t.setHeader(`WWW-Authenticate`,n.s(_.resourceMetadataUrl)),t.status(401).json({error:`Bearer token required`})):t.status(405).json({error:`Session termination not supported`}):t.status(403).json({error:r.reason})})}return y.use((t,n,r,i)=>{console.error(`Express adapter error:`,t),r.headersSent||r.status(500).json(e.i(t,500))}),y}function c(e,t){let n=s(t);return e.use(`/`,n),e}function l(e){return c((0,i.default)(),e)}exports.createCubeApp=l,exports.createCubeRouter=s,exports.mountCubeRoutes=c;
@@ -2,15 +2,24 @@ import { Router, Request, Response, Express } from 'express';
2
2
  import { CorsOptions } from 'cors';
3
3
  import { SemanticQuery, SecurityContext, DatabaseExecutor, DrizzleDatabase, Cube, CacheConfig, RLSSetupFn } from '../../server/index.js';
4
4
  import { AgentConfig } from '../../server/agent/types.js';
5
+ import { SemanticLayerCompiler } from '../../server/compiler.js';
5
6
  import { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
6
7
  import { MySql2Database } from 'drizzle-orm/mysql2';
7
8
  import { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
8
9
  import { MCPOptions } from '../utils.js';
9
10
  export interface ExpressAdapterOptions {
10
11
  /**
11
- * Array of cube definitions to register
12
+ * Pre-configured SemanticLayerCompiler instance.
13
+ * When provided, skips creating a new compiler and cube registration (caller
14
+ * manages it). Required to use per-tenant cube sets, since the caller must own
15
+ * the compiler to call `registerCubeSet` — see docs/per-tenant-cube-sets.md.
12
16
  */
13
- cubes: Cube[];
17
+ semanticLayer?: SemanticLayerCompiler;
18
+ /**
19
+ * Array of cube definitions to register.
20
+ * Required unless `semanticLayer` is provided.
21
+ */
22
+ cubes?: Cube[];
14
23
  /**
15
24
  * Drizzle database instance (REQUIRED)
16
25
  * This is the core of drizzle-cube - Drizzle ORM integration
@@ -1,7 +1,7 @@
1
- import { i as e } from "../utils-DboNUT3A.js";
2
- import { t } from "../compiler-DiYxWAKg.js";
3
- import { C as n, c as r, g as i, u as a, v as o, x as s } from "../mcp-transport-BXyA4dTk.js";
4
- import { i as c, r as l, t as u } from "../core-BOPRmxPc.js";
1
+ import { i as e } from "../utils-DkmShl5f.js";
2
+ import { t } from "../compiler-CQJ5GOwF.js";
3
+ import { C as n, _ as r, h as i, l as a, s as o, x as s } from "../mcp-transport-fJud19xz.js";
4
+ import { o as c, r as l, t as u } from "../core-DXkuSUBg.js";
5
5
  import d, { Router as f } from "express";
6
6
  import p from "cors";
7
7
  //#region src/adapters/express/index.ts
@@ -20,7 +20,7 @@ function m(e, t) {
20
20
  }
21
21
  function h(h) {
22
22
  let { cubes: g, drizzle: _, schema: v, extractSecurityContext: y, engineType: b, cors: x, basePath: S = "/cubejs-api/v1", jsonLimit: C = "10mb", cache: w, mcp: T = { enabled: !0 }, agent: E } = h;
23
- if (!g || g.length === 0) throw Error("At least one cube must be provided in the cubes array");
23
+ if (!h.semanticLayer && (!g || g.length === 0)) throw Error("At least one cube must be provided in the cubes array, or pass a pre-configured semanticLayer");
24
24
  let D = f();
25
25
  if (x) {
26
26
  let e = {
@@ -33,14 +33,14 @@ function h(h) {
33
33
  extended: !0,
34
34
  limit: C
35
35
  }));
36
- let O = new t({
36
+ let O = h.semanticLayer ?? new t({
37
37
  drizzle: _,
38
38
  schema: v,
39
39
  engineType: b,
40
40
  cache: w,
41
41
  rlsSetup: h.rlsSetup
42
42
  });
43
- g.forEach((e) => {
43
+ !h.semanticLayer && g && g.forEach((e) => {
44
44
  O.registerCube(e);
45
45
  });
46
46
  let k = u({
@@ -54,8 +54,8 @@ function h(h) {
54
54
  await k.handleLoadGet(m(e, t), A(e, t));
55
55
  }), D.post(`${S}/batch`, async (e, t) => {
56
56
  await k.handleBatchPost(m(e, t), A(e, t));
57
- }), D.get(`${S}/meta`, (e, t) => {
58
- k.handleMetaGet(m(e, t));
57
+ }), D.get(`${S}/meta`, async (e, t) => {
58
+ await k.handleMetaGet(m(e, t), A(e, t));
59
59
  }), D.post(`${S}/sql`, async (e, t) => {
60
60
  await k.handleSqlPost(m(e, t), A(e, t));
61
61
  }), D.get(`${S}/sql`, async (e, t) => {
@@ -68,7 +68,7 @@ function h(h) {
68
68
  await k.handleExplainPost(m(e, t), A(e, t));
69
69
  }), E && D.post(`${S}/agent/chat`, async (e, t) => {
70
70
  try {
71
- let { handleAgentChat: n } = await import("../handler-DGud-C-w.js"), { message: r, sessionId: i, history: a } = e.body;
71
+ let { handleAgentChat: n } = await import("../handler-CphYSZRh.js"), { message: r, sessionId: i, history: a } = e.body;
72
72
  if (!r || typeof r != "string") return t.status(400).json({ error: "message is required and must be a string" });
73
73
  let o = (E.apiKey || "").trim();
74
74
  if (E.allowClientApiKey) {
@@ -116,8 +116,8 @@ function h(h) {
116
116
  }), D.get(`${e}`, async (e, t) => {
117
117
  let c = n(e.headers.origin, i(T));
118
118
  if (!c.valid) return t.status(403).json({ error: c.reason });
119
- if (T.resourceMetadataUrl && !a(e.headers.authorization)) return t.setHeader("WWW-Authenticate", r(T.resourceMetadataUrl)), t.status(401).json({ error: "Bearer token required" });
120
- let l = o();
119
+ if (T.resourceMetadataUrl && !a(e.headers.authorization)) return t.setHeader("WWW-Authenticate", o(T.resourceMetadataUrl)), t.status(401).json({ error: "Bearer token required" });
120
+ let l = r();
121
121
  t.status(200), t.setHeader("Content-Type", "text/event-stream"), t.setHeader("Cache-Control", "no-cache"), t.setHeader("Connection", "keep-alive"), t.write(s({
122
122
  jsonrpc: "2.0",
123
123
  method: "mcp/ready",
@@ -130,8 +130,8 @@ function h(h) {
130
130
  clearInterval(u);
131
131
  });
132
132
  }), D.delete(`${e}`, (e, t) => {
133
- let o = n(e.headers.origin, i(T));
134
- return o.valid ? T.resourceMetadataUrl && !a(e.headers.authorization) ? (t.setHeader("WWW-Authenticate", r(T.resourceMetadataUrl)), t.status(401).json({ error: "Bearer token required" })) : t.status(405).json({ error: "Session termination not supported" }) : t.status(403).json({ error: o.reason });
133
+ let r = n(e.headers.origin, i(T));
134
+ return r.valid ? T.resourceMetadataUrl && !a(e.headers.authorization) ? (t.setHeader("WWW-Authenticate", o(T.resourceMetadataUrl)), t.status(401).json({ error: "Bearer token required" })) : t.status(405).json({ error: "Session termination not supported" }) : t.status(403).json({ error: r.reason });
135
135
  });
136
136
  }
137
137
  return D.use((t, n, r, i) => {
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils-BoOeig94.cjs"),t=require("../compiler-BNjqYdmc.cjs"),n=require("../mcp-transport-B0b27YUB.cjs"),r=require("../core-CzFfrJzu.cjs");function i(e,t){let n=e.headers[t.toLowerCase()];return Array.isArray(n)?n[0]:n}function a(e,t){return{getHeader:t=>i(e,t),getBody:async()=>e.body,getQueryParam:t=>e.query?.[t],send:(e,n)=>t.status(e).send(n),setHeader:(e,n)=>{t.header(e,n)},sendEmpty:e=>t.status(e).send(),sendSse:(e,n)=>(t.header(`Content-Type`,`text/event-stream`),t.header(`Cache-Control`,`no-cache`),t.header(`Connection`,`keep-alive`),t.status(e).send(n))}}var o=function(o,s,c){let{cubes:l,drizzle:u,schema:d,extractSecurityContext:f,engineType:p,cors:m,basePath:h=`/cubejs-api/v1`,bodyLimit:g=10485760,cache:_,mcp:v={enabled:!0},agent:y}=s;if(!l||l.length===0)return c(Error(`At least one cube must be provided in the cubes array`));if(m){let e={...m,allowedHeaders:r.i(m.allowedHeaders)};o.register(import(`@fastify/cors`),e)}o.addHook(`onRequest`,async(e,t)=>{e.method===`POST`&&(e.body=void 0)});let b=new t.t({drizzle:u,schema:d,engineType:p,cache:_,rlsSetup:s.rlsSetup});l.forEach(e=>{b.registerCube(e)});let x=r.t({semanticLayer:b,onError:e=>o.log.error(e,`Query execution error`),mcp:v}),S=e=>()=>f(e),C={bodyLimit:g,schema:{body:{type:`object`,additionalProperties:!0}}},w={schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}};if(o.post(`${h}/load`,C,(e,t)=>x.handleLoadPost(a(e,t),S(e))),o.get(`${h}/load`,w,(e,t)=>x.handleLoadGet(a(e,t),S(e))),o.post(`${h}/batch`,{bodyLimit:g,schema:{body:{type:`object`,required:[`queries`],properties:{queries:{type:`array`,items:{type:`object`}}}}}},(e,t)=>x.handleBatchPost(a(e,t),S(e))),o.get(`${h}/meta`,(e,t)=>x.handleMetaGet(a(e,t))),o.post(`${h}/sql`,C,(e,t)=>x.handleSqlPost(a(e,t),S(e))),o.get(`${h}/sql`,w,(e,t)=>x.handleSqlGet(a(e,t),S(e))),o.post(`${h}/dry-run`,C,(e,t)=>x.handleDryRunPost(a(e,t),S(e))),o.get(`${h}/dry-run`,w,(e,t)=>x.handleDryRunGet(a(e,t),S(e))),o.post(`${h}/explain`,C,(e,t)=>x.handleExplainPost(a(e,t),S(e))),y&&o.post(`${h}/agent/chat`,{bodyLimit:g,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require("../handler-m6WgA9xu.cjs")),{message:a,sessionId:o,history:s}=e.body;if(!a||typeof a!=`string`)return t.status(400).send({error:`message is required and must be a string`});let c=(y.apiKey||``).trim();if(y.allowClientApiKey){let t=i(e,`x-agent-api-key`);t&&(c=t.trim())}if(!c)return t.status(401).send({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let l=y.allowClientApiKey?i(e,`x-agent-provider`):void 0,u=y.allowClientApiKey?i(e,`x-agent-model`):void 0,d=y.allowClientApiKey?i(e,`x-agent-provider-endpoint`):void 0,p=r.r(await f(e),t=>i(e,t)),m=y.buildSystemContext?.(p);t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:a,sessionId:o,history:s,semanticLayer:b,securityContext:p,agentConfig:y,apiKey:c,systemContext:m,providerOverride:l,modelOverride:u,baseURLOverride:d});for await(let n of e)t.raw.write(`data: ${JSON.stringify(n)}\n\n`)}catch(e){let n={type:`error`,data:{message:e instanceof Error?e.message:`Stream failed`}};t.raw.write(`data: ${JSON.stringify(n)}\n\n`)}finally{t.raw.end()}}catch(n){if(e.log.error(n,`Agent chat error`),!t.raw.headersSent)return t.status(500).send({error:n instanceof Error?n.message:`Agent chat failed`})}}),v.enabled!==!1){let e=v.basePath??`/mcp`;o.post(`${e}`,{bodyLimit:g,schema:{body:{type:`object`,additionalProperties:!0}}},(e,t)=>x.handleMcpPost(a(e,t),S(e))),o.get(`${e}`,async(e,t)=>{let r=n.C(e.headers.origin,n.g(v));if(!r.valid)return t.status(403).send({error:r.reason});if(v.resourceMetadataUrl&&!n.u(e.headers.authorization))return t.header(`WWW-Authenticate`,n.c(v.resourceMetadataUrl)),t.status(401).send({error:`Bearer token required`});let i=n.v();t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),t.raw.write(n.x({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},i,15e3));let a=setInterval(()=>{t.raw.write(`: keep-alive
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils-BY0-KFyI.cjs"),t=require("../compiler-BaLO10VN.cjs"),n=require("../mcp-transport-BGkSz-ZT.cjs"),r=require("../core-DgTGXxDu.cjs");function i(e,t){let n=e.headers[t.toLowerCase()];return Array.isArray(n)?n[0]:n}function a(e,t){return{getHeader:t=>i(e,t),getBody:async()=>e.body,getQueryParam:t=>e.query?.[t],send:(e,n)=>t.status(e).send(n),setHeader:(e,n)=>{t.header(e,n)},sendEmpty:e=>t.status(e).send(),sendSse:(e,n)=>(t.header(`Content-Type`,`text/event-stream`),t.header(`Cache-Control`,`no-cache`),t.header(`Connection`,`keep-alive`),t.status(e).send(n))}}var o=function(o,s,c){let{cubes:l,drizzle:u,schema:d,extractSecurityContext:f,engineType:p,cors:m,basePath:h=`/cubejs-api/v1`,bodyLimit:g=10485760,cache:_,mcp:v={enabled:!0},agent:y}=s;if(!s.semanticLayer&&(!l||l.length===0))return c(Error(`At least one cube must be provided in the cubes array, or pass a pre-configured semanticLayer`));if(m){let e={...m,allowedHeaders:r.o(m.allowedHeaders)};o.register(import(`@fastify/cors`),e)}o.addHook(`onRequest`,async(e,t)=>{e.method===`POST`&&(e.body=void 0)});let b=s.semanticLayer??new t.t({drizzle:u,schema:d,engineType:p,cache:_,rlsSetup:s.rlsSetup});!s.semanticLayer&&l&&l.forEach(e=>{b.registerCube(e)});let x=r.t({semanticLayer:b,onError:e=>o.log.error(e,`Query execution error`),mcp:v}),S=e=>()=>f(e),C={bodyLimit:g,schema:{body:{type:`object`,additionalProperties:!0}}},w={schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}};if(o.post(`${h}/load`,C,(e,t)=>x.handleLoadPost(a(e,t),S(e))),o.get(`${h}/load`,w,(e,t)=>x.handleLoadGet(a(e,t),S(e))),o.post(`${h}/batch`,{bodyLimit:g,schema:{body:{type:`object`,required:[`queries`],properties:{queries:{type:`array`,items:{type:`object`}}}}}},(e,t)=>x.handleBatchPost(a(e,t),S(e))),o.get(`${h}/meta`,(e,t)=>x.handleMetaGet(a(e,t),S(e))),o.post(`${h}/sql`,C,(e,t)=>x.handleSqlPost(a(e,t),S(e))),o.get(`${h}/sql`,w,(e,t)=>x.handleSqlGet(a(e,t),S(e))),o.post(`${h}/dry-run`,C,(e,t)=>x.handleDryRunPost(a(e,t),S(e))),o.get(`${h}/dry-run`,w,(e,t)=>x.handleDryRunGet(a(e,t),S(e))),o.post(`${h}/explain`,C,(e,t)=>x.handleExplainPost(a(e,t),S(e))),y&&o.post(`${h}/agent/chat`,{bodyLimit:g,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require("../handler-DrRT6c14.cjs")),{message:a,sessionId:o,history:s}=e.body;if(!a||typeof a!=`string`)return t.status(400).send({error:`message is required and must be a string`});let c=(y.apiKey||``).trim();if(y.allowClientApiKey){let t=i(e,`x-agent-api-key`);t&&(c=t.trim())}if(!c)return t.status(401).send({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let l=y.allowClientApiKey?i(e,`x-agent-provider`):void 0,u=y.allowClientApiKey?i(e,`x-agent-model`):void 0,d=y.allowClientApiKey?i(e,`x-agent-provider-endpoint`):void 0,p=r.r(await f(e),t=>i(e,t)),m=y.buildSystemContext?.(p);t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:a,sessionId:o,history:s,semanticLayer:b,securityContext:p,agentConfig:y,apiKey:c,systemContext:m,providerOverride:l,modelOverride:u,baseURLOverride:d});for await(let n of e)t.raw.write(`data: ${JSON.stringify(n)}\n\n`)}catch(e){let n={type:`error`,data:{message:e instanceof Error?e.message:`Stream failed`}};t.raw.write(`data: ${JSON.stringify(n)}\n\n`)}finally{t.raw.end()}}catch(n){if(e.log.error(n,`Agent chat error`),!t.raw.headersSent)return t.status(500).send({error:n instanceof Error?n.message:`Agent chat failed`})}}),v.enabled!==!1){let e=v.basePath??`/mcp`;o.post(`${e}`,{bodyLimit:g,schema:{body:{type:`object`,additionalProperties:!0}}},(e,t)=>x.handleMcpPost(a(e,t),S(e))),o.get(`${e}`,async(e,t)=>{let r=n.C(e.headers.origin,n.h(v));if(!r.valid)return t.status(403).send({error:r.reason});if(v.resourceMetadataUrl&&!n.l(e.headers.authorization))return t.header(`WWW-Authenticate`,n.s(v.resourceMetadataUrl)),t.status(401).send({error:`Bearer token required`});let i=n._();t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),t.raw.write(n.x({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},i,15e3));let a=setInterval(()=>{t.raw.write(`: keep-alive
2
2
 
3
- `)},15e3);e.raw.on(`close`,()=>{clearInterval(a)})}),o.delete(`${e}`,async(e,t)=>{let r=n.C(e.headers.origin,n.g(v));return r.valid?v.resourceMetadataUrl&&!n.u(e.headers.authorization)?(t.header(`WWW-Authenticate`,n.c(v.resourceMetadataUrl)),t.status(401).send({error:`Bearer token required`})):t.status(405).send({error:`Session termination not supported`}):t.status(403).send({error:r.reason})})}o.setErrorHandler(async(t,n,r)=>{n.log.error(t,`Fastify cube adapter error`),r.statusCode<400&&r.status(500);let i=t instanceof Error?t:String(t);return e.i(i,r.statusCode)}),c()};async function s(e,t){await e.register(o,t)}function c(e){let t=require("fastify")({logger:!0});return t.register(o,e),t}exports.createCubeApp=c,exports.cubePlugin=o,exports.registerCubeRoutes=s;
3
+ `)},15e3);e.raw.on(`close`,()=>{clearInterval(a)})}),o.delete(`${e}`,async(e,t)=>{let r=n.C(e.headers.origin,n.h(v));return r.valid?v.resourceMetadataUrl&&!n.l(e.headers.authorization)?(t.header(`WWW-Authenticate`,n.s(v.resourceMetadataUrl)),t.status(401).send({error:`Bearer token required`})):t.status(405).send({error:`Session termination not supported`}):t.status(403).send({error:r.reason})})}o.setErrorHandler(async(t,n,r)=>{n.log.error(t,`Fastify cube adapter error`),r.statusCode<400&&r.status(500);let i=t instanceof Error?t:String(t);return e.i(i,r.statusCode)}),c()};async function s(e,t){await e.register(o,t)}function c(e){let t=require("fastify")({logger:!0});return t.register(o,e),t}exports.createCubeApp=c,exports.cubePlugin=o,exports.registerCubeRoutes=s;
@@ -2,15 +2,24 @@ import { FastifyPluginCallback, FastifyRequest, FastifyInstance } from 'fastify'
2
2
  import { FastifyCorsOptions } from '@fastify/cors';
3
3
  import { SemanticQuery, SecurityContext, DatabaseExecutor, DrizzleDatabase, Cube, CacheConfig, RLSSetupFn } from '../../server/index.js';
4
4
  import { AgentConfig } from '../../server/agent/types.js';
5
+ import { SemanticLayerCompiler } from '../../server/compiler.js';
5
6
  import { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
6
7
  import { MySql2Database } from 'drizzle-orm/mysql2';
7
8
  import { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
8
9
  import { MCPOptions } from '../utils.js';
9
10
  export interface FastifyAdapterOptions {
10
11
  /**
11
- * Array of cube definitions to register
12
+ * Pre-configured SemanticLayerCompiler instance.
13
+ * When provided, skips creating a new compiler and cube registration (caller
14
+ * manages it). Required to use per-tenant cube sets, since the caller must own
15
+ * the compiler to call `registerCubeSet` — see docs/per-tenant-cube-sets.md.
12
16
  */
13
- cubes: Cube[];
17
+ semanticLayer?: SemanticLayerCompiler;
18
+ /**
19
+ * Array of cube definitions to register.
20
+ * Required unless `semanticLayer` is provided.
21
+ */
22
+ cubes?: Cube[];
14
23
  /**
15
24
  * Drizzle database instance (REQUIRED)
16
25
  * This is the core of drizzle-cube - Drizzle ORM integration