drizzle-cube 0.4.35 → 0.4.36

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 (50) 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-Dmf2vbIb.cjs → mcp-transport-CjA5_6G_.cjs} +1 -1
  8. package/dist/adapters/{mcp-transport-Cdisv8il.js → mcp-transport-x_A7Q5OL.js} +1 -1
  9. package/dist/adapters/nextjs/index.cjs +1 -1
  10. package/dist/adapters/nextjs/index.js +1 -1
  11. package/dist/client/charts.js +3 -3
  12. package/dist/client/chunks/{DashboardEditModal-DsxYiMct.js → DashboardEditModal-kWEk4KJC.js} +7 -7
  13. package/dist/client/chunks/{DashboardEditModal-DsxYiMct.js.map → DashboardEditModal-kWEk4KJC.js.map} +1 -1
  14. package/dist/client/chunks/{FieldSearchModal-CSzgVPdG.js → FieldSearchModal-rB26lhBD.js} +2 -2
  15. package/dist/client/chunks/{FieldSearchModal-CSzgVPdG.js.map → FieldSearchModal-rB26lhBD.js.map} +1 -1
  16. package/dist/client/chunks/{analysis-builder-CxXZDfFR.js → analysis-builder-CdDPUAEU.js} +8 -8
  17. package/dist/client/chunks/{analysis-builder-CxXZDfFR.js.map → analysis-builder-CdDPUAEU.js.map} +1 -1
  18. package/dist/client/chunks/{analysis-builder-shared-fwyLiZ48.js → analysis-builder-shared-3V70XUNW.js} +6 -6
  19. package/dist/client/chunks/{analysis-builder-shared-fwyLiZ48.js.map → analysis-builder-shared-3V70XUNW.js.map} +1 -1
  20. package/dist/client/chunks/{chart-data-table-CGG-_R93.js → chart-data-table-BlkFWPhF.js} +2 -2
  21. package/dist/client/chunks/chart-data-table-BlkFWPhF.js.map +1 -0
  22. package/dist/client/chunks/{chart-kpi-delta-D9eNhKR6.js → chart-kpi-delta-CUIjCDS3.js} +2 -2
  23. package/dist/client/chunks/{chart-kpi-delta-D9eNhKR6.js.map → chart-kpi-delta-CUIjCDS3.js.map} +1 -1
  24. package/dist/client/chunks/{chart-kpi-number-IJWReEix.js → chart-kpi-number-CxlpSKYh.js} +3 -3
  25. package/dist/client/chunks/{chart-kpi-number-IJWReEix.js.map → chart-kpi-number-CxlpSKYh.js.map} +1 -1
  26. package/dist/client/chunks/{chart-kpi-text-Dsr7nPmz.js → chart-kpi-text-C16fwohp.js} +2 -2
  27. package/dist/client/chunks/{chart-kpi-text-Dsr7nPmz.js.map → chart-kpi-text-C16fwohp.js.map} +1 -1
  28. package/dist/client/chunks/{charts-loader-DSdXpr7e.js → charts-loader-BFhQWB_d.js} +5 -5
  29. package/dist/client/chunks/{charts-loader-DSdXpr7e.js.map → charts-loader-BFhQWB_d.js.map} +1 -1
  30. package/dist/client/chunks/{schema-visualization-CBQrcxb8.js → schema-visualization-qmLI8MGQ.js} +2 -2
  31. package/dist/client/chunks/{schema-visualization-CBQrcxb8.js.map → schema-visualization-qmLI8MGQ.js.map} +1 -1
  32. package/dist/client/chunks/{useDebounce-BbYqb134.js → useDebounce-xfPFr2fi.js} +2 -2
  33. package/dist/client/chunks/{useDebounce-BbYqb134.js.map → useDebounce-xfPFr2fi.js.map} +1 -1
  34. package/dist/client/chunks/{useExplainAI-CbAR-1p5.js → useExplainAI-6COjssus.js} +4 -4
  35. package/dist/client/chunks/{useExplainAI-CbAR-1p5.js.map → useExplainAI-6COjssus.js.map} +1 -1
  36. package/dist/client/chunks/{utils-BxLeWUeg.js → utils-nCeVL-Hm.js} +2 -2
  37. package/dist/client/chunks/{utils-BxLeWUeg.js.map → utils-nCeVL-Hm.js.map} +1 -1
  38. package/dist/client/chunks/{vendor-QBbbDL5y.js → vendor-WzXX36hd.js} +2 -2
  39. package/dist/client/chunks/{vendor-QBbbDL5y.js.map → vendor-WzXX36hd.js.map} +1 -1
  40. package/dist/client/components.js +3 -3
  41. package/dist/client/hooks.js +3 -3
  42. package/dist/client/icons.js +1 -1
  43. package/dist/client/index.js +10 -10
  44. package/dist/client/providers.js +1 -1
  45. package/dist/client/utils.js +3 -3
  46. package/dist/client-bundle-stats.html +1 -1
  47. package/dist/server/index.cjs +1 -1
  48. package/dist/server/index.js +1 -1
  49. package/package.json +1 -1
  50. package/dist/client/chunks/chart-data-table-CGG-_R93.js.map +0 -1
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CDExg9uP.cjs`),t=require(`../mcp-transport-Dmf2vbIb.cjs`);let n=require(`express`);n=e.g(n);let r=require(`cors`);r=e.g(r);function i(i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,jsonLimit:f=`10mb`,cache:p,mcp:m={enabled:!0},agent:h}=i;if(!a||a.length===0)throw Error(`At least one cube must be provided in the cubes array`);let g=(0,n.Router)();u&&g.use((0,r.default)(u)),g.use(n.default.json({limit:f})),g.use(n.default.urlencoded({extended:!0,limit:f}));let _=new t.h({drizzle:o,schema:s,engineType:l,cache:p,rlsSetup:i.rlsSetup});if(a.forEach(e=>{_.registerCube(e)}),g.post(`${d}/load`,async(t,n)=>{try{let r=t.body.query||t.body,i=await c(t,n),a=_.validateQuery(r);if(!a.isValid)return n.status(400).json(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=t.headers[`x-cache-control`]===`no-cache`,s=await _.executeMultiCubeQuery(r,i,{skipCache:o});n.json(e.r(r,s,_))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),g.get(`${d}/load`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json(e.i(`Query parameter is required`,400));let i;try{i=JSON.parse(r)}catch{return n.status(400).json(e.i(`Invalid JSON in query parameter`,400))}let a=await c(t,n),o=_.validateQuery(i);if(!o.isValid)return n.status(400).json(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`,l=await _.executeMultiCubeQuery(i,a,{skipCache:s});n.json(e.r(i,l,_))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),g.post(`${d}/batch`,async(t,n)=>{try{let{queries:r}=t.body;if(!r||!Array.isArray(r))return n.status(400).json(e.i(`Request body must contain a "queries" array`,400));if(r.length===0)return n.status(400).json(e.i(`Queries array cannot be empty`,400));let i=await e.u(r,await c(t,n),_,{skipCache:t.headers[`x-cache-control`]===`no-cache`});n.json(i)}catch(t){console.error(`Batch execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Batch execution failed`,500))}}),g.get(`${d}/meta`,(t,n)=>{try{let t=_.getMetadata();n.json(e.a(t))}catch(t){console.error(`Metadata error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500))}}),g.post(`${d}/sql`,async(t,n)=>{try{let r=t.body,i=await c(t,n),a=_.validateQuery(r);if(!a.isValid)return n.status(400).json(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return n.status(400).json(e.i(`No measures or dimensions specified`,400));let s=o.split(`.`)[0],l=await _.generateSQL(s,r,i);n.json(e.o(r,l))}catch(t){console.error(`SQL generation error:`,String(t).replace(/\n|\r/g,``)),n.status(500).json(e.i(t instanceof Error?t.message:`SQL generation failed`,500))}}),g.get(`${d}/sql`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json(e.i(`Query parameter is required`,400));let i=JSON.parse(r),a=await c(t,n),o=_.validateQuery(i);if(!o.isValid)return n.status(400).json(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=i.measures?.[0]||i.dimensions?.[0];if(!s)return n.status(400).json(e.i(`No measures or dimensions specified`,400));let l=s.split(`.`)[0],u=await _.generateSQL(l,i,a);n.json(e.o(i,u))}catch(t){console.error(`SQL generation error:`,String(t).replace(/\n|\r/g,``)),n.status(500).json(e.i(t instanceof Error?t.message:`SQL generation failed`,500))}}),g.post(`${d}/dry-run`,async(t,n)=>{try{let r=await e.f(t.body.query||t.body,await c(t,n),_);n.json(r)}catch(e){console.error(`Dry-run error:`,e),n.status(400).json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),g.get(`${d}/dry-run`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json({error:`Query parameter is required`,valid:!1});let i=await e.f(JSON.parse(r),await c(t,n),_);n.json(i)}catch(e){console.error(`Dry-run error:`,e),n.status(400).json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),g.post(`${d}/explain`,async(e,t)=>{try{let n=e.body.query||e.body,r=e.body.options||{},i=await c(e,t),a=_.validateQuery(n);if(!a.isValid)return t.status(400).json({error:`Query validation failed: ${a.errors.join(`, `)}`});let o=await _.explainQuery(n,i,r);t.json(o)}catch(e){console.error(`Explain error:`,e),t.status(500).json({error:e instanceof Error?e.message:`Explain query failed`})}}),h&&g.post(`${d}/agent/chat`,async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-DzUX7CBs.cjs`)),{message:r,sessionId:i,history:a}=e.body;if(!r||typeof r!=`string`)return t.status(400).json({error:`message is required and must be a string`});let o=(h.apiKey||``).trim();if(h.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(o=t.trim())}if(!o)return t.status(401).json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let s=h.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,l=h.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=h.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,d=await c(e,t),f=h.buildSystemContext?.(d);t.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:r,sessionId:i,history:a,semanticLayer:_,securityContext:d,agentConfig:h,apiKey:o,systemContext:f,providerOverride:s,modelOverride:l,baseURLOverride:u});for await(let n of e)t.write(`data: ${JSON.stringify(n)}\n\n`)}catch(e){let n={type:`error`,data:{message:e instanceof Error?e.message:`Stream failed`}};t.write(`data: ${JSON.stringify(n)}\n\n`)}finally{t.end()}}catch(e){console.error(`Agent chat error:`,e),t.headersSent||t.status(500).json({error:e instanceof Error?e.message:`Agent chat failed`})}}),m.enabled!==!1){let e=m.basePath??`/mcp`;g.post(`${e}`,async(e,n)=>{let r=t.p(e.headers.origin,m.allowedOrigins?{allowedOrigins:m.allowedOrigins}:{});if(!r.valid)return n.status(403).json(t.n(null,-32600,r.reason));let i=e.headers.accept;if(!t.f(i))return n.status(400).json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=t.c(e.headers);if(!a.ok)return n.status(426).json({error:`Unsupported MCP protocol version`,supported:a.supported});let o=t.l(e.body);if(!o)return n.status(400).json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=t.m(i),l=o.method===`initialize`;try{let r=await t.i(o.method,o.params,{semanticLayer:_,extractSecurityContext:c,rawRequest:e,rawResponse:n,negotiatedProtocol:a.negotiated});if(t.s(o))return n.status(202).end();let i=l&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&n.setHeader(t.t,i);let u=t.r(o.id??null,r);if(s){let e=t.u();return n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(`id: ${e}\n\n`),n.write(t.d(u,e)),n.end()}return n.json(u)}catch(e){if(t.s(o))return console.error(`MCP notification processing error:`,String(e).replace(/\n|\r/g,``)),n.status(202).end();console.error(`MCP RPC error:`,String(e).replace(/\n|\r/g,``));let r=e?.code??-32603,i=e?.data,a=e.message||`MCP request failed`,c=t.n(o.id??null,r,a,i);if(s){let e=t.u();return n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(`id: ${e}\n\n`),n.write(t.d(c,e)),n.end()}return n.status(200).json(c)}}),g.get(`${e}`,async(e,n)=>{let r=t.u();n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{n.write(`: keep-alive
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CDExg9uP.cjs`),t=require(`../mcp-transport-CjA5_6G_.cjs`);let n=require(`express`);n=e.g(n);let r=require(`cors`);r=e.g(r);function i(i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,jsonLimit:f=`10mb`,cache:p,mcp:m={enabled:!0},agent:h}=i;if(!a||a.length===0)throw Error(`At least one cube must be provided in the cubes array`);let g=(0,n.Router)();u&&g.use((0,r.default)(u)),g.use(n.default.json({limit:f})),g.use(n.default.urlencoded({extended:!0,limit:f}));let _=new t.h({drizzle:o,schema:s,engineType:l,cache:p,rlsSetup:i.rlsSetup});if(a.forEach(e=>{_.registerCube(e)}),g.post(`${d}/load`,async(t,n)=>{try{let r=t.body.query||t.body,i=await c(t,n),a=_.validateQuery(r);if(!a.isValid)return n.status(400).json(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=t.headers[`x-cache-control`]===`no-cache`,s=await _.executeMultiCubeQuery(r,i,{skipCache:o});n.json(e.r(r,s,_))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),g.get(`${d}/load`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json(e.i(`Query parameter is required`,400));let i;try{i=JSON.parse(r)}catch{return n.status(400).json(e.i(`Invalid JSON in query parameter`,400))}let a=await c(t,n),o=_.validateQuery(i);if(!o.isValid)return n.status(400).json(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`,l=await _.executeMultiCubeQuery(i,a,{skipCache:s});n.json(e.r(i,l,_))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),g.post(`${d}/batch`,async(t,n)=>{try{let{queries:r}=t.body;if(!r||!Array.isArray(r))return n.status(400).json(e.i(`Request body must contain a "queries" array`,400));if(r.length===0)return n.status(400).json(e.i(`Queries array cannot be empty`,400));let i=await e.u(r,await c(t,n),_,{skipCache:t.headers[`x-cache-control`]===`no-cache`});n.json(i)}catch(t){console.error(`Batch execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Batch execution failed`,500))}}),g.get(`${d}/meta`,(t,n)=>{try{let t=_.getMetadata();n.json(e.a(t))}catch(t){console.error(`Metadata error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500))}}),g.post(`${d}/sql`,async(t,n)=>{try{let r=t.body,i=await c(t,n),a=_.validateQuery(r);if(!a.isValid)return n.status(400).json(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return n.status(400).json(e.i(`No measures or dimensions specified`,400));let s=o.split(`.`)[0],l=await _.generateSQL(s,r,i);n.json(e.o(r,l))}catch(t){console.error(`SQL generation error:`,String(t).replace(/\n|\r/g,``)),n.status(500).json(e.i(t instanceof Error?t.message:`SQL generation failed`,500))}}),g.get(`${d}/sql`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json(e.i(`Query parameter is required`,400));let i=JSON.parse(r),a=await c(t,n),o=_.validateQuery(i);if(!o.isValid)return n.status(400).json(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=i.measures?.[0]||i.dimensions?.[0];if(!s)return n.status(400).json(e.i(`No measures or dimensions specified`,400));let l=s.split(`.`)[0],u=await _.generateSQL(l,i,a);n.json(e.o(i,u))}catch(t){console.error(`SQL generation error:`,String(t).replace(/\n|\r/g,``)),n.status(500).json(e.i(t instanceof Error?t.message:`SQL generation failed`,500))}}),g.post(`${d}/dry-run`,async(t,n)=>{try{let r=await e.f(t.body.query||t.body,await c(t,n),_);n.json(r)}catch(e){console.error(`Dry-run error:`,e),n.status(400).json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),g.get(`${d}/dry-run`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json({error:`Query parameter is required`,valid:!1});let i=await e.f(JSON.parse(r),await c(t,n),_);n.json(i)}catch(e){console.error(`Dry-run error:`,e),n.status(400).json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),g.post(`${d}/explain`,async(e,t)=>{try{let n=e.body.query||e.body,r=e.body.options||{},i=await c(e,t),a=_.validateQuery(n);if(!a.isValid)return t.status(400).json({error:`Query validation failed: ${a.errors.join(`, `)}`});let o=await _.explainQuery(n,i,r);t.json(o)}catch(e){console.error(`Explain error:`,e),t.status(500).json({error:e instanceof Error?e.message:`Explain query failed`})}}),h&&g.post(`${d}/agent/chat`,async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-DzUX7CBs.cjs`)),{message:r,sessionId:i,history:a}=e.body;if(!r||typeof r!=`string`)return t.status(400).json({error:`message is required and must be a string`});let o=(h.apiKey||``).trim();if(h.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(o=t.trim())}if(!o)return t.status(401).json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let s=h.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,l=h.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=h.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,d=await c(e,t),f=h.buildSystemContext?.(d);t.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:r,sessionId:i,history:a,semanticLayer:_,securityContext:d,agentConfig:h,apiKey:o,systemContext:f,providerOverride:s,modelOverride:l,baseURLOverride:u});for await(let n of e)t.write(`data: ${JSON.stringify(n)}\n\n`)}catch(e){let n={type:`error`,data:{message:e instanceof Error?e.message:`Stream failed`}};t.write(`data: ${JSON.stringify(n)}\n\n`)}finally{t.end()}}catch(e){console.error(`Agent chat error:`,e),t.headersSent||t.status(500).json({error:e instanceof Error?e.message:`Agent chat failed`})}}),m.enabled!==!1){let e=m.basePath??`/mcp`;g.post(`${e}`,async(e,n)=>{let r=t.p(e.headers.origin,m.allowedOrigins?{allowedOrigins:m.allowedOrigins}:{});if(!r.valid)return n.status(403).json(t.n(null,-32600,r.reason));let i=e.headers.accept;if(!t.f(i))return n.status(400).json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=t.c(e.headers);if(!a.ok)return n.status(426).json({error:`Unsupported MCP protocol version`,supported:a.supported});let o=t.l(e.body);if(!o)return n.status(400).json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=t.m(i),l=o.method===`initialize`;try{let r=await t.i(o.method,o.params,{semanticLayer:_,extractSecurityContext:c,rawRequest:e,rawResponse:n,negotiatedProtocol:a.negotiated});if(t.s(o))return n.status(202).end();let i=l&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&n.setHeader(t.t,i);let u=t.r(o.id??null,r);if(s){let e=t.u();return n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(`id: ${e}\n\n`),n.write(t.d(u,e)),n.end()}return n.json(u)}catch(e){if(t.s(o))return console.error(`MCP notification processing error:`,String(e).replace(/\n|\r/g,``)),n.status(202).end();console.error(`MCP RPC error:`,String(e).replace(/\n|\r/g,``));let r=e?.code??-32603,i=e?.data,a=e.message||`MCP request failed`,c=t.n(o.id??null,r,a,i);if(s){let e=t.u();return n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(`id: ${e}\n\n`),n.write(t.d(c,e)),n.end()}return n.status(200).json(c)}}),g.get(`${e}`,async(e,n)=>{let r=t.u();n.status(200),n.setHeader(`Content-Type`,`text/event-stream`),n.setHeader(`Cache-Control`,`no-cache`),n.setHeader(`Connection`,`keep-alive`),n.write(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{n.write(`: keep-alive
2
2
 
3
3
  `)},15e3);e.on(`close`,()=>{clearInterval(i)})}),g.delete(`${e}`,(e,t)=>t.status(405).json({error:`Session termination not supported`}))}return g.use((t,n,r,i)=>{console.error(`Express adapter error:`,t),r.headersSent||r.status(500).json(e.i(t,500))}),g}function a(e,t){let n=i(t);return e.use(`/`,n),e}function o(e){return a((0,n.default)(),e)}exports.createCubeApp=o,exports.createCubeRouter=i,exports.mountCubeRoutes=a;
@@ -1,5 +1,5 @@
1
1
  import { a as e, f as t, i as n, o as r, r as i, u as a } from "../utils-DkKcpkx5.js";
2
- import { c as o, d as s, f as c, h as l, i as u, l as d, m as f, n as p, p as m, r as h, s as g, t as _, u as v } from "../mcp-transport-Cdisv8il.js";
2
+ import { c as o, d as s, f as c, h as l, i as u, l as d, m as f, n as p, p as m, r as h, s as g, t as _, u as v } from "../mcp-transport-x_A7Q5OL.js";
3
3
  import y, { Router as b } from "express";
4
4
  import x from "cors";
5
5
  //#region src/adapters/express/index.ts
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CDExg9uP.cjs`),t=require(`../mcp-transport-Dmf2vbIb.cjs`);var n=function(n,r,i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,bodyLimit:f=10485760,cache:p,mcp:m={enabled:!0},agent:h}=r;if(!a||a.length===0)return i(Error(`At least one cube must be provided in the cubes array`));u&&n.register(import(`@fastify/cors`),u),n.addHook(`onRequest`,async(e,t)=>{e.method===`POST`&&(e.body=void 0)});let g=new t.h({drizzle:o,schema:s,engineType:l,cache:p,rlsSetup:r.rlsSetup});if(a.forEach(e=>{g.registerCube(e)}),n.post(`${d}/load`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=r.query||r,a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`;return e.r(i,await g.executeMultiCubeQuery(i,a,{skipCache:s}),g)}catch(r){return t.log.error(r,`Query execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Query execution failed`,500))}}),n.get(`${d}/load`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:r}=t.query,i;try{i=JSON.parse(r)}catch{return n.status(400).send(e.i(`Invalid JSON in query parameter`,400))}let a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`,l=await g.executeMultiCubeQuery(i,a,{skipCache:s});return e.r(i,l,g)}catch(r){return t.log.error(r,`Query execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Query execution failed`,500))}}),n.post(`${d}/batch`,{bodyLimit:f,schema:{body:{type:`object`,required:[`queries`],properties:{queries:{type:`array`,items:{type:`object`}}}}}},async(t,n)=>{try{let{queries:r}=t.body;return!r||!Array.isArray(r)?n.status(400).send(e.i(`Request body must contain a "queries" array`,400)):r.length===0?n.status(400).send(e.i(`Queries array cannot be empty`,400)):await e.u(r,await c(t),g,{skipCache:t.headers[`x-cache-control`]===`no-cache`})}catch(r){return t.log.error(r,`Batch execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Batch execution failed`,500))}}),n.get(`${d}/meta`,async(t,n)=>{try{return e.a(g.getMetadata())}catch(r){return t.log.error(r,`Metadata error`),n.status(500).send(e.i(r instanceof Error?r.message:`Failed to fetch metadata`,500))}}),n.post(`${d}/sql`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=await c(t),a=g.validateQuery(r);if(!a.isValid)return n.status(400).send(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return n.status(400).send(e.i(`No measures or dimensions specified`,400));let s=o.split(`.`)[0];return e.o(r,await g.generateSQL(s,r,i))}catch(r){return t.log.error({err:String(r).replace(/\n|\r/g,``)},`SQL generation error`),n.status(500).send(e.i(r instanceof Error?r.message:`SQL generation failed`,500))}}),n.get(`${d}/sql`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:r}=t.query,i=JSON.parse(r),a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=i.measures?.[0]||i.dimensions?.[0];if(!s)return n.status(400).send(e.i(`No measures or dimensions specified`,400));let l=s.split(`.`)[0];return e.o(i,await g.generateSQL(l,i,a))}catch(r){return t.log.error({err:String(r).replace(/\n|\r/g,``)},`SQL generation error`),n.status(500).send(e.i(r instanceof Error?r.message:`SQL generation failed`,500))}}),n.post(`${d}/dry-run`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let n=t.body;return await e.f(n.query||n,await c(t),g)}catch(e){return t.log.error(e,`Dry-run error`),n.status(400).send({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),n.get(`${d}/dry-run`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:n}=t.query;return await e.f(JSON.parse(n),await c(t),g)}catch(e){return t.log.error(e,`Dry-run error`),n.status(400).send({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),n.post(`${d}/explain`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let n=e.body,r=n.query||n,i=n.options||{},a=await c(e),o=g.validateQuery(r);return o.isValid?await g.explainQuery(r,a,i):t.status(400).send({error:`Query validation failed: ${o.errors.join(`, `)}`})}catch(n){return e.log.error(n,`Explain error`),t.status(500).send({error:n instanceof Error?n.message:`Explain query failed`})}}),h&&n.post(`${d}/agent/chat`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-DzUX7CBs.cjs`)),{message:r,sessionId:i,history:a}=e.body;if(!r||typeof r!=`string`)return t.status(400).send({error:`message is required and must be a string`});let o=(h.apiKey||``).trim();if(h.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(o=t.trim())}if(!o)return t.status(401).send({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let s=h.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,l=h.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=h.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,d=await c(e),f=h.buildSystemContext?.(d);t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:r,sessionId:i,history:a,semanticLayer:g,securityContext:d,agentConfig:h,apiKey:o,systemContext:f,providerOverride:s,modelOverride:l,baseURLOverride:u});for await(let n of e)t.raw.write(`data: ${JSON.stringify(n)}\n\n`)}catch(e){let n={type:`error`,data:{message:e instanceof Error?e.message:`Stream failed`}};t.raw.write(`data: ${JSON.stringify(n)}\n\n`)}finally{t.raw.end()}}catch(n){if(e.log.error(n,`Agent chat error`),!t.raw.headersSent)return t.status(500).send({error:n instanceof Error?n.message:`Agent chat failed`})}}),m.enabled!==!1){let e=m.basePath??`/mcp`;n.post(`${e}`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,n)=>{let r=t.p(e.headers.origin,m.allowedOrigins?{allowedOrigins:m.allowedOrigins}:{});if(!r.valid)return n.status(403).send(t.n(null,-32600,r.reason));let i=e.headers.accept;if(!t.f(i))return n.status(400).send(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=t.c(e.headers);if(!a.ok)return n.status(426).send({error:`Unsupported MCP protocol version`,supported:a.supported});let o=t.l(e.body);if(!o)return n.status(400).send(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=t.m(i),l=o.method===`initialize`;try{let r=await t.i(o.method,o.params,{semanticLayer:g,extractSecurityContext:c,rawRequest:e,rawResponse:n,negotiatedProtocol:a.negotiated});if(t.s(o))return n.status(202).send();let i=l&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&n.header(t.t,i);let u=t.r(o.id??null,r);if(s){let e=t.u();n.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${t.d(u,e)}`);return}return n.send(u)}catch(r){if(t.s(o))return e.log.error({err:String(r).replace(/\n|\r/g,``)},`MCP notification processing error`),n.status(202).send();e.log.error({err:String(r).replace(/\n|\r/g,``)},`MCP RPC error`);let i=r?.code??-32603,a=r?.data,c=r.message||`MCP request failed`,l=t.n(o.id??null,i,c,a);if(s){let e=t.u();n.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${t.d(l,e)}`);return}return n.send(l)}}),n.get(`${e}`,async(e,n)=>{let r=t.u();n.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),n.raw.write(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{n.raw.write(`: keep-alive
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CDExg9uP.cjs`),t=require(`../mcp-transport-CjA5_6G_.cjs`);var n=function(n,r,i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,bodyLimit:f=10485760,cache:p,mcp:m={enabled:!0},agent:h}=r;if(!a||a.length===0)return i(Error(`At least one cube must be provided in the cubes array`));u&&n.register(import(`@fastify/cors`),u),n.addHook(`onRequest`,async(e,t)=>{e.method===`POST`&&(e.body=void 0)});let g=new t.h({drizzle:o,schema:s,engineType:l,cache:p,rlsSetup:r.rlsSetup});if(a.forEach(e=>{g.registerCube(e)}),n.post(`${d}/load`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=r.query||r,a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`;return e.r(i,await g.executeMultiCubeQuery(i,a,{skipCache:s}),g)}catch(r){return t.log.error(r,`Query execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Query execution failed`,500))}}),n.get(`${d}/load`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:r}=t.query,i;try{i=JSON.parse(r)}catch{return n.status(400).send(e.i(`Invalid JSON in query parameter`,400))}let a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`,l=await g.executeMultiCubeQuery(i,a,{skipCache:s});return e.r(i,l,g)}catch(r){return t.log.error(r,`Query execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Query execution failed`,500))}}),n.post(`${d}/batch`,{bodyLimit:f,schema:{body:{type:`object`,required:[`queries`],properties:{queries:{type:`array`,items:{type:`object`}}}}}},async(t,n)=>{try{let{queries:r}=t.body;return!r||!Array.isArray(r)?n.status(400).send(e.i(`Request body must contain a "queries" array`,400)):r.length===0?n.status(400).send(e.i(`Queries array cannot be empty`,400)):await e.u(r,await c(t),g,{skipCache:t.headers[`x-cache-control`]===`no-cache`})}catch(r){return t.log.error(r,`Batch execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Batch execution failed`,500))}}),n.get(`${d}/meta`,async(t,n)=>{try{return e.a(g.getMetadata())}catch(r){return t.log.error(r,`Metadata error`),n.status(500).send(e.i(r instanceof Error?r.message:`Failed to fetch metadata`,500))}}),n.post(`${d}/sql`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=await c(t),a=g.validateQuery(r);if(!a.isValid)return n.status(400).send(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return n.status(400).send(e.i(`No measures or dimensions specified`,400));let s=o.split(`.`)[0];return e.o(r,await g.generateSQL(s,r,i))}catch(r){return t.log.error({err:String(r).replace(/\n|\r/g,``)},`SQL generation error`),n.status(500).send(e.i(r instanceof Error?r.message:`SQL generation failed`,500))}}),n.get(`${d}/sql`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:r}=t.query,i=JSON.parse(r),a=await c(t),o=g.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=i.measures?.[0]||i.dimensions?.[0];if(!s)return n.status(400).send(e.i(`No measures or dimensions specified`,400));let l=s.split(`.`)[0];return e.o(i,await g.generateSQL(l,i,a))}catch(r){return t.log.error({err:String(r).replace(/\n|\r/g,``)},`SQL generation error`),n.status(500).send(e.i(r instanceof Error?r.message:`SQL generation failed`,500))}}),n.post(`${d}/dry-run`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let n=t.body;return await e.f(n.query||n,await c(t),g)}catch(e){return t.log.error(e,`Dry-run error`),n.status(400).send({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),n.get(`${d}/dry-run`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:n}=t.query;return await e.f(JSON.parse(n),await c(t),g)}catch(e){return t.log.error(e,`Dry-run error`),n.status(400).send({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),n.post(`${d}/explain`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let n=e.body,r=n.query||n,i=n.options||{},a=await c(e),o=g.validateQuery(r);return o.isValid?await g.explainQuery(r,a,i):t.status(400).send({error:`Query validation failed: ${o.errors.join(`, `)}`})}catch(n){return e.log.error(n,`Explain error`),t.status(500).send({error:n instanceof Error?n.message:`Explain query failed`})}}),h&&n.post(`${d}/agent/chat`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-DzUX7CBs.cjs`)),{message:r,sessionId:i,history:a}=e.body;if(!r||typeof r!=`string`)return t.status(400).send({error:`message is required and must be a string`});let o=(h.apiKey||``).trim();if(h.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(o=t.trim())}if(!o)return t.status(401).send({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let s=h.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,l=h.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=h.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,d=await c(e),f=h.buildSystemContext?.(d);t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:r,sessionId:i,history:a,semanticLayer:g,securityContext:d,agentConfig:h,apiKey:o,systemContext:f,providerOverride:s,modelOverride:l,baseURLOverride:u});for await(let n of e)t.raw.write(`data: ${JSON.stringify(n)}\n\n`)}catch(e){let n={type:`error`,data:{message:e instanceof Error?e.message:`Stream failed`}};t.raw.write(`data: ${JSON.stringify(n)}\n\n`)}finally{t.raw.end()}}catch(n){if(e.log.error(n,`Agent chat error`),!t.raw.headersSent)return t.status(500).send({error:n instanceof Error?n.message:`Agent chat failed`})}}),m.enabled!==!1){let e=m.basePath??`/mcp`;n.post(`${e}`,{bodyLimit:f,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,n)=>{let r=t.p(e.headers.origin,m.allowedOrigins?{allowedOrigins:m.allowedOrigins}:{});if(!r.valid)return n.status(403).send(t.n(null,-32600,r.reason));let i=e.headers.accept;if(!t.f(i))return n.status(400).send(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=t.c(e.headers);if(!a.ok)return n.status(426).send({error:`Unsupported MCP protocol version`,supported:a.supported});let o=t.l(e.body);if(!o)return n.status(400).send(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=t.m(i),l=o.method===`initialize`;try{let r=await t.i(o.method,o.params,{semanticLayer:g,extractSecurityContext:c,rawRequest:e,rawResponse:n,negotiatedProtocol:a.negotiated});if(t.s(o))return n.status(202).send();let i=l&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&n.header(t.t,i);let u=t.r(o.id??null,r);if(s){let e=t.u();n.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${t.d(u,e)}`);return}return n.send(u)}catch(r){if(t.s(o))return e.log.error({err:String(r).replace(/\n|\r/g,``)},`MCP notification processing error`),n.status(202).send();e.log.error({err:String(r).replace(/\n|\r/g,``)},`MCP RPC error`);let i=r?.code??-32603,a=r?.data,c=r.message||`MCP request failed`,l=t.n(o.id??null,i,c,a);if(s){let e=t.u();n.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${t.d(l,e)}`);return}return n.send(l)}}),n.get(`${e}`,async(e,n)=>{let r=t.u();n.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),n.raw.write(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{n.raw.write(`: keep-alive
2
2
 
3
3
  `)},15e3);e.raw.on(`close`,()=>{clearInterval(i)})}),n.delete(`${e}`,async(e,t)=>t.status(405).send({error:`Session termination not supported`}))}n.setErrorHandler(async(t,n,r)=>(n.log.error(t,`Fastify cube adapter error`),r.statusCode<400&&r.status(500),e.i(t instanceof Error?t:String(t),r.statusCode))),i()};async function r(e,t){await e.register(n,t)}function i(e){let t=require(`fastify`)({logger:!0});return t.register(n,e),t}exports.createCubeApp=i,exports.cubePlugin=n,exports.registerCubeRoutes=r;
