drizzle-cube 0.3.28 → 0.3.30

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 (84) hide show
  1. package/dist/adapters/express/index.cjs +1 -1
  2. package/dist/adapters/express/index.js +1 -1
  3. package/dist/adapters/fastify/index.cjs +1 -1
  4. package/dist/adapters/fastify/index.js +1 -1
  5. package/dist/adapters/hono/index.cjs +1 -1
  6. package/dist/adapters/hono/index.js +1 -1
  7. package/dist/adapters/{mcp-transport-ConlvewL.cjs → mcp-transport-BOb26Vbq.cjs} +2 -2
  8. package/dist/adapters/{mcp-transport-CXGL1hg7.js → mcp-transport-DkdMX4bA.js} +99 -100
  9. package/dist/adapters/nextjs/index.cjs +1 -1
  10. package/dist/adapters/nextjs/index.js +1 -1
  11. package/dist/adapters/utils.cjs +1 -1
  12. package/dist/adapters/utils.js +3 -3
  13. package/dist/client/charts.js +12 -12
  14. package/dist/client/chunks/{DashboardEditModal-t5XeTZom.js → DashboardEditModal-rLcmZpe_.js} +8 -8
  15. package/dist/client/chunks/{DashboardEditModal-t5XeTZom.js.map → DashboardEditModal-rLcmZpe_.js.map} +1 -1
  16. package/dist/client/chunks/{RetentionCombinedChart-SsBGHJWi.js → RetentionCombinedChart-7bGP_ozM.js} +2 -2
  17. package/dist/client/chunks/{RetentionCombinedChart-SsBGHJWi.js.map → RetentionCombinedChart-7bGP_ozM.js.map} +1 -1
  18. package/dist/client/chunks/{analysis-builder-CKVYG9jJ.js → analysis-builder-DCt5C58c.js} +8 -8
  19. package/dist/client/chunks/{analysis-builder-CKVYG9jJ.js.map → analysis-builder-DCt5C58c.js.map} +1 -1
  20. package/dist/client/chunks/{analysis-builder-shared-CF8Vx1oD.js → analysis-builder-shared-ysrRYGiU.js} +7 -7
  21. package/dist/client/chunks/{analysis-builder-shared-CF8Vx1oD.js.map → analysis-builder-shared-ysrRYGiU.js.map} +1 -1
  22. package/dist/client/chunks/{chart-activity-grid-Bpu_-8uT.js → chart-activity-grid-sUkuCJzm.js} +2 -2
  23. package/dist/client/chunks/{chart-activity-grid-Bpu_-8uT.js.map → chart-activity-grid-sUkuCJzm.js.map} +1 -1
  24. package/dist/client/chunks/{chart-area-DcvLkvGb.js → chart-area-C4DIi9k_.js} +3 -3
  25. package/dist/client/chunks/{chart-area-DcvLkvGb.js.map → chart-area-C4DIi9k_.js.map} +1 -1
  26. package/dist/client/chunks/{chart-bar-CNfm5iMY.js → chart-bar-7ZleGCsN.js} +2 -2
  27. package/dist/client/chunks/{chart-bar-CNfm5iMY.js.map → chart-bar-7ZleGCsN.js.map} +1 -1
  28. package/dist/client/chunks/{chart-bubble-KA-RYWR8.js → chart-bubble-D-auWIjP.js} +2 -2
  29. package/dist/client/chunks/{chart-bubble-KA-RYWR8.js.map → chart-bubble-D-auWIjP.js.map} +1 -1
  30. package/dist/client/chunks/{chart-data-table-Cq14arji.js → chart-data-table-DW6VNGeW.js} +3 -3
  31. package/dist/client/chunks/{chart-data-table-Cq14arji.js.map → chart-data-table-DW6VNGeW.js.map} +1 -1
  32. package/dist/client/chunks/{chart-funnel-DFKWS49U.js → chart-funnel-eUJApzmA.js} +2 -2
  33. package/dist/client/chunks/{chart-funnel-DFKWS49U.js.map → chart-funnel-eUJApzmA.js.map} +1 -1
  34. package/dist/client/chunks/{chart-heat-map-D2g0dbKz.js → chart-heat-map-DR3O3GXx.js} +2 -2
  35. package/dist/client/chunks/{chart-heat-map-D2g0dbKz.js.map → chart-heat-map-DR3O3GXx.js.map} +1 -1
  36. package/dist/client/chunks/{chart-kpi-delta-Cc-jiBd0.js → chart-kpi-delta-Bp9Yrgyc.js} +3 -3
  37. package/dist/client/chunks/{chart-kpi-delta-Cc-jiBd0.js.map → chart-kpi-delta-Bp9Yrgyc.js.map} +1 -1
  38. package/dist/client/chunks/{chart-kpi-number-BXolYaZA.js → chart-kpi-number-B3yvgbr-.js} +2 -2
  39. package/dist/client/chunks/{chart-kpi-number-BXolYaZA.js.map → chart-kpi-number-B3yvgbr-.js.map} +1 -1
  40. package/dist/client/chunks/{chart-kpi-text-PA8oyypA.js → chart-kpi-text-D0TsUiaO.js} +3 -3
  41. package/dist/client/chunks/{chart-kpi-text-PA8oyypA.js.map → chart-kpi-text-D0TsUiaO.js.map} +1 -1
  42. package/dist/client/chunks/{chart-line-BOrtUdOD.js → chart-line-C7VStgaJ.js} +3 -3
  43. package/dist/client/chunks/{chart-line-BOrtUdOD.js.map → chart-line-C7VStgaJ.js.map} +1 -1
  44. package/dist/client/chunks/{chart-pie-B-Sbsvd2.js → chart-pie-DPdYJSM3.js} +2 -2
  45. package/dist/client/chunks/{chart-pie-B-Sbsvd2.js.map → chart-pie-DPdYJSM3.js.map} +1 -1
  46. package/dist/client/chunks/{chart-radar-CezgvXhm.js → chart-radar-DF6VNSiC.js} +2 -2
  47. package/dist/client/chunks/{chart-radar-CezgvXhm.js.map → chart-radar-DF6VNSiC.js.map} +1 -1
  48. package/dist/client/chunks/{chart-radial-bar-COBPiBxm.js → chart-radial-bar-7Ttfz-kO.js} +2 -2
  49. package/dist/client/chunks/{chart-radial-bar-COBPiBxm.js.map → chart-radial-bar-7Ttfz-kO.js.map} +1 -1
  50. package/dist/client/chunks/{chart-sankey-O4WQBRDk.js → chart-sankey-D86RYk9B.js} +2 -2
  51. package/dist/client/chunks/{chart-sankey-O4WQBRDk.js.map → chart-sankey-D86RYk9B.js.map} +1 -1
  52. package/dist/client/chunks/{chart-scatter-BVF0n9DR.js → chart-scatter-BUnIiLr_.js} +2 -2
  53. package/dist/client/chunks/{chart-scatter-BVF0n9DR.js.map → chart-scatter-BUnIiLr_.js.map} +1 -1
  54. package/dist/client/chunks/{chart-sunburst-DZzVj_6S.js → chart-sunburst-CsHlHfZQ.js} +2 -2
  55. package/dist/client/chunks/{chart-sunburst-DZzVj_6S.js.map → chart-sunburst-CsHlHfZQ.js.map} +1 -1
  56. package/dist/client/chunks/{chart-tree-map-CeEtNuo6.js → chart-tree-map-DFAbkeo1.js} +2 -2
  57. package/dist/client/chunks/{chart-tree-map-CeEtNuo6.js.map → chart-tree-map-DFAbkeo1.js.map} +1 -1
  58. package/dist/client/chunks/{charts-core-DF99lItO.js → charts-core-DAF1iT_h.js} +2 -2
  59. package/dist/client/chunks/{charts-core-DF99lItO.js.map → charts-core-DAF1iT_h.js.map} +1 -1
  60. package/dist/client/chunks/{charts-loader-AkRviD9H.js → charts-loader-7pEaEz-f.js} +20 -20
  61. package/dist/client/chunks/{charts-loader-AkRviD9H.js.map → charts-loader-7pEaEz-f.js.map} +1 -1
  62. package/dist/client/chunks/{core-Bso4ultM.js → core-DGLxd5v5.js} +2 -2
  63. package/dist/client/chunks/{core-Bso4ultM.js.map → core-DGLxd5v5.js.map} +1 -1
  64. package/dist/client/chunks/{hooks-B69r8rwU.js → hooks-CdyIO1-j.js} +4 -4
  65. package/dist/client/chunks/{hooks-B69r8rwU.js.map → hooks-CdyIO1-j.js.map} +1 -1
  66. package/dist/client/chunks/{providers-CxlSRYvE.js → providers-D2xswCYu.js} +2 -2
  67. package/dist/client/chunks/{providers-CxlSRYvE.js.map → providers-D2xswCYu.js.map} +1 -1
  68. package/dist/client/chunks/{syntaxHighlighting-yTdSle2t.js → syntaxHighlighting-DAT9C6Ss.js} +2 -2
  69. package/dist/client/chunks/{syntaxHighlighting-yTdSle2t.js.map → syntaxHighlighting-DAT9C6Ss.js.map} +1 -1
  70. package/dist/client/chunks/{useDirtyStateTracking-GZtwGRu7.js → useDirtyStateTracking-CTS_m9mg.js} +3 -3
  71. package/dist/client/chunks/{useDirtyStateTracking-GZtwGRu7.js.map → useDirtyStateTracking-CTS_m9mg.js.map} +1 -1
  72. package/dist/client/chunks/{vendor-B_H-VRhj.js → vendor-DfDLOfBe.js} +2 -2
  73. package/dist/client/chunks/vendor-DfDLOfBe.js.map +1 -0
  74. package/dist/client/components.js +2 -2
  75. package/dist/client/hooks.js +3 -3
  76. package/dist/client/index.js +9 -9
  77. package/dist/client/providers.js +1 -1
  78. package/dist/client/styles.css +1 -1
  79. package/dist/client/utils.js +6 -6
  80. package/dist/client-bundle-stats.html +34 -33
  81. package/dist/server/index.cjs +3 -3
  82. package/dist/server/index.js +5 -6
  83. package/package.json +1 -1
  84. package/dist/client/chunks/vendor-B_H-VRhj.js.map +0 -1
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("express"),H=require("cors"),i=require("../mcp-transport-ConlvewL.cjs"),s=require("../utils.cjs");function q(h){const{cubes:f,drizzle:C,schema:I,extractSecurityContext:p,engineType:P,cors:x,basePath:y="/cubejs-api/v1",jsonLimit:w="10mb",cache:M,mcp:j={enabled:!0}}=h;if(!f||f.length===0)throw new Error("At least one cube must be provided in the cubes array");const l=E.Router();x&&l.use(H(x)),l.use(E.json({limit:w})),l.use(E.urlencoded({extended:!0,limit:w}));const u=new i.SemanticLayerCompiler({drizzle:C,schema:I,engineType:P,cache:M});if(f.forEach(r=>{u.registerCube(r)}),l.post(`${y}/load`,async(r,t)=>{try{const e=r.body.query||r.body,o=await p(r,t),n=u.validateQuery(e);if(!n.isValid)return t.status(400).json(s.formatErrorResponse(`Query validation failed: ${n.errors.join(", ")}`,400));const a=r.headers["x-cache-control"]==="no-cache",c=await u.executeMultiCubeQuery(e,o,{skipCache:a});t.json(s.formatCubeResponse(e,c,u))}catch(e){console.error("Query execution error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"Query execution failed",500))}}),l.get(`${y}/load`,async(r,t)=>{try{const e=r.query.query;if(!e)return t.status(400).json(s.formatErrorResponse("Query parameter is required",400));let o;try{o=JSON.parse(e)}catch{return t.status(400).json(s.formatErrorResponse("Invalid JSON in query parameter",400))}const n=await p(r,t),a=u.validateQuery(o);if(!a.isValid)return t.status(400).json(s.formatErrorResponse(`Query validation failed: ${a.errors.join(", ")}`,400));const c=r.headers["x-cache-control"]==="no-cache",m=await u.executeMultiCubeQuery(o,n,{skipCache:c});t.json(s.formatCubeResponse(o,m,u))}catch(e){console.error("Query execution error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"Query execution failed",500))}}),l.post(`${y}/batch`,async(r,t)=>{try{const{queries:e}=r.body;if(!e||!Array.isArray(e))return t.status(400).json(s.formatErrorResponse('Request body must contain a "queries" array',400));if(e.length===0)return t.status(400).json(s.formatErrorResponse("Queries array cannot be empty",400));const o=await p(r,t),n=r.headers["x-cache-control"]==="no-cache",a=await s.handleBatchRequest(e,o,u,{skipCache:n});t.json(a)}catch(e){console.error("Batch execution error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"Batch execution failed",500))}}),l.get(`${y}/meta`,(r,t)=>{try{const e=u.getMetadata();t.json(s.formatMetaResponse(e))}catch(e){console.error("Metadata error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"Failed to fetch metadata",500))}}),l.post(`${y}/sql`,async(r,t)=>{try{const e=r.body,o=await p(r,t),n=u.validateQuery(e);if(!n.isValid)return t.status(400).json(s.formatErrorResponse(`Query validation failed: ${n.errors.join(", ")}`,400));const a=e.measures?.[0]||e.dimensions?.[0];if(!a)return t.status(400).json(s.formatErrorResponse("No measures or dimensions specified",400));const c=a.split(".")[0],m=await u.generateSQL(c,e,o);t.json(s.formatSqlResponse(e,m))}catch(e){console.error("SQL generation error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"SQL generation failed",500))}}),l.get(`${y}/sql`,async(r,t)=>{try{const e=r.query.query;if(!e)return t.status(400).json(s.formatErrorResponse("Query parameter is required",400));const o=JSON.parse(e),n=await p(r,t),a=u.validateQuery(o);if(!a.isValid)return t.status(400).json(s.formatErrorResponse(`Query validation failed: ${a.errors.join(", ")}`,400));const c=o.measures?.[0]||o.dimensions?.[0];if(!c)return t.status(400).json(s.formatErrorResponse("No measures or dimensions specified",400));const m=c.split(".")[0],g=await u.generateSQL(m,o,n);t.json(s.formatSqlResponse(o,g))}catch(e){console.error("SQL generation error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"SQL generation failed",500))}}),l.post(`${y}/dry-run`,async(r,t)=>{try{const e=r.body.query||r.body,o=await p(r,t),n=await s.handleDryRun(e,o,u);t.json(n)}catch(e){console.error("Dry-run error:",e),t.status(400).json({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1})}}),l.get(`${y}/dry-run`,async(r,t)=>{try{const e=r.query.query;if(!e)return t.status(400).json({error:"Query parameter is required",valid:!1});const o=JSON.parse(e),n=await p(r,t),a=await s.handleDryRun(o,n,u);t.json(a)}catch(e){console.error("Dry-run error:",e),t.status(400).json({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1})}}),l.post(`${y}/explain`,async(r,t)=>{try{const e=r.body.query||r.body,o=r.body.options||{},n=await p(r,t),a=u.validateQuery(e);if(!a.isValid)return t.status(400).json({error:`Query validation failed: ${a.errors.join(", ")}`});const c=await u.explainQuery(e,n,o);t.json(c)}catch(e){console.error("Explain error:",e),t.status(500).json({error:e instanceof Error?e.message:"Explain query failed"})}}),j.enabled!==!1){const r=j.basePath??"/mcp";l.post(`${r}`,async(t,e)=>{const o=i.validateOriginHeader(t.headers.origin,j.allowedOrigins?{allowedOrigins:j.allowedOrigins}:{});if(!o.valid)return e.status(403).json(i.buildJsonRpcError(null,-32600,o.reason));const n=t.headers.accept;if(!i.validateAcceptHeader(n))return e.status(400).json(i.buildJsonRpcError(null,-32600,"Accept header must include both application/json and text/event-stream"));const a=i.negotiateProtocol(t.headers);if(!a.ok)return e.status(426).json({error:"Unsupported MCP protocol version",supported:a.supported});const c=i.parseJsonRpc(t.body);if(!c)return e.status(400).json(i.buildJsonRpcError(null,-32600,"Invalid JSON-RPC 2.0 request"));const m=i.wantsEventStream(n),g=c.method==="initialize";try{const d=await i.dispatchMcpMethod(c.method,c.params,{semanticLayer:u,extractSecurityContext:p,rawRequest:t,rawResponse:e,negotiatedProtocol:a.negotiated});if(i.isNotification(c))return e.status(202).end();const v=g&&d&&typeof d=="object"&&"sessionId"in d?d.sessionId:void 0;v&&e.setHeader(i.MCP_SESSION_ID_HEADER,v);const b=i.buildJsonRpcResult(c.id??null,d);if(m){const R=i.primeEventId();return e.status(200),e.setHeader("Content-Type","text/event-stream"),e.setHeader("Cache-Control","no-cache"),e.setHeader("Connection","keep-alive"),e.write(`id: ${R}
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("express"),H=require("cors"),i=require("../mcp-transport-BOb26Vbq.cjs"),s=require("../utils.cjs");function q(h){const{cubes:f,drizzle:C,schema:I,extractSecurityContext:p,engineType:P,cors:x,basePath:y="/cubejs-api/v1",jsonLimit:w="10mb",cache:M,mcp:j={enabled:!0}}=h;if(!f||f.length===0)throw new Error("At least one cube must be provided in the cubes array");const l=E.Router();x&&l.use(H(x)),l.use(E.json({limit:w})),l.use(E.urlencoded({extended:!0,limit:w}));const u=new i.SemanticLayerCompiler({drizzle:C,schema:I,engineType:P,cache:M});if(f.forEach(r=>{u.registerCube(r)}),l.post(`${y}/load`,async(r,t)=>{try{const e=r.body.query||r.body,o=await p(r,t),n=u.validateQuery(e);if(!n.isValid)return t.status(400).json(s.formatErrorResponse(`Query validation failed: ${n.errors.join(", ")}`,400));const a=r.headers["x-cache-control"]==="no-cache",c=await u.executeMultiCubeQuery(e,o,{skipCache:a});t.json(s.formatCubeResponse(e,c,u))}catch(e){console.error("Query execution error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"Query execution failed",500))}}),l.get(`${y}/load`,async(r,t)=>{try{const e=r.query.query;if(!e)return t.status(400).json(s.formatErrorResponse("Query parameter is required",400));let o;try{o=JSON.parse(e)}catch{return t.status(400).json(s.formatErrorResponse("Invalid JSON in query parameter",400))}const n=await p(r,t),a=u.validateQuery(o);if(!a.isValid)return t.status(400).json(s.formatErrorResponse(`Query validation failed: ${a.errors.join(", ")}`,400));const c=r.headers["x-cache-control"]==="no-cache",m=await u.executeMultiCubeQuery(o,n,{skipCache:c});t.json(s.formatCubeResponse(o,m,u))}catch(e){console.error("Query execution error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"Query execution failed",500))}}),l.post(`${y}/batch`,async(r,t)=>{try{const{queries:e}=r.body;if(!e||!Array.isArray(e))return t.status(400).json(s.formatErrorResponse('Request body must contain a "queries" array',400));if(e.length===0)return t.status(400).json(s.formatErrorResponse("Queries array cannot be empty",400));const o=await p(r,t),n=r.headers["x-cache-control"]==="no-cache",a=await s.handleBatchRequest(e,o,u,{skipCache:n});t.json(a)}catch(e){console.error("Batch execution error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"Batch execution failed",500))}}),l.get(`${y}/meta`,(r,t)=>{try{const e=u.getMetadata();t.json(s.formatMetaResponse(e))}catch(e){console.error("Metadata error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"Failed to fetch metadata",500))}}),l.post(`${y}/sql`,async(r,t)=>{try{const e=r.body,o=await p(r,t),n=u.validateQuery(e);if(!n.isValid)return t.status(400).json(s.formatErrorResponse(`Query validation failed: ${n.errors.join(", ")}`,400));const a=e.measures?.[0]||e.dimensions?.[0];if(!a)return t.status(400).json(s.formatErrorResponse("No measures or dimensions specified",400));const c=a.split(".")[0],m=await u.generateSQL(c,e,o);t.json(s.formatSqlResponse(e,m))}catch(e){console.error("SQL generation error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"SQL generation failed",500))}}),l.get(`${y}/sql`,async(r,t)=>{try{const e=r.query.query;if(!e)return t.status(400).json(s.formatErrorResponse("Query parameter is required",400));const o=JSON.parse(e),n=await p(r,t),a=u.validateQuery(o);if(!a.isValid)return t.status(400).json(s.formatErrorResponse(`Query validation failed: ${a.errors.join(", ")}`,400));const c=o.measures?.[0]||o.dimensions?.[0];if(!c)return t.status(400).json(s.formatErrorResponse("No measures or dimensions specified",400));const m=c.split(".")[0],g=await u.generateSQL(m,o,n);t.json(s.formatSqlResponse(o,g))}catch(e){console.error("SQL generation error:",e),t.status(500).json(s.formatErrorResponse(e instanceof Error?e.message:"SQL generation failed",500))}}),l.post(`${y}/dry-run`,async(r,t)=>{try{const e=r.body.query||r.body,o=await p(r,t),n=await s.handleDryRun(e,o,u);t.json(n)}catch(e){console.error("Dry-run error:",e),t.status(400).json({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1})}}),l.get(`${y}/dry-run`,async(r,t)=>{try{const e=r.query.query;if(!e)return t.status(400).json({error:"Query parameter is required",valid:!1});const o=JSON.parse(e),n=await p(r,t),a=await s.handleDryRun(o,n,u);t.json(a)}catch(e){console.error("Dry-run error:",e),t.status(400).json({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1})}}),l.post(`${y}/explain`,async(r,t)=>{try{const e=r.body.query||r.body,o=r.body.options||{},n=await p(r,t),a=u.validateQuery(e);if(!a.isValid)return t.status(400).json({error:`Query validation failed: ${a.errors.join(", ")}`});const c=await u.explainQuery(e,n,o);t.json(c)}catch(e){console.error("Explain error:",e),t.status(500).json({error:e instanceof Error?e.message:"Explain query failed"})}}),j.enabled!==!1){const r=j.basePath??"/mcp";l.post(`${r}`,async(t,e)=>{const o=i.validateOriginHeader(t.headers.origin,j.allowedOrigins?{allowedOrigins:j.allowedOrigins}:{});if(!o.valid)return e.status(403).json(i.buildJsonRpcError(null,-32600,o.reason));const n=t.headers.accept;if(!i.validateAcceptHeader(n))return e.status(400).json(i.buildJsonRpcError(null,-32600,"Accept header must include both application/json and text/event-stream"));const a=i.negotiateProtocol(t.headers);if(!a.ok)return e.status(426).json({error:"Unsupported MCP protocol version",supported:a.supported});const c=i.parseJsonRpc(t.body);if(!c)return e.status(400).json(i.buildJsonRpcError(null,-32600,"Invalid JSON-RPC 2.0 request"));const m=i.wantsEventStream(n),g=c.method==="initialize";try{const d=await i.dispatchMcpMethod(c.method,c.params,{semanticLayer:u,extractSecurityContext:p,rawRequest:t,rawResponse:e,negotiatedProtocol:a.negotiated});if(i.isNotification(c))return e.status(202).end();const v=g&&d&&typeof d=="object"&&"sessionId"in d?d.sessionId:void 0;v&&e.setHeader(i.MCP_SESSION_ID_HEADER,v);const b=i.buildJsonRpcResult(c.id??null,d);if(m){const R=i.primeEventId();return e.status(200),e.setHeader("Content-Type","text/event-stream"),e.setHeader("Cache-Control","no-cache"),e.setHeader("Connection","keep-alive"),e.write(`id: ${R}
2
2
 
3
3
  `),e.write(i.serializeSseEvent(b,R)),e.end()}return e.json(b)}catch(d){if(i.isNotification(c))return console.error("MCP notification processing error:",d),e.status(202).end();console.error("MCP RPC error:",d);const v=d?.code??-32603,b=d?.data,R=d.message||"MCP request failed",Q=i.buildJsonRpcError(c.id??null,v,R,b);if(m){const S=i.primeEventId();return e.status(200),e.setHeader("Content-Type","text/event-stream"),e.setHeader("Cache-Control","no-cache"),e.setHeader("Connection","keep-alive"),e.write(`id: ${S}
4
4
 
@@ -1,6 +1,6 @@
1
1
  import R, { Router as L } from "express";
2
2
  import A from "cors";
3
- import { S as J, v as D, b as C, a as _, n as V, p as z, w as B, d as T, i as M, M as F, c as U, e as w, s as Q } from "../mcp-transport-CXGL1hg7.js";
3
+ import { S as J, v as D, b as C, a as _, n as V, p as z, w as B, d as T, i as M, M as F, c as U, e as w, s as Q } from "../mcp-transport-DkdMX4bA.js";
4
4
  import { formatErrorResponse as c, formatCubeResponse as P, handleBatchRequest as G, formatMetaResponse as K, formatSqlResponse as H, handleDryRun as I } from "../utils.js";
5
5
  function W(f) {
6
6
  const {
@@ -1,4 +1,4 @@
1
- "use strict";var O=Object.create;var $=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var A=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var D=(l,s,b,v)=>{if(s&&typeof s=="object"||typeof s=="function")for(let m of k(s))!L.call(l,m)&&m!==b&&$(l,m,{get:()=>s[m],enumerable:!(v=J(s,m))||v.enumerable});return l};var z=(l,s,b)=>(b=l!=null?O(A(l)):{},D(s||!l||!l.__esModule?$(b,"default",{value:l,enumerable:!0}):b,l));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../mcp-transport-ConlvewL.cjs"),n=require("../utils.cjs"),q=function(s,b,v){const{cubes:m,drizzle:j,schema:I,extractSecurityContext:h,engineType:M,cors:S,basePath:g="/cubejs-api/v1",bodyLimit:f=10485760,cache:N,mcp:R={enabled:!0}}=b;if(!m||m.length===0)return v(new Error("At least one cube must be provided in the cubes array"));S&&s.register(import("@fastify/cors"),S),s.addHook("onRequest",async(r,t)=>{r.method==="POST"&&(r.body=void 0)});const d=new i.SemanticLayerCompiler({drizzle:j,schema:I,engineType:M,cache:N});if(m.forEach(r=>{d.registerCube(r)}),s.post(`${g}/load`,{bodyLimit:f,schema:{body:{type:"object",additionalProperties:!0}}},async(r,t)=>{try{const e=r.body,o=e.query||e,a=await h(r),c=d.validateQuery(o);if(!c.isValid)return t.status(400).send(n.formatErrorResponse(`Query validation failed: ${c.errors.join(", ")}`,400));const u=r.headers["x-cache-control"]==="no-cache",p=await d.executeMultiCubeQuery(o,a,{skipCache:u});return n.formatCubeResponse(o,p,d)}catch(e){return r.log.error(e,"Query execution error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"Query execution failed",500))}}),s.get(`${g}/load`,{schema:{querystring:{type:"object",properties:{query:{type:"string"}},required:["query"]}}},async(r,t)=>{try{const{query:e}=r.query;let o;try{o=JSON.parse(e)}catch{return t.status(400).send(n.formatErrorResponse("Invalid JSON in query parameter",400))}const a=await h(r),c=d.validateQuery(o);if(!c.isValid)return t.status(400).send(n.formatErrorResponse(`Query validation failed: ${c.errors.join(", ")}`,400));const u=r.headers["x-cache-control"]==="no-cache",p=await d.executeMultiCubeQuery(o,a,{skipCache:u});return n.formatCubeResponse(o,p,d)}catch(e){return r.log.error(e,"Query execution error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"Query execution failed",500))}}),s.post(`${g}/batch`,{bodyLimit:f,schema:{body:{type:"object",required:["queries"],properties:{queries:{type:"array",items:{type:"object"}}}}}},async(r,t)=>{try{const{queries:e}=r.body;if(!e||!Array.isArray(e))return t.status(400).send(n.formatErrorResponse('Request body must contain a "queries" array',400));if(e.length===0)return t.status(400).send(n.formatErrorResponse("Queries array cannot be empty",400));const o=await h(r),a=r.headers["x-cache-control"]==="no-cache";return await n.handleBatchRequest(e,o,d,{skipCache:a})}catch(e){return r.log.error(e,"Batch execution error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"Batch execution failed",500))}}),s.get(`${g}/meta`,async(r,t)=>{try{const e=d.getMetadata();return n.formatMetaResponse(e)}catch(e){return r.log.error(e,"Metadata error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"Failed to fetch metadata",500))}}),s.post(`${g}/sql`,{bodyLimit:f,schema:{body:{type:"object",additionalProperties:!0}}},async(r,t)=>{try{const e=r.body,o=await h(r),a=d.validateQuery(e);if(!a.isValid)return t.status(400).send(n.formatErrorResponse(`Query validation failed: ${a.errors.join(", ")}`,400));const c=e.measures?.[0]||e.dimensions?.[0];if(!c)return t.status(400).send(n.formatErrorResponse("No measures or dimensions specified",400));const u=c.split(".")[0],p=await d.generateSQL(u,e,o);return n.formatSqlResponse(e,p)}catch(e){return r.log.error(e,"SQL generation error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"SQL generation failed",500))}}),s.get(`${g}/sql`,{schema:{querystring:{type:"object",properties:{query:{type:"string"}},required:["query"]}}},async(r,t)=>{try{const{query:e}=r.query,o=JSON.parse(e),a=await h(r),c=d.validateQuery(o);if(!c.isValid)return t.status(400).send(n.formatErrorResponse(`Query validation failed: ${c.errors.join(", ")}`,400));const u=o.measures?.[0]||o.dimensions?.[0];if(!u)return t.status(400).send(n.formatErrorResponse("No measures or dimensions specified",400));const p=u.split(".")[0],x=await d.generateSQL(p,o,a);return n.formatSqlResponse(o,x)}catch(e){return r.log.error(e,"SQL generation error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"SQL generation failed",500))}}),s.post(`${g}/dry-run`,{bodyLimit:f,schema:{body:{type:"object",additionalProperties:!0}}},async(r,t)=>{try{const e=r.body,o=e.query||e,a=await h(r);return await n.handleDryRun(o,a,d)}catch(e){return r.log.error(e,"Dry-run error"),t.status(400).send({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1})}}),s.get(`${g}/dry-run`,{schema:{querystring:{type:"object",properties:{query:{type:"string"}},required:["query"]}}},async(r,t)=>{try{const{query:e}=r.query,o=JSON.parse(e),a=await h(r);return await n.handleDryRun(o,a,d)}catch(e){return r.log.error(e,"Dry-run error"),t.status(400).send({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1})}}),s.post(`${g}/explain`,{bodyLimit:f,schema:{body:{type:"object",additionalProperties:!0}}},async(r,t)=>{try{const e=r.body,o=e.query||e,a=e.options||{},c=await h(r),u=d.validateQuery(o);return u.isValid?await d.explainQuery(o,c,a):t.status(400).send({error:`Query validation failed: ${u.errors.join(", ")}`})}catch(e){return r.log.error(e,"Explain error"),t.status(500).send({error:e instanceof Error?e.message:"Explain query failed"})}}),R.enabled!==!1){const r=R.basePath??"/mcp";s.post(`${r}`,{bodyLimit:f,schema:{body:{type:"object",additionalProperties:!0}}},async(t,e)=>{const o=i.validateOriginHeader(t.headers.origin,R.allowedOrigins?{allowedOrigins:R.allowedOrigins}:{});if(!o.valid)return e.status(403).send(i.buildJsonRpcError(null,-32600,o.reason));const a=t.headers.accept;if(!i.validateAcceptHeader(a))return e.status(400).send(i.buildJsonRpcError(null,-32600,"Accept header must include both application/json and text/event-stream"));const c=i.negotiateProtocol(t.headers);if(!c.ok)return e.status(426).send({error:"Unsupported MCP protocol version",supported:c.supported});const u=i.parseJsonRpc(t.body);if(!u)return e.status(400).send(i.buildJsonRpcError(null,-32600,"Invalid JSON-RPC 2.0 request"));const p=i.wantsEventStream(a),x=u.method==="initialize";try{const y=await i.dispatchMcpMethod(u.method,u.params,{semanticLayer:d,extractSecurityContext:h,rawRequest:t,rawResponse:e,negotiatedProtocol:c.negotiated});if(i.isNotification(u))return e.status(202).send();const E=x&&y&&typeof y=="object"&&"sessionId"in y?y.sessionId:void 0;E&&e.header(i.MCP_SESSION_ID_HEADER,E);const C=i.buildJsonRpcResult(u.id??null,y);if(p){const w=i.primeEventId();e.header("Content-Type","text/event-stream").header("Cache-Control","no-cache").header("Connection","keep-alive").send(`id: ${w}
1
+ "use strict";var O=Object.create;var $=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var A=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var D=(l,s,b,v)=>{if(s&&typeof s=="object"||typeof s=="function")for(let m of k(s))!L.call(l,m)&&m!==b&&$(l,m,{get:()=>s[m],enumerable:!(v=J(s,m))||v.enumerable});return l};var z=(l,s,b)=>(b=l!=null?O(A(l)):{},D(s||!l||!l.__esModule?$(b,"default",{value:l,enumerable:!0}):b,l));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../mcp-transport-BOb26Vbq.cjs"),n=require("../utils.cjs"),q=function(s,b,v){const{cubes:m,drizzle:j,schema:I,extractSecurityContext:h,engineType:M,cors:S,basePath:g="/cubejs-api/v1",bodyLimit:f=10485760,cache:N,mcp:R={enabled:!0}}=b;if(!m||m.length===0)return v(new Error("At least one cube must be provided in the cubes array"));S&&s.register(import("@fastify/cors"),S),s.addHook("onRequest",async(r,t)=>{r.method==="POST"&&(r.body=void 0)});const d=new i.SemanticLayerCompiler({drizzle:j,schema:I,engineType:M,cache:N});if(m.forEach(r=>{d.registerCube(r)}),s.post(`${g}/load`,{bodyLimit:f,schema:{body:{type:"object",additionalProperties:!0}}},async(r,t)=>{try{const e=r.body,o=e.query||e,a=await h(r),c=d.validateQuery(o);if(!c.isValid)return t.status(400).send(n.formatErrorResponse(`Query validation failed: ${c.errors.join(", ")}`,400));const u=r.headers["x-cache-control"]==="no-cache",p=await d.executeMultiCubeQuery(o,a,{skipCache:u});return n.formatCubeResponse(o,p,d)}catch(e){return r.log.error(e,"Query execution error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"Query execution failed",500))}}),s.get(`${g}/load`,{schema:{querystring:{type:"object",properties:{query:{type:"string"}},required:["query"]}}},async(r,t)=>{try{const{query:e}=r.query;let o;try{o=JSON.parse(e)}catch{return t.status(400).send(n.formatErrorResponse("Invalid JSON in query parameter",400))}const a=await h(r),c=d.validateQuery(o);if(!c.isValid)return t.status(400).send(n.formatErrorResponse(`Query validation failed: ${c.errors.join(", ")}`,400));const u=r.headers["x-cache-control"]==="no-cache",p=await d.executeMultiCubeQuery(o,a,{skipCache:u});return n.formatCubeResponse(o,p,d)}catch(e){return r.log.error(e,"Query execution error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"Query execution failed",500))}}),s.post(`${g}/batch`,{bodyLimit:f,schema:{body:{type:"object",required:["queries"],properties:{queries:{type:"array",items:{type:"object"}}}}}},async(r,t)=>{try{const{queries:e}=r.body;if(!e||!Array.isArray(e))return t.status(400).send(n.formatErrorResponse('Request body must contain a "queries" array',400));if(e.length===0)return t.status(400).send(n.formatErrorResponse("Queries array cannot be empty",400));const o=await h(r),a=r.headers["x-cache-control"]==="no-cache";return await n.handleBatchRequest(e,o,d,{skipCache:a})}catch(e){return r.log.error(e,"Batch execution error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"Batch execution failed",500))}}),s.get(`${g}/meta`,async(r,t)=>{try{const e=d.getMetadata();return n.formatMetaResponse(e)}catch(e){return r.log.error(e,"Metadata error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"Failed to fetch metadata",500))}}),s.post(`${g}/sql`,{bodyLimit:f,schema:{body:{type:"object",additionalProperties:!0}}},async(r,t)=>{try{const e=r.body,o=await h(r),a=d.validateQuery(e);if(!a.isValid)return t.status(400).send(n.formatErrorResponse(`Query validation failed: ${a.errors.join(", ")}`,400));const c=e.measures?.[0]||e.dimensions?.[0];if(!c)return t.status(400).send(n.formatErrorResponse("No measures or dimensions specified",400));const u=c.split(".")[0],p=await d.generateSQL(u,e,o);return n.formatSqlResponse(e,p)}catch(e){return r.log.error(e,"SQL generation error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"SQL generation failed",500))}}),s.get(`${g}/sql`,{schema:{querystring:{type:"object",properties:{query:{type:"string"}},required:["query"]}}},async(r,t)=>{try{const{query:e}=r.query,o=JSON.parse(e),a=await h(r),c=d.validateQuery(o);if(!c.isValid)return t.status(400).send(n.formatErrorResponse(`Query validation failed: ${c.errors.join(", ")}`,400));const u=o.measures?.[0]||o.dimensions?.[0];if(!u)return t.status(400).send(n.formatErrorResponse("No measures or dimensions specified",400));const p=u.split(".")[0],x=await d.generateSQL(p,o,a);return n.formatSqlResponse(o,x)}catch(e){return r.log.error(e,"SQL generation error"),t.status(500).send(n.formatErrorResponse(e instanceof Error?e.message:"SQL generation failed",500))}}),s.post(`${g}/dry-run`,{bodyLimit:f,schema:{body:{type:"object",additionalProperties:!0}}},async(r,t)=>{try{const e=r.body,o=e.query||e,a=await h(r);return await n.handleDryRun(o,a,d)}catch(e){return r.log.error(e,"Dry-run error"),t.status(400).send({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1})}}),s.get(`${g}/dry-run`,{schema:{querystring:{type:"object",properties:{query:{type:"string"}},required:["query"]}}},async(r,t)=>{try{const{query:e}=r.query,o=JSON.parse(e),a=await h(r);return await n.handleDryRun(o,a,d)}catch(e){return r.log.error(e,"Dry-run error"),t.status(400).send({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1})}}),s.post(`${g}/explain`,{bodyLimit:f,schema:{body:{type:"object",additionalProperties:!0}}},async(r,t)=>{try{const e=r.body,o=e.query||e,a=e.options||{},c=await h(r),u=d.validateQuery(o);return u.isValid?await d.explainQuery(o,c,a):t.status(400).send({error:`Query validation failed: ${u.errors.join(", ")}`})}catch(e){return r.log.error(e,"Explain error"),t.status(500).send({error:e instanceof Error?e.message:"Explain query failed"})}}),R.enabled!==!1){const r=R.basePath??"/mcp";s.post(`${r}`,{bodyLimit:f,schema:{body:{type:"object",additionalProperties:!0}}},async(t,e)=>{const o=i.validateOriginHeader(t.headers.origin,R.allowedOrigins?{allowedOrigins:R.allowedOrigins}:{});if(!o.valid)return e.status(403).send(i.buildJsonRpcError(null,-32600,o.reason));const a=t.headers.accept;if(!i.validateAcceptHeader(a))return e.status(400).send(i.buildJsonRpcError(null,-32600,"Accept header must include both application/json and text/event-stream"));const c=i.negotiateProtocol(t.headers);if(!c.ok)return e.status(426).send({error:"Unsupported MCP protocol version",supported:c.supported});const u=i.parseJsonRpc(t.body);if(!u)return e.status(400).send(i.buildJsonRpcError(null,-32600,"Invalid JSON-RPC 2.0 request"));const p=i.wantsEventStream(a),x=u.method==="initialize";try{const y=await i.dispatchMcpMethod(u.method,u.params,{semanticLayer:d,extractSecurityContext:h,rawRequest:t,rawResponse:e,negotiatedProtocol:c.negotiated});if(i.isNotification(u))return e.status(202).send();const E=x&&y&&typeof y=="object"&&"sessionId"in y?y.sessionId:void 0;E&&e.header(i.MCP_SESSION_ID_HEADER,E);const C=i.buildJsonRpcResult(u.id??null,y);if(p){const w=i.primeEventId();e.header("Content-Type","text/event-stream").header("Cache-Control","no-cache").header("Connection","keep-alive").send(`id: ${w}
2
2
 
3
3
  ${i.serializeSseEvent(C,w)}`);return}return e.send(C)}catch(y){if(i.isNotification(u))return t.log.error(y,"MCP notification processing error"),e.status(202).send();t.log.error(y,"MCP RPC error");const E=y?.code??-32603,C=y?.data,w=y.message||"MCP request failed",P=i.buildJsonRpcError(u.id??null,E,w,C);if(p){const Q=i.primeEventId();e.header("Content-Type","text/event-stream").header("Cache-Control","no-cache").header("Connection","keep-alive").send(`id: ${Q}
4
4
 
@@ -1,4 +1,4 @@
1
- import { S as D, v as H, b as C, a as V, n as z, p as T, w as _, d as B, i as $, M as F, c as U, e as q, s as R } from "../mcp-transport-CXGL1hg7.js";
1
+ import { S as D, v as H, b as C, a as V, n as z, p as T, w as _, d as B, i as $, M as F, c as U, e as q, s as R } from "../mcp-transport-DkdMX4bA.js";
2
2
  import { formatErrorResponse as u, formatCubeResponse as j, handleBatchRequest as G, formatMetaResponse as K, formatSqlResponse as M, handleDryRun as I } from "../utils.js";
3
3
  const N = function(n, O, E) {
4
4
  const {
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const T=require("hono"),s=require("../mcp-transport-ConlvewL.cjs"),w=require("../utils.cjs");var J=C=>{const d={...{origin:"*",allowMethods:["GET","HEAD","PUT","POST","DELETE","PATCH"],allowHeaders:[],exposeHeaders:[]},...C},P=(l=>typeof l=="string"?l==="*"?()=>l:a=>l===a?a:null:typeof l=="function"?l:a=>l.includes(a)?a:null)(d.origin),y=(l=>typeof l=="function"?l:Array.isArray(l)?()=>l:()=>[])(d.allowMethods);return async function(a,f){function q(u,o){a.res.headers.set(u,o)}const v=await P(a.req.header("origin")||"",a);if(v&&q("Access-Control-Allow-Origin",v),d.credentials&&q("Access-Control-Allow-Credentials","true"),d.exposeHeaders?.length&&q("Access-Control-Expose-Headers",d.exposeHeaders.join(",")),a.req.method==="OPTIONS"){d.origin!=="*"&&q("Vary","Origin"),d.maxAge!=null&&q("Access-Control-Max-Age",d.maxAge.toString());const u=await y(a.req.header("origin")||"",a);u.length&&q("Access-Control-Allow-Methods",u.join(","));let o=d.allowHeaders;if(!o?.length){const r=a.req.header("Access-Control-Request-Headers");r&&(o=r.split(/\s*,\s*/))}return o?.length&&(q("Access-Control-Allow-Headers",o.join(",")),a.res.headers.append("Vary","Access-Control-Request-Headers")),a.res.headers.delete("Content-Length"),a.res.headers.delete("Content-Type"),new Response(null,{headers:a.res.headers,status:204,statusText:"No Content"})}await f(),d.origin!=="*"&&a.header("Vary","Origin",{append:!0})}};function I(C){const{cubes:j,drizzle:d,schema:P,extractSecurityContext:y,engineType:l,cors:a,basePath:f="/cubejs-api/v1",cache:q,mcp:v={enabled:!0}}=C;if(!j||j.length===0)throw new Error("At least one cube must be provided in the cubes array");const u=new T.Hono;a&&u.use("/*",J(a));const o=new s.SemanticLayerCompiler({drizzle:d,schema:P,engineType:l,cache:q});if(j.forEach(r=>{o.registerCube(r)}),u.post(`${f}/load`,async r=>{try{const e=await r.req.json(),n=e.query||e,i=await y(r),t=o.validateQuery(n);if(!t.isValid)return r.json({error:`Query validation failed: ${t.errors.join(", ")}`},400);const c=r.req.header("x-cache-control")==="no-cache",p=await o.executeMultiCubeQuery(n,i,{skipCache:c});return r.json(w.formatCubeResponse(n,p,o))}catch(e){return console.error("Query execution error:",e),r.json({error:e instanceof Error?e.message:"Query execution failed"},500)}}),u.get(`${f}/load`,async r=>{try{const e=r.req.query("query");if(!e)return r.json({error:"Query parameter is required"},400);let n;try{n=JSON.parse(e)}catch{return r.json({error:"Invalid JSON in query parameter"},400)}const i=await y(r),t=o.validateQuery(n);if(!t.isValid)return r.json({error:`Query validation failed: ${t.errors.join(", ")}`},400);const c=r.req.header("x-cache-control")==="no-cache",p=await o.executeMultiCubeQuery(n,i,{skipCache:c});return r.json(w.formatCubeResponse(n,p,o))}catch(e){return console.error("Query execution error:",e),r.json({error:e instanceof Error?e.message:"Query execution failed"},500)}}),u.post(`${f}/batch`,async r=>{try{const e=await r.req.json(),{queries:n}=e;if(!n||!Array.isArray(n))return r.json({error:'Request body must contain a "queries" array'},400);if(n.length===0)return r.json({error:"Queries array cannot be empty"},400);const i=await y(r),t=r.req.header("x-cache-control")==="no-cache",c=await w.handleBatchRequest(n,i,o,{skipCache:t});return r.json(c)}catch(e){return console.error("Batch execution error:",e),r.json({error:e instanceof Error?e.message:"Batch execution failed"},500)}}),u.get(`${f}/meta`,r=>{try{const e=o.getMetadata();return r.json(w.formatMetaResponse(e))}catch(e){return console.error("Metadata error:",e),r.json({error:e instanceof Error?e.message:"Failed to fetch metadata"},500)}}),u.post(`${f}/sql`,async r=>{try{const e=await r.req.json(),n=await y(r),i=o.validateQuery(e);if(!i.isValid)return r.json({error:`Query validation failed: ${i.errors.join(", ")}`},400);const t=e.measures?.[0]||e.dimensions?.[0];if(!t)return r.json({error:"No measures or dimensions specified"},400);const c=t.split(".")[0],p=await o.generateSQL(c,e,n);return r.json(w.formatSqlResponse(e,p))}catch(e){return console.error("SQL generation error:",e),r.json({error:e instanceof Error?e.message:"SQL generation failed"},500)}}),u.get(`${f}/sql`,async r=>{try{const e=r.req.query("query");if(!e)return r.json({error:"Query parameter is required"},400);const n=JSON.parse(e),i=await y(r),t=o.validateQuery(n);if(!t.isValid)return r.json({error:`Query validation failed: ${t.errors.join(", ")}`},400);const c=n.measures?.[0]||n.dimensions?.[0];if(!c)return r.json({error:"No measures or dimensions specified"},400);const p=c.split(".")[0],g=await o.generateSQL(p,n,i);return r.json(w.formatSqlResponse(n,g))}catch(e){return console.error("SQL generation error:",e),r.json({error:e instanceof Error?e.message:"SQL generation failed"},500)}}),u.post(`${f}/dry-run`,async r=>{try{const e=await r.req.json(),n=e.query||e,i=await y(r),t=await w.handleDryRun(n,i,o);return r.json(t)}catch(e){return console.error("Dry-run error:",e),r.json({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1},400)}}),u.get(`${f}/dry-run`,async r=>{try{const e=r.req.query("query");if(!e)return r.json({error:"Query parameter is required",valid:!1},400);const n=JSON.parse(e),i=await y(r),t=await w.handleDryRun(n,i,o);return r.json(t)}catch(e){return console.error("Dry-run error:",e),r.json({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1},400)}}),u.post(`${f}/explain`,async r=>{try{const e=await r.req.json(),n=e.query||e,i=e.options||{},t=await y(r),c=o.validateQuery(n);if(!c.isValid)return r.json({error:`Query validation failed: ${c.errors.join(", ")}`},400);const p=await o.explainQuery(n,t,i);return r.json(p)}catch(e){return console.error("Explain error:",e),r.json({error:e instanceof Error?e.message:"Explain query failed"},500)}}),v.enabled!==!1){const r={uri:"drizzle-cube://schema",name:"Cube Schema",description:"Current cube metadata as JSON",mimeType:"application/json",text:JSON.stringify(o.getMetadata(),null,2)},e=[...s.getDefaultResources(),r],n=s.getDefaultPrompts(),i=v.basePath??"/mcp";u.post(`${i}`,async t=>{const c=s.validateOriginHeader(t.req.header("origin"),v.allowedOrigins?{allowedOrigins:v.allowedOrigins}:{});if(!c.valid)return t.json(s.buildJsonRpcError(null,-32600,c.reason),403);const p=t.req.header("accept");if(!s.validateAcceptHeader(p))return t.json(s.buildJsonRpcError(null,-32600,"Accept header must include both application/json and text/event-stream"),400);const g=s.negotiateProtocol(t.req.header());if(!g.ok)return t.json({error:"Unsupported MCP protocol version",supported:g.supported},426);const H=await t.req.json().catch(()=>null),m=s.parseJsonRpc(H);if(!m)return t.json(s.buildJsonRpcError(null,-32600,"Invalid JSON-RPC 2.0 request"),400);const $=s.wantsEventStream(p),O=m.method==="initialize";try{const h=await s.dispatchMcpMethod(m.method,m.params,{semanticLayer:o,extractSecurityContext:y,rawRequest:t,rawResponse:null,negotiatedProtocol:g.negotiated,resources:e,prompts:n});if(s.isNotification(m))return t.body(null,202);const S=s.buildJsonRpcResult(m.id??null,h),A=O&&h&&typeof h=="object"&&"sessionId"in h?h.sessionId:void 0,b={};if(A&&(b[s.MCP_SESSION_ID_HEADER]=A),$){const R=new TextEncoder,x=s.primeEventId(),Q=new ReadableStream({start(E){E.enqueue(R.encode(`id: ${x}
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const T=require("hono"),s=require("../mcp-transport-BOb26Vbq.cjs"),w=require("../utils.cjs");var J=C=>{const d={...{origin:"*",allowMethods:["GET","HEAD","PUT","POST","DELETE","PATCH"],allowHeaders:[],exposeHeaders:[]},...C},P=(l=>typeof l=="string"?l==="*"?()=>l:a=>l===a?a:null:typeof l=="function"?l:a=>l.includes(a)?a:null)(d.origin),y=(l=>typeof l=="function"?l:Array.isArray(l)?()=>l:()=>[])(d.allowMethods);return async function(a,f){function q(u,o){a.res.headers.set(u,o)}const v=await P(a.req.header("origin")||"",a);if(v&&q("Access-Control-Allow-Origin",v),d.credentials&&q("Access-Control-Allow-Credentials","true"),d.exposeHeaders?.length&&q("Access-Control-Expose-Headers",d.exposeHeaders.join(",")),a.req.method==="OPTIONS"){d.origin!=="*"&&q("Vary","Origin"),d.maxAge!=null&&q("Access-Control-Max-Age",d.maxAge.toString());const u=await y(a.req.header("origin")||"",a);u.length&&q("Access-Control-Allow-Methods",u.join(","));let o=d.allowHeaders;if(!o?.length){const r=a.req.header("Access-Control-Request-Headers");r&&(o=r.split(/\s*,\s*/))}return o?.length&&(q("Access-Control-Allow-Headers",o.join(",")),a.res.headers.append("Vary","Access-Control-Request-Headers")),a.res.headers.delete("Content-Length"),a.res.headers.delete("Content-Type"),new Response(null,{headers:a.res.headers,status:204,statusText:"No Content"})}await f(),d.origin!=="*"&&a.header("Vary","Origin",{append:!0})}};function I(C){const{cubes:j,drizzle:d,schema:P,extractSecurityContext:y,engineType:l,cors:a,basePath:f="/cubejs-api/v1",cache:q,mcp:v={enabled:!0}}=C;if(!j||j.length===0)throw new Error("At least one cube must be provided in the cubes array");const u=new T.Hono;a&&u.use("/*",J(a));const o=new s.SemanticLayerCompiler({drizzle:d,schema:P,engineType:l,cache:q});if(j.forEach(r=>{o.registerCube(r)}),u.post(`${f}/load`,async r=>{try{const e=await r.req.json(),n=e.query||e,i=await y(r),t=o.validateQuery(n);if(!t.isValid)return r.json({error:`Query validation failed: ${t.errors.join(", ")}`},400);const c=r.req.header("x-cache-control")==="no-cache",p=await o.executeMultiCubeQuery(n,i,{skipCache:c});return r.json(w.formatCubeResponse(n,p,o))}catch(e){return console.error("Query execution error:",e),r.json({error:e instanceof Error?e.message:"Query execution failed"},500)}}),u.get(`${f}/load`,async r=>{try{const e=r.req.query("query");if(!e)return r.json({error:"Query parameter is required"},400);let n;try{n=JSON.parse(e)}catch{return r.json({error:"Invalid JSON in query parameter"},400)}const i=await y(r),t=o.validateQuery(n);if(!t.isValid)return r.json({error:`Query validation failed: ${t.errors.join(", ")}`},400);const c=r.req.header("x-cache-control")==="no-cache",p=await o.executeMultiCubeQuery(n,i,{skipCache:c});return r.json(w.formatCubeResponse(n,p,o))}catch(e){return console.error("Query execution error:",e),r.json({error:e instanceof Error?e.message:"Query execution failed"},500)}}),u.post(`${f}/batch`,async r=>{try{const e=await r.req.json(),{queries:n}=e;if(!n||!Array.isArray(n))return r.json({error:'Request body must contain a "queries" array'},400);if(n.length===0)return r.json({error:"Queries array cannot be empty"},400);const i=await y(r),t=r.req.header("x-cache-control")==="no-cache",c=await w.handleBatchRequest(n,i,o,{skipCache:t});return r.json(c)}catch(e){return console.error("Batch execution error:",e),r.json({error:e instanceof Error?e.message:"Batch execution failed"},500)}}),u.get(`${f}/meta`,r=>{try{const e=o.getMetadata();return r.json(w.formatMetaResponse(e))}catch(e){return console.error("Metadata error:",e),r.json({error:e instanceof Error?e.message:"Failed to fetch metadata"},500)}}),u.post(`${f}/sql`,async r=>{try{const e=await r.req.json(),n=await y(r),i=o.validateQuery(e);if(!i.isValid)return r.json({error:`Query validation failed: ${i.errors.join(", ")}`},400);const t=e.measures?.[0]||e.dimensions?.[0];if(!t)return r.json({error:"No measures or dimensions specified"},400);const c=t.split(".")[0],p=await o.generateSQL(c,e,n);return r.json(w.formatSqlResponse(e,p))}catch(e){return console.error("SQL generation error:",e),r.json({error:e instanceof Error?e.message:"SQL generation failed"},500)}}),u.get(`${f}/sql`,async r=>{try{const e=r.req.query("query");if(!e)return r.json({error:"Query parameter is required"},400);const n=JSON.parse(e),i=await y(r),t=o.validateQuery(n);if(!t.isValid)return r.json({error:`Query validation failed: ${t.errors.join(", ")}`},400);const c=n.measures?.[0]||n.dimensions?.[0];if(!c)return r.json({error:"No measures or dimensions specified"},400);const p=c.split(".")[0],g=await o.generateSQL(p,n,i);return r.json(w.formatSqlResponse(n,g))}catch(e){return console.error("SQL generation error:",e),r.json({error:e instanceof Error?e.message:"SQL generation failed"},500)}}),u.post(`${f}/dry-run`,async r=>{try{const e=await r.req.json(),n=e.query||e,i=await y(r),t=await w.handleDryRun(n,i,o);return r.json(t)}catch(e){return console.error("Dry-run error:",e),r.json({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1},400)}}),u.get(`${f}/dry-run`,async r=>{try{const e=r.req.query("query");if(!e)return r.json({error:"Query parameter is required",valid:!1},400);const n=JSON.parse(e),i=await y(r),t=await w.handleDryRun(n,i,o);return r.json(t)}catch(e){return console.error("Dry-run error:",e),r.json({error:e instanceof Error?e.message:"Dry-run validation failed",valid:!1},400)}}),u.post(`${f}/explain`,async r=>{try{const e=await r.req.json(),n=e.query||e,i=e.options||{},t=await y(r),c=o.validateQuery(n);if(!c.isValid)return r.json({error:`Query validation failed: ${c.errors.join(", ")}`},400);const p=await o.explainQuery(n,t,i);return r.json(p)}catch(e){return console.error("Explain error:",e),r.json({error:e instanceof Error?e.message:"Explain query failed"},500)}}),v.enabled!==!1){const r={uri:"drizzle-cube://schema",name:"Cube Schema",description:"Current cube metadata as JSON",mimeType:"application/json",text:JSON.stringify(o.getMetadata(),null,2)},e=[...s.getDefaultResources(),r],n=s.getDefaultPrompts(),i=v.basePath??"/mcp";u.post(`${i}`,async t=>{const c=s.validateOriginHeader(t.req.header("origin"),v.allowedOrigins?{allowedOrigins:v.allowedOrigins}:{});if(!c.valid)return t.json(s.buildJsonRpcError(null,-32600,c.reason),403);const p=t.req.header("accept");if(!s.validateAcceptHeader(p))return t.json(s.buildJsonRpcError(null,-32600,"Accept header must include both application/json and text/event-stream"),400);const g=s.negotiateProtocol(t.req.header());if(!g.ok)return t.json({error:"Unsupported MCP protocol version",supported:g.supported},426);const H=await t.req.json().catch(()=>null),m=s.parseJsonRpc(H);if(!m)return t.json(s.buildJsonRpcError(null,-32600,"Invalid JSON-RPC 2.0 request"),400);const $=s.wantsEventStream(p),O=m.method==="initialize";try{const h=await s.dispatchMcpMethod(m.method,m.params,{semanticLayer:o,extractSecurityContext:y,rawRequest:t,rawResponse:null,negotiatedProtocol:g.negotiated,resources:e,prompts:n});if(s.isNotification(m))return t.body(null,202);const S=s.buildJsonRpcResult(m.id??null,h),A=O&&h&&typeof h=="object"&&"sessionId"in h?h.sessionId:void 0,b={};if(A&&(b[s.MCP_SESSION_ID_HEADER]=A),$){const R=new TextEncoder,x=s.primeEventId(),Q=new ReadableStream({start(E){E.enqueue(R.encode(`id: ${x}
2
2
 
3
3
  `)),E.enqueue(R.encode(s.serializeSseEvent(S,x))),E.close()}});return new Response(Q,{status:200,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive",...b}})}return t.json(S,200,b)}catch(h){if(s.isNotification(m))return console.error("MCP notification processing error:",h),t.body(null,202);console.error("MCP RPC error:",h);const S=h?.code??-32603,A=h?.data,b=h.message||"MCP request failed",R=s.buildJsonRpcError(m.id??null,S,b,A);if($){const x=new TextEncoder,Q=s.primeEventId(),E=new ReadableStream({start(M){M.enqueue(x.encode(`id: ${Q}
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { Hono as J } from "hono";
2
- import { S as k, v as V, b as Q, a as B, n as z, p as _, w as U, d as F, g as G, f as K, i as I, c as W, M as X, e as $, s as H } from "../mcp-transport-CXGL1hg7.js";
2
+ import { S as k, v as V, b as Q, a as B, n as z, p as _, w as U, d as F, g as G, f as K, i as I, c as W, M as X, e as $, s as H } from "../mcp-transport-DkdMX4bA.js";
3
3
  import { formatCubeResponse as N, handleBatchRequest as Y, formatMetaResponse as Z, formatSqlResponse as O, handleDryRun as D } from "../utils.js";
4
4
  var ee = (q) => {
5
5
  const l = {
@@ -195,9 +195,9 @@
195
195
  `)}}]},hn={name:"drizzle-cube-query-rules",description:"Key generation rules aligned with Gemini single-step prompt",messages:[{role:"user",content:{type:"text",text:["Rules (keep JSON only):","- Use only measures/dimensions/timeDimensions from schema.","- timeDimensions: include granularity when grouping; use inDateRange filter for relative windows; combine when both requested.","- Funnel detection keywords: funnel, conversion, journey, drop off, step by step; use funnel format only if eventStream metadata exists.","- Funnel rules: bindingKey/timeDimension from cube metadata; include time filter on step 0 (default last 6 months) using inDateRange; steps ordered; flat filters.","- Chart selection: line/area for time trends; bar for categories; scatter for 2-measure correlations; bubble for 3-measure correlations; funnel for funnels.","- Correlation keywords (correlation/relationship/vs/compare) -> scatter/bubble, never line.","- Prefer .name fields over .id; avoid Id dimensions unless requested.","- Filters: flat array of {member, operator, values}; operators equals, notEquals, contains, notContains, gt, gte, lt, lte, inDateRange, set, notSet."].join(`
196
196
  `)}}]},gn={name:"drizzle-cube-query-building",description:"CRITICAL: Complete guide for building valid queries of all types with examples",messages:[{role:"user",content:{type:"text",text:["# Drizzle Cube Query Building Guide","","## CRITICAL: Cross-Cube Joins","","You can combine measures from one cube with dimensions from RELATED cubes!",'Check the "joins" property in discover results to see relationships.',"",'Example: "Top 5 employees by pull requests last 3 months"',"- Productivity cube has: measures (totalPullRequests), dimensions (date)","- Productivity joins to Employees (via employeeId)","- Employees cube has: dimensions (name, department)","","Query combining BOTH cubes:","```json","{",' "measures": ["Productivity.totalPullRequests"],',' "dimensions": ["Employees.name"],',' "filters": [',' { "member": "Productivity.date", "operator": "inDateRange", "values": ["last 3 months"] }'," ],",' "order": { "Productivity.totalPullRequests": "desc" },',' "limit": 5',"}","```","The system AUTOMATICALLY joins Productivity to Employees for you!","","---","","## Date Filtering vs Time Grouping","","### For AGGREGATED TOTALS (no time breakdown)","Use `filters` with `inDateRange` operator. Do NOT use timeDimensions.","","```json","{",' "measures": ["Productivity.totalPullRequests"],',' "dimensions": ["Employees.name"],',' "filters": [{ "member": "Productivity.date", "operator": "inDateRange", "values": ["last 3 months"] }],',' "order": { "Productivity.totalPullRequests": "desc" },',' "limit": 5',"}","```","Result: 5 rows total, one per employee, with SUMMED pull requests.","","### For TIME SERIES (grouped by period)","Use `timeDimensions` WITH `granularity`.","","```json","{",' "measures": ["Productivity.totalPullRequests"],',' "timeDimensions": [{ "dimension": "Productivity.date", "dateRange": "last 3 months", "granularity": "month" }]',"}","```","Result: 3 rows (one per month) with pull request totals.","","### WRONG: timeDimensions without granularity","```json","// DON'T DO THIS - groups by DAY, returns ~90 rows!",'{ "timeDimensions": [{ "dimension": "X.date", "dateRange": "last 3 months" }] }',"```","","---","","## Regular Query Structure","","```json","{",' "measures": ["Cube.measure1", "Cube.measure2"],',' "dimensions": ["Cube.dimension1", "RelatedCube.dimension"],',' "filters": [',' { "member": "Cube.field", "operator": "equals", "values": ["value"] },',' { "member": "Cube.date", "operator": "inDateRange", "values": ["last 30 days"] }'," ],",' "timeDimensions": [],',' "order": { "Cube.measure1": "desc" },',' "limit": 100,',' "offset": 0',"}","```","","### Filter Operators","- String: equals, notEquals, contains, notContains, startsWith, endsWith","- Numeric: gt, gte, lt, lte","- Null: set, notSet","- Date: inDateRange, beforeDate, afterDate","","### Date Range Values",'- Relative: "last 7 days", "last 3 months", "last year", "this week", "this month"','- Absolute: ["2024-01-01", "2024-03-31"]',"","---","","## Funnel Query Structure","","Use when: conversion analysis, user journeys, step-by-step analysis","Requires: Cube with eventStream metadata","","```json","{",' "funnel": {',' "bindingKey": "Events.userId",',' "timeDimension": "Events.timestamp",',' "steps": ['," {",' "name": "Step 1",',' "filter": [',' { "member": "Events.eventType", "operator": "equals", "values": ["signup"] },',' { "member": "Events.timestamp", "operator": "inDateRange", "values": ["last 6 months"] }'," ]"," },"," {",' "name": "Step 2",',' "filter": [',' { "member": "Events.eventType", "operator": "equals", "values": ["purchase"] }'," ],",' "timeToConvert": { "value": 7, "unit": "day" }'," }"," ],",' "includeTimeMetrics": true'," }","}","```","","IMPORTANT: Put time filter (inDateRange) ONLY on step 0!","","---","","## Flow Query Structure","","Use when: analyzing event sequences, path analysis","","```json","{",' "flow": {',' "bindingKey": "Events.sessionId",',' "eventDimension": "Events.eventType",',' "timeDimension": "Events.timestamp",',' "stepsBefore": 2,',' "stepsAfter": 2,',' "startingStep": "checkout"'," }","}","```","","---","","## Retention Query Structure","","Use when: cohort analysis, user retention tracking","","```json","{",' "retention": {',' "bindingKey": "Users.id",',' "timeDimension": "Events.timestamp",',' "periods": 8,',' "granularity": "week",',' "retentionType": "rolling",',' "breakdownDimensions": ["Events.country"]'," }","}","```","","---","","## Common Mistakes to Avoid","","1. Using timeDimensions when you want aggregated totals → Use filters with inDateRange instead","2. Omitting granularity in timeDimensions → Results in day-level grouping","3. Guessing field names → Always use discover first to get actual schema","4. Nested filter arrays → Filters must be flat: [{ member, operator, values }]",'5. Missing date filter for "last N" queries → Always add inDateRange filter'].join(`
197
197
  `)}}]},bn={name:"drizzle-cube-date-filtering",description:"CRITICAL: How to correctly filter by date vs group by time period - the #1 source of query mistakes",messages:[{role:"user",content:{type:"text",text:["# Date Filtering vs Time Grouping - CRITICAL GUIDE","","This is the most common mistake when building queries. These are TWO DIFFERENT operations.","","## Quick Decision Tree","","```","User wants data over a time period?",'├── Wants AGGREGATED TOTALS (e.g., "total sales last month")',"│ └── Use: filters with inDateRange operator","│",'└── Wants TIME SERIES breakdown (e.g., "daily sales last month")'," └── Use: timeDimensions with granularity","```","","## For Aggregated Totals (MOST COMMON)","",'When user says: "last 3 months", "over the past year", "in Q1", "since January"',"","```json","{",' "measures": ["Sales.totalRevenue"],',' "dimensions": ["Products.category"],',' "filters": [',' { "member": "Sales.date", "operator": "inDateRange", "values": ["last 3 months"] }'," ]","}","```","","Result: One row per category with TOTAL revenue over the 3-month period.","","## For Time Series (Trend Analysis)","",'When user says: "by month", "per week", "daily trend", "over time"',"","```json","{",' "measures": ["Sales.totalRevenue"],',' "timeDimensions": [',' { "dimension": "Sales.date", "dateRange": "last 3 months", "granularity": "month" }'," ]","}","```","","Result: Multiple rows, one per month.","","## WRONG: timeDimensions Without Granularity","","```json","// This returns ~90 rows (daily) instead of aggregates!","{",' "timeDimensions": [{ "dimension": "Sales.date", "dateRange": "last 3 months" }]',"}","```","","## Both: Filter AND Group","",'When user wants: "monthly breakdown for last quarter"',"","```json","{",' "measures": ["Sales.totalRevenue"],',' "filters": [',' { "member": "Sales.date", "operator": "inDateRange", "values": ["last quarter"] }'," ],",' "timeDimensions": [',' { "dimension": "Sales.date", "granularity": "month" }'," ]","}","```","","## Summary Table","","| User Request | Use | Example |","|-------------|-----|---------|",'| "total for last 3 months" | filters + inDateRange | { filters: [{ operator: "inDateRange", values: ["last 3 months"] }] } |','| "top 5 last quarter" | filters + inDateRange | Same as above + order + limit |','| "monthly trend" | timeDimensions + granularity | { timeDimensions: [{ granularity: "month" }] } |','| "daily breakdown last week" | timeDimensions | { timeDimensions: [{ dateRange: "last week", granularity: "day" }] } |'].join(`
198
- `)}}]},yn=[pn,hn,gn,bn];function Cn(){return yn}class Fe{cubes=new Map;dbExecutor;metadataCache;cacheConfig;constructor(e){e?.databaseExecutor?this.dbExecutor=e.databaseExecutor:e?.drizzle&&(this.dbExecutor=We(e.drizzle,e.schema,e.engineType)),this.cacheConfig=e?.cache}setDatabaseExecutor(e){this.dbExecutor=e}getEngineType(){return this.dbExecutor?.getEngineType()}setDrizzle(e,t,n){this.dbExecutor=We(e,t,n)}hasExecutor(){return!!this.dbExecutor}registerCube(e){e.meta&&console.log(`[DEBUG] registerCube: ${e.name} has meta:`,JSON.stringify(e.meta)),this.validateCalculatedMeasures(e),new H(this.cubes).populateDependencies(e),this.cubes.set(e.name,e),this.invalidateMetadataCache()}validateCalculatedMeasures(e){const t=[];for(const[n,s]of Object.entries(e.measures))if(s.type==="calculated"){if(!s.calculatedSql){t.push(`Calculated measure '${e.name}.${n}' must have calculatedSql property`);continue}const i=Zt(s.calculatedSql);if(!i.isValid){t.push(`Invalid calculatedSql syntax in '${e.name}.${n}': ${i.errors.join(", ")}`);continue}const r=new Map(this.cubes);r.set(e.name,e);const a=new H(r);try{a.validateDependencies(e)}catch(u){t.push(u instanceof Error?u.message:String(u))}}if(t.length===0){const n=new Map(this.cubes);n.set(e.name,e);const s=new H(n);s.buildGraph(e);const i=s.detectCycle();i&&t.push(`Circular dependency detected in calculated measures: ${i.join(" -> ")}`)}if(t.length>0)throw new Error(`Calculated measure validation failed for cube '${e.name}':
198
+ `)}}]},yn=[pn,hn,gn,bn];function Cn(){return yn}class Fe{cubes=new Map;dbExecutor;metadataCache;cacheConfig;constructor(e){e?.databaseExecutor?this.dbExecutor=e.databaseExecutor:e?.drizzle&&(this.dbExecutor=We(e.drizzle,e.schema,e.engineType)),this.cacheConfig=e?.cache}setDatabaseExecutor(e){this.dbExecutor=e}getEngineType(){return this.dbExecutor?.getEngineType()}setDrizzle(e,t,n){this.dbExecutor=We(e,t,n)}hasExecutor(){return!!this.dbExecutor}registerCube(e){this.validateCalculatedMeasures(e),new H(this.cubes).populateDependencies(e),this.cubes.set(e.name,e),this.invalidateMetadataCache()}validateCalculatedMeasures(e){const t=[];for(const[n,s]of Object.entries(e.measures))if(s.type==="calculated"){if(!s.calculatedSql){t.push(`Calculated measure '${e.name}.${n}' must have calculatedSql property`);continue}const i=Zt(s.calculatedSql);if(!i.isValid){t.push(`Invalid calculatedSql syntax in '${e.name}.${n}': ${i.errors.join(", ")}`);continue}const r=new Map(this.cubes);r.set(e.name,e);const a=new H(r);try{a.validateDependencies(e)}catch(u){t.push(u instanceof Error?u.message:String(u))}}if(t.length===0){const n=new Map(this.cubes);n.set(e.name,e);const s=new H(n);s.buildGraph(e);const i=s.detectCycle();i&&t.push(`Circular dependency detected in calculated measures: ${i.join(" -> ")}`)}if(t.length>0)throw new Error(`Calculated measure validation failed for cube '${e.name}':
199
199
  ${t.join(`
200
- `)}`)}getCube(e){return this.cubes.get(e)}getAllCubes(){return Array.from(this.cubes.values())}getAllCubesMap(){return this.cubes}async execute(e,t,n){if(!this.dbExecutor)throw new Error("Database executor not configured");return new G(this.dbExecutor,this.cacheConfig).execute(this.cubes,e,t,n)}async executeMultiCubeQuery(e,t,n){return this.execute(e,t,n)}async executeQuery(e,t,n){if(!this.cubes.get(e))throw new Error(`Cube '${e}' not found`);return this.execute(t,n)}getMetadata(){return this.metadataCache?this.metadataCache:(this.metadataCache=Array.from(this.cubes.values()).map(e=>this.generateCubeMetadata(e)),this.metadataCache)}getColumnName(e){if(e&&e.name||e&&e.columnType&&e.name)return e.name;if(typeof e=="string")return e;if(e&&typeof e=="object"){if(e._.name)return e._.name;if(e.name)return e.name;if(e.columnName)return e.columnName}return"unknown_column"}static DEFAULT_TIME_GRANULARITIES=["year","quarter","month","week","day","hour"];generateCubeMetadata(e){const t=Object.keys(e.measures),n=Object.keys(e.dimensions),s=new Array(t.length),i=new Array(n.length);for(let c=0;c<t.length;c++){const l=t[c],m=e.measures[l];let p;m.drillMembers&&m.drillMembers.length>0&&(p=m.drillMembers.map(f=>f.includes(".")?f:`${e.name}.${f}`)),s[c]={name:`${e.name}.${l}`,title:m.title||l,shortTitle:m.title||l,type:m.type,format:void 0,description:m.description,synonyms:m.synonyms,drillMembers:p}}for(let c=0;c<n.length;c++){const l=n[c],m=e.dimensions[l];let p;m.type==="time"&&(p=m.granularities||Fe.DEFAULT_TIME_GRANULARITIES),i[c]={name:`${e.name}.${l}`,title:m.title||l,shortTitle:m.title||l,type:m.type,format:void 0,description:m.description,synonyms:m.synonyms,granularities:p}}const r=[];if(e.joins)for(const[,c]of Object.entries(e.joins)){const l=typeof c.targetCube=="function"?c.targetCube():c.targetCube;r.push({targetCube:l.name,relationship:c.relationship,joinFields:c.on.map(m=>({sourceField:this.getColumnName(m.source),targetField:this.getColumnName(m.target)}))})}const a=[];if(e.hierarchies)for(const[,c]of Object.entries(e.hierarchies))a.push({name:c.name,title:c.title||c.name,cubeName:e.name,levels:c.levels.map(l=>l.includes(".")?l:`${e.name}.${l}`)});const u={name:e.name,title:e.title||e.name,description:e.description,exampleQuestions:e.exampleQuestions,measures:s,dimensions:i,segments:[],relationships:r.length>0?r:void 0,hierarchies:a.length>0?a:void 0,meta:e.meta};return e.meta&&console.log(`[DEBUG] Cube ${e.name} has meta:`,JSON.stringify(e.meta)),u}async generateSQL(e,t,n){const s=this.getCube(e);if(!s)throw new Error(`Cube '${e}' not found`);if(!this.dbExecutor)throw new Error("Database executor not configured");const r=await new G(this.dbExecutor).generateSQL(s,t,n),a=this.dbExecutor.getEngineType();return{sql:P.formatSqlString(r.sql,a),params:r.params}}async generateMultiCubeSQL(e,t){if(!this.dbExecutor)throw new Error("Database executor not configured");const s=await new G(this.dbExecutor).generateMultiCubeSQL(this.cubes,e,t),i=this.dbExecutor.getEngineType();return{sql:P.formatSqlString(s.sql,i),params:s.params}}async dryRunFunnel(e,t){if(!this.dbExecutor)throw new Error("Database executor not configured");const s=await new G(this.dbExecutor).dryRunFunnel(this.cubes,e,t),i=this.dbExecutor.getEngineType();return{sql:P.formatSqlString(s.sql,i),params:s.params}}async dryRunFlow(e,t){if(!this.dbExecutor)throw new Error("Database executor not configured");const s=await new G(this.dbExecutor).dryRunFlow(this.cubes,e,t),i=this.dbExecutor.getEngineType();return{sql:P.formatSqlString(s.sql,i),params:s.params}}async dryRunRetention(e,t){if(!this.dbExecutor)throw new Error("Database executor not configured");const s=await new G(this.dbExecutor).dryRunRetention(this.cubes,e,t),i=this.dbExecutor.getEngineType();return{sql:P.formatSqlString(s.sql,i),params:s.params}}async explainQuery(e,t,n){if(!this.dbExecutor)throw new Error("Database executor not configured");return new G(this.dbExecutor).explainQuery(this.cubes,e,t,n)}hasCube(e){return this.cubes.has(e)}removeCube(e){const t=this.cubes.delete(e);return t&&this.invalidateMetadataCache(),t}clearCubes(){this.cubes.clear(),this.invalidateMetadataCache()}invalidateMetadataCache(){this.metadataCache=void 0}getCubeNames(){return Array.from(this.cubes.keys())}validateQuery(e){return at(this.cubes,e)}analyzeQuery(e,t){if(!this.dbExecutor)throw new Error("Database executor not configured");const n=new rt,s={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:t};return n.analyzeQueryPlan(this.cubes,e,s)}}function at(d,e){const t=[];if(e.funnel!==void 0&&e.funnel.steps?.length>=2){const s=e.funnel.bindingKey;if(typeof s=="string"){const[i]=s.split(".");i&&!d.has(i)&&t.push(`Funnel binding key cube not found: ${i}`)}else if(Array.isArray(s))for(const i of s)d.has(i.cube)||t.push(`Funnel binding key cube not found: ${i.cube}`);return{isValid:t.length===0,errors:t}}if(e.flow!==void 0&&e.flow.startingStep!==void 0&&e.flow.eventDimension!==void 0){const s=e.flow.bindingKey;if(typeof s=="string"){const[i]=s.split(".");i&&!d.has(i)&&t.push(`Flow binding key cube not found: ${i}`)}return{isValid:t.length===0,errors:t}}if(e.retention!==void 0&&e.retention.timeDimension!=null&&e.retention.bindingKey!=null){const s=wn(e.retention.timeDimension);s&&!d.has(s)&&t.push(`Retention cube not found: ${s}`);const i=e.retention.bindingKey;if(typeof i=="string"){const[r]=i.split(".");r&&!d.has(r)&&t.push(`Retention binding key cube not found: ${r}`)}else if(Array.isArray(i))for(const r of i)d.has(r.cube)||t.push(`Retention binding key cube not found: ${r.cube}`);if(e.retention.breakdownDimensions&&Array.isArray(e.retention.breakdownDimensions))for(const r of e.retention.breakdownDimensions){const[a]=r.split(".");a&&!d.has(a)&&t.push(`Retention breakdown cube not found: ${a}`)}return{isValid:t.length===0,errors:t}}const n=new Set;if(e.measures)for(const s of e.measures){const[i,r]=s.split(".");if(!i||!r){t.push(`Invalid measure format: ${s}. Expected format: 'CubeName.fieldName'`);continue}n.add(i);const a=d.get(i);if(!a){t.push(`Cube '${i}' not found (referenced in measure '${s}')`);continue}a.measures[r]||t.push(`Measure '${r}' not found on cube '${i}'`)}if(e.dimensions)for(const s of e.dimensions){const[i,r]=s.split(".");if(!i||!r){t.push(`Invalid dimension format: ${s}. Expected format: 'CubeName.fieldName'`);continue}n.add(i);const a=d.get(i);if(!a){t.push(`Cube '${i}' not found (referenced in dimension '${s}')`);continue}a.dimensions[r]||t.push(`Dimension '${r}' not found on cube '${i}'`)}if(e.timeDimensions)for(const s of e.timeDimensions){const[i,r]=s.dimension.split(".");if(!i||!r){t.push(`Invalid timeDimension format: ${s.dimension}. Expected format: 'CubeName.fieldName'`);continue}n.add(i);const a=d.get(i);if(!a){t.push(`Cube '${i}' not found (referenced in timeDimension '${s.dimension}')`);continue}a.dimensions[r]||t.push(`TimeDimension '${r}' not found on cube '${i}' (must be a dimension with time type)`)}if(e.filters)for(const s of e.filters)ut(s,d,t,n);return n.size===0&&t.push("Query must reference at least one cube through measures, dimensions, or filters"),{isValid:t.length===0,errors:t}}function ut(d,e,t,n){if("and"in d||"or"in d){const a=d.and||d.or||[];for(const u of a)ut(u,e,t,n);return}if(!("member"in d)){t.push("Filter must have a member field");return}const[s,i]=d.member.split(".");if(!s||!i){t.push(`Invalid filter member format: ${d.member}. Expected format: 'CubeName.fieldName'`);return}n.add(s);const r=e.get(s);if(!r){t.push(`Cube '${s}' not found (referenced in filter '${d.member}')`);return}!r.dimensions[i]&&!r.measures[i]&&t.push(`Filter field '${i}' not found on cube '${s}' (must be a dimension or measure)`)}function wn(d){if(typeof d=="string"){const[e]=d.split(".");return e||null}return d.cube}const ae=["2025-11-25","2025-06-18","2025-03-26"],lt="2025-11-25";function $n(d){const t=Fn(d["mcp-protocol-version"])||lt;return{ok:ae.includes(t),negotiated:ae.includes(t)?t:null,supported:ae}}function En(d){if(!d)return!1;const e=d.split(",").map(s=>s.trim().toLowerCase()),t=e.includes("text/event-stream"),n=e.includes("application/json");return t&&!n}const Tn="mcp-session-id";function Sn(d){if(!d)return!1;const e=d.split(",").map(s=>s.trim().toLowerCase().split(";")[0]),t=e.some(s=>s==="application/json"),n=e.some(s=>s==="text/event-stream");return t&&n}function Nn(d,e={}){const{allowMissingOrigin:t=!0,allowedOrigins:n}=e;if(!d)return t?{valid:!0}:{valid:!1,reason:"Origin header is required"};if(!n||n.length===0)return{valid:!0};let s;try{s=new URL(d)}catch{return{valid:!1,reason:"Invalid Origin header format"}}return n.map(r=>{try{return new URL(r).origin}catch{return r}}).includes(s.origin)?{valid:!0}:{valid:!1,reason:"Origin not in allowed list"}}function Dn(d,e,t){const n=[];return e&&n.push(`id: ${e}`),t&&t>0&&n.push(`retry: ${t}`),n.push("event: message"),n.push(`data: ${JSON.stringify(d)}`),n.push(""),n.join(`
200
+ `)}`)}getCube(e){return this.cubes.get(e)}getAllCubes(){return Array.from(this.cubes.values())}getAllCubesMap(){return this.cubes}async execute(e,t,n){if(!this.dbExecutor)throw new Error("Database executor not configured");return new G(this.dbExecutor,this.cacheConfig).execute(this.cubes,e,t,n)}async executeMultiCubeQuery(e,t,n){return this.execute(e,t,n)}async executeQuery(e,t,n){if(!this.cubes.get(e))throw new Error(`Cube '${e}' not found`);return this.execute(t,n)}getMetadata(){return this.metadataCache?this.metadataCache:(this.metadataCache=Array.from(this.cubes.values()).map(e=>this.generateCubeMetadata(e)),this.metadataCache)}getColumnName(e){if(e&&e.name||e&&e.columnType&&e.name)return e.name;if(typeof e=="string")return e;if(e&&typeof e=="object"){if(e._.name)return e._.name;if(e.name)return e.name;if(e.columnName)return e.columnName}return"unknown_column"}static DEFAULT_TIME_GRANULARITIES=["year","quarter","month","week","day","hour"];generateCubeMetadata(e){const t=Object.keys(e.measures),n=Object.keys(e.dimensions),s=new Array(t.length),i=new Array(n.length);for(let c=0;c<t.length;c++){const l=t[c],m=e.measures[l];let p;m.drillMembers&&m.drillMembers.length>0&&(p=m.drillMembers.map(f=>f.includes(".")?f:`${e.name}.${f}`)),s[c]={name:`${e.name}.${l}`,title:m.title||l,shortTitle:m.title||l,type:m.type,format:void 0,description:m.description,synonyms:m.synonyms,drillMembers:p}}for(let c=0;c<n.length;c++){const l=n[c],m=e.dimensions[l];let p;m.type==="time"&&(p=m.granularities||Fe.DEFAULT_TIME_GRANULARITIES),i[c]={name:`${e.name}.${l}`,title:m.title||l,shortTitle:m.title||l,type:m.type,format:void 0,description:m.description,synonyms:m.synonyms,granularities:p}}const r=[];if(e.joins)for(const[,c]of Object.entries(e.joins)){const l=typeof c.targetCube=="function"?c.targetCube():c.targetCube;r.push({targetCube:l.name,relationship:c.relationship,joinFields:c.on.map(m=>({sourceField:this.getColumnName(m.source),targetField:this.getColumnName(m.target)}))})}const a=[];if(e.hierarchies)for(const[,c]of Object.entries(e.hierarchies))a.push({name:c.name,title:c.title||c.name,cubeName:e.name,levels:c.levels.map(l=>l.includes(".")?l:`${e.name}.${l}`)});return{name:e.name,title:e.title||e.name,description:e.description,exampleQuestions:e.exampleQuestions,measures:s,dimensions:i,segments:[],relationships:r.length>0?r:void 0,hierarchies:a.length>0?a:void 0,meta:e.meta}}async generateSQL(e,t,n){const s=this.getCube(e);if(!s)throw new Error(`Cube '${e}' not found`);if(!this.dbExecutor)throw new Error("Database executor not configured");const r=await new G(this.dbExecutor).generateSQL(s,t,n),a=this.dbExecutor.getEngineType();return{sql:P.formatSqlString(r.sql,a),params:r.params}}async generateMultiCubeSQL(e,t){if(!this.dbExecutor)throw new Error("Database executor not configured");const s=await new G(this.dbExecutor).generateMultiCubeSQL(this.cubes,e,t),i=this.dbExecutor.getEngineType();return{sql:P.formatSqlString(s.sql,i),params:s.params}}async dryRunFunnel(e,t){if(!this.dbExecutor)throw new Error("Database executor not configured");const s=await new G(this.dbExecutor).dryRunFunnel(this.cubes,e,t),i=this.dbExecutor.getEngineType();return{sql:P.formatSqlString(s.sql,i),params:s.params}}async dryRunFlow(e,t){if(!this.dbExecutor)throw new Error("Database executor not configured");const s=await new G(this.dbExecutor).dryRunFlow(this.cubes,e,t),i=this.dbExecutor.getEngineType();return{sql:P.formatSqlString(s.sql,i),params:s.params}}async dryRunRetention(e,t){if(!this.dbExecutor)throw new Error("Database executor not configured");const s=await new G(this.dbExecutor).dryRunRetention(this.cubes,e,t),i=this.dbExecutor.getEngineType();return{sql:P.formatSqlString(s.sql,i),params:s.params}}async explainQuery(e,t,n){if(!this.dbExecutor)throw new Error("Database executor not configured");return new G(this.dbExecutor).explainQuery(this.cubes,e,t,n)}hasCube(e){return this.cubes.has(e)}removeCube(e){const t=this.cubes.delete(e);return t&&this.invalidateMetadataCache(),t}clearCubes(){this.cubes.clear(),this.invalidateMetadataCache()}invalidateMetadataCache(){this.metadataCache=void 0}getCubeNames(){return Array.from(this.cubes.keys())}validateQuery(e){return at(this.cubes,e)}analyzeQuery(e,t){if(!this.dbExecutor)throw new Error("Database executor not configured");const n=new rt,s={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:t};return n.analyzeQueryPlan(this.cubes,e,s)}}function at(d,e){const t=[];if(e.funnel!==void 0&&e.funnel.steps?.length>=2){const s=e.funnel.bindingKey;if(typeof s=="string"){const[i]=s.split(".");i&&!d.has(i)&&t.push(`Funnel binding key cube not found: ${i}`)}else if(Array.isArray(s))for(const i of s)d.has(i.cube)||t.push(`Funnel binding key cube not found: ${i.cube}`);return{isValid:t.length===0,errors:t}}if(e.flow!==void 0&&e.flow.startingStep!==void 0&&e.flow.eventDimension!==void 0){const s=e.flow.bindingKey;if(typeof s=="string"){const[i]=s.split(".");i&&!d.has(i)&&t.push(`Flow binding key cube not found: ${i}`)}return{isValid:t.length===0,errors:t}}if(e.retention!==void 0&&e.retention.timeDimension!=null&&e.retention.bindingKey!=null){const s=wn(e.retention.timeDimension);s&&!d.has(s)&&t.push(`Retention cube not found: ${s}`);const i=e.retention.bindingKey;if(typeof i=="string"){const[r]=i.split(".");r&&!d.has(r)&&t.push(`Retention binding key cube not found: ${r}`)}else if(Array.isArray(i))for(const r of i)d.has(r.cube)||t.push(`Retention binding key cube not found: ${r.cube}`);if(e.retention.breakdownDimensions&&Array.isArray(e.retention.breakdownDimensions))for(const r of e.retention.breakdownDimensions){const[a]=r.split(".");a&&!d.has(a)&&t.push(`Retention breakdown cube not found: ${a}`)}return{isValid:t.length===0,errors:t}}const n=new Set;if(e.measures)for(const s of e.measures){const[i,r]=s.split(".");if(!i||!r){t.push(`Invalid measure format: ${s}. Expected format: 'CubeName.fieldName'`);continue}n.add(i);const a=d.get(i);if(!a){t.push(`Cube '${i}' not found (referenced in measure '${s}')`);continue}a.measures[r]||t.push(`Measure '${r}' not found on cube '${i}'`)}if(e.dimensions)for(const s of e.dimensions){const[i,r]=s.split(".");if(!i||!r){t.push(`Invalid dimension format: ${s}. Expected format: 'CubeName.fieldName'`);continue}n.add(i);const a=d.get(i);if(!a){t.push(`Cube '${i}' not found (referenced in dimension '${s}')`);continue}a.dimensions[r]||t.push(`Dimension '${r}' not found on cube '${i}'`)}if(e.timeDimensions)for(const s of e.timeDimensions){const[i,r]=s.dimension.split(".");if(!i||!r){t.push(`Invalid timeDimension format: ${s.dimension}. Expected format: 'CubeName.fieldName'`);continue}n.add(i);const a=d.get(i);if(!a){t.push(`Cube '${i}' not found (referenced in timeDimension '${s.dimension}')`);continue}a.dimensions[r]||t.push(`TimeDimension '${r}' not found on cube '${i}' (must be a dimension with time type)`)}if(e.filters)for(const s of e.filters)ut(s,d,t,n);return n.size===0&&t.push("Query must reference at least one cube through measures, dimensions, or filters"),{isValid:t.length===0,errors:t}}function ut(d,e,t,n){if("and"in d||"or"in d){const a=d.and||d.or||[];for(const u of a)ut(u,e,t,n);return}if(!("member"in d)){t.push("Filter must have a member field");return}const[s,i]=d.member.split(".");if(!s||!i){t.push(`Invalid filter member format: ${d.member}. Expected format: 'CubeName.fieldName'`);return}n.add(s);const r=e.get(s);if(!r){t.push(`Cube '${s}' not found (referenced in filter '${d.member}')`);return}!r.dimensions[i]&&!r.measures[i]&&t.push(`Filter field '${i}' not found on cube '${s}' (must be a dimension or measure)`)}function wn(d){if(typeof d=="string"){const[e]=d.split(".");return e||null}return d.cube}const ae=["2025-11-25","2025-06-18","2025-03-26"],lt="2025-11-25";function $n(d){const t=Fn(d["mcp-protocol-version"])||lt;return{ok:ae.includes(t),negotiated:ae.includes(t)?t:null,supported:ae}}function En(d){if(!d)return!1;const e=d.split(",").map(s=>s.trim().toLowerCase()),t=e.includes("text/event-stream"),n=e.includes("application/json");return t&&!n}const Tn="mcp-session-id";function Sn(d){if(!d)return!1;const e=d.split(",").map(s=>s.trim().toLowerCase().split(";")[0]),t=e.some(s=>s==="application/json"),n=e.some(s=>s==="text/event-stream");return t&&n}function Nn(d,e={}){const{allowMissingOrigin:t=!0,allowedOrigins:n}=e;if(!d)return t?{valid:!0}:{valid:!1,reason:"Origin header is required"};if(!n||n.length===0)return{valid:!0};let s;try{s=new URL(d)}catch{return{valid:!1,reason:"Invalid Origin header format"}}return n.map(r=>{try{return new URL(r).origin}catch{return r}}).includes(s.origin)?{valid:!0}:{valid:!1,reason:"Origin not in allowed list"}}function Dn(d,e,t){const n=[];return e&&n.push(`id: ${e}`),t&&t>0&&n.push(`retry: ${t}`),n.push("event: message"),n.push(`data: ${JSON.stringify(d)}`),n.push(""),n.join(`
201
201
  `)}function An(d,e,t,n){return{jsonrpc:"2.0",id:d??null,error:{code:e,message:t,...n!==void 0?{data:n}:{}}}}function _n(d,e){return{jsonrpc:"2.0",id:d??null,result:e}}function vn(d){if(!d||typeof d!="object")return null;const e=d;return e.jsonrpc!=="2.0"||typeof e.method!="string"?null:{jsonrpc:"2.0",method:e.method,id:e.id,params:e.params}}async function Rn(d,e,t){const{semanticLayer:n,extractSecurityContext:s,rawRequest:i,rawResponse:r}=t,a=t.prompts??dt,u=t.resources??mt;switch(d){case"initialize":{const c=e?.protocolVersion;let l;return c&&ae.includes(c)?l=c:l=lt,{protocolVersion:l,capabilities:{tools:{listChanged:!1},resources:{listChanged:!1},prompts:{listChanged:!1},sampling:{}},sessionId:ct(),serverInfo:{name:"drizzle-cube",version:typeof process<"u"?process.env?.npm_package_version||"dev":"worker"}}}case"list_tools":case"tools/list":return{tools:In(),nextCursor:""};case"call_tool":case"tools/call":return Ln(e,t);case"resources/list":return{resources:u.map(({uri:c,name:l,description:m,mimeType:p})=>({uri:c,name:l,description:m,mimeType:p})),nextCursor:""};case"resources/templates/list":return{resourceTemplates:[],nextCursor:""};case"resources/read":{const c=e?.uri,l=u.find(m=>m.uri===c)||u[0];if(!l)throw z(-32602,"resource not found");return{contents:[{uri:l.uri,mimeType:l.mimeType,text:l.text}]}}case"prompts/list":return{prompts:a.map(({name:c,description:l})=>({name:c,description:l})),nextCursor:""};case"ping":return{};case"notifications/initialized":return{};case"prompts/get":{const c=e?.name,l=a.find(m=>m.name===c)||a[0];if(!l)throw z(-32602,"prompt not found");return{name:l.name,description:l.description,messages:l.messages}}case"discover":return P.handleDiscover(n,e||{});case"validate":{const c=e||{};if(!c.query)throw z(-32602,"query is required");return P.handleValidate(n,c)}case"load":{const c=e||{};if(!c.query)throw z(-32602,"query is required");const l=await s(i,r);return P.handleLoad(n,l,c)}default:throw z(-32601,`Unknown MCP method: ${d}`)}}function z(d,e,t){const n=new Error(e);return n.code=d,n}function Fn(d){return d?Array.isArray(d)?d[0]||null:d:null}function On(d){return d.id===void 0||d.id===null}function ct(){return`evt-${P.generateRequestId()}`}function In(){return[{name:"discover",description:`Find relevant cubes based on topic or intent. Call this FIRST to understand available data.
202
202
 
203
203
  Returns cubes with: