drizzle-cube 0.4.42 → 0.4.43

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 (183) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/express/index.cjs +1 -1
  3. package/dist/adapters/express/index.js +2 -2
  4. package/dist/adapters/fastify/index.cjs +1 -1
  5. package/dist/adapters/fastify/index.js +2 -2
  6. package/dist/adapters/{handler-dHHEEbG9.cjs → handler-BneUGY0k.cjs} +1 -1
  7. package/dist/adapters/{handler-fto6TSVn.js → handler-CiQoQsnP.js} +1 -1
  8. package/dist/adapters/hono/index.cjs +1 -1
  9. package/dist/adapters/hono/index.js +5 -5
  10. package/dist/adapters/{mcp-transport-tB5a7Het.js → mcp-transport-CC3hQOnb.js} +1099 -1338
  11. package/dist/adapters/mcp-transport-mmuPvjfR.cjs +255 -0
  12. package/dist/adapters/nextjs/index.cjs +1 -1
  13. package/dist/adapters/nextjs/index.js +2 -2
  14. package/dist/adapters/{openai-Ckpe7iU7.js → openai-CQfaz257.js} +1 -1
  15. package/dist/{server/openai-DKpZPCay.cjs → adapters/openai-CZ74gWd4.cjs} +1 -1
  16. package/dist/adapters/{openai-Bc8qwEKW.cjs → openai-DLfardui.cjs} +1 -1
  17. package/dist/adapters/{openai-DxeVtl8X.js → openai-DaxuhJLS.js} +1 -1
  18. package/dist/client/charts.js +12 -12
  19. package/dist/client/chunks/{DashboardEditModal-4zzjtZRR.js → DashboardEditModal-BTdV528l.js} +1421 -1396
  20. package/dist/client/chunks/DashboardEditModal-BTdV528l.js.map +1 -0
  21. package/dist/client/chunks/{FieldSearchModal-trURu9Sa.js → FieldSearchModal-D75vy4Wb.js} +4 -4
  22. package/dist/client/chunks/{FieldSearchModal-trURu9Sa.js.map → FieldSearchModal-D75vy4Wb.js.map} +1 -1
  23. package/dist/client/chunks/KpiDelta-Bk8bzKYM.js +2 -0
  24. package/dist/client/chunks/KpiNumber-CKF-8e_T.js +2 -0
  25. package/dist/client/chunks/KpiText-Iz1vIvu_.js +2 -0
  26. package/dist/client/chunks/{RetentionCombinedChart-B1hUYaXt.js → RetentionCombinedChart-DIhK5pD8.js} +3 -3
  27. package/dist/client/chunks/{RetentionCombinedChart-B1hUYaXt.js.map → RetentionCombinedChart-DIhK5pD8.js.map} +1 -1
  28. package/dist/client/chunks/{RetentionHeatmap-Dn2ocjVf.js → RetentionHeatmap-CyREolyP.js} +1 -1
  29. package/dist/client/chunks/{RetentionHeatmap-Dn2ocjVf.js.map → RetentionHeatmap-CyREolyP.js.map} +1 -1
  30. package/dist/client/chunks/SchemaVisualization-B1GUT-FM.js +2 -0
  31. package/dist/client/chunks/SchemaVisualizationLazy-DymwT34e.js +2 -0
  32. package/dist/client/chunks/{analysis-builder-B7XSIMkr.js → analysis-builder-C1CJ0c7L.js} +52 -52
  33. package/dist/client/chunks/{analysis-builder-B7XSIMkr.js.map → analysis-builder-C1CJ0c7L.js.map} +1 -1
  34. package/dist/client/chunks/{analysis-builder-shared-DaqtrLxd.js → analysis-builder-shared-rkjJfWLT.js} +9 -9
  35. package/dist/client/chunks/{analysis-builder-shared-DaqtrLxd.js.map → analysis-builder-shared-rkjJfWLT.js.map} +1 -1
  36. package/dist/client/chunks/{chart-activity-grid-wR2Twpo7.js → chart-activity-grid-DLktOINm.js} +2 -2
  37. package/dist/client/chunks/{chart-activity-grid-wR2Twpo7.js.map → chart-activity-grid-DLktOINm.js.map} +1 -1
  38. package/dist/client/chunks/{chart-area-e9ysnatQ.js → chart-area-BwYaflNk.js} +3 -3
  39. package/dist/client/chunks/{chart-area-e9ysnatQ.js.map → chart-area-BwYaflNk.js.map} +1 -1
  40. package/dist/client/chunks/{chart-bar-CPt67rLR.js → chart-bar-BiENfFgE.js} +4 -4
  41. package/dist/client/chunks/{chart-bar-CPt67rLR.js.map → chart-bar-BiENfFgE.js.map} +1 -1
  42. package/dist/client/chunks/{chart-box-plot-Dp_nqQen.js → chart-box-plot-BJF1tBXC.js} +3 -3
  43. package/dist/client/chunks/{chart-box-plot-Dp_nqQen.js.map → chart-box-plot-BJF1tBXC.js.map} +1 -1
  44. package/dist/client/chunks/{chart-bubble-CYQ8loeS.js → chart-bubble-DQQhGVDJ.js} +3 -3
  45. package/dist/client/chunks/{chart-bubble-CYQ8loeS.js.map → chart-bubble-DQQhGVDJ.js.map} +1 -1
  46. package/dist/client/chunks/{chart-candlestick-DTeSf7C5.js → chart-candlestick-C2UuXbLe.js} +3 -3
  47. package/dist/client/chunks/{chart-candlestick-DTeSf7C5.js.map → chart-candlestick-C2UuXbLe.js.map} +1 -1
  48. package/dist/client/chunks/{chart-config-activity-grid-BSWS08cI.js → chart-config-activity-grid-DJOU3TEz.js} +2 -2
  49. package/dist/client/chunks/{chart-config-activity-grid-BSWS08cI.js.map → chart-config-activity-grid-DJOU3TEz.js.map} +1 -1
  50. package/dist/client/chunks/{chart-config-area-DKwgcHp4.js → chart-config-area-CWnWVT6a.js} +2 -2
  51. package/dist/client/chunks/{chart-config-area-DKwgcHp4.js.map → chart-config-area-CWnWVT6a.js.map} +1 -1
  52. package/dist/client/chunks/{chart-config-bar-deTjEhap.js → chart-config-bar-C-7Dr1Ho.js} +2 -2
  53. package/dist/client/chunks/{chart-config-bar-deTjEhap.js.map → chart-config-bar-C-7Dr1Ho.js.map} +1 -1
  54. package/dist/client/chunks/{chart-config-box-plot-DU4iWk3V.js → chart-config-box-plot-mVOwmLdu.js} +2 -2
  55. package/dist/client/chunks/{chart-config-box-plot-DU4iWk3V.js.map → chart-config-box-plot-mVOwmLdu.js.map} +1 -1
  56. package/dist/client/chunks/{chart-config-bubble-B8FSHSW-.js → chart-config-bubble-BPE2CeiD.js} +2 -2
  57. package/dist/client/chunks/{chart-config-bubble-B8FSHSW-.js.map → chart-config-bubble-BPE2CeiD.js.map} +1 -1
  58. package/dist/client/chunks/{chart-config-candlestick-BGfyWFft.js → chart-config-candlestick-BSB9DRy2.js} +2 -2
  59. package/dist/client/chunks/{chart-config-candlestick-BGfyWFft.js.map → chart-config-candlestick-BSB9DRy2.js.map} +1 -1
  60. package/dist/client/chunks/{chart-config-data-table-DKRcGa8t.js → chart-config-data-table-Bhdx5Hem.js} +2 -2
  61. package/dist/client/chunks/{chart-config-data-table-DKRcGa8t.js.map → chart-config-data-table-Bhdx5Hem.js.map} +1 -1
  62. package/dist/client/chunks/{chart-config-funnel-Bt4iGFo_.js → chart-config-funnel-Cl-v-bm1.js} +2 -2
  63. package/dist/client/chunks/{chart-config-funnel-Bt4iGFo_.js.map → chart-config-funnel-Cl-v-bm1.js.map} +1 -1
  64. package/dist/client/chunks/{chart-config-gauge-Bk4Jjp3W.js → chart-config-gauge-CdrUTJMJ.js} +2 -2
  65. package/dist/client/chunks/{chart-config-gauge-Bk4Jjp3W.js.map → chart-config-gauge-CdrUTJMJ.js.map} +1 -1
  66. package/dist/client/chunks/{chart-config-heat-map-CkHsqkrY.js → chart-config-heat-map-DGE3NzoF.js} +2 -2
  67. package/dist/client/chunks/{chart-config-heat-map-CkHsqkrY.js.map → chart-config-heat-map-DGE3NzoF.js.map} +1 -1
  68. package/dist/client/chunks/{chart-config-kpi-delta-CkUX98JV.js → chart-config-kpi-delta-DMrQerUW.js} +2 -2
  69. package/dist/client/chunks/{chart-config-kpi-delta-CkUX98JV.js.map → chart-config-kpi-delta-DMrQerUW.js.map} +1 -1
  70. package/dist/client/chunks/{chart-config-kpi-number-DcxyiUgs.js → chart-config-kpi-number-DCytCytn.js} +2 -2
  71. package/dist/client/chunks/{chart-config-kpi-number-DcxyiUgs.js.map → chart-config-kpi-number-DCytCytn.js.map} +1 -1
  72. package/dist/client/chunks/{chart-config-kpi-text-DI4mj8CN.js → chart-config-kpi-text-KdKQUvHo.js} +2 -2
  73. package/dist/client/chunks/{chart-config-kpi-text-DI4mj8CN.js.map → chart-config-kpi-text-KdKQUvHo.js.map} +1 -1
  74. package/dist/client/chunks/{chart-config-line--j7-dLue.js → chart-config-line-Bl9VDAdz.js} +2 -2
  75. package/dist/client/chunks/{chart-config-line--j7-dLue.js.map → chart-config-line-Bl9VDAdz.js.map} +1 -1
  76. package/dist/client/chunks/{chart-config-markdown-DUjvVjV4.js → chart-config-markdown-BX26b94i.js} +2 -2
  77. package/dist/client/chunks/{chart-config-markdown-DUjvVjV4.js.map → chart-config-markdown-BX26b94i.js.map} +1 -1
  78. package/dist/client/chunks/{chart-config-measure-profile-B9FKBNGc.js → chart-config-measure-profile-DwtRhEFh.js} +2 -2
  79. package/dist/client/chunks/{chart-config-measure-profile-B9FKBNGc.js.map → chart-config-measure-profile-DwtRhEFh.js.map} +1 -1
  80. package/dist/client/chunks/{chart-config-pie-yU4jipl9.js → chart-config-pie-BzBcqPMJ.js} +2 -2
  81. package/dist/client/chunks/{chart-config-pie-yU4jipl9.js.map → chart-config-pie-BzBcqPMJ.js.map} +1 -1
  82. package/dist/client/chunks/{chart-config-radar-R9Fkc8wL.js → chart-config-radar-6ZOgt__z.js} +2 -2
  83. package/dist/client/chunks/{chart-config-radar-R9Fkc8wL.js.map → chart-config-radar-6ZOgt__z.js.map} +1 -1
  84. package/dist/client/chunks/{chart-config-radial-bar-DeoXfpIp.js → chart-config-radial-bar-Df6Eta7N.js} +2 -2
  85. package/dist/client/chunks/{chart-config-radial-bar-DeoXfpIp.js.map → chart-config-radial-bar-Df6Eta7N.js.map} +1 -1
  86. package/dist/client/chunks/{chart-config-sankey-CXEsxo6s.js → chart-config-sankey-DgqKBFvN.js} +2 -2
  87. package/dist/client/chunks/{chart-config-sankey-CXEsxo6s.js.map → chart-config-sankey-DgqKBFvN.js.map} +1 -1
  88. package/dist/client/chunks/{chart-config-scatter-MVUFupub.js → chart-config-scatter-D5nVLDvi.js} +2 -2
  89. package/dist/client/chunks/{chart-config-scatter-MVUFupub.js.map → chart-config-scatter-D5nVLDvi.js.map} +1 -1
  90. package/dist/client/chunks/{chart-config-sunburst-Z_gqIY5u.js → chart-config-sunburst-Ca3FX9nW.js} +2 -2
  91. package/dist/client/chunks/{chart-config-sunburst-Z_gqIY5u.js.map → chart-config-sunburst-Ca3FX9nW.js.map} +1 -1
  92. package/dist/client/chunks/{chart-config-tree-map-BD-xAeIy.js → chart-config-tree-map-Bjy4QNa3.js} +2 -2
  93. package/dist/client/chunks/{chart-config-tree-map-BD-xAeIy.js.map → chart-config-tree-map-Bjy4QNa3.js.map} +1 -1
  94. package/dist/client/chunks/{chart-config-waterfall-CHwVkXZc.js → chart-config-waterfall-C5K2eqR7.js} +2 -2
  95. package/dist/client/chunks/{chart-config-waterfall-CHwVkXZc.js.map → chart-config-waterfall-C5K2eqR7.js.map} +1 -1
  96. package/dist/client/chunks/{chart-data-table-BZ7StNWv.js → chart-data-table-2iCsn0CF.js} +1099 -933
  97. package/dist/client/chunks/chart-data-table-2iCsn0CF.js.map +1 -0
  98. package/dist/client/chunks/{chart-funnel-C9JRW79j.js → chart-funnel-poyOf7-e.js} +3 -3
  99. package/dist/client/chunks/{chart-funnel-C9JRW79j.js.map → chart-funnel-poyOf7-e.js.map} +1 -1
  100. package/dist/client/chunks/{chart-gauge-_Xdgk_qI.js → chart-gauge-D5J4gRky.js} +3 -3
  101. package/dist/client/chunks/{chart-gauge-_Xdgk_qI.js.map → chart-gauge-D5J4gRky.js.map} +1 -1
  102. package/dist/client/chunks/{chart-heat-map-BOMQeUDL.js → chart-heat-map-BAMVhLGG.js} +3 -3
  103. package/dist/client/chunks/{chart-heat-map-BOMQeUDL.js.map → chart-heat-map-BAMVhLGG.js.map} +1 -1
  104. package/dist/client/chunks/{chart-kpi-delta-C2tdpWki.js → chart-kpi-delta-KQjUIeal.js} +71 -73
  105. package/dist/client/chunks/{chart-kpi-delta-C2tdpWki.js.map → chart-kpi-delta-KQjUIeal.js.map} +1 -1
  106. package/dist/client/chunks/{chart-kpi-number-BUNKM7yg.js → chart-kpi-number-CsQgV_x3.js} +62 -63
  107. package/dist/client/chunks/{chart-kpi-number-BUNKM7yg.js.map → chart-kpi-number-CsQgV_x3.js.map} +1 -1
  108. package/dist/client/chunks/{chart-kpi-text-COF8iN0K.js → chart-kpi-text-BR0IyeUU.js} +26 -27
  109. package/dist/client/chunks/{chart-kpi-text-COF8iN0K.js.map → chart-kpi-text-BR0IyeUU.js.map} +1 -1
  110. package/dist/client/chunks/{chart-line-D3SEwXDS.js → chart-line-B5_WntY5.js} +4 -4
  111. package/dist/client/chunks/{chart-line-D3SEwXDS.js.map → chart-line-B5_WntY5.js.map} +1 -1
  112. package/dist/client/chunks/{chart-markdown-DMekYkKz.js → chart-markdown-B6bENbel.js} +2 -2
  113. package/dist/client/chunks/{chart-markdown-DMekYkKz.js.map → chart-markdown-B6bENbel.js.map} +1 -1
  114. package/dist/client/chunks/{chart-measure-profile-BPhI1Z9s.js → chart-measure-profile-yWk-obNb.js} +4 -4
  115. package/dist/client/chunks/{chart-measure-profile-BPhI1Z9s.js.map → chart-measure-profile-yWk-obNb.js.map} +1 -1
  116. package/dist/client/chunks/{chart-pie-COl3Rmdk.js → chart-pie-BodrUoHv.js} +4 -4
  117. package/dist/client/chunks/{chart-pie-COl3Rmdk.js.map → chart-pie-BodrUoHv.js.map} +1 -1
  118. package/dist/client/chunks/{chart-radar-BKZXylBB.js → chart-radar-gG3zfLud.js} +4 -4
  119. package/dist/client/chunks/{chart-radar-BKZXylBB.js.map → chart-radar-gG3zfLud.js.map} +1 -1
  120. package/dist/client/chunks/{chart-radial-bar-CMfC7SPd.js → chart-radial-bar-C2IPCV8c.js} +4 -4
  121. package/dist/client/chunks/{chart-radial-bar-CMfC7SPd.js.map → chart-radial-bar-C2IPCV8c.js.map} +1 -1
  122. package/dist/client/chunks/{chart-sankey-8nRYnupt.js → chart-sankey-BOyxfG1Q.js} +3 -3
  123. package/dist/client/chunks/{chart-sankey-8nRYnupt.js.map → chart-sankey-BOyxfG1Q.js.map} +1 -1
  124. package/dist/client/chunks/{chart-scatter-xQMa3dUt.js → chart-scatter-B8OwlsAX.js} +4 -4
  125. package/dist/client/chunks/{chart-scatter-xQMa3dUt.js.map → chart-scatter-B8OwlsAX.js.map} +1 -1
  126. package/dist/client/chunks/{chart-sunburst-BGhJ4fui.js → chart-sunburst-D9lGEOCc.js} +4 -4
  127. package/dist/client/chunks/{chart-sunburst-BGhJ4fui.js.map → chart-sunburst-D9lGEOCc.js.map} +1 -1
  128. package/dist/client/chunks/{chart-tree-map-Cn1pmrAw.js → chart-tree-map-DZaKy9he.js} +4 -4
  129. package/dist/client/chunks/{chart-tree-map-Cn1pmrAw.js.map → chart-tree-map-DZaKy9he.js.map} +1 -1
  130. package/dist/client/chunks/{chart-waterfall-C2nVN4pn.js → chart-waterfall-BCdUx4DC.js} +4 -4
  131. package/dist/client/chunks/{chart-waterfall-C2nVN4pn.js.map → chart-waterfall-BCdUx4DC.js.map} +1 -1
  132. package/dist/client/chunks/{charts-core-Cy3rHADX.js → charts-core-C5Yokk-x.js} +2 -2
  133. package/dist/client/chunks/{charts-core-Cy3rHADX.js.map → charts-core-C5Yokk-x.js.map} +1 -1
  134. package/dist/client/chunks/{core-BdWfCZ3y.js → core-DcfMGTVa.js} +2 -2
  135. package/dist/client/chunks/{core-BdWfCZ3y.js.map → core-DcfMGTVa.js.map} +1 -1
  136. package/dist/client/chunks/{dist-BWPE2m_X.js → dist-eZurnOde.js} +1 -1
  137. package/dist/client/chunks/{dist-BWPE2m_X.js.map → dist-eZurnOde.js.map} +1 -1
  138. package/dist/client/chunks/exceljs.min-CcjgM-qg.js +31986 -0
  139. package/dist/client/chunks/exceljs.min-CcjgM-qg.js.map +1 -0
  140. package/dist/client/chunks/{javascript-O1RIRkZr.js → javascript-DFvvCuoP.js} +1 -1
  141. package/dist/client/chunks/{javascript-O1RIRkZr.js.map → javascript-DFvvCuoP.js.map} +1 -1
  142. package/dist/client/chunks/{json-C5bX2tt1.js → json-BBm9TlrA.js} +1 -1
  143. package/dist/client/chunks/{json-C5bX2tt1.js.map → json-BBm9TlrA.js.map} +1 -1
  144. package/dist/client/chunks/{rolldown-runtime-lc2dmIiU.js → rolldown-runtime-CCl2IeXn.js} +5 -2
  145. package/dist/client/chunks/{schema-visualization-DVdfx6N8.js → schema-visualization-t1KiOORo.js} +261 -265
  146. package/dist/client/chunks/{schema-visualization-DVdfx6N8.js.map → schema-visualization-t1KiOORo.js.map} +1 -1
  147. package/dist/client/chunks/{sql-D2qikO5q.js → sql-k0GA6oZ_.js} +1 -1
  148. package/dist/client/chunks/{sql-D2qikO5q.js.map → sql-k0GA6oZ_.js.map} +1 -1
  149. package/dist/client/chunks/{syntaxHighlighting-BYYWYmjr.js → syntaxHighlighting-CnDujqwg.js} +2 -2
  150. package/dist/client/chunks/{syntaxHighlighting-BYYWYmjr.js.map → syntaxHighlighting-CnDujqwg.js.map} +1 -1
  151. package/dist/client/chunks/{useDebounce-Bel8J05v.js → useDebounce-CKqkM42n.js} +11 -14
  152. package/dist/client/chunks/{useDebounce-Bel8J05v.js.map → useDebounce-CKqkM42n.js.map} +1 -1
  153. package/dist/client/chunks/{useExplainAI-CxdzY2N0.js → useExplainAI-DBIfYwz-.js} +12 -12
  154. package/dist/client/chunks/{useExplainAI-CxdzY2N0.js.map → useExplainAI-DBIfYwz-.js.map} +1 -1
  155. package/dist/client/chunks/{utils-CMkS7h9x.js → utils--qCr8Yn5.js} +2 -2
  156. package/dist/client/chunks/utils--qCr8Yn5.js.map +1 -0
  157. package/dist/client/chunks/{vendor-BoWEubRu.js → vendor-BRlsCGnK.js} +46 -46
  158. package/dist/client/chunks/{vendor-BoWEubRu.js.map → vendor-BRlsCGnK.js.map} +1 -1
  159. package/dist/client/components.js +3 -3
  160. package/dist/client/hooks.js +3 -3
  161. package/dist/client/icons/types.d.ts +1 -0
  162. package/dist/client/icons.js +1 -1
  163. package/dist/client/index.d.ts +2 -1
  164. package/dist/client/index.js +168 -168
  165. package/dist/client/index.js.map +1 -1
  166. package/dist/client/providers.js +1 -1
  167. package/dist/client/schema.js +1 -1
  168. package/dist/client/types.d.ts +6 -0
  169. package/dist/client/utils/exportXlsx.d.ts +20 -0
  170. package/dist/client/utils/index.d.ts +1 -0
  171. package/dist/client/utils.js +7 -7
  172. package/dist/client-bundle-stats.html +1 -1
  173. package/dist/server/index.cjs +1 -1
  174. package/dist/server/index.js +1 -1
  175. package/dist/server/{openai-DqCEogm0.js → openai-CqZg6zYL.js} +1 -1
  176. package/dist/server/{openai-0HbLlZq6.cjs → openai-D9Zjuby1.cjs} +1 -1
  177. package/dist/{adapters/openai-C96O8M75.cjs → server/openai-DmuEbFd6.cjs} +1 -1
  178. package/dist/server/{openai-DnGeU9PT.js → openai-rwauPzCT.js} +1 -1
  179. package/package.json +6 -1
  180. package/dist/adapters/mcp-transport-ro4OL4BW.cjs +0 -255
  181. package/dist/client/chunks/DashboardEditModal-4zzjtZRR.js.map +0 -1
  182. package/dist/client/chunks/chart-data-table-BZ7StNWv.js.map +0 -1
  183. package/dist/client/chunks/utils-CMkS7h9x.js.map +0 -1