@@ -1,5 +1,5 @@
1
1
  import { a as e, f as t, g as n, i as r, o as i, r as a, u as o } from "../utils-DkKcpkx5.js";
2
- import { c as s, d as c, f as l, h as u, i as d, l as f, m as p, n as m, p as h, r as g, s as _, t as v, u as y } from "../mcp-transport-Cdisv8il.js";
2
+ import { c as s, d as c, f as l, h as u, i as d, l as f, m as p, n as m, p as h, r as g, s as _, t as v, u as y } from "../mcp-transport-x_A7Q5OL.js";
3
3
  //#region src/adapters/fastify/index.ts
4
4
  var b = function(n, b, x) {
5
5
  let { cubes: S, drizzle: C, schema: w, extractSecurityContext: T, engineType: E, cors: D, basePath: O = "/cubejs-api/v1", bodyLimit: k = 10485760, cache: A, mcp: j = { enabled: !0 }, agent: M } = b;
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CDExg9uP.cjs`),t=require(`../mcp-transport-Dmf2vbIb.cjs`);let n=require(`hono`);var r=e=>{let t={origin:`*`,allowMethods:[`GET`,`HEAD`,`PUT`,`POST`,`DELETE`,`PATCH`],allowHeaders:[],exposeHeaders:[],...e},n=(e=>typeof e==`string`?e===`*`?()=>e:t=>e===t?t:null:typeof e==`function`?e:t=>e.includes(t)?t:null)(t.origin),r=(e=>typeof e==`function`?e:Array.isArray(e)?()=>e:()=>[])(t.allowMethods);return async function(e,i){function a(t,n){e.res.headers.set(t,n)}let o=await n(e.req.header(`origin`)||``,e);if(o&&a(`Access-Control-Allow-Origin`,o),t.credentials&&a(`Access-Control-Allow-Credentials`,`true`),t.exposeHeaders?.length&&a(`Access-Control-Expose-Headers`,t.exposeHeaders.join(`,`)),e.req.method===`OPTIONS`){t.origin!==`*`&&a(`Vary`,`Origin`),t.maxAge!=null&&a(`Access-Control-Max-Age`,t.maxAge.toString());let n=await r(e.req.header(`origin`)||``,e);n.length&&a(`Access-Control-Allow-Methods`,n.join(`,`));let i=t.allowHeaders;if(!i?.length){let t=e.req.header(`Access-Control-Request-Headers`);t&&(i=t.split(/\s*,\s*/))}return i?.length&&(a(`Access-Control-Allow-Headers`,i.join(`,`)),e.res.headers.append(`Vary`,`Access-Control-Request-Headers`)),e.res.headers.delete(`Content-Length`),e.res.headers.delete(`Content-Type`),new Response(null,{headers:e.res.headers,status:204,statusText:`No Content`})}await i(),t.origin!==`*`&&e.header(`Vary`,`Origin`,{append:!0})}};function i(i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,cache:f,mcp:p={enabled:!0},agent:m}=i;if(!i.semanticLayer&&(!a||a.length===0))throw Error(`Either semanticLayer or a non-empty cubes array must be provided`);let h=new n.Hono;u&&h.use(`/*`,r(u));let g=i.semanticLayer??new t.h({drizzle:o,schema:s,engineType:l,cache:f,rlsSetup:i.rlsSetup});if(!i.semanticLayer&&a&&a.forEach(e=>{g.registerCube(e)}),h.post(`${d}/load`,async t=>{try{let n=await t.req.json(),r=n.query||n,i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=t.req.header(`x-cache-control`)===`no-cache`,s=await g.executeMultiCubeQuery(r,i,{skipCache:o});return t.json(e.r(r,s,g))}catch(e){return console.error(`Query execution error:`,e),t.json({error:e instanceof Error?e.message:`Query execution failed`},500)}}),h.get(`${d}/load`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`},400);let r;try{r=JSON.parse(n)}catch{return t.json({error:`Invalid JSON in query parameter`},400)}let i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=t.req.header(`x-cache-control`)===`no-cache`,s=await g.executeMultiCubeQuery(r,i,{skipCache:o});return t.json(e.r(r,s,g))}catch(e){return console.error(`Query execution error:`,e),t.json({error:e instanceof Error?e.message:`Query execution failed`},500)}}),h.post(`${d}/batch`,async t=>{try{let{queries:n}=await t.req.json();if(!n||!Array.isArray(n))return t.json({error:`Request body must contain a "queries" array`},400);if(n.length===0)return t.json({error:`Queries array cannot be empty`},400);let r=await e.u(n,await c(t),g,{skipCache:t.req.header(`x-cache-control`)===`no-cache`});return t.json(r)}catch(e){return console.error(`Batch execution error:`,e),t.json({error:e instanceof Error?e.message:`Batch execution failed`},500)}}),h.get(`${d}/meta`,t=>{try{let n=g.getMetadata();return t.json(e.a(n))}catch(e){return console.error(`Metadata error:`,e),t.json({error:e instanceof Error?e.message:`Failed to fetch metadata`},500)}}),h.post(`${d}/sql`,async t=>{try{let n=await t.req.json(),r=await c(t),i=g.validateQuery(n);if(!i.isValid)return t.json({error:`Query validation failed: ${i.errors.join(`, `)}`},400);let a=n.measures?.[0]||n.dimensions?.[0];if(!a)return t.json({error:`No measures or dimensions specified`},400);let o=a.split(`.`)[0],s=await g.generateSQL(o,n,r);return t.json(e.o(n,s))}catch(e){return console.error(`SQL generation error:`,e),t.json({error:e instanceof Error?e.message:`SQL generation failed`},500)}}),h.get(`${d}/sql`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`},400);let r=JSON.parse(n),i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return t.json({error:`No measures or dimensions specified`},400);let s=o.split(`.`)[0],l=await g.generateSQL(s,r,i);return t.json(e.o(r,l))}catch(e){return console.error(`SQL generation error:`,e),t.json({error:e instanceof Error?e.message:`SQL generation failed`},500)}}),h.post(`${d}/dry-run`,async t=>{try{let n=await t.req.json(),r=await e.f(n.query||n,await c(t),g);return t.json(r)}catch(e){return console.error(`Dry-run error:`,e),t.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},400)}}),h.get(`${d}/dry-run`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`,valid:!1},400);let r=await e.f(JSON.parse(n),await c(t),g);return t.json(r)}catch(e){return console.error(`Dry-run error:`,e),t.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},400)}}),h.post(`${d}/explain`,async e=>{try{let t=await e.req.json(),n=t.query||t,r=t.options||{},i=await c(e),a=g.validateQuery(n);if(!a.isValid)return e.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=await g.explainQuery(n,i,r);return e.json(o)}catch(t){return console.error(`Explain error:`,t),e.json({error:t instanceof Error?t.message:`Explain query failed`},500)}}),m&&h.post(`${d}/agent/chat`,async e=>{try{let{handleAgentChat:t}=await Promise.resolve().then(()=>require(`../handler-DzUX7CBs.cjs`)),{message:n,sessionId:r,history:i}=await e.req.json();if(!n||typeof n!=`string`)return e.json({error:`message is required and must be a string`},400);let a=(m.apiKey||``).trim();if(m.allowClientApiKey){let t=e.req.header(`x-agent-api-key`);t&&(a=t.trim())}if(!a)return e.json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`},401);let o=m.allowClientApiKey?e.req.header(`x-agent-provider`):void 0,s=m.allowClientApiKey?e.req.header(`x-agent-model`):void 0,l=m.allowClientApiKey?e.req.header(`x-agent-provider-endpoint`):void 0,u=await c(e),d=m.buildSystemContext?.(u),f=new TextEncoder,p=new ReadableStream({async start(e){try{let c=t({message:n,sessionId:r,history:i,semanticLayer:g,securityContext:u,agentConfig:m,apiKey:a,systemContext:d,providerOverride:o,modelOverride:s,baseURLOverride:l});for await(let t of c){let n=`data: ${JSON.stringify(t)}\n\n`;e.enqueue(f.encode(n))}}catch(t){let n={type:`error`,data:{message:t instanceof Error?t.message:`Stream failed`}};e.enqueue(f.encode(`data: ${JSON.stringify(n)}\n\n`))}finally{e.close()}}});return new Response(p,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})}catch(t){return console.error(`Agent chat error:`,t),e.json({error:t instanceof Error?t.message:`Agent chat failed`},500)}}),p.enabled!==!1){let e={uri:`drizzle-cube://schema`,name:`Cube Schema`,description:`Current cube metadata as JSON`,mimeType:`application/json`,text:JSON.stringify(g.getMetadata(),null,2)},n=[...t.o(),e],r=t.a(),i=p.basePath??`/mcp`;h.post(`${i}`,async e=>{let i=t.p(e.req.header(`origin`),p.allowedOrigins?{allowedOrigins:p.allowedOrigins}:{});if(!i.valid)return e.json(t.n(null,-32600,i.reason),403);let a=e.req.header(`accept`);if(!t.f(a))return e.json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`),400);let o=t.c(e.req.header());if(!o.ok)return e.json({error:`Unsupported MCP protocol version`,supported:o.supported},426);let s=t.l(await e.req.json().catch(()=>null));if(!s)return e.json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`),400);let l=t.m(a),u=s.method===`initialize`;try{let i=await t.i(s.method,s.params,{semanticLayer:g,extractSecurityContext:c,rawRequest:e,rawResponse:null,negotiatedProtocol:o.negotiated,resources:n,prompts:r});if(t.s(s))return e.body(null,202);let a=t.r(s.id??null,i),d=u&&i&&typeof i==`object`&&`sessionId`in i?i.sessionId:void 0,f={};if(d&&(f[t.t]=d),l){let e=new TextEncoder,n=t.u(),r=new ReadableStream({start(r){r.enqueue(e.encode(`id: ${n}\n\n`)),r.enqueue(e.encode(t.d(a,n))),r.close()}});return new Response(r,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,...f}})}return e.json(a,200,f)}catch(n){if(t.s(s))return console.error(`MCP notification processing error:`,n),e.body(null,202);console.error(`MCP RPC error:`,n);let r=n?.code??-32603,i=n?.data,a=n.message||`MCP request failed`,o=t.n(s.id??null,r,a,i);if(l){let e=new TextEncoder,n=t.u(),r=new ReadableStream({start(r){r.enqueue(e.encode(`id: ${n}\n\n`)),r.enqueue(e.encode(t.d(o,n))),r.close()}});return new Response(r,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})}return e.json(o,200)}}),h.delete(`${i}`,e=>e.json({error:`Session termination not supported`},405)),h.get(`${i}`,e=>{let n=new TextEncoder,r=t.u(),i,a=new ReadableStream({start(e){e.enqueue(n.encode(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3))),i=setInterval(()=>{e.enqueue(n.encode(`: keep-alive
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CDExg9uP.cjs`),t=require(`../mcp-transport-CjA5_6G_.cjs`);let n=require(`hono`);var r=e=>{let t={origin:`*`,allowMethods:[`GET`,`HEAD`,`PUT`,`POST`,`DELETE`,`PATCH`],allowHeaders:[],exposeHeaders:[],...e},n=(e=>typeof e==`string`?e===`*`?()=>e:t=>e===t?t:null:typeof e==`function`?e:t=>e.includes(t)?t:null)(t.origin),r=(e=>typeof e==`function`?e:Array.isArray(e)?()=>e:()=>[])(t.allowMethods);return async function(e,i){function a(t,n){e.res.headers.set(t,n)}let o=await n(e.req.header(`origin`)||``,e);if(o&&a(`Access-Control-Allow-Origin`,o),t.credentials&&a(`Access-Control-Allow-Credentials`,`true`),t.exposeHeaders?.length&&a(`Access-Control-Expose-Headers`,t.exposeHeaders.join(`,`)),e.req.method===`OPTIONS`){t.origin!==`*`&&a(`Vary`,`Origin`),t.maxAge!=null&&a(`Access-Control-Max-Age`,t.maxAge.toString());let n=await r(e.req.header(`origin`)||``,e);n.length&&a(`Access-Control-Allow-Methods`,n.join(`,`));let i=t.allowHeaders;if(!i?.length){let t=e.req.header(`Access-Control-Request-Headers`);t&&(i=t.split(/\s*,\s*/))}return i?.length&&(a(`Access-Control-Allow-Headers`,i.join(`,`)),e.res.headers.append(`Vary`,`Access-Control-Request-Headers`)),e.res.headers.delete(`Content-Length`),e.res.headers.delete(`Content-Type`),new Response(null,{headers:e.res.headers,status:204,statusText:`No Content`})}await i(),t.origin!==`*`&&e.header(`Vary`,`Origin`,{append:!0})}};function i(i){let{cubes:a,drizzle:o,schema:s,extractSecurityContext:c,engineType:l,cors:u,basePath:d=`/cubejs-api/v1`,cache:f,mcp:p={enabled:!0},agent:m}=i;if(!i.semanticLayer&&(!a||a.length===0))throw Error(`Either semanticLayer or a non-empty cubes array must be provided`);let h=new n.Hono;u&&h.use(`/*`,r(u));let g=i.semanticLayer??new t.h({drizzle:o,schema:s,engineType:l,cache:f,rlsSetup:i.rlsSetup});if(!i.semanticLayer&&a&&a.forEach(e=>{g.registerCube(e)}),h.post(`${d}/load`,async t=>{try{let n=await t.req.json(),r=n.query||n,i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=t.req.header(`x-cache-control`)===`no-cache`,s=await g.executeMultiCubeQuery(r,i,{skipCache:o});return t.json(e.r(r,s,g))}catch(e){return console.error(`Query execution error:`,e),t.json({error:e instanceof Error?e.message:`Query execution failed`},500)}}),h.get(`${d}/load`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`},400);let r;try{r=JSON.parse(n)}catch{return t.json({error:`Invalid JSON in query parameter`},400)}let i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=t.req.header(`x-cache-control`)===`no-cache`,s=await g.executeMultiCubeQuery(r,i,{skipCache:o});return t.json(e.r(r,s,g))}catch(e){return console.error(`Query execution error:`,e),t.json({error:e instanceof Error?e.message:`Query execution failed`},500)}}),h.post(`${d}/batch`,async t=>{try{let{queries:n}=await t.req.json();if(!n||!Array.isArray(n))return t.json({error:`Request body must contain a "queries" array`},400);if(n.length===0)return t.json({error:`Queries array cannot be empty`},400);let r=await e.u(n,await c(t),g,{skipCache:t.req.header(`x-cache-control`)===`no-cache`});return t.json(r)}catch(e){return console.error(`Batch execution error:`,e),t.json({error:e instanceof Error?e.message:`Batch execution failed`},500)}}),h.get(`${d}/meta`,t=>{try{let n=g.getMetadata();return t.json(e.a(n))}catch(e){return console.error(`Metadata error:`,e),t.json({error:e instanceof Error?e.message:`Failed to fetch metadata`},500)}}),h.post(`${d}/sql`,async t=>{try{let n=await t.req.json(),r=await c(t),i=g.validateQuery(n);if(!i.isValid)return t.json({error:`Query validation failed: ${i.errors.join(`, `)}`},400);let a=n.measures?.[0]||n.dimensions?.[0];if(!a)return t.json({error:`No measures or dimensions specified`},400);let o=a.split(`.`)[0],s=await g.generateSQL(o,n,r);return t.json(e.o(n,s))}catch(e){return console.error(`SQL generation error:`,e),t.json({error:e instanceof Error?e.message:`SQL generation failed`},500)}}),h.get(`${d}/sql`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`},400);let r=JSON.parse(n),i=await c(t),a=g.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return t.json({error:`No measures or dimensions specified`},400);let s=o.split(`.`)[0],l=await g.generateSQL(s,r,i);return t.json(e.o(r,l))}catch(e){return console.error(`SQL generation error:`,e),t.json({error:e instanceof Error?e.message:`SQL generation failed`},500)}}),h.post(`${d}/dry-run`,async t=>{try{let n=await t.req.json(),r=await e.f(n.query||n,await c(t),g);return t.json(r)}catch(e){return console.error(`Dry-run error:`,e),t.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},400)}}),h.get(`${d}/dry-run`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`,valid:!1},400);let r=await e.f(JSON.parse(n),await c(t),g);return t.json(r)}catch(e){return console.error(`Dry-run error:`,e),t.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},400)}}),h.post(`${d}/explain`,async e=>{try{let t=await e.req.json(),n=t.query||t,r=t.options||{},i=await c(e),a=g.validateQuery(n);if(!a.isValid)return e.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=await g.explainQuery(n,i,r);return e.json(o)}catch(t){return console.error(`Explain error:`,t),e.json({error:t instanceof Error?t.message:`Explain query failed`},500)}}),m&&h.post(`${d}/agent/chat`,async e=>{try{let{handleAgentChat:t}=await Promise.resolve().then(()=>require(`../handler-DzUX7CBs.cjs`)),{message:n,sessionId:r,history:i}=await e.req.json();if(!n||typeof n!=`string`)return e.json({error:`message is required and must be a string`},400);let a=(m.apiKey||``).trim();if(m.allowClientApiKey){let t=e.req.header(`x-agent-api-key`);t&&(a=t.trim())}if(!a)return e.json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`},401);let o=m.allowClientApiKey?e.req.header(`x-agent-provider`):void 0,s=m.allowClientApiKey?e.req.header(`x-agent-model`):void 0,l=m.allowClientApiKey?e.req.header(`x-agent-provider-endpoint`):void 0,u=await c(e),d=m.buildSystemContext?.(u),f=new TextEncoder,p=new ReadableStream({async start(e){try{let c=t({message:n,sessionId:r,history:i,semanticLayer:g,securityContext:u,agentConfig:m,apiKey:a,systemContext:d,providerOverride:o,modelOverride:s,baseURLOverride:l});for await(let t of c){let n=`data: ${JSON.stringify(t)}\n\n`;e.enqueue(f.encode(n))}}catch(t){let n={type:`error`,data:{message:t instanceof Error?t.message:`Stream failed`}};e.enqueue(f.encode(`data: ${JSON.stringify(n)}\n\n`))}finally{e.close()}}});return new Response(p,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})}catch(t){return console.error(`Agent chat error:`,t),e.json({error:t instanceof Error?t.message:`Agent chat failed`},500)}}),p.enabled!==!1){let e={uri:`drizzle-cube://schema`,name:`Cube Schema`,description:`Current cube metadata as JSON`,mimeType:`application/json`,text:JSON.stringify(g.getMetadata(),null,2)},n=[...t.o(),e],r=t.a(),i=p.basePath??`/mcp`;h.post(`${i}`,async e=>{let i=t.p(e.req.header(`origin`),p.allowedOrigins?{allowedOrigins:p.allowedOrigins}:{});if(!i.valid)return e.json(t.n(null,-32600,i.reason),403);let a=e.req.header(`accept`);if(!t.f(a))return e.json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`),400);let o=t.c(e.req.header());if(!o.ok)return e.json({error:`Unsupported MCP protocol version`,supported:o.supported},426);let s=t.l(await e.req.json().catch(()=>null));if(!s)return e.json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`),400);let l=t.m(a),u=s.method===`initialize`;try{let i=await t.i(s.method,s.params,{semanticLayer:g,extractSecurityContext:c,rawRequest:e,rawResponse:null,negotiatedProtocol:o.negotiated,resources:n,prompts:r});if(t.s(s))return e.body(null,202);let a=t.r(s.id??null,i),d=u&&i&&typeof i==`object`&&`sessionId`in i?i.sessionId:void 0,f={};if(d&&(f[t.t]=d),l){let e=new TextEncoder,n=t.u(),r=new ReadableStream({start(r){r.enqueue(e.encode(`id: ${n}\n\n`)),r.enqueue(e.encode(t.d(a,n))),r.close()}});return new Response(r,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,...f}})}return e.json(a,200,f)}catch(n){if(t.s(s))return console.error(`MCP notification processing error:`,n),e.body(null,202);console.error(`MCP RPC error:`,n);let r=n?.code??-32603,i=n?.data,a=n.message||`MCP request failed`,o=t.n(s.id??null,r,a,i);if(l){let e=new TextEncoder,n=t.u(),r=new ReadableStream({start(r){r.enqueue(e.encode(`id: ${n}\n\n`)),r.enqueue(e.encode(t.d(o,n))),r.close()}});return new Response(r,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})}return e.json(o,200)}}),h.delete(`${i}`,e=>e.json({error:`Session termination not supported`},405)),h.get(`${i}`,e=>{let n=new TextEncoder,r=t.u(),i,a=new ReadableStream({start(e){e.enqueue(n.encode(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3))),i=setInterval(()=>{e.enqueue(n.encode(`: keep-alive
2
2
 
3
3
  `))},15e3)},cancel(){clearInterval(i)}});return new Response(a,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})})}return h}function a(e,t){let n=i(t);return e.route(`/`,n),e}function o(e){return a(new n.Hono,e)}exports.createCubeApp=o,exports.createCubeRoutes=i,exports.mountCubeRoutes=a;
