drizzle-cube 0.9.4 → 0.9.5

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 (176) hide show
  1. package/dist/adapters/ActivityGridChart.config-BXelP_3e.cjs +1 -0
  2. package/dist/adapters/ActivityGridChart.config-BjOOT9bc.js +2 -0
  3. package/dist/adapters/AreaChart.config-B9PiH7Kt.js +2 -0
  4. package/dist/adapters/AreaChart.config-Bv39EDi8.cjs +1 -0
  5. package/dist/adapters/BarChart.config-CU-XGdDO.cjs +1 -0
  6. package/dist/adapters/BarChart.config-D9OIP1uN.js +2 -0
  7. package/dist/adapters/BoxPlotChart.config-C3cLagI6.js +2 -0
  8. package/dist/adapters/BoxPlotChart.config-CMwswa9H.cjs +1 -0
  9. package/dist/adapters/BubbleChart.config--rvyga9s.js +2 -0
  10. package/dist/adapters/BubbleChart.config-DOCLeg91.cjs +1 -0
  11. package/dist/adapters/CandlestickChart.config-B8h__isO.cjs +1 -0
  12. package/dist/adapters/CandlestickChart.config-DPzi-8B_.js +2 -0
  13. package/dist/adapters/DataTable.config-Dn2PyQdy.cjs +1 -0
  14. package/dist/adapters/DataTable.config-wtCGsLPw.js +2 -0
  15. package/dist/adapters/DotStripChart.config-BFshbpk0.cjs +1 -0
  16. package/dist/adapters/DotStripChart.config-c-tbauT6.js +2 -0
  17. package/dist/adapters/FunnelChart.config-CZYDI4k-.js +2 -0
  18. package/dist/adapters/FunnelChart.config-Dc2pIfJy.cjs +1 -0
  19. package/dist/adapters/GaugeChart.config-C9LYrKB1.cjs +1 -0
  20. package/dist/adapters/GaugeChart.config-DD73ueqk.js +2 -0
  21. package/dist/adapters/HeatMapChart.config-5DgOpgpV.js +2 -0
  22. package/dist/adapters/HeatMapChart.config-BZgQ255E.cjs +1 -0
  23. package/dist/adapters/KpiDelta.config-BEB3XqML.cjs +1 -0
  24. package/dist/adapters/KpiDelta.config-DeRkPIxD.js +2 -0
  25. package/dist/adapters/KpiNumber.config-CxpTAKzR.cjs +1 -0
  26. package/dist/adapters/KpiNumber.config-DM1dRQL-.js +2 -0
  27. package/dist/adapters/KpiText.config-Dt59uikm.js +2 -0
  28. package/dist/adapters/KpiText.config-Dt_pW6mK.cjs +1 -0
  29. package/dist/adapters/LineChart.config-YeXia1kV.cjs +1 -0
  30. package/dist/adapters/LineChart.config-jX2ulNmq.js +2 -0
  31. package/dist/adapters/MarkdownChart.config-BAXU79ec.js +2 -0
  32. package/dist/adapters/MarkdownChart.config-BP6_9ET2.cjs +1 -0
  33. package/dist/adapters/MeasureProfileChart.config-BW2gdPaM.cjs +1 -0
  34. package/dist/adapters/MeasureProfileChart.config-CSxeKHnS.js +2 -0
  35. package/dist/adapters/PieChart.config-Ci3ZPY9U.cjs +1 -0
  36. package/dist/adapters/PieChart.config-DtCSYlvx.js +2 -0
  37. package/dist/adapters/ProportionBarChart.config-B71wPMKX.js +2 -0
  38. package/dist/adapters/ProportionBarChart.config-Bihgdn8v.cjs +1 -0
  39. package/dist/adapters/RadarChart.config-CC8jIJ78.js +2 -0
  40. package/dist/adapters/RadarChart.config-D7dCuKRM.cjs +1 -0
  41. package/dist/adapters/RadialBarChart.config-DC2nQk5q.js +2 -0
  42. package/dist/adapters/RadialBarChart.config-Dumbvnj1.cjs +1 -0
  43. package/dist/adapters/RecordsTable.config-BRqLDmY3.cjs +1 -0
  44. package/dist/adapters/RecordsTable.config-D1wlIO1v.js +2 -0
  45. package/dist/adapters/RetentionCombinedChart.config-DejP7Hcc.cjs +1 -0
  46. package/dist/adapters/RetentionCombinedChart.config-yDEDWwJt.js +2 -0
  47. package/dist/adapters/RetentionHeatmap.config-BSqTkHB8.cjs +1 -0
  48. package/dist/adapters/RetentionHeatmap.config-GRJjblsW.js +2 -0
  49. package/dist/adapters/SankeyChart.config-9b1eT_2V.js +2 -0
  50. package/dist/adapters/SankeyChart.config-n8ro9EZU.cjs +1 -0
  51. package/dist/adapters/ScatterChart.config-BHqhTxPV.cjs +1 -0
  52. package/dist/adapters/ScatterChart.config-Bub2V8Ge.js +2 -0
  53. package/dist/adapters/SunburstChart.config-CxG0NFqN.js +2 -0
  54. package/dist/adapters/SunburstChart.config-PmN9LEb5.cjs +1 -0
  55. package/dist/adapters/TreeMapChart.config-D2S3rG6P.js +2 -0
  56. package/dist/adapters/TreeMapChart.config-TC4dciRa.cjs +1 -0
  57. package/dist/adapters/WaterfallChart.config-BirJq5VE.cjs +1 -0
  58. package/dist/adapters/WaterfallChart.config-DYMzte7F.js +2 -0
  59. package/dist/adapters/express/index.cjs +1 -1
  60. package/dist/adapters/express/index.js +1 -1
  61. package/dist/adapters/fastify/index.cjs +1 -1
  62. package/dist/adapters/fastify/index.js +1 -1
  63. package/dist/adapters/{handler-DXfEc3Gg.cjs → handler-CP-6A8X3.cjs} +2 -2
  64. package/dist/adapters/{handler-BM5qe8yt.js → handler-mwSVmP0z.js} +30 -30
  65. package/dist/adapters/hono/index.cjs +1 -1
  66. package/dist/adapters/hono/index.js +1 -1
  67. package/dist/adapters/nextjs/index.cjs +1 -1
  68. package/dist/adapters/nextjs/index.js +1 -1
  69. package/dist/adapters/{openai-4uH2LLR4.cjs → openai-B82IDfp4.cjs} +1 -1
  70. package/dist/{server/openai-CgiNtz4I.js → adapters/openai-BKDrN7u0.js} +1 -1
  71. package/dist/adapters/openai-BaNGQmmK.cjs +19 -0
  72. package/dist/adapters/{openai-CjhgJRPV.js → openai-CeNMQU8r.js} +3312 -2509
  73. package/dist/client/charts.js +2 -2
  74. package/dist/client/chunks/{DashboardEditModal-DyweH8_q.js → DashboardEditModal-3_odkGXU.js} +899 -842
  75. package/dist/client/chunks/DashboardEditModal-3_odkGXU.js.map +1 -0
  76. package/dist/client/chunks/{RecordsTable-B4FqKr9E.js → RecordsTable-zy4EWyWx.js} +2 -2
  77. package/dist/client/chunks/{RecordsTable-B4FqKr9E.js.map → RecordsTable-zy4EWyWx.js.map} +1 -1
  78. package/dist/client/chunks/{analysis-builder-CL8WUtUY.js → analysis-builder-UhPaVPsn.js} +7 -7
  79. package/dist/client/chunks/{analysis-builder-CL8WUtUY.js.map → analysis-builder-UhPaVPsn.js.map} +1 -1
  80. package/dist/client/chunks/{analysis-builder-shared-CuKa4wqd.js → analysis-builder-shared-DS_eJnM8.js} +6 -6
  81. package/dist/client/chunks/{analysis-builder-shared-CuKa4wqd.js.map → analysis-builder-shared-DS_eJnM8.js.map} +1 -1
  82. package/dist/client/chunks/{chart-data-table-xLM9byGS.js → chart-data-table-DkkQtuY6.js} +2 -3
  83. package/dist/client/chunks/chart-data-table-DkkQtuY6.js.map +1 -0
  84. package/dist/client/chunks/{chart-kpi-delta-CDU8rcmS.js → chart-kpi-delta-Cih5Vh_Z.js} +2 -2
  85. package/dist/client/chunks/{chart-kpi-delta-CDU8rcmS.js.map → chart-kpi-delta-Cih5Vh_Z.js.map} +1 -1
  86. package/dist/client/chunks/{chart-kpi-number-BnoXaY00.js → chart-kpi-number-Z5zpxeKR.js} +3 -3
  87. package/dist/client/chunks/{chart-kpi-number-BnoXaY00.js.map → chart-kpi-number-Z5zpxeKR.js.map} +1 -1
  88. package/dist/client/chunks/{chart-kpi-text-5S_G6DFl.js → chart-kpi-text-glMTySe4.js} +2 -2
  89. package/dist/client/chunks/{chart-kpi-text-5S_G6DFl.js.map → chart-kpi-text-glMTySe4.js.map} +1 -1
  90. package/dist/client/chunks/{charts-loader-C9PPgWxv.js → charts-loader-DuV9kYN8.js} +7 -7
  91. package/dist/client/chunks/{charts-loader-C9PPgWxv.js.map → charts-loader-DuV9kYN8.js.map} +1 -1
  92. package/dist/client/chunks/{schema-visualization-4Vi5vrFa.js → schema-visualization-DIn9gy5O.js} +2 -2
  93. package/dist/client/chunks/{schema-visualization-4Vi5vrFa.js.map → schema-visualization-DIn9gy5O.js.map} +1 -1
  94. package/dist/client/chunks/{useDirtyStateTracking-olnTnFb1.js → useDirtyStateTracking-giMoYB90.js} +2 -2
  95. package/dist/client/chunks/{useDirtyStateTracking-olnTnFb1.js.map → useDirtyStateTracking-giMoYB90.js.map} +1 -1
  96. package/dist/client/chunks/{useExplainAI-DlZ22fsT.js → useExplainAI-CpFZbdn-.js} +4 -4
  97. package/dist/client/chunks/{useExplainAI-DlZ22fsT.js.map → useExplainAI-CpFZbdn-.js.map} +1 -1
  98. package/dist/client/chunks/{vendor-DYXrJcMx.js → vendor-wyAsikWW.js} +2 -2
  99. package/dist/client/chunks/{vendor-DYXrJcMx.js.map → vendor-wyAsikWW.js.map} +1 -1
  100. package/dist/client/components.js +1 -1
  101. package/dist/client/hooks.js +3 -3
  102. package/dist/client/icons.js +1 -1
  103. package/dist/client/index.js +7 -7
  104. package/dist/client/providers.js +1 -1
  105. package/dist/client/schema.js +1 -1
  106. package/dist/client/utils.js +2 -2
  107. package/dist/client-bundle-stats.html +1 -1
  108. package/dist/server/index.cjs +1 -1
  109. package/dist/server/index.js +1 -1
  110. package/dist/server/openai-Cxii1K2N.cjs +19 -0
  111. package/dist/server/{openai-DJbxudVD.cjs → openai-DC2ye24o.cjs} +1 -1
  112. package/dist/{adapters/openai-xpb8URhX.js → server/openai-Jt2WUOXm.js} +1 -1
  113. package/dist/server/{openai-BISsKb5q.js → openai-aLi6lmJs.js} +3312 -2509
  114. package/package.json +2 -2
  115. package/dist/adapters/ActivityGridChart.config-5Dw4ikvc.cjs +0 -1
  116. package/dist/adapters/ActivityGridChart.config-kf_mi0WP.js +0 -2
  117. package/dist/adapters/AreaChart.config-BZ6R4fa-.js +0 -2
  118. package/dist/adapters/AreaChart.config-CNKWBlma.cjs +0 -1
  119. package/dist/adapters/BarChart.config-DH8FeanY.cjs +0 -1
  120. package/dist/adapters/BarChart.config-DvNsHkbz.js +0 -2
  121. package/dist/adapters/BoxPlotChart.config-CSUdgbS3.js +0 -2
  122. package/dist/adapters/BoxPlotChart.config-DIkF7bNu.cjs +0 -1
  123. package/dist/adapters/BubbleChart.config-Cikl7Bjb.cjs +0 -1
  124. package/dist/adapters/BubbleChart.config-D34u-Hlu.js +0 -2
  125. package/dist/adapters/CandlestickChart.config-CW7oM2j2.js +0 -2
  126. package/dist/adapters/CandlestickChart.config-sZ4T7z6E.cjs +0 -1
  127. package/dist/adapters/DataTable.config-Dt3RTa86.cjs +0 -1
  128. package/dist/adapters/DataTable.config-b2Ps3QCD.js +0 -2
  129. package/dist/adapters/DotStripChart.config-1xHVgdbM.cjs +0 -1
  130. package/dist/adapters/DotStripChart.config-CXPdK6mj.js +0 -2
  131. package/dist/adapters/FunnelChart.config-DoQ6DoI6.cjs +0 -1
  132. package/dist/adapters/FunnelChart.config-TBJ8wc5T.js +0 -2
  133. package/dist/adapters/GaugeChart.config-BH1voNKO.cjs +0 -1
  134. package/dist/adapters/GaugeChart.config-BXZOfLvb.js +0 -2
  135. package/dist/adapters/HeatMapChart.config-BrJhG4sD.js +0 -2
  136. package/dist/adapters/HeatMapChart.config-DQyOyT8-.cjs +0 -1
  137. package/dist/adapters/KpiDelta.config-B7zqzeE4.js +0 -2
  138. package/dist/adapters/KpiDelta.config-PwxW3cY6.cjs +0 -1
  139. package/dist/adapters/KpiNumber.config-Cx8cFl8G.cjs +0 -1
  140. package/dist/adapters/KpiNumber.config-PfuS6HY8.js +0 -2
  141. package/dist/adapters/KpiText.config-BAGxU8eA.cjs +0 -1
  142. package/dist/adapters/KpiText.config-hpoBkwuU.js +0 -2
  143. package/dist/adapters/LineChart.config-CsUVse0Q.cjs +0 -1
  144. package/dist/adapters/LineChart.config-PnIgjyxG.js +0 -2
  145. package/dist/adapters/MarkdownChart.config-BnKKOYz7.js +0 -2
  146. package/dist/adapters/MarkdownChart.config-CvZ6e5Pm.cjs +0 -1
  147. package/dist/adapters/MeasureProfileChart.config-BAKjdSaE.js +0 -2
  148. package/dist/adapters/MeasureProfileChart.config-zTYarMOX.cjs +0 -1
  149. package/dist/adapters/PieChart.config-B5DWuB7p.cjs +0 -1
  150. package/dist/adapters/PieChart.config-DRJ-TEHx.js +0 -2
  151. package/dist/adapters/ProportionBarChart.config-CkWlUXVL.js +0 -2
  152. package/dist/adapters/ProportionBarChart.config-j5hZGdiK.cjs +0 -1
  153. package/dist/adapters/RadarChart.config-BGdcb-vd.js +0 -2
  154. package/dist/adapters/RadarChart.config-COjDDQIQ.cjs +0 -1
  155. package/dist/adapters/RadialBarChart.config-Bn6WyAZJ.cjs +0 -1
  156. package/dist/adapters/RadialBarChart.config-CKtx2iHt.js +0 -2
  157. package/dist/adapters/RecordsTable.config-BoyiHRTW.cjs +0 -1
  158. package/dist/adapters/RecordsTable.config-DIaOnBzA.js +0 -2
  159. package/dist/adapters/RetentionCombinedChart.config-COijZvyV.js +0 -2
  160. package/dist/adapters/RetentionCombinedChart.config-Dqn8yDyE.cjs +0 -1
  161. package/dist/adapters/RetentionHeatmap.config-Dg81G--t.cjs +0 -1
  162. package/dist/adapters/RetentionHeatmap.config-KBahnEBw.js +0 -2
  163. package/dist/adapters/SankeyChart.config-CU5cIUfw.cjs +0 -1
  164. package/dist/adapters/SankeyChart.config-e2PoqHK4.js +0 -2
  165. package/dist/adapters/ScatterChart.config-CFalq9dc.cjs +0 -1
  166. package/dist/adapters/ScatterChart.config-Cu87WDER.js +0 -2
  167. package/dist/adapters/SunburstChart.config-Cl3xYxse.cjs +0 -1
  168. package/dist/adapters/SunburstChart.config-XKWhwuJc.js +0 -2
  169. package/dist/adapters/TreeMapChart.config-CwPjwIMi.js +0 -2
  170. package/dist/adapters/TreeMapChart.config-DeDuzwj-.cjs +0 -1
  171. package/dist/adapters/WaterfallChart.config-CQyfg1cz.js +0 -2
  172. package/dist/adapters/WaterfallChart.config-Cr3XZuwl.cjs +0 -1
  173. package/dist/adapters/openai-BoLyuR1l.cjs +0 -19
  174. package/dist/client/chunks/DashboardEditModal-DyweH8_q.js.map +0 -1
  175. package/dist/client/chunks/chart-data-table-xLM9byGS.js.map +0 -1
  176. package/dist/server/openai-D1PmqQem.cjs +0 -19
@@ -821,4 +821,4 @@ The query is validated before adding. The portlet fetches its own data.`,paramet
821
821
  [IMPORTANT: Your next response MUST start with a brief text message BEFORE any tool calls. Now call add_markdown and add_portlet to visualize these results.]`}}catch(t){let n={measures:e.measures,dimensions:e.dimensions,filters:e.filters,timeDimensions:e.timeDimensions,order:e.order,limit:e.limit,...e.funnel?{funnel:e.funnel}:{},...e.flow?{flow:e.flow}:{},...e.retention?{retention:e.retention}:{}};return{result:`Query execution failed: ${t instanceof Error?t.message:`Unknown error`}\n\nAttempted query:\n${JSON.stringify(n,null,2)}`,isError:!0}}});function s(e){let r={number:`kpiNumber`,retention:`retentionHeatmap`}[e.chartType]??e.chartType,i;try{i=JSON.parse(e.query)}catch{return{error:"Invalid query: could not parse JSON string. Ensure `query` is a valid JSON string."}}i=rf(i);let a=t.validateQuery(i,n);if(!a.isValid)return{error:`Invalid query — fix these errors and retry:\n${a.errors.join(`
822
822
  `)}\n\nAttempted query:\n${JSON.stringify(i,null,2)}`};let o=!!(i.funnel||i.flow||i.retention),s,c=r,l;if(o)s=e.chartConfig??{};else{let t=Ep(r,e.chartConfig,i);c=t.chartType,l=t.note;let n=Ap(c,e.chartConfig,i),a=Tp(c,n,i);if(!a.isValid)return{error:`Chart config invalid — fix these errors and retry:\n${a.errors.join(`
823
823
  `)}\n\nchartType: ${c}\nAttempted chartConfig:\n${JSON.stringify(n,null,2)}\n\nQuery:\n${JSON.stringify(i,null,2)}`};s=n}return{portlet:{query:JSON.stringify(i),chartType:c,chartConfig:s,displayConfig:e.displayConfig},...l?{note:l}:{}}}return r.set(`add_portlet`,async e=>{let t=s({query:e.query,chartType:e.chartType,chartConfig:e.chartConfig,displayConfig:e.displayConfig});if(`error`in t)return{result:t.error,isError:!0};let n=`portlet-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,r={id:n,title:e.title,...t.portlet};return i.set(n,r),{result:`Portlet "${e.title}" added to notebook (id: ${n}, chart: ${r.chartType}).`+(t.note?`\n${t.note}`:``)+` [Reminder: in your next response, start with a brief sentence about what you will do next BEFORE making any tool calls.]`,sideEffect:{type:`add_portlet`,data:r}}}),r.set(`update_portlet`,async e=>{let t=e.portletId,n=t?i.get(t):void 0,r=e.query??n?.query,a=e.chartType??n?.chartType;if(!t||!r||!a)return{result:`Cannot update portlet "${t??``}": it was not added in this conversation, so there is nothing to merge your change into. Call update_portlet again with the same portletId plus the full \`query\` and \`chartType\` for the chart you want.`,isError:!0};let o=s({query:r,chartType:a,chartConfig:e.chartConfig??n?.chartConfig,displayConfig:e.displayConfig??n?.displayConfig});if(`error`in o)return{result:o.error,isError:!0};let c=e.title??n?.title??`Untitled`,l={id:t,title:c,...o.portlet};return i.set(t,l),{result:`Portlet "${c}" updated (id: ${t}, chart: ${l.chartType}).`+(o.note?`\n${o.note}`:``)+` [Reminder: in your next response, start with a brief sentence about what you will do next BEFORE making any tool calls.]`,sideEffect:{type:`update_portlet`,data:l}}}),r.set(`add_markdown`,async e=>{let t=e.content||e.text||e.markdown||``;if(typeof t!=`string`||t.trim()===``)return{result:"add_markdown was called with no content, so no block was added. Call add_markdown again with the explanation text in the `content` field.",isError:!0};let n=`markdown-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,r={id:n,title:e.title,content:t};return{result:`Markdown block added to notebook (id: ${n}). [Reminder: in your next response, start with a brief sentence about what you will do next BEFORE making any tool calls.]`,sideEffect:{type:`add_markdown`,data:r}}}),r.set(`save_as_dashboard`,async e=>{try{let r=e.portlets;if(!r||r.length===0)return{result:`Dashboard must contain at least one portlet.`,isError:!0};let i=[],a=new Map,o=new Map;for(let e of r){let r=e.chartType,s=r===`markdown`,c=e.query;if(!c){if(s)continue;i.push(`Portlet "${e.title}": missing query`);continue}let l;try{l=JSON.parse(c)}catch{i.push(`Portlet "${e.title}": invalid JSON query`);continue}if(l=rf(l),s&&!zp(l))continue;let u=t.validateQuery(l,n);if(!u.isValid){i.push(`Portlet "${e.title}": ${u.errors.join(`, `)}`);continue}if(s){o.set(e,r);continue}let d=Ep(r,e.chartConfig,l).chartType,f=Ap(d,e.chartConfig,l),p=Tp(d,f,l);if(!p.isValid){i.push(`Portlet "${e.title}": ${p.errors.join(`, `)}`);continue}a.set(e,f),o.set(e,d)}if(i.length>0)return{result:`Dashboard has invalid portlets — fix these errors and retry:\n${i.join(`
824
- `)}`,isError:!0};let s={portlets:r.map(e=>{let t=o.get(e)??e.chartType,n=t===`markdown`,r=n?`query`:e.analysisType||`query`,i=r===`funnel`?`funnel`:r===`flow`?`flow`:r===`retention`?`retention`:`query`,s=e.query||`{}`,c;try{c=JSON.parse(s)}catch{c={}}let l={version:1,analysisType:i,activeView:`chart`,charts:{[i]:{chartType:t,chartConfig:a.get(e)??e.chartConfig??{},displayConfig:e.displayConfig||{}}},query:n&&!zp(c)?{}:c};return{id:e.id,title:e.title,analysisConfig:l,dashboardFilterMapping:e.dashboardFilterMapping,w:e.w,h:e.h,x:e.x,y:e.y}}),filters:e.filters,colorPalette:e.colorPalette},c=e.title;return{result:`Dashboard "${c}" created with ${s.portlets.length} portlets and ${s.filters?.length||0} filters.`,sideEffect:{type:`dashboard_saved`,data:{title:c,description:e.description,dashboardConfig:s}}}}catch(e){return{result:`Failed to save dashboard: ${e instanceof Error?e.message:`Unknown error`}`,isError:!0}}}),r}async function Wp(e,t,n){switch(e){case`anthropic`:{let{AnthropicProvider:e}=await Promise.resolve().then(()=>require("./anthropic-CqLkud62.cjs"));return new e(t)}case`openai`:{let{OpenAIProvider:e}=await Promise.resolve().then(()=>require("./openai-DJbxudVD.cjs"));return new e(t,n)}case`google`:{let{GoogleProvider:e}=await Promise.resolve().then(()=>require("./google-6pofxIfm.cjs"));return new e(t)}default:throw Error(`Unknown LLM provider: "${e}". Supported providers: anthropic, openai, google`)}}function Gp(e,t){if(Array.isArray(t))for(let n of t)e.push(n);else e.push(t)}function Q(e){if(e)try{e()}catch{}}function Kp(e,t){let n=[];if(!e||e.length===0)return n;for(let r of e){if(r.role===`user`){n.push({role:`user`,content:r.content});continue}if(r.role!==`assistant`)continue;let e=[];if(r.content&&e.push({type:`text`,text:r.content}),r.toolCalls&&r.toolCalls.length>0){for(let t of r.toolCalls)e.push({type:`tool_use`,id:t.id,name:t.name,input:t.input||{}});n.push({role:`assistant`,content:e});let i=r.toolCalls.map(e=>({toolUseId:e.id,toolName:e.name,content:typeof e.result==`string`?e.result:JSON.stringify(e.result??``),isError:e.status===`error`}));Gp(n,t.formatToolResults(i))}else e.length>0&&n.push({role:`assistant`,content:r.content})}return n}function qp(e,t){if(e?.type===`tool_use`&&t)try{e.input=JSON.parse(t)}catch{e.input={},e.inputParseError=!0}}function Jp(e,t){let n=e.contentBlocks[e.contentBlocks.length-1];n&&n.type===`text`?n.text=(n.text||``)+t:e.contentBlocks.push({type:`text`,text:t})}function Yp(e,t){e.currentBlockIsToolUse&&e.currentToolInputJson&&qp(e.contentBlocks[e.contentBlocks.length-1],e.currentToolInputJson),e.contentBlocks.push({type:`tool_use`,id:t.id,name:t.name,input:{},...t.metadata?{metadata:t.metadata}:{}}),e.currentToolInputJson=``,e.currentBlockIsToolUse=!0}function Xp(e,t){if(t.id&&t.input){let n=e.contentBlocks.find(e=>e.type===`tool_use`&&e.id===t.id);n&&(n.input=t.input,t.parseError&&(n.inputParseError=!0))}else if(e.currentBlockIsToolUse){let t=e.contentBlocks[e.contentBlocks.length-1];t?.type===`tool_use`&&e.currentToolInputJson&&(qp(t,e.currentToolInputJson),e.currentToolInputJson=``),e.currentBlockIsToolUse=!1}}async function*Zp(e,t){let n={contentBlocks:[],currentToolInputJson:``,currentBlockIsToolUse:!1,stopReason:``};for await(let r of e.parseStreamEvents(t)){let e=r;switch(e.type){case`text_delta`:Jp(n,e.text),yield{type:`text_delta`,data:e.text};break;case`tool_use_start`:Yp(n,e),yield{type:`tool_use_start`,data:{id:e.id,name:e.name,input:void 0}};break;case`tool_input_delta`:n.currentToolInputJson+=e.json;break;case`tool_use_end`:Xp(n,e);break;case`message_meta`:e.inputTokens!=null&&(n.inputTokens=e.inputTokens),e.outputTokens!=null&&(n.outputTokens=e.outputTokens),e.stopReason&&(n.stopReason=e.stopReason)}}return{contentBlocks:n.contentBlocks,stopReason:n.stopReason,inputTokens:n.inputTokens,outputTokens:n.outputTokens}}async function*Qp(e,t){let{executor:n,observability:r,traceId:i,turn:a}=t,o=e.name,s=e.input||{},c=e.id;if(e.inputParseError){let e=`Could not parse the arguments you sent for ${o} — they were not valid JSON, so the tool was not run. Call it again with well-formed JSON arguments.`;return yield{type:`tool_use_result`,data:{id:c,name:o,result:e,isError:!0}},Q(()=>r?.onToolEnd?.({traceId:i,turn:a,toolName:o,toolUseId:c,isError:!0,durationMs:0})),{toolUseId:c,toolName:o,content:e,isError:!0}}let l=n.get(o);if(!l)return yield{type:`tool_use_result`,data:{id:c,name:o,result:`Unknown tool: ${o}`,isError:!0}},{toolUseId:c,toolName:o,content:`Unknown tool: ${o}`,isError:!0};let u=Date.now();try{let e=await l(s);return e.sideEffect&&(yield e.sideEffect),yield{type:`tool_use_result`,data:{id:c,name:o,input:s,result:e.result,...e.isError?{isError:!0}:{}}},Q(()=>r?.onToolEnd?.({traceId:i,turn:a,toolName:o,toolUseId:c,isError:!!e.isError,durationMs:Date.now()-u})),{toolUseId:c,toolName:o,content:e.result,...e.isError?{isError:!0}:{}}}catch(e){let t=e instanceof Error?e.message:`Tool execution failed`;return yield{type:`tool_use_result`,data:{id:c,name:o,result:t,isError:!0}},Q(()=>r?.onToolEnd?.({traceId:i,turn:a,toolName:o,toolUseId:c,isError:!0,durationMs:Date.now()-u})),{toolUseId:c,toolName:o,content:t,isError:!0}}}async function*$p(e,t){let n=[];for(let r of e){if(r.type!==`tool_use`)continue;let e=yield*Qp(r,t);n.push(e)}return n}var em={anthropic:`claude-sonnet-4-6`,openai:`gpt-4.1-mini`,google:`gemini-3-flash-preview`};async function*tm(e){let{message:t,history:n,semanticLayer:r,securityContext:i,agentConfig:a,apiKey:o}=e,s=e.sessionId||crypto.randomUUID(),c=a.observability,l=crypto.randomUUID(),u=Date.now(),d=e.providerOverride||a.provider||`anthropic`,f=e.modelOverride||a.model||em[d]||`claude-sonnet-4-6`,p=e.baseURLOverride||a.baseURL,m=a.maxTurns||25,h=a.maxTokens||8192,g;try{g=await Wp(d,o,{baseURL:p})}catch(e){console.error(`[agent] Failed to create %s provider: %s`,String(d).replace(/\n|\r/g,``),String(e instanceof Error?e.message:e).replace(/\n|\r/g,``)),yield{type:`error`,data:{message:e instanceof Error?e.message:D(`server.errors.llmInitFailed`)}};return}let _=Hp(),v=Up({semanticLayer:r,securityContext:i}),y=Fd(r.getMetadata(i));e.systemContext&&(y+=`\n\n## User Context\n\n${e.systemContext}`),Q(()=>c?.onChatStart?.({traceId:l,sessionId:s,message:t,model:f,historyLength:n?.length??0}));let b=Kp(n,g);b.push({role:`user`,content:t});let ee=0;try{for(let e=0;e<m;e++){ee=e+1;let t=await g.createStream({model:f,maxTokens:h,system:y,tools:_,messages:b}),n=Date.now(),{contentBlocks:r,stopReason:i,inputTokens:a,outputTokens:o}=yield*Zp(g,t);if(Q(()=>c?.onGenerationEnd?.({traceId:l,turn:e,model:f,stopReason:i,inputTokens:a,outputTokens:o,durationMs:Date.now()-n,input:b,output:r})),b.push({role:`assistant`,content:r}),g.isTruncated(i)){yield{type:`error`,data:{message:D(`server.errors.agentResponseTruncated`)}};break}if(!g.shouldContinue(i))break;let s=yield*$p(r,{executor:v,observability:c,traceId:l,turn:e});yield{type:`turn_complete`,data:{}},Gp(b,g.formatToolResults(s))}Q(()=>c?.onChatEnd?.({traceId:l,sessionId:s,totalTurns:ee,durationMs:Date.now()-u})),yield{type:`done`,data:{sessionId:s||``,traceId:l}}}catch(e){try{c?.onChatEnd?.({traceId:l,sessionId:s,totalTurns:0,durationMs:Date.now()-u,error:e instanceof Error?e.message:`Unknown error`})}catch{}console.error(`[agent] Chat error (provider=%s, model=%s): %s`,String(d).replace(/\n|\r/g,``),String(f).replace(/\n|\r/g,``),String(e instanceof Error?e.message:e).replace(/\n|\r/g,``)),yield{type:`error`,data:{message:g.formatError(e)}}}}function nm(e){return e.toISOString().split(`T`)[0]}function rm(e,t){let n=new Date,r=nm(n);if(/days?/.test(t)){let t=new Date(n);return t.setDate(t.getDate()-e),{dateRange:[nm(t),r],granularity:`day`}}if(/weeks?/.test(t)){let t=new Date(n);return t.setDate(t.getDate()-e*7),{dateRange:[nm(t),r],granularity:e<=4?`day`:`week`}}if(/months?/.test(t)){let t=new Date(n);return t.setMonth(t.getMonth()-e),{dateRange:[nm(t),r],granularity:e<=3?`day`:`month`}}return null}function im(e){let t=parseInt(e.slice(1),10),n=new Date().getFullYear(),r=(t-1)*3,i=new Date(n,r,1),a=new Date(n,r+3,0);return{dateRange:[nm(i),nm(a)],granularity:`month`}}function am(e,t,n,r){let i=0;for(let a of e.measures){let e=[(a.name.split(`.`).pop()||a.name).toLowerCase(),a.title.toLowerCase(),...(a.synonyms||[]).map(e=>e.toLowerCase())];for(let o of e)if(t.includes(o)){n.push(a.name),r.push(`Matched measure '${a.name}' via keyword '${o}'`),i+=.15;break}}return i}function om(e,t,n,r){let i=e.measures.filter(e=>e.type===t.type);if(i.length>0){n.push(i[0].name),r.push(`Suggested ${i[0].name} based on ${t.type} intent`);return}if(t.type===`count`){let t=e.measures.find(e=>e.type===`count`||e.type===`countDistinct`);t&&(n.push(t.name),r.push(`Suggested ${t.name} for counting`))}}function sm(e,t,n,r,i){let a=0;for(let n of t){let t=$d(e,n,`dimension`);t&&(r.push(t.field),i.push(`Matched dimension '${t.field}' from grouping keyword '${n}'`),a+=.1)}for(let t of e)for(let e of t.dimensions){let t=[(e.name.split(`.`).pop()||e.name).toLowerCase(),e.title.toLowerCase(),...(e.synonyms||[]).map(e=>e.toLowerCase())];for(let o of t)if(n.includes(o)&&!r.includes(e.name)&&(n.includes(`by ${o}`)||n.includes(`per ${o}`))){r.push(e.name),i.push(`Matched dimension '${e.name}' as grouping`),a+=.1;break}}return a}function cm(){let e=new Date,t=e.toISOString().split(`T`)[0],n=e=>e.toISOString().split(`T`)[0],r=e=>new Date(e.getFullYear(),e.getMonth(),1),i=e=>new Date(e.getFullYear(),0,1),a=e=>{let t=Math.floor(e.getMonth()/3);return new Date(e.getFullYear(),t*3,1)},o=e=>{let t=e.getDay(),n=e.getDate()-t+(t===0?-6:1);return new Date(e.getFullYear(),e.getMonth(),n)};return[{pattern:/\btoday\b/i,getDateRange:()=>[t,t],granularity:`day`},{pattern:/\byesterday\b/i,getDateRange:()=>{let t=new Date(e);t.setDate(t.getDate()-1);let r=n(t);return[r,r]},granularity:`day`},{pattern:/\bthis week\b/i,getDateRange:()=>[n(o(e)),t],granularity:`day`},{pattern:/\blast week\b/i,getDateRange:()=>{let t=new Date(o(e));t.setDate(t.getDate()-7);let r=new Date(t);return r.setDate(r.getDate()+6),[n(t),n(r)]},granularity:`day`},{pattern:/\bthis month\b/i,getDateRange:()=>[n(r(e)),t],granularity:`day`},{pattern:/\blast month\b/i,getDateRange:()=>{let t=new Date(e.getFullYear(),e.getMonth()-1,1),r=new Date(e.getFullYear(),e.getMonth(),0);return[n(t),n(r)]},granularity:`day`},{pattern:/\bthis quarter\b/i,getDateRange:()=>[n(a(e)),t],granularity:`month`},{pattern:/\blast quarter\b/i,getDateRange:()=>{let t=new Date(a(e));t.setMonth(t.getMonth()-3);let r=new Date(a(e));return r.setDate(r.getDate()-1),[n(t),n(r)]},granularity:`month`},{pattern:/\bthis year\b/i,getDateRange:()=>[n(i(e)),t],granularity:`month`},{pattern:/\blast year\b/i,getDateRange:()=>{let t=new Date(e.getFullYear()-1,0,1),r=new Date(e.getFullYear()-1,11,31);return[n(t),n(r)]},granularity:`month`},{pattern:/\blast (\d+) days?\b/i,getDateRange:()=>{let r=new Date(e);return r.setDate(r.getDate()-7),[n(r),t]},granularity:`day`},{pattern:/\blast (\d+) weeks?\b/i,getDateRange:()=>{let r=new Date(e);return r.setDate(r.getDate()-28),[n(r),t]},granularity:`week`},{pattern:/\blast (\d+) months?\b/i,getDateRange:()=>{let r=new Date(e);return r.setMonth(r.getMonth()-3),[n(r),t]},granularity:`month`},{pattern:/\bq([1-4])\b/i,getDateRange:()=>[n(new Date(e.getFullYear(),0,1)),n(new Date(e.getFullYear(),2,31))],granularity:`month`}]}var lm={funnel:/\b(funnel|conversion|drop.?off|steps?|journey|pipeline|stages?)\b/i,flow:/\b(flows?|paths?|sequence|before|after|next|previous|user.?journey)\b/i,retention:/\b(retention|cohort|return|churn|comeback|retained|day.?\d+)\b/i};function um(e){let t=e.toLowerCase();return lm.funnel.test(t)?`funnel`:lm.flow.test(t)?`flow`:lm.retention.test(t)?`retention`:`query`}function dm(e,t){let n=t||`the relevant cube`;switch(e){case`funnel`:return[`Use /mcp/discover to get ${n} funnel configuration and schema`,`Query the event dimension to discover available event types for funnel steps`,`Build funnel query with discovered values using the schema from discover`];case`flow`:return[`Use /mcp/discover to get ${n} flow configuration and schema`,`Query the event dimension to discover available event types`,`Build flow query specifying the starting event and steps before/after`];case`retention`:return[`Use /mcp/discover to get ${n} retention configuration and schema`,`Build retention query specifying granularity (day/week/month) and number of periods`]}}function fm(e){let t=cm(),n=e.toLowerCase();for(let e of t){let t=n.match(e.pattern);if(t){if(t[1]&&/^\d+$/.test(t[1])){let e=rm(parseInt(t[1],10),n);if(e)return e}return/^q[1-4]$/i.test(t[0])?im(t[0]):{dateRange:e.getDateRange(),granularity:e.granularity}}}return null}function pm(e){let t=e.toLowerCase();for(let{pattern:e,type:n}of[{pattern:/\b(total|sum|combined)\b/i,type:`sum`},{pattern:/\b(count|number of|how many)\b/i,type:`count`},{pattern:/\b(average|avg|mean)\b/i,type:`avg`},{pattern:/\b(maximum|max|highest|top)\b/i,type:`max`},{pattern:/\b(minimum|min|lowest|bottom)\b/i,type:`min`}])if(e.test(t))return{type:n,confidence:.8};return null}function mm(e){let t=e.toLowerCase(),n=[],r=/\bby\s+(\w+(?:\s+\w+)?)/gi,i;for(;(i=r.exec(t))!==null;)n.push(i[1].trim());let a=/\bper\s+(\w+)/gi;for(;(i=a.exec(t))!==null;)n.push(i[1].trim());let o=/\bfor each\s+(\w+)/gi;for(;(i=o.exec(t))!==null;)n.push(i[1].trim());return n}function hm(e,t,n,r,i){if(n){let t=e.find(e=>e.name===n);return t?(r.push(`Using specified cube: ${n}`),[t]):(i.push(`Specified cube '${n}' not found`),[])}let a=Qd(e,{intent:t,limit:3}).map(t=>e.find(e=>e.name===t.cube)).filter(e=>e!==void 0);return a.length>0&&r.push(`Identified relevant cubes: ${a.map(e=>e.name).join(`, `)}`),a}function gm(e,t){return e===`query`?{query:{},confidence:0,reasoning:[`Could not identify relevant cubes for this query`],warnings:t,analysisMode:e,nextSteps:void 0}:{query:{},confidence:.7,reasoning:[`Detected ${e} intent from natural language`],warnings:t,analysisMode:e,nextSteps:dm(e,void 0)}}function _m(e,t,n){let r=[],i=[],a={},o=um(t),s=hm(e,t,n,r,i);if(s.length===0)return gm(o,i);let c=s[0],l=.5,u=pm(t);u&&(r.push(`Detected ${u.type} aggregation intent`),l+=.1);let d=[],f=t.toLowerCase();l+=am(c,f,d,r),d.length===0&&u&&om(c,u,d,r),d.length===0&&c.measures.length>0&&(d.push(c.measures[0].name),r.push(`Using default measure: ${c.measures[0].name}`),i.push(`Could not determine specific measure from query, using default`)),a.measures=d;let p=mm(t),m=[];l+=sm(s,p,f,m,r),m.length>0&&(a.dimensions=m);let h=fm(t);if(h){let e=c.dimensions.find(e=>e.type===`time`);if(e){let t={dimension:e.name,dateRange:h.dateRange};h.granularity&&(t.granularity=h.granularity),a.timeDimensions=[t],r.push(`Applied time filter: ${h.dateRange[0]} to ${h.dateRange[1]}`),l+=.15}else i.push(`Time expression found but no time dimension in cube`)}if(l=Math.min(1,l),o!==`query`){let e=s.length>0?s[0].name:void 0;return{query:{},confidence:.7,reasoning:[`Detected ${o} intent from natural language`,...e?[`Found relevant cube: ${e}`]:[]],warnings:i.length>0?i:void 0,analysisMode:o,nextSteps:dm(o,e)}}return{query:a,confidence:l,reasoning:r,warnings:i.length>0?i:void 0,analysisMode:`query`}}function $(e,t,n,r){e?typeof e==`string`&&n(e,r):r.push({type:`syntax_error`,message:D(t)})}function vm(e,t){return e.map(e=>t.get(e)||e)}function ym(e,t){if(t.size===0)return;let n=JSON.parse(JSON.stringify(e));return n.measures&&=vm(n.measures,t),n.dimensions&&=vm(n.dimensions,t),n.timeDimensions&&=n.timeDimensions.map(e=>({...e,dimension:t.get(e.dimension)||e.dimension})),n}function bm(e,t){e.measures&&e.measures.length>10&&t.push({type:`performance`,message:D(`server.validation.ai.performanceManyMeasures`,{count:e.measures.length}),suggestion:D(`server.validation.ai.suggestSplitQueries`)}),e.dimensions&&e.dimensions.length>5&&t.push({type:`performance`,message:D(`server.validation.ai.performanceManyDimensions`,{count:e.dimensions.length}),suggestion:D(`server.validation.ai.suggestAddDimensionFilters`)})}function xm(e,t,n){let[r]=e.split(`.`),i=t.find(e=>e.name===r);if(!i)return;let a=i.dimensions.find(t=>t.name===e);a&&a.type!==`time`&&n.push({type:`best_practice`,message:D(`server.validation.ai.dimensionNotTimeType`,{dimension:e,type:a.type}),field:e,suggestion:D(`server.validation.ai.suggestUseTimeDimension`)})}function Sm(e,t,n,r,i){let a=e.member,o=a.split(`.`);if(o.length!==2){n.push({type:`invalid_filter`,message:D(`server.validation.ai.invalidFilterMemberFormat`,{member:a}),field:a});return}let[s,c]=o,l=t.find(e=>e.name===s);if(!l){let e=i(s,t.map(e=>e.name));e&&r.set(a,`${e.field}.${c}`),n.push({type:`cube_not_found`,message:D(`server.validation.ai.cubeNotFoundInFilter`,{cubeName:s}),field:a,suggestion:e?`Did you mean '${e.field}'?`:void 0,correctedValue:e?`${e.field}.${c}`:void 0});return}let u=l.dimensions.some(e=>e.name===a),d=l.measures.some(e=>e.name===a);if(u||d)return;let f=i(c,[...l.dimensions.map(e=>e.name.split(`.`).pop()),...l.measures.map(e=>e.name.split(`.`).pop())]);if(f){let e=`${s}.${f.field}`;r.set(a,e),n.push({type:`invalid_filter`,message:D(`server.validation.ai.filterFieldNotFoundWithSuggestion`,{fieldName:c,cubeName:s}),field:a,suggestion:`Did you mean '${f.field}'?`,correctedValue:e})}else n.push({type:`invalid_filter`,message:D(`server.validation.ai.filterFieldNotFound`,{fieldName:c,cubeName:s}),field:a})}function Cm(e,t){let n=null;for(let r of t){let t=Ud(e.toLowerCase(),r.toLowerCase());t<=3&&(!n||t<n.distance)&&(n={field:r,distance:t})}return n}function wm(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:D(`server.validation.ai.invalidMeasureFormat`,{measure:e}),field:e});return}let[a,o]=i,s=t.find(e=>e.name===a);if(!s){let i=t.map(e=>e.name),s=Cm(a,i);s?(n.push({type:`cube_not_found`,message:D(`server.validation.ai.cubeNotFoundWithSuggestion`,{cubeName:a}),field:e,suggestion:`Did you mean '${s.field}'?`,correctedValue:`${s.field}.${o}`}),r.set(e,`${s.field}.${o}`)):n.push({type:`cube_not_found`,message:D(`server.validation.ai.cubeNotFoundWithAvailable`,{cubeName:a}),field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.measures.some(t=>t.name===e)){let i=$d(t,o,`measure`);if(i&&i.cube===a)n.push({type:`measure_not_found`,message:D(`server.validation.ai.measureNotFoundWithSuggestion`,{measureName:o,cubeName:a}),field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:i.field}),r.set(e,i.field);else{let t=s.measures.map(e=>e.name.split(`.`).pop()),i=Cm(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`measure_not_found`,message:D(`server.validation.ai.measureNotFoundWithSuggestion`,{measureName:o,cubeName:a}),field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:t}),r.set(e,t)}else n.push({type:`measure_not_found`,message:D(`server.validation.ai.measureNotFoundWithAvailable`,{measureName:o,cubeName:a}),field:e,suggestion:`Available measures: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function Tm(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:D(`server.validation.ai.invalidDimensionFormat`,{dimension:e}),field:e});return}let[a,o]=i,s=t.find(e=>e.name===a);if(!s){let i=t.map(e=>e.name),s=Cm(a,i);s?(n.push({type:`cube_not_found`,message:D(`server.validation.ai.cubeNotFoundWithSuggestion`,{cubeName:a}),field:e,suggestion:`Did you mean '${s.field}'?`,correctedValue:`${s.field}.${o}`}),r.set(e,`${s.field}.${o}`)):n.push({type:`cube_not_found`,message:D(`server.validation.ai.cubeNotFoundWithAvailable`,{cubeName:a}),field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.dimensions.some(t=>t.name===e)){let i=$d(t,o,`dimension`);if(i&&i.cube===a)n.push({type:`dimension_not_found`,message:D(`server.validation.ai.dimensionNotFoundWithSuggestion`,{dimensionName:o,cubeName:a}),field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:i.field}),r.set(e,i.field);else{let t=s.dimensions.map(e=>e.name.split(`.`).pop()),i=Cm(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`dimension_not_found`,message:D(`server.validation.ai.dimensionNotFoundWithSuggestion`,{dimensionName:o,cubeName:a}),field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:t}),r.set(e,t)}else n.push({type:`dimension_not_found`,message:D(`server.validation.ai.dimensionNotFoundWithAvailable`,{dimensionName:o,cubeName:a}),field:e,suggestion:`Available dimensions: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function Em(e,t,n,r){for(let i of e){if(`and`in i&&Array.isArray(i.and)){Em(i.and,t,n,r);continue}if(`or`in i&&Array.isArray(i.or)){Em(i.or,t,n,r);continue}`member`in i&&Sm(i,t,n,r,Cm)}}function Dm(e,t,n,r,i){let a=e.funnel;if(!a)return;let o=(e,n)=>Tm(e,t,n,i);if($(a.bindingKey,`server.validation.ai.bindingKeyRequired.funnel`,o,n),$(a.timeDimension,`server.validation.ai.timeDimensionRequired.funnel`,o,n),!a.steps||!Array.isArray(a.steps))n.push({type:`syntax_error`,message:D(`server.validation.ai.funnelStepsRequired`)});else if(a.steps.length<2)n.push({type:`syntax_error`,message:D(`server.validation.ai.funnelRequiresSteps`)});else for(let e=0;e<a.steps.length;e++){let o=a.steps[e];o.name||r.push({type:`best_practice`,message:D(`server.validation.ai.stepMissingName`,{step:e+1}),suggestion:D(`server.validation.ai.suggestAddStepNames`)}),o.filter&&`member`in o.filter&&Em([o.filter],t,n,i)}}function Om(e,t,n,r,i){let a=e.flow;if(!a)return;let o=(e,n)=>Tm(e,t,n,i);$(a.bindingKey,`server.validation.ai.bindingKeyRequired.flow`,o,n),$(a.timeDimension,`server.validation.ai.timeDimensionRequired.flow`,o,n),$(a.eventDimension,`server.validation.ai.eventDimensionRequired`,o,n),a.stepsBefore===void 0&&a.stepsAfter===void 0&&r.push({type:`best_practice`,message:D(`server.validation.ai.stepsBothMissing`),suggestion:D(`server.validation.ai.suggestSetSteps`)})}function km(e,t,n,r,i){let a=e.retention;if(!a)return;let o=(e,n)=>Tm(e,t,n,i);$(a.bindingKey,`server.validation.ai.bindingKeyRequired.retention`,o,n),$(a.timeDimension,`server.validation.ai.retentionTimeDimensionRequired`,o,n),a.granularity||r.push({type:`best_practice`,message:D(`server.validation.ai.granularityNotSpecified`),suggestion:D(`server.validation.ai.suggestSpecifyGranularity`)}),a.periods||r.push({type:`best_practice`,message:D(`server.validation.ai.periodsNotSpecified`),suggestion:D(`server.validation.ai.suggestSpecifyPeriods`)})}function Am(e,t,n,r,i){return e.funnel?(Dm(e,t,n,r,i),!0):e.flow?(Om(e,t,n,r,i),!0):e.retention?(km(e,t,n,r,i),!0):!1}function jm(e,t,n,r,i){if(e.measures)for(let r of e.measures)wm(r,t,n,i);if(e.dimensions)for(let r of e.dimensions)Tm(r,t,n,i);if(e.timeDimensions)for(let a of e.timeDimensions)Tm(a.dimension,t,n,i),xm(a.dimension,t,r);e.filters&&Em(e.filters,t,n,i),!e.measures?.length&&!e.dimensions?.length&&n.push({type:`syntax_error`,message:D(`server.validation.ai.emptyQuery`)}),bm(e,r)}function Mm(e,t){let n=[],r=[],i=new Map;if(Am(e,t,n,r,i))return{isValid:n.length===0,errors:n,warnings:r,correctedQuery:void 0};jm(e,t,n,r,i);let a=ym(e,i);return{isValid:n.length===0,errors:n,warnings:r,correctedQuery:a}}function Nm(e){return new cd({drizzle:e.drizzle,schema:e.schema})}exports.BASE_CUBE_SET_ID=ad,exports.BaseDatabaseExecutor=x,exports.CTEBuilder=bn,exports.CalculatedMeasureResolver=k,exports.ComparisonQueryBuilder=Dr,exports.DatabendExecutor=Fe,exports.DrizzlePlanBuilder=Ii,exports.DrizzleSqlBuilder=nn,exports.DuckDBExecutor=Ae,exports.EXPLAIN_ANALYSIS_PROMPT=bd,exports.FlowQueryBuilder=kr,exports.FunnelQueryBuilder=Or,exports.IdentityOptimiser=Ur,exports.JoinPathResolver=rn,exports.LogicalPlanBuilder=Hr,exports.LogicalPlanner=vn,exports.MemoryCacheProvider=dd,exports.MySQLExecutor=ye,exports.OptimiserPipeline=Wr,exports.PostgresExecutor=he,exports.QueryExecutor=Ri,exports.QueryValidationError=Xn,exports.RetentionQueryBuilder=Fr,exports.SINGLE_TENANT_CONTEXT=od,exports.SQLiteExecutor=Ce,exports.STEP0_VALIDATION_PROMPT=fd,exports.STEP1_SYSTEM_PROMPT=gd,exports.STEP2_SYSTEM_PROMPT=vd,exports.SYSTEM_PROMPT_TEMPLATE=md,exports.SemanticLayerCompiler=cd,exports.SnowflakeExecutor=Ve,exports.aiValidateQuery=Mm,exports.buildAgentSystemPrompt=Fd,exports.buildAttributeDimensions=ld,exports.buildExplainAnalysisPrompt=xd,exports.buildStep0Prompt=pd,exports.buildStep1Prompt=_d,exports.buildStep2Prompt=yd,exports.buildSystemPrompt=hd,exports.createDatabaseExecutor=Ue,exports.createDatabendExecutor=Ie,exports.createDrizzleSemanticLayer=Nm,exports.createDuckDBExecutor=je,exports.createMultiCubeContext=Ye,exports.createMySQLExecutor=be,exports.createPostgresExecutor=ge,exports.createSQLiteExecutor=we,exports.createSnowflakeExecutor=He,exports.createToolExecutor=Up,exports.defineCube=Xe,exports.detectQueryMode=Yn,exports.detectQueryModes=qn,exports.discoverCubes=Qd,exports.findBestFieldMatch=$d,exports.fnv1aHash=Cr,exports.formatCubeSchemaForExplain=Sd,exports.formatExistingIndexes=Cd,exports.generateCacheKey=gr,exports.getActiveQueryModes=Jn,exports.getCubeInvalidationPattern=Tr,exports.getJoinType=Ge,exports.getToolDefinitions=Hp,exports.handleAgentChat=tm,exports.hasComparisonMode=Un,exports.hasFlowMode=Gn,exports.hasFunnelMode=Wn,exports.hasRetentionMode=Kn,exports.normalizeQuery=_r,exports.resolveCubeReference=S,exports.resolveSqlExpression=C,exports.strongHash=wr,exports.suggestQuery=_m;
824
+ `)}`,isError:!0};let s={portlets:r.map(e=>{let t=o.get(e)??e.chartType,n=t===`markdown`,r=n?`query`:e.analysisType||`query`,i=r===`funnel`?`funnel`:r===`flow`?`flow`:r===`retention`?`retention`:`query`,s=e.query||`{}`,c;try{c=JSON.parse(s)}catch{c={}}let l={version:1,analysisType:i,activeView:`chart`,charts:{[i]:{chartType:t,chartConfig:a.get(e)??e.chartConfig??{},displayConfig:e.displayConfig||{}}},query:n&&!zp(c)?{}:c};return{id:e.id,title:e.title,analysisConfig:l,dashboardFilterMapping:e.dashboardFilterMapping,w:e.w,h:e.h,x:e.x,y:e.y}}),filters:e.filters,colorPalette:e.colorPalette},c=e.title;return{result:`Dashboard "${c}" created with ${s.portlets.length} portlets and ${s.filters?.length||0} filters.`,sideEffect:{type:`dashboard_saved`,data:{title:c,description:e.description,dashboardConfig:s}}}}catch(e){return{result:`Failed to save dashboard: ${e instanceof Error?e.message:`Unknown error`}`,isError:!0}}}),r}async function Wp(e,t,n){switch(e){case`anthropic`:{let{AnthropicProvider:e}=await Promise.resolve().then(()=>require("./anthropic-CqLkud62.cjs"));return new e(t)}case`openai`:{let{OpenAIProvider:e}=await Promise.resolve().then(()=>require("./openai-DC2ye24o.cjs"));return new e(t,n)}case`google`:{let{GoogleProvider:e}=await Promise.resolve().then(()=>require("./google-6pofxIfm.cjs"));return new e(t)}default:throw Error(`Unknown LLM provider: "${e}". Supported providers: anthropic, openai, google`)}}function Gp(e,t){if(Array.isArray(t))for(let n of t)e.push(n);else e.push(t)}function Q(e){if(e)try{e()}catch{}}function Kp(e,t){let n=[];if(!e||e.length===0)return n;for(let r of e){if(r.role===`user`){n.push({role:`user`,content:r.content});continue}if(r.role!==`assistant`)continue;let e=[];if(r.content&&e.push({type:`text`,text:r.content}),r.toolCalls&&r.toolCalls.length>0){for(let t of r.toolCalls)e.push({type:`tool_use`,id:t.id,name:t.name,input:t.input||{}});n.push({role:`assistant`,content:e});let i=r.toolCalls.map(e=>({toolUseId:e.id,toolName:e.name,content:typeof e.result==`string`?e.result:JSON.stringify(e.result??``),isError:e.status===`error`}));Gp(n,t.formatToolResults(i))}else e.length>0&&n.push({role:`assistant`,content:r.content})}return n}function qp(e,t){if(e?.type===`tool_use`&&t)try{e.input=JSON.parse(t)}catch{e.input={},e.inputParseError=!0}}function Jp(e,t){let n=e.contentBlocks[e.contentBlocks.length-1];n&&n.type===`text`?n.text=(n.text||``)+t:e.contentBlocks.push({type:`text`,text:t})}function Yp(e,t){e.currentBlockIsToolUse&&e.currentToolInputJson&&qp(e.contentBlocks[e.contentBlocks.length-1],e.currentToolInputJson),e.contentBlocks.push({type:`tool_use`,id:t.id,name:t.name,input:{},...t.metadata?{metadata:t.metadata}:{}}),e.currentToolInputJson=``,e.currentBlockIsToolUse=!0}function Xp(e,t){if(t.id&&t.input){let n=e.contentBlocks.find(e=>e.type===`tool_use`&&e.id===t.id);n&&(n.input=t.input,t.parseError&&(n.inputParseError=!0))}else if(e.currentBlockIsToolUse){let t=e.contentBlocks[e.contentBlocks.length-1];t?.type===`tool_use`&&e.currentToolInputJson&&(qp(t,e.currentToolInputJson),e.currentToolInputJson=``),e.currentBlockIsToolUse=!1}}async function*Zp(e,t){let n={contentBlocks:[],currentToolInputJson:``,currentBlockIsToolUse:!1,stopReason:``};for await(let r of e.parseStreamEvents(t)){let e=r;switch(e.type){case`text_delta`:Jp(n,e.text),yield{type:`text_delta`,data:e.text};break;case`tool_use_start`:Yp(n,e),yield{type:`tool_use_start`,data:{id:e.id,name:e.name,input:void 0}};break;case`tool_input_delta`:n.currentToolInputJson+=e.json;break;case`tool_use_end`:Xp(n,e);break;case`message_meta`:e.inputTokens!=null&&(n.inputTokens=e.inputTokens),e.outputTokens!=null&&(n.outputTokens=e.outputTokens),e.stopReason&&(n.stopReason=e.stopReason)}}return{contentBlocks:n.contentBlocks,stopReason:n.stopReason,inputTokens:n.inputTokens,outputTokens:n.outputTokens}}async function*Qp(e,t){let{executor:n,observability:r,traceId:i,turn:a}=t,o=e.name,s=e.input||{},c=e.id;if(e.inputParseError){let e=`Could not parse the arguments you sent for ${o} — they were not valid JSON, so the tool was not run. Call it again with well-formed JSON arguments.`;return yield{type:`tool_use_result`,data:{id:c,name:o,result:e,isError:!0}},Q(()=>r?.onToolEnd?.({traceId:i,turn:a,toolName:o,toolUseId:c,isError:!0,durationMs:0})),{toolUseId:c,toolName:o,content:e,isError:!0}}let l=n.get(o);if(!l)return yield{type:`tool_use_result`,data:{id:c,name:o,result:`Unknown tool: ${o}`,isError:!0}},{toolUseId:c,toolName:o,content:`Unknown tool: ${o}`,isError:!0};let u=Date.now();try{let e=await l(s);return e.sideEffect&&(yield e.sideEffect),yield{type:`tool_use_result`,data:{id:c,name:o,input:s,result:e.result,...e.isError?{isError:!0}:{}}},Q(()=>r?.onToolEnd?.({traceId:i,turn:a,toolName:o,toolUseId:c,isError:!!e.isError,durationMs:Date.now()-u})),{toolUseId:c,toolName:o,content:e.result,...e.isError?{isError:!0}:{}}}catch(e){let t=e instanceof Error?e.message:`Tool execution failed`;return yield{type:`tool_use_result`,data:{id:c,name:o,result:t,isError:!0}},Q(()=>r?.onToolEnd?.({traceId:i,turn:a,toolName:o,toolUseId:c,isError:!0,durationMs:Date.now()-u})),{toolUseId:c,toolName:o,content:t,isError:!0}}}async function*$p(e,t){let n=[];for(let r of e){if(r.type!==`tool_use`)continue;let e=yield*Qp(r,t);n.push(e)}return n}var em={anthropic:`claude-sonnet-4-6`,openai:`gpt-4.1-mini`,google:`gemini-3-flash-preview`};async function*tm(e){let{message:t,history:n,semanticLayer:r,securityContext:i,agentConfig:a,apiKey:o}=e,s=e.sessionId||crypto.randomUUID(),c=a.observability,l=crypto.randomUUID(),u=Date.now(),d=e.providerOverride||a.provider||`anthropic`,f=e.modelOverride||a.model||em[d]||`claude-sonnet-4-6`,p=e.baseURLOverride||a.baseURL,m=a.maxTurns||25,h=a.maxTokens||8192,g;try{g=await Wp(d,o,{baseURL:p})}catch(e){console.error(`[agent] Failed to create %s provider: %s`,String(d).replace(/\n|\r/g,``),String(e instanceof Error?e.message:e).replace(/\n|\r/g,``)),yield{type:`error`,data:{message:e instanceof Error?e.message:D(`server.errors.llmInitFailed`)}};return}let _=Hp(),v=Up({semanticLayer:r,securityContext:i}),y=Fd(r.getMetadata(i));e.systemContext&&(y+=`\n\n## User Context\n\n${e.systemContext}`),Q(()=>c?.onChatStart?.({traceId:l,sessionId:s,message:t,model:f,historyLength:n?.length??0}));let b=Kp(n,g);b.push({role:`user`,content:t});let ee=0;try{for(let e=0;e<m;e++){ee=e+1;let t=await g.createStream({model:f,maxTokens:h,system:y,tools:_,messages:b}),n=Date.now(),{contentBlocks:r,stopReason:i,inputTokens:a,outputTokens:o}=yield*Zp(g,t);if(Q(()=>c?.onGenerationEnd?.({traceId:l,turn:e,model:f,stopReason:i,inputTokens:a,outputTokens:o,durationMs:Date.now()-n,input:b,output:r})),b.push({role:`assistant`,content:r}),g.isTruncated(i)){yield{type:`error`,data:{message:D(`server.errors.agentResponseTruncated`)}};break}if(!g.shouldContinue(i))break;let s=yield*$p(r,{executor:v,observability:c,traceId:l,turn:e});yield{type:`turn_complete`,data:{}},Gp(b,g.formatToolResults(s))}Q(()=>c?.onChatEnd?.({traceId:l,sessionId:s,totalTurns:ee,durationMs:Date.now()-u})),yield{type:`done`,data:{sessionId:s||``,traceId:l}}}catch(e){try{c?.onChatEnd?.({traceId:l,sessionId:s,totalTurns:0,durationMs:Date.now()-u,error:e instanceof Error?e.message:`Unknown error`})}catch{}console.error(`[agent] Chat error (provider=%s, model=%s): %s`,String(d).replace(/\n|\r/g,``),String(f).replace(/\n|\r/g,``),String(e instanceof Error?e.message:e).replace(/\n|\r/g,``)),yield{type:`error`,data:{message:g.formatError(e)}}}}function nm(e){return e.toISOString().split(`T`)[0]}function rm(e,t){let n=new Date,r=nm(n);if(/days?/.test(t)){let t=new Date(n);return t.setDate(t.getDate()-e),{dateRange:[nm(t),r],granularity:`day`}}if(/weeks?/.test(t)){let t=new Date(n);return t.setDate(t.getDate()-e*7),{dateRange:[nm(t),r],granularity:e<=4?`day`:`week`}}if(/months?/.test(t)){let t=new Date(n);return t.setMonth(t.getMonth()-e),{dateRange:[nm(t),r],granularity:e<=3?`day`:`month`}}return null}function im(e){let t=parseInt(e.slice(1),10),n=new Date().getFullYear(),r=(t-1)*3,i=new Date(n,r,1),a=new Date(n,r+3,0);return{dateRange:[nm(i),nm(a)],granularity:`month`}}function am(e,t,n,r){let i=0;for(let a of e.measures){let e=[(a.name.split(`.`).pop()||a.name).toLowerCase(),a.title.toLowerCase(),...(a.synonyms||[]).map(e=>e.toLowerCase())];for(let o of e)if(t.includes(o)){n.push(a.name),r.push(`Matched measure '${a.name}' via keyword '${o}'`),i+=.15;break}}return i}function om(e,t,n,r){let i=e.measures.filter(e=>e.type===t.type);if(i.length>0){n.push(i[0].name),r.push(`Suggested ${i[0].name} based on ${t.type} intent`);return}if(t.type===`count`){let t=e.measures.find(e=>e.type===`count`||e.type===`countDistinct`);t&&(n.push(t.name),r.push(`Suggested ${t.name} for counting`))}}function sm(e,t,n,r,i){let a=0;for(let n of t){let t=$d(e,n,`dimension`);t&&(r.push(t.field),i.push(`Matched dimension '${t.field}' from grouping keyword '${n}'`),a+=.1)}for(let t of e)for(let e of t.dimensions){let t=[(e.name.split(`.`).pop()||e.name).toLowerCase(),e.title.toLowerCase(),...(e.synonyms||[]).map(e=>e.toLowerCase())];for(let o of t)if(n.includes(o)&&!r.includes(e.name)&&(n.includes(`by ${o}`)||n.includes(`per ${o}`))){r.push(e.name),i.push(`Matched dimension '${e.name}' as grouping`),a+=.1;break}}return a}function cm(){let e=new Date,t=e.toISOString().split(`T`)[0],n=e=>e.toISOString().split(`T`)[0],r=e=>new Date(e.getFullYear(),e.getMonth(),1),i=e=>new Date(e.getFullYear(),0,1),a=e=>{let t=Math.floor(e.getMonth()/3);return new Date(e.getFullYear(),t*3,1)},o=e=>{let t=e.getDay(),n=e.getDate()-t+(t===0?-6:1);return new Date(e.getFullYear(),e.getMonth(),n)};return[{pattern:/\btoday\b/i,getDateRange:()=>[t,t],granularity:`day`},{pattern:/\byesterday\b/i,getDateRange:()=>{let t=new Date(e);t.setDate(t.getDate()-1);let r=n(t);return[r,r]},granularity:`day`},{pattern:/\bthis week\b/i,getDateRange:()=>[n(o(e)),t],granularity:`day`},{pattern:/\blast week\b/i,getDateRange:()=>{let t=new Date(o(e));t.setDate(t.getDate()-7);let r=new Date(t);return r.setDate(r.getDate()+6),[n(t),n(r)]},granularity:`day`},{pattern:/\bthis month\b/i,getDateRange:()=>[n(r(e)),t],granularity:`day`},{pattern:/\blast month\b/i,getDateRange:()=>{let t=new Date(e.getFullYear(),e.getMonth()-1,1),r=new Date(e.getFullYear(),e.getMonth(),0);return[n(t),n(r)]},granularity:`day`},{pattern:/\bthis quarter\b/i,getDateRange:()=>[n(a(e)),t],granularity:`month`},{pattern:/\blast quarter\b/i,getDateRange:()=>{let t=new Date(a(e));t.setMonth(t.getMonth()-3);let r=new Date(a(e));return r.setDate(r.getDate()-1),[n(t),n(r)]},granularity:`month`},{pattern:/\bthis year\b/i,getDateRange:()=>[n(i(e)),t],granularity:`month`},{pattern:/\blast year\b/i,getDateRange:()=>{let t=new Date(e.getFullYear()-1,0,1),r=new Date(e.getFullYear()-1,11,31);return[n(t),n(r)]},granularity:`month`},{pattern:/\blast (\d+) days?\b/i,getDateRange:()=>{let r=new Date(e);return r.setDate(r.getDate()-7),[n(r),t]},granularity:`day`},{pattern:/\blast (\d+) weeks?\b/i,getDateRange:()=>{let r=new Date(e);return r.setDate(r.getDate()-28),[n(r),t]},granularity:`week`},{pattern:/\blast (\d+) months?\b/i,getDateRange:()=>{let r=new Date(e);return r.setMonth(r.getMonth()-3),[n(r),t]},granularity:`month`},{pattern:/\bq([1-4])\b/i,getDateRange:()=>[n(new Date(e.getFullYear(),0,1)),n(new Date(e.getFullYear(),2,31))],granularity:`month`}]}var lm={funnel:/\b(funnel|conversion|drop.?off|steps?|journey|pipeline|stages?)\b/i,flow:/\b(flows?|paths?|sequence|before|after|next|previous|user.?journey)\b/i,retention:/\b(retention|cohort|return|churn|comeback|retained|day.?\d+)\b/i};function um(e){let t=e.toLowerCase();return lm.funnel.test(t)?`funnel`:lm.flow.test(t)?`flow`:lm.retention.test(t)?`retention`:`query`}function dm(e,t){let n=t||`the relevant cube`;switch(e){case`funnel`:return[`Use /mcp/discover to get ${n} funnel configuration and schema`,`Query the event dimension to discover available event types for funnel steps`,`Build funnel query with discovered values using the schema from discover`];case`flow`:return[`Use /mcp/discover to get ${n} flow configuration and schema`,`Query the event dimension to discover available event types`,`Build flow query specifying the starting event and steps before/after`];case`retention`:return[`Use /mcp/discover to get ${n} retention configuration and schema`,`Build retention query specifying granularity (day/week/month) and number of periods`]}}function fm(e){let t=cm(),n=e.toLowerCase();for(let e of t){let t=n.match(e.pattern);if(t){if(t[1]&&/^\d+$/.test(t[1])){let e=rm(parseInt(t[1],10),n);if(e)return e}return/^q[1-4]$/i.test(t[0])?im(t[0]):{dateRange:e.getDateRange(),granularity:e.granularity}}}return null}function pm(e){let t=e.toLowerCase();for(let{pattern:e,type:n}of[{pattern:/\b(total|sum|combined)\b/i,type:`sum`},{pattern:/\b(count|number of|how many)\b/i,type:`count`},{pattern:/\b(average|avg|mean)\b/i,type:`avg`},{pattern:/\b(maximum|max|highest|top)\b/i,type:`max`},{pattern:/\b(minimum|min|lowest|bottom)\b/i,type:`min`}])if(e.test(t))return{type:n,confidence:.8};return null}function mm(e){let t=e.toLowerCase(),n=[],r=/\bby\s+(\w+(?:\s+\w+)?)/gi,i;for(;(i=r.exec(t))!==null;)n.push(i[1].trim());let a=/\bper\s+(\w+)/gi;for(;(i=a.exec(t))!==null;)n.push(i[1].trim());let o=/\bfor each\s+(\w+)/gi;for(;(i=o.exec(t))!==null;)n.push(i[1].trim());return n}function hm(e,t,n,r,i){if(n){let t=e.find(e=>e.name===n);return t?(r.push(`Using specified cube: ${n}`),[t]):(i.push(`Specified cube '${n}' not found`),[])}let a=Qd(e,{intent:t,limit:3}).map(t=>e.find(e=>e.name===t.cube)).filter(e=>e!==void 0);return a.length>0&&r.push(`Identified relevant cubes: ${a.map(e=>e.name).join(`, `)}`),a}function gm(e,t){return e===`query`?{query:{},confidence:0,reasoning:[`Could not identify relevant cubes for this query`],warnings:t,analysisMode:e,nextSteps:void 0}:{query:{},confidence:.7,reasoning:[`Detected ${e} intent from natural language`],warnings:t,analysisMode:e,nextSteps:dm(e,void 0)}}function _m(e,t,n){let r=[],i=[],a={},o=um(t),s=hm(e,t,n,r,i);if(s.length===0)return gm(o,i);let c=s[0],l=.5,u=pm(t);u&&(r.push(`Detected ${u.type} aggregation intent`),l+=.1);let d=[],f=t.toLowerCase();l+=am(c,f,d,r),d.length===0&&u&&om(c,u,d,r),d.length===0&&c.measures.length>0&&(d.push(c.measures[0].name),r.push(`Using default measure: ${c.measures[0].name}`),i.push(`Could not determine specific measure from query, using default`)),a.measures=d;let p=mm(t),m=[];l+=sm(s,p,f,m,r),m.length>0&&(a.dimensions=m);let h=fm(t);if(h){let e=c.dimensions.find(e=>e.type===`time`);if(e){let t={dimension:e.name,dateRange:h.dateRange};h.granularity&&(t.granularity=h.granularity),a.timeDimensions=[t],r.push(`Applied time filter: ${h.dateRange[0]} to ${h.dateRange[1]}`),l+=.15}else i.push(`Time expression found but no time dimension in cube`)}if(l=Math.min(1,l),o!==`query`){let e=s.length>0?s[0].name:void 0;return{query:{},confidence:.7,reasoning:[`Detected ${o} intent from natural language`,...e?[`Found relevant cube: ${e}`]:[]],warnings:i.length>0?i:void 0,analysisMode:o,nextSteps:dm(o,e)}}return{query:a,confidence:l,reasoning:r,warnings:i.length>0?i:void 0,analysisMode:`query`}}function $(e,t,n,r){e?typeof e==`string`&&n(e,r):r.push({type:`syntax_error`,message:D(t)})}function vm(e,t){return e.map(e=>t.get(e)||e)}function ym(e,t){if(t.size===0)return;let n=JSON.parse(JSON.stringify(e));return n.measures&&=vm(n.measures,t),n.dimensions&&=vm(n.dimensions,t),n.timeDimensions&&=n.timeDimensions.map(e=>({...e,dimension:t.get(e.dimension)||e.dimension})),n}function bm(e,t){e.measures&&e.measures.length>10&&t.push({type:`performance`,message:D(`server.validation.ai.performanceManyMeasures`,{count:e.measures.length}),suggestion:D(`server.validation.ai.suggestSplitQueries`)}),e.dimensions&&e.dimensions.length>5&&t.push({type:`performance`,message:D(`server.validation.ai.performanceManyDimensions`,{count:e.dimensions.length}),suggestion:D(`server.validation.ai.suggestAddDimensionFilters`)})}function xm(e,t,n){let[r]=e.split(`.`),i=t.find(e=>e.name===r);if(!i)return;let a=i.dimensions.find(t=>t.name===e);a&&a.type!==`time`&&n.push({type:`best_practice`,message:D(`server.validation.ai.dimensionNotTimeType`,{dimension:e,type:a.type}),field:e,suggestion:D(`server.validation.ai.suggestUseTimeDimension`)})}function Sm(e,t,n,r,i){let a=e.member,o=a.split(`.`);if(o.length!==2){n.push({type:`invalid_filter`,message:D(`server.validation.ai.invalidFilterMemberFormat`,{member:a}),field:a});return}let[s,c]=o,l=t.find(e=>e.name===s);if(!l){let e=i(s,t.map(e=>e.name));e&&r.set(a,`${e.field}.${c}`),n.push({type:`cube_not_found`,message:D(`server.validation.ai.cubeNotFoundInFilter`,{cubeName:s}),field:a,suggestion:e?`Did you mean '${e.field}'?`:void 0,correctedValue:e?`${e.field}.${c}`:void 0});return}let u=l.dimensions.some(e=>e.name===a),d=l.measures.some(e=>e.name===a);if(u||d)return;let f=i(c,[...l.dimensions.map(e=>e.name.split(`.`).pop()),...l.measures.map(e=>e.name.split(`.`).pop())]);if(f){let e=`${s}.${f.field}`;r.set(a,e),n.push({type:`invalid_filter`,message:D(`server.validation.ai.filterFieldNotFoundWithSuggestion`,{fieldName:c,cubeName:s}),field:a,suggestion:`Did you mean '${f.field}'?`,correctedValue:e})}else n.push({type:`invalid_filter`,message:D(`server.validation.ai.filterFieldNotFound`,{fieldName:c,cubeName:s}),field:a})}function Cm(e,t){let n=null;for(let r of t){let t=Ud(e.toLowerCase(),r.toLowerCase());t<=3&&(!n||t<n.distance)&&(n={field:r,distance:t})}return n}function wm(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:D(`server.validation.ai.invalidMeasureFormat`,{measure:e}),field:e});return}let[a,o]=i,s=t.find(e=>e.name===a);if(!s){let i=t.map(e=>e.name),s=Cm(a,i);s?(n.push({type:`cube_not_found`,message:D(`server.validation.ai.cubeNotFoundWithSuggestion`,{cubeName:a}),field:e,suggestion:`Did you mean '${s.field}'?`,correctedValue:`${s.field}.${o}`}),r.set(e,`${s.field}.${o}`)):n.push({type:`cube_not_found`,message:D(`server.validation.ai.cubeNotFoundWithAvailable`,{cubeName:a}),field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.measures.some(t=>t.name===e)){let i=$d(t,o,`measure`);if(i&&i.cube===a)n.push({type:`measure_not_found`,message:D(`server.validation.ai.measureNotFoundWithSuggestion`,{measureName:o,cubeName:a}),field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:i.field}),r.set(e,i.field);else{let t=s.measures.map(e=>e.name.split(`.`).pop()),i=Cm(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`measure_not_found`,message:D(`server.validation.ai.measureNotFoundWithSuggestion`,{measureName:o,cubeName:a}),field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:t}),r.set(e,t)}else n.push({type:`measure_not_found`,message:D(`server.validation.ai.measureNotFoundWithAvailable`,{measureName:o,cubeName:a}),field:e,suggestion:`Available measures: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function Tm(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:D(`server.validation.ai.invalidDimensionFormat`,{dimension:e}),field:e});return}let[a,o]=i,s=t.find(e=>e.name===a);if(!s){let i=t.map(e=>e.name),s=Cm(a,i);s?(n.push({type:`cube_not_found`,message:D(`server.validation.ai.cubeNotFoundWithSuggestion`,{cubeName:a}),field:e,suggestion:`Did you mean '${s.field}'?`,correctedValue:`${s.field}.${o}`}),r.set(e,`${s.field}.${o}`)):n.push({type:`cube_not_found`,message:D(`server.validation.ai.cubeNotFoundWithAvailable`,{cubeName:a}),field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.dimensions.some(t=>t.name===e)){let i=$d(t,o,`dimension`);if(i&&i.cube===a)n.push({type:`dimension_not_found`,message:D(`server.validation.ai.dimensionNotFoundWithSuggestion`,{dimensionName:o,cubeName:a}),field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:i.field}),r.set(e,i.field);else{let t=s.dimensions.map(e=>e.name.split(`.`).pop()),i=Cm(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`dimension_not_found`,message:D(`server.validation.ai.dimensionNotFoundWithSuggestion`,{dimensionName:o,cubeName:a}),field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:t}),r.set(e,t)}else n.push({type:`dimension_not_found`,message:D(`server.validation.ai.dimensionNotFoundWithAvailable`,{dimensionName:o,cubeName:a}),field:e,suggestion:`Available dimensions: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function Em(e,t,n,r){for(let i of e){if(`and`in i&&Array.isArray(i.and)){Em(i.and,t,n,r);continue}if(`or`in i&&Array.isArray(i.or)){Em(i.or,t,n,r);continue}`member`in i&&Sm(i,t,n,r,Cm)}}function Dm(e,t,n,r,i){let a=e.funnel;if(!a)return;let o=(e,n)=>Tm(e,t,n,i);if($(a.bindingKey,`server.validation.ai.bindingKeyRequired.funnel`,o,n),$(a.timeDimension,`server.validation.ai.timeDimensionRequired.funnel`,o,n),!a.steps||!Array.isArray(a.steps))n.push({type:`syntax_error`,message:D(`server.validation.ai.funnelStepsRequired`)});else if(a.steps.length<2)n.push({type:`syntax_error`,message:D(`server.validation.ai.funnelRequiresSteps`)});else for(let e=0;e<a.steps.length;e++){let o=a.steps[e];o.name||r.push({type:`best_practice`,message:D(`server.validation.ai.stepMissingName`,{step:e+1}),suggestion:D(`server.validation.ai.suggestAddStepNames`)}),o.filter&&`member`in o.filter&&Em([o.filter],t,n,i)}}function Om(e,t,n,r,i){let a=e.flow;if(!a)return;let o=(e,n)=>Tm(e,t,n,i);$(a.bindingKey,`server.validation.ai.bindingKeyRequired.flow`,o,n),$(a.timeDimension,`server.validation.ai.timeDimensionRequired.flow`,o,n),$(a.eventDimension,`server.validation.ai.eventDimensionRequired`,o,n),a.stepsBefore===void 0&&a.stepsAfter===void 0&&r.push({type:`best_practice`,message:D(`server.validation.ai.stepsBothMissing`),suggestion:D(`server.validation.ai.suggestSetSteps`)})}function km(e,t,n,r,i){let a=e.retention;if(!a)return;let o=(e,n)=>Tm(e,t,n,i);$(a.bindingKey,`server.validation.ai.bindingKeyRequired.retention`,o,n),$(a.timeDimension,`server.validation.ai.retentionTimeDimensionRequired`,o,n),a.granularity||r.push({type:`best_practice`,message:D(`server.validation.ai.granularityNotSpecified`),suggestion:D(`server.validation.ai.suggestSpecifyGranularity`)}),a.periods||r.push({type:`best_practice`,message:D(`server.validation.ai.periodsNotSpecified`),suggestion:D(`server.validation.ai.suggestSpecifyPeriods`)})}function Am(e,t,n,r,i){return e.funnel?(Dm(e,t,n,r,i),!0):e.flow?(Om(e,t,n,r,i),!0):e.retention?(km(e,t,n,r,i),!0):!1}function jm(e,t,n,r,i){if(e.measures)for(let r of e.measures)wm(r,t,n,i);if(e.dimensions)for(let r of e.dimensions)Tm(r,t,n,i);if(e.timeDimensions)for(let a of e.timeDimensions)Tm(a.dimension,t,n,i),xm(a.dimension,t,r);e.filters&&Em(e.filters,t,n,i),!e.measures?.length&&!e.dimensions?.length&&n.push({type:`syntax_error`,message:D(`server.validation.ai.emptyQuery`)}),bm(e,r)}function Mm(e,t){let n=[],r=[],i=new Map;if(Am(e,t,n,r,i))return{isValid:n.length===0,errors:n,warnings:r,correctedQuery:void 0};jm(e,t,n,r,i);let a=ym(e,i);return{isValid:n.length===0,errors:n,warnings:r,correctedQuery:a}}function Nm(e){return new cd({drizzle:e.drizzle,schema:e.schema})}exports.BASE_CUBE_SET_ID=ad,exports.BaseDatabaseExecutor=x,exports.CTEBuilder=bn,exports.CalculatedMeasureResolver=k,exports.ComparisonQueryBuilder=Dr,exports.DatabendExecutor=Fe,exports.DrizzlePlanBuilder=Ii,exports.DrizzleSqlBuilder=nn,exports.DuckDBExecutor=Ae,exports.EXPLAIN_ANALYSIS_PROMPT=bd,exports.FlowQueryBuilder=kr,exports.FunnelQueryBuilder=Or,exports.IdentityOptimiser=Ur,exports.JoinPathResolver=rn,exports.LogicalPlanBuilder=Hr,exports.LogicalPlanner=vn,exports.MemoryCacheProvider=dd,exports.MySQLExecutor=ye,exports.OptimiserPipeline=Wr,exports.PostgresExecutor=he,exports.QueryExecutor=Ri,exports.QueryValidationError=Xn,exports.RetentionQueryBuilder=Fr,exports.SINGLE_TENANT_CONTEXT=od,exports.SQLiteExecutor=Ce,exports.STEP0_VALIDATION_PROMPT=fd,exports.STEP1_SYSTEM_PROMPT=gd,exports.STEP2_SYSTEM_PROMPT=vd,exports.SYSTEM_PROMPT_TEMPLATE=md,exports.SemanticLayerCompiler=cd,exports.SnowflakeExecutor=Ve,exports.aiValidateQuery=Mm,exports.buildAgentSystemPrompt=Fd,exports.buildAttributeDimensions=ld,exports.buildExplainAnalysisPrompt=xd,exports.buildStep0Prompt=pd,exports.buildStep1Prompt=_d,exports.buildStep2Prompt=yd,exports.buildSystemPrompt=hd,exports.createDatabaseExecutor=Ue,exports.createDatabendExecutor=Ie,exports.createDrizzleSemanticLayer=Nm,exports.createDuckDBExecutor=je,exports.createMultiCubeContext=Ye,exports.createMySQLExecutor=be,exports.createPostgresExecutor=ge,exports.createSQLiteExecutor=we,exports.createSnowflakeExecutor=He,exports.createToolExecutor=Up,exports.defineCube=Xe,exports.detectQueryMode=Yn,exports.detectQueryModes=qn,exports.discoverCubes=Qd,exports.findBestFieldMatch=$d,exports.fnv1aHash=Cr,exports.formatCubeSchemaForExplain=Sd,exports.formatExistingIndexes=Cd,exports.generateCacheKey=gr,exports.getActiveQueryModes=Jn,exports.getCubeInvalidationPattern=Tr,exports.getJoinType=Ge,exports.getToolDefinitions=Hp,exports.handleAgentChat=tm,exports.hasComparisonMode=Un,exports.hasFlowMode=Gn,exports.hasFunnelMode=Wn,exports.hasRetentionMode=Kn,exports.normalizeQuery=_r,exports.resolveCubeReference=S,exports.resolveSqlExpression=C,exports.strongHash=wr,exports.suggestQuery=_m;
@@ -17911,7 +17911,7 @@ async function Tm(e, t, n) {
17911
17911
  return new e(t);
17912
17912
  }
17913
17913
  case "openai": {
17914
- let { OpenAIProvider: e } = await import("./openai-CgiNtz4I.js");
17914
+ let { OpenAIProvider: e } = await import("./openai-Jt2WUOXm.js");
17915
17915
  return new e(t, n);
17916
17916
  }
17917
17917
  case "google": {