package/README.md CHANGED
@@ -94,7 +94,7 @@ const app = createCubeApp({
94
94
  cubes: [employeesCube, departmentsCube],
95
95
  drizzle: db,
96
96
  schema,
97
- getSecurityContext: async (req) => ({
97
+ extractSecurityContext: async (req) => ({
98
98
  organisationId: req.user.orgId // Multi-tenant isolation
99
99
  })
100
100
  })
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-2MwxiQ2o.cjs`),t=require(`../mcp-transport-ro4OL4BW.cjs`);let n=require(`express`);n=e.g(n);let r=require(`cors`);r=e.g(r);function i(i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,jsonLimit:f=`10mb`,cache:p,mcp:m={enabled:!0},agent:h}=i;if(!a||a.length===0)throw Error(`At least one cube must be provided in the cubes array`);let g=(0,n.Router)();u&&g.use((0,r.default)(u)),g.use(n.default.json({limit:f})),g.use(n.default.urlencoded({extended:!0,limit:f}));let _=new t.h({drizzle:o,schema:s,engineType:l,cache:p,rlsSetup:i.rlsSetup});if(a.forEach(e=>{_.registerCube(e)}),g.post(`${d}/load`,async(t,n)=>{try{let r=t.body.query||t.body,i=await c(t,n),a=_.validateQuery(r);if(!a.isValid)return n.status(400).json(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=t.headers[`x-cache-control`]===`no-cache`,s=await _.executeMultiCubeQuery(r,i,{skipCache:o});n.json(e.r(r,s,_))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),g.get(`${d}/load`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json(e.i(`Query parameter is required`,400));let i;try{i=JSON.parse(r)}catch{return n.status(400).json(e.i(`Invalid JSON in query parameter`,400))}let a=await c(t,n),o=_.validateQuery(i);if(!o.isValid)return n.status(400).json(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`,l=await _.executeMultiCubeQuery(i,a,{skipCache:s});n.json(e.r(i,l,_))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),g.post(`${d}/batch`,async(t,n)=>{try{let{queries:r}=t.body;if(!r||!Array.isArray(r))return n.status(400).json(e.i(`Request body must contain a "queries" array`,400));if(r.length===0)return n.status(400).json(e.i(`Queries array cannot be empty`,400));let i=await e.u(r,await c(t,n),_,{skipCache:t.headers[`x-cache-control`]===`no-cache`});n.json(i)}catch(t){console.error(`Batch execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Batch execution failed`,500))}}),g.get(`${d}/meta`,(t,n)=>{try{let t=_.getMetadata();n.json(e.a(t))}catch(t){console.error(`Metadata error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500))}}),g.post(`${d}/sql`,async(t,n)=>{try{let r=t.body,i=await c(t,n),a=_.validateQuery(r);if(!a.isValid)return n.status(400).json(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return n.status(400).json(e.i(`No measures or dimensions specified`,400));let s=o.split(`.`)[0],l=await _.generateSQL(s,r,i);n.json(e.o(r,l))}catch(t){console.error(`SQL generation error:`,String(t).replace(/\n|\r/g,``)),n.status(500).json(e.i(t instanceof Error?t.message:`SQL generation failed`,500))}}),g.get(`${d}/sql`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json(e.i(`Query parameter is required`,400));let i=JSON.parse(r),a=await c(t,n),o=_.validateQuery(i);if(!o.isValid)return n.status(400).json(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=i.measures?.[0]||i.dimensions?.[0];if(!s)return n.status(400).json(e.i(`No measures or dimensions specified`,400));let l=s.split(`.`)[0],u=await _.generateSQL(l,i,a);n.json(e.o(i,u))}catch(t){console.error(`SQL generation error:`,String(t).replace(/\n|\r/g,``)),n.status(500).json(e.i(t instanceof Error?t.message:`SQL generation failed`,500))}}),g.post(`${d}/dry-run`,async(t,n)=>{try{let r=await e.f(t.body.query||t.body,await c(t,n),_);n.json(r)}catch(e){console.error(`Dry-run error:`,e),n.status(400).json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),g.get(`${d}/dry-run`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json({error:`Query parameter is required`,valid:!1});let i=await e.f(JSON.parse(r),await c(t,n),_);n.json(i)}catch(e){console.error(`Dry-run error:`,e),n.status(400).json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),g.post(`${d}/explain`,async(e,t)=>{try{let n=e.body.query||e.body,r=e.body.options||{},i=await c(e,t),a=_.validateQuery(n);if(!a.isValid)return t.status(400).json({error:`Query validation failed: ${a.errors.join(`, `)}`});let o=await _.explainQuery(n,i,r);t.json(o)}catch(e){console.error(`Explain error:`,e),t.status(500).json({error:e instanceof Error?e.message:`Explain query failed`})}}),h&&g.post(`${d}/agent/chat`,async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-dHHEEbG9.cjs`)),{message:r,sessionId:i,history:a}=e.body;if(!r||typeof r!=`string`)return t.status(400).json({error:`message is required and must be a string`});let o=(h.apiKey||``).trim();if(h.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(o=t.trim())}if(!o)return t.status(401).json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let s=h.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,l=h.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=h.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,d=await c(e,t),f=h.buildSystemContext?.(d);t.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:r,sessionId:i,history:a,semanticLayer:_,securityContext:d,agentConfig:h,apiKey:o,systemContext:f,providerOverride:s,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`})}}),m.enabled!==!1){let e=m.basePath??`/mcp`;g.post(`${e}`,async(e,n)=>{let r=t.p(e.headers.origin,m.allowedOrigins?{allowedOrigins:m.allowedOrigins}:{});if(!r.valid)return n.status(403).json(t.n(null,-32600,r.reason));let i=e.headers.accept;if(!t.f(i))return n.status(400).json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=t.c(e.headers);if(!a.ok)return n.status(426).json({error:`Unsupported MCP protocol version`,supported:a.supported});let o=t.l(e.body);if(!o)return n.status(400).json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=t.m(i),l=o.method===`initialize`;try{let r=await t.i(o.method,o.params,{semanticLayer:_,extractSecurityContext:c,rawRequest:e,rawResponse:n,negotiatedProtocol:a.negotiated});if(t.s(o))return n.status(202).end();let i=l&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&n.setHeader(t.t,i);let u=t.r(o.id??null,r);if(s){let e=t.u();return n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(`id: ${e}\n\n`),n.write(t.d(u,e)),n.end()}return n.json(u)}catch(e){if(t.s(o))return console.error(`MCP notification processing error:`,String(e).replace(/\n|\r/g,``)),n.status(202).end();console.error(`MCP RPC error:`,String(e).replace(/\n|\r/g,``));let r=e?.code??-32603,i=e?.data,a=e.message||`MCP request failed`,c=t.n(o.id??null,r,a,i);if(s){let e=t.u();return n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(`id: ${e}\n\n`),n.write(t.d(c,e)),n.end()}return n.status(200).json(c)}}),g.get(`${e}`,async(e,n)=>{let r=t.u();n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{n.write(`: keep-alive
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-2MwxiQ2o.cjs`),t=require(`../mcp-transport-mmuPvjfR.cjs`);let n=require(`express`);n=e.g(n);let r=require(`cors`);r=e.g(r);function i(i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,jsonLimit:f=`10mb`,cache:p,mcp:m={enabled:!0},agent:h}=i;if(!a||a.length===0)throw Error(`At least one cube must be provided in the cubes array`);let g=(0,n.Router)();u&&g.use((0,r.default)(u)),g.use(n.default.json({limit:f})),g.use(n.default.urlencoded({extended:!0,limit:f}));let _=new t.h({drizzle:o,schema:s,engineType:l,cache:p,rlsSetup:i.rlsSetup});if(a.forEach(e=>{_.registerCube(e)}),g.post(`${d}/load`,async(t,n)=>{try{let r=t.body.query||t.body,i=await c(t,n),a=_.validateQuery(r);if(!a.isValid)return n.status(400).json(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=t.headers[`x-cache-control`]===`no-cache`,s=await _.executeMultiCubeQuery(r,i,{skipCache:o});n.json(e.r(r,s,_))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),g.get(`${d}/load`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json(e.i(`Query parameter is required`,400));let i;try{i=JSON.parse(r)}catch{return n.status(400).json(e.i(`Invalid JSON in query parameter`,400))}let a=await c(t,n),o=_.validateQuery(i);if(!o.isValid)return n.status(400).json(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`,l=await _.executeMultiCubeQuery(i,a,{skipCache:s});n.json(e.r(i,l,_))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),g.post(`${d}/batch`,async(t,n)=>{try{let{queries:r}=t.body;if(!r||!Array.isArray(r))return n.status(400).json(e.i(`Request body must contain a "queries" array`,400));if(r.length===0)return n.status(400).json(e.i(`Queries array cannot be empty`,400));let i=await e.u(r,await c(t,n),_,{skipCache:t.headers[`x-cache-control`]===`no-cache`});n.json(i)}catch(t){console.error(`Batch execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Batch execution failed`,500))}}),g.get(`${d}/meta`,(t,n)=>{try{let t=_.getMetadata();n.json(e.a(t))}catch(t){console.error(`Metadata error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500))}}),g.post(`${d}/sql`,async(t,n)=>{try{let r=t.body,i=await c(t,n),a=_.validateQuery(r);if(!a.isValid)return n.status(400).json(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return n.status(400).json(e.i(`No measures or dimensions specified`,400));let s=o.split(`.`)[0],l=await _.generateSQL(s,r,i);n.json(e.o(r,l))}catch(t){console.error(`SQL generation error:`,String(t).replace(/\n|\r/g,``)),n.status(500).json(e.i(t instanceof Error?t.message:`SQL generation failed`,500))}}),g.get(`${d}/sql`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json(e.i(`Query parameter is required`,400));let i=JSON.parse(r),a=await c(t,n),o=_.validateQuery(i);if(!o.isValid)return n.status(400).json(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=i.measures?.[0]||i.dimensions?.[0];if(!s)return n.status(400).json(e.i(`No measures or dimensions specified`,400));let l=s.split(`.`)[0],u=await _.generateSQL(l,i,a);n.json(e.o(i,u))}catch(t){console.error(`SQL generation error:`,String(t).replace(/\n|\r/g,``)),n.status(500).json(e.i(t instanceof Error?t.message:`SQL generation failed`,500))}}),g.post(`${d}/dry-run`,async(t,n)=>{try{let r=await e.f(t.body.query||t.body,await c(t,n),_);n.json(r)}catch(e){console.error(`Dry-run error:`,e),n.status(400).json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),g.get(`${d}/dry-run`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json({error:`Query parameter is required`,valid:!1});let i=await e.f(JSON.parse(r),await c(t,n),_);n.json(i)}catch(e){console.error(`Dry-run error:`,e),n.status(400).json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),g.post(`${d}/explain`,async(e,t)=>{try{let n=e.body.query||e.body,r=e.body.options||{},i=await c(e,t),a=_.validateQuery(n);if(!a.isValid)return t.status(400).json({error:`Query validation failed: ${a.errors.join(`, `)}`});let o=await _.explainQuery(n,i,r);t.json(o)}catch(e){console.error(`Explain error:`,e),t.status(500).json({error:e instanceof Error?e.message:`Explain query failed`})}}),h&&g.post(`${d}/agent/chat`,async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-BneUGY0k.cjs`)),{message:r,sessionId:i,history:a}=e.body;if(!r||typeof r!=`string`)return t.status(400).json({error:`message is required and must be a string`});let o=(h.apiKey||``).trim();if(h.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(o=t.trim())}if(!o)return t.status(401).json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let s=h.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,l=h.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=h.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,d=await c(e,t),f=h.buildSystemContext?.(d);t.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:r,sessionId:i,history:a,semanticLayer:_,securityContext:d,agentConfig:h,apiKey:o,systemContext:f,providerOverride:s,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`})}}),m.enabled!==!1){let e=m.basePath??`/mcp`;g.post(`${e}`,async(e,n)=>{let r=t.p(e.headers.origin,m.allowedOrigins?{allowedOrigins:m.allowedOrigins}:{});if(!r.valid)return n.status(403).json(t.n(null,-32600,r.reason));let i=e.headers.accept;if(!t.f(i))return n.status(400).json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=t.c(e.headers);if(!a.ok)return n.status(426).json({error:`Unsupported MCP protocol version`,supported:a.supported});let o=t.l(e.body);if(!o)return n.status(400).json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=t.m(i),l=o.method===`initialize`;try{let r=await t.i(o.method,o.params,{semanticLayer:_,extractSecurityContext:c,rawRequest:e,rawResponse:n,negotiatedProtocol:a.negotiated});if(t.s(o))return n.status(202).end();let i=l&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&n.setHeader(t.t,i);let u=t.r(o.id??null,r);if(s){let e=t.u();return n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(`id: ${e}\n\n`),n.write(t.d(u,e)),n.end()}return n.json(u)}catch(e){if(t.s(o))return console.error(`MCP notification processing error:`,String(e).replace(/\n|\r/g,``)),n.status(202).end();console.error(`MCP RPC error:`,String(e).replace(/\n|\r/g,``));let r=e?.code??-32603,i=e?.data,a=e.message||`MCP request failed`,c=t.n(o.id??null,r,a,i);if(s){let e=t.u();return n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(`id: ${e}\n\n`),n.write(t.d(c,e)),n.end()}return n.status(200).json(c)}}),g.get(`${e}`,async(e,n)=>{let r=t.u();n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{n.write(`: keep-alive
2
2
 
3
3
  `)},15e3);e.on(`close`,()=>{clearInterval(i)})}),g.delete(`${e}`,(e,t)=>t.status(405).json({error:`Session termination not supported`}))}return g.use((t,n,r,i)=>{console.error(`Express adapter error:`,t),r.headersSent||r.status(500).json(e.i(t,500))}),g}function a(e,t){let n=i(t);return e.use(`/`,n),e}function o(e){return a((0,n.default)(),e)}exports.createCubeApp=o,exports.createCubeRouter=i,exports.mountCubeRoutes=a;
@@ -1,5 +1,5 @@
1
1
  import { a as e, f as t, i as n, o as r, r as i, u as a } from "../utils-_2o905Fi.js";
2
- import { c as o, d as s, f as c, h as l, i as u, l as d, m as f, n as p, p as m, r as h, s as g, t as _, u as v } from "../mcp-transport-tB5a7Het.js";
2
+ import { c as o, d as s, f as c, h as l, i as u, l as d, m as f, n as p, p as m, r as h, s as g, t as _, u as v } from "../mcp-transport-CC3hQOnb.js";
3
3
  import y, { Router as b } from "express";
4
4
  import x from "cors";
5
5
  //#region src/adapters/express/index.ts
@@ -123,7 +123,7 @@ function S(S) {
123
123
  }
124
124
  }), N && P.post(`${k}/agent/chat`, async (e, t) => {
125
125
  try {
126
- let { handleAgentChat: n } = await import("../handler-fto6TSVn.js"), { message: r, sessionId: i, history: a } = e.body;
126
+ let { handleAgentChat: n } = await import("../handler-CiQoQsnP.js"), { message: r, sessionId: i, history: a } = e.body;
127
127
  if (!r || typeof r != "string") return t.status(400).json({ error: "message is required and must be a string" });
128
128
  let o = (N.apiKey || "").trim();
129
129
  if (N.allowClientApiKey) {
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-2MwxiQ2o.cjs`),t=require(`../mcp-transport-ro4OL4BW.cjs`);var n=function(n,r,i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,bodyLimit:f=10485760,cache:p,mcp:m={enabled:!0},agent:h}=r;if(!a||a.length===0)return i(Error(`At least one cube must be provided in the cubes array`));u&&n.register(import(`@fastify/cors`),u),n.addHook(`onRequest`,async(e,t)=>{e.method===`POST`&&(e.body=void 0)});let g=new t.h({drizzle:o,schema:s,engineType:l,cache:p,rlsSetup:r.rlsSetup});if(a.forEach(e=>{g.registerCube(e)}),n.post(`${d}/load`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=r.query||r,a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`;return e.r(i,await g.executeMultiCubeQuery(i,a,{skipCache:s}),g)}catch(r){return t.log.error(r,`Query execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Query execution failed`,500))}}),n.get(`${d}/load`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:r}=t.query,i;try{i=JSON.parse(r)}catch{return n.status(400).send(e.i(`Invalid JSON in query parameter`,400))}let a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`,l=await g.executeMultiCubeQuery(i,a,{skipCache:s});return e.r(i,l,g)}catch(r){return t.log.error(r,`Query execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Query execution failed`,500))}}),n.post(`${d}/batch`,{bodyLimit:f,schema:{body:{type:`object`,required:[`queries`],properties:{queries:{type:`array`,items:{type:`object`}}}}}},async(t,n)=>{try{let{queries:r}=t.body;return!r||!Array.isArray(r)?n.status(400).send(e.i(`Request body must contain a "queries" array`,400)):r.length===0?n.status(400).send(e.i(`Queries array cannot be empty`,400)):await e.u(r,await c(t),g,{skipCache:t.headers[`x-cache-control`]===`no-cache`})}catch(r){return t.log.error(r,`Batch execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Batch execution failed`,500))}}),n.get(`${d}/meta`,async(t,n)=>{try{return e.a(g.getMetadata())}catch(r){return t.log.error(r,`Metadata error`),n.status(500).send(e.i(r instanceof Error?r.message:`Failed to fetch metadata`,500))}}),n.post(`${d}/sql`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=await c(t),a=g.validateQuery(r);if(!a.isValid)return n.status(400).send(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return n.status(400).send(e.i(`No measures or dimensions specified`,400));let s=o.split(`.`)[0];return e.o(r,await g.generateSQL(s,r,i))}catch(r){return t.log.error({err:String(r).replace(/\n|\r/g,``)},`SQL generation error`),n.status(500).send(e.i(r instanceof Error?r.message:`SQL generation failed`,500))}}),n.get(`${d}/sql`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:r}=t.query,i=JSON.parse(r),a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=i.measures?.[0]||i.dimensions?.[0];if(!s)return n.status(400).send(e.i(`No measures or dimensions specified`,400));let l=s.split(`.`)[0];return e.o(i,await g.generateSQL(l,i,a))}catch(r){return t.log.error({err:String(r).replace(/\n|\r/g,``)},`SQL generation error`),n.status(500).send(e.i(r instanceof Error?r.message:`SQL generation failed`,500))}}),n.post(`${d}/dry-run`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let n=t.body;return await e.f(n.query||n,await c(t),g)}catch(e){return t.log.error(e,`Dry-run error`),n.status(400).send({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),n.get(`${d}/dry-run`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:n}=t.query;return await e.f(JSON.parse(n),await c(t),g)}catch(e){return t.log.error(e,`Dry-run error`),n.status(400).send({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),n.post(`${d}/explain`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let n=e.body,r=n.query||n,i=n.options||{},a=await c(e),o=g.validateQuery(r);return o.isValid?await g.explainQuery(r,a,i):t.status(400).send({error:`Query validation failed: ${o.errors.join(`, `)}`})}catch(n){return e.log.error(n,`Explain error`),t.status(500).send({error:n instanceof Error?n.message:`Explain query failed`})}}),h&&n.post(`${d}/agent/chat`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-dHHEEbG9.cjs`)),{message:r,sessionId:i,history:a}=e.body;if(!r||typeof r!=`string`)return t.status(400).send({error:`message is required and must be a string`});let o=(h.apiKey||``).trim();if(h.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(o=t.trim())}if(!o)return t.status(401).send({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let s=h.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,l=h.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=h.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,d=await c(e),f=h.buildSystemContext?.(d);t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:r,sessionId:i,history:a,semanticLayer:g,securityContext:d,agentConfig:h,apiKey:o,systemContext:f,providerOverride:s,modelOverride:l,baseURLOverride:u});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`})}}),m.enabled!==!1){let e=m.basePath??`/mcp`;n.post(`${e}`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,n)=>{let r=t.p(e.headers.origin,m.allowedOrigins?{allowedOrigins:m.allowedOrigins}:{});if(!r.valid)return n.status(403).send(t.n(null,-32600,r.reason));let i=e.headers.accept;if(!t.f(i))return n.status(400).send(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=t.c(e.headers);if(!a.ok)return n.status(426).send({error:`Unsupported MCP protocol version`,supported:a.supported});let o=t.l(e.body);if(!o)return n.status(400).send(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=t.m(i),l=o.method===`initialize`;try{let r=await t.i(o.method,o.params,{semanticLayer:g,extractSecurityContext:c,rawRequest:e,rawResponse:n,negotiatedProtocol:a.negotiated});if(t.s(o))return n.status(202).send();let i=l&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&n.header(t.t,i);let u=t.r(o.id??null,r);if(s){let e=t.u();n.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${t.d(u,e)}`);return}return n.send(u)}catch(r){if(t.s(o))return e.log.error({err:String(r).replace(/\n|\r/g,``)},`MCP notification processing error`),n.status(202).send();e.log.error({err:String(r).replace(/\n|\r/g,``)},`MCP RPC error`);let i=r?.code??-32603,a=r?.data,c=r.message||`MCP request failed`,l=t.n(o.id??null,i,c,a);if(s){let e=t.u();n.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${t.d(l,e)}`);return}return n.send(l)}}),n.get(`${e}`,async(e,n)=>{let r=t.u();n.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),n.raw.write(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{n.raw.write(`: keep-alive
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-2MwxiQ2o.cjs`),t=require(`../mcp-transport-mmuPvjfR.cjs`);var n=function(n,r,i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,bodyLimit:f=10485760,cache:p,mcp:m={enabled:!0},agent:h}=r;if(!a||a.length===0)return i(Error(`At least one cube must be provided in the cubes array`));u&&n.register(import(`@fastify/cors`),u),n.addHook(`onRequest`,async(e,t)=>{e.method===`POST`&&(e.body=void 0)});let g=new t.h({drizzle:o,schema:s,engineType:l,cache:p,rlsSetup:r.rlsSetup});if(a.forEach(e=>{g.registerCube(e)}),n.post(`${d}/load`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=r.query||r,a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`;return e.r(i,await g.executeMultiCubeQuery(i,a,{skipCache:s}),g)}catch(r){return t.log.error(r,`Query execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Query execution failed`,500))}}),n.get(`${d}/load`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:r}=t.query,i;try{i=JSON.parse(r)}catch{return n.status(400).send(e.i(`Invalid JSON in query parameter`,400))}let a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`,l=await g.executeMultiCubeQuery(i,a,{skipCache:s});return e.r(i,l,g)}catch(r){return t.log.error(r,`Query execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Query execution failed`,500))}}),n.post(`${d}/batch`,{bodyLimit:f,schema:{body:{type:`object`,required:[`queries`],properties:{queries:{type:`array`,items:{type:`object`}}}}}},async(t,n)=>{try{let{queries:r}=t.body;return!r||!Array.isArray(r)?n.status(400).send(e.i(`Request body must contain a "queries" array`,400)):r.length===0?n.status(400).send(e.i(`Queries array cannot be empty`,400)):await e.u(r,await c(t),g,{skipCache:t.headers[`x-cache-control`]===`no-cache`})}catch(r){return t.log.error(r,`Batch execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Batch execution failed`,500))}}),n.get(`${d}/meta`,async(t,n)=>{try{return e.a(g.getMetadata())}catch(r){return t.log.error(r,`Metadata error`),n.status(500).send(e.i(r instanceof Error?r.message:`Failed to fetch metadata`,500))}}),n.post(`${d}/sql`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=await c(t),a=g.validateQuery(r);if(!a.isValid)return n.status(400).send(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return n.status(400).send(e.i(`No measures or dimensions specified`,400));let s=o.split(`.`)[0];return e.o(r,await g.generateSQL(s,r,i))}catch(r){return t.log.error({err:String(r).replace(/\n|\r/g,``)},`SQL generation error`),n.status(500).send(e.i(r instanceof Error?r.message:`SQL generation failed`,500))}}),n.get(`${d}/sql`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:r}=t.query,i=JSON.parse(r),a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=i.measures?.[0]||i.dimensions?.[0];if(!s)return n.status(400).send(e.i(`No measures or dimensions specified`,400));let l=s.split(`.`)[0];return e.o(i,await g.generateSQL(l,i,a))}catch(r){return t.log.error({err:String(r).replace(/\n|\r/g,``)},`SQL generation error`),n.status(500).send(e.i(r instanceof Error?r.message:`SQL generation failed`,500))}}),n.post(`${d}/dry-run`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let n=t.body;return await e.f(n.query||n,await c(t),g)}catch(e){return t.log.error(e,`Dry-run error`),n.status(400).send({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),n.get(`${d}/dry-run`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:n}=t.query;return await e.f(JSON.parse(n),await c(t),g)}catch(e){return t.log.error(e,`Dry-run error`),n.status(400).send({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),n.post(`${d}/explain`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let n=e.body,r=n.query||n,i=n.options||{},a=await c(e),o=g.validateQuery(r);return o.isValid?await g.explainQuery(r,a,i):t.status(400).send({error:`Query validation failed: ${o.errors.join(`, `)}`})}catch(n){return e.log.error(n,`Explain error`),t.status(500).send({error:n instanceof Error?n.message:`Explain query failed`})}}),h&&n.post(`${d}/agent/chat`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-BneUGY0k.cjs`)),{message:r,sessionId:i,history:a}=e.body;if(!r||typeof r!=`string`)return t.status(400).send({error:`message is required and must be a string`});let o=(h.apiKey||``).trim();if(h.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(o=t.trim())}if(!o)return t.status(401).send({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let s=h.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,l=h.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=h.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,d=await c(e),f=h.buildSystemContext?.(d);t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:r,sessionId:i,history:a,semanticLayer:g,securityContext:d,agentConfig:h,apiKey:o,systemContext:f,providerOverride:s,modelOverride:l,baseURLOverride:u});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`})}}),m.enabled!==!1){let e=m.basePath??`/mcp`;n.post(`${e}`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,n)=>{let r=t.p(e.headers.origin,m.allowedOrigins?{allowedOrigins:m.allowedOrigins}:{});if(!r.valid)return n.status(403).send(t.n(null,-32600,r.reason));let i=e.headers.accept;if(!t.f(i))return n.status(400).send(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=t.c(e.headers);if(!a.ok)return n.status(426).send({error:`Unsupported MCP protocol version`,supported:a.supported});let o=t.l(e.body);if(!o)return n.status(400).send(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=t.m(i),l=o.method===`initialize`;try{let r=await t.i(o.method,o.params,{semanticLayer:g,extractSecurityContext:c,rawRequest:e,rawResponse:n,negotiatedProtocol:a.negotiated});if(t.s(o))return n.status(202).send();let i=l&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&n.header(t.t,i);let u=t.r(o.id??null,r);if(s){let e=t.u();n.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${t.d(u,e)}`);return}return n.send(u)}catch(r){if(t.s(o))return e.log.error({err:String(r).replace(/\n|\r/g,``)},`MCP notification processing error`),n.status(202).send();e.log.error({err:String(r).replace(/\n|\r/g,``)},`MCP RPC error`);let i=r?.code??-32603,a=r?.data,c=r.message||`MCP request failed`,l=t.n(o.id??null,i,c,a);if(s){let e=t.u();n.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${t.d(l,e)}`);return}return n.send(l)}}),n.get(`${e}`,async(e,n)=>{let r=t.u();n.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),n.raw.write(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{n.raw.write(`: keep-alive
2
2
 
3
3
  `)},15e3);e.raw.on(`close`,()=>{clearInterval(i)})}),n.delete(`${e}`,async(e,t)=>t.status(405).send({error:`Session termination not supported`}))}n.setErrorHandler(async(t,n,r)=>(n.log.error(t,`Fastify cube adapter error`),r.statusCode<400&&r.status(500),e.i(t instanceof Error?t:String(t),r.statusCode))),i()};async function r(e,t){await e.register(n,t)}function i(e){let t=require(`fastify`)({logger:!0});return t.register(n,e),t}exports.createCubeApp=i,exports.cubePlugin=n,exports.registerCubeRoutes=r;
