drizzle-cube 0.5.0 → 0.5.3

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 (118) hide show
  1. package/README.md +4 -0
  2. package/dist/adapters/express/index.cjs +2 -2
  3. package/dist/adapters/express/index.js +106 -102
  4. package/dist/adapters/fastify/index.cjs +2 -2
  5. package/dist/adapters/fastify/index.js +109 -105
  6. package/dist/adapters/{handler-3LGcjLtr.js → handler-BC3nFNxV.js} +2 -2
  7. package/dist/adapters/{handler-BzzbVpcl.cjs → handler-Cqf-CqAS.cjs} +2 -2
  8. package/dist/adapters/hono/index.cjs +1 -1
  9. package/dist/adapters/hono/index.js +41 -45
  10. package/dist/adapters/locale-BoiA6WiV.cjs +198 -0
  11. package/dist/adapters/{locale-DTnJrxm1.js → locale-D9VQkLXt.js} +442 -404
  12. package/dist/adapters/mcp-tools.cjs +1 -1
  13. package/dist/adapters/mcp-tools.d.ts +7 -3
  14. package/dist/adapters/mcp-tools.js +28 -28
  15. package/dist/adapters/mcp-transport-B0mgxRnJ.js +579 -0
  16. package/dist/adapters/mcp-transport-irsahKmD.cjs +39 -0
  17. package/dist/adapters/mcp-transport.d.ts +14 -2
  18. package/dist/adapters/nextjs/index.cjs +1 -1
  19. package/dist/adapters/nextjs/index.js +140 -136
  20. package/dist/adapters/{openai-C4BD8xnN.cjs → openai-B4N3KfTG.cjs} +1 -1
  21. package/dist/adapters/{openai-CaSQEduB.js → openai-BWdm0JvG.js} +1 -1
  22. package/dist/adapters/openai-CoqT_FM5.cjs +16 -0
  23. package/dist/{server/openai-CqZg6zYL.js → adapters/openai-D0Nsvc9L.js} +824 -720
  24. package/dist/adapters/{utils-DOg9oGdt.js → utils-CTYvfZ3I.js} +711 -713
  25. package/dist/adapters/{utils-DNrj-ryp.cjs → utils-XPOzzMdY.cjs} +5 -5
  26. package/dist/adapters/utils.cjs +1 -1
  27. package/dist/adapters/utils.d.ts +38 -2
  28. package/dist/adapters/utils.js +1 -1
  29. package/dist/cli/index.cjs +2 -2
  30. package/dist/client/charts.js +10 -10
  31. package/dist/client/chunks/{DashboardEditModal-cSSIAZGy.js → DashboardEditModal-IU_0dgfC.js} +12 -12
  32. package/dist/client/chunks/{DashboardEditModal-cSSIAZGy.js.map → DashboardEditModal-IU_0dgfC.js.map} +1 -1
  33. package/dist/client/chunks/{FieldSearchModal-CZNo4pNK.js → FieldSearchModal-BCWanpPX.js} +3 -3
  34. package/dist/client/chunks/{FieldSearchModal-CZNo4pNK.js.map → FieldSearchModal-BCWanpPX.js.map} +1 -1
  35. package/dist/client/chunks/KpiDelta-_igN6cJa.js +2 -0
  36. package/dist/client/chunks/KpiNumber-t5n8PtRU.js +2 -0
  37. package/dist/client/chunks/KpiText-BCZJJ6a0.js +2 -0
  38. package/dist/client/chunks/{RetentionCombinedChart-BD8tGeM_.js → RetentionCombinedChart-CQMBODsK.js} +2 -2
  39. package/dist/client/chunks/{RetentionCombinedChart-BD8tGeM_.js.map → RetentionCombinedChart-CQMBODsK.js.map} +1 -1
  40. package/dist/client/chunks/SchemaVisualization-BUUhlOvG.js +2 -0
  41. package/dist/client/chunks/SchemaVisualizationLazy-CwaPCUL0.js +2 -0
  42. package/dist/client/chunks/{analysis-builder-BeVZhiQ5.js → analysis-builder-Dm6eD_AX.js} +6 -6
  43. package/dist/client/chunks/{analysis-builder-BeVZhiQ5.js.map → analysis-builder-Dm6eD_AX.js.map} +1 -1
  44. package/dist/client/chunks/{analysis-builder-shared-BWc7ZZnG.js → analysis-builder-shared-DT5bXwCA.js} +6 -6
  45. package/dist/client/chunks/{analysis-builder-shared-BWc7ZZnG.js.map → analysis-builder-shared-DT5bXwCA.js.map} +1 -1
  46. package/dist/client/chunks/{chart-area-D63kG8OT.js → chart-area-DDti9Qtp.js} +2 -2
  47. package/dist/client/chunks/{chart-area-D63kG8OT.js.map → chart-area-DDti9Qtp.js.map} +1 -1
  48. package/dist/client/chunks/{chart-bar-BEfsCLjl.js → chart-bar-B3s9qDlh.js} +2 -2
  49. package/dist/client/chunks/{chart-bar-BEfsCLjl.js.map → chart-bar-B3s9qDlh.js.map} +1 -1
  50. package/dist/client/chunks/{chart-data-table-C3Xh9jwL.js → chart-data-table-Qrt6EAno.js} +17 -17
  51. package/dist/client/chunks/{chart-data-table-C3Xh9jwL.js.map → chart-data-table-Qrt6EAno.js.map} +1 -1
  52. package/dist/client/chunks/{chart-kpi-delta-CYE0S1x_.js → chart-kpi-delta-CgldZ7zO.js} +3 -3
  53. package/dist/client/chunks/{chart-kpi-delta-CYE0S1x_.js.map → chart-kpi-delta-CgldZ7zO.js.map} +1 -1
  54. package/dist/client/chunks/{chart-kpi-number-BlZ79xHW.js → chart-kpi-number-ByfuX1ki.js} +5 -5
  55. package/dist/client/chunks/{chart-kpi-number-BlZ79xHW.js.map → chart-kpi-number-ByfuX1ki.js.map} +1 -1
  56. package/dist/client/chunks/{chart-kpi-text-DY1BnxPe.js → chart-kpi-text-DeNuDraJ.js} +2 -2
  57. package/dist/client/chunks/{chart-kpi-text-DY1BnxPe.js.map → chart-kpi-text-DeNuDraJ.js.map} +1 -1
  58. package/dist/client/chunks/{chart-line-CBsTThTv.js → chart-line-RdZwtk27.js} +2 -2
  59. package/dist/client/chunks/{chart-line-CBsTThTv.js.map → chart-line-RdZwtk27.js.map} +1 -1
  60. package/dist/client/chunks/{chart-markdown-BWaWVkuz.js → chart-markdown-CiGRZdJj.js} +1203 -1139
  61. package/dist/client/chunks/chart-markdown-CiGRZdJj.js.map +1 -0
  62. package/dist/client/chunks/{chart-measure-profile-B41qCTBG.js → chart-measure-profile-Ckjw9bX6.js} +2 -2
  63. package/dist/client/chunks/{chart-measure-profile-B41qCTBG.js.map → chart-measure-profile-Ckjw9bX6.js.map} +1 -1
  64. package/dist/client/chunks/{chart-pie-Djbu8x2v.js → chart-pie-BvY4FY__.js} +2 -2
  65. package/dist/client/chunks/{chart-pie-Djbu8x2v.js.map → chart-pie-BvY4FY__.js.map} +1 -1
  66. package/dist/client/chunks/{chart-radar-BsTcKV0K.js → chart-radar-DjiiEAmc.js} +2 -2
  67. package/dist/client/chunks/{chart-radar-BsTcKV0K.js.map → chart-radar-DjiiEAmc.js.map} +1 -1
  68. package/dist/client/chunks/{chart-radial-bar-Du7XNnwE.js → chart-radial-bar-lla_JEYu.js} +2 -2
  69. package/dist/client/chunks/{chart-radial-bar-Du7XNnwE.js.map → chart-radial-bar-lla_JEYu.js.map} +1 -1
  70. package/dist/client/chunks/{chart-scatter-D8krEYsA.js → chart-scatter-DwXnI0rr.js} +2 -2
  71. package/dist/client/chunks/{chart-scatter-D8krEYsA.js.map → chart-scatter-DwXnI0rr.js.map} +1 -1
  72. package/dist/client/chunks/{chart-tree-map-C5C2iaWM.js → chart-tree-map-DJHoA26f.js} +2 -2
  73. package/dist/client/chunks/{chart-tree-map-C5C2iaWM.js.map → chart-tree-map-DJHoA26f.js.map} +1 -1
  74. package/dist/client/chunks/{chart-waterfall-BGdPrJ5Y.js → chart-waterfall-Y7c8csO5.js} +2 -2
  75. package/dist/client/chunks/{chart-waterfall-BGdPrJ5Y.js.map → chart-waterfall-Y7c8csO5.js.map} +1 -1
  76. package/dist/client/chunks/{core-DcfMGTVa.js → core-Dk6z6kC0.js} +2 -2
  77. package/dist/client/chunks/{core-DcfMGTVa.js.map → core-Dk6z6kC0.js.map} +1 -1
  78. package/dist/client/chunks/{exceljs.min-CcjgM-qg.js → exceljs.min-DaJsLlWM.js} +24 -24
  79. package/dist/client/chunks/{exceljs.min-CcjgM-qg.js.map → exceljs.min-DaJsLlWM.js.map} +1 -1
  80. package/dist/client/chunks/{schema-visualization-Xp60Ff2W.js → schema-visualization-DWwJukK7.js} +8 -8
  81. package/dist/client/chunks/{schema-visualization-Xp60Ff2W.js.map → schema-visualization-DWwJukK7.js.map} +1 -1
  82. package/dist/client/chunks/{syntaxHighlighting-CnDujqwg.js → syntaxHighlighting-D8J6Yt9j.js} +2 -2
  83. package/dist/client/chunks/{syntaxHighlighting-CnDujqwg.js.map → syntaxHighlighting-D8J6Yt9j.js.map} +1 -1
  84. package/dist/client/chunks/{useDebounce-CfmUMFau.js → useDebounce-DyJVREop.js} +2 -2
  85. package/dist/client/chunks/{useDebounce-CfmUMFau.js.map → useDebounce-DyJVREop.js.map} +1 -1
  86. package/dist/client/chunks/{useExplainAI-BKGmejIj.js → useExplainAI-CxSkjocM.js} +4 -4
  87. package/dist/client/chunks/{useExplainAI-BKGmejIj.js.map → useExplainAI-CxSkjocM.js.map} +1 -1
  88. package/dist/client/chunks/{utils-BldkcRHv.js → utils-BHZdKxua.js} +2 -2
  89. package/dist/client/chunks/{utils-BldkcRHv.js.map → utils-BHZdKxua.js.map} +1 -1
  90. package/dist/client/chunks/{vendor-ClXpIiea.js → vendor-CBD_Olr0.js} +8 -8
  91. package/dist/client/chunks/{vendor-ClXpIiea.js.map → vendor-CBD_Olr0.js.map} +1 -1
  92. package/dist/client/components.js +3 -3
  93. package/dist/client/hooks.js +3 -3
  94. package/dist/client/icons.js +1 -1
  95. package/dist/client/index.js +11 -11
  96. package/dist/client/providers.js +1 -1
  97. package/dist/client/schema.js +1 -1
  98. package/dist/client/utils.js +5 -5
  99. package/dist/client-bundle-stats.html +1 -1
  100. package/dist/mcp-app/mcp-app.html +39 -37
  101. package/dist/server/index.cjs +42 -42
  102. package/dist/server/index.js +1009 -971
  103. package/dist/server/{openai-D9Zjuby1.cjs → openai-BfiZU0rG.cjs} +1 -1
  104. package/dist/server/openai-BwsBio1K.cjs +16 -0
  105. package/dist/server/{openai-rwauPzCT.js → openai-CLWSwD-D.js} +1 -1
  106. package/dist/{adapters/openai-BAnEZgKZ.js → server/openai-zpXlGbbF.js} +824 -720
  107. package/package.json +2 -2
  108. package/dist/adapters/locale-DueXjqMh.cjs +0 -198
  109. package/dist/adapters/mcp-transport-45SiFcCH.cjs +0 -39
  110. package/dist/adapters/mcp-transport-Bxpc4mRy.js +0 -553
  111. package/dist/adapters/openai-4JP2B6pB.cjs +0 -16
  112. package/dist/client/chunks/KpiDelta-Dll_eCV1.js +0 -2
  113. package/dist/client/chunks/KpiNumber-BPlR92hI.js +0 -2
  114. package/dist/client/chunks/KpiText-BIxq7Jso.js +0 -2
  115. package/dist/client/chunks/SchemaVisualization-CCICjhvv.js +0 -2
  116. package/dist/client/chunks/SchemaVisualizationLazy-DraGsMx6.js +0 -2
  117. package/dist/client/chunks/chart-markdown-BWaWVkuz.js.map +0 -1
  118. package/dist/server/openai-DmuEbFd6.cjs +0 -16