@@ -1,5 +1,5 @@
1
1
  import { a as e, f as t, o as n, r, u as i } from "../utils-DkKcpkx5.js";
2
- import { a, c as o, d as s, f as c, h as l, i as u, l as d, m as f, n as p, o as m, p as h, r as g, s as _, t as v, u as y } from "../mcp-transport-Cdisv8il.js";
2
+ import { a, c as o, d as s, f as c, h as l, i as u, l as d, m as f, n as p, o as m, p as h, r as g, s as _, t as v, u as y } from "../mcp-transport-x_A7Q5OL.js";
3
3
  import { Hono as b } from "hono";
4
4
  //#region node_modules/hono/dist/middleware/cors/index.js
5
5
  var x = (e) => {
@@ -193,7 +193,7 @@ const e=require(`./utils-CDExg9uP.cjs`),t=require(`./mcp-prompts-DsAkafVn.cjs`);
193
193
  FROM activity_periods
194
194
  WHERE period_number >= 0 AND period_number <= ${e.periods}
195
195
  GROUP BY binding_key${P.raw(i)}
196
- )`,o=this.databaseAdapter.buildPeriodSeriesSubquery(e.periods),s={period_number:P`p.period_number`.as(`period_number`),retained_users:P`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as(`retained_users`)},c=[P`p.period_number`];for(let e=0;e<n;e++)s[`breakdown_${e}`]=P.raw(`ump.breakdown_${e}`).as(`breakdown_${e}`),c.push(P.raw(`ump.breakdown_${e}`));return t.db.select(s).from(P`${a} ump`).innerJoin(o,P`TRUE`).groupBy(...c)}buildPeriodNumberExpression(e,t,n){return this.databaseAdapter.buildDateDiffPeriods(e,t,n)}extractDimensionName(e){let t=e.split(`.`);return t.length>1?t[1]:t[0]}},$t=class{constructor(e){this.queryPlanner=e}plan(e,t,n){return this.planWithAnalysis(e,t,n).plan}planWithAnalysis(e,t,n){let r=Array.from(this.queryPlanner.analyzeCubeUsage(t));if(r.length===0)throw Error(`No cubes found in query`);let i=this.queryPlanner.analyzePrimaryCube(r,t,e),a=i.selectedCube,o=e.get(a);if(!o)throw Error(`Primary cube '${a}' not found`);let s=r.filter(e=>e!==a).map(n=>this.queryPlanner.analyzeJoinPathForTarget(e,a,n,t)),c=r.length>1?this.queryPlanner.buildJoinPlanForPrimary(e,o,r,n,t):[],l=r.length>1?this.queryPlanner.buildPreAggregationCTEs(e,o,c,t,n)??[]:[],u=this.queryPlanner.buildWarnings(t,l),d=this.buildSourceFromPhases(o,c,l,e,t,n),f=d.source,p=this.buildQueryNode(f,t,e,u),m=this.buildPreAggregationAnalysis(l),h=new Map;for(let t of r){let n=e.get(t);n&&h.set(t,n)}let g=Z.hasPostAggregationWindows(t.measures??[],h),_=[...s.filter(e=>!e.pathFound&&e.error).map(e=>e.error),...u.map(e=>e.message)];return{plan:p,analysis:{timestamp:new Date().toISOString(),cubeCount:r.length,cubesInvolved:[...r].sort(),primaryCube:i,joinPaths:s,preAggregations:m,querySummary:{queryType:l.length>0?`multi_cube_cte`:r.length>1?`multi_cube_join`:`single_cube`,measureStrategy:d.strategy,joinCount:c.length,cteCount:l.length,hasPreAggregation:l.length>0,hasWindowFunctions:g},warnings:_.length>0?_:void 0,planningTrace:{steps:[{phase:`cube_usage`,decision:`Identified ${r.length} cube${r.length===1?``:`s`} from query members`,details:{cubesInvolved:[...r].sort()}},{phase:`primary_cube_selection`,decision:`Selected '${i.selectedCube}' as primary cube (${i.reason})`,details:{selectedCube:i.selectedCube,reason:i.reason,candidates:i.candidates?.map(e=>e.cubeName)}},{phase:`join_planning`,decision:`Planned ${c.length} join${c.length===1?``:`s`}`,details:{joinCount:c.length,joinTargets:c.map(e=>e.cube.name),pathSelection:s.map(e=>({targetCube:e.targetCube,strategy:e.selection?.strategy,selectedRank:e.selection?.selectedRank,selectedScore:e.selection?.selectedScore}))}},{phase:`cte_planning`,decision:`Planned ${l.length} pre-aggregation CTE${l.length===1?``:`s`}`,details:{cteCount:l.length,cubes:l.map(e=>e.cube.name)}},{phase:`measure_strategy`,decision:`Selected '${d.strategy}' measure strategy`,details:{strategy:d.strategy,regularMeasures:d.classification.regular.map(e=>e.name),multipliedMeasures:d.classification.multiplied.map(e=>e.name),deduplicationSafeMeasures:d.classification.deduplicationSafe.map(e=>e.name),sourceType:f.type}},{phase:`warnings`,decision:u.length>0?`Generated ${u.length} planning warning${u.length===1?``:`s`}`:`No planning warnings generated`,details:{warningCodes:u.map(e=>e.code)}}]}}}}buildSourceFromPhases(e,t,n,r,i,a){let o=this.tryBuildMultiFactMergeSource(i,r,a);if(o)return{source:o,strategy:`multiFactMerge`,classification:{regular:this.buildMeasureRefs(i,r),multiplied:[],deduplicationSafe:[]}};let s=this.buildSimpleSourceFromPhases(e,t,n,r,i),c=this.classifyMeasuresForStrategy(s.schema.measures,n),l=this.selectMeasureStrategy(c,i,r);return l===`keysDeduplication`?{source:this.buildKeysDeduplicationSource(s,c),strategy:l,classification:c}:{source:s,strategy:l,classification:c}}buildSimpleSourceFromPhases(e,t,n,r,i){let a=this.buildMeasureRefs(i,r),o=this.buildDimensionRefs(i,r),s=this.buildTimeDimensionRefs(i,r),c=this.toCubeRef(e),l=t.map(e=>({target:this.toCubeRef(e.cube),alias:e.alias,joinType:e.joinType,joinCondition:e.joinCondition,relationship:e.relationship,junctionTable:e.junctionTable})),u=n.map(e=>{let t=this.toCubeRef(e.cube);return{type:`ctePreAggregate`,schema:this.buildCTESchema(e,r),cube:t,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType??`aggregate`,cteReason:e.cteReason??`hasMany`}});return{type:`simpleSource`,schema:{measures:a,dimensions:o,timeDimensions:s},primaryCube:c,joins:l,ctes:u}}tryBuildMultiFactMergeSource(e,t,n){if(!e.measures||e.measures.length<2)return null;let r=new Set;for(let t of e.measures){let[e]=t.split(`.`);e&&r.add(e)}if(r.size<2)return null;let i=new Set;for(let t of e.dimensions??[]){let[e]=t.split(`.`);e&&i.add(e)}for(let t of e.timeDimensions??[]){let[e]=t.dimension.split(`.`);e&&i.add(e)}if(i.size!==1)return null;let a=Array.from(i)[0];if(r.has(a)||!t.get(a))return null;let o=Array.from(r);if(!o.every(e=>this.hasDirectJoinToSharedDimension(t.get(e),a,t)))return null;let s=this.buildDimensionRefs(e,t),c=this.buildTimeDimensionRefs(e,t),l={measures:this.buildMeasureRefs(e,t),dimensions:s,timeDimensions:c},u=[];for(let r of o){let i=(e.measures??[]).filter(e=>e.startsWith(`${r}.`)),o=new Set([r,a]),s={measures:i,dimensions:e.dimensions,timeDimensions:e.timeDimensions,filters:this.projectFiltersToAllowedCubes(e.filters,o)},c=this.buildGroupQueryNode(s,t,n);if(!c)return null;u.push(c)}return u.length<2?null:{type:`multiFactMerge`,schema:l,groups:u,sharedDimensions:s,mergeStrategy:`fullJoin`}}hasDirectJoinToSharedDimension(e,t,n){if(!e?.joins)return!1;for(let[,r]of Object.entries(e.joins)){let e=G(r.targetCube,n);if(!(!e||e.name!==t)&&(r.relationship===`belongsTo`||r.relationship===`hasOne`))return!0}return!1}buildGroupQueryNode(e,t,n){let r=Array.from(this.queryPlanner.analyzeCubeUsage(e));if(r.length===0)return null;let i=this.queryPlanner.analyzePrimaryCube(r,e,t),a=t.get(i.selectedCube);if(!a)return null;let o=r.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,a,r,n,e):[],s=r.length>1?this.queryPlanner.buildPreAggregationCTEs(t,a,o,e,n)??[]:[],c=this.queryPlanner.buildWarnings(e,s),l=this.buildSourceFromPhases(a,o,s,t,e,n);return this.buildQueryNode(l.source,e,t,c)}projectFiltersToAllowedCubes(e,t){if(!e||e.length===0)return;let n=e.map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length>0?n:void 0}projectFilterNodeToAllowedCubes(e,t){if(`member`in e){let[n]=e.member.split(`.`);return n&&t.has(n)?e:null}if(`and`in e){let n=(e.and??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{and:n}}if(`or`in e){let n=(e.or??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{or:n}}return null}classifyMeasuresForStrategy(e,t){let n={regular:[],multiplied:[],deduplicationSafe:[]},r=new Set(t.filter(e=>e.cteReason===`fanOutPrevention`).map(e=>e.cube.name));for(let t of e){let e=t.cube.cube,i=e.measures?.[t.localName];if(!i||!r.has(e.name)){n.regular.push(t);continue}this.isDeduplicationSafeMeasure(i)?n.deduplicationSafe.push(t):n.multiplied.push(t)}return n}selectMeasureStrategy(e,t,n){return e.multiplied.length===0?`simple`:e.multiplied.every(e=>this.getPrimaryKeyColumns(e.cube.cube).length>0)&&this.isKeysDeduplicationExecutionSupported(e,t,n)?`keysDeduplication`:`ctePreAggregateFallback`}isKeysDeduplicationExecutionSupported(e,t,n){let r=new Set(e.multiplied.map(e=>e.cube.name));if(r.size!==1)return!1;let i=Array.from(r)[0],a=t.measures??[];if(a.length===0)return!1;let o=n.get(i);if(!o)return!1;for(let e of a){let[t,r]=e.split(`.`);if(t!==i){let e=n.get(t)?.measures?.[r];if(!e||![`sum`,`count`,`number`,`min`,`max`].includes(e.type))return!1;continue}let a=o.measures?.[r];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!this.queryHasMeasureFilter(t,i,o)}queryHasMeasureFilter(e,t,n){let r=e=>{let[r,i]=e.split(`.`);return r===t&&!!n.measures?.[i]},i=e=>{if(!e)return!1;for(let t of e){if(`and`in t){if(i(t.and))return!0;continue}if(`or`in t){if(i(t.or))return!0;continue}if(`member`in t&&r(t.member))return!0}return!1};return i(e.filters)}buildKeysDeduplicationSource(e,t){let n=this.deduplicateColumnRefs(t.multiplied.flatMap(e=>this.getPrimaryKeyColumns(e.cube.cube))),r=t.regular.length>0?t.regular.map(e=>e.name):void 0;return{type:`keysDeduplication`,schema:e.schema,keysSource:e,measureSource:e,joinOn:n,regularMeasures:r}}isDeduplicationSafeMeasure(e){return e.type===`countDistinct`||e.type===`countDistinctApprox`}getPrimaryKeyColumns(e){let t=[];for(let[n,r]of Object.entries(e.dimensions??{}))!r.primaryKey||typeof r.sql==`function`||t.push({column:r.sql,alias:`${e.name}.${n}`});return t}deduplicateColumnRefs(e){let t=new Map;for(let n of e){let e=n.alias??String(n.column?.name??``);t.has(e)||t.set(e,n)}return Array.from(t.values())}buildQueryNode(e,t,n,r){let i=this.buildMeasureRefs(t,n),a=this.buildDimensionRefs(t,n),o=this.buildTimeDimensionRefs(t,n),s=this.buildOrderByRefs(t),c=t.filters??[];return{type:`query`,schema:{measures:i,dimensions:a,timeDimensions:o},source:e,dimensions:a,measures:i,filters:c,timeDimensions:o,orderBy:s,limit:t.limit,offset:t.offset,warnings:r}}buildPreAggregationAnalysis(e){return e.map(e=>({cubeName:e.cube.name,cteAlias:e.cteAlias,reason:e.cteReason===`fanOutPrevention`?`Potential fan-out from hasMany joins - pre-aggregate ${e.cube.name} to preserve correctness`:`hasMany relationship requires pre-aggregation for ${e.cube.name}`,reasonType:e.cteReason,measures:e.measures,joinKeys:e.joinKeys.map(e=>({sourceColumn:e.sourceColumn,targetColumn:e.targetColumn})),cteType:e.cteType}))}buildMeasureRefs(e,t){return e.measures?e.measures.map(e=>{let[n,r]=e.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for measure '${e}'`);return{name:e,cube:this.toCubeRef(i),localName:r}}):[]}buildDimensionRefs(e,t){return e.dimensions?e.dimensions.map(e=>{let[n,r]=e.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for dimension '${e}'`);return{name:e,cube:this.toCubeRef(i),localName:r}}):[]}buildTimeDimensionRefs(e,t){return e.timeDimensions?e.timeDimensions.map(e=>{let[n,r]=e.dimension.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for time dimension '${e.dimension}'`);return{name:e.dimension,cube:this.toCubeRef(i),localName:r,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange}}):[]}buildOrderByRefs(e){return e.order?Object.entries(e.order).map(([e,t])=>({name:e,direction:t})):[]}toCubeRef(e){return{name:e.name,cube:e}}buildCTESchema(e,t){return{measures:e.measures.map(e=>{let[n,r]=e.split(`.`);return{name:e,cube:{name:n,cube:t.get(n)},localName:r}}),dimensions:[],timeDimensions:[]}}},en=class{name=`identity`;optimise(e){return e}};function tn(e,t,n,r){let i=new Map;if(e.preAggregationCTEs&&e.preAggregationCTEs.length>0){for(let t of e.preAggregationCTEs)if(t.propagatingFilters&&t.propagatingFilters.length>0)for(let e of t.propagatingFilters){let t=e.sourceCube.name;if(!i.has(t)){let a={filters:e.filters},o=new Map([[t,e.sourceCube]]),s=r.queryBuilder.buildWhereConditions(o,a,n);i.set(t,s)}let a=i.get(t);a&&a.length>0&&(e.preBuiltFilterSQL=a.length===1?a[0]:R(...a))}}let a=[],o=new Map,s=new Map;if(e.preAggregationCTEs&&e.preAggregationCTEs.length>0)for(let c of e.preAggregationCTEs){let l=r.cteBuilder.buildPreAggregationCTE(c,t,n,e,i);if(l&&(a.push(l),o.set(c.cube.name,c.cteAlias),c.downstreamJoinKeys))for(let e of c.downstreamJoinKeys)s.set(e.targetCubeName,{cteAlias:c.cteAlias,joinKeys:e.joinKeys})}return{preBuiltFilterMap:i,ctes:a,cteAliasMap:o,downstreamCubeMap:s}}function nn(e,t,n,r,i,a){if(n.measures)for(let o of n.measures){let[s,c]=o.split(`.`),l=i.get(s);if(!l?.measures?.[c])continue;let u=l.measures[c];if(!Z.isPostAggregationWindow(u))continue;let d=Z.getWindowBaseMeasure(u,s);if(!d)continue;let[f,p]=d.split(`.`),m=i.get(f);if(!m?.measures?.[p])continue;let h=m.measures[p],g=t.preAggregationCTEs?.find(e=>e.cube?.name===f&&e.measures?.includes(d)),_;_=g?P`sum(${P`${P.identifier(g.cteAlias)}.${P.identifier(p)}`})`:a.queryBuilder.buildMeasureExpression(h,r,m),e[d]||(e[d]=P`${_}`.as(d));let v=rn(u,_,n,r,l,t,a);v&&(e[o]=P`${v}`.as(o))}}function rn(e,t,n,r,i,a,o){let s=e.windowConfig||{},c=(e,t)=>{if(!a.preAggregationCTEs)return null;let n=a.preAggregationCTEs.find(t=>t.cube?.name===e);return n&&n.cteAlias?P`${P.identifier(n.cteAlias)}.${P.identifier(t)}`:null},l;if(s.orderBy&&s.orderBy.length>0)l=s.orderBy.map(e=>{let a=e.field.includes(`.`)?e.field.split(`.`)[1]:e.field;if(n.timeDimensions)for(let t of n.timeDimensions){let[n,s]=t.dimension.split(`.`);if(s===a){let l=c(n,a);if(l)return{field:l,direction:e.direction};let u=i.dimensions?.[s];if(u)return{field:o.queryBuilder.buildTimeDimensionExpression(u.sql,t.granularity,r),direction:e.direction}}}let l=i.dimensions?.[a];return l?{field:K(l.sql,r),direction:e.direction}:a===(s.measure?.includes(`.`)?s.measure.split(`.`)[1]:s.measure)||e.field===s.measure?{field:t,direction:e.direction}:null}).filter(e=>e!==null);else if(n.timeDimensions&&n.timeDimensions.length>0){let e=n.timeDimensions[0],[t,a]=e.dimension.split(`.`),s=c(t,a);if(s)l=[{field:s,direction:`asc`}];else{let n=i.name===t?i:void 0;if(n?.dimensions?.[a]){let t=n.dimensions[a];l=[{field:o.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,r),direction:`asc`}]}}}let u;s.partitionBy&&s.partitionBy.length>0&&(u=s.partitionBy.map(e=>{let t=e.includes(`.`)?e.split(`.`)[1]:e,n=i.dimensions?.[t];return n?K(n.sql,r):null}).filter(e=>e!==null));let d=o.databaseAdapter.buildWindowFunction(e.type,t,u,l,{offset:s.offset,defaultValue:s.defaultValue,nTile:s.nTile,frame:s.frame});if(!d)return null;switch(s.operation||Z.getDefaultWindowOperation(e.type)){case`difference`:return P`${t} - ${d}`;case`ratio`:return P`${t} / NULLIF(${d}, 0)`;case`percentChange`:return P`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;default:return d}}function an(e,t,n,r,i){let a={...i.queryBuilder.buildSelections(e.joinCubes.length>0?r:e.primaryCube,t,n)};if(e.preAggregationCTEs)for(let o of e.preAggregationCTEs){let e=o.cube.name;for(let s of o.measures){if(!a[s])continue;let[,c]=s.split(`.`),l=r.get(e);if(!l?.measures?.[c])continue;let u=l.measures[c],d=P`${P.identifier(o.cteAlias)}.${P.identifier(c)}`,f;if(u.type===`calculated`&&u.calculatedSql)f=i.queryBuilder.buildCTECalculatedMeasure(u,l,o,r,n);else{let e=o.cteReason===`fanOutPrevention`,n=on(o,t,r),a=e||n;switch(u.type){case`count`:case`countDistinct`:case`sum`:f=a?H(d):V(d);break;case`avg`:f=a?H(d):i.databaseAdapter.buildAvg(d);break;case`min`:f=Ee(d);break;case`max`:f=H(d);break;case`number`:f=H(d);break;default:f=a?H(d):V(d)}}a[s]=P`${f}`.as(s)}for(let t in a){let[n,i]=t.split(`.`);if(n!==e)continue;let s=r.get(e),c=s&&s.dimensions?.[i],l=t.startsWith(e+`.`);if(!c&&!l)continue;let u=o.joinKeys.find(e=>e.targetColumn===i);if(!u&&s?.dimensions?.[i]){let e=s.dimensions[i].sql;u=o.joinKeys.find(t=>t.targetColumnObj===e)}(u||l&&s?.dimensions?.[i])&&(a[t]=P`${P.identifier(o.cteAlias)}.${P.identifier(i)}`.as(t))}}return nn(a,e,t,n,r,i),a}function on(e,t,n){return e.cteReason!==`hasMany`||e.downstreamJoinKeys&&e.downstreamJoinKeys.length>0||e.intermediateJoins&&e.intermediateJoins.length>0||!(t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0)||t.dimensions?.some(t=>t.startsWith(`${e.cube.name}.`))||t.timeDimensions?.some(t=>t.dimension.startsWith(`${e.cube.name}.`))?!1:e.joinKeys.length>0&&e.joinKeys.every(e=>!!e.sourceColumnObj&&sn(e.sourceColumnObj,t,n))}function sn(e,t,n){if(t.dimensions)for(let r of t.dimensions){let[t,i]=r.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}if(t.timeDimensions)for(let r of t.timeDimensions){if(r.granularity)continue;let[t,i]=r.dimension.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}return!1}function cn(e,t,n,r,i,a){let o=[],s=t.db.select(r).from(n.from);if(i.ctes.length>0&&(s=t.db.with(...i.ctes).select(r).from(n.from)),n.joins)for(let e of n.joins)switch(e.type||`left`){case`left`:s=s.leftJoin(e.table,e.on);break;case`inner`:s=s.innerJoin(e.table,e.on);break;case`right`:s=s.rightJoin(e.table,e.on);break;case`full`:s=s.fullJoin(e.table,e.on);break}let c=new Set,l=new Set;if(e.preAggregationCTEs){for(let t of e.preAggregationCTEs)if(t.intermediateJoins&&t.intermediateJoins.length>0)for(let e of t.intermediateJoins)l.add(e.cube.name)}if(e.joinCubes&&e.joinCubes.length>0)for(let n of e.joinCubes){let r=n.cube.name;if(l.has(r)&&!i.cteAliasMap.has(r))continue;let u=i.cteAliasMap.get(n.cube.name);if(n.junctionTable){let r=n.junctionTable,a=r.joinCondition,c=r.sourceCubeName?i.cteAliasMap.get(r.sourceCubeName):void 0;if(c){let t=(e.preAggregationCTEs?.find(e=>e.cube.name===r.sourceCubeName))?.downstreamJoinKeys?.find(e=>e.targetCubeName===n.cube.name);if(t&&t.joinKeys.length>0){let e=[];for(let n of t.joinKeys){let t=P`${P.identifier(c)}.${P.identifier(n.sourceColumn)}`,r=n.targetColumnObj;r&&e.push(L(r,t))}e.length>0&&(a=R(...e))}}let l=[];if(r.securitySql){let e=r.securitySql(t.securityContext);Array.isArray(e)?l.push(...e):l.push(e)}try{switch(r.joinType||`left`){case`left`:s=s.leftJoin(r.table,a);break;case`inner`:s=s.innerJoin(r.table,a);break;case`right`:s=s.rightJoin(r.table,a);break;case`full`:s=s.fullJoin(r.table,a);break}l.length>0&&o.push(...l)}catch{}}let d,f,p;if(u)d=P`${P.identifier(u)}`,f=a.cteBuilder.buildCTEJoinCondition(n,u,e),p=void 0;else{let e=i.downstreamCubeMap.get(n.cube.name),r=n.cube.sql(t);if(d=r.from,p=r.where,e&&!n.junctionTable){let t=[];for(let n of e.joinKeys){let r=P`${P.identifier(e.cteAlias)}.${P.identifier(n.sourceColumn)}`,i=n.targetColumnObj||P.identifier(n.targetColumn);t.push(L(r,i))}f=t.length===1?t[0]:R(...t)}else f=n.joinCondition}let m=n.joinType||`left`,h=m!==`inner`&&p?R(f,p):f;try{switch(m){case`left`:s=s.leftJoin(d,h),p&&c.add(n.cube.name);break;case`inner`:s=s.innerJoin(d,f);break;case`right`:s=s.rightJoin(d,h),p&&c.add(n.cube.name);break;case`full`:s=s.fullJoin(d,h),p&&c.add(n.cube.name);break}}catch{}}return{drizzleQuery:s,allWhereConditions:o,cubesWithSecurityInJoin:c,absorbedIntermediateCubes:l}}function ln(e,t,n,r,i,a,o,s){let c=[...o.allWhereConditions];if(i.where&&c.push(i.where),e.joinCubes&&e.joinCubes.length>0)for(let t of e.joinCubes){let e=t.cube.name;if(a.cteAliasMap.get(e)||o.absorbedIntermediateCubes.has(e)||o.cubesWithSecurityInJoin.has(e))continue;let r=t.cube.sql(n);r.where&&c.push(r.where)}let l=s.queryBuilder.buildWhereConditions(e.joinCubes.length>0?r:e.primaryCube,t,n,e,a.preBuiltFilterMap);l.length>0&&c.push(...l);let u=o.drizzleQuery;if(c.length>0){let e=c.length===1?c[0]:R(...c);u=u.where(e)}let d=s.queryBuilder.buildGroupByFields(e.joinCubes.length>0?r:e.primaryCube,t,n,e);d.length>0&&(u=u.groupBy(...d));let f=s.queryBuilder.buildHavingConditions(e.joinCubes.length>0?r:e.primaryCube,t,n,e);if(f.length>0){let e=f.length===1?f[0]:R(...f);u=u.having(e)}let p=s.queryBuilder.buildOrderBy(t);return p.length>0&&(u=u.orderBy(...p)),u=s.queryBuilder.applyLimitAndOffset(u,t),u}function un(e){let t=new Map;if(t.set(e.primaryCube.name,e.primaryCube),e.joinCubes)for(let n of e.joinCubes)t.set(n.cube.name,n.cube);return t}var dn=class{constructor(e,t,n){this.queryBuilder=e,this.cteBuilder=t,this.databaseAdapter=n}derivePhysicalPlanContext(e){let t=e.source;if(t.type===`multiFactMerge`)return this.derivePhysicalPlanContextFromMultiFact(e,t);if(t.type===`fullKeyAggregate`)return this.derivePhysicalPlanContextFromFullKeyAggregate(e,t);let n=this.resolvePhysicalSimpleSource(t),r=this.resolveKeysDeduplicationMeta(t);return{primaryCube:n.primaryCube.cube,joinCubes:n.joins.map(e=>({cube:e.target.cube,alias:e.alias,joinType:e.joinType,joinCondition:e.joinCondition,junctionTable:e.junctionTable})),preAggregationCTEs:n.ctes.map(e=>({cube:e.cube.cube,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType,cteReason:e.cteReason})),keysDeduplication:r,warnings:e.warnings.length>0?e.warnings:void 0}}derivePhysicalPlanContextFromMultiFact(e,t){let n=t.groups.map((e,t)=>{if(e.type!==`query`)return null;let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`mf_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}}).filter(e=>!!e);if(n.length===0)throw Error(`multiFactMerge requires at least one query group`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:t.mergeStrategy,sharedDimensions:t.sharedDimensions.map(e=>e.name),groups:n}}}derivePhysicalPlanContextFromFullKeyAggregate(e,t){let n=t.subqueries.map((e,t)=>{if(e.type!==`query`)throw Error(`fullKeyAggregate currently requires query subqueries`);let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`fka_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}});if(n.length===0)throw Error(`fullKeyAggregate requires at least one subquery`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:`fullJoin`,sharedDimensions:t.dimensions.map(e=>e.name),groups:n}}}toSemanticQuery(e){let t=e.orderBy.length>0?Object.fromEntries(e.orderBy.map(e=>[e.name,e.direction])):void 0;return{measures:e.measures.map(e=>e.name),dimensions:e.dimensions.map(e=>e.name),timeDimensions:e.timeDimensions.map(e=>({dimension:e.name,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange})),filters:e.filters,order:t,limit:e.limit,offset:e.offset}}resolvePhysicalSimpleSource(e){switch(e.type){case`simpleSource`:return e;case`keysDeduplication`:return this.resolvePhysicalSimpleSourceFromKeysDedup(e);default:throw Error(`Current SQL builder does not support logical node '${e.type}' in physical conversion`)}}resolvePhysicalSimpleSourceFromKeysDedup(e){let t=e.measureSource;if(t.type===`simpleSource`)return t;let n=e.keysSource;if(n.type===`simpleSource`)return n;throw Error(`keysDeduplication requires at least one simpleSource child for SQL physical conversion`)}resolveKeysDeduplicationMeta(e){if(e.type!==`keysDeduplication`)return;let t=e,n=new Set;for(let e of t.joinOn){if(!e.alias)continue;let[t,r]=e.alias.split(`.`);t&&r&&n.add(t)}let r=n.size===1?Array.from(n)[0]:``;return r?{multipliedCubeName:r,primaryKeyDimensions:t.joinOn.map(e=>e.alias?.split(`.`)[1]??``).filter(Boolean),regularMeasures:t.regularMeasures}:void 0}build(e,t,n){let r={queryBuilder:this.queryBuilder,cteBuilder:this.cteBuilder,databaseAdapter:this.databaseAdapter},i=this.tryBuildMultiFactMergeQuery(e,t,n,r);if(i)return i;let a=this.tryBuildKeysDeduplicationQuery(e,t,n,r);if(a)return a;let o=tn(e,t,n,r),s=e.primaryCube.sql(n),c=e.joinCubes.length>0?un(e):new Map([[e.primaryCube.name,e.primaryCube]]);return ln(e,t,n,c,s,o,cn(e,n,s,an(e,t,n,c,r),o,r),r)}tryBuildKeysDeduplicationQuery(e,t,n,r){let i=e.keysDeduplication;if(!i?.multipliedCubeName||!t.measures?.length)return null;let a=e.joinCubes.length>0?un(e):new Map([[e.primaryCube.name,e.primaryCube]]),o=a.get(i.multipliedCubeName);if(!o||!this.canExecuteKeysDeduplication(t,o,i.multipliedCubeName))return null;let s=i.primaryKeyDimensions.length>0?i.primaryKeyDimensions:this.getPrimaryKeyDimensions(o);if(s.length===0)return null;let c=`${i.multipliedCubeName.toLowerCase()}_keys`,l=`${i.multipliedCubeName.toLowerCase()}_pk_agg`,u={},d=[];if(t.dimensions)for(let e of t.dimensions){let[t,r]=e.split(`.`),i=a.get(t),o=i?.dimensions?.[r];if(!i||!o)return null;let s=K(o.sql,n);u[e]=P`${s}`.as(e),d.push(s)}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,i]=e.dimension.split(`.`),o=a.get(t),s=o?.dimensions?.[i];if(!o||!s)return null;let c=r.queryBuilder.buildTimeDimensionExpression(s.sql,e.granularity,n);u[e.dimension]=P`${c}`.as(e.dimension),d.push(c)}let f=[];for(let e of s){let t=o.dimensions?.[e];if(!t)return null;let r=K(t.sql,n),i=`__pk__${e}`;u[i]=P`${r}`.as(i),d.push(r),f.push(i)}let p=i.regularMeasures??[],m=new Set(p),h=t.measures.filter(e=>!m.has(e));if(p.length>0){let e=r.queryBuilder.buildResolvedMeasures(p,a,n);for(let t of p){let n=e.get(t);if(!n)return null;let r=`__reg__${t.replace(`.`,`__`)}`;u[r]=P`${n()}`.as(r)}}let g=e.primaryCube.sql(n),_=[];g.where&&_.push(g.where);let v=n.db.select(u).from(g.from);if(g.joins)for(let e of g.joins)v=this.applyJoinByType(v,e.type??`left`,e.table,e.on);for(let t of e.joinCubes){if(t.junctionTable&&(v=this.applyJoinByType(v,t.junctionTable.joinType??`left`,t.junctionTable.table,t.junctionTable.joinCondition),t.junctionTable.securitySql)){let e=t.junctionTable.securitySql(n.securityContext);Array.isArray(e)?_.push(...e):_.push(e)}let e=t.cube.sql(n);v=this.applyJoinByType(v,t.joinType??`left`,e.from,t.joinCondition),e.where&&_.push(e.where)}_.push(...r.queryBuilder.buildWhereConditions(a,t,n)),_.length>0&&(v=v.where(_.length===1?_[0]:R(..._))),d.length>0&&(v=v.groupBy(...d));let y=n.db.$with(c).as(v),b=o.sql(n),x={},S=[];for(let e of s){let t=o.dimensions?.[e];if(!t)return null;let r=K(t.sql,n);x[e]=P`${r}`.as(e),S.push(r)}let C=new Set;for(let e of h){let[,t]=e.split(`.`);o.measures?.[t]?.type===`avg`&&C.add(t)}let w=h.filter(e=>{let[,t]=e.split(`.`);return!C.has(t)});if(w.length>0){let e=r.queryBuilder.buildResolvedMeasures(w,new Map([[o.name,o]]),n);for(let t of w){let[,n]=t.split(`.`),r=e.get(t);if(!r||typeof r!=`function`)return null;x[n]=P`${r()}`.as(n)}}for(let e of h){let[,t]=e.split(`.`);if(!C.has(t))continue;let r=o.measures?.[t];if(!r?.sql)return null;let i=K(r.sql,n),a=`__avg_sum__${t}`,s=`__avg_count__${t}`;x[a]=P`sum(${i})`.as(a),x[s]=P`count(${i})`.as(s)}let T=n.db.select(x).from(b.from),E=[];b.where&&E.push(b.where),E.push(...r.queryBuilder.buildWhereConditions(o,t,n)),E.length>0&&(T=T.where(E.length===1?E[0]:R(...E))),S.length>0&&(T=T.groupBy(...S));let ee=n.db.$with(l).as(T),D={};for(let e of t.dimensions??[])D[e]=P`${P.identifier(c)}.${P.identifier(e)}`.as(e);for(let e of t.timeDimensions??[])D[e.dimension]=P`${P.identifier(c)}.${P.identifier(e.dimension)}`.as(e.dimension);for(let e of h){let[,t]=e.split(`.`),n=o.measures?.[t];D[e]=this.buildKeysOuterAggregation(n?.type??`sum`,l,t,e)}for(let e of p){let[t,n]=e.split(`.`),r=a.get(t)?.measures?.[n],i=`__reg__${e.replace(`.`,`__`)}`;D[e]=this.buildKeysOuterAggregation(r?.type??`sum`,c,i,e)}let O=n.db.with(y,ee).select(D).from(P`${P.identifier(c)}`),k=f.map((e,t)=>L(P`${P.identifier(c)}.${P.identifier(e)}`,P`${P.identifier(l)}.${P.identifier(s[t])}`)),te=k.length===1?k[0]:R(...k);O=O.leftJoin(P`${P.identifier(l)}`,te);let ne=[...(t.dimensions??[]).map(e=>P`${P.identifier(c)}.${P.identifier(e)}`),...(t.timeDimensions??[]).map(e=>P`${P.identifier(c)}.${P.identifier(e.dimension)}`)];ne.length>0&&(O=O.groupBy(...ne));let A=r.queryBuilder.buildOrderBy(t,Object.keys(D));return A.length>0&&(O=O.orderBy(...A)),O=r.queryBuilder.applyLimitAndOffset(O,t),O}tryBuildMultiFactMergeQuery(e,t,n,r){let i=e.multiFactMerge;if(!i||i.groups.length<2)return null;let a=[...t.dimensions??[],...(t.timeDimensions??[]).map(e=>e.dimension)],o=Array.from(new Set(a)),s=o.length>0&&i.mergeStrategy===`fullJoin`&&!this.supportsFullOuterJoin(),c=this.selectRuntimeMergeStrategy(i.mergeStrategy,o.length>0),l=i.groups.map(e=>{let t=this.build(e.queryPlan,e.query,n);return n.db.$with(e.alias).as(t)});if(s)return this.buildMultiFactUnionKeysFallbackQuery(t,n,r,i,l,o);let u=i.groups[0].alias,d=i.groups.map(e=>e.alias),f={};if(o.length>0)for(let e of o)f[e]=P`${this.coalesceQualifiedColumn(d,e)}`.as(e);for(let e of i.groups)for(let t of e.measures)f[t]=P`coalesce(${P`${P.identifier(e.alias)}.${P.identifier(t)}`}, 0)`.as(t);let p=n.db.with(...l).select(f).from(P`${P.identifier(u)}`),m=new Map;for(let e of o)m.set(e,P`${P.identifier(u)}.${P.identifier(e)}`);for(let e=1;e<i.groups.length;e++){let t=i.groups[e].alias,n;if(o.length===0)n=P`1 = 1`;else{let e=o.map(e=>L(m.get(e),P`${P.identifier(t)}.${P.identifier(e)}`));n=e.length===1?e[0]:R(...e)}if(p=this.applyJoinByType(p,c,P`${P.identifier(t)}`,n),o.length>0&&c===`full`)for(let e of o)m.set(e,P`coalesce(${m.get(e)}, ${P`${P.identifier(t)}.${P.identifier(e)}`})`)}let h=r.queryBuilder.buildOrderBy(t,Object.keys(f));return h.length>0&&(p=p.orderBy(...h)),r.queryBuilder.applyLimitAndOffset(p,t)}buildMultiFactUnionKeysFallbackQuery(e,t,n,r,i,a){let o=`mf_all_keys`,s=r.groups.map(e=>P`select ${this.buildSharedKeySelection(e.alias,a)} from ${P.identifier(e.alias)}`),c=P`${P.join(s,P` union `)}`,l=t.db.$with(o).as(c),u={};for(let e of a)u[e]=P`${P.identifier(o)}.${P.identifier(e)}`.as(e);for(let e of r.groups)for(let t of e.measures)u[t]=P`coalesce(${P`${P.identifier(e.alias)}.${P.identifier(t)}`}, 0)`.as(t);let d=t.db.with(...i,l).select(u).from(P`${P.identifier(o)}`);for(let e of r.groups){let t=a.map(t=>L(P`${P.identifier(o)}.${P.identifier(t)}`,P`${P.identifier(e.alias)}.${P.identifier(t)}`)),n=t.length===1?t[0]:R(...t);d=d.leftJoin(P`${P.identifier(e.alias)}`,n)}let f=n.queryBuilder.buildOrderBy(e,Object.keys(u));return f.length>0&&(d=d.orderBy(...f)),n.queryBuilder.applyLimitAndOffset(d,e)}buildSharedKeySelection(e,t){let n=t.map(t=>P`${P.identifier(e)}.${P.identifier(t)} as ${P.identifier(t)}`);return P.join(n,P`, `)}selectRuntimeMergeStrategy(e,t){return!t||e===`innerJoin`?`inner`:e===`leftJoin`?`left`:this.supportsFullOuterJoin()?`full`:`left`}supportsFullOuterJoin(){let e=this.databaseAdapter.getEngineType();return e===`postgres`||e===`duckdb`}coalesceQualifiedColumn(e,t){if(e.length===1)return P`${P.identifier(e[0])}.${P.identifier(t)}`;let n=e.map(e=>P`${P.identifier(e)}.${P.identifier(t)}`),r=n[0];for(let e=1;e<n.length;e++)r=P`coalesce(${r}, ${n[e]})`;return r}canExecuteKeysDeduplication(e,t,n){if(!e.measures?.length)return!1;for(let r of e.measures){let[e,i]=r.split(`.`);if(e!==n)continue;let a=t.measures?.[i];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!this.queryContainsMeasureFilter(e,t,n)}queryContainsMeasureFilter(e,t,n){let r=e=>{if(!e)return!1;for(let i of e){if(`and`in i){if(r(i.and))return!0;continue}if(`or`in i){if(r(i.or))return!0;continue}if(`member`in i){let[e,r]=i.member.split(`.`);if(e===n&&t.measures?.[r])return!0}}return!1};return r(e.filters)}getPrimaryKeyDimensions(e){return Object.entries(e.dimensions??{}).filter(([,e])=>!!e.primaryKey).map(([e])=>e)}buildKeysOuterAggregation(e,t,n,r){switch(e){case`min`:return P`min(${P`${P.identifier(t)}.${P.identifier(n)}`})`.as(r);case`max`:return P`max(${P`${P.identifier(t)}.${P.identifier(n)}`})`.as(r);case`avg`:return P`sum(${P`${P.identifier(t)}.${P.identifier(`__avg_sum__${n}`)}`}) / nullif(sum(${P`${P.identifier(t)}.${P.identifier(`__avg_count__${n}`)}`}), 0)`.as(r);default:return P`coalesce(sum(${P`${P.identifier(t)}.${P.identifier(n)}`}), 0)`.as(r)}}applyJoinByType(e,t,n,r){switch(t){case`inner`:return e.innerJoin(n,r);case`right`:return e.rightJoin(n,r);case`full`:return e.fullJoin(n,r);default:return e.leftJoin(n,r)}}};function Q(e,t){if(process.env.DC_DEBUG)try{let{sql:n,params:r}=t.toSQL();console.log(`\n[DC_DEBUG] ${e}`),console.log(n),r.length>0&&console.log(`params:`,r),console.log()}catch{}}var fn=class{queryBuilder;drizzlePlanBuilder;databaseAdapter;comparisonQueryBuilder;funnelQueryBuilder;flowQueryBuilder;retentionQueryBuilder;cacheConfig;logicalPlanBuilder;planOptimiser;rlsSetup;constructor(e,t,n){if(this.dbExecutor=e,this.databaseAdapter=e.databaseAdapter,!this.databaseAdapter)throw Error(`DatabaseExecutor must have a databaseAdapter property`);this.queryBuilder=new Nt(this.databaseAdapter);let r=new Ft,i=new It(this.queryBuilder);this.drizzlePlanBuilder=new dn(this.queryBuilder,i,this.databaseAdapter),this.comparisonQueryBuilder=new Gt(this.databaseAdapter),this.funnelQueryBuilder=new Kt(this.databaseAdapter),this.flowQueryBuilder=new qt(this.databaseAdapter),this.retentionQueryBuilder=new Qt(this.databaseAdapter),this.logicalPlanBuilder=new $t(r),this.planOptimiser=new en,this.cacheConfig=t,this.rlsSetup=n}async withRLSContext(e,t){if(!this.rlsSetup)return t();let n=this.dbExecutor.db;if(!n.transaction)throw Error(`rlsSetup requires a database driver that supports transactions (db.transaction)`);let r=this.rlsSetup;return n.transaction(async n=>{await r(n,e);let i=Object.create(this.dbExecutor);return i.db=n,this.dbExecutor=i,t()})}async execute(e,t,n,r){try{let i=this.resolveQueryMode(t);this.validateQueryForMode(i,e,t);let a;if(this.cacheConfig?.enabled!==!1&&this.cacheConfig?.provider)if(a=yt(t,n,this.cacheConfig),r?.skipCache)this.cacheConfig.onCacheEvent?.({type:`miss`,key:a,durationMs:0});else try{let e=Date.now(),t=await this.cacheConfig.provider.get(a);if(t)return this.cacheConfig.onCacheEvent?.({type:`hit`,key:a,durationMs:Date.now()-e}),{...t.value,cache:t.metadata?{hit:!0,cachedAt:new Date(t.metadata.cachedAt).toISOString(),ttlMs:t.metadata.ttlMs,ttlRemainingMs:t.metadata.ttlRemainingMs}:{hit:!0,cachedAt:new Date().toISOString(),ttlMs:0,ttlRemainingMs:0}};this.cacheConfig.onCacheEvent?.({type:`miss`,key:a,durationMs:Date.now()-e})}catch(e){this.cacheConfig.onError?.(e,`get`)}return await this.withRLSContext(n,()=>this.executeQueryByModeWithCache(i,e,t,n,a))}catch(e){if(e instanceof Error){let t=e;for(;t.cause instanceof Error;)t=t.cause;let n=t.message,r=t;throw r.code&&(n+=` [${r.code}]`),r.detail&&(n+=` Detail: ${r.detail}`),r.hint&&(n+=` Hint: ${r.hint}`),e.message=`Query execution failed: ${n}`,e}throw Error(`Query execution failed: Unknown error`,{cause:e})}}buildLogicalPlan(e,t,n){let r=new q,i=this.createQueryContext(n,r);return this.preloadFilterCache(t,r,e,i),this.buildRegularQueryArtifacts(e,t,i).optimisedPlan}analyzeQuery(e,t,n){let r=new q,i=this.createQueryContext(n,r);return this.preloadFilterCache(t,r,e,i),this.buildRegularQueryArtifacts(e,t,i).analysis}async executeQuery(e,t,n){let r=new Map;return r.set(e.name,e),this.execute(r,t,n)}async executeComparisonQueryWithCache(e,t,n,r){let i=await this.executeComparisonQuery(e,t,n);return await this.cacheResult(r,i),i}async executeComparisonQuery(e,t,n){let{timeDimension:r,periods:i,granularity:a,periodQueries:o}=this.buildComparisonExecutionPlan(t),s=o.map(async(t,r)=>({result:await this.executeStandardQuery(e,t,n),period:i[r]})),c=await Promise.all(s),l=this.comparisonQueryBuilder.mergeComparisonResults(c,r,a);return l.data=this.comparisonQueryBuilder.sortComparisonResults(l.data,r.dimension),l}buildComparisonExecutionPlan(e){let t=this.comparisonQueryBuilder.getComparisonTimeDimension(e);if(!t||!t.compareDateRange)throw Error(`No compareDateRange found in query`);let n=this.comparisonQueryBuilder.normalizePeriods(t.compareDateRange);if(n.length<2)throw Error(`compareDateRange requires at least 2 periods`);let r=n.map(t=>this.comparisonQueryBuilder.createPeriodQuery(e,t));return{timeDimension:t,granularity:t.granularity||`day`,periods:n,periodQueries:r}}async executeFunnelQueryWithCache(e,t,n,r){let i=await this.executeFunnelQuery(e,t,n);return await this.cacheResult(r,i),{...i,cache:{hit:!1}}}async executeFunnelQuery(e,t,n){let r=t.funnel,i=this.funnelQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Funnel validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.funnelQueryBuilder.buildFunnelQuery(r,e,a);Q(`funnel query`,o);let s=await o,c=this.funnelQueryBuilder.transformResult(s,r),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.funnel={config:r,steps:r.steps.map((e,t)=>({name:e.name,index:t,timeToConvert:e.timeToConvert}))},{data:c,annotation:l}}async executeFlowQueryWithCache(e,t,n,r){let i=await this.executeFlowQuery(e,t,n);return await this.cacheResult(r,i),{...i,cache:{hit:!1}}}async executeFlowQuery(e,t,n){let r=t.flow,i=this.flowQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Flow validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.flowQueryBuilder.buildFlowQuery(r,e,a);Q(`flow query`,o);let s=await o,c=this.flowQueryBuilder.transformResult(s),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.flow={config:r,startingStep:{name:r.startingStep.name},stepsBefore:r.stepsBefore,stepsAfter:r.stepsAfter},{data:[c],annotation:l}}async executeRetentionQueryWithCache(e,t,n,r){let i=await this.executeRetentionQuery(e,t,n);return await this.cacheResult(r,i),{...i,cache:{hit:!1}}}async executeRetentionQuery(e,t,n){let r=t.retention,i=this.retentionQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Retention validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.retentionQueryBuilder.buildRetentionQuery(r,e,a);Q(`retention query`,o);let s=await o,c=this.retentionQueryBuilder.transformResult(s,r),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.retention={config:r,granularity:r.granularity,periods:r.periods,retentionType:r.retentionType,breakdownDimensions:r.breakdownDimensions},{data:c,annotation:l}}async executeStandardQuery(e,t,n){let r=new q,i=this.createQueryContext(n,r);this.preloadFilterCache(t,r,e,i);let{optimisedPlan:a}=this.buildRegularQueryArtifacts(e,t,i),o=this.drizzlePlanBuilder.derivePhysicalPlanContext(a),s=this.drizzlePlanBuilder.build(o,t,i);Q(`query`,s);let c=this.queryBuilder.collectNumericFields(e,t),l=await this.dbExecutor.execute(s,c);return{data:Wt(Array.isArray(l)?l.map(e=>{let n={...e};if(t.timeDimensions){for(let e of t.timeDimensions)if(e.dimension in n){let t=n[e.dimension];if(typeof t==`string`&&t.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)){let e=t.replace(` `,`T`),n=!e.endsWith(`Z`)&&!e.includes(`+`)?e+`Z`:e;t=new Date(n)}t=this.databaseAdapter.convertTimeDimensionResult(t),n[e.dimension]=t}}return n}):[l],t,t.measures||[]),annotation:this.generateAnnotations(o,t)}}createQueryContext(e,t){return{db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:e,filterCache:t}}getOptimiserEngineType(){let e=this.dbExecutor.getEngineType?.();return e===`singlestore`?`mysql`:e??`postgres`}buildRegularQueryArtifacts(e,t,n){let r=this.logicalPlanBuilder.planWithAnalysis(e,t,n),i=this.planOptimiser.optimise(r.plan,{engineType:this.getOptimiserEngineType()});return{logicalPlan:r.plan,analysis:r.analysis,optimisedPlan:i}}validateSecurityContext(e,t){let n=typeof process<`u`?process.env.NODE_ENV:void 0,r=typeof process<`u`?process.env?.DRIZZLE_CUBE_WARN_SECURITY:void 0;if(n!==`development`&&!r)return;let i=[e.primaryCube];for(let t of e.joinCubes||[])i.push(t.cube);for(let t of e.preAggregationCTEs||[])i.push(t.cube);let a=new Set;for(let e of i)if(!a.has(e.name)){a.add(e.name);try{if(e.public||this.rlsSetup)continue;e.sql(t).where||console.warn(`[drizzle-cube] WARNING: Cube '${e.name}' has no security filtering. If this cube contains public data, add 'public: true' to suppress this warning. Otherwise, ensure sql() returns: { from: table, where: eq(table.orgId, ctx.securityContext.orgId) }. For databases that support Row Level Security (e.g. PostgreSQL), you can configure rlsSetup to run session-level commands (SET LOCAL, SET ROLE) instead.`)}catch{}}}async generateSQL(e,t,n){let r=new Map;return r.set(e.name,e),this.generateUnifiedSQL(r,t,n)}async generateMultiCubeSQL(e,t,n){return this.generateUnifiedSQL(e,t,n)}async dryRunFunnel(e,t,n){if(!this.funnelQueryBuilder.hasFunnel(t))throw Error(`Query does not contain a valid funnel configuration`);let r=t.funnel,i=this.funnelQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Funnel validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.funnelQueryBuilder.buildFunnelQuery(r,e,a).toSQL();return{sql:o.sql,params:o.params}}async dryRunFlow(e,t,n){if(!this.flowQueryBuilder.hasFlow(t))throw Error(`Query does not contain a valid flow configuration`);let r=t.flow,i=this.flowQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Flow validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.flowQueryBuilder.buildFlowQuery(r,e,a).toSQL();return{sql:o.sql,params:o.params}}async dryRunRetention(e,t,n){if(!this.retentionQueryBuilder.hasRetention(t))throw Error(`Query does not contain a valid retention configuration`);let r=t.retention,i=this.retentionQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Retention validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.retentionQueryBuilder.buildRetentionQuery(r,e,a).toSQL();return{sql:o.sql,params:o.params}}async explainQuery(e,t,n,r){let i=await this.dryRunSQL(e,t,n);return this.withRLSContext(n,()=>this.dbExecutor.explainQuery(i.sql,i.params||[],r))}async dryRunSQL(e,t,n){let r=this.resolveQueryMode(t);return this.validateQueryForMode(r,e,t),this.generateSqlForMode(r,e,t,n)}async generateUnifiedSQL(e,t,n){let r=new q,i=this.createQueryContext(n,r);this.preloadFilterCache(t,r,e,i);let{optimisedPlan:a}=this.buildRegularQueryArtifacts(e,t,i),o=this.drizzlePlanBuilder.derivePhysicalPlanContext(a),s=this.drizzlePlanBuilder.build(o,t,i).toSQL();return{sql:s.sql,params:s.params}}resolveQueryMode(e){let t=[];if(this.comparisonQueryBuilder.hasComparison(e)&&t.push(`comparison`),this.funnelQueryBuilder.hasFunnel(e)&&t.push(`funnel`),this.flowQueryBuilder.hasFlow(e)&&t.push(`flow`),this.retentionQueryBuilder.hasRetention(e)&&t.push(`retention`),t.length===0)return`regular`;if(t.length>1)throw Error(`Query contains multiple query modes: ${t.join(`, `)}`);return t[0]}validateQueryForMode(e,t,n){let r=()=>{let e=hn(t,n);if(!e.isValid)throw Error(`Query validation failed: ${e.errors.join(`, `)}`)};({regular:r,comparison:r,funnel:()=>{let e=this.funnelQueryBuilder.validateConfig(n.funnel,t);if(!e.isValid)throw Error(`Funnel validation failed: ${e.errors.join(`, `)}`)},flow:()=>{let e=this.flowQueryBuilder.validateConfig(n.flow,t);if(!e.isValid)throw Error(`Flow validation failed: ${e.errors.join(`, `)}`)},retention:()=>{let e=this.retentionQueryBuilder.validateConfig(n.retention,t);if(!e.isValid)throw Error(`Retention validation failed: ${e.errors.join(`, `)}`)}})[mt(e)]()}async executeQueryByModeWithCache(e,t,n,r,i){return{regular:()=>this.executeRegularQueryWithCache(t,n,r,i),comparison:()=>this.executeComparisonQueryWithCache(t,n,r,i),funnel:()=>this.executeFunnelQueryWithCache(t,n,r,i),flow:()=>this.executeFlowQueryWithCache(t,n,r,i),retention:()=>this.executeRetentionQueryWithCache(t,n,r,i)}[mt(e)]()}async executeRegularQueryWithCache(e,t,n,r){let i=new q,a=this.createQueryContext(n,i);this.preloadFilterCache(t,i,e,a);let{optimisedPlan:o}=this.buildRegularQueryArtifacts(e,t,a),s=this.drizzlePlanBuilder.derivePhysicalPlanContext(o);this.validateSecurityContext(s,a);let c=this.drizzlePlanBuilder.build(s,t,a);Q(`query`,c);let l=this.queryBuilder.collectNumericFields(e,t),u=await this.dbExecutor.execute(c,l),d={data:Wt(Array.isArray(u)?u.map(e=>{let n={...e};if(t.timeDimensions){for(let e of t.timeDimensions)if(e.dimension in n){let t=n[e.dimension];if(typeof t==`string`&&t.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)){let e=t.replace(` `,`T`),n=!e.endsWith(`Z`)&&!e.includes(`+`)?e+`Z`:e;t=new Date(n)}t=this.databaseAdapter.convertTimeDimensionResult(t),n[e.dimension]=t}}return n}):[u],t,t.measures||[]),annotation:this.generateAnnotations(s,t),warnings:o.warnings?.length?o.warnings:void 0};return await this.cacheResult(r,d),d}async cacheResult(e,t){if(!(!e||!this.cacheConfig?.provider))try{let n=Date.now();await this.cacheConfig.provider.set(e,t,this.cacheConfig.defaultTtlMs??3e5),this.cacheConfig.onCacheEvent?.({type:`set`,key:e,durationMs:Date.now()-n})}catch(e){this.cacheConfig.onError?.(e,`set`)}}async generateSqlForMode(e,t,n,r){return{regular:()=>this.generateUnifiedSQL(t,n,r),comparison:()=>this.generateComparisonSQL(t,n,r),funnel:()=>this.dryRunFunnel(t,n,r),flow:()=>this.dryRunFlow(t,n,r),retention:()=>this.dryRunRetention(t,n,r)}[mt(e)]()}async generateComparisonSQL(e,t,n){let r=this.buildComparisonExecutionPlan(t).periodQueries[0];return this.generateUnifiedSQL(e,r,n)}generateAnnotations(e,t){let n={},r={},i={},a=[e.primaryCube].filter(Boolean);if(e.joinCubes&&e.joinCubes.length>0&&a.push(...e.joinCubes.map(e=>e.cube).filter(Boolean)),e.multiFactMerge?.groups?.length)for(let t of e.multiFactMerge.groups)t.queryPlan.primaryCube&&a.push(t.queryPlan.primaryCube),t.queryPlan.joinCubes?.length&&a.push(...t.queryPlan.joinCubes.map(e=>e.cube).filter(Boolean));if(t.measures)for(let e of t.measures){let[t,r]=e.split(`.`),i=a.find(e=>e?.name===t);if(i&&i.measures[r]){let t=i.measures[r];n[e]={title:t.title||r,shortTitle:t.title||r,type:t.type}}}if(t.dimensions)for(let e of t.dimensions){let[t,n]=e.split(`.`),i=a.find(e=>e?.name===t);if(i&&i.dimensions?.[n]){let t=i.dimensions[n];r[e]={title:t.title||n,shortTitle:t.title||n,type:t.type}}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,n]=e.dimension.split(`.`),r=a.find(e=>e?.name===t);if(r&&r.dimensions?.[n]){let t=r.dimensions[n];i[e.dimension]={title:t.title||n,shortTitle:t.title||n,type:t.type,granularity:e.granularity}}}return{measures:n,dimensions:r,segments:{},timeDimensions:i}}preloadFilterCache(e,t,n,r){if(e.filters&&e.filters.length>0){let i=vt(e.filters);for(let e of i){let i=gt(e);if(t.has(i))continue;let[a,o]=e.member.split(`.`),s=n.get(a);if(!s)continue;let c=s.dimensions?.[o];if(!c||[`arrayContains`,`arrayOverlaps`,`arrayContained`].includes(e.operator))continue;let l=c.type===`time`?K(c.sql,r):typeof c.sql==`function`?c.sql(r):c.sql,u=this.queryBuilder.buildFilterConditionPublic(l,e.operator,e.values,c,e.dateRange);u&&t.set(i,u)}}if(e.timeDimensions){for(let i of e.timeDimensions)if(i.dateRange){let e=_t(i.dimension,i.dateRange);if(t.has(e))continue;let[a,o]=i.dimension.split(`.`),s=n.get(a);if(!s)continue;let c=s.dimensions?.[o];if(!c)continue;let l=K(c.sql,r),u=this.queryBuilder.buildDateRangeCondition(l,i.dateRange);u&&t.set(e,u)}}}},pn=class t{cubes=new Map;metadataCache;cacheConfig;rlsSetup;db;schema;engineType;constructor(e){e?.databaseExecutor?(this.db=e.databaseExecutor.db,this.schema=e.databaseExecutor.schema,this.engineType=e.databaseExecutor.getEngineType()):e?.drizzle&&(this.db=e.drizzle,this.schema=e.schema,this.engineType=e.engineType),this.cacheConfig=e?.cache,this.rlsSetup=e?.rlsSetup}setDatabaseExecutor(e){this.db=e.db,this.schema=e.schema,this.engineType=e.getEngineType()}getEngineType(){return this.engineType}setDrizzle(e,t,n){this.db=e,this.schema=t,this.engineType=n}hasExecutor(){return!!this.db}createDbExecutor(){if(!this.db)throw Error(`Database executor not configured`);return ut(this.db,this.schema,this.engineType)}createQueryExecutor(e=!1){return new fn(this.createDbExecutor(),e?this.cacheConfig:void 0,this.rlsSetup)}formatSqlResult(t){let n=this.getEngineType()??`postgres`;return{sql:e.s(t.sql,n),params:t.params}}registerCube(e){this.validateCalculatedMeasures(e),new X(this.cubes).populateDependencies(e),this.cubes.set(e.name,e),this.invalidateMetadataCache()}validateCubeReferences(){let e=[];for(let[t,n]of this.cubes)if(n.joins)for(let[r,i]of Object.entries(n.joins))typeof i.targetCube==`string`&&!this.cubes.has(i.targetCube)&&e.push(`${t}.joins.${r}: target cube '${i.targetCube}' is not registered`);if(e.length>0)throw Error(`Unresolved cube references:\n${e.map(e=>` - ${e}`).join(`
196
+ )`,o=this.databaseAdapter.buildPeriodSeriesSubquery(e.periods),s={period_number:P`p.period_number`.as(`period_number`),retained_users:P`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as(`retained_users`)},c=[P`p.period_number`];for(let e=0;e<n;e++)s[`breakdown_${e}`]=P.raw(`ump.breakdown_${e}`).as(`breakdown_${e}`),c.push(P.raw(`ump.breakdown_${e}`));return t.db.select(s).from(P`${a} ump`).innerJoin(o,P`TRUE`).groupBy(...c)}buildPeriodNumberExpression(e,t,n){return this.databaseAdapter.buildDateDiffPeriods(e,t,n)}extractDimensionName(e){let t=e.split(`.`);return t.length>1?t[1]:t[0]}},$t=class{constructor(e){this.queryPlanner=e}plan(e,t,n){return this.planWithAnalysis(e,t,n).plan}planWithAnalysis(e,t,n){let r=Array.from(this.queryPlanner.analyzeCubeUsage(t));if(r.length===0)throw Error(`No cubes found in query`);let i=this.queryPlanner.analyzePrimaryCube(r,t,e),a=i.selectedCube,o=e.get(a);if(!o)throw Error(`Primary cube '${a}' not found`);let s=r.filter(e=>e!==a).map(n=>this.queryPlanner.analyzeJoinPathForTarget(e,a,n,t)),c=r.length>1?this.queryPlanner.buildJoinPlanForPrimary(e,o,r,n,t):[],l=r.length>1?this.queryPlanner.buildPreAggregationCTEs(e,o,c,t,n)??[]:[],u=this.queryPlanner.buildWarnings(t,l),d=this.buildSourceFromPhases(o,c,l,e,t,n),f=d.source,p=this.buildQueryNode(f,t,e,u),m=this.buildPreAggregationAnalysis(l),h=new Map;for(let t of r){let n=e.get(t);n&&h.set(t,n)}let g=Z.hasPostAggregationWindows(t.measures??[],h),_=[...s.filter(e=>!e.pathFound&&e.error).map(e=>e.error),...u.map(e=>e.message)];return{plan:p,analysis:{timestamp:new Date().toISOString(),cubeCount:r.length,cubesInvolved:[...r].sort(),primaryCube:i,joinPaths:s,preAggregations:m,querySummary:{queryType:l.length>0?`multi_cube_cte`:r.length>1?`multi_cube_join`:`single_cube`,measureStrategy:d.strategy,joinCount:c.length,cteCount:l.length,hasPreAggregation:l.length>0,hasWindowFunctions:g},warnings:_.length>0?_:void 0,planningTrace:{steps:[{phase:`cube_usage`,decision:`Identified ${r.length} cube${r.length===1?``:`s`} from query members`,details:{cubesInvolved:[...r].sort()}},{phase:`primary_cube_selection`,decision:`Selected '${i.selectedCube}' as primary cube (${i.reason})`,details:{selectedCube:i.selectedCube,reason:i.reason,candidates:i.candidates?.map(e=>e.cubeName)}},{phase:`join_planning`,decision:`Planned ${c.length} join${c.length===1?``:`s`}`,details:{joinCount:c.length,joinTargets:c.map(e=>e.cube.name),pathSelection:s.map(e=>({targetCube:e.targetCube,strategy:e.selection?.strategy,selectedRank:e.selection?.selectedRank,selectedScore:e.selection?.selectedScore}))}},{phase:`cte_planning`,decision:`Planned ${l.length} pre-aggregation CTE${l.length===1?``:`s`}`,details:{cteCount:l.length,cubes:l.map(e=>e.cube.name)}},{phase:`measure_strategy`,decision:`Selected '${d.strategy}' measure strategy`,details:{strategy:d.strategy,regularMeasures:d.classification.regular.map(e=>e.name),multipliedMeasures:d.classification.multiplied.map(e=>e.name),deduplicationSafeMeasures:d.classification.deduplicationSafe.map(e=>e.name),sourceType:f.type}},{phase:`warnings`,decision:u.length>0?`Generated ${u.length} planning warning${u.length===1?``:`s`}`:`No planning warnings generated`,details:{warningCodes:u.map(e=>e.code)}}]}}}}buildSourceFromPhases(e,t,n,r,i,a){let o=this.tryBuildMultiFactMergeSource(i,r,a);if(o)return{source:o,strategy:`multiFactMerge`,classification:{regular:this.buildMeasureRefs(i,r),multiplied:[],deduplicationSafe:[]}};let s=this.buildSimpleSourceFromPhases(e,t,n,r,i),c=this.classifyMeasuresForStrategy(s.schema.measures,n),l=this.selectMeasureStrategy(c,i,r);return l===`keysDeduplication`?{source:this.buildKeysDeduplicationSource(s,c),strategy:l,classification:c}:{source:s,strategy:l,classification:c}}buildSimpleSourceFromPhases(e,t,n,r,i){let a=this.buildMeasureRefs(i,r),o=this.buildDimensionRefs(i,r),s=this.buildTimeDimensionRefs(i,r),c=this.toCubeRef(e),l=t.map(e=>({target:this.toCubeRef(e.cube),alias:e.alias,joinType:e.joinType,joinCondition:e.joinCondition,relationship:e.relationship,junctionTable:e.junctionTable})),u=n.map(e=>{let t=this.toCubeRef(e.cube);return{type:`ctePreAggregate`,schema:this.buildCTESchema(e,r),cube:t,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType??`aggregate`,cteReason:e.cteReason??`hasMany`}});return{type:`simpleSource`,schema:{measures:a,dimensions:o,timeDimensions:s},primaryCube:c,joins:l,ctes:u}}tryBuildMultiFactMergeSource(e,t,n){if(!e.measures||e.measures.length<2)return null;let r=new Set;for(let t of e.measures){let[e]=t.split(`.`);e&&r.add(e)}if(r.size<2)return null;let i=new Set;for(let t of e.dimensions??[]){let[e]=t.split(`.`);e&&i.add(e)}for(let t of e.timeDimensions??[]){let[e]=t.dimension.split(`.`);e&&i.add(e)}if(i.size!==1)return null;let a=Array.from(i)[0];if(r.has(a)||!t.get(a))return null;let o=Array.from(r);if(!o.every(e=>this.hasDirectJoinToSharedDimension(t.get(e),a,t)))return null;let s=this.buildDimensionRefs(e,t),c=this.buildTimeDimensionRefs(e,t),l={measures:this.buildMeasureRefs(e,t),dimensions:s,timeDimensions:c},u=[];for(let r of o){let i=(e.measures??[]).filter(e=>e.startsWith(`${r}.`)),o=new Set([r,a]),s={measures:i,dimensions:e.dimensions,timeDimensions:e.timeDimensions,filters:this.projectFiltersToAllowedCubes(e.filters,o)},c=this.buildGroupQueryNode(s,t,n);if(!c)return null;u.push(c)}return u.length<2?null:{type:`multiFactMerge`,schema:l,groups:u,sharedDimensions:s,mergeStrategy:`fullJoin`}}hasDirectJoinToSharedDimension(e,t,n){if(!e?.joins)return!1;for(let[,r]of Object.entries(e.joins)){let e=G(r.targetCube,n);if(!(!e||e.name!==t)&&(r.relationship===`belongsTo`||r.relationship===`hasOne`))return!0}return!1}buildGroupQueryNode(e,t,n){let r=Array.from(this.queryPlanner.analyzeCubeUsage(e));if(r.length===0)return null;let i=this.queryPlanner.analyzePrimaryCube(r,e,t),a=t.get(i.selectedCube);if(!a)return null;let o=r.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,a,r,n,e):[],s=r.length>1?this.queryPlanner.buildPreAggregationCTEs(t,a,o,e,n)??[]:[],c=this.queryPlanner.buildWarnings(e,s),l=this.buildSourceFromPhases(a,o,s,t,e,n);return this.buildQueryNode(l.source,e,t,c)}projectFiltersToAllowedCubes(e,t){if(!e||e.length===0)return;let n=e.map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length>0?n:void 0}projectFilterNodeToAllowedCubes(e,t){if(`member`in e){let[n]=e.member.split(`.`);return n&&t.has(n)?e:null}if(`and`in e){let n=(e.and??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{and:n}}if(`or`in e){let n=(e.or??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{or:n}}return null}classifyMeasuresForStrategy(e,t){let n={regular:[],multiplied:[],deduplicationSafe:[]},r=new Set(t.filter(e=>e.cteReason===`fanOutPrevention`).map(e=>e.cube.name));for(let t of e){let e=t.cube.cube,i=e.measures?.[t.localName];if(!i||!r.has(e.name)){n.regular.push(t);continue}this.isDeduplicationSafeMeasure(i)?n.deduplicationSafe.push(t):n.multiplied.push(t)}return n}selectMeasureStrategy(e,t,n){return e.multiplied.length===0?`simple`:e.multiplied.every(e=>this.getPrimaryKeyColumns(e.cube.cube).length>0)&&this.isKeysDeduplicationExecutionSupported(e,t,n)?`keysDeduplication`:`ctePreAggregateFallback`}isKeysDeduplicationExecutionSupported(e,t,n){let r=new Set(e.multiplied.map(e=>e.cube.name));if(r.size!==1)return!1;let i=Array.from(r)[0],a=t.measures??[];if(a.length===0)return!1;let o=n.get(i);if(!o)return!1;for(let e of a){let[t,r]=e.split(`.`);if(t!==i){let e=n.get(t)?.measures?.[r];if(!e||![`sum`,`count`,`number`,`min`,`max`].includes(e.type))return!1;continue}let a=o.measures?.[r];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!this.queryHasMeasureFilter(t,i,o)}queryHasMeasureFilter(e,t,n){let r=e=>{let[r,i]=e.split(`.`);return r===t&&!!n.measures?.[i]},i=e=>{if(!e)return!1;for(let t of e){if(`and`in t){if(i(t.and))return!0;continue}if(`or`in t){if(i(t.or))return!0;continue}if(`member`in t&&r(t.member))return!0}return!1};return i(e.filters)}buildKeysDeduplicationSource(e,t){let n=this.deduplicateColumnRefs(t.multiplied.flatMap(e=>this.getPrimaryKeyColumns(e.cube.cube))),r=t.regular.length>0?t.regular.map(e=>e.name):void 0;return{type:`keysDeduplication`,schema:e.schema,keysSource:e,measureSource:e,joinOn:n,regularMeasures:r}}isDeduplicationSafeMeasure(e){return e.type===`countDistinct`||e.type===`countDistinctApprox`}getPrimaryKeyColumns(e){let t=[];for(let[n,r]of Object.entries(e.dimensions??{}))!r.primaryKey||typeof r.sql==`function`||t.push({column:r.sql,alias:`${e.name}.${n}`});return t}deduplicateColumnRefs(e){let t=new Map;for(let n of e){let e=n.alias??String(n.column?.name??``);t.has(e)||t.set(e,n)}return Array.from(t.values())}buildQueryNode(e,t,n,r){let i=this.buildMeasureRefs(t,n),a=this.buildDimensionRefs(t,n),o=this.buildTimeDimensionRefs(t,n),s=this.buildOrderByRefs(t),c=t.filters??[];return{type:`query`,schema:{measures:i,dimensions:a,timeDimensions:o},source:e,dimensions:a,measures:i,filters:c,timeDimensions:o,orderBy:s,limit:t.limit,offset:t.offset,warnings:r}}buildPreAggregationAnalysis(e){return e.map(e=>({cubeName:e.cube.name,cteAlias:e.cteAlias,reason:e.cteReason===`fanOutPrevention`?`Potential fan-out from hasMany joins - pre-aggregate ${e.cube.name} to preserve correctness`:`hasMany relationship requires pre-aggregation for ${e.cube.name}`,reasonType:e.cteReason,measures:e.measures,joinKeys:e.joinKeys.map(e=>({sourceColumn:e.sourceColumn,targetColumn:e.targetColumn})),cteType:e.cteType}))}buildMeasureRefs(e,t){return e.measures?e.measures.map(e=>{let[n,r]=e.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for measure '${e}'`);return{name:e,cube:this.toCubeRef(i),localName:r}}):[]}buildDimensionRefs(e,t){return e.dimensions?e.dimensions.map(e=>{let[n,r]=e.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for dimension '${e}'`);return{name:e,cube:this.toCubeRef(i),localName:r}}):[]}buildTimeDimensionRefs(e,t){return e.timeDimensions?e.timeDimensions.map(e=>{let[n,r]=e.dimension.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for time dimension '${e.dimension}'`);return{name:e.dimension,cube:this.toCubeRef(i),localName:r,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange}}):[]}buildOrderByRefs(e){return e.order?Object.entries(e.order).map(([e,t])=>({name:e,direction:t})):[]}toCubeRef(e){return{name:e.name,cube:e}}buildCTESchema(e,t){return{measures:e.measures.map(e=>{let[n,r]=e.split(`.`);return{name:e,cube:{name:n,cube:t.get(n)},localName:r}}),dimensions:[],timeDimensions:[]}}},en=class{name=`identity`;optimise(e){return e}};function tn(e,t,n,r){let i=new Map;if(e.preAggregationCTEs&&e.preAggregationCTEs.length>0){for(let t of e.preAggregationCTEs)if(t.propagatingFilters&&t.propagatingFilters.length>0)for(let e of t.propagatingFilters){let t=e.sourceCube.name;if(!i.has(t)){let a={filters:e.filters},o=new Map([[t,e.sourceCube]]),s=r.queryBuilder.buildWhereConditions(o,a,n);i.set(t,s)}let a=i.get(t);a&&a.length>0&&(e.preBuiltFilterSQL=a.length===1?a[0]:R(...a))}}let a=[],o=new Map,s=new Map;if(e.preAggregationCTEs&&e.preAggregationCTEs.length>0)for(let c of e.preAggregationCTEs){let l=r.cteBuilder.buildPreAggregationCTE(c,t,n,e,i);if(l&&(a.push(l),o.set(c.cube.name,c.cteAlias),c.downstreamJoinKeys))for(let e of c.downstreamJoinKeys)s.set(e.targetCubeName,{cteAlias:c.cteAlias,joinKeys:e.joinKeys})}return{preBuiltFilterMap:i,ctes:a,cteAliasMap:o,downstreamCubeMap:s}}function nn(e,t,n,r,i,a){if(n.measures)for(let o of n.measures){let[s,c]=o.split(`.`),l=i.get(s);if(!l?.measures?.[c])continue;let u=l.measures[c];if(!Z.isPostAggregationWindow(u))continue;let d=Z.getWindowBaseMeasure(u,s);if(!d)continue;let[f,p]=d.split(`.`),m=i.get(f);if(!m?.measures?.[p])continue;let h=m.measures[p],g=t.preAggregationCTEs?.find(e=>e.cube?.name===f&&e.measures?.includes(d)),_;_=g?P`sum(${P`${P.identifier(g.cteAlias)}.${P.identifier(p)}`})`:a.queryBuilder.buildMeasureExpression(h,r,m),e[d]||(e[d]=P`${_}`.as(d));let v=rn(u,_,n,r,l,t,a);v&&(e[o]=P`${v}`.as(o))}}function rn(e,t,n,r,i,a,o){let s=e.windowConfig||{},c=(e,t)=>{if(!a.preAggregationCTEs)return null;let n=a.preAggregationCTEs.find(t=>t.cube?.name===e);return n&&n.cteAlias?P`${P.identifier(n.cteAlias)}.${P.identifier(t)}`:null},l;if(s.orderBy&&s.orderBy.length>0)l=s.orderBy.map(e=>{let a=e.field.includes(`.`)?e.field.split(`.`)[1]:e.field;if(n.timeDimensions)for(let t of n.timeDimensions){let[n,s]=t.dimension.split(`.`);if(s===a){let l=c(n,a);if(l)return{field:l,direction:e.direction};let u=i.dimensions?.[s];if(u)return{field:o.queryBuilder.buildTimeDimensionExpression(u.sql,t.granularity,r),direction:e.direction}}}let l=i.dimensions?.[a];return l?{field:K(l.sql,r),direction:e.direction}:a===(s.measure?.includes(`.`)?s.measure.split(`.`)[1]:s.measure)||e.field===s.measure?{field:t,direction:e.direction}:null}).filter(e=>e!==null);else if(n.timeDimensions&&n.timeDimensions.length>0){let e=n.timeDimensions[0],[t,a]=e.dimension.split(`.`),s=c(t,a);if(s)l=[{field:s,direction:`asc`}];else{let n=i.name===t?i:void 0;if(n?.dimensions?.[a]){let t=n.dimensions[a];l=[{field:o.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,r),direction:`asc`}]}}}let u;s.partitionBy&&s.partitionBy.length>0&&(u=s.partitionBy.map(e=>{let t=e.includes(`.`)?e.split(`.`)[1]:e,n=i.dimensions?.[t];return n?K(n.sql,r):null}).filter(e=>e!==null));let d=o.databaseAdapter.buildWindowFunction(e.type,t,u,l,{offset:s.offset,defaultValue:s.defaultValue,nTile:s.nTile,frame:s.frame});if(!d)return null;switch(s.operation||Z.getDefaultWindowOperation(e.type)){case`difference`:return P`${t} - ${d}`;case`ratio`:return P`${t} / NULLIF(${d}, 0)`;case`percentChange`:return P`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;default:return d}}function an(e,t,n,r,i){let a={...i.queryBuilder.buildSelections(e.joinCubes.length>0?r:e.primaryCube,t,n)};if(e.preAggregationCTEs)for(let o of e.preAggregationCTEs){let e=o.cube.name;for(let s of o.measures){if(!a[s])continue;let[,c]=s.split(`.`),l=r.get(e);if(!l?.measures?.[c])continue;let u=l.measures[c],d=P`${P.identifier(o.cteAlias)}.${P.identifier(c)}`,f;if(u.type===`calculated`&&u.calculatedSql)f=i.queryBuilder.buildCTECalculatedMeasure(u,l,o,r,n);else{let e=o.cteReason===`fanOutPrevention`,n=on(o,t,r),a=e||n;switch(u.type){case`count`:case`countDistinct`:case`sum`:f=a?H(d):V(d);break;case`avg`:f=a?H(d):i.databaseAdapter.buildAvg(d);break;case`min`:f=Ee(d);break;case`max`:f=H(d);break;case`number`:f=H(d);break;default:f=a?H(d):V(d)}}a[s]=P`${f}`.as(s)}for(let t in a){let[n,i]=t.split(`.`);if(n!==e)continue;let s=r.get(e),c=s&&s.dimensions?.[i],l=t.startsWith(e+`.`);if(!c&&!l)continue;let u=o.joinKeys.find(e=>e.targetColumn===i);if(!u&&s?.dimensions?.[i]){let e=s.dimensions[i].sql;u=o.joinKeys.find(t=>t.targetColumnObj===e)}(u||l&&s?.dimensions?.[i])&&(a[t]=P`${P.identifier(o.cteAlias)}.${P.identifier(i)}`.as(t))}}return nn(a,e,t,n,r,i),a}function on(e,t,n){return e.cteReason!==`hasMany`||e.downstreamJoinKeys&&e.downstreamJoinKeys.length>0||e.intermediateJoins&&e.intermediateJoins.length>0||!(t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0)||t.dimensions?.some(t=>t.startsWith(`${e.cube.name}.`))||t.timeDimensions?.some(t=>t.dimension.startsWith(`${e.cube.name}.`))?!1:e.joinKeys.length>0&&e.joinKeys.every(e=>!!e.sourceColumnObj&&sn(e.sourceColumnObj,t,n))}function sn(e,t,n){if(t.dimensions)for(let r of t.dimensions){let[t,i]=r.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}if(t.timeDimensions)for(let r of t.timeDimensions){if(r.granularity)continue;let[t,i]=r.dimension.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}return!1}function cn(e,t,n,r,i,a){let o=[],s=t.db.select(r).from(n.from);if(i.ctes.length>0&&(s=t.db.with(...i.ctes).select(r).from(n.from)),n.joins)for(let e of n.joins)switch(e.type||`left`){case`left`:s=s.leftJoin(e.table,e.on);break;case`inner`:s=s.innerJoin(e.table,e.on);break;case`right`:s=s.rightJoin(e.table,e.on);break;case`full`:s=s.fullJoin(e.table,e.on);break}let c=new Set,l=new Set;if(e.preAggregationCTEs){for(let t of e.preAggregationCTEs)if(t.intermediateJoins&&t.intermediateJoins.length>0)for(let e of t.intermediateJoins)l.add(e.cube.name)}if(e.joinCubes&&e.joinCubes.length>0)for(let n of e.joinCubes){let r=n.cube.name;if(l.has(r)&&!i.cteAliasMap.has(r))continue;let u=i.cteAliasMap.get(n.cube.name);if(n.junctionTable){let r=n.junctionTable,a=r.joinCondition,c=r.sourceCubeName?i.cteAliasMap.get(r.sourceCubeName):void 0;if(c){let t=(e.preAggregationCTEs?.find(e=>e.cube.name===r.sourceCubeName))?.downstreamJoinKeys?.find(e=>e.targetCubeName===n.cube.name);if(t&&t.joinKeys.length>0){let e=[];for(let n of t.joinKeys){let t=P`${P.identifier(c)}.${P.identifier(n.sourceColumn)}`,r=n.targetColumnObj;r&&e.push(L(r,t))}e.length>0&&(a=R(...e))}}let l=[];if(r.securitySql){let e=r.securitySql(t.securityContext);Array.isArray(e)?l.push(...e):l.push(e)}try{switch(r.joinType||`left`){case`left`:s=s.leftJoin(r.table,a);break;case`inner`:s=s.innerJoin(r.table,a);break;case`right`:s=s.rightJoin(r.table,a);break;case`full`:s=s.fullJoin(r.table,a);break}l.length>0&&o.push(...l)}catch{}}let d,f,p;if(u)d=P`${P.identifier(u)}`,f=a.cteBuilder.buildCTEJoinCondition(n,u,e),p=void 0;else{let e=i.downstreamCubeMap.get(n.cube.name),r=n.cube.sql(t);if(d=r.from,p=r.where,e&&!n.junctionTable){let t=[];for(let n of e.joinKeys){let r=P`${P.identifier(e.cteAlias)}.${P.identifier(n.sourceColumn)}`,i=n.targetColumnObj||P.identifier(n.targetColumn);t.push(L(r,i))}f=t.length===1?t[0]:R(...t)}else f=n.joinCondition}let m=n.joinType||`left`,h=m!==`inner`&&p?R(f,p):f;try{switch(m){case`left`:s=s.leftJoin(d,h),p&&c.add(n.cube.name);break;case`inner`:s=s.innerJoin(d,f);break;case`right`:s=s.rightJoin(d,h),p&&c.add(n.cube.name);break;case`full`:s=s.fullJoin(d,h),p&&c.add(n.cube.name);break}}catch{}}return{drizzleQuery:s,allWhereConditions:o,cubesWithSecurityInJoin:c,absorbedIntermediateCubes:l}}function ln(e,t,n,r,i,a,o,s){let c=[...o.allWhereConditions];if(i.where&&c.push(i.where),e.joinCubes&&e.joinCubes.length>0)for(let t of e.joinCubes){let e=t.cube.name;if(a.cteAliasMap.get(e)||o.absorbedIntermediateCubes.has(e)||o.cubesWithSecurityInJoin.has(e))continue;let r=t.cube.sql(n);r.where&&c.push(r.where)}let l=s.queryBuilder.buildWhereConditions(e.joinCubes.length>0?r:e.primaryCube,t,n,e,a.preBuiltFilterMap);l.length>0&&c.push(...l);let u=o.drizzleQuery;if(c.length>0){let e=c.length===1?c[0]:R(...c);u=u.where(e)}let d=s.queryBuilder.buildGroupByFields(e.joinCubes.length>0?r:e.primaryCube,t,n,e);d.length>0&&(u=u.groupBy(...d));let f=s.queryBuilder.buildHavingConditions(e.joinCubes.length>0?r:e.primaryCube,t,n,e);if(f.length>0){let e=f.length===1?f[0]:R(...f);u=u.having(e)}let p=s.queryBuilder.buildOrderBy(t);return p.length>0&&(u=u.orderBy(...p)),u=s.queryBuilder.applyLimitAndOffset(u,t),u}function un(e){let t=new Map;if(t.set(e.primaryCube.name,e.primaryCube),e.joinCubes)for(let n of e.joinCubes)t.set(n.cube.name,n.cube);return t}var dn=class{constructor(e,t,n){this.queryBuilder=e,this.cteBuilder=t,this.databaseAdapter=n}derivePhysicalPlanContext(e){let t=e.source;if(t.type===`multiFactMerge`)return this.derivePhysicalPlanContextFromMultiFact(e,t);if(t.type===`fullKeyAggregate`)return this.derivePhysicalPlanContextFromFullKeyAggregate(e,t);let n=this.resolvePhysicalSimpleSource(t),r=this.resolveKeysDeduplicationMeta(t);return{primaryCube:n.primaryCube.cube,joinCubes:n.joins.map(e=>({cube:e.target.cube,alias:e.alias,joinType:e.joinType,joinCondition:e.joinCondition,junctionTable:e.junctionTable})),preAggregationCTEs:n.ctes.map(e=>({cube:e.cube.cube,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType,cteReason:e.cteReason})),keysDeduplication:r,warnings:e.warnings.length>0?e.warnings:void 0}}derivePhysicalPlanContextFromMultiFact(e,t){let n=t.groups.map((e,t)=>{if(e.type!==`query`)return null;let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`mf_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}}).filter(e=>!!e);if(n.length===0)throw Error(`multiFactMerge requires at least one query group`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:t.mergeStrategy,sharedDimensions:t.sharedDimensions.map(e=>e.name),groups:n}}}derivePhysicalPlanContextFromFullKeyAggregate(e,t){let n=t.subqueries.map((e,t)=>{if(e.type!==`query`)throw Error(`fullKeyAggregate currently requires query subqueries`);let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`fka_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}});if(n.length===0)throw Error(`fullKeyAggregate requires at least one subquery`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:`fullJoin`,sharedDimensions:t.dimensions.map(e=>e.name),groups:n}}}toSemanticQuery(e){let t=e.orderBy.length>0?Object.fromEntries(e.orderBy.map(e=>[e.name,e.direction])):void 0;return{measures:e.measures.map(e=>e.name),dimensions:e.dimensions.map(e=>e.name),timeDimensions:e.timeDimensions.map(e=>({dimension:e.name,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange})),filters:e.filters,order:t,limit:e.limit,offset:e.offset}}resolvePhysicalSimpleSource(e){switch(e.type){case`simpleSource`:return e;case`keysDeduplication`:return this.resolvePhysicalSimpleSourceFromKeysDedup(e);default:throw Error(`Current SQL builder does not support logical node '${e.type}' in physical conversion`)}}resolvePhysicalSimpleSourceFromKeysDedup(e){let t=e.measureSource;if(t.type===`simpleSource`)return t;let n=e.keysSource;if(n.type===`simpleSource`)return n;throw Error(`keysDeduplication requires at least one simpleSource child for SQL physical conversion`)}resolveKeysDeduplicationMeta(e){if(e.type!==`keysDeduplication`)return;let t=e,n=new Set;for(let e of t.joinOn){if(!e.alias)continue;let[t,r]=e.alias.split(`.`);t&&r&&n.add(t)}let r=n.size===1?Array.from(n)[0]:``;return r?{multipliedCubeName:r,primaryKeyDimensions:t.joinOn.map(e=>e.alias?.split(`.`)[1]??``).filter(Boolean),regularMeasures:t.regularMeasures}:void 0}build(e,t,n){let r={queryBuilder:this.queryBuilder,cteBuilder:this.cteBuilder,databaseAdapter:this.databaseAdapter},i=this.tryBuildMultiFactMergeQuery(e,t,n,r);if(i)return i;let a=this.tryBuildKeysDeduplicationQuery(e,t,n,r);if(a)return a;let o=tn(e,t,n,r),s=e.primaryCube.sql(n),c=e.joinCubes.length>0?un(e):new Map([[e.primaryCube.name,e.primaryCube]]);return ln(e,t,n,c,s,o,cn(e,n,s,an(e,t,n,c,r),o,r),r)}tryBuildKeysDeduplicationQuery(e,t,n,r){let i=e.keysDeduplication;if(!i?.multipliedCubeName||!t.measures?.length)return null;let a=e.joinCubes.length>0?un(e):new Map([[e.primaryCube.name,e.primaryCube]]),o=a.get(i.multipliedCubeName);if(!o||!this.canExecuteKeysDeduplication(t,o,i.multipliedCubeName))return null;let s=i.primaryKeyDimensions.length>0?i.primaryKeyDimensions:this.getPrimaryKeyDimensions(o);if(s.length===0)return null;let c=`${i.multipliedCubeName.toLowerCase()}_keys`,l=`${i.multipliedCubeName.toLowerCase()}_pk_agg`,u={},d=[];if(t.dimensions)for(let e of t.dimensions){let[t,r]=e.split(`.`),i=a.get(t),o=i?.dimensions?.[r];if(!i||!o)return null;let s=K(o.sql,n);u[e]=P`${s}`.as(e),d.push(s)}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,i]=e.dimension.split(`.`),o=a.get(t),s=o?.dimensions?.[i];if(!o||!s)return null;let c=r.queryBuilder.buildTimeDimensionExpression(s.sql,e.granularity,n);u[e.dimension]=P`${c}`.as(e.dimension),d.push(c)}let f=[];for(let e of s){let t=o.dimensions?.[e];if(!t)return null;let r=K(t.sql,n),i=`__pk__${e}`;u[i]=P`${r}`.as(i),d.push(r),f.push(i)}let p=i.regularMeasures??[],m=new Set(p),h=t.measures.filter(e=>!m.has(e));if(p.length>0){let e=r.queryBuilder.buildResolvedMeasures(p,a,n);for(let t of p){let n=e.get(t);if(!n)return null;let r=`__reg__${t.replace(`.`,`__`)}`;u[r]=P`${n()}`.as(r)}}let g=e.primaryCube.sql(n),_=[];g.where&&_.push(g.where);let v=n.db.select(u).from(g.from);if(g.joins)for(let e of g.joins)v=this.applyJoinByType(v,e.type??`left`,e.table,e.on);for(let t of e.joinCubes){if(t.junctionTable&&(v=this.applyJoinByType(v,t.junctionTable.joinType??`left`,t.junctionTable.table,t.junctionTable.joinCondition),t.junctionTable.securitySql)){let e=t.junctionTable.securitySql(n.securityContext);Array.isArray(e)?_.push(...e):_.push(e)}let e=t.cube.sql(n);v=this.applyJoinByType(v,t.joinType??`left`,e.from,t.joinCondition),e.where&&_.push(e.where)}_.push(...r.queryBuilder.buildWhereConditions(a,t,n)),_.length>0&&(v=v.where(_.length===1?_[0]:R(..._))),d.length>0&&(v=v.groupBy(...d));let y=n.db.$with(c).as(v),b=o.sql(n),x={},S=[];for(let e of s){let t=o.dimensions?.[e];if(!t)return null;let r=K(t.sql,n);x[e]=P`${r}`.as(e),S.push(r)}let C=new Set;for(let e of h){let[,t]=e.split(`.`);o.measures?.[t]?.type===`avg`&&C.add(t)}let w=h.filter(e=>{let[,t]=e.split(`.`);return!C.has(t)});if(w.length>0){let e=r.queryBuilder.buildResolvedMeasures(w,new Map([[o.name,o]]),n);for(let t of w){let[,n]=t.split(`.`),r=e.get(t);if(!r||typeof r!=`function`)return null;x[n]=P`${r()}`.as(n)}}for(let e of h){let[,t]=e.split(`.`);if(!C.has(t))continue;let r=o.measures?.[t];if(!r?.sql)return null;let i=K(r.sql,n),a=`__avg_sum__${t}`,s=`__avg_count__${t}`;x[a]=P`sum(${i})`.as(a),x[s]=P`count(${i})`.as(s)}let T=n.db.select(x).from(b.from),E=[];b.where&&E.push(b.where),E.push(...r.queryBuilder.buildWhereConditions(o,t,n)),E.length>0&&(T=T.where(E.length===1?E[0]:R(...E))),S.length>0&&(T=T.groupBy(...S));let ee=n.db.$with(l).as(T),D={};for(let e of t.dimensions??[])D[e]=P`${P.identifier(c)}.${P.identifier(e)}`.as(e);for(let e of t.timeDimensions??[])D[e.dimension]=P`${P.identifier(c)}.${P.identifier(e.dimension)}`.as(e.dimension);for(let e of h){let[,t]=e.split(`.`),n=o.measures?.[t];D[e]=this.buildKeysOuterAggregation(n?.type??`sum`,l,t,e)}for(let e of p){let[t,n]=e.split(`.`),r=a.get(t)?.measures?.[n],i=`__reg__${e.replace(`.`,`__`)}`;D[e]=this.buildKeysOuterAggregation(r?.type??`sum`,c,i,e)}let O=n.db.with(y,ee).select(D).from(P`${P.identifier(c)}`),k=f.map((e,t)=>L(P`${P.identifier(c)}.${P.identifier(e)}`,P`${P.identifier(l)}.${P.identifier(s[t])}`)),te=k.length===1?k[0]:R(...k);O=O.leftJoin(P`${P.identifier(l)}`,te);let ne=[...(t.dimensions??[]).map(e=>P`${P.identifier(c)}.${P.identifier(e)}`),...(t.timeDimensions??[]).map(e=>P`${P.identifier(c)}.${P.identifier(e.dimension)}`)];ne.length>0&&(O=O.groupBy(...ne));let A=r.queryBuilder.buildOrderBy(t,Object.keys(D));return A.length>0&&(O=O.orderBy(...A)),O=r.queryBuilder.applyLimitAndOffset(O,t),O}tryBuildMultiFactMergeQuery(e,t,n,r){let i=e.multiFactMerge;if(!i||i.groups.length<2)return null;let a=[...t.dimensions??[],...(t.timeDimensions??[]).map(e=>e.dimension)],o=Array.from(new Set(a)),s=o.length>0&&i.mergeStrategy===`fullJoin`&&!this.supportsFullOuterJoin(),c=this.selectRuntimeMergeStrategy(i.mergeStrategy,o.length>0),l=i.groups.map(e=>{let t=this.build(e.queryPlan,e.query,n);return n.db.$with(e.alias).as(t)});if(s)return this.buildMultiFactUnionKeysFallbackQuery(t,n,r,i,l,o);let u=i.groups[0].alias,d=i.groups.map(e=>e.alias),f={};if(o.length>0)for(let e of o)f[e]=P`${this.coalesceQualifiedColumn(d,e)}`.as(e);for(let e of i.groups)for(let t of e.measures)f[t]=P`coalesce(${P`${P.identifier(e.alias)}.${P.identifier(t)}`}, 0)`.as(t);let p=n.db.with(...l).select(f).from(P`${P.identifier(u)}`),m=new Map;for(let e of o)m.set(e,P`${P.identifier(u)}.${P.identifier(e)}`);for(let e=1;e<i.groups.length;e++){let t=i.groups[e].alias,n;if(o.length===0)n=P`1 = 1`;else{let e=o.map(e=>L(m.get(e),P`${P.identifier(t)}.${P.identifier(e)}`));n=e.length===1?e[0]:R(...e)}if(p=this.applyJoinByType(p,c,P`${P.identifier(t)}`,n),o.length>0&&c===`full`)for(let e of o)m.set(e,P`coalesce(${m.get(e)}, ${P`${P.identifier(t)}.${P.identifier(e)}`})`)}let h=r.queryBuilder.buildOrderBy(t,Object.keys(f));return h.length>0&&(p=p.orderBy(...h)),r.queryBuilder.applyLimitAndOffset(p,t)}buildMultiFactUnionKeysFallbackQuery(e,t,n,r,i,a){let o=`mf_all_keys`,s=r.groups.map(e=>P`select ${this.buildSharedKeySelection(e.alias,a)} from ${P.identifier(e.alias)}`),c=P`${P.join(s,P` union `)}`,l=t.db.$with(o).as(c),u={};for(let e of a)u[e]=P`${P.identifier(o)}.${P.identifier(e)}`.as(e);for(let e of r.groups)for(let t of e.measures)u[t]=P`coalesce(${P`${P.identifier(e.alias)}.${P.identifier(t)}`}, 0)`.as(t);let d=t.db.with(...i,l).select(u).from(P`${P.identifier(o)}`);for(let e of r.groups){let t=a.map(t=>L(P`${P.identifier(o)}.${P.identifier(t)}`,P`${P.identifier(e.alias)}.${P.identifier(t)}`)),n=t.length===1?t[0]:R(...t);d=d.leftJoin(P`${P.identifier(e.alias)}`,n)}let f=n.queryBuilder.buildOrderBy(e,Object.keys(u));return f.length>0&&(d=d.orderBy(...f)),n.queryBuilder.applyLimitAndOffset(d,e)}buildSharedKeySelection(e,t){let n=t.map(t=>P`${P.identifier(e)}.${P.identifier(t)} as ${P.identifier(t)}`);return P.join(n,P`, `)}selectRuntimeMergeStrategy(e,t){return!t||e===`innerJoin`?`inner`:e===`leftJoin`?`left`:this.supportsFullOuterJoin()?`full`:`left`}supportsFullOuterJoin(){let e=this.databaseAdapter.getEngineType();return e===`postgres`||e===`duckdb`}coalesceQualifiedColumn(e,t){if(e.length===1)return P`${P.identifier(e[0])}.${P.identifier(t)}`;let n=e.map(e=>P`${P.identifier(e)}.${P.identifier(t)}`),r=n[0];for(let e=1;e<n.length;e++)r=P`coalesce(${r}, ${n[e]})`;return r}canExecuteKeysDeduplication(e,t,n){if(!e.measures?.length)return!1;for(let r of e.measures){let[e,i]=r.split(`.`);if(e!==n)continue;let a=t.measures?.[i];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!this.queryContainsMeasureFilter(e,t,n)}queryContainsMeasureFilter(e,t,n){let r=e=>{if(!e)return!1;for(let i of e){if(`and`in i){if(r(i.and))return!0;continue}if(`or`in i){if(r(i.or))return!0;continue}if(`member`in i){let[e,r]=i.member.split(`.`);if(e===n&&t.measures?.[r])return!0}}return!1};return r(e.filters)}getPrimaryKeyDimensions(e){return Object.entries(e.dimensions??{}).filter(([,e])=>!!e.primaryKey).map(([e])=>e)}buildKeysOuterAggregation(e,t,n,r){switch(e){case`min`:return P`min(${P`${P.identifier(t)}.${P.identifier(n)}`})`.as(r);case`max`:return P`max(${P`${P.identifier(t)}.${P.identifier(n)}`})`.as(r);case`avg`:return P`sum(${P`${P.identifier(t)}.${P.identifier(`__avg_sum__${n}`)}`}) / nullif(sum(${P`${P.identifier(t)}.${P.identifier(`__avg_count__${n}`)}`}), 0)`.as(r);default:return P`coalesce(sum(${P`${P.identifier(t)}.${P.identifier(n)}`}), 0)`.as(r)}}applyJoinByType(e,t,n,r){switch(t){case`inner`:return e.innerJoin(n,r);case`right`:return e.rightJoin(n,r);case`full`:return e.fullJoin(n,r);default:return e.leftJoin(n,r)}}};function Q(e,t){if(!(typeof process>`u`||!process.env?.DC_DEBUG))try{let{sql:n,params:r}=t.toSQL();console.log(`\n[DC_DEBUG] ${e}`),console.log(n),r.length>0&&console.log(`params:`,r),console.log()}catch{}}var fn=class{queryBuilder;drizzlePlanBuilder;databaseAdapter;comparisonQueryBuilder;funnelQueryBuilder;flowQueryBuilder;retentionQueryBuilder;cacheConfig;logicalPlanBuilder;planOptimiser;rlsSetup;constructor(e,t,n){if(this.dbExecutor=e,this.databaseAdapter=e.databaseAdapter,!this.databaseAdapter)throw Error(`DatabaseExecutor must have a databaseAdapter property`);this.queryBuilder=new Nt(this.databaseAdapter);let r=new Ft,i=new It(this.queryBuilder);this.drizzlePlanBuilder=new dn(this.queryBuilder,i,this.databaseAdapter),this.comparisonQueryBuilder=new Gt(this.databaseAdapter),this.funnelQueryBuilder=new Kt(this.databaseAdapter),this.flowQueryBuilder=new qt(this.databaseAdapter),this.retentionQueryBuilder=new Qt(this.databaseAdapter),this.logicalPlanBuilder=new $t(r),this.planOptimiser=new en,this.cacheConfig=t,this.rlsSetup=n}async withRLSContext(e,t){if(!this.rlsSetup)return t();let n=this.dbExecutor.db;if(!n.transaction)throw Error(`rlsSetup requires a database driver that supports transactions (db.transaction)`);let r=this.rlsSetup;return n.transaction(async n=>{await r(n,e);let i=Object.create(this.dbExecutor);return i.db=n,this.dbExecutor=i,t()})}async execute(e,t,n,r){try{let i=this.resolveQueryMode(t);this.validateQueryForMode(i,e,t);let a;if(this.cacheConfig?.enabled!==!1&&this.cacheConfig?.provider)if(a=yt(t,n,this.cacheConfig),r?.skipCache)this.cacheConfig.onCacheEvent?.({type:`miss`,key:a,durationMs:0});else try{let e=Date.now(),t=await this.cacheConfig.provider.get(a);if(t)return this.cacheConfig.onCacheEvent?.({type:`hit`,key:a,durationMs:Date.now()-e}),{...t.value,cache:t.metadata?{hit:!0,cachedAt:new Date(t.metadata.cachedAt).toISOString(),ttlMs:t.metadata.ttlMs,ttlRemainingMs:t.metadata.ttlRemainingMs}:{hit:!0,cachedAt:new Date().toISOString(),ttlMs:0,ttlRemainingMs:0}};this.cacheConfig.onCacheEvent?.({type:`miss`,key:a,durationMs:Date.now()-e})}catch(e){this.cacheConfig.onError?.(e,`get`)}return await this.withRLSContext(n,()=>this.executeQueryByModeWithCache(i,e,t,n,a))}catch(e){if(e instanceof Error){let t=e;for(;t.cause instanceof Error;)t=t.cause;let n=t.message,r=t;throw r.code&&(n+=` [${r.code}]`),r.detail&&(n+=` Detail: ${r.detail}`),r.hint&&(n+=` Hint: ${r.hint}`),e.message=`Query execution failed: ${n}`,e}throw Error(`Query execution failed: Unknown error`,{cause:e})}}buildLogicalPlan(e,t,n){let r=new q,i=this.createQueryContext(n,r);return this.preloadFilterCache(t,r,e,i),this.buildRegularQueryArtifacts(e,t,i).optimisedPlan}analyzeQuery(e,t,n){let r=new q,i=this.createQueryContext(n,r);return this.preloadFilterCache(t,r,e,i),this.buildRegularQueryArtifacts(e,t,i).analysis}async executeQuery(e,t,n){let r=new Map;return r.set(e.name,e),this.execute(r,t,n)}async executeComparisonQueryWithCache(e,t,n,r){let i=await this.executeComparisonQuery(e,t,n);return await this.cacheResult(r,i),i}async executeComparisonQuery(e,t,n){let{timeDimension:r,periods:i,granularity:a,periodQueries:o}=this.buildComparisonExecutionPlan(t),s=o.map(async(t,r)=>({result:await this.executeStandardQuery(e,t,n),period:i[r]})),c=await Promise.all(s),l=this.comparisonQueryBuilder.mergeComparisonResults(c,r,a);return l.data=this.comparisonQueryBuilder.sortComparisonResults(l.data,r.dimension),l}buildComparisonExecutionPlan(e){let t=this.comparisonQueryBuilder.getComparisonTimeDimension(e);if(!t||!t.compareDateRange)throw Error(`No compareDateRange found in query`);let n=this.comparisonQueryBuilder.normalizePeriods(t.compareDateRange);if(n.length<2)throw Error(`compareDateRange requires at least 2 periods`);let r=n.map(t=>this.comparisonQueryBuilder.createPeriodQuery(e,t));return{timeDimension:t,granularity:t.granularity||`day`,periods:n,periodQueries:r}}async executeFunnelQueryWithCache(e,t,n,r){let i=await this.executeFunnelQuery(e,t,n);return await this.cacheResult(r,i),{...i,cache:{hit:!1}}}async executeFunnelQuery(e,t,n){let r=t.funnel,i=this.funnelQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Funnel validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.funnelQueryBuilder.buildFunnelQuery(r,e,a);Q(`funnel query`,o);let s=await o,c=this.funnelQueryBuilder.transformResult(s,r),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.funnel={config:r,steps:r.steps.map((e,t)=>({name:e.name,index:t,timeToConvert:e.timeToConvert}))},{data:c,annotation:l}}async executeFlowQueryWithCache(e,t,n,r){let i=await this.executeFlowQuery(e,t,n);return await this.cacheResult(r,i),{...i,cache:{hit:!1}}}async executeFlowQuery(e,t,n){let r=t.flow,i=this.flowQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Flow validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.flowQueryBuilder.buildFlowQuery(r,e,a);Q(`flow query`,o);let s=await o,c=this.flowQueryBuilder.transformResult(s),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.flow={config:r,startingStep:{name:r.startingStep.name},stepsBefore:r.stepsBefore,stepsAfter:r.stepsAfter},{data:[c],annotation:l}}async executeRetentionQueryWithCache(e,t,n,r){let i=await this.executeRetentionQuery(e,t,n);return await this.cacheResult(r,i),{...i,cache:{hit:!1}}}async executeRetentionQuery(e,t,n){let r=t.retention,i=this.retentionQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Retention validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.retentionQueryBuilder.buildRetentionQuery(r,e,a);Q(`retention query`,o);let s=await o,c=this.retentionQueryBuilder.transformResult(s,r),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.retention={config:r,granularity:r.granularity,periods:r.periods,retentionType:r.retentionType,breakdownDimensions:r.breakdownDimensions},{data:c,annotation:l}}async executeStandardQuery(e,t,n){let r=new q,i=this.createQueryContext(n,r);this.preloadFilterCache(t,r,e,i);let{optimisedPlan:a}=this.buildRegularQueryArtifacts(e,t,i),o=this.drizzlePlanBuilder.derivePhysicalPlanContext(a),s=this.drizzlePlanBuilder.build(o,t,i);Q(`query`,s);let c=this.queryBuilder.collectNumericFields(e,t),l=await this.dbExecutor.execute(s,c);return{data:Wt(Array.isArray(l)?l.map(e=>{let n={...e};if(t.timeDimensions){for(let e of t.timeDimensions)if(e.dimension in n){let t=n[e.dimension];if(typeof t==`string`&&t.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)){let e=t.replace(` `,`T`),n=!e.endsWith(`Z`)&&!e.includes(`+`)?e+`Z`:e;t=new Date(n)}t=this.databaseAdapter.convertTimeDimensionResult(t),n[e.dimension]=t}}return n}):[l],t,t.measures||[]),annotation:this.generateAnnotations(o,t)}}createQueryContext(e,t){return{db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:e,filterCache:t}}getOptimiserEngineType(){let e=this.dbExecutor.getEngineType?.();return e===`singlestore`?`mysql`:e??`postgres`}buildRegularQueryArtifacts(e,t,n){let r=this.logicalPlanBuilder.planWithAnalysis(e,t,n),i=this.planOptimiser.optimise(r.plan,{engineType:this.getOptimiserEngineType()});return{logicalPlan:r.plan,analysis:r.analysis,optimisedPlan:i}}validateSecurityContext(e,t){let n=typeof process<`u`?process.env.NODE_ENV:void 0,r=typeof process<`u`?process.env?.DRIZZLE_CUBE_WARN_SECURITY:void 0;if(n!==`development`&&!r)return;let i=[e.primaryCube];for(let t of e.joinCubes||[])i.push(t.cube);for(let t of e.preAggregationCTEs||[])i.push(t.cube);let a=new Set;for(let e of i)if(!a.has(e.name)){a.add(e.name);try{if(e.public||this.rlsSetup)continue;e.sql(t).where||console.warn(`[drizzle-cube] WARNING: Cube '${e.name}' has no security filtering. If this cube contains public data, add 'public: true' to suppress this warning. Otherwise, ensure sql() returns: { from: table, where: eq(table.orgId, ctx.securityContext.orgId) }. For databases that support Row Level Security (e.g. PostgreSQL), you can configure rlsSetup to run session-level commands (SET LOCAL, SET ROLE) instead.`)}catch{}}}async generateSQL(e,t,n){let r=new Map;return r.set(e.name,e),this.generateUnifiedSQL(r,t,n)}async generateMultiCubeSQL(e,t,n){return this.generateUnifiedSQL(e,t,n)}async dryRunFunnel(e,t,n){if(!this.funnelQueryBuilder.hasFunnel(t))throw Error(`Query does not contain a valid funnel configuration`);let r=t.funnel,i=this.funnelQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Funnel validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.funnelQueryBuilder.buildFunnelQuery(r,e,a).toSQL();return{sql:o.sql,params:o.params}}async dryRunFlow(e,t,n){if(!this.flowQueryBuilder.hasFlow(t))throw Error(`Query does not contain a valid flow configuration`);let r=t.flow,i=this.flowQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Flow validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.flowQueryBuilder.buildFlowQuery(r,e,a).toSQL();return{sql:o.sql,params:o.params}}async dryRunRetention(e,t,n){if(!this.retentionQueryBuilder.hasRetention(t))throw Error(`Query does not contain a valid retention configuration`);let r=t.retention,i=this.retentionQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Retention validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.retentionQueryBuilder.buildRetentionQuery(r,e,a).toSQL();return{sql:o.sql,params:o.params}}async explainQuery(e,t,n,r){let i=await this.dryRunSQL(e,t,n);return this.withRLSContext(n,()=>this.dbExecutor.explainQuery(i.sql,i.params||[],r))}async dryRunSQL(e,t,n){let r=this.resolveQueryMode(t);return this.validateQueryForMode(r,e,t),this.generateSqlForMode(r,e,t,n)}async generateUnifiedSQL(e,t,n){let r=new q,i=this.createQueryContext(n,r);this.preloadFilterCache(t,r,e,i);let{optimisedPlan:a}=this.buildRegularQueryArtifacts(e,t,i),o=this.drizzlePlanBuilder.derivePhysicalPlanContext(a),s=this.drizzlePlanBuilder.build(o,t,i).toSQL();return{sql:s.sql,params:s.params}}resolveQueryMode(e){let t=[];if(this.comparisonQueryBuilder.hasComparison(e)&&t.push(`comparison`),this.funnelQueryBuilder.hasFunnel(e)&&t.push(`funnel`),this.flowQueryBuilder.hasFlow(e)&&t.push(`flow`),this.retentionQueryBuilder.hasRetention(e)&&t.push(`retention`),t.length===0)return`regular`;if(t.length>1)throw Error(`Query contains multiple query modes: ${t.join(`, `)}`);return t[0]}validateQueryForMode(e,t,n){let r=()=>{let e=hn(t,n);if(!e.isValid)throw Error(`Query validation failed: ${e.errors.join(`, `)}`)};({regular:r,comparison:r,funnel:()=>{let e=this.funnelQueryBuilder.validateConfig(n.funnel,t);if(!e.isValid)throw Error(`Funnel validation failed: ${e.errors.join(`, `)}`)},flow:()=>{let e=this.flowQueryBuilder.validateConfig(n.flow,t);if(!e.isValid)throw Error(`Flow validation failed: ${e.errors.join(`, `)}`)},retention:()=>{let e=this.retentionQueryBuilder.validateConfig(n.retention,t);if(!e.isValid)throw Error(`Retention validation failed: ${e.errors.join(`, `)}`)}})[mt(e)]()}async executeQueryByModeWithCache(e,t,n,r,i){return{regular:()=>this.executeRegularQueryWithCache(t,n,r,i),comparison:()=>this.executeComparisonQueryWithCache(t,n,r,i),funnel:()=>this.executeFunnelQueryWithCache(t,n,r,i),flow:()=>this.executeFlowQueryWithCache(t,n,r,i),retention:()=>this.executeRetentionQueryWithCache(t,n,r,i)}[mt(e)]()}async executeRegularQueryWithCache(e,t,n,r){let i=new q,a=this.createQueryContext(n,i);this.preloadFilterCache(t,i,e,a);let{optimisedPlan:o}=this.buildRegularQueryArtifacts(e,t,a),s=this.drizzlePlanBuilder.derivePhysicalPlanContext(o);this.validateSecurityContext(s,a);let c=this.drizzlePlanBuilder.build(s,t,a);Q(`query`,c);let l=this.queryBuilder.collectNumericFields(e,t),u=await this.dbExecutor.execute(c,l),d={data:Wt(Array.isArray(u)?u.map(e=>{let n={...e};if(t.timeDimensions){for(let e of t.timeDimensions)if(e.dimension in n){let t=n[e.dimension];if(typeof t==`string`&&t.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)){let e=t.replace(` `,`T`),n=!e.endsWith(`Z`)&&!e.includes(`+`)?e+`Z`:e;t=new Date(n)}t=this.databaseAdapter.convertTimeDimensionResult(t),n[e.dimension]=t}}return n}):[u],t,t.measures||[]),annotation:this.generateAnnotations(s,t),warnings:o.warnings?.length?o.warnings:void 0};return await this.cacheResult(r,d),d}async cacheResult(e,t){if(!(!e||!this.cacheConfig?.provider))try{let n=Date.now();await this.cacheConfig.provider.set(e,t,this.cacheConfig.defaultTtlMs??3e5),this.cacheConfig.onCacheEvent?.({type:`set`,key:e,durationMs:Date.now()-n})}catch(e){this.cacheConfig.onError?.(e,`set`)}}async generateSqlForMode(e,t,n,r){return{regular:()=>this.generateUnifiedSQL(t,n,r),comparison:()=>this.generateComparisonSQL(t,n,r),funnel:()=>this.dryRunFunnel(t,n,r),flow:()=>this.dryRunFlow(t,n,r),retention:()=>this.dryRunRetention(t,n,r)}[mt(e)]()}async generateComparisonSQL(e,t,n){let r=this.buildComparisonExecutionPlan(t).periodQueries[0];return this.generateUnifiedSQL(e,r,n)}generateAnnotations(e,t){let n={},r={},i={},a=[e.primaryCube].filter(Boolean);if(e.joinCubes&&e.joinCubes.length>0&&a.push(...e.joinCubes.map(e=>e.cube).filter(Boolean)),e.multiFactMerge?.groups?.length)for(let t of e.multiFactMerge.groups)t.queryPlan.primaryCube&&a.push(t.queryPlan.primaryCube),t.queryPlan.joinCubes?.length&&a.push(...t.queryPlan.joinCubes.map(e=>e.cube).filter(Boolean));if(t.measures)for(let e of t.measures){let[t,r]=e.split(`.`),i=a.find(e=>e?.name===t);if(i&&i.measures[r]){let t=i.measures[r];n[e]={title:t.title||r,shortTitle:t.title||r,type:t.type}}}if(t.dimensions)for(let e of t.dimensions){let[t,n]=e.split(`.`),i=a.find(e=>e?.name===t);if(i&&i.dimensions?.[n]){let t=i.dimensions[n];r[e]={title:t.title||n,shortTitle:t.title||n,type:t.type}}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,n]=e.dimension.split(`.`),r=a.find(e=>e?.name===t);if(r&&r.dimensions?.[n]){let t=r.dimensions[n];i[e.dimension]={title:t.title||n,shortTitle:t.title||n,type:t.type,granularity:e.granularity}}}return{measures:n,dimensions:r,segments:{},timeDimensions:i}}preloadFilterCache(e,t,n,r){if(e.filters&&e.filters.length>0){let i=vt(e.filters);for(let e of i){let i=gt(e);if(t.has(i))continue;let[a,o]=e.member.split(`.`),s=n.get(a);if(!s)continue;let c=s.dimensions?.[o];if(!c||[`arrayContains`,`arrayOverlaps`,`arrayContained`].includes(e.operator))continue;let l=c.type===`time`?K(c.sql,r):typeof c.sql==`function`?c.sql(r):c.sql,u=this.queryBuilder.buildFilterConditionPublic(l,e.operator,e.values,c,e.dateRange);u&&t.set(i,u)}}if(e.timeDimensions){for(let i of e.timeDimensions)if(i.dateRange){let e=_t(i.dimension,i.dateRange);if(t.has(e))continue;let[a,o]=i.dimension.split(`.`),s=n.get(a);if(!s)continue;let c=s.dimensions?.[o];if(!c)continue;let l=K(c.sql,r),u=this.queryBuilder.buildDateRangeCondition(l,i.dateRange);u&&t.set(e,u)}}}},pn=class t{cubes=new Map;metadataCache;cacheConfig;rlsSetup;db;schema;engineType;constructor(e){e?.databaseExecutor?(this.db=e.databaseExecutor.db,this.schema=e.databaseExecutor.schema,this.engineType=e.databaseExecutor.getEngineType()):e?.drizzle&&(this.db=e.drizzle,this.schema=e.schema,this.engineType=e.engineType),this.cacheConfig=e?.cache,this.rlsSetup=e?.rlsSetup}setDatabaseExecutor(e){this.db=e.db,this.schema=e.schema,this.engineType=e.getEngineType()}getEngineType(){return this.engineType}setDrizzle(e,t,n){this.db=e,this.schema=t,this.engineType=n}hasExecutor(){return!!this.db}createDbExecutor(){if(!this.db)throw Error(`Database executor not configured`);return ut(this.db,this.schema,this.engineType)}createQueryExecutor(e=!1){return new fn(this.createDbExecutor(),e?this.cacheConfig:void 0,this.rlsSetup)}formatSqlResult(t){let n=this.getEngineType()??`postgres`;return{sql:e.s(t.sql,n),params:t.params}}registerCube(e){this.validateCalculatedMeasures(e),new X(this.cubes).populateDependencies(e),this.cubes.set(e.name,e),this.invalidateMetadataCache()}validateCubeReferences(){let e=[];for(let[t,n]of this.cubes)if(n.joins)for(let[r,i]of Object.entries(n.joins))typeof i.targetCube==`string`&&!this.cubes.has(i.targetCube)&&e.push(`${t}.joins.${r}: target cube '${i.targetCube}' is not registered`);if(e.length>0)throw Error(`Unresolved cube references:\n${e.map(e=>` - ${e}`).join(`
197
197
  `)}`)}validateCalculatedMeasures(e){let t=[];for(let[n,r]of Object.entries(e.measures))if(r.type===`calculated`){if(!r.calculatedSql){t.push(`Calculated measure '${e.name}.${n}' must have calculatedSql property`);continue}let i=At(r.calculatedSql);if(!i.isValid){t.push(`Invalid calculatedSql syntax in '${e.name}.${n}': ${i.errors.join(`, `)}`);continue}let a=new Map(this.cubes);a.set(e.name,e);let o=new X(a);try{o.validateDependencies(e)}catch(e){t.push(e instanceof Error?e.message:String(e))}}if(t.length===0){let n=new Map(this.cubes);n.set(e.name,e);let r=new X(n);r.buildGraph(e);let i=r.detectCycle();i&&t.push(`Circular dependency detected in calculated measures: ${i.join(` -> `)}`)}if(t.length>0)throw Error(`Calculated measure validation failed for cube '${e.name}':\n${t.join(`
198
198
  `)}`)}getCube(e){return this.cubes.get(e)}getAllCubes(){return Array.from(this.cubes.values())}getAllCubesMap(){return this.cubes}async execute(e,t,n){return this.createQueryExecutor(!0).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 Error(`Cube '${e}' not found`);return this.execute(t,n)}getMetadata(){return 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){let n=Object.keys(e.measures),r=Object.keys(e.dimensions),i=Array(n.length),a=Array(r.length);for(let t=0;t<n.length;t++){let r=n[t],a=e.measures[r],o;a.drillMembers&&a.drillMembers.length>0&&(o=a.drillMembers.map(t=>t.includes(`.`)?t:`${e.name}.${t}`)),i[t]={name:`${e.name}.${r}`,title:a.title||r,shortTitle:a.title||r,type:a.type,format:void 0,description:a.description,synonyms:a.synonyms,drillMembers:o}}for(let n=0;n<r.length;n++){let i=r[n],o=e.dimensions[i],s;o.type===`time`&&(s=o.granularities||t.DEFAULT_TIME_GRANULARITIES),a[n]={name:`${e.name}.${i}`,title:o.title||i,shortTitle:o.title||i,type:o.type,format:void 0,description:o.description,synonyms:o.synonyms,granularities:s}}let o=[];if(e.joins)for(let[,t]of Object.entries(e.joins)){let e=G(t.targetCube,this.cubes);e&&o.push({targetCube:e.name,relationship:t.relationship,joinFields:t.on.map(e=>({sourceField:this.getColumnName(e.source),targetField:this.getColumnName(e.target)}))})}let s=[];if(e.hierarchies)for(let[,t]of Object.entries(e.hierarchies))s.push({name:t.name,title:t.title||t.name,cubeName:e.name,levels:t.levels.map(t=>t.includes(`.`)?t:`${e.name}.${t}`)});return{name:e.name,title:e.title||e.name,description:e.description,exampleQuestions:e.exampleQuestions,measures:i,dimensions:a,segments:[],relationships:o.length>0?o:void 0,hierarchies:s.length>0?s:void 0,meta:e.meta}}async generateSQL(e,t,n){let r=this.getCube(e);if(!r)throw Error(`Cube '${e}' not found`);let i=await this.createQueryExecutor().generateSQL(r,t,n);return this.formatSqlResult(i)}async generateMultiCubeSQL(e,t){let n=await this.createQueryExecutor().generateMultiCubeSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRun(e,t){let n=await this.createQueryExecutor().dryRunSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRunFunnel(e,t){return this.dryRun(e,t)}async dryRunFlow(e,t){return this.dryRun(e,t)}async dryRunRetention(e,t){return this.dryRun(e,t)}async explainQuery(e,t,n){return this.createQueryExecutor().explainQuery(this.cubes,e,t,n)}hasCube(e){return this.cubes.has(e)}unregisterCube(e){return this.removeCube(e)}removeCube(e){let 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 hn(this.cubes,e)}analyzeQuery(e,t){return this.createQueryExecutor(!0).analyzeQuery(this.cubes,e,t)}};function mn(e){let t=[];return e.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>=2)&&t.push(`comparison`),e.funnel!==void 0&&e.funnel.steps?.length>=2&&t.push(`funnel`),e.flow!==void 0&&e.flow.startingStep!==void 0&&e.flow.eventDimension!==void 0&&t.push(`flow`),e.retention!==void 0&&e.retention.timeDimension!=null&&e.retention.bindingKey!=null&&t.push(`retention`),t.length===0?[]:t}function hn(e,t){let n=[],r=mn(t);if(r.length>1)return n.push(`Query contains multiple query modes: ${r.join(`, `)}`),{isValid:!1,errors:n};let i={funnel:()=>{let r=t.funnel.bindingKey;if(typeof r==`string`){let[t]=r.split(`.`);t&&!e.has(t)&&n.push(`Funnel binding key cube not found: ${t}`)}else if(Array.isArray(r))for(let t of r)e.has(t.cube)||n.push(`Funnel binding key cube not found: ${t.cube}`)},flow:()=>{let r=t.flow.bindingKey;if(typeof r==`string`){let[t]=r.split(`.`);t&&!e.has(t)&&n.push(`Flow binding key cube not found: ${t}`)}},retention:()=>{let r=t.retention,i=_n(r.timeDimension);i&&!e.has(i)&&n.push(`Retention cube not found: ${i}`);let a=r.bindingKey;if(typeof a==`string`){let[t]=a.split(`.`);t&&!e.has(t)&&n.push(`Retention binding key cube not found: ${t}`)}else if(Array.isArray(a))for(let t of a)e.has(t.cube)||n.push(`Retention binding key cube not found: ${t.cube}`);if(r.breakdownDimensions&&Array.isArray(r.breakdownDimensions))for(let t of r.breakdownDimensions){let[r]=t.split(`.`);r&&!e.has(r)&&n.push(`Retention breakdown cube not found: ${r}`)}}};if(r.length===1&&r[0]!==`comparison`)return i[r[0]](),{isValid:n.length===0,errors:n};let a=new Set;if(t.measures)for(let r of t.measures){let[t,i]=r.split(`.`);if(!t||!i){n.push(`Invalid measure format: ${r}. Expected format: 'CubeName.fieldName'`);continue}a.add(t);let o=e.get(t);if(!o){n.push(`Cube '${t}' not found (referenced in measure '${r}')`);continue}if(!o.measures[i]){let e=i===t?`. Did you mean one of: ${Object.keys(o.measures).slice(0,5).map(e=>`'${t}.${e}'`).join(`, `)}?`:``;n.push(`Measure '${i}' not found on cube '${t}'${e}`)}}if(t.dimensions)for(let r of t.dimensions){let[t,i]=r.split(`.`);if(!t||!i){n.push(`Invalid dimension format: ${r}. Expected format: 'CubeName.fieldName'`);continue}a.add(t);let o=e.get(t);if(!o){n.push(`Cube '${t}' not found (referenced in dimension '${r}')`);continue}if(!o.dimensions[i]){let e=i===t?`. Did you mean one of: ${Object.keys(o.dimensions).slice(0,5).map(e=>`'${t}.${e}'`).join(`, `)}?`:``;n.push(`Dimension '${i}' not found on cube '${t}'${e}`)}}if(t.timeDimensions)for(let r of t.timeDimensions){let[t,i]=r.dimension.split(`.`);if(!t||!i){n.push(`Invalid timeDimension format: ${r.dimension}. Expected format: 'CubeName.fieldName'`);continue}a.add(t);let o=e.get(t);if(!o){n.push(`Cube '${t}' not found (referenced in timeDimension '${r.dimension}')`);continue}o.dimensions[i]||n.push(`TimeDimension '${i}' not found on cube '${t}' (must be a dimension with time type)`)}if(t.filters)for(let r of t.filters)gn(r,e,n,a);return a.size===0&&n.push(`Query must reference at least one cube through measures, dimensions, or filters`),{isValid:n.length===0,errors:n}}function gn(e,t,n,r){if(`and`in e||`or`in e){let i=e.and||e.or||[];for(let e of i)gn(e,t,n,r);return}if(!(`member`in e)){n.push(`Filter must have a member field`);return}let[i,a]=e.member.split(`.`);if(!i||!a){n.push(`Invalid filter member format: ${e.member}. Expected format: 'CubeName.fieldName'`);return}r.add(i);let o=t.get(i);if(!o){n.push(`Cube '${i}' not found (referenced in filter '${e.member}')`);return}if(!o.dimensions[a]&&!o.measures[a]){let e=a===i?`. Did you mean one of: ${[...Object.keys(o.dimensions),...Object.keys(o.measures)].slice(0,5).map(e=>`'${i}.${e}'`).join(`, `)}?`:``;n.push(`Filter field '${a}' not found on cube '${i}' (must be a dimension or measure)${e}`)}}function _n(e){if(typeof e==`string`){let[t]=e.split(`.`);return t||null}return e.cube}var vn=[`2025-11-25`,`2025-06-18`,`2025-03-26`],yn=`2025-11-25`;function bn(e){let t=An(e[`mcp-protocol-version`])||`2025-11-25`;return{ok:vn.includes(t),negotiated:vn.includes(t)?t:null,supported:vn}}function xn(e){if(!e)return!1;let t=e.split(`,`).map(e=>e.trim().toLowerCase()),n=t.includes(`text/event-stream`),r=t.includes(`application/json`);return n&&!r}var Sn=`mcp-session-id`;function Cn(e){if(!e)return!1;let t=e.split(`,`).map(e=>e.trim().toLowerCase().split(`;`)[0]),n=t.some(e=>e===`application/json`),r=t.some(e=>e===`text/event-stream`);return n&&r}function wn(e,t={}){let{allowMissingOrigin:n=!0,allowedOrigins:r}=t;if(!e)return n?{valid:!0}:{valid:!1,reason:`Origin header is required`};if(!r||r.length===0)return{valid:!0};let i;try{i=new URL(e)}catch{return{valid:!1,reason:`Invalid Origin header format`}}return r.map(e=>{try{return new URL(e).origin}catch{return e}}).includes(i.origin)?{valid:!0}:{valid:!1,reason:`Origin not in allowed list`}}function Tn(e,t,n){let r=[];return t&&r.push(`id: ${t}`),n&&n>0&&r.push(`retry: ${n}`),r.push(`event: message`),r.push(`data: ${JSON.stringify(e)}`),r.push(``),r.join(`
199
199
  `)}function En(e,t,n,r){return{jsonrpc:`2.0`,id:e??null,error:{code:t,message:n,...r===void 0?{}:{data:r}}}}function Dn(e,t){return{jsonrpc:`2.0`,id:e??null,result:t}}function On(e){if(!e||typeof e!=`object`)return null;let t=e;return t.jsonrpc!==`2.0`||typeof t.method!=`string`?null:{jsonrpc:`2.0`,method:t.method,id:t.id,params:t.params}}async function kn(t,n,r){let{semanticLayer:i,extractSecurityContext:a,rawRequest:o,rawResponse:s}=r,c=r.prompts??In,l=r.resources??Ln;switch(t){case`initialize`:{let e=n?.protocolVersion,t;return t=e&&vn.includes(e)?e:yn,{protocolVersion:t,capabilities:{tools:{listChanged:!1},resources:{listChanged:!1},prompts:{listChanged:!1},sampling:{}},sessionId:Mn(),serverInfo:{name:`drizzle-cube`,version:typeof process<`u`?process.env?.npm_package_version||`dev`:`worker`}}}case`list_tools`:case`tools/list`:return{tools:Nn(),nextCursor:``};case`call_tool`:case`tools/call`:return Pn(n,r);case`resources/list`:return{resources:l.map(({uri:e,name:t,description:n,mimeType:r})=>({uri:e,name:t,description:n,mimeType:r})),nextCursor:``};case`resources/templates/list`:return{resourceTemplates:[],nextCursor:``};case`resources/read`:{let e=n?.uri,t=l.find(t=>t.uri===e)||l[0];if(!t)throw $(-32602,`resource not found`);return{contents:[{uri:t.uri,mimeType:t.mimeType,text:t.text}]}}case`prompts/list`:return{prompts:c.map(({name:e,description:t})=>({name:e,description:t})),nextCursor:``};case`ping`:return{};case`notifications/initialized`:return{};case`prompts/get`:{let e=n?.name,t=c.find(t=>t.name===e)||c[0];if(!t)throw $(-32602,`prompt not found`);return{name:t.name,description:t.description,messages:t.messages}}case`discover`:return e.d(i,n||{});case`validate`:{let t=n||{};if(!t.query)throw $(-32602,`query is required`);return e.h(i,t)}case`load`:{let t=n||{};if(!t.query)throw $(-32602,`query is required`);return e.p(i,await a(o,s),t)}default:throw $(-32601,`Unknown MCP method: ${t}`)}}function $(e,t,n){let r=Error(t);return r.code=e,n!==void 0&&(r.data=n),r}function An(e){return e?Array.isArray(e)?e[0]||null:e:null}function jn(e){return e.id===void 0||e.id===null}function Mn(){return`evt-${e.c()}`}function Nn(){return[{name:`discover`,description:`Find relevant cubes based on topic or intent. Call this FIRST to understand available data.
@@ -7225,7 +7225,7 @@ var hn = class {
7225
7225
  //#endregion
7226
7226
  //#region src/server/executor.ts
7227
7227
  function Q(e, t) {
7228
- if (process.env.DC_DEBUG) try {
7228
+ if (!(typeof process > "u" || !process.env?.DC_DEBUG)) try {
7229
7229
  let { sql: n, params: r } = t.toSQL();
7230
7230
  console.log(`\n[DC_DEBUG] ${e}`), console.log(n), r.length > 0 && console.log("params:", r), console.log();
7231
7231
  } catch {}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CDExg9uP.cjs`),t=require(`../mcp-transport-Dmf2vbIb.cjs`);let n=require(`next/server`);function r(e){let{cubes:n,drizzle:r,schema:i,engineType:a,cache:o,rlsSetup:s}=e;if(!n||n.length===0)throw Error(`At least one cube must be provided in the cubes array`);let c=new t.h({drizzle:r,schema:i,engineType:a,cache:o,rlsSetup:s});return n.forEach(e=>{c.registerCube(e)}),c}function i(e,t){let n=e.headers.get(`origin`),r={};return t.origin&&(typeof t.origin==`string`?r[`Access-Control-Allow-Origin`]=t.origin:Array.isArray(t.origin)?n&&t.origin.includes(n)&&(r[`Access-Control-Allow-Origin`]=n):typeof t.origin==`function`&&n&&t.origin(n)&&(r[`Access-Control-Allow-Origin`]=n)),t.methods&&(r[`Access-Control-Allow-Methods`]=t.methods.join(`, `)),t.allowedHeaders&&(r[`Access-Control-Allow-Headers`]=t.allowedHeaders.join(`, `)),t.credentials&&(r[`Access-Control-Allow-Credentials`]=`true`),r}function a(e){return async function(t){let n=i(t,e);return new Response(null,{status:200,headers:n})}}function o(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let r=t.nextUrl.searchParams.get(`query`);if(!r)return n.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(r)}catch{return n.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return n.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await a(t,r),u=s.validateQuery(c);if(!u.isValid)return n.NextResponse.json(e.i(`Query validation failed: ${u.errors.join(`, `)}`,400),{status:400});let d=t.headers.get(`x-cache-control`)===`no-cache`,f=await s.executeMultiCubeQuery(c,l,{skipCache:d}),p=e.r(c,f,s);return n.NextResponse.json(p,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js load handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function s(t){let{cors:a}=t,o=r(t);return async function(t,r){try{let r=e.a(o.getMetadata());return n.NextResponse.json(r,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js meta handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500),{status:500})}}}function c(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let r=t.nextUrl.searchParams.get(`query`);if(!r)return n.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(r)}catch{return n.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return n.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await a(t,r),u=s.validateQuery(c);if(!u.isValid)return n.NextResponse.json(e.i(`Query validation failed: ${u.errors.join(`, `)}`,400),{status:400});let d=c.measures?.[0]||c.dimensions?.[0];if(!d)return n.NextResponse.json(e.i(`No measures or dimensions specified`,400),{status:400});let f=d.split(`.`)[0],p=await s.generateSQL(f,c,l),m=e.o(c,p);return n.NextResponse.json(m,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js SQL handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`SQL generation failed`,500),{status:500})}}}function l(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let e=t.nextUrl.searchParams.get(`query`);if(!e)return n.NextResponse.json({error:`Query parameter is required`,valid:!1},{status:400});try{c=JSON.parse(e)}catch{return n.NextResponse.json({error:`Invalid JSON in query parameter`,valid:!1},{status:400})}}else return n.NextResponse.json({error:`Method not allowed`,valid:!1},{status:405});let l=await a(t,r),u=await e.f(c,l,s);return n.NextResponse.json(u,{headers:o?i(t,o):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js dry-run handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},{status:400})}}}function u(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let{queries:c}=await t.json();if(!c||!Array.isArray(c))return n.NextResponse.json(e.i(`Request body must contain a "queries" array`,400),{status:400});if(c.length===0)return n.NextResponse.json(e.i(`Queries array cannot be empty`,400),{status:400});let l=await e.u(c,await a(t,r),s,{skipCache:t.headers.get(`x-cache-control`)===`no-cache`});return n.NextResponse.json(l,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js batch handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Batch execution failed`,500),{status:500})}}}function d(e){let{extractSecurityContext:t,cors:a}=e,o=r(e);return async function(e,r){try{if(e.method!==`POST`)return n.NextResponse.json({error:`Method not allowed`},{status:405});let s=await e.json(),c=s.query||s,l=s.options||{},u=await t(e,r),d=o.validateQuery(c);if(!d.isValid)return n.NextResponse.json({error:`Query validation failed: ${d.errors.join(`, `)}`},{status:400});let f=await o.explainQuery(c,u,l);return n.NextResponse.json(f,{headers:a?i(e,a):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js explain handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Explain query failed`},{status:500})}}}function f(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await e.d(o,await t.json());return n.NextResponse.json(r,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js discover handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Discovery failed`,500),{status:500})}}}function p(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await t.json();if(!r.naturalLanguage)return n.NextResponse.json(e.i(`naturalLanguage field is required`,400),{status:400});let s=await e.m(o,r);return n.NextResponse.json(s,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js suggest handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query suggestion failed`,500),{status:500})}}}function m(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await t.json();if(!r.query)return n.NextResponse.json(e.i(`query field is required`,400),{status:400});let s=await e.h(o,r);return n.NextResponse.json(s,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js validate handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query validation failed`,500),{status:500})}}}function h(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let c=await t.json();if(!c.query)return n.NextResponse.json(e.i(`query field is required`,400),{status:400});let l=await e.p(s,await a(t,r),c);return n.NextResponse.json(l,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP load handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function g(a){let{extractSecurityContext:o,cors:s,mcp:c={enabled:!0}}=a,l=r(a);return async function(r){if(r.method===`DELETE`)return n.NextResponse.json({error:`Session termination not supported`},{status:405});if(r.method===`GET`){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},a,15e3)))}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new n.NextResponse(o,{status:200,headers:c})}if(r.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let a=t.p(r.headers.get(`origin`),c.allowedOrigins?{allowedOrigins:c.allowedOrigins}:{});if(!a.valid)return n.NextResponse.json(t.n(null,-32600,a.reason),{status:403});let u=r.headers.get(`accept`);if(!t.f(u))return n.NextResponse.json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`),{status:400});let d=t.c(Object.fromEntries(r.headers.entries()));if(!d.ok)return n.NextResponse.json({error:`Unsupported MCP protocol version`,supported:d.supported},{status:426});let f;try{f=await r.json()}catch{f=null}let p=t.l(f);if(!p)return n.NextResponse.json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`),{status:400});let m=t.m(u),h=p.method===`initialize`,g=(e,t=200,a={})=>n.NextResponse.json(e,{status:t,headers:{...s?i(r,s):{},...a}});try{let e=await t.i(p.method,p.params,{semanticLayer:l,extractSecurityContext:e=>o(e),rawRequest:r,rawResponse:null});if(t.s(p))return new n.NextResponse(null,{status:202});let a=h&&e&&typeof e==`object`&&`sessionId`in e?e.sessionId:void 0,c={};a&&(c[t.t]=a);let u=t.r(p.id??null,e);if(m){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(`id: ${a}\n\n`)),n.enqueue(e.encode(t.d(u,a))),n.close()}}),l=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,...c});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>l.set(e,t))}return new n.NextResponse(o,{status:200,headers:l})}return g(u,200,c)}catch(e){if(t.s(p))return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP notification processing error:`,e),new n.NextResponse(null,{status:202});process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP RPC handler error:`,e);let a=e?.code??-32603,o=e?.data,c=e.message||`MCP request failed`,l=t.n(p.id??null,a,c,o);if(m){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(`id: ${a}\n\n`)),n.enqueue(e.encode(t.d(l,a))),n.close()}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new n.NextResponse(o,{status:200,headers:c})}return g(l,200)}}}function _(e){let{extractSecurityContext:t,cors:a,agent:o}=e;if(!o)throw Error(`agent config is required for createAgentChatHandler`);let s=r(e);return async function(e,r){try{if(e.method!==`POST`)return n.NextResponse.json({error:`Method not allowed - use POST`},{status:405});let{handleAgentChat:c}=await Promise.resolve().then(()=>require(`../handler-DzUX7CBs.cjs`)),{message:l,sessionId:u,history:d}=await e.json();if(!l||typeof l!=`string`)return n.NextResponse.json({error:`message is required and must be a string`},{status:400});let f=(o.apiKey||``).trim();if(o.allowClientApiKey){let t=e.headers.get(`x-agent-api-key`);t&&(f=t.trim())}if(!f)return n.NextResponse.json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`},{status:401});let p=o.allowClientApiKey&&e.headers.get(`x-agent-provider`)||void 0,m=o.allowClientApiKey&&e.headers.get(`x-agent-model`)||void 0,h=o.allowClientApiKey&&e.headers.get(`x-agent-provider-endpoint`)||void 0,g=await t(e,r),_=o.buildSystemContext?.(g),v=new TextEncoder,y=new ReadableStream({async start(e){try{let t=c({message:l,sessionId:u,history:d,semanticLayer:s,securityContext:g,agentConfig:o,apiKey:f,systemContext:_,providerOverride:p,modelOverride:m,baseURLOverride:h});for await(let n of t){let t=`data: ${JSON.stringify(n)}\n\n`;e.enqueue(v.encode(t))}}catch(t){let n={type:`error`,data:{message:t instanceof Error?t.message:`Stream failed`}};e.enqueue(v.encode(`data: ${JSON.stringify(n)}\n\n`))}finally{e.close()}}}),b=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(a){let t=i(e,a);Object.entries(t).forEach(([e,t])=>b.set(e,t))}return new Response(y,{status:200,headers:b})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js agent chat handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Agent chat failed`},{status:500})}}}function v(e){let{mcp:t={enabled:!0}}=e,n={load:o(e),meta:s(e),sql:c(e),dryRun:l(e),batch:u(e),explain:d(e)};return t.enabled!==!1&&(n.mcpRpc=g(e)),e.agent&&(n.agentChat=_(e)),n}exports.createAgentChatHandler=_,exports.createBatchHandler=u,exports.createCubeHandlers=v,exports.createDiscoverHandler=f,exports.createDryRunHandler=l,exports.createExplainHandler=d,exports.createLoadHandler=o,exports.createMcpLoadHandler=h,exports.createMcpRpcHandler=g,exports.createMetaHandler=s,exports.createOptionsHandler=a,exports.createSqlHandler=c,exports.createSuggestHandler=p,exports.createValidateHandler=m;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CDExg9uP.cjs`),t=require(`../mcp-transport-CjA5_6G_.cjs`);let n=require(`next/server`);function r(e){let{cubes:n,drizzle:r,schema:i,engineType:a,cache:o,rlsSetup:s}=e;if(!n||n.length===0)throw Error(`At least one cube must be provided in the cubes array`);let c=new t.h({drizzle:r,schema:i,engineType:a,cache:o,rlsSetup:s});return n.forEach(e=>{c.registerCube(e)}),c}function i(e,t){let n=e.headers.get(`origin`),r={};return t.origin&&(typeof t.origin==`string`?r[`Access-Control-Allow-Origin`]=t.origin:Array.isArray(t.origin)?n&&t.origin.includes(n)&&(r[`Access-Control-Allow-Origin`]=n):typeof t.origin==`function`&&n&&t.origin(n)&&(r[`Access-Control-Allow-Origin`]=n)),t.methods&&(r[`Access-Control-Allow-Methods`]=t.methods.join(`, `)),t.allowedHeaders&&(r[`Access-Control-Allow-Headers`]=t.allowedHeaders.join(`, `)),t.credentials&&(r[`Access-Control-Allow-Credentials`]=`true`),r}function a(e){return async function(t){let n=i(t,e);return new Response(null,{status:200,headers:n})}}function o(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let r=t.nextUrl.searchParams.get(`query`);if(!r)return n.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(r)}catch{return n.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return n.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await a(t,r),u=s.validateQuery(c);if(!u.isValid)return n.NextResponse.json(e.i(`Query validation failed: ${u.errors.join(`, `)}`,400),{status:400});let d=t.headers.get(`x-cache-control`)===`no-cache`,f=await s.executeMultiCubeQuery(c,l,{skipCache:d}),p=e.r(c,f,s);return n.NextResponse.json(p,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js load handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function s(t){let{cors:a}=t,o=r(t);return async function(t,r){try{let r=e.a(o.getMetadata());return n.NextResponse.json(r,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js meta handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500),{status:500})}}}function c(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let r=t.nextUrl.searchParams.get(`query`);if(!r)return n.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(r)}catch{return n.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return n.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await a(t,r),u=s.validateQuery(c);if(!u.isValid)return n.NextResponse.json(e.i(`Query validation failed: ${u.errors.join(`, `)}`,400),{status:400});let d=c.measures?.[0]||c.dimensions?.[0];if(!d)return n.NextResponse.json(e.i(`No measures or dimensions specified`,400),{status:400});let f=d.split(`.`)[0],p=await s.generateSQL(f,c,l),m=e.o(c,p);return n.NextResponse.json(m,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js SQL handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`SQL generation failed`,500),{status:500})}}}function l(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let e=t.nextUrl.searchParams.get(`query`);if(!e)return n.NextResponse.json({error:`Query parameter is required`,valid:!1},{status:400});try{c=JSON.parse(e)}catch{return n.NextResponse.json({error:`Invalid JSON in query parameter`,valid:!1},{status:400})}}else return n.NextResponse.json({error:`Method not allowed`,valid:!1},{status:405});let l=await a(t,r),u=await e.f(c,l,s);return n.NextResponse.json(u,{headers:o?i(t,o):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js dry-run handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},{status:400})}}}function u(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let{queries:c}=await t.json();if(!c||!Array.isArray(c))return n.NextResponse.json(e.i(`Request body must contain a "queries" array`,400),{status:400});if(c.length===0)return n.NextResponse.json(e.i(`Queries array cannot be empty`,400),{status:400});let l=await e.u(c,await a(t,r),s,{skipCache:t.headers.get(`x-cache-control`)===`no-cache`});return n.NextResponse.json(l,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js batch handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Batch execution failed`,500),{status:500})}}}function d(e){let{extractSecurityContext:t,cors:a}=e,o=r(e);return async function(e,r){try{if(e.method!==`POST`)return n.NextResponse.json({error:`Method not allowed`},{status:405});let s=await e.json(),c=s.query||s,l=s.options||{},u=await t(e,r),d=o.validateQuery(c);if(!d.isValid)return n.NextResponse.json({error:`Query validation failed: ${d.errors.join(`, `)}`},{status:400});let f=await o.explainQuery(c,u,l);return n.NextResponse.json(f,{headers:a?i(e,a):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js explain handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Explain query failed`},{status:500})}}}function f(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await e.d(o,await t.json());return n.NextResponse.json(r,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js discover handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Discovery failed`,500),{status:500})}}}function p(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await t.json();if(!r.naturalLanguage)return n.NextResponse.json(e.i(`naturalLanguage field is required`,400),{status:400});let s=await e.m(o,r);return n.NextResponse.json(s,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js suggest handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query suggestion failed`,500),{status:500})}}}function m(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await t.json();if(!r.query)return n.NextResponse.json(e.i(`query field is required`,400),{status:400});let s=await e.h(o,r);return n.NextResponse.json(s,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js validate handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query validation failed`,500),{status:500})}}}function h(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let c=await t.json();if(!c.query)return n.NextResponse.json(e.i(`query field is required`,400),{status:400});let l=await e.p(s,await a(t,r),c);return n.NextResponse.json(l,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP load handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function g(a){let{extractSecurityContext:o,cors:s,mcp:c={enabled:!0}}=a,l=r(a);return async function(r){if(r.method===`DELETE`)return n.NextResponse.json({error:`Session termination not supported`},{status:405});if(r.method===`GET`){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},a,15e3)))}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new n.NextResponse(o,{status:200,headers:c})}if(r.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let a=t.p(r.headers.get(`origin`),c.allowedOrigins?{allowedOrigins:c.allowedOrigins}:{});if(!a.valid)return n.NextResponse.json(t.n(null,-32600,a.reason),{status:403});let u=r.headers.get(`accept`);if(!t.f(u))return n.NextResponse.json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`),{status:400});let d=t.c(Object.fromEntries(r.headers.entries()));if(!d.ok)return n.NextResponse.json({error:`Unsupported MCP protocol version`,supported:d.supported},{status:426});let f;try{f=await r.json()}catch{f=null}let p=t.l(f);if(!p)return n.NextResponse.json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`),{status:400});let m=t.m(u),h=p.method===`initialize`,g=(e,t=200,a={})=>n.NextResponse.json(e,{status:t,headers:{...s?i(r,s):{},...a}});try{let e=await t.i(p.method,p.params,{semanticLayer:l,extractSecurityContext:e=>o(e),rawRequest:r,rawResponse:null});if(t.s(p))return new n.NextResponse(null,{status:202});let a=h&&e&&typeof e==`object`&&`sessionId`in e?e.sessionId:void 0,c={};a&&(c[t.t]=a);let u=t.r(p.id??null,e);if(m){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(`id: ${a}\n\n`)),n.enqueue(e.encode(t.d(u,a))),n.close()}}),l=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,...c});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>l.set(e,t))}return new n.NextResponse(o,{status:200,headers:l})}return g(u,200,c)}catch(e){if(t.s(p))return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP notification processing error:`,e),new n.NextResponse(null,{status:202});process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP RPC handler error:`,e);let a=e?.code??-32603,o=e?.data,c=e.message||`MCP request failed`,l=t.n(p.id??null,a,c,o);if(m){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(`id: ${a}\n\n`)),n.enqueue(e.encode(t.d(l,a))),n.close()}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new n.NextResponse(o,{status:200,headers:c})}return g(l,200)}}}function _(e){let{extractSecurityContext:t,cors:a,agent:o}=e;if(!o)throw Error(`agent config is required for createAgentChatHandler`);let s=r(e);return async function(e,r){try{if(e.method!==`POST`)return n.NextResponse.json({error:`Method not allowed - use POST`},{status:405});let{handleAgentChat:c}=await Promise.resolve().then(()=>require(`../handler-DzUX7CBs.cjs`)),{message:l,sessionId:u,history:d}=await e.json();if(!l||typeof l!=`string`)return n.NextResponse.json({error:`message is required and must be a string`},{status:400});let f=(o.apiKey||``).trim();if(o.allowClientApiKey){let t=e.headers.get(`x-agent-api-key`);t&&(f=t.trim())}if(!f)return n.NextResponse.json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`},{status:401});let p=o.allowClientApiKey&&e.headers.get(`x-agent-provider`)||void 0,m=o.allowClientApiKey&&e.headers.get(`x-agent-model`)||void 0,h=o.allowClientApiKey&&e.headers.get(`x-agent-provider-endpoint`)||void 0,g=await t(e,r),_=o.buildSystemContext?.(g),v=new TextEncoder,y=new ReadableStream({async start(e){try{let t=c({message:l,sessionId:u,history:d,semanticLayer:s,securityContext:g,agentConfig:o,apiKey:f,systemContext:_,providerOverride:p,modelOverride:m,baseURLOverride:h});for await(let n of t){let t=`data: ${JSON.stringify(n)}\n\n`;e.enqueue(v.encode(t))}}catch(t){let n={type:`error`,data:{message:t instanceof Error?t.message:`Stream failed`}};e.enqueue(v.encode(`data: ${JSON.stringify(n)}\n\n`))}finally{e.close()}}}),b=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(a){let t=i(e,a);Object.entries(t).forEach(([e,t])=>b.set(e,t))}return new Response(y,{status:200,headers:b})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js agent chat handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Agent chat failed`},{status:500})}}}function v(e){let{mcp:t={enabled:!0}}=e,n={load:o(e),meta:s(e),sql:c(e),dryRun:l(e),batch:u(e),explain:d(e)};return t.enabled!==!1&&(n.mcpRpc=g(e)),e.agent&&(n.agentChat=_(e)),n}exports.createAgentChatHandler=_,exports.createBatchHandler=u,exports.createCubeHandlers=v,exports.createDiscoverHandler=f,exports.createDryRunHandler=l,exports.createExplainHandler=d,exports.createLoadHandler=o,exports.createMcpLoadHandler=h,exports.createMcpRpcHandler=g,exports.createMetaHandler=s,exports.createOptionsHandler=a,exports.createSqlHandler=c,exports.createSuggestHandler=p,exports.createValidateHandler=m;
@@ -1,5 +1,5 @@
1
1
  import { a as e, d as t, f as n, h as r, i, m as a, o, p as s, r as c, u as l } from "../utils-DkKcpkx5.js";
2
- import { c as u, d, f, h as p, i as m, l as h, m as g, n as _, p as v, r as y, s as b, t as x, u as S } from "../mcp-transport-Cdisv8il.js";
2
+ import { c as u, d, f, h as p, i as m, l as h, m as g, n as _, p as v, r as y, s as b, t as x, u as S } from "../mcp-transport-x_A7Q5OL.js";
3
3
  import { NextResponse as C } from "next/server";
4
4
  //#region src/adapters/nextjs/index.ts
5
5
  function w(e) {
@@ -1,10 +1,10 @@
1
- import { t as e } from "./chunks/chart-data-table-CGG-_R93.js";
1
+ import { t as e } from "./chunks/chart-data-table-BlkFWPhF.js";
2
2
  import { t } from "./chunks/chart-funnel-C9JRW79j.js";
3
3
  import { a as n, i as r, n as i, o as a } from "./chunks/chart-activity-grid-wR2Twpo7.js";
4
4
  import { t as o } from "./chunks/chart-area-e9ysnatQ.js";
5
- import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./chunks/charts-loader-DSdXpr7e.js";
5
+ import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./chunks/charts-loader-BFhQWB_d.js";
6
6
  import { a as m, c as h, i as g, n as _, o as v, r as y, s as b, t as x } from "./chunks/lazyChartConfigRegistry-BjhxDaSf.js";
7
- import { i as S } from "./chunks/utils-BxLeWUeg.js";
7
+ import { i as S } from "./chunks/utils-nCeVL-Hm.js";
8
8
  import { t as C } from "./chunks/chart-line-CPhQRMZ7.js";
9
9
  import { t as w } from "./chunks/chart-bar-Bx4oKlqo.js";
10
10
  import { t as T } from "./chunks/chart-pie-DafSc9sE.js";
@@ -1,14 +1,14 @@
1
- import { a as e, n as t, o as n, r, s as i, u as a } from "./vendor-QBbbDL5y.js";
2
- import { C as o, S as s, T as c, V as l, d as u, w as d } from "./chart-data-table-CGG-_R93.js";
3
- import { C as f, D as p, E as m, O as h, S as g, T as _, a as v, b as y, c as b, l as x, n as S, r as C, s as w, t as T, w as E, y as D } from "./useDebounce-BbYqb134.js";
1
+ import { a as e, n as t, o as n, r, s as i, u as a } from "./vendor-WzXX36hd.js";
2
+ import { C as o, S as s, T as c, V as l, d as u, w as d } from "./chart-data-table-BlkFWPhF.js";
3
+ import { C as f, D as p, E as m, O as h, S as g, T as _, a as v, b as y, c as b, l as x, n as S, r as C, s as w, t as T, w as E, y as D } from "./useDebounce-xfPFr2fi.js";
4
4
  import { r as ee } from "./chart-sankey-8nRYnupt.js";
5
5
  import { n as O, t as te } from "./providers-DX3Vw5kc.js";
6
6
  import { A as k } from "./chart-activity-grid-wR2Twpo7.js";
7
7
  import { u as ne } from "./chart-area-e9ysnatQ.js";
8
- import { a as re, t as A } from "./charts-loader-DSdXpr7e.js";
8
+ import { a as re, t as A } from "./charts-loader-BFhQWB_d.js";
9
9
  import { c as ie } from "./lazyChartConfigRegistry-BjhxDaSf.js";
10
10
  import { l as j } from "./retention-UEXlSdZ-.js";
11
- import { S as M, _ as ae, a as oe, b as N, c as se, g as P, h as F, i as I, l as L, m as R, n as z, o as B, p as V, r as ce, s as H, t as le, v as ue, y as de } from "./FieldSearchModal-CSzgVPdG.js";
11
+ import { S as M, _ as ae, a as oe, b as N, c as se, g as P, h as F, i as I, l as L, m as R, n as z, o as B, p as V, r as ce, s as H, t as le, v as ue, y as de } from "./FieldSearchModal-rB26lhBD.js";
12
12
  import { t as U } from "./chart-markdown-B2X4IwLO.js";
13
13
  import { n as fe, t as W } from "./useDirtyStateTracking-CgKZWkel.js";
14
14
  import G, { Component as pe, Suspense as me, createContext as he, forwardRef as ge, lazy as _e, startTransition as ve, useCallback as K, useContext as ye, useEffect as q, useImperativeHandle as be, useMemo as J, useRef as Y, useState as X } from "react";
@@ -2433,7 +2433,7 @@ function qt({ position: e, currentPalette: t, onPaletteChange: n }) {
2433
2433
  }
2434
2434
  //#endregion
2435
2435
  //#region src/client/components/AnalysisBuilderLazy.tsx
2436
- var Jt = _e(() => import("./analysis-builder-CxXZDfFR.js")), Yt = ge((e, t) => /* @__PURE__ */ Q(me, {
2436
+ var Jt = _e(() => import("./analysis-builder-CdDPUAEU.js")), Yt = ge((e, t) => /* @__PURE__ */ Q(me, {
2437
2437
  fallback: /* @__PURE__ */ Q("div", {
2438
2438
  className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:py-6",
2439
2439
  children: /* @__PURE__ */ Q(ne, {})
@@ -6675,4 +6675,4 @@ function Er({ isOpen: e, onClose: t, onSave: n, title: r, submitText: i, initial
6675
6675
  //#endregion
6676
6676
  export { tt as A, yt as C, it as D, at as E, Pe as M, Te as N, nt as O, vt as S, ot as T, Et as _, ir as a, kt as b, gt as c, Ct as d, Ot as f, St as g, Dt as h, Cr as i, ze as j, rt as k, ft as l, bt as m, Tr as n, Xt as o, Tt as p, wr as r, Yt as s, Er as t, At as u, xt as v, ct as w, _t as x, wt as y };
6677
6677
 
6678
- //# sourceMappingURL=DashboardEditModal-DsxYiMct.js.map
6678
+ //# sourceMappingURL=DashboardEditModal-kWEk4KJC.js.map