@@ -1,5 +1,5 @@
1
1
  import { a as e, f as t, g as n, i as r, o as i, r as a, u as o } from "../utils-_2o905Fi.js";
2
- import { c as s, d as c, f as l, h as u, i as d, l as f, m as p, n as m, p as h, r as g, s as _, t as v, u as y } from "../mcp-transport-tB5a7Het.js";
2
+ import { c as s, d as c, f as l, h as u, i as d, l as f, m as p, n as m, p as h, r as g, s as _, t as v, u as y } from "../mcp-transport-CC3hQOnb.js";
3
3
  //#region src/adapters/fastify/index.ts
4
4
  var b = function(n, b, x) {
5
5
  let { cubes: S, drizzle: C, schema: w, extractSecurityContext: T, engineType: E, cors: D, basePath: O = "/cubejs-api/v1", bodyLimit: k = 10485760, cache: A, mcp: j = { enabled: !0 }, agent: M } = b;
@@ -156,7 +156,7 @@ var b = function(n, b, x) {
156
156
  } }
157
157
  }, async (e, t) => {
158
158
  try {
159
- let { handleAgentChat: n } = await import("../handler-fto6TSVn.js"), { message: r, sessionId: i, history: a } = e.body;
159
+ let { handleAgentChat: n } = await import("../handler-CiQoQsnP.js"), { message: r, sessionId: i, history: a } = e.body;
160
160
  if (!r || typeof r != "string") return t.status(400).send({ error: "message is required and must be a string" });
161
161
  let o = (M.apiKey || "").trim();
162
162
  if (M.allowClientApiKey) {
@@ -22,4 +22,4 @@ The query is validated before adding. The portlet fetches its own data.`,paramet
22
22
  [IMPORTANT: Your next response MUST start with a brief text message BEFORE any tool calls. Now call add_markdown and add_portlet to visualize these results.]`}}catch(e){let n={measures:t.measures,dimensions:t.dimensions,filters:t.filters,timeDimensions:t.timeDimensions,order:t.order,limit:t.limit,...t.funnel?{funnel:t.funnel}:{},...t.flow?{flow:t.flow}:{},...t.retention?{retention:t.retention}:{}};return{result:`Query execution failed: ${e instanceof Error?e.message:`Unknown error`}\n\nAttempted query:\n${JSON.stringify(n,null,2)}`,isError:!0}}}),i.set(`add_portlet`,async e=>{let t={number:`kpiNumber`,retention:`retentionHeatmap`}[e.chartType]??e.chartType,r;try{r=JSON.parse(e.query)}catch{return{result:"Invalid query: could not parse JSON string. Ensure `query` is a valid JSON string.",isError:!0}}let i=n.validateQuery(r);if(!i.isValid)return{result:`Invalid query — fix these errors and retry:\n${i.errors.join(`
23
23
  `)}\n\nAttempted query:\n${JSON.stringify(r,null,2)}`,isError:!0};let a=!!(r.funnel||r.flow||r.retention),c;if(a)c=e.chartConfig??{};else{let n=s(t,e.chartConfig,r),i=o(t,n,r);if(!i.isValid)return{result:`Chart config invalid — fix these errors and retry:\n${i.errors.join(`
24
24
  `)}`,isError:!0};c=n}let l=`portlet-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,u={id:l,title:e.title,query:e.query,chartType:t,chartConfig:c,displayConfig:e.displayConfig};return{result:`Portlet "${e.title}" added to notebook (id: ${l}, chart: ${t}). [Reminder: in your next response, start with a brief sentence about what you will do next BEFORE making any tool calls.]`,sideEffect:{type:`add_portlet`,data:u}}}),i.set(`add_markdown`,async e=>{let t=`markdown-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,n=e.content||e.text||e.markdown||``,r={id:t,title:e.title,content:n};return{result:`Markdown block added to notebook (id: ${t}). [Reminder: in your next response, start with a brief sentence about what you will do next BEFORE making any tool calls.]`,sideEffect:{type:`add_markdown`,data:r}}}),i.set(`save_as_dashboard`,async e=>{try{let t=e.portlets;if(!t||t.length===0)return{result:`Dashboard must contain at least one portlet.`,isError:!0};let r=[];for(let e of t){if(e.chartType===`markdown`)continue;let t=e.query;if(!t){r.push(`Portlet "${e.title}": missing query`);continue}let i;try{i=JSON.parse(t)}catch{r.push(`Portlet "${e.title}": invalid JSON query`);continue}let a=n.validateQuery(i);a.isValid||r.push(`Portlet "${e.title}": ${a.errors.join(`, `)}`)}if(r.length>0)return{result:`Dashboard has invalid portlets — fix these errors and retry:\n${r.join(`
25
- `)}`,isError:!0};let i={portlets:t.map(e=>{let t=e.chartType,n=t===`markdown`,r=n?`query`:e.analysisType||`query`,i=r===`funnel`?`funnel`:r===`flow`?`flow`:r===`retention`?`retention`:`query`,a=e.query||`{}`,o;try{o=JSON.parse(a)}catch{o={}}let s={version:1,analysisType:i,activeView:`chart`,charts:{[i]:{chartType:t,chartConfig:e.chartConfig||{},displayConfig:e.displayConfig||{}}},query:n?{}:o};return{id:e.id,title:e.title,analysisConfig:s,dashboardFilterMapping:e.dashboardFilterMapping,w:e.w,h:e.h,x:e.x,y:e.y}}),filters:e.filters,colorPalette:e.colorPalette},a=e.title;return{result:`Dashboard "${a}" created with ${i.portlets.length} portlets and ${i.filters?.length||0} filters.`,sideEffect:{type:`dashboard_saved`,data:{title:a,description:e.description,dashboardConfig:i}}}}catch(e){return{result:`Failed to save dashboard: ${e instanceof Error?e.message:`Unknown error`}`,isError:!0}}}),i}async function f(e,t,n){switch(e){case`anthropic`:{let{AnthropicProvider:e}=await Promise.resolve().then(()=>require(`./anthropic-BIva8k1r.cjs`));return new e(t)}case`openai`:{let{OpenAIProvider:e}=await Promise.resolve().then(()=>require(`./openai-Bc8qwEKW.cjs`));return new e(t,n)}case`google`:{let{GoogleProvider:e}=await Promise.resolve().then(()=>require(`./google-Dgo9-Kb5.cjs`));return new e(t)}default:throw Error(`Unknown LLM provider: "${e}". Supported providers: anthropic, openai, google`)}}var p={anthropic:`claude-sonnet-4-6`,openai:`gpt-4.1-mini`,google:`gemini-3-flash-preview`};async function*m(e){let{message:t,history:n,semanticLayer:r,securityContext:a,agentConfig:o,apiKey:s}=e,c=e.sessionId||crypto.randomUUID(),l=o.observability,m=crypto.randomUUID(),h=Date.now(),g=e.providerOverride||o.provider||`anthropic`,_=e.modelOverride||o.model||p[g]||`claude-sonnet-4-6`,v=e.baseURLOverride||o.baseURL,y=o.maxTurns||25,b=o.maxTokens||4096,x;try{x=await f(g,s,{baseURL:v})}catch(e){console.error(`[agent] Failed to create %s provider: %s`,String(g).replace(/\n|\r/g,``),String(e instanceof Error?e.message:e).replace(/\n|\r/g,``)),yield{type:`error`,data:{message:e instanceof Error?e.message:`Failed to initialize LLM provider`}};return}let S=u(),C=d({semanticLayer:r,securityContext:a}),w=i(r.getMetadata());e.systemContext&&(w+=`\n\n## User Context\n\n${e.systemContext}`);try{l?.onChatStart?.({traceId:m,sessionId:c,message:t,model:_,historyLength:n?.length??0})}catch{}let T=[];if(n&&n.length>0){for(let e of n)if(e.role===`user`)T.push({role:`user`,content:e.content});else if(e.role===`assistant`){let t=[];if(e.content&&t.push({type:`text`,text:e.content}),e.toolCalls&&e.toolCalls.length>0){for(let n of e.toolCalls)t.push({type:`tool_use`,id:n.id,name:n.name,input:n.input||{}});T.push({role:`assistant`,content:t});let n=e.toolCalls.map(e=>({toolUseId:e.id,toolName:e.name,content:typeof e.result==`string`?e.result:JSON.stringify(e.result??``),isError:e.status===`error`})),r=x.formatToolResults(n);if(Array.isArray(r))for(let e of r)T.push(e);else T.push(r)}else t.length>0&&T.push({role:`assistant`,content:e.content})}}T.push({role:`user`,content:t});let E=0;try{for(let e=0;e<y;e++){E=e+1;let t=await x.createStream({model:_,maxTokens:b,system:w,tools:S,messages:T}),n=[],r=``,i=``,a,o,s=Date.now(),c=!1;for await(let e of x.parseStreamEvents(t)){let t=e;switch(t.type){case`text_delta`:{let e=n[n.length-1];e&&e.type===`text`?e.text=(e.text||``)+t.text:n.push({type:`text`,text:t.text}),yield{type:`text_delta`,data:t.text};break}case`tool_use_start`:if(c&&r){let e=n[n.length-1];if(e?.type===`tool_use`)try{e.input=JSON.parse(r)}catch{}}n.push({type:`tool_use`,id:t.id,name:t.name,input:{},...t.metadata?{metadata:t.metadata}:{}}),r=``,c=!0,yield{type:`tool_use_start`,data:{id:t.id,name:t.name,input:void 0}};break;case`tool_input_delta`:r+=t.json;break;case`tool_use_end`:if(t.id&&t.input){let e=n.find(e=>e.type===`tool_use`&&e.id===t.id);e&&(e.input=t.input)}else if(c){let e=n[n.length-1];if(e?.type===`tool_use`&&r){try{e.input=JSON.parse(r)}catch{e.input={}}r=``}c=!1}break;case`message_meta`:t.inputTokens!=null&&(a=t.inputTokens),t.outputTokens!=null&&(o=t.outputTokens),t.stopReason&&(i=t.stopReason);break}}try{l?.onGenerationEnd?.({traceId:m,turn:e,model:_,stopReason:i,inputTokens:a,outputTokens:o,durationMs:Date.now()-s,input:T,output:n})}catch{}if(T.push({role:`assistant`,content:n}),!x.shouldContinue(i))break;let u=[];for(let t of n){if(t.type!==`tool_use`)continue;let n=t.name,r=t.input||{},i=t.id,a=C.get(n);if(!a){u.push({toolUseId:i,toolName:n,content:`Unknown tool: ${n}`,isError:!0}),yield{type:`tool_use_result`,data:{id:i,name:n,result:`Unknown tool: ${n}`,isError:!0}};continue}let o=Date.now();try{let t=await a(r);t.sideEffect&&(yield t.sideEffect),u.push({toolUseId:i,toolName:n,content:t.result,...t.isError?{isError:!0}:{}}),yield{type:`tool_use_result`,data:{id:i,name:n,result:t.result,...t.isError?{isError:!0}:{}}};try{l?.onToolEnd?.({traceId:m,turn:e,toolName:n,toolUseId:i,isError:!!t.isError,durationMs:Date.now()-o})}catch{}}catch(t){let r=t instanceof Error?t.message:`Tool execution failed`;u.push({toolUseId:i,toolName:n,content:r,isError:!0}),yield{type:`tool_use_result`,data:{id:i,name:n,result:r,isError:!0}};try{l?.onToolEnd?.({traceId:m,turn:e,toolName:n,toolUseId:i,isError:!0,durationMs:Date.now()-o})}catch{}}}yield{type:`turn_complete`,data:{}};let d=x.formatToolResults(u);if(Array.isArray(d))for(let e of d)T.push(e);else T.push(d)}try{l?.onChatEnd?.({traceId:m,sessionId:c,totalTurns:E,durationMs:Date.now()-h})}catch{}yield{type:`done`,data:{sessionId:c||``,traceId:m}}}catch(e){try{l?.onChatEnd?.({traceId:m,sessionId:c,totalTurns:0,durationMs:Date.now()-h,error:e instanceof Error?e.message:`Unknown error`})}catch{}console.error(`[agent] Chat error (provider=%s, model=%s): %s`,String(g).replace(/\n|\r/g,``),String(_).replace(/\n|\r/g,``),String(e instanceof Error?e.message:e).replace(/\n|\r/g,``)),yield{type:`error`,data:{message:x.formatError(e)}}}}exports.handleAgentChat=m;
25
+ `)}`,isError:!0};let i={portlets:t.map(e=>{let t=e.chartType,n=t===`markdown`,r=n?`query`:e.analysisType||`query`,i=r===`funnel`?`funnel`:r===`flow`?`flow`:r===`retention`?`retention`:`query`,a=e.query||`{}`,o;try{o=JSON.parse(a)}catch{o={}}let s={version:1,analysisType:i,activeView:`chart`,charts:{[i]:{chartType:t,chartConfig:e.chartConfig||{},displayConfig:e.displayConfig||{}}},query:n?{}:o};return{id:e.id,title:e.title,analysisConfig:s,dashboardFilterMapping:e.dashboardFilterMapping,w:e.w,h:e.h,x:e.x,y:e.y}}),filters:e.filters,colorPalette:e.colorPalette},a=e.title;return{result:`Dashboard "${a}" created with ${i.portlets.length} portlets and ${i.filters?.length||0} filters.`,sideEffect:{type:`dashboard_saved`,data:{title:a,description:e.description,dashboardConfig:i}}}}catch(e){return{result:`Failed to save dashboard: ${e instanceof Error?e.message:`Unknown error`}`,isError:!0}}}),i}async function f(e,t,n){switch(e){case`anthropic`:{let{AnthropicProvider:e}=await Promise.resolve().then(()=>require(`./anthropic-BIva8k1r.cjs`));return new e(t)}case`openai`:{let{OpenAIProvider:e}=await Promise.resolve().then(()=>require(`./openai-DLfardui.cjs`));return new e(t,n)}case`google`:{let{GoogleProvider:e}=await Promise.resolve().then(()=>require(`./google-Dgo9-Kb5.cjs`));return new e(t)}default:throw Error(`Unknown LLM provider: "${e}". Supported providers: anthropic, openai, google`)}}var p={anthropic:`claude-sonnet-4-6`,openai:`gpt-4.1-mini`,google:`gemini-3-flash-preview`};async function*m(e){let{message:t,history:n,semanticLayer:r,securityContext:a,agentConfig:o,apiKey:s}=e,c=e.sessionId||crypto.randomUUID(),l=o.observability,m=crypto.randomUUID(),h=Date.now(),g=e.providerOverride||o.provider||`anthropic`,_=e.modelOverride||o.model||p[g]||`claude-sonnet-4-6`,v=e.baseURLOverride||o.baseURL,y=o.maxTurns||25,b=o.maxTokens||4096,x;try{x=await f(g,s,{baseURL:v})}catch(e){console.error(`[agent] Failed to create %s provider: %s`,String(g).replace(/\n|\r/g,``),String(e instanceof Error?e.message:e).replace(/\n|\r/g,``)),yield{type:`error`,data:{message:e instanceof Error?e.message:`Failed to initialize LLM provider`}};return}let S=u(),C=d({semanticLayer:r,securityContext:a}),w=i(r.getMetadata());e.systemContext&&(w+=`\n\n## User Context\n\n${e.systemContext}`);try{l?.onChatStart?.({traceId:m,sessionId:c,message:t,model:_,historyLength:n?.length??0})}catch{}let T=[];if(n&&n.length>0){for(let e of n)if(e.role===`user`)T.push({role:`user`,content:e.content});else if(e.role===`assistant`){let t=[];if(e.content&&t.push({type:`text`,text:e.content}),e.toolCalls&&e.toolCalls.length>0){for(let n of e.toolCalls)t.push({type:`tool_use`,id:n.id,name:n.name,input:n.input||{}});T.push({role:`assistant`,content:t});let n=e.toolCalls.map(e=>({toolUseId:e.id,toolName:e.name,content:typeof e.result==`string`?e.result:JSON.stringify(e.result??``),isError:e.status===`error`})),r=x.formatToolResults(n);if(Array.isArray(r))for(let e of r)T.push(e);else T.push(r)}else t.length>0&&T.push({role:`assistant`,content:e.content})}}T.push({role:`user`,content:t});let E=0;try{for(let e=0;e<y;e++){E=e+1;let t=await x.createStream({model:_,maxTokens:b,system:w,tools:S,messages:T}),n=[],r=``,i=``,a,o,s=Date.now(),c=!1;for await(let e of x.parseStreamEvents(t)){let t=e;switch(t.type){case`text_delta`:{let e=n[n.length-1];e&&e.type===`text`?e.text=(e.text||``)+t.text:n.push({type:`text`,text:t.text}),yield{type:`text_delta`,data:t.text};break}case`tool_use_start`:if(c&&r){let e=n[n.length-1];if(e?.type===`tool_use`)try{e.input=JSON.parse(r)}catch{}}n.push({type:`tool_use`,id:t.id,name:t.name,input:{},...t.metadata?{metadata:t.metadata}:{}}),r=``,c=!0,yield{type:`tool_use_start`,data:{id:t.id,name:t.name,input:void 0}};break;case`tool_input_delta`:r+=t.json;break;case`tool_use_end`:if(t.id&&t.input){let e=n.find(e=>e.type===`tool_use`&&e.id===t.id);e&&(e.input=t.input)}else if(c){let e=n[n.length-1];if(e?.type===`tool_use`&&r){try{e.input=JSON.parse(r)}catch{e.input={}}r=``}c=!1}break;case`message_meta`:t.inputTokens!=null&&(a=t.inputTokens),t.outputTokens!=null&&(o=t.outputTokens),t.stopReason&&(i=t.stopReason);break}}try{l?.onGenerationEnd?.({traceId:m,turn:e,model:_,stopReason:i,inputTokens:a,outputTokens:o,durationMs:Date.now()-s,input:T,output:n})}catch{}if(T.push({role:`assistant`,content:n}),!x.shouldContinue(i))break;let u=[];for(let t of n){if(t.type!==`tool_use`)continue;let n=t.name,r=t.input||{},i=t.id,a=C.get(n);if(!a){u.push({toolUseId:i,toolName:n,content:`Unknown tool: ${n}`,isError:!0}),yield{type:`tool_use_result`,data:{id:i,name:n,result:`Unknown tool: ${n}`,isError:!0}};continue}let o=Date.now();try{let t=await a(r);t.sideEffect&&(yield t.sideEffect),u.push({toolUseId:i,toolName:n,content:t.result,...t.isError?{isError:!0}:{}}),yield{type:`tool_use_result`,data:{id:i,name:n,result:t.result,...t.isError?{isError:!0}:{}}};try{l?.onToolEnd?.({traceId:m,turn:e,toolName:n,toolUseId:i,isError:!!t.isError,durationMs:Date.now()-o})}catch{}}catch(t){let r=t instanceof Error?t.message:`Tool execution failed`;u.push({toolUseId:i,toolName:n,content:r,isError:!0}),yield{type:`tool_use_result`,data:{id:i,name:n,result:r,isError:!0}};try{l?.onToolEnd?.({traceId:m,turn:e,toolName:n,toolUseId:i,isError:!0,durationMs:Date.now()-o})}catch{}}}yield{type:`turn_complete`,data:{}};let d=x.formatToolResults(u);if(Array.isArray(d))for(let e of d)T.push(e);else T.push(d)}try{l?.onChatEnd?.({traceId:m,sessionId:c,totalTurns:E,durationMs:Date.now()-h})}catch{}yield{type:`done`,data:{sessionId:c||``,traceId:m}}}catch(e){try{l?.onChatEnd?.({traceId:m,sessionId:c,totalTurns:0,durationMs:Date.now()-h,error:e instanceof Error?e.message:`Unknown error`})}catch{}console.error(`[agent] Chat error (provider=%s, model=%s): %s`,String(g).replace(/\n|\r/g,``),String(_).replace(/\n|\r/g,``),String(e instanceof Error?e.message:e).replace(/\n|\r/g,``)),yield{type:`error`,data:{message:x.formatError(e)}}}}exports.handleAgentChat=m;
@@ -2661,7 +2661,7 @@ async function g(e, t, n) {
2661
2661
  return new e(t);
2662
2662
  }
2663
2663
  case "openai": {
2664
- let { OpenAIProvider: e } = await import("./openai-DxeVtl8X.js");
2664
+ let { OpenAIProvider: e } = await import("./openai-DaxuhJLS.js");
2665
2665
  return new e(t, n);
2666
2666
  }
2667
2667
  case "google": {
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-2MwxiQ2o.cjs`),t=require(`../mcp-transport-ro4OL4BW.cjs`);let n=require(`hono`);var r=e=>{let t={origin:`*`,allowMethods:[`GET`,`HEAD`,`PUT`,`POST`,`DELETE`,`PATCH`],allowHeaders:[],exposeHeaders:[],...e},n=(e=>typeof e==`string`?e===`*`?()=>e:t=>e===t?t:null:typeof e==`function`?e:t=>e.includes(t)?t:null)(t.origin),r=(e=>typeof e==`function`?e:Array.isArray(e)?()=>e:()=>[])(t.allowMethods);return async function(e,i){function a(t,n){e.res.headers.set(t,n)}let o=await n(e.req.header(`origin`)||``,e);if(o&&a(`Access-Control-Allow-Origin`,o),t.credentials&&a(`Access-Control-Allow-Credentials`,`true`),t.exposeHeaders?.length&&a(`Access-Control-Expose-Headers`,t.exposeHeaders.join(`,`)),e.req.method===`OPTIONS`){t.origin!==`*`&&a(`Vary`,`Origin`),t.maxAge!=null&&a(`Access-Control-Max-Age`,t.maxAge.toString());let n=await r(e.req.header(`origin`)||``,e);n.length&&a(`Access-Control-Allow-Methods`,n.join(`,`));let i=t.allowHeaders;if(!i?.length){let t=e.req.header(`Access-Control-Request-Headers`);t&&(i=t.split(/\s*,\s*/))}return i?.length&&(a(`Access-Control-Allow-Headers`,i.join(`,`)),e.res.headers.append(`Vary`,`Access-Control-Request-Headers`)),e.res.headers.delete(`Content-Length`),e.res.headers.delete(`Content-Type`),new Response(null,{headers:e.res.headers,status:204,statusText:`No Content`})}await i(),t.origin!==`*`&&e.header(`Vary`,`Origin`,{append:!0})}};function i(i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,cache:f,mcp:p={enabled:!0},agent:m}=i;if(!i.semanticLayer&&(!a||a.length===0))throw Error(`Either semanticLayer or a non-empty cubes array must be provided`);let h=new n.Hono;u&&h.use(`/*`,r(u));let g=i.semanticLayer??new t.h({drizzle:o,schema:s,engineType:l,cache:f,rlsSetup:i.rlsSetup});if(!i.semanticLayer&&a&&a.forEach(e=>{g.registerCube(e)}),h.post(`${d}/load`,async t=>{try{let n=await t.req.json(),r=n.query||n,i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=t.req.header(`x-cache-control`)===`no-cache`,s=await g.executeMultiCubeQuery(r,i,{skipCache:o});return t.json(e.r(r,s,g))}catch(e){return console.error(`Query execution error:`,e),t.json({error:e instanceof Error?e.message:`Query execution failed`},500)}}),h.get(`${d}/load`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`},400);let r;try{r=JSON.parse(n)}catch{return t.json({error:`Invalid JSON in query parameter`},400)}let i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=t.req.header(`x-cache-control`)===`no-cache`,s=await g.executeMultiCubeQuery(r,i,{skipCache:o});return t.json(e.r(r,s,g))}catch(e){return console.error(`Query execution error:`,e),t.json({error:e instanceof Error?e.message:`Query execution failed`},500)}}),h.post(`${d}/batch`,async t=>{try{let{queries:n}=await t.req.json();if(!n||!Array.isArray(n))return t.json({error:`Request body must contain a "queries" array`},400);if(n.length===0)return t.json({error:`Queries array cannot be empty`},400);let r=await e.u(n,await c(t),g,{skipCache:t.req.header(`x-cache-control`)===`no-cache`});return t.json(r)}catch(e){return console.error(`Batch execution error:`,e),t.json({error:e instanceof Error?e.message:`Batch execution failed`},500)}}),h.get(`${d}/meta`,t=>{try{let n=g.getMetadata();return t.json(e.a(n))}catch(e){return console.error(`Metadata error:`,e),t.json({error:e instanceof Error?e.message:`Failed to fetch metadata`},500)}}),h.post(`${d}/sql`,async t=>{try{let n=await t.req.json(),r=await c(t),i=g.validateQuery(n);if(!i.isValid)return t.json({error:`Query validation failed: ${i.errors.join(`, `)}`},400);let a=n.measures?.[0]||n.dimensions?.[0];if(!a)return t.json({error:`No measures or dimensions specified`},400);let o=a.split(`.`)[0],s=await g.generateSQL(o,n,r);return t.json(e.o(n,s))}catch(e){return console.error(`SQL generation error:`,e),t.json({error:e instanceof Error?e.message:`SQL generation failed`},500)}}),h.get(`${d}/sql`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`},400);let r=JSON.parse(n),i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return t.json({error:`No measures or dimensions specified`},400);let s=o.split(`.`)[0],l=await g.generateSQL(s,r,i);return t.json(e.o(r,l))}catch(e){return console.error(`SQL generation error:`,e),t.json({error:e instanceof Error?e.message:`SQL generation failed`},500)}}),h.post(`${d}/dry-run`,async t=>{try{let n=await t.req.json(),r=await e.f(n.query||n,await c(t),g);return t.json(r)}catch(e){return console.error(`Dry-run error:`,e),t.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},400)}}),h.get(`${d}/dry-run`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`,valid:!1},400);let r=await e.f(JSON.parse(n),await c(t),g);return t.json(r)}catch(e){return console.error(`Dry-run error:`,e),t.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},400)}}),h.post(`${d}/explain`,async e=>{try{let t=await e.req.json(),n=t.query||t,r=t.options||{},i=await c(e),a=g.validateQuery(n);if(!a.isValid)return e.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=await g.explainQuery(n,i,r);return e.json(o)}catch(t){return console.error(`Explain error:`,t),e.json({error:t instanceof Error?t.message:`Explain query failed`},500)}}),m&&h.post(`${d}/agent/chat`,async e=>{try{let{handleAgentChat:t}=await Promise.resolve().then(()=>require(`../handler-dHHEEbG9.cjs`)),{message:n,sessionId:r,history:i}=await e.req.json();if(!n||typeof n!=`string`)return e.json({error:`message is required and must be a string`},400);let a=(m.apiKey||``).trim();if(m.allowClientApiKey){let t=e.req.header(`x-agent-api-key`);t&&(a=t.trim())}if(!a)return e.json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`},401);let o=m.allowClientApiKey?e.req.header(`x-agent-provider`):void 0,s=m.allowClientApiKey?e.req.header(`x-agent-model`):void 0,l=m.allowClientApiKey?e.req.header(`x-agent-provider-endpoint`):void 0,u=await c(e),d=m.buildSystemContext?.(u),f=new TextEncoder,p=new ReadableStream({async start(e){try{let c=t({message:n,sessionId:r,history:i,semanticLayer:g,securityContext:u,agentConfig:m,apiKey:a,systemContext:d,providerOverride:o,modelOverride:s,baseURLOverride:l});for await(let t of c){let n=`data: ${JSON.stringify(t)}\n\n`;e.enqueue(f.encode(n))}}catch(t){let n={type:`error`,data:{message:t instanceof Error?t.message:`Stream failed`}};e.enqueue(f.encode(`data: ${JSON.stringify(n)}\n\n`))}finally{e.close()}}});return new Response(p,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})}catch(t){return console.error(`Agent chat error:`,t),e.json({error:t instanceof Error?t.message:`Agent chat failed`},500)}}),p.enabled!==!1){let e={uri:`drizzle-cube://schema`,name:`Cube Schema`,description:`Current cube metadata as JSON`,mimeType:`application/json`,text:JSON.stringify(g.getMetadata(),null,2)},n=[...t.o(),e],r=t.a(),i=p.basePath??`/mcp`;h.post(`${i}`,async e=>{let i=t.p(e.req.header(`origin`),p.allowedOrigins?{allowedOrigins:p.allowedOrigins}:{});if(!i.valid)return e.json(t.n(null,-32600,i.reason),403);let a=e.req.header(`accept`);if(!t.f(a))return e.json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`),400);let o=t.c(e.req.header());if(!o.ok)return e.json({error:`Unsupported MCP protocol version`,supported:o.supported},426);let s=t.l(await e.req.json().catch(()=>null));if(!s)return e.json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`),400);let l=t.m(a),u=s.method===`initialize`;try{let i=await t.i(s.method,s.params,{semanticLayer:g,extractSecurityContext:c,rawRequest:e,rawResponse:null,negotiatedProtocol:o.negotiated,resources:n,prompts:r});if(t.s(s))return e.body(null,202);let a=t.r(s.id??null,i),d=u&&i&&typeof i==`object`&&`sessionId`in i?i.sessionId:void 0,f={};if(d&&(f[t.t]=d),l){let e=new TextEncoder,n=t.u(),r=new ReadableStream({start(r){r.enqueue(e.encode(`id: ${n}\n\n`)),r.enqueue(e.encode(t.d(a,n))),r.close()}});return new Response(r,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,...f}})}return e.json(a,200,f)}catch(n){if(t.s(s))return console.error(`MCP notification processing error:`,n),e.body(null,202);console.error(`MCP RPC error:`,n);let r=n?.code??-32603,i=n?.data,a=n.message||`MCP request failed`,o=t.n(s.id??null,r,a,i);if(l){let e=new TextEncoder,n=t.u(),r=new ReadableStream({start(r){r.enqueue(e.encode(`id: ${n}\n\n`)),r.enqueue(e.encode(t.d(o,n))),r.close()}});return new Response(r,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})}return e.json(o,200)}}),h.delete(`${i}`,e=>e.json({error:`Session termination not supported`},405)),h.get(`${i}`,e=>{let n=new TextEncoder,r=t.u(),i,a=new ReadableStream({start(e){e.enqueue(n.encode(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3))),i=setInterval(()=>{e.enqueue(n.encode(`: keep-alive
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-2MwxiQ2o.cjs`),t=require(`../mcp-transport-mmuPvjfR.cjs`);let n=require(`hono`);var r=e=>{let t={origin:`*`,allowMethods:[`GET`,`HEAD`,`PUT`,`POST`,`DELETE`,`PATCH`],allowHeaders:[],exposeHeaders:[],...e},n=(e=>typeof e==`string`?e===`*`?t.credentials?e=>e||null:()=>e:t=>e===t?t:null:typeof e==`function`?e:t=>e.includes(t)?t:null)(t.origin),r=(e=>typeof e==`function`?e:Array.isArray(e)?()=>e:()=>[])(t.allowMethods);return async function(e,i){function a(t,n){e.res.headers.set(t,n)}let o=await n(e.req.header(`origin`)||``,e);if(o&&a(`Access-Control-Allow-Origin`,o),t.credentials&&a(`Access-Control-Allow-Credentials`,`true`),t.exposeHeaders?.length&&a(`Access-Control-Expose-Headers`,t.exposeHeaders.join(`,`)),e.req.method===`OPTIONS`){(t.origin!==`*`||t.credentials)&&a(`Vary`,`Origin`),t.maxAge!=null&&a(`Access-Control-Max-Age`,t.maxAge.toString());let n=await r(e.req.header(`origin`)||``,e);n.length&&a(`Access-Control-Allow-Methods`,n.join(`,`));let i=t.allowHeaders;if(!i?.length){let t=e.req.header(`Access-Control-Request-Headers`);t&&(i=t.split(/\s*,\s*/))}return i?.length&&(a(`Access-Control-Allow-Headers`,i.join(`,`)),e.res.headers.append(`Vary`,`Access-Control-Request-Headers`)),e.res.headers.delete(`Content-Length`),e.res.headers.delete(`Content-Type`),new Response(null,{headers:e.res.headers,status:204,statusText:`No Content`})}await i(),(t.origin!==`*`||t.credentials)&&e.header(`Vary`,`Origin`,{append:!0})}};function i(i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,cache:f,mcp:p={enabled:!0},agent:m}=i;if(!i.semanticLayer&&(!a||a.length===0))throw Error(`Either semanticLayer or a non-empty cubes array must be provided`);let h=new n.Hono;u&&h.use(`/*`,r(u));let g=i.semanticLayer??new t.h({drizzle:o,schema:s,engineType:l,cache:f,rlsSetup:i.rlsSetup});if(!i.semanticLayer&&a&&a.forEach(e=>{g.registerCube(e)}),h.post(`${d}/load`,async t=>{try{let n=await t.req.json(),r=n.query||n,i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=t.req.header(`x-cache-control`)===`no-cache`,s=await g.executeMultiCubeQuery(r,i,{skipCache:o});return t.json(e.r(r,s,g))}catch(e){return console.error(`Query execution error:`,e),t.json({error:e instanceof Error?e.message:`Query execution failed`},500)}}),h.get(`${d}/load`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`},400);let r;try{r=JSON.parse(n)}catch{return t.json({error:`Invalid JSON in query parameter`},400)}let i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=t.req.header(`x-cache-control`)===`no-cache`,s=await g.executeMultiCubeQuery(r,i,{skipCache:o});return t.json(e.r(r,s,g))}catch(e){return console.error(`Query execution error:`,e),t.json({error:e instanceof Error?e.message:`Query execution failed`},500)}}),h.post(`${d}/batch`,async t=>{try{let{queries:n}=await t.req.json();if(!n||!Array.isArray(n))return t.json({error:`Request body must contain a "queries" array`},400);if(n.length===0)return t.json({error:`Queries array cannot be empty`},400);let r=await e.u(n,await c(t),g,{skipCache:t.req.header(`x-cache-control`)===`no-cache`});return t.json(r)}catch(e){return console.error(`Batch execution error:`,e),t.json({error:e instanceof Error?e.message:`Batch execution failed`},500)}}),h.get(`${d}/meta`,t=>{try{let n=g.getMetadata();return t.json(e.a(n))}catch(e){return console.error(`Metadata error:`,e),t.json({error:e instanceof Error?e.message:`Failed to fetch metadata`},500)}}),h.post(`${d}/sql`,async t=>{try{let n=await t.req.json(),r=await c(t),i=g.validateQuery(n);if(!i.isValid)return t.json({error:`Query validation failed: ${i.errors.join(`, `)}`},400);let a=n.measures?.[0]||n.dimensions?.[0];if(!a)return t.json({error:`No measures or dimensions specified`},400);let o=a.split(`.`)[0],s=await g.generateSQL(o,n,r);return t.json(e.o(n,s))}catch(e){return console.error(`SQL generation error:`,e),t.json({error:e instanceof Error?e.message:`SQL generation failed`},500)}}),h.get(`${d}/sql`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`},400);let r=JSON.parse(n),i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return t.json({error:`No measures or dimensions specified`},400);let s=o.split(`.`)[0],l=await g.generateSQL(s,r,i);return t.json(e.o(r,l))}catch(e){return console.error(`SQL generation error:`,e),t.json({error:e instanceof Error?e.message:`SQL generation failed`},500)}}),h.post(`${d}/dry-run`,async t=>{try{let n=await t.req.json(),r=await e.f(n.query||n,await c(t),g);return t.json(r)}catch(e){return console.error(`Dry-run error:`,e),t.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},400)}}),h.get(`${d}/dry-run`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`,valid:!1},400);let r=await e.f(JSON.parse(n),await c(t),g);return t.json(r)}catch(e){return console.error(`Dry-run error:`,e),t.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},400)}}),h.post(`${d}/explain`,async e=>{try{let t=await e.req.json(),n=t.query||t,r=t.options||{},i=await c(e),a=g.validateQuery(n);if(!a.isValid)return e.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=await g.explainQuery(n,i,r);return e.json(o)}catch(t){return console.error(`Explain error:`,t),e.json({error:t instanceof Error?t.message:`Explain query failed`},500)}}),m&&h.post(`${d}/agent/chat`,async e=>{try{let{handleAgentChat:t}=await Promise.resolve().then(()=>require(`../handler-BneUGY0k.cjs`)),{message:n,sessionId:r,history:i}=await e.req.json();if(!n||typeof n!=`string`)return e.json({error:`message is required and must be a string`},400);let a=(m.apiKey||``).trim();if(m.allowClientApiKey){let t=e.req.header(`x-agent-api-key`);t&&(a=t.trim())}if(!a)return e.json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`},401);let o=m.allowClientApiKey?e.req.header(`x-agent-provider`):void 0,s=m.allowClientApiKey?e.req.header(`x-agent-model`):void 0,l=m.allowClientApiKey?e.req.header(`x-agent-provider-endpoint`):void 0,u=await c(e),d=m.buildSystemContext?.(u),f=new TextEncoder,p=new ReadableStream({async start(e){try{let c=t({message:n,sessionId:r,history:i,semanticLayer:g,securityContext:u,agentConfig:m,apiKey:a,systemContext:d,providerOverride:o,modelOverride:s,baseURLOverride:l});for await(let t of c){let n=`data: ${JSON.stringify(t)}\n\n`;e.enqueue(f.encode(n))}}catch(t){let n={type:`error`,data:{message:t instanceof Error?t.message:`Stream failed`}};e.enqueue(f.encode(`data: ${JSON.stringify(n)}\n\n`))}finally{e.close()}}});return new Response(p,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})}catch(t){return console.error(`Agent chat error:`,t),e.json({error:t instanceof Error?t.message:`Agent chat failed`},500)}}),p.enabled!==!1){let e={uri:`drizzle-cube://schema`,name:`Cube Schema`,description:`Current cube metadata as JSON`,mimeType:`application/json`,text:JSON.stringify(g.getMetadata(),null,2)},n=[...t.o(),e],r=t.a(),i=p.basePath??`/mcp`;h.post(`${i}`,async e=>{let i=t.p(e.req.header(`origin`),p.allowedOrigins?{allowedOrigins:p.allowedOrigins}:{});if(!i.valid)return e.json(t.n(null,-32600,i.reason),403);let a=e.req.header(`accept`);if(!t.f(a))return e.json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`),400);let o=t.c(e.req.header());if(!o.ok)return e.json({error:`Unsupported MCP protocol version`,supported:o.supported},426);let s=t.l(await e.req.json().catch(()=>null));if(!s)return e.json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`),400);let l=t.m(a),u=s.method===`initialize`;try{let i=await t.i(s.method,s.params,{semanticLayer:g,extractSecurityContext:c,rawRequest:e,rawResponse:null,negotiatedProtocol:o.negotiated,resources:n,prompts:r});if(t.s(s))return e.body(null,202);let a=t.r(s.id??null,i),d=u&&i&&typeof i==`object`&&`sessionId`in i?i.sessionId:void 0,f={};if(d&&(f[t.t]=d),l){let e=new TextEncoder,n=t.u(),r=new ReadableStream({start(r){r.enqueue(e.encode(`id: ${n}\n\n`)),r.enqueue(e.encode(t.d(a,n))),r.close()}});return new Response(r,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,...f}})}return e.json(a,200,f)}catch(n){if(t.s(s))return console.error(`MCP notification processing error:`,n),e.body(null,202);console.error(`MCP RPC error:`,n);let r=n?.code??-32603,i=n?.data,a=n.message||`MCP request failed`,o=t.n(s.id??null,r,a,i);if(l){let e=new TextEncoder,n=t.u(),r=new ReadableStream({start(r){r.enqueue(e.encode(`id: ${n}\n\n`)),r.enqueue(e.encode(t.d(o,n))),r.close()}});return new Response(r,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})}return e.json(o,200)}}),h.delete(`${i}`,e=>e.json({error:`Session termination not supported`},405)),h.get(`${i}`,e=>{let n=new TextEncoder,r=t.u(),i,a=new ReadableStream({start(e){e.enqueue(n.encode(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3))),i=setInterval(()=>{e.enqueue(n.encode(`: keep-alive
2
2
 
3
3
  `))},15e3)},cancel(){clearInterval(i)}});return new Response(a,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})})}return h}function a(e,t){let n=i(t);return e.route(`/`,n),e}function o(e){return a(new n.Hono,e)}exports.createCubeApp=o,exports.createCubeRoutes=i,exports.mountCubeRoutes=a;