package/README.md CHANGED
@@ -271,3 +271,7 @@ MIT © [Clifton Cunningham](https://github.com/cliftonc)
271
271
  ---
272
272
 
273
273
  **Built with ❤️ for the Drizzle ORM community**
274
+
275
+ ---
276
+
277
+ > This repository is maintained with the assistance of [Last Light](https://github.com/apps/last-light), an automated GitHub maintenance bot that handles issue triage, pull request reviews, and routine repository upkeep.
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-DNrj-ryp.cjs`),t=require(`../locale-DueXjqMh.cjs`),n=require(`../mcp-transport-45SiFcCH.cjs`);let r=require(`express`);r=e.v(r);let i=require(`cors`);i=e.v(i);function a(a){let{cubes:o,drizzle:s,schema:c,extractSecurityContext:l,engineType:u,cors:d,basePath:f=`/cubejs-api/v1`,jsonLimit:p=`10mb`,cache:m,mcp:h={enabled:!0},agent:g}=a;if(!o||o.length===0)throw Error(`At least one cube must be provided in the cubes array`);let _=(0,r.Router)(),v=async(e,n)=>t.r(await l(e,n),t.n(t=>e.get(t)));if(d){let e={...d,allowedHeaders:t.t(d.allowedHeaders)};_.use((0,i.default)(e))}_.use(r.default.json({limit:p})),_.use(r.default.urlencoded({extended:!0,limit:p}));let y=new t.i({drizzle:s,schema:c,engineType:u,cache:m,rlsSetup:a.rlsSetup});if(o.forEach(e=>{y.registerCube(e)}),_.post(`${f}/load`,async(t,n)=>{try{let r=t.body.query||t.body,i=await v(t,n),a=y.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 y.executeMultiCubeQuery(r,i,{skipCache:o});n.json(e.r(r,s,y))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),_.get(`${f}/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 v(t,n),o=y.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`,c=await y.executeMultiCubeQuery(i,a,{skipCache:s});n.json(e.r(i,c,y))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),_.post(`${f}/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 v(t,n),y,{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))}}),_.get(`${f}/meta`,(t,n)=>{try{let t=y.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))}}),_.post(`${f}/sql`,async(t,n)=>{try{let r=t.body,i=await v(t,n),a=y.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],c=await y.generateSQL(s,r,i);n.json(e.o(r,c))}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))}}),_.get(`${f}/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 v(t,n),o=y.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 c=s.split(`.`)[0],l=await y.generateSQL(c,i,a);n.json(e.o(i,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))}}),_.post(`${f}/dry-run`,async(t,n)=>{try{let r=await e.f(t.body.query||t.body,await v(t,n),y);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})}}),_.get(`${f}/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 v(t,n),y);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})}}),_.post(`${f}/explain`,async(e,t)=>{try{let n=e.body.query||e.body,r=e.body.options||{},i=await v(e,t),a=y.validateQuery(n);if(!a.isValid)return t.status(400).json({error:`Query validation failed: ${a.errors.join(`, `)}`});let o=await y.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`})}}),g&&_.post(`${f}/agent/chat`,async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-BzzbVpcl.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=(g.apiKey||``).trim();if(g.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=g.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,c=g.allowClientApiKey?e.headers[`x-agent-model`]:void 0,l=g.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,u=await v(e,t),d=g.buildSystemContext?.(u);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:y,securityContext:u,agentConfig:g,apiKey:o,systemContext:d,providerOverride:s,modelOverride:c,baseURLOverride:l});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`})}}),h.enabled!==!1){let e=h.basePath??`/mcp`;_.post(`${e}`,async(e,t)=>{if(h.resourceMetadataUrl&&!n.l(e.headers.authorization))return t.setHeader(`WWW-Authenticate`,n.s(h.resourceMetadataUrl)),t.status(401).json({error:`Bearer token required`});let r=n.y(e.headers.origin,h.allowedOrigins?{allowedOrigins:h.allowedOrigins}:{});if(!r.valid)return t.status(403).json(n.i(null,-32600,r.reason));let i=e.headers.accept;if(!n.v(i))return t.status(400).json(n.i(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=n.m(e.headers);if(!a.ok)return t.status(426).json({error:`Unsupported MCP protocol version`,supported:a.supported});let o=n.h(e.body);if(!o)return t.status(400).json(n.i(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=n.b(i),c=o.method===`initialize`;try{let r=await n.c(o.method,o.params,{semanticLayer:y,extractSecurityContext:(e,t)=>v(e,t),rawRequest:e,rawResponse:t,negotiatedProtocol:a.negotiated,appEnabled:!!h.app});if(n.p(o))return t.status(202).end();let i=c&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&t.setHeader(n.r,i);let l=n.a(o.id??null,r);if(s){let e=n.g();return t.status(200),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.write(`id: ${e}\n\n`),t.write(n._(l,e)),t.end()}return t.json(l)}catch(e){if(n.p(o))return console.error(`MCP notification processing error:`,String(e).replace(/\n|\r/g,``)),t.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=n.i(o.id??null,r,a,i);if(s){let e=n.g();return t.status(200),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.write(`id: ${e}\n\n`),t.write(n._(c,e)),t.end()}return t.status(200).json(c)}}),_.get(`${e}`,async(e,t)=>{if(h.resourceMetadataUrl&&!n.l(e.headers.authorization))return t.setHeader(`WWW-Authenticate`,n.s(h.resourceMetadataUrl)),t.status(401).json({error:`Bearer token required`});let r=n.g();t.status(200),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.write(n._({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{t.write(`: keep-alive
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-XPOzzMdY.cjs`),t=require(`../locale-BoiA6WiV.cjs`),n=require(`../mcp-transport-irsahKmD.cjs`);let r=require(`express`);r=e.v(r,1);let i=require(`cors`);i=e.v(i,1);function a(a){let{cubes:o,drizzle:s,schema:c,extractSecurityContext:l,engineType:u,cors:d,basePath:f=`/cubejs-api/v1`,jsonLimit:p=`10mb`,cache:m,mcp:h={enabled:!0},agent:g}=a;if(!o||o.length===0)throw Error(`At least one cube must be provided in the cubes array`);let _=(0,r.Router)(),v=async(e,n)=>t.r(await l(e,n),t.n(t=>e.get(t)));if(d){let e={...d,allowedHeaders:t.t(d.allowedHeaders)};_.use((0,i.default)(e))}_.use(r.default.json({limit:p})),_.use(r.default.urlencoded({extended:!0,limit:p}));let y=new t.i({drizzle:s,schema:c,engineType:u,cache:m,rlsSetup:a.rlsSetup});if(o.forEach(e=>{y.registerCube(e)}),_.post(`${f}/load`,async(t,n)=>{try{let r=t.body.query||t.body,i=await v(t,n),a=y.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 y.executeMultiCubeQuery(r,i,{skipCache:o});n.json(e.r(r,s,y))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),_.get(`${f}/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 v(t,n),o=y.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`,c=await y.executeMultiCubeQuery(i,a,{skipCache:s});n.json(e.r(i,c,y))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),_.post(`${f}/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 v(t,n),y,{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))}}),_.get(`${f}/meta`,(t,n)=>{try{let t=y.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))}}),_.post(`${f}/sql`,async(t,n)=>{try{let r=t.body,i=await v(t,n),a=y.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],c=await y.generateSQL(s,r,i);n.json(e.o(r,c))}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))}}),_.get(`${f}/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 v(t,n),o=y.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 c=s.split(`.`)[0],l=await y.generateSQL(c,i,a);n.json(e.o(i,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))}}),_.post(`${f}/dry-run`,async(t,n)=>{try{let r=await e.f(t.body.query||t.body,await v(t,n),y);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})}}),_.get(`${f}/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 v(t,n),y);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})}}),_.post(`${f}/explain`,async(e,t)=>{try{let n=e.body.query||e.body,r=e.body.options||{},i=await v(e,t),a=y.validateQuery(n);if(!a.isValid)return t.status(400).json({error:`Query validation failed: ${a.errors.join(`, `)}`});let o=await y.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`})}}),g&&_.post(`${f}/agent/chat`,async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-Cqf-CqAS.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=(g.apiKey||``).trim();if(g.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=g.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,c=g.allowClientApiKey?e.headers[`x-agent-model`]:void 0,l=g.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,u=await v(e,t),d=g.buildSystemContext?.(u);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:y,securityContext:u,agentConfig:g,apiKey:o,systemContext:d,providerOverride:s,modelOverride:c,baseURLOverride:l});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`})}}),h.enabled!==!1){let e=n.o(y,h.resources),t=n.v(h.prompts),r=h.basePath??`/mcp`;_.post(`${r}`,async(r,i)=>{if(h.resourceMetadataUrl&&!n.u(r.headers.authorization))return i.setHeader(`WWW-Authenticate`,n.c(h.resourceMetadataUrl)),i.status(401).json({error:`Bearer token required`});let a=n.x(r.headers.origin,h.allowedOrigins?{allowedOrigins:h.allowedOrigins}:{});if(!a.valid)return i.status(403).json(n.i(null,-32600,a.reason));let o=r.headers.accept;if(!n.b(o))return i.status(400).json(n.i(null,-32600,`Accept header must include both application/json and text/event-stream`));let s=n.h(r.headers);if(!s.ok)return i.status(426).json({error:`Unsupported MCP protocol version`,supported:s.supported});let c=n.g(r.body);if(!c)return i.status(400).json(n.i(null,-32600,`Invalid JSON-RPC 2.0 request`));let l=n.S(o),u=c.method===`initialize`;try{let a=await n.l(c.method,c.params,{semanticLayer:y,extractSecurityContext:(e,t)=>v(e,t),rawRequest:r,rawResponse:i,negotiatedProtocol:s.negotiated,resources:e,prompts:t,appEnabled:!!h.app,appConfig:typeof h.app==`object`?h.app:void 0,serverName:h.serverName});if(n.m(c))return i.status(202).end();let o=u&&a&&typeof a==`object`&&`sessionId`in a?a.sessionId:void 0;o&&i.setHeader(n.r,o);let d=n.a(c.id??null,a);if(l){let e=n._();return i.status(200),i.setHeader(`Content-Type`,`text/event-stream`),i.setHeader(`Cache-Control`,`no-cache`),i.setHeader(`Connection`,`keep-alive`),i.write(`id: ${e}\n\n`),i.write(n.y(d,e)),i.end()}return i.json(d)}catch(e){if(n.m(c))return console.error(`MCP notification processing error:`,String(e).replace(/\n|\r/g,``)),i.status(202).end();console.error(`MCP RPC error:`,String(e).replace(/\n|\r/g,``));let t=e?.code??-32603,r=e?.data,a=e.message||`MCP request failed`,o=n.i(c.id??null,t,a,r);if(l){let e=n._();return i.status(200),i.setHeader(`Content-Type`,`text/event-stream`),i.setHeader(`Cache-Control`,`no-cache`),i.setHeader(`Connection`,`keep-alive`),i.write(`id: ${e}\n\n`),i.write(n.y(o,e)),i.end()}return i.status(200).json(o)}}),_.get(`${r}`,async(e,t)=>{if(h.resourceMetadataUrl&&!n.u(e.headers.authorization))return t.setHeader(`WWW-Authenticate`,n.c(h.resourceMetadataUrl)),t.status(401).json({error:`Bearer token required`});let r=n._();t.status(200),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.write(n.y({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{t.write(`: keep-alive
2
2
 
3
- `)},15e3);e.on(`close`,()=>{clearInterval(i)})}),_.delete(`${e}`,(e,t)=>h.resourceMetadataUrl&&!n.l(e.headers.authorization)?(t.setHeader(`WWW-Authenticate`,n.s(h.resourceMetadataUrl)),t.status(401).json({error:`Bearer token required`})):t.status(405).json({error:`Session termination not supported`}))}return _.use((t,n,r,i)=>{console.error(`Express adapter error:`,t),r.headersSent||r.status(500).json(e.i(t,500))}),_}function o(e,t){let n=a(t);return e.use(`/`,n),e}function s(e){return o((0,r.default)(),e)}exports.createCubeApp=s,exports.createCubeRouter=a,exports.mountCubeRoutes=o;
3
+ `)},15e3);e.on(`close`,()=>{clearInterval(i)})}),_.delete(`${r}`,(e,t)=>h.resourceMetadataUrl&&!n.u(e.headers.authorization)?(t.setHeader(`WWW-Authenticate`,n.c(h.resourceMetadataUrl)),t.status(401).json({error:`Bearer token required`})):t.status(405).json({error:`Session termination not supported`}))}return _.use((t,n,r,i)=>{console.error(`Express adapter error:`,t),r.headersSent||r.status(500).json(e.i(t,500))}),_}function o(e,t){let n=a(t);return e.use(`/`,n),e}function s(e){return o((0,r.default)(),e)}exports.createCubeApp=s,exports.createCubeRouter=a,exports.mountCubeRoutes=o;
@@ -1,43 +1,43 @@
1
- import { a as e, f as t, i as n, o as r, r as i, u as a } from "../utils-DOg9oGdt.js";
2
- import { i as o, n as s, r as c, t as l } from "../locale-DTnJrxm1.js";
3
- import { _ as u, a as d, b as f, c as p, g as m, h, i as g, l as _, m as v, p as y, r as b, s as x, v as S, y as C } from "../mcp-transport-Bxpc4mRy.js";
4
- import w, { Router as T } from "express";
5
- import E from "cors";
1
+ import { a as e, f as t, i as n, o as r, r as i, u as a } from "../utils-CTYvfZ3I.js";
2
+ import { i as o, n as s, r as c, t as l } from "../locale-D9VQkLXt.js";
3
+ import { S as u, _ as d, a as f, b as p, c as m, g as h, h as g, i as _, l as v, m as y, o as b, r as x, u as S, v as C, x as w, y as T } from "../mcp-transport-B0mgxRnJ.js";
4
+ import E, { Router as D } from "express";
5
+ import O from "cors";
6
6
  //#region src/adapters/express/index.ts
7
- function D(D) {
8
- let { cubes: O, drizzle: k, schema: A, extractSecurityContext: j, engineType: M, cors: N, basePath: P = "/cubejs-api/v1", jsonLimit: F = "10mb", cache: I, mcp: L = { enabled: !0 }, agent: R } = D;
9
- if (!O || O.length === 0) throw Error("At least one cube must be provided in the cubes array");
10
- let z = T(), B = async (e, t) => c(await j(e, t), s((t) => e.get(t)));
11
- if (N) {
7
+ function k(k) {
8
+ let { cubes: A, drizzle: j, schema: M, extractSecurityContext: N, engineType: P, cors: F, basePath: I = "/cubejs-api/v1", jsonLimit: L = "10mb", cache: R, mcp: z = { enabled: !0 }, agent: B } = k;
9
+ if (!A || A.length === 0) throw Error("At least one cube must be provided in the cubes array");
10
+ let V = D(), H = async (e, t) => c(await N(e, t), s((t) => e.get(t)));
11
+ if (F) {
12
12
  let e = {
13
- ...N,
14
- allowedHeaders: l(N.allowedHeaders)
13
+ ...F,
14
+ allowedHeaders: l(F.allowedHeaders)
15
15
  };
16
- z.use(E(e));
16
+ V.use(O(e));
17
17
  }
18
- z.use(w.json({ limit: F })), z.use(w.urlencoded({
18
+ V.use(E.json({ limit: L })), V.use(E.urlencoded({
19
19
  extended: !0,
20
- limit: F
20
+ limit: L
21
21
  }));
22
- let V = new o({
23
- drizzle: k,
24
- schema: A,
25
- engineType: M,
26
- cache: I,
27
- rlsSetup: D.rlsSetup
22
+ let U = new o({
23
+ drizzle: j,
24
+ schema: M,
25
+ engineType: P,
26
+ cache: R,
27
+ rlsSetup: k.rlsSetup
28
28
  });
29
- if (O.forEach((e) => {
30
- V.registerCube(e);
31
- }), z.post(`${P}/load`, async (e, t) => {
29
+ if (A.forEach((e) => {
30
+ U.registerCube(e);
31
+ }), V.post(`${I}/load`, async (e, t) => {
32
32
  try {
33
- let r = e.body.query || e.body, a = await B(e, t), o = V.validateQuery(r);
33
+ let r = e.body.query || e.body, a = await H(e, t), o = U.validateQuery(r);
34
34
  if (!o.isValid) return t.status(400).json(n(`Query validation failed: ${o.errors.join(", ")}`, 400));
35
- let s = e.headers["x-cache-control"] === "no-cache", c = await V.executeMultiCubeQuery(r, a, { skipCache: s });
36
- t.json(i(r, c, V));
35
+ let s = e.headers["x-cache-control"] === "no-cache", c = await U.executeMultiCubeQuery(r, a, { skipCache: s });
36
+ t.json(i(r, c, U));
37
37
  } catch (e) {
38
38
  console.error("Query execution error:", e), t.status(500).json(n(e instanceof Error ? e.message : "Query execution failed", 500));
39
39
  }
40
- }), z.get(`${P}/load`, async (e, t) => {
40
+ }), V.get(`${I}/load`, async (e, t) => {
41
41
  try {
42
42
  let r = e.query.query;
43
43
  if (!r) return t.status(400).json(n("Query parameter is required", 400));
@@ -47,57 +47,57 @@ function D(D) {
47
47
  } catch {
48
48
  return t.status(400).json(n("Invalid JSON in query parameter", 400));
49
49
  }
50
- let o = await B(e, t), s = V.validateQuery(a);
50
+ let o = await H(e, t), s = U.validateQuery(a);
51
51
  if (!s.isValid) return t.status(400).json(n(`Query validation failed: ${s.errors.join(", ")}`, 400));
52
- let c = e.headers["x-cache-control"] === "no-cache", l = await V.executeMultiCubeQuery(a, o, { skipCache: c });
53
- t.json(i(a, l, V));
52
+ let c = e.headers["x-cache-control"] === "no-cache", l = await U.executeMultiCubeQuery(a, o, { skipCache: c });
53
+ t.json(i(a, l, U));
54
54
  } catch (e) {
55
55
  console.error("Query execution error:", e), t.status(500).json(n(e instanceof Error ? e.message : "Query execution failed", 500));
56
56
  }
57
- }), z.post(`${P}/batch`, async (e, t) => {
57
+ }), V.post(`${I}/batch`, async (e, t) => {
58
58
  try {
59
59
  let { queries: r } = e.body;
60
60
  if (!r || !Array.isArray(r)) return t.status(400).json(n("Request body must contain a \"queries\" array", 400));
61
61
  if (r.length === 0) return t.status(400).json(n("Queries array cannot be empty", 400));
62
- let i = await a(r, await B(e, t), V, { skipCache: e.headers["x-cache-control"] === "no-cache" });
62
+ let i = await a(r, await H(e, t), U, { skipCache: e.headers["x-cache-control"] === "no-cache" });
63
63
  t.json(i);
64
64
  } catch (e) {
65
65
  console.error("Batch execution error:", e), t.status(500).json(n(e instanceof Error ? e.message : "Batch execution failed", 500));
66
66
  }
67
- }), z.get(`${P}/meta`, (t, r) => {
67
+ }), V.get(`${I}/meta`, (t, r) => {
68
68
  try {
69
- let t = V.getMetadata();
69
+ let t = U.getMetadata();
70
70
  r.json(e(t));
71
71
  } catch (e) {
72
72
  console.error("Metadata error:", e), r.status(500).json(n(e instanceof Error ? e.message : "Failed to fetch metadata", 500));
73
73
  }
74
- }), z.post(`${P}/sql`, async (e, t) => {
74
+ }), V.post(`${I}/sql`, async (e, t) => {
75
75
  try {
76
- let i = e.body, a = await B(e, t), o = V.validateQuery(i);
76
+ let i = e.body, a = await H(e, t), o = U.validateQuery(i);
77
77
  if (!o.isValid) return t.status(400).json(n(`Query validation failed: ${o.errors.join(", ")}`, 400));
78
78
  let s = i.measures?.[0] || i.dimensions?.[0];
79
79
  if (!s) return t.status(400).json(n("No measures or dimensions specified", 400));
80
- let c = s.split(".")[0], l = await V.generateSQL(c, i, a);
80
+ let c = s.split(".")[0], l = await U.generateSQL(c, i, a);
81
81
  t.json(r(i, l));
82
82
  } catch (e) {
83
83
  console.error("SQL generation error:", String(e).replace(/\n|\r/g, "")), t.status(500).json(n(e instanceof Error ? e.message : "SQL generation failed", 500));
84
84
  }
85
- }), z.get(`${P}/sql`, async (e, t) => {
85
+ }), V.get(`${I}/sql`, async (e, t) => {
86
86
  try {
87
87
  let i = e.query.query;
88
88
  if (!i) return t.status(400).json(n("Query parameter is required", 400));
89
- let a = JSON.parse(i), o = await B(e, t), s = V.validateQuery(a);
89
+ let a = JSON.parse(i), o = await H(e, t), s = U.validateQuery(a);
90
90
  if (!s.isValid) return t.status(400).json(n(`Query validation failed: ${s.errors.join(", ")}`, 400));
91
91
  let c = a.measures?.[0] || a.dimensions?.[0];
92
92
  if (!c) return t.status(400).json(n("No measures or dimensions specified", 400));
93
- let l = c.split(".")[0], u = await V.generateSQL(l, a, o);
93
+ let l = c.split(".")[0], u = await U.generateSQL(l, a, o);
94
94
  t.json(r(a, u));
95
95
  } catch (e) {
96
96
  console.error("SQL generation error:", String(e).replace(/\n|\r/g, "")), t.status(500).json(n(e instanceof Error ? e.message : "SQL generation failed", 500));
97
97
  }
98
- }), z.post(`${P}/dry-run`, async (e, n) => {
98
+ }), V.post(`${I}/dry-run`, async (e, n) => {
99
99
  try {
100
- let r = await t(e.body.query || e.body, await B(e, n), V);
100
+ let r = await t(e.body.query || e.body, await H(e, n), U);
101
101
  n.json(r);
102
102
  } catch (e) {
103
103
  console.error("Dry-run error:", e), n.status(400).json({
@@ -105,14 +105,14 @@ function D(D) {
105
105
  valid: !1
106
106
  });
107
107
  }
108
- }), z.get(`${P}/dry-run`, async (e, n) => {
108
+ }), V.get(`${I}/dry-run`, async (e, n) => {
109
109
  try {
110
110
  let r = e.query.query;
111
111
  if (!r) return n.status(400).json({
112
112
  error: "Query parameter is required",
113
113
  valid: !1
114
114
  });
115
- let i = await t(JSON.parse(r), await B(e, n), V);
115
+ let i = await t(JSON.parse(r), await H(e, n), U);
116
116
  n.json(i);
117
117
  } catch (e) {
118
118
  console.error("Dry-run error:", e), n.status(400).json({
@@ -120,26 +120,26 @@ function D(D) {
120
120
  valid: !1
121
121
  });
122
122
  }
123
- }), z.post(`${P}/explain`, async (e, t) => {
123
+ }), V.post(`${I}/explain`, async (e, t) => {
124
124
  try {
125
- let n = e.body.query || e.body, r = e.body.options || {}, i = await B(e, t), a = V.validateQuery(n);
125
+ let n = e.body.query || e.body, r = e.body.options || {}, i = await H(e, t), a = U.validateQuery(n);
126
126
  if (!a.isValid) return t.status(400).json({ error: `Query validation failed: ${a.errors.join(", ")}` });
127
- let o = await V.explainQuery(n, i, r);
127
+ let o = await U.explainQuery(n, i, r);
128
128
  t.json(o);
129
129
  } catch (e) {
130
130
  console.error("Explain error:", e), t.status(500).json({ error: e instanceof Error ? e.message : "Explain query failed" });
131
131
  }
132
- }), R && z.post(`${P}/agent/chat`, async (e, t) => {
132
+ }), B && V.post(`${I}/agent/chat`, async (e, t) => {
133
133
  try {
134
- let { handleAgentChat: n } = await import("../handler-3LGcjLtr.js"), { message: r, sessionId: i, history: a } = e.body;
134
+ let { handleAgentChat: n } = await import("../handler-BC3nFNxV.js"), { message: r, sessionId: i, history: a } = e.body;
135
135
  if (!r || typeof r != "string") return t.status(400).json({ error: "message is required and must be a string" });
136
- let o = (R.apiKey || "").trim();
137
- if (R.allowClientApiKey) {
136
+ let o = (B.apiKey || "").trim();
137
+ if (B.allowClientApiKey) {
138
138
  let t = e.headers["x-agent-api-key"];
139
139
  t && (o = t.trim());
140
140
  }
141
141
  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." });
142
- let s = R.allowClientApiKey ? e.headers["x-agent-provider"] : void 0, c = R.allowClientApiKey ? e.headers["x-agent-model"] : void 0, l = R.allowClientApiKey ? e.headers["x-agent-provider-endpoint"] : void 0, u = await B(e, t), d = R.buildSystemContext?.(u);
142
+ let s = B.allowClientApiKey ? e.headers["x-agent-provider"] : void 0, c = B.allowClientApiKey ? e.headers["x-agent-model"] : void 0, l = B.allowClientApiKey ? e.headers["x-agent-provider-endpoint"] : void 0, u = await H(e, t), d = B.buildSystemContext?.(u);
143
143
  t.writeHead(200, {
144
144
  "Content-Type": "text/event-stream",
145
145
  "Cache-Control": "no-cache",
@@ -150,9 +150,9 @@ function D(D) {
150
150
  message: r,
151
151
  sessionId: i,
152
152
  history: a,
153
- semanticLayer: V,
153
+ semanticLayer: U,
154
154
  securityContext: u,
155
- agentConfig: R,
155
+ agentConfig: B,
156
156
  apiKey: o,
157
157
  systemContext: d,
158
158
  providerOverride: s,
@@ -172,54 +172,58 @@ function D(D) {
172
172
  } catch (e) {
173
173
  console.error("Agent chat error:", e), t.headersSent || t.status(500).json({ error: e instanceof Error ? e.message : "Agent chat failed" });
174
174
  }
175
- }), L.enabled !== !1) {
176
- let e = L.basePath ?? "/mcp";
177
- z.post(`${e}`, async (e, t) => {
178
- if (L.resourceMetadataUrl && !_(e.headers.authorization)) return t.setHeader("WWW-Authenticate", x(L.resourceMetadataUrl)), t.status(401).json({ error: "Bearer token required" });
179
- let n = C(e.headers.origin, L.allowedOrigins ? { allowedOrigins: L.allowedOrigins } : {});
180
- if (!n.valid) return t.status(403).json(g(null, -32600, n.reason));
181
- let r = e.headers.accept;
182
- if (!S(r)) return t.status(400).json(g(null, -32600, "Accept header must include both application/json and text/event-stream"));
183
- let i = v(e.headers);
184
- if (!i.ok) return t.status(426).json({
175
+ }), z.enabled !== !1) {
176
+ let e = b(U, z.resources), t = C(z.prompts), n = z.basePath ?? "/mcp";
177
+ V.post(`${n}`, async (n, r) => {
178
+ if (z.resourceMetadataUrl && !S(n.headers.authorization)) return r.setHeader("WWW-Authenticate", m(z.resourceMetadataUrl)), r.status(401).json({ error: "Bearer token required" });
179
+ let i = w(n.headers.origin, z.allowedOrigins ? { allowedOrigins: z.allowedOrigins } : {});
180
+ if (!i.valid) return r.status(403).json(_(null, -32600, i.reason));
181
+ let a = n.headers.accept;
182
+ if (!p(a)) return r.status(400).json(_(null, -32600, "Accept header must include both application/json and text/event-stream"));
183
+ let o = g(n.headers);
184
+ if (!o.ok) return r.status(426).json({
185
185
  error: "Unsupported MCP protocol version",
186
- supported: i.supported
186
+ supported: o.supported
187
187
  });
188
- let a = h(e.body);
189
- if (!a) return t.status(400).json(g(null, -32600, "Invalid JSON-RPC 2.0 request"));
190
- let o = f(r), s = a.method === "initialize";
188
+ let s = h(n.body);
189
+ if (!s) return r.status(400).json(_(null, -32600, "Invalid JSON-RPC 2.0 request"));
190
+ let c = u(a), l = s.method === "initialize";
191
191
  try {
192
- let n = await p(a.method, a.params, {
193
- semanticLayer: V,
194
- extractSecurityContext: (e, t) => B(e, t),
195
- rawRequest: e,
196
- rawResponse: t,
197
- negotiatedProtocol: i.negotiated,
198
- appEnabled: !!L.app
192
+ let i = await v(s.method, s.params, {
193
+ semanticLayer: U,
194
+ extractSecurityContext: (e, t) => H(e, t),
195
+ rawRequest: n,
196
+ rawResponse: r,
197
+ negotiatedProtocol: o.negotiated,
198
+ resources: e,
199
+ prompts: t,
200
+ appEnabled: !!z.app,
201
+ appConfig: typeof z.app == "object" ? z.app : void 0,
202
+ serverName: z.serverName
199
203
  });
200
- if (y(a)) return t.status(202).end();
201
- let r = s && n && typeof n == "object" && "sessionId" in n ? n.sessionId : void 0;
202
- r && t.setHeader(b, r);
203
- let c = d(a.id ?? null, n);
204
- if (o) {
205
- let e = m();
206
- return t.status(200), t.setHeader("Content-Type", "text/event-stream"), t.setHeader("Cache-Control", "no-cache"), t.setHeader("Connection", "keep-alive"), t.write(`id: ${e}\n\n`), t.write(u(c, e)), t.end();
204
+ if (y(s)) return r.status(202).end();
205
+ let a = l && i && typeof i == "object" && "sessionId" in i ? i.sessionId : void 0;
206
+ a && r.setHeader(x, a);
207
+ let u = f(s.id ?? null, i);
208
+ if (c) {
209
+ let e = d();
210
+ return r.status(200), r.setHeader("Content-Type", "text/event-stream"), r.setHeader("Cache-Control", "no-cache"), r.setHeader("Connection", "keep-alive"), r.write(`id: ${e}\n\n`), r.write(T(u, e)), r.end();
207
211
  }
208
- return t.json(c);
212
+ return r.json(u);
209
213
  } catch (e) {
210
- if (y(a)) return console.error("MCP notification processing error:", String(e).replace(/\n|\r/g, "")), t.status(202).end();
214
+ if (y(s)) return console.error("MCP notification processing error:", String(e).replace(/\n|\r/g, "")), r.status(202).end();
211
215
  console.error("MCP RPC error:", String(e).replace(/\n|\r/g, ""));
212
- let n = e?.code ?? -32603, r = e?.data, i = e.message || "MCP request failed", s = g(a.id ?? null, n, i, r);
213
- if (o) {
214
- let e = m();
215
- return t.status(200), t.setHeader("Content-Type", "text/event-stream"), t.setHeader("Cache-Control", "no-cache"), t.setHeader("Connection", "keep-alive"), t.write(`id: ${e}\n\n`), t.write(u(s, e)), t.end();
216
+ let t = e?.code ?? -32603, n = e?.data, i = e.message || "MCP request failed", a = _(s.id ?? null, t, i, n);
217
+ if (c) {
218
+ let e = d();
219
+ return r.status(200), r.setHeader("Content-Type", "text/event-stream"), r.setHeader("Cache-Control", "no-cache"), r.setHeader("Connection", "keep-alive"), r.write(`id: ${e}\n\n`), r.write(T(a, e)), r.end();
216
220
  }
217
- return t.status(200).json(s);
221
+ return r.status(200).json(a);
218
222
  }
219
- }), z.get(`${e}`, async (e, t) => {
220
- if (L.resourceMetadataUrl && !_(e.headers.authorization)) return t.setHeader("WWW-Authenticate", x(L.resourceMetadataUrl)), t.status(401).json({ error: "Bearer token required" });
221
- let n = m();
222
- t.status(200), t.setHeader("Content-Type", "text/event-stream"), t.setHeader("Cache-Control", "no-cache"), t.setHeader("Connection", "keep-alive"), t.write(u({
223
+ }), V.get(`${n}`, async (e, t) => {
224
+ if (z.resourceMetadataUrl && !S(e.headers.authorization)) return t.setHeader("WWW-Authenticate", m(z.resourceMetadataUrl)), t.status(401).json({ error: "Bearer token required" });
225
+ let n = d();
226
+ t.status(200), t.setHeader("Content-Type", "text/event-stream"), t.setHeader("Cache-Control", "no-cache"), t.setHeader("Connection", "keep-alive"), t.write(T({
223
227
  jsonrpc: "2.0",
224
228
  method: "mcp/ready",
225
229
  params: { protocol: "streamable-http" }
@@ -230,18 +234,18 @@ function D(D) {
230
234
  e.on("close", () => {
231
235
  clearInterval(r);
232
236
  });
233
- }), z.delete(`${e}`, (e, t) => L.resourceMetadataUrl && !_(e.headers.authorization) ? (t.setHeader("WWW-Authenticate", x(L.resourceMetadataUrl)), t.status(401).json({ error: "Bearer token required" })) : t.status(405).json({ error: "Session termination not supported" }));
237
+ }), V.delete(`${n}`, (e, t) => z.resourceMetadataUrl && !S(e.headers.authorization) ? (t.setHeader("WWW-Authenticate", m(z.resourceMetadataUrl)), t.status(401).json({ error: "Bearer token required" })) : t.status(405).json({ error: "Session termination not supported" }));
234
238
  }
235
- return z.use((e, t, r, i) => {
239
+ return V.use((e, t, r, i) => {
236
240
  console.error("Express adapter error:", e), r.headersSent || r.status(500).json(n(e, 500));
237
- }), z;
241
+ }), V;
238
242
  }
239
- function O(e, t) {
240
- let n = D(t);
243
+ function A(e, t) {
244
+ let n = k(t);
241
245
  return e.use("/", n), e;
242
246
  }
243
- function k(e) {
244
- return O(w(), e);
247
+ function j(e) {
248
+ return A(E(), e);
245
249
  }
246
250
  //#endregion
247
- export { k as createCubeApp, D as createCubeRouter, O as mountCubeRoutes };
251
+ export { j as createCubeApp, k as createCubeRouter, A as mountCubeRoutes };
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-DNrj-ryp.cjs`),t=require(`../locale-DueXjqMh.cjs`),n=require(`../mcp-transport-45SiFcCH.cjs`);var r=function(r,i,a){let{cubes:o,drizzle:s,schema:c,extractSecurityContext:l,engineType:u,cors:d,basePath:f=`/cubejs-api/v1`,bodyLimit:p=10485760,cache:m,mcp:h={enabled:!0},agent:g}=i;if(!o||o.length===0)return a(Error(`At least one cube must be provided in the cubes array`));let _=async e=>t.r(await l(e),t.n(t=>e.headers[t.toLowerCase()]));if(d){let e={...d,allowedHeaders:t.t(d.allowedHeaders)};r.register(import(`@fastify/cors`),e)}r.addHook(`onRequest`,async(e,t)=>{e.method===`POST`&&(e.body=void 0)});let v=new t.i({drizzle:s,schema:c,engineType:u,cache:m,rlsSetup:i.rlsSetup});if(o.forEach(e=>{v.registerCube(e)}),r.post(`${f}/load`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=r.query||r,a=await _(t),o=v.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 v.executeMultiCubeQuery(i,a,{skipCache:s}),v)}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))}}),r.get(`${f}/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 _(t),o=v.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`,c=await v.executeMultiCubeQuery(i,a,{skipCache:s});return e.r(i,c,v)}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))}}),r.post(`${f}/batch`,{bodyLimit:p,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 _(t),v,{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))}}),r.get(`${f}/meta`,async(t,n)=>{try{return e.a(v.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))}}),r.post(`${f}/sql`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=await _(t),a=v.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 v.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))}}),r.get(`${f}/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 _(t),o=v.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 c=s.split(`.`)[0];return e.o(i,await v.generateSQL(c,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))}}),r.post(`${f}/dry-run`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let n=t.body;return await e.f(n.query||n,await _(t),v)}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})}}),r.get(`${f}/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 _(t),v)}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})}}),r.post(`${f}/explain`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let n=e.body,r=n.query||n,i=n.options||{},a=await _(e),o=v.validateQuery(r);return o.isValid?await v.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`})}}),g&&r.post(`${f}/agent/chat`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-BzzbVpcl.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=(g.apiKey||``).trim();if(g.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=g.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,c=g.allowClientApiKey?e.headers[`x-agent-model`]:void 0,l=g.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,u=await _(e),d=g.buildSystemContext?.(u);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:v,securityContext:u,agentConfig:g,apiKey:o,systemContext:d,providerOverride:s,modelOverride:c,baseURLOverride:l});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`})}}),h.enabled!==!1){let e=h.basePath??`/mcp`;r.post(`${e}`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{if(h.resourceMetadataUrl&&!n.l(e.headers.authorization))return t.header(`WWW-Authenticate`,n.s(h.resourceMetadataUrl)),t.status(401).send({error:`Bearer token required`});let r=n.y(e.headers.origin,h.allowedOrigins?{allowedOrigins:h.allowedOrigins}:{});if(!r.valid)return t.status(403).send(n.i(null,-32600,r.reason));let i=e.headers.accept;if(!n.v(i))return t.status(400).send(n.i(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=n.m(e.headers);if(!a.ok)return t.status(426).send({error:`Unsupported MCP protocol version`,supported:a.supported});let o=n.h(e.body);if(!o)return t.status(400).send(n.i(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=n.b(i),c=o.method===`initialize`;try{let r=await n.c(o.method,o.params,{semanticLayer:v,extractSecurityContext:(e,t)=>_(e),rawRequest:e,rawResponse:t,negotiatedProtocol:a.negotiated,appEnabled:!!h.app});if(n.p(o))return t.status(202).send();let i=c&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&t.header(n.r,i);let l=n.a(o.id??null,r);if(s){let e=n.g();t.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${n._(l,e)}`);return}return t.send(l)}catch(r){if(n.p(o))return e.log.error({err:String(r).replace(/\n|\r/g,``)},`MCP notification processing error`),t.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=n.i(o.id??null,i,c,a);if(s){let e=n.g();t.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${n._(l,e)}`);return}return t.send(l)}}),r.get(`${e}`,async(e,t)=>{if(h.resourceMetadataUrl&&!n.l(e.headers.authorization))return t.header(`WWW-Authenticate`,n.s(h.resourceMetadataUrl)),t.status(401).send({error:`Bearer token required`});let r=n.g();t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),t.raw.write(n._({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{t.raw.write(`: keep-alive
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-XPOzzMdY.cjs`),t=require(`../locale-BoiA6WiV.cjs`),n=require(`../mcp-transport-irsahKmD.cjs`);var r=function(r,i,a){let{cubes:o,drizzle:s,schema:c,extractSecurityContext:l,engineType:u,cors:d,basePath:f=`/cubejs-api/v1`,bodyLimit:p=10485760,cache:m,mcp:h={enabled:!0},agent:g}=i;if(!o||o.length===0)return a(Error(`At least one cube must be provided in the cubes array`));let _=async e=>t.r(await l(e),t.n(t=>e.headers[t.toLowerCase()]));if(d){let e={...d,allowedHeaders:t.t(d.allowedHeaders)};r.register(import(`@fastify/cors`),e)}r.addHook(`onRequest`,async(e,t)=>{e.method===`POST`&&(e.body=void 0)});let v=new t.i({drizzle:s,schema:c,engineType:u,cache:m,rlsSetup:i.rlsSetup});if(o.forEach(e=>{v.registerCube(e)}),r.post(`${f}/load`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=r.query||r,a=await _(t),o=v.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 v.executeMultiCubeQuery(i,a,{skipCache:s}),v)}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))}}),r.get(`${f}/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 _(t),o=v.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`,c=await v.executeMultiCubeQuery(i,a,{skipCache:s});return e.r(i,c,v)}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))}}),r.post(`${f}/batch`,{bodyLimit:p,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 _(t),v,{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))}}),r.get(`${f}/meta`,async(t,n)=>{try{return e.a(v.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))}}),r.post(`${f}/sql`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=await _(t),a=v.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 v.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))}}),r.get(`${f}/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 _(t),o=v.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 c=s.split(`.`)[0];return e.o(i,await v.generateSQL(c,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))}}),r.post(`${f}/dry-run`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let n=t.body;return await e.f(n.query||n,await _(t),v)}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})}}),r.get(`${f}/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 _(t),v)}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})}}),r.post(`${f}/explain`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let n=e.body,r=n.query||n,i=n.options||{},a=await _(e),o=v.validateQuery(r);return o.isValid?await v.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`})}}),g&&r.post(`${f}/agent/chat`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-Cqf-CqAS.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=(g.apiKey||``).trim();if(g.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=g.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,c=g.allowClientApiKey?e.headers[`x-agent-model`]:void 0,l=g.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,u=await _(e),d=g.buildSystemContext?.(u);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:v,securityContext:u,agentConfig:g,apiKey:o,systemContext:d,providerOverride:s,modelOverride:c,baseURLOverride:l});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`})}}),h.enabled!==!1){let e=n.o(v,h.resources),t=n.v(h.prompts),i=h.basePath??`/mcp`;r.post(`${i}`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(r,i)=>{if(h.resourceMetadataUrl&&!n.u(r.headers.authorization))return i.header(`WWW-Authenticate`,n.c(h.resourceMetadataUrl)),i.status(401).send({error:`Bearer token required`});let a=n.x(r.headers.origin,h.allowedOrigins?{allowedOrigins:h.allowedOrigins}:{});if(!a.valid)return i.status(403).send(n.i(null,-32600,a.reason));let o=r.headers.accept;if(!n.b(o))return i.status(400).send(n.i(null,-32600,`Accept header must include both application/json and text/event-stream`));let s=n.h(r.headers);if(!s.ok)return i.status(426).send({error:`Unsupported MCP protocol version`,supported:s.supported});let c=n.g(r.body);if(!c)return i.status(400).send(n.i(null,-32600,`Invalid JSON-RPC 2.0 request`));let l=n.S(o),u=c.method===`initialize`;try{let a=await n.l(c.method,c.params,{semanticLayer:v,extractSecurityContext:(e,t)=>_(e),rawRequest:r,rawResponse:i,negotiatedProtocol:s.negotiated,resources:e,prompts:t,appEnabled:!!h.app,appConfig:typeof h.app==`object`?h.app:void 0,serverName:h.serverName});if(n.m(c))return i.status(202).send();let o=u&&a&&typeof a==`object`&&`sessionId`in a?a.sessionId:void 0;o&&i.header(n.r,o);let d=n.a(c.id??null,a);if(l){let e=n._();i.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${n.y(d,e)}`);return}return i.send(d)}catch(e){if(n.m(c))return r.log.error({err:String(e).replace(/\n|\r/g,``)},`MCP notification processing error`),i.status(202).send();r.log.error({err:String(e).replace(/\n|\r/g,``)},`MCP RPC error`);let t=e?.code??-32603,a=e?.data,o=e.message||`MCP request failed`,s=n.i(c.id??null,t,o,a);if(l){let e=n._();i.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${n.y(s,e)}`);return}return i.send(s)}}),r.get(`${i}`,async(e,t)=>{if(h.resourceMetadataUrl&&!n.u(e.headers.authorization))return t.header(`WWW-Authenticate`,n.c(h.resourceMetadataUrl)),t.status(401).send({error:`Bearer token required`});let r=n._();t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),t.raw.write(n.y({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{t.raw.write(`: keep-alive
2
2
 
3
- `)},15e3);e.raw.on(`close`,()=>{clearInterval(i)})}),r.delete(`${e}`,async(e,t)=>h.resourceMetadataUrl&&!n.l(e.headers.authorization)?(t.header(`WWW-Authenticate`,n.s(h.resourceMetadataUrl)),t.status(401).send({error:`Bearer token required`})):t.status(405).send({error:`Session termination not supported`}))}r.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))),a()};async function i(e,t){await e.register(r,t)}function a(e){let t=require(`fastify`)({logger:!0});return t.register(r,e),t}exports.createCubeApp=a,exports.cubePlugin=r,exports.registerCubeRoutes=i;
3
+ `)},15e3);e.raw.on(`close`,()=>{clearInterval(i)})}),r.delete(`${i}`,async(e,t)=>h.resourceMetadataUrl&&!n.u(e.headers.authorization)?(t.header(`WWW-Authenticate`,n.c(h.resourceMetadataUrl)),t.status(401).send({error:`Bearer token required`})):t.status(405).send({error:`Session termination not supported`}))}r.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))),a()};async function i(e,t){await e.register(r,t)}function a(e){let t=require(`fastify`)({logger:!0});return t.register(r,e),t}exports.createCubeApp=a,exports.cubePlugin=r,exports.registerCubeRoutes=i;