drizzle-cube 0.7.1 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/ActivityGridChart.config-DXUUgx0N.cjs +1 -0
- package/dist/adapters/ActivityGridChart.config-Dyozu3VW.js +2 -0
- package/dist/adapters/AreaChart.config-Di5odBXp.cjs +1 -0
- package/dist/adapters/AreaChart.config-KEaXP_4K.js +2 -0
- package/dist/adapters/BarChart.config-B-hBHykR.cjs +1 -0
- package/dist/adapters/BarChart.config-C5sqbn0A.js +2 -0
- package/dist/adapters/BoxPlotChart.config-B1R4Br7L.js +2 -0
- package/dist/adapters/BoxPlotChart.config-C82Fhd3c.cjs +1 -0
- package/dist/adapters/BubbleChart.config-CoBxmmfp.js +2 -0
- package/dist/adapters/BubbleChart.config-DfOnNjL-.cjs +1 -0
- package/dist/adapters/CandlestickChart.config-C5ggV_3j.cjs +1 -0
- package/dist/adapters/CandlestickChart.config-ZaJpWVuL.js +2 -0
- package/dist/adapters/DataTable.config-Cx2_ACdY.cjs +1 -0
- package/dist/adapters/DataTable.config-DkAgD-iz.js +2 -0
- package/dist/adapters/FunnelChart.config-CvzcECUB.js +2 -0
- package/dist/adapters/FunnelChart.config-DVH7IFnb.cjs +1 -0
- package/dist/adapters/GaugeChart.config-Csx8rt8o.cjs +1 -0
- package/dist/adapters/GaugeChart.config-DEmrNgMa.js +2 -0
- package/dist/adapters/HeatMapChart.config-BfD_dpP7.js +2 -0
- package/dist/adapters/HeatMapChart.config-D_jlyPJL.cjs +1 -0
- package/dist/adapters/KpiDelta.config-CVBdUL_n.cjs +1 -0
- package/dist/adapters/KpiDelta.config-D4dCXOxl.js +2 -0
- package/dist/adapters/KpiNumber.config-BK5pgIKz.cjs +1 -0
- package/dist/adapters/KpiNumber.config-D6XqjZrm.js +2 -0
- package/dist/adapters/KpiText.config-ChphMwG5.js +2 -0
- package/dist/adapters/KpiText.config-fO1wc6FH.cjs +1 -0
- package/dist/adapters/LineChart.config-CXJrgz1s.js +2 -0
- package/dist/adapters/LineChart.config-Cg_h-SiJ.cjs +1 -0
- package/dist/adapters/MarkdownChart.config-ByPjX-4O.cjs +1 -0
- package/dist/adapters/MarkdownChart.config-Df2yY9AT.js +2 -0
- package/dist/adapters/MeasureProfileChart.config-BBWGIteF.cjs +1 -0
- package/dist/adapters/MeasureProfileChart.config-C9OFbN9Z.js +2 -0
- package/dist/adapters/PieChart.config-C6jJj6xm.js +2 -0
- package/dist/adapters/PieChart.config-CmCw_8eN.cjs +1 -0
- package/dist/adapters/ProportionBarChart.config-B9NEyFEe.js +2 -0
- package/dist/adapters/ProportionBarChart.config-C3GAVPWn.cjs +1 -0
- package/dist/adapters/RadarChart.config-5AMwEqUJ.cjs +1 -0
- package/dist/adapters/RadarChart.config-Ct_b7IM5.js +2 -0
- package/dist/adapters/RadialBarChart.config-Bp-Sl0cm.js +2 -0
- package/dist/adapters/RadialBarChart.config-D14yoexI.cjs +1 -0
- package/dist/adapters/RecordsTable.config-D2-qmG06.cjs +1 -0
- package/dist/adapters/RecordsTable.config-DIwoqZCU.js +2 -0
- package/dist/adapters/RetentionCombinedChart.config-BWHipi5M.cjs +1 -0
- package/dist/adapters/RetentionCombinedChart.config-D40UgTcl.js +2 -0
- package/dist/adapters/RetentionHeatmap.config-GlnSLrjn.js +2 -0
- package/dist/adapters/RetentionHeatmap.config-MlhZf26c.cjs +1 -0
- package/dist/adapters/SankeyChart.config-Bf1_NHiv.js +2 -0
- package/dist/adapters/SankeyChart.config-BoYf6BFE.cjs +1 -0
- package/dist/adapters/ScatterChart.config-CV2rdGJp.js +2 -0
- package/dist/adapters/ScatterChart.config-DywduGF3.cjs +1 -0
- package/dist/adapters/SunburstChart.config-CrqiE1UZ.js +2 -0
- package/dist/adapters/SunburstChart.config-D5tbF_GJ.cjs +1 -0
- package/dist/adapters/TreeMapChart.config-BJ8HnZU0.cjs +1 -0
- package/dist/adapters/TreeMapChart.config-DxgIqIIj.js +2 -0
- package/dist/adapters/WaterfallChart.config-Cns8fLFu.js +2 -0
- package/dist/adapters/WaterfallChart.config-D_kdL9SN.cjs +1 -0
- package/dist/adapters/compiler-BxZHh0UD.cjs +166 -0
- package/dist/adapters/{compiler-DiYxWAKg.js → compiler-CBGD_4Et.js} +1389 -1923
- package/dist/adapters/core/http-port.d.ts +34 -7
- package/dist/adapters/core/index.cjs +1 -1
- package/dist/adapters/core/index.d.ts +1 -0
- package/dist/adapters/core/index.js +2 -2
- package/dist/adapters/core/rest-handlers.d.ts +1 -1
- package/dist/adapters/core-CIGuwGuI.cjs +1 -0
- package/dist/adapters/{core-BOPRmxPc.js → core-DAAnqPyN.js} +81 -65
- package/dist/adapters/express/index.cjs +2 -2
- package/dist/adapters/express/index.d.ts +11 -2
- package/dist/adapters/express/index.js +14 -14
- package/dist/adapters/fastify/index.cjs +2 -2
- package/dist/adapters/fastify/index.d.ts +11 -2
- package/dist/adapters/fastify/index.js +29 -29
- package/dist/{server/google-eKAc20al.js → adapters/google-DRY7jnOh.js} +46 -28
- package/dist/adapters/{google-BhvizbFR.cjs → google-PsZzwedr.cjs} +2 -2
- package/dist/adapters/handler-BcYTw6zB.cjs +25 -0
- package/dist/adapters/{handler-DGud-C-w.js → handler-eA0VJDHj.js} +363 -266
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +9 -9
- package/dist/adapters/mcp-tools-handlers.d.ts +10 -3
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +18 -20
- package/dist/adapters/mcp-transport-BpG44Fvn.js +730 -0
- package/dist/adapters/mcp-transport-CDxZXpc-.cjs +42 -0
- package/dist/adapters/mcp-transport.d.ts +13 -2
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.d.ts +5 -2
- package/dist/adapters/nextjs/index.js +32 -32
- package/dist/adapters/{openai-Crp3X_zg.js → openai-BZ48ioYp.js} +1 -1
- package/dist/adapters/{openai-CmdN7Sj1.cjs → openai-Bw1j-OiP.cjs} +1 -1
- package/dist/adapters/{openai-Dwt9bxOE.cjs → openai-CLjyL5_J.cjs} +2 -2
- package/dist/adapters/{openai-CGJM6Qun.js → openai-CYYjUG_3.js} +4 -4
- package/dist/adapters/{utils-DboNUT3A.js → utils-BagURNRb.js} +1963 -1135
- package/dist/adapters/utils-BiKIg2tk.cjs +128 -0
- package/dist/adapters/utils.cjs +1 -1
- package/dist/adapters/utils.d.ts +19 -5
- package/dist/adapters/utils.js +1 -1
- package/dist/cjs/adapters/core/http-port.d.ts +34 -7
- package/dist/cjs/adapters/core/index.d.ts +1 -0
- package/dist/cjs/adapters/core/rest-handlers.d.ts +1 -1
- package/dist/cjs/adapters/express/index.d.ts +11 -2
- package/dist/cjs/adapters/fastify/index.d.ts +11 -2
- package/dist/cjs/adapters/mcp-tools-handlers.d.ts +10 -3
- package/dist/cjs/adapters/mcp-transport.d.ts +13 -2
- package/dist/cjs/adapters/nextjs/index.d.ts +5 -2
- package/dist/cjs/adapters/utils.d.ts +19 -5
- package/dist/cjs/client/charts/chartConfigRegistry.d.ts +7 -0
- package/dist/cjs/client/charts/chartConfigs.d.ts +17 -1
- package/dist/cjs/client/client/CubeClient.d.ts +11 -1
- package/dist/cjs/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +4 -2
- package/dist/cjs/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +10 -0
- package/dist/cjs/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +3 -2
- package/dist/cjs/client/components/AnalysisBuilder/utils/queryUtils.d.ts +7 -1
- package/dist/cjs/client/components/analyticsPortlet/PortletChart.d.ts +2 -1
- package/dist/cjs/client/components/analyticsPortlet/PortletChartView.d.ts +4 -1
- package/dist/cjs/client/components/analyticsPortlet/usePortletDeadMembers.d.ts +24 -0
- package/dist/cjs/client/components/analyticsPortlet/usePortletPagination.d.ts +21 -0
- package/dist/cjs/client/components/charts/RecordsTable.config.d.ts +10 -0
- package/dist/cjs/client/components/charts/RecordsTable.d.ts +4 -0
- package/dist/cjs/client/components/charts/recordsTableHooks.d.ts +68 -0
- package/dist/cjs/client/icons/types.d.ts +1 -0
- package/dist/cjs/client/index.d.ts +2 -2
- package/dist/cjs/client/types.d.ts +92 -1
- package/dist/cjs/client/utils/recordsTableUtils.d.ts +71 -0
- package/dist/cjs/client/utils/rowLinkUtils.d.ts +35 -0
- package/dist/cjs/server/adapters/base-adapter.d.ts +46 -0
- package/dist/cjs/server/adapters/databend-adapter.d.ts +5 -0
- package/dist/cjs/server/adapters/duckdb-adapter.d.ts +5 -0
- package/dist/cjs/server/adapters/mysql-adapter.d.ts +14 -0
- package/dist/cjs/server/adapters/postgres-adapter.d.ts +15 -0
- package/dist/cjs/server/adapters/snowflake-adapter.d.ts +6 -0
- package/dist/cjs/server/adapters/sqlite-adapter.d.ts +21 -0
- package/dist/cjs/server/agent/chart-validation.d.ts +1 -1
- package/dist/cjs/server/ai/chart-schema.d.ts +117 -0
- package/dist/cjs/server/ai/discovery-helpers.d.ts +14 -0
- package/dist/cjs/server/ai/discovery.d.ts +6 -0
- package/dist/cjs/server/ai/query-schema.d.ts +1 -1
- package/dist/cjs/server/attribute-dimensions.d.ts +102 -0
- package/dist/cjs/server/builders/group-by-builder.d.ts +15 -0
- package/dist/cjs/server/cache-utils.d.ts +5 -1
- package/dist/cjs/server/compiler-metadata.d.ts +24 -3
- package/dist/cjs/server/compiler.d.ts +159 -13
- package/dist/cjs/server/execution/query-result-cache.d.ts +1 -1
- package/dist/cjs/server/executor.d.ts +15 -0
- package/dist/cjs/server/index.d.ts +13 -3
- package/dist/cjs/server/query-handlers.d.ts +2 -1
- package/dist/cjs/server/query-validator.d.ts +36 -4
- package/dist/cjs/server/types/core.d.ts +13 -0
- package/dist/cjs/server/types/cube.d.ts +39 -2
- package/dist/cjs/server/types/query.d.ts +8 -0
- package/dist/cli/index.cjs +130 -52
- package/dist/client/charts/chartConfigRegistry.d.ts +7 -0
- package/dist/client/charts/chartConfigs.d.ts +17 -1
- package/dist/client/charts.js +13 -13
- package/dist/client/chunks/{DashboardEditModal-BOfLdTgV.js → DashboardEditModal-_ZDMwaGX.js} +1653 -1188
- package/dist/client/chunks/DashboardEditModal-_ZDMwaGX.js.map +1 -0
- package/dist/client/chunks/{ProportionBarChart-DwoXU5VP.js → ProportionBarChart-qfpAWhIg.js} +3 -3
- package/dist/client/chunks/{ProportionBarChart-DwoXU5VP.js.map → ProportionBarChart-qfpAWhIg.js.map} +1 -1
- package/dist/client/chunks/RecordsTable-KmJy94xN.js +556 -0
- package/dist/client/chunks/RecordsTable-KmJy94xN.js.map +1 -0
- package/dist/client/chunks/{RetentionCombinedChart-BqlSV7yF.js → RetentionCombinedChart-C7X6aj97.js} +3 -3
- package/dist/client/chunks/{RetentionCombinedChart-BqlSV7yF.js.map → RetentionCombinedChart-C7X6aj97.js.map} +1 -1
- package/dist/client/chunks/{RetentionHeatmap-VdVkBg8Q.js → RetentionHeatmap-PpRpiqR_.js} +2 -2
- package/dist/client/chunks/{RetentionHeatmap-VdVkBg8Q.js.map → RetentionHeatmap-PpRpiqR_.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-DXw60SEs.js → analysis-builder-DaqyOjLX.js} +169 -168
- package/dist/client/chunks/{analysis-builder-DXw60SEs.js.map → analysis-builder-DaqyOjLX.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-CEvHIlmk.js → analysis-builder-shared-ow9KAHDP.js} +965 -954
- package/dist/client/chunks/analysis-builder-shared-ow9KAHDP.js.map +1 -0
- package/dist/client/chunks/{chart-activity-grid-4jfS8khG.js → chart-activity-grid-DO82rrbW.js} +140 -84
- package/dist/client/chunks/chart-activity-grid-DO82rrbW.js.map +1 -0
- package/dist/client/chunks/{chart-area-Dol6s9no.js → chart-area-9SBeG0GM.js} +21 -21
- package/dist/client/chunks/{chart-area-Dol6s9no.js.map → chart-area-9SBeG0GM.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-5_niozi2.js → chart-bar-tfgmLK2D.js} +5 -5
- package/dist/client/chunks/{chart-bar-5_niozi2.js.map → chart-bar-tfgmLK2D.js.map} +1 -1
- package/dist/client/chunks/{chart-box-plot-Dhp-VwhD.js → chart-box-plot-BuYW6j6g.js} +2 -2
- package/dist/client/chunks/{chart-box-plot-Dhp-VwhD.js.map → chart-box-plot-BuYW6j6g.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-BM2BAMSo.js → chart-bubble-BNmonWqW.js} +2 -2
- package/dist/client/chunks/{chart-bubble-BM2BAMSo.js.map → chart-bubble-BNmonWqW.js.map} +1 -1
- package/dist/client/chunks/{chart-candlestick-BNwLIBfm.js → chart-candlestick-BYeWNkKl.js} +2 -2
- package/dist/client/chunks/{chart-candlestick-BNwLIBfm.js.map → chart-candlestick-BYeWNkKl.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-DoDHQRe7.js → chart-data-table-C_oHiK6N.js} +1094 -1029
- package/dist/client/chunks/chart-data-table-C_oHiK6N.js.map +1 -0
- package/dist/client/chunks/{chart-funnel-Cd7da_sa.js → chart-funnel-B_CWC3cL.js} +2 -2
- package/dist/client/chunks/{chart-funnel-Cd7da_sa.js.map → chart-funnel-B_CWC3cL.js.map} +1 -1
- package/dist/client/chunks/{chart-gauge-DOpul-Oz.js → chart-gauge-D7VxwPnx.js} +3 -3
- package/dist/client/chunks/{chart-gauge-DOpul-Oz.js.map → chart-gauge-D7VxwPnx.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-CeKbK655.js → chart-heat-map-q7Vf_dog.js} +3 -3
- package/dist/client/chunks/{chart-heat-map-CeKbK655.js.map → chart-heat-map-q7Vf_dog.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-Dq8qUOOT.js → chart-kpi-delta-PEuA3iGs.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-Dq8qUOOT.js.map → chart-kpi-delta-PEuA3iGs.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-DgiqTi9g.js → chart-kpi-number-DlxrO6Pq.js} +5 -5
- package/dist/client/chunks/{chart-kpi-number-DgiqTi9g.js.map → chart-kpi-number-DlxrO6Pq.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-CsZMVEnM.js → chart-kpi-text-Cx6cJu2s.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-CsZMVEnM.js.map → chart-kpi-text-Cx6cJu2s.js.map} +1 -1
- package/dist/client/chunks/{chart-line-DlwOB7C7.js → chart-line-pDe25JzB.js} +3 -3
- package/dist/client/chunks/{chart-line-DlwOB7C7.js.map → chart-line-pDe25JzB.js.map} +1 -1
- package/dist/client/chunks/{chart-markdown-DPE34SjC.js → chart-markdown-CRY15yp0.js} +2 -2
- package/dist/client/chunks/{chart-markdown-DPE34SjC.js.map → chart-markdown-CRY15yp0.js.map} +1 -1
- package/dist/client/chunks/{chart-measure-profile-BpTz1fce.js → chart-measure-profile-DyQ-vvuC.js} +3 -3
- package/dist/client/chunks/{chart-measure-profile-BpTz1fce.js.map → chart-measure-profile-DyQ-vvuC.js.map} +1 -1
- package/dist/client/chunks/{chart-pie-FGw66XAH.js → chart-pie-ZrnBycy1.js} +15 -15
- package/dist/client/chunks/{chart-pie-FGw66XAH.js.map → chart-pie-ZrnBycy1.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-D-eRDoiA.js → chart-radar-BXbnYMUJ.js} +13 -13
- package/dist/client/chunks/{chart-radar-D-eRDoiA.js.map → chart-radar-BXbnYMUJ.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-DgtkNTs3.js → chart-radial-bar-CYxH3ryh.js} +3 -3
- package/dist/client/chunks/{chart-radial-bar-DgtkNTs3.js.map → chart-radial-bar-CYxH3ryh.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-D0hhb_EQ.js → chart-sankey-C9R_TDDh.js} +2 -2
- package/dist/client/chunks/{chart-sankey-D0hhb_EQ.js.map → chart-sankey-C9R_TDDh.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-D9EcAiMQ.js → chart-scatter-DrwRkzzl.js} +3 -3
- package/dist/client/chunks/{chart-scatter-D9EcAiMQ.js.map → chart-scatter-DrwRkzzl.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-DCYmJ5DU.js → chart-sunburst-Bs1yqIPp.js} +3 -3
- package/dist/client/chunks/{chart-sunburst-DCYmJ5DU.js.map → chart-sunburst-Bs1yqIPp.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-D_ACSSiB.js → chart-tree-map-BNjHhhVq.js} +3 -3
- package/dist/client/chunks/{chart-tree-map-D_ACSSiB.js.map → chart-tree-map-BNjHhhVq.js.map} +1 -1
- package/dist/client/chunks/{chart-waterfall-CVUVNa1R.js → chart-waterfall-CyoC0uLT.js} +3 -3
- package/dist/client/chunks/{chart-waterfall-CVUVNa1R.js.map → chart-waterfall-CyoC0uLT.js.map} +1 -1
- package/dist/client/chunks/charts-core-DCQ7od_L.js +190 -0
- package/dist/client/chunks/charts-core-DCQ7od_L.js.map +1 -0
- package/dist/client/chunks/charts-loader-Bya_zDIA.js +86 -0
- package/dist/client/chunks/charts-loader-Bya_zDIA.js.map +1 -0
- package/dist/client/chunks/{en-US-BE6VoG0o.js → en-US-HP6FHuNy.js} +3 -1
- package/dist/client/chunks/{en-US-BE6VoG0o.js.map → en-US-HP6FHuNy.js.map} +1 -1
- package/dist/client/chunks/{exceljs.min-DWC_b8G9.js → exceljs.min-CiByP8VQ.js} +2 -3
- package/dist/client/chunks/{exceljs.min-DWC_b8G9.js.map → exceljs.min-CiByP8VQ.js.map} +1 -1
- package/dist/client/chunks/{nl-NL-DFLVORiD.js → nl-NL-CEdoCz6Q.js} +54 -1
- package/dist/client/chunks/nl-NL-CEdoCz6Q.js.map +1 -0
- package/dist/client/chunks/{schema-visualization-C6g_LCiA.js → schema-visualization-DfXxFBIY.js} +3 -3
- package/dist/client/chunks/{schema-visualization-C6g_LCiA.js.map → schema-visualization-DfXxFBIY.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-ZfChDEd3.js → useDirtyStateTracking-BFJHiiVK.js} +15 -15
- package/dist/client/chunks/{useDirtyStateTracking-ZfChDEd3.js.map → useDirtyStateTracking-BFJHiiVK.js.map} +1 -1
- package/dist/client/chunks/{useExplainAI-im9e1rVb.js → useExplainAI-_C4WQE5I.js} +16 -16
- package/dist/client/chunks/{useExplainAI-im9e1rVb.js.map → useExplainAI-_C4WQE5I.js.map} +1 -1
- package/dist/client/chunks/{vendor-Qa1s8oSX.js → vendor-Gb3lH0cc.js} +49 -49
- package/dist/client/chunks/vendor-Gb3lH0cc.js.map +1 -0
- package/dist/client/client/CubeClient.d.ts +11 -1
- package/dist/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +4 -2
- package/dist/client/components/AnalysisBuilder/ColumnFormatsEditor.d.ts +10 -0
- package/dist/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +3 -2
- package/dist/client/components/AnalysisBuilder/utils/queryUtils.d.ts +7 -1
- package/dist/client/components/analyticsPortlet/PortletChart.d.ts +2 -1
- package/dist/client/components/analyticsPortlet/PortletChartView.d.ts +4 -1
- package/dist/client/components/analyticsPortlet/usePortletDeadMembers.d.ts +24 -0
- package/dist/client/components/analyticsPortlet/usePortletPagination.d.ts +21 -0
- package/dist/client/components/charts/RecordsTable.config.d.ts +10 -0
- package/dist/client/components/charts/RecordsTable.d.ts +4 -0
- package/dist/client/components/charts/recordsTableHooks.d.ts +68 -0
- package/dist/client/components.js +1 -1
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons/types.d.ts +1 -0
- package/dist/client/icons.js +2 -2
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +213 -213
- package/dist/client/providers.js +1 -1
- package/dist/client/schema.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/types.d.ts +92 -1
- package/dist/client/utils/recordsTableUtils.d.ts +71 -0
- package/dist/client/utils/rowLinkUtils.d.ts +35 -0
- package/dist/client/utils.js +14 -14
- package/dist/client-bundle-stats.html +1 -1
- package/dist/mcp-app/mcp-app.html +109 -109
- package/dist/server/adapters/base-adapter.d.ts +46 -0
- package/dist/server/adapters/databend-adapter.d.ts +5 -0
- package/dist/server/adapters/duckdb-adapter.d.ts +5 -0
- package/dist/server/adapters/mysql-adapter.d.ts +14 -0
- package/dist/server/adapters/postgres-adapter.d.ts +15 -0
- package/dist/server/adapters/snowflake-adapter.d.ts +6 -0
- package/dist/server/adapters/sqlite-adapter.d.ts +21 -0
- package/dist/server/agent/chart-validation.d.ts +1 -1
- package/dist/server/ai/chart-schema.d.ts +117 -0
- package/dist/server/ai/discovery-helpers.d.ts +14 -0
- package/dist/server/ai/discovery.d.ts +6 -0
- package/dist/server/ai/query-schema.d.ts +1 -1
- package/dist/server/attribute-dimensions.d.ts +102 -0
- package/dist/server/builders/group-by-builder.d.ts +15 -0
- package/dist/server/cache-utils.d.ts +5 -1
- package/dist/server/compiler-metadata.d.ts +24 -3
- package/dist/server/compiler.d.ts +159 -13
- package/dist/server/execution/query-result-cache.d.ts +1 -1
- package/dist/server/executor.d.ts +15 -0
- package/dist/{adapters/google-eKAc20al.js → server/google-DRY7jnOh.js} +46 -28
- package/dist/server/{google-BhvizbFR.cjs → google-PsZzwedr.cjs} +2 -2
- package/dist/server/index.cjs +42 -38
- package/dist/server/index.d.ts +13 -3
- package/dist/server/index.js +2079 -1573
- package/dist/server/{openai-Czk1BdHa.js → openai-6uUf7h-5.js} +1 -1
- package/dist/server/{openai-DBwI1OSu.cjs → openai-BBe1XbZd.cjs} +1 -1
- package/dist/server/{openai-Cu4TXXjl.cjs → openai-BmADmD1e.cjs} +1 -1
- package/dist/server/{openai-CUf4vc3Q.js → openai-C1gLuR-0.js} +1 -1
- package/dist/server/query-handlers.d.ts +2 -1
- package/dist/server/query-validator.d.ts +36 -4
- package/dist/server/types/core.d.ts +13 -0
- package/dist/server/types/cube.d.ts +39 -2
- package/dist/server/types/query.d.ts +8 -0
- package/package.json +2 -2
- package/dist/adapters/ActivityGridChart.config-D6hhj345.cjs +0 -1
- package/dist/adapters/ActivityGridChart.config-QZKs_NYg.js +0 -2
- package/dist/adapters/AreaChart.config-B5XM6G22.js +0 -2
- package/dist/adapters/AreaChart.config-NP34BH5y.cjs +0 -1
- package/dist/adapters/BarChart.config-Bqlmr81N.js +0 -2
- package/dist/adapters/BarChart.config-C3bw-cAP.cjs +0 -1
- package/dist/adapters/BoxPlotChart.config-BOAvoj6x.cjs +0 -1
- package/dist/adapters/BoxPlotChart.config-CTXiycYY.js +0 -2
- package/dist/adapters/BubbleChart.config-CGFIkl4H.cjs +0 -1
- package/dist/adapters/BubbleChart.config-Njxx4Eq1.js +0 -2
- package/dist/adapters/CandlestickChart.config-BZ_yWaSo.cjs +0 -1
- package/dist/adapters/CandlestickChart.config-D4Svhmef.js +0 -2
- package/dist/adapters/DataTable.config-B-bT9puT.js +0 -2
- package/dist/adapters/DataTable.config-BHtt1cPM.cjs +0 -1
- package/dist/adapters/FunnelChart.config-C1e07O7B.cjs +0 -1
- package/dist/adapters/FunnelChart.config-CVEy0tV9.js +0 -2
- package/dist/adapters/GaugeChart.config-5PLNlQlu.js +0 -2
- package/dist/adapters/GaugeChart.config-Cdv6knjZ.cjs +0 -1
- package/dist/adapters/HeatMapChart.config-MGTfYpWJ.js +0 -2
- package/dist/adapters/HeatMapChart.config-jfBEi1ZI.cjs +0 -1
- package/dist/adapters/KpiDelta.config-D2IUsEYz.cjs +0 -1
- package/dist/adapters/KpiDelta.config-DT_MmAHw.js +0 -2
- package/dist/adapters/KpiNumber.config-ChgbKmx8.cjs +0 -1
- package/dist/adapters/KpiNumber.config-CvZ_FhyL.js +0 -2
- package/dist/adapters/KpiText.config-Bgkw8gr2.js +0 -2
- package/dist/adapters/KpiText.config-Bz9orqt6.cjs +0 -1
- package/dist/adapters/LineChart.config-BVew35dI.cjs +0 -1
- package/dist/adapters/LineChart.config-DSCCKXNg.js +0 -2
- package/dist/adapters/MarkdownChart.config-Bu6XUuhI.js +0 -2
- package/dist/adapters/MarkdownChart.config-E4aSVTf3.cjs +0 -1
- package/dist/adapters/MeasureProfileChart.config-BF249hc_.cjs +0 -1
- package/dist/adapters/MeasureProfileChart.config-lERVe38G.js +0 -2
- package/dist/adapters/PieChart.config-7Ujwp8R5.cjs +0 -1
- package/dist/adapters/PieChart.config-jQl2HIcA.js +0 -2
- package/dist/adapters/ProportionBarChart.config-o0w_Pnlt.js +0 -2
- package/dist/adapters/ProportionBarChart.config-phNohhhY.cjs +0 -1
- package/dist/adapters/RadarChart.config-BmrYBd9x.js +0 -2
- package/dist/adapters/RadarChart.config-Dlt3UflG.cjs +0 -1
- package/dist/adapters/RadialBarChart.config-CeEm8xRb.cjs +0 -1
- package/dist/adapters/RadialBarChart.config-Dishh6bC.js +0 -2
- package/dist/adapters/RetentionCombinedChart.config-BaD4ev85.cjs +0 -1
- package/dist/adapters/RetentionCombinedChart.config-m2FjBUi9.js +0 -2
- package/dist/adapters/RetentionHeatmap.config-DiMplGdk.js +0 -2
- package/dist/adapters/RetentionHeatmap.config-Dp6oYwQZ.cjs +0 -1
- package/dist/adapters/SankeyChart.config-C4Y6qzCS.cjs +0 -1
- package/dist/adapters/SankeyChart.config-CJHqgjQ1.js +0 -2
- package/dist/adapters/ScatterChart.config-C0QqvDrN.cjs +0 -1
- package/dist/adapters/ScatterChart.config-DywOsWPW.js +0 -2
- package/dist/adapters/SunburstChart.config-DE8RxpDR.cjs +0 -1
- package/dist/adapters/SunburstChart.config-DohowrO3.js +0 -2
- package/dist/adapters/TreeMapChart.config-D2gXz-zC.cjs +0 -1
- package/dist/adapters/TreeMapChart.config-HMlI29GG.js +0 -2
- package/dist/adapters/WaterfallChart.config-BO2WV2VB.js +0 -2
- package/dist/adapters/WaterfallChart.config-CzwGiheB.cjs +0 -1
- package/dist/adapters/compiler-BNjqYdmc.cjs +0 -166
- package/dist/adapters/core-CzFfrJzu.cjs +0 -1
- package/dist/adapters/handler-m6WgA9xu.cjs +0 -25
- package/dist/adapters/mcp-transport-B0b27YUB.cjs +0 -40
- package/dist/adapters/mcp-transport-BXyA4dTk.js +0 -603
- package/dist/adapters/utils-BoOeig94.cjs +0 -128
- package/dist/client/chunks/DashboardEditModal-BOfLdTgV.js.map +0 -1
- package/dist/client/chunks/analysis-builder-shared-CEvHIlmk.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-4jfS8khG.js.map +0 -1
- package/dist/client/chunks/chart-data-table-DoDHQRe7.js.map +0 -1
- package/dist/client/chunks/charts-core-BPD_hLaL.js +0 -215
- package/dist/client/chunks/charts-core-BPD_hLaL.js.map +0 -1
- package/dist/client/chunks/charts-loader-CwMcOfwT.js +0 -85
- package/dist/client/chunks/charts-loader-CwMcOfwT.js.map +0 -1
- package/dist/client/chunks/nl-NL-DFLVORiD.js.map +0 -1
- 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.
|
|
11
|
-
*
|
|
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
|
|
25
|
-
* response
|
|
26
|
-
*
|
|
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-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core-CIGuwGuI.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 {
|
|
2
|
-
export {
|
|
1
|
+
import { a as e, i as t, n, r, t as i } from "../core-DAAnqPyN.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
|
|
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>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./utils-BiKIg2tk.cjs"),t=require("./mcp-transport-CDxZXpc-.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,o.issues));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,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-
|
|
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,
|
|
1
|
+
import { a as e, i as t, l as n, o as r, r as i, u as a } from "./utils-BagURNRb.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-BpG44Fvn.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
|
|
38
|
+
function j(e, t) {
|
|
27
39
|
return D(e, E(t));
|
|
28
40
|
}
|
|
29
|
-
async function
|
|
30
|
-
return
|
|
41
|
+
async function M(e, t) {
|
|
42
|
+
return j(await e(), t);
|
|
31
43
|
}
|
|
32
|
-
function
|
|
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
|
|
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
|
-
|
|
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
|
|
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:",
|
|
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
|
|
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:",
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,79 +147,76 @@ function M(i) {
|
|
|
134
147
|
}
|
|
135
148
|
//#endregion
|
|
136
149
|
//#region src/adapters/core/mcp-handler.ts
|
|
137
|
-
function
|
|
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
|
|
142
|
-
let n = !!t.app, r = typeof t.app == "object" ? t.app : void 0, i
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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 =
|
|
162
|
-
if (!T) return
|
|
163
|
-
let E = x(C), D = T.method === "initialize", { resources: O, prompts: k, instructions:
|
|
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
|
|
175
|
+
let i = await d(T.method, T.params, {
|
|
166
176
|
semanticLayer: e,
|
|
167
|
-
extractSecurityContext: () =>
|
|
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:
|
|
183
|
+
instructions: A,
|
|
174
184
|
appEnabled: n,
|
|
175
185
|
appConfig: r,
|
|
176
186
|
serverName: t.serverName
|
|
177
187
|
});
|
|
178
|
-
if (
|
|
179
|
-
let o = D &&
|
|
180
|
-
o &&
|
|
181
|
-
let s = l(T.id ?? null,
|
|
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 =
|
|
184
|
-
return
|
|
193
|
+
let e = c();
|
|
194
|
+
return a.sendSse(200, `id: ${e}\n\n` + S(s, e));
|
|
185
195
|
}
|
|
186
|
-
return
|
|
196
|
+
return a.send(200, s);
|
|
187
197
|
} catch (e) {
|
|
188
|
-
if (
|
|
189
|
-
console.error("MCP RPC error:",
|
|
190
|
-
let t =
|
|
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 =
|
|
193
|
-
return
|
|
202
|
+
let e = c();
|
|
203
|
+
return a.sendSse(200, `id: ${e}\n\n` + S(t, e));
|
|
194
204
|
}
|
|
195
|
-
return
|
|
205
|
+
return a.send(200, t);
|
|
196
206
|
}
|
|
197
207
|
}
|
|
198
|
-
return { handleMcpPost:
|
|
208
|
+
return { handleMcpPost: a };
|
|
199
209
|
}
|
|
200
210
|
//#endregion
|
|
201
211
|
//#region src/adapters/core/cube-http-handler.ts
|
|
202
|
-
function
|
|
203
|
-
let { semanticLayer: n, onError: r, mcp: a = {} } = e, o =
|
|
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
|
|
209
|
-
if (!s.isValid) return r.send(400, t(`Query validation failed: ${s.errors.join(", ")}`, 400));
|
|
218
|
+
let o = await M(a, (e) => r.getHeader(e)), s = n.validateQuery(e, o);
|
|
219
|
+
if (!s.isValid) return r.send(400, t(`Query validation failed: ${s.errors.join(", ")}`, 400, s.issues));
|
|
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));
|
|
212
222
|
}
|
|
@@ -234,11 +244,17 @@ function F(e) {
|
|
|
234
244
|
}
|
|
235
245
|
}
|
|
236
246
|
return {
|
|
237
|
-
handleLoadGet: d,
|
|
238
|
-
handleLoadPost: u,
|
|
239
|
-
|
|
240
|
-
|
|
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 {
|
|
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 };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils-BiKIg2tk.cjs"),t=require("../compiler-BxZHh0UD.cjs"),n=require("../mcp-transport-CDxZXpc-.cjs"),r=require("../core-CIGuwGuI.cjs");let i=require("express");i=e.ct(i,1);let a=require("cors");a=e.ct(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-BcYTw6zB.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.
|
|
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
|
-
*
|
|
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
|
-
|
|
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-
|
|
2
|
-
import { t } from "../compiler-
|
|
3
|
-
import { C as n,
|
|
4
|
-
import {
|
|
1
|
+
import { i as e } from "../utils-BagURNRb.js";
|
|
2
|
+
import { t } from "../compiler-CBGD_4Et.js";
|
|
3
|
+
import { C as n, _ as r, h as i, l as a, s as o, x as s } from "../mcp-transport-BpG44Fvn.js";
|
|
4
|
+
import { o as c, r as l, t as u } from "../core-DAAnqPyN.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-
|
|
71
|
+
let { handleAgentChat: n } = await import("../handler-eA0VJDHj.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",
|
|
120
|
-
let l =
|
|
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
|
|
134
|
-
return
|
|
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-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils-BiKIg2tk.cjs"),t=require("../compiler-BxZHh0UD.cjs"),n=require("../mcp-transport-CDxZXpc-.cjs"),r=require("../core-CIGuwGuI.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-BcYTw6zB.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.
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|