@@ -1,5 +1,5 @@
1
1
  import { a as e, f as t, o as n, r, u as i } from "../utils-_2o905Fi.js";
2
- import { a, c as o, d as s, f as c, h as l, i as u, l as d, m as f, n as p, o as m, p as h, r as g, s as _, t as v, u as y } from "../mcp-transport-tB5a7Het.js";
2
+ import { a, c as o, d as s, f as c, h as l, i as u, l as d, m as f, n as p, o as m, p as h, r as g, s as _, t as v, u as y } from "../mcp-transport-CC3hQOnb.js";
3
3
  import { Hono as b } from "hono";
4
4
  //#region node_modules/hono/dist/middleware/cors/index.js
5
5
  var x = (e) => {
@@ -16,14 +16,14 @@ var x = (e) => {
16
16
  allowHeaders: [],
17
17
  exposeHeaders: [],
18
18
  ...e
19
- }, n = ((e) => typeof e == "string" ? e === "*" ? () => e : (t) => e === t ? t : null : typeof e == "function" ? e : (t) => e.includes(t) ? t : null)(t.origin), r = ((e) => typeof e == "function" ? e : Array.isArray(e) ? () => e : () => [])(t.allowMethods);
19
+ }, n = ((e) => typeof e == "string" ? e === "*" ? t.credentials ? (e) => e || null : () => e : (t) => e === t ? t : null : typeof e == "function" ? e : (t) => e.includes(t) ? t : null)(t.origin), r = ((e) => typeof e == "function" ? e : Array.isArray(e) ? () => e : () => [])(t.allowMethods);
20
20
  return async function(e, i) {
21
21
  function a(t, n) {
22
22
  e.res.headers.set(t, n);
23
23
  }
24
24
  let o = await n(e.req.header("origin") || "", e);
25
25
  if (o && a("Access-Control-Allow-Origin", o), t.credentials && a("Access-Control-Allow-Credentials", "true"), t.exposeHeaders?.length && a("Access-Control-Expose-Headers", t.exposeHeaders.join(",")), e.req.method === "OPTIONS") {
26
- t.origin !== "*" && a("Vary", "Origin"), t.maxAge != null && a("Access-Control-Max-Age", t.maxAge.toString());
26
+ (t.origin !== "*" || t.credentials) && a("Vary", "Origin"), t.maxAge != null && a("Access-Control-Max-Age", t.maxAge.toString());
27
27
  let n = await r(e.req.header("origin") || "", e);
28
28
  n.length && a("Access-Control-Allow-Methods", n.join(","));
29
29
  let i = t.allowHeaders;
@@ -37,7 +37,7 @@ var x = (e) => {
37
37
  statusText: "No Content"
38
38
  });
39
39
  }
40
- await i(), t.origin !== "*" && e.header("Vary", "Origin", { append: !0 });
40
+ await i(), (t.origin !== "*" || t.credentials) && e.header("Vary", "Origin", { append: !0 });
41
41
  };
42
42
  };
43
43
  //#endregion
@@ -159,7 +159,7 @@ function S(S) {
159
159
  }
160
160
  }), M && N.post(`${k}/agent/chat`, async (e) => {
161
161
  try {
162
- let { handleAgentChat: t } = await import("../handler-fto6TSVn.js"), { message: n, sessionId: r, history: i } = await e.req.json();
162
+ let { handleAgentChat: t } = await import("../handler-CiQoQsnP.js"), { message: n, sessionId: r, history: i } = await e.req.json();
163
163
  if (!n || typeof n != "string") return e.json({ error: "message is required and must be a string" }, 400);
164
164
  let a = (M.apiKey || "").trim();
165
165
  if (M.allowClientApiKey) {