drizzle-cube 0.9.7 → 0.9.8

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 (154) hide show
  1. package/dist/adapters/ActivityGridChart.config-BGndyZtr.cjs +1 -0
  2. package/dist/adapters/ActivityGridChart.config-ZdvHJAHq.js +2 -0
  3. package/dist/adapters/AreaChart.config-Cybigwcb.js +2 -0
  4. package/dist/adapters/AreaChart.config-DWGesxUg.cjs +1 -0
  5. package/dist/adapters/BarChart.config-Cc04tVQF.js +2 -0
  6. package/dist/adapters/BarChart.config-DBCu0t_-.cjs +1 -0
  7. package/dist/adapters/BoxPlotChart.config-C0WK_ipa.cjs +1 -0
  8. package/dist/adapters/BoxPlotChart.config-DapOUN_R.js +2 -0
  9. package/dist/adapters/BubbleChart.config-DPmf7sI5.cjs +1 -0
  10. package/dist/adapters/BubbleChart.config-DROSTwxW.js +2 -0
  11. package/dist/adapters/CandlestickChart.config-BHoEJ2nY.js +2 -0
  12. package/dist/adapters/CandlestickChart.config-Cm0PKObO.cjs +1 -0
  13. package/dist/adapters/DataTable.config-DLvfXXSH.cjs +1 -0
  14. package/dist/adapters/DataTable.config-DbVrWZIw.js +2 -0
  15. package/dist/adapters/DotStripChart.config-CKPw82HE.js +2 -0
  16. package/dist/adapters/DotStripChart.config-DPIrTLb6.cjs +1 -0
  17. package/dist/adapters/FunnelChart.config-DpiDbOTn.cjs +1 -0
  18. package/dist/adapters/FunnelChart.config-DtBHVpLB.js +2 -0
  19. package/dist/adapters/GaugeChart.config-CmuXGRNV.js +2 -0
  20. package/dist/adapters/GaugeChart.config-DLj1YNsp.cjs +1 -0
  21. package/dist/adapters/HeatMapChart.config-BvFK2bny.cjs +1 -0
  22. package/dist/adapters/HeatMapChart.config-DK18zZV8.js +2 -0
  23. package/dist/adapters/KpiDelta.config-BsaVN5-T.js +2 -0
  24. package/dist/adapters/KpiDelta.config-DHsMgIdk.cjs +1 -0
  25. package/dist/adapters/KpiNumber.config-D82-j-8T.js +2 -0
  26. package/dist/adapters/KpiNumber.config-pFRomJRE.cjs +1 -0
  27. package/dist/adapters/KpiText.config-CCqeKuFB.js +2 -0
  28. package/dist/adapters/KpiText.config-CSeCoBuO.cjs +1 -0
  29. package/dist/adapters/LineChart.config-C2acjFv4.js +2 -0
  30. package/dist/adapters/LineChart.config-Dr9wmiK0.cjs +1 -0
  31. package/dist/adapters/MarkdownChart.config-C-tYLLan.js +2 -0
  32. package/dist/adapters/MarkdownChart.config-Dvyfo0CB.cjs +1 -0
  33. package/dist/adapters/MeasureProfileChart.config-C5CjPw48.js +2 -0
  34. package/dist/adapters/MeasureProfileChart.config-Dj-7HqkS.cjs +1 -0
  35. package/dist/adapters/PieChart.config-CY7nFFQn.cjs +1 -0
  36. package/dist/adapters/PieChart.config-DQLQMHc_.js +2 -0
  37. package/dist/adapters/ProportionBarChart.config-BVqtS7wi.cjs +1 -0
  38. package/dist/adapters/ProportionBarChart.config-BaSgs976.js +2 -0
  39. package/dist/adapters/RadarChart.config-DxJ5k8L9.cjs +1 -0
  40. package/dist/adapters/RadarChart.config-DzL7zQUc.js +2 -0
  41. package/dist/adapters/RadialBarChart.config-Dzl1HiGz.js +2 -0
  42. package/dist/adapters/RadialBarChart.config-XlGTd9gV.cjs +1 -0
  43. package/dist/adapters/RecordsTable.config-CS5oIMvv.js +2 -0
  44. package/dist/adapters/RecordsTable.config-DRQdHghk.cjs +1 -0
  45. package/dist/adapters/RetentionCombinedChart.config-C0iiKOdf.js +2 -0
  46. package/dist/adapters/RetentionCombinedChart.config-Dl20GZnb.cjs +1 -0
  47. package/dist/adapters/RetentionHeatmap.config-Bt42ip_c.js +2 -0
  48. package/dist/adapters/RetentionHeatmap.config-DyggEvyy.cjs +1 -0
  49. package/dist/adapters/SankeyChart.config-DYz1nUx9.js +2 -0
  50. package/dist/adapters/SankeyChart.config-dlNLJMf9.cjs +1 -0
  51. package/dist/adapters/ScatterChart.config-D72zRviD.js +2 -0
  52. package/dist/adapters/ScatterChart.config-DRtyuQvV.cjs +1 -0
  53. package/dist/adapters/SunburstChart.config-C5nHXLcu.cjs +1 -0
  54. package/dist/adapters/SunburstChart.config-j5ioABeT.js +2 -0
  55. package/dist/adapters/TreeMapChart.config-CXKcX5CH.js +2 -0
  56. package/dist/adapters/TreeMapChart.config-DuYbme03.cjs +1 -0
  57. package/dist/adapters/WaterfallChart.config-BCn4tsBV.cjs +1 -0
  58. package/dist/adapters/WaterfallChart.config-BPqhdzTP.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-DtX1YNOn.js → handler-CknKLUQW.js} +30 -30
  64. package/dist/adapters/{handler-CTSg1daG.cjs → handler-DLWgxPOk.cjs} +2 -2
  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-CDH_AU_Z.cjs +19 -0
  70. package/dist/adapters/{openai-CWnhWp3I.js → openai-CYTlIdxS.js} +1 -1
  71. package/dist/adapters/{openai-BwtOIJIk.cjs → openai-KbobaAQj.cjs} +1 -1
  72. package/dist/adapters/{openai-Dqrs3PGo.js → openai-enh3Hkzr.js} +507 -436
  73. package/dist/cjs/client/components/shared/dateRangeUtils.d.ts +7 -3
  74. package/dist/client/chunks/{DashboardEditModal-DfaeSZGf.js → DashboardEditModal-CiN77tQN.js} +652 -530
  75. package/dist/client/chunks/DashboardEditModal-CiN77tQN.js.map +1 -0
  76. package/dist/client/chunks/{analysis-builder-fPK8NgJW.js → analysis-builder-DIOnKxJu.js} +36 -36
  77. package/dist/client/chunks/{analysis-builder-fPK8NgJW.js.map → analysis-builder-DIOnKxJu.js.map} +1 -1
  78. package/dist/client/chunks/{analysis-builder-shared--4LqPSum.js → analysis-builder-shared-CoX_nmo0.js} +747 -939
  79. package/dist/client/chunks/analysis-builder-shared-CoX_nmo0.js.map +1 -0
  80. package/dist/client/chunks/chart-data-table-BdMo3zVh.js.map +1 -1
  81. package/dist/client/components/shared/dateRangeUtils.d.ts +7 -3
  82. package/dist/client/components.js +2 -2
  83. package/dist/client/index.js +7 -7
  84. package/dist/client/index.js.map +1 -1
  85. package/dist/client-bundle-stats.html +1 -1
  86. package/dist/server/index.cjs +1 -1
  87. package/dist/server/index.js +1 -1
  88. package/dist/server/{openai-D346-vmt.cjs → openai-BIHkBS7X.cjs} +1 -1
  89. package/dist/server/{openai-SILGL2q_.js → openai-CPW5x6kl.js} +1 -1
  90. package/dist/server/{openai-D0vh48Oi.js → openai-DCC49vC6.js} +507 -436
  91. package/dist/server/openai-xQRpdAPa.cjs +19 -0
  92. package/package.json +3 -3
  93. package/dist/adapters/ActivityGridChart.config-C2kT9qd6.cjs +0 -1
  94. package/dist/adapters/ActivityGridChart.config-Crkwyx_5.js +0 -2
  95. package/dist/adapters/AreaChart.config-Cn4fTDQH.js +0 -2
  96. package/dist/adapters/AreaChart.config-DSBAn4xT.cjs +0 -1
  97. package/dist/adapters/BarChart.config-2r2_F09O.cjs +0 -1
  98. package/dist/adapters/BarChart.config-CorT50Sr.js +0 -2
  99. package/dist/adapters/BoxPlotChart.config-BM4SbL34.cjs +0 -1
  100. package/dist/adapters/BoxPlotChart.config-Dki3qfhN.js +0 -2
  101. package/dist/adapters/BubbleChart.config-DA768T1u.cjs +0 -1
  102. package/dist/adapters/BubbleChart.config-LJ2w0ZAz.js +0 -2
  103. package/dist/adapters/CandlestickChart.config-C00YG927.cjs +0 -1
  104. package/dist/adapters/CandlestickChart.config-D-vVDHaQ.js +0 -2
  105. package/dist/adapters/DataTable.config-Ml6Q3VEP.cjs +0 -1
  106. package/dist/adapters/DataTable.config-jwBiAUpg.js +0 -2
  107. package/dist/adapters/DotStripChart.config-C_dgJFje.js +0 -2
  108. package/dist/adapters/DotStripChart.config-D5M4xxNE.cjs +0 -1
  109. package/dist/adapters/FunnelChart.config-DBkjp0wh.js +0 -2
  110. package/dist/adapters/FunnelChart.config-Jc6DVjCx.cjs +0 -1
  111. package/dist/adapters/GaugeChart.config-BqW6WqXS.cjs +0 -1
  112. package/dist/adapters/GaugeChart.config-CyD4y_yf.js +0 -2
  113. package/dist/adapters/HeatMapChart.config-C_TKjH9_.cjs +0 -1
  114. package/dist/adapters/HeatMapChart.config-Di1KFl9H.js +0 -2
  115. package/dist/adapters/KpiDelta.config-qlIY4kju.js +0 -2
  116. package/dist/adapters/KpiDelta.config-zaqkGeS2.cjs +0 -1
  117. package/dist/adapters/KpiNumber.config-D1hq68b3.cjs +0 -1
  118. package/dist/adapters/KpiNumber.config-D9LpXMmo.js +0 -2
  119. package/dist/adapters/KpiText.config-BBBV_4aK.cjs +0 -1
  120. package/dist/adapters/KpiText.config-pqFid-lb.js +0 -2
  121. package/dist/adapters/LineChart.config-CFGa_jpk.js +0 -2
  122. package/dist/adapters/LineChart.config-DRTr24Jl.cjs +0 -1
  123. package/dist/adapters/MarkdownChart.config--Teyo7aa.cjs +0 -1
  124. package/dist/adapters/MarkdownChart.config-Cnptz8gx.js +0 -2
  125. package/dist/adapters/MeasureProfileChart.config-BlAnkNf6.js +0 -2
  126. package/dist/adapters/MeasureProfileChart.config-c4K6xVET.cjs +0 -1
  127. package/dist/adapters/PieChart.config-BX5FcoZn.cjs +0 -1
  128. package/dist/adapters/PieChart.config-DT1TCBFA.js +0 -2
  129. package/dist/adapters/ProportionBarChart.config-CN5ov6e6.js +0 -2
  130. package/dist/adapters/ProportionBarChart.config-DdrZQypv.cjs +0 -1
  131. package/dist/adapters/RadarChart.config-CYpWy1MI.js +0 -2
  132. package/dist/adapters/RadarChart.config-Cm14F-JW.cjs +0 -1
  133. package/dist/adapters/RadialBarChart.config-BXEmrEW0.js +0 -2
  134. package/dist/adapters/RadialBarChart.config-bJL8ZwT5.cjs +0 -1
  135. package/dist/adapters/RecordsTable.config-BifW_6cA.cjs +0 -1
  136. package/dist/adapters/RecordsTable.config-DOu5dLR9.js +0 -2
  137. package/dist/adapters/RetentionCombinedChart.config-BLTS46q4.js +0 -2
  138. package/dist/adapters/RetentionCombinedChart.config-DkIUp-uU.cjs +0 -1
  139. package/dist/adapters/RetentionHeatmap.config-Csnntt4P.js +0 -2
  140. package/dist/adapters/RetentionHeatmap.config-Xljn01Px.cjs +0 -1
  141. package/dist/adapters/SankeyChart.config-BExGzO93.cjs +0 -1
  142. package/dist/adapters/SankeyChart.config-DEBF3E7J.js +0 -2
  143. package/dist/adapters/ScatterChart.config-B9fxyVl8.cjs +0 -1
  144. package/dist/adapters/ScatterChart.config-CNWNsjv_.js +0 -2
  145. package/dist/adapters/SunburstChart.config-DyBJr_Ah.js +0 -2
  146. package/dist/adapters/SunburstChart.config-vXKPV3lF.cjs +0 -1
  147. package/dist/adapters/TreeMapChart.config-CoXSasFP.js +0 -2
  148. package/dist/adapters/TreeMapChart.config-iq-fCkIZ.cjs +0 -1
  149. package/dist/adapters/WaterfallChart.config-Coyj2j_7.cjs +0 -1
  150. package/dist/adapters/WaterfallChart.config-Dyf-p2Z2.js +0 -2
  151. package/dist/adapters/openai-ClwjvwzT.cjs +0 -19
  152. package/dist/client/chunks/DashboardEditModal-DfaeSZGf.js.map +0 -1
  153. package/dist/client/chunks/analysis-builder-shared--4LqPSum.js.map +0 -1
  154. package/dist/server/openai-C6tdx3yN.cjs +0 -19
@@ -828,4 +828,4 @@ The query is validated before adding. The portlet fetches its own data.`,paramet
828
828
  [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=Ef(i);let a=t.validateQuery(i,n);if(!a.isValid)return{error:`Invalid query — fix these errors and retry:\n${a.errors.join(`
829
829
  `)}\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=Yp(r,e.chartConfig,i);c=t.chartType,l=t.note;let n=$p(c,e.chartConfig,i),a=Jp(c,n,i);if(!a.isValid)return{error:`Chart config invalid — fix these errors and retry:\n${a.errors.join(`
830
830
  `)}\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=Ef(l),s&&!cm(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=Yp(r,e.chartConfig,l).chartType,f=$p(d,e.chartConfig,l),p=Jp(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(`
831
- `)}`,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&&!cm(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 pm(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-D346-vmt.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 mm(e,t){if(Array.isArray(t))for(let n of t)e.push(n);else e.push(t)}function hm(e){if(e)try{e()}catch{}}function gm(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`}));mm(n,t.formatToolResults(i))}else e.length>0&&n.push({role:`assistant`,content:r.content})}return n}function _m(e,t){if(e?.type===`tool_use`&&t)try{e.input=JSON.parse(t)}catch{e.input={},e.inputParseError=!0}}function vm(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 ym(e,t){e.currentBlockIsToolUse&&e.currentToolInputJson&&_m(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 bm(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&&(_m(t,e.currentToolInputJson),e.currentToolInputJson=``),e.currentBlockIsToolUse=!1}}async function*xm(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`:vm(n,e.text),yield{type:`text_delta`,data:e.text};break;case`tool_use_start`:ym(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`:bm(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*Sm(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}},hm(()=>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}:{}}},hm(()=>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}},hm(()=>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*Cm(e,t){let n=[];for(let r of e){if(r.type!==`tool_use`)continue;let e=yield*Sm(r,t);n.push(e)}return n}var wm={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||wm[d]||`claude-sonnet-4-6`,p=e.baseURLOverride||a.baseURL,m=a.maxTurns||25,h=a.maxTokens||8192,g;try{g=await pm(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:T(`server.errors.llmInitFailed`)}};return}let _=dm(),v=fm({semanticLayer:r,securityContext:i}),y=rf(r.getMetadata(i));e.systemContext&&(y+=`\n\n## User Context\n\n${e.systemContext}`),hm(()=>c?.onChatStart?.({traceId:l,sessionId:s,message:t,model:f,historyLength:n?.length??0}));let b=gm(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*xm(g,t);if(hm(()=>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:T(`server.errors.agentResponseTruncated`)}};break}if(!g.shouldContinue(i))break;let s=yield*Cm(r,{executor:v,observability:c,traceId:l,turn:e});yield{type:`turn_complete`,data:{}},mm(b,g.formatToolResults(s))}hm(()=>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 Q(e){return e.toISOString().split(`T`)[0]}function Em(e,t){let n=new Date,r=Q(n);if(/days?/.test(t)){let t=new Date(n);return t.setDate(t.getDate()-e),{dateRange:[Q(t),r],granularity:`day`}}if(/weeks?/.test(t)){let t=new Date(n);return t.setDate(t.getDate()-e*7),{dateRange:[Q(t),r],granularity:e<=4?`day`:`week`}}if(/months?/.test(t)){let t=new Date(n);return t.setMonth(t.getMonth()-e),{dateRange:[Q(t),r],granularity:e<=3?`day`:`month`}}return null}function Dm(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:[Q(i),Q(a)],granularity:`month`}}function Om(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 km(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 Am(e,t,n,r,i){let a=0;for(let n of t){let t=Sf(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 jm(){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 Mm={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 Nm(e){let t=e.toLowerCase();return Mm.funnel.test(t)?`funnel`:Mm.flow.test(t)?`flow`:Mm.retention.test(t)?`retention`:`query`}function Pm(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=jm(),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=Em(parseInt(t[1],10),n);if(e)return e}return/^q[1-4]$/i.test(t[0])?Dm(t[0]):{dateRange:e.getDateRange(),granularity:e.granularity}}}return null}function Im(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 Lm(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 Rm(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=xf(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 zm(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:Pm(e,void 0)}}function Bm(e,t,n){let r=[],i=[],a={},o=Nm(t),s=Rm(e,t,n,r,i);if(s.length===0)return zm(o,i);let c=s[0],l=.5,u=Im(t);u&&(r.push(`Detected ${u.type} aggregation intent`),l+=.1);let d=[],f=t.toLowerCase();l+=Om(c,f,d,r),d.length===0&&u&&km(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=Lm(t),m=[];l+=Am(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:Pm(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:T(t)})}function Vm(e,t){return e.map(e=>t.get(e)||e)}function Hm(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 Um(e,t){e.measures&&e.measures.length>10&&t.push({type:`performance`,message:T(`server.validation.ai.performanceManyMeasures`,{count:e.measures.length}),suggestion:T(`server.validation.ai.suggestSplitQueries`)}),e.dimensions&&e.dimensions.length>5&&t.push({type:`performance`,message:T(`server.validation.ai.performanceManyDimensions`,{count:e.dimensions.length}),suggestion:T(`server.validation.ai.suggestAddDimensionFilters`)})}function Wm(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:T(`server.validation.ai.dimensionNotTimeType`,{dimension:e,type:a.type}),field:e,suggestion:T(`server.validation.ai.suggestUseTimeDimension`)})}function Gm(e,t,n,r,i){let a=e.member,o=a.split(`.`);if(o.length!==2){n.push({type:`invalid_filter`,message:T(`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:T(`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:T(`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:T(`server.validation.ai.filterFieldNotFound`,{fieldName:c,cubeName:s}),field:a})}function Km(e,t){let n=null;for(let r of t){let t=ff(e.toLowerCase(),r.toLowerCase());t<=3&&(!n||t<n.distance)&&(n={field:r,distance:t})}return n}function qm(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:T(`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=Km(a,i);s?(n.push({type:`cube_not_found`,message:T(`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:T(`server.validation.ai.cubeNotFoundWithAvailable`,{cubeName:a}),field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.measures.some(t=>t.name===e)){let i=Sf(t,o,`measure`);if(i&&i.cube===a)n.push({type:`measure_not_found`,message:T(`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=Km(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`measure_not_found`,message:T(`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:T(`server.validation.ai.measureNotFoundWithAvailable`,{measureName:o,cubeName:a}),field:e,suggestion:`Available measures: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function Jm(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:T(`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=Km(a,i);s?(n.push({type:`cube_not_found`,message:T(`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:T(`server.validation.ai.cubeNotFoundWithAvailable`,{cubeName:a}),field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.dimensions.some(t=>t.name===e)){let i=Sf(t,o,`dimension`);if(i&&i.cube===a)n.push({type:`dimension_not_found`,message:T(`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=Km(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`dimension_not_found`,message:T(`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:T(`server.validation.ai.dimensionNotFoundWithAvailable`,{dimensionName:o,cubeName:a}),field:e,suggestion:`Available dimensions: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function Ym(e,t,n,r){for(let i of e){if(`and`in i&&Array.isArray(i.and)){Ym(i.and,t,n,r);continue}if(`or`in i&&Array.isArray(i.or)){Ym(i.or,t,n,r);continue}`member`in i&&Gm(i,t,n,r,Km)}}function Xm(e,t,n,r,i){let a=e.funnel;if(!a)return;let o=(e,n)=>Jm(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:T(`server.validation.ai.funnelStepsRequired`)});else if(a.steps.length<2)n.push({type:`syntax_error`,message:T(`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:T(`server.validation.ai.stepMissingName`,{step:e+1}),suggestion:T(`server.validation.ai.suggestAddStepNames`)}),o.filter&&`member`in o.filter&&Ym([o.filter],t,n,i)}}function Zm(e,t,n,r,i){let a=e.flow;if(!a)return;let o=(e,n)=>Jm(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:T(`server.validation.ai.stepsBothMissing`),suggestion:T(`server.validation.ai.suggestSetSteps`)})}function Qm(e,t,n,r,i){let a=e.retention;if(!a)return;let o=(e,n)=>Jm(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:T(`server.validation.ai.granularityNotSpecified`),suggestion:T(`server.validation.ai.suggestSpecifyGranularity`)}),a.periods||r.push({type:`best_practice`,message:T(`server.validation.ai.periodsNotSpecified`),suggestion:T(`server.validation.ai.suggestSpecifyPeriods`)})}function $m(e,t,n,r,i){return e.funnel?(Xm(e,t,n,r,i),!0):e.flow?(Zm(e,t,n,r,i),!0):e.retention?(Qm(e,t,n,r,i),!0):!1}function eh(e,t,n,r,i){if(e.measures)for(let r of e.measures)qm(r,t,n,i);if(e.dimensions)for(let r of e.dimensions)Jm(r,t,n,i);if(e.timeDimensions)for(let a of e.timeDimensions)Jm(a.dimension,t,n,i),Wm(a.dimension,t,r);e.filters&&Ym(e.filters,t,n,i),!e.measures?.length&&!e.dimensions?.length&&n.push({type:`syntax_error`,message:T(`server.validation.ai.emptyQuery`)}),Um(e,r)}function th(e,t){let n=[],r=[],i=new Map;if($m(e,t,n,r,i))return{isValid:n.length===0,errors:n,warnings:r,correctedQuery:void 0};eh(e,t,n,r,i);let a=Hm(e,i);return{isValid:n.length===0,errors:n,warnings:r,correctedQuery:a}}function nh(e){return new Ad({drizzle:e.drizzle,schema:e.schema})}exports.BASE_CUBE_SET_ID=Dd,exports.BaseDatabaseExecutor=x,exports.CTEBuilder=An,exports.CalculatedMeasureResolver=A,exports.ComparisonQueryBuilder=Gr,exports.DatabendExecutor=Fe,exports.DrizzlePlanBuilder=ea,exports.DrizzleSqlBuilder=mn,exports.DuckDBExecutor=Ae,exports.EXPLAIN_ANALYSIS_PROMPT=Hd,exports.FlowQueryBuilder=qr,exports.FunnelQueryBuilder=Kr,exports.IdentityOptimiser=si,exports.JoinPathResolver=w,exports.LogicalPlanBuilder=oi,exports.LogicalPlanner=kn,exports.MemoryCacheProvider=Nd,exports.MySQLExecutor=ye,exports.OptimiserPipeline=ci,exports.PostgresExecutor=he,exports.QueryExecutor=na,exports.QueryValidationError=sr,exports.RetentionQueryBuilder=$r,exports.SINGLE_TENANT_CONTEXT=Od,exports.SQLiteExecutor=Ce,exports.STEP0_VALIDATION_PROMPT=Pd,exports.STEP1_SYSTEM_PROMPT=Rd,exports.STEP2_SYSTEM_PROMPT=Bd,exports.SYSTEM_PROMPT_TEMPLATE=Id,exports.SemanticLayerCompiler=Ad,exports.SnowflakeExecutor=Ve,exports.aiValidateQuery=th,exports.buildAgentSystemPrompt=rf,exports.buildAttributeDimensions=jd,exports.buildExplainAnalysisPrompt=Ud,exports.buildStep0Prompt=Fd,exports.buildStep1Prompt=zd,exports.buildStep2Prompt=Vd,exports.buildSystemPrompt=Ld,exports.createDatabaseExecutor=Ue,exports.createDatabendExecutor=Ie,exports.createDrizzleSemanticLayer=nh,exports.createDuckDBExecutor=je,exports.createMultiCubeContext=Ye,exports.createMySQLExecutor=be,exports.createPostgresExecutor=ge,exports.createSQLiteExecutor=we,exports.createSnowflakeExecutor=He,exports.createToolExecutor=fm,exports.defineCube=Xe,exports.detectQueryMode=ir,exports.detectQueryModes=nr,exports.discoverCubes=xf,exports.findBestFieldMatch=Sf,exports.fnv1aHash=Vr,exports.formatCubeSchemaForExplain=Wd,exports.formatExistingIndexes=Gd,exports.generateCacheKey=Pr,exports.getActiveQueryModes=rr,exports.getCubeInvalidationPattern=Ur,exports.getJoinType=Ge,exports.getToolDefinitions=dm,exports.handleAgentChat=Tm,exports.hasComparisonMode=Qn,exports.hasFlowMode=er,exports.hasFunnelMode=$n,exports.hasRetentionMode=tr,exports.normalizeQuery=Fr,exports.resolveCubeReference=S,exports.resolveSqlExpression=C,exports.strongHash=Hr,exports.suggestQuery=Bm;
831
+ `)}`,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&&!cm(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 pm(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-BIHkBS7X.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 mm(e,t){if(Array.isArray(t))for(let n of t)e.push(n);else e.push(t)}function hm(e){if(e)try{e()}catch{}}function gm(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`}));mm(n,t.formatToolResults(i))}else e.length>0&&n.push({role:`assistant`,content:r.content})}return n}function _m(e,t){if(e?.type===`tool_use`&&t)try{e.input=JSON.parse(t)}catch{e.input={},e.inputParseError=!0}}function vm(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 ym(e,t){e.currentBlockIsToolUse&&e.currentToolInputJson&&_m(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 bm(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&&(_m(t,e.currentToolInputJson),e.currentToolInputJson=``),e.currentBlockIsToolUse=!1}}async function*xm(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`:vm(n,e.text),yield{type:`text_delta`,data:e.text};break;case`tool_use_start`:ym(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`:bm(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*Sm(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}},hm(()=>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}:{}}},hm(()=>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}},hm(()=>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*Cm(e,t){let n=[];for(let r of e){if(r.type!==`tool_use`)continue;let e=yield*Sm(r,t);n.push(e)}return n}var wm={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||wm[d]||`claude-sonnet-4-6`,p=e.baseURLOverride||a.baseURL,m=a.maxTurns||25,h=a.maxTokens||8192,g;try{g=await pm(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:T(`server.errors.llmInitFailed`)}};return}let _=dm(),v=fm({semanticLayer:r,securityContext:i}),y=rf(r.getMetadata(i));e.systemContext&&(y+=`\n\n## User Context\n\n${e.systemContext}`),hm(()=>c?.onChatStart?.({traceId:l,sessionId:s,message:t,model:f,historyLength:n?.length??0}));let b=gm(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*xm(g,t);if(hm(()=>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:T(`server.errors.agentResponseTruncated`)}};break}if(!g.shouldContinue(i))break;let s=yield*Cm(r,{executor:v,observability:c,traceId:l,turn:e});yield{type:`turn_complete`,data:{}},mm(b,g.formatToolResults(s))}hm(()=>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 Q(e){return e.toISOString().split(`T`)[0]}function Em(e,t){let n=new Date,r=Q(n);if(/days?/.test(t)){let t=new Date(n);return t.setDate(t.getDate()-e),{dateRange:[Q(t),r],granularity:`day`}}if(/weeks?/.test(t)){let t=new Date(n);return t.setDate(t.getDate()-e*7),{dateRange:[Q(t),r],granularity:e<=4?`day`:`week`}}if(/months?/.test(t)){let t=new Date(n);return t.setMonth(t.getMonth()-e),{dateRange:[Q(t),r],granularity:e<=3?`day`:`month`}}return null}function Dm(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:[Q(i),Q(a)],granularity:`month`}}function Om(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 km(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 Am(e,t,n,r,i){let a=0;for(let n of t){let t=Sf(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 jm(){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 Mm={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 Nm(e){let t=e.toLowerCase();return Mm.funnel.test(t)?`funnel`:Mm.flow.test(t)?`flow`:Mm.retention.test(t)?`retention`:`query`}function Pm(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=jm(),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=Em(parseInt(t[1],10),n);if(e)return e}return/^q[1-4]$/i.test(t[0])?Dm(t[0]):{dateRange:e.getDateRange(),granularity:e.granularity}}}return null}function Im(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 Lm(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 Rm(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=xf(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 zm(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:Pm(e,void 0)}}function Bm(e,t,n){let r=[],i=[],a={},o=Nm(t),s=Rm(e,t,n,r,i);if(s.length===0)return zm(o,i);let c=s[0],l=.5,u=Im(t);u&&(r.push(`Detected ${u.type} aggregation intent`),l+=.1);let d=[],f=t.toLowerCase();l+=Om(c,f,d,r),d.length===0&&u&&km(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=Lm(t),m=[];l+=Am(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:Pm(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:T(t)})}function Vm(e,t){return e.map(e=>t.get(e)||e)}function Hm(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 Um(e,t){e.measures&&e.measures.length>10&&t.push({type:`performance`,message:T(`server.validation.ai.performanceManyMeasures`,{count:e.measures.length}),suggestion:T(`server.validation.ai.suggestSplitQueries`)}),e.dimensions&&e.dimensions.length>5&&t.push({type:`performance`,message:T(`server.validation.ai.performanceManyDimensions`,{count:e.dimensions.length}),suggestion:T(`server.validation.ai.suggestAddDimensionFilters`)})}function Wm(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:T(`server.validation.ai.dimensionNotTimeType`,{dimension:e,type:a.type}),field:e,suggestion:T(`server.validation.ai.suggestUseTimeDimension`)})}function Gm(e,t,n,r,i){let a=e.member,o=a.split(`.`);if(o.length!==2){n.push({type:`invalid_filter`,message:T(`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:T(`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:T(`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:T(`server.validation.ai.filterFieldNotFound`,{fieldName:c,cubeName:s}),field:a})}function Km(e,t){let n=null;for(let r of t){let t=ff(e.toLowerCase(),r.toLowerCase());t<=3&&(!n||t<n.distance)&&(n={field:r,distance:t})}return n}function qm(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:T(`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=Km(a,i);s?(n.push({type:`cube_not_found`,message:T(`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:T(`server.validation.ai.cubeNotFoundWithAvailable`,{cubeName:a}),field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.measures.some(t=>t.name===e)){let i=Sf(t,o,`measure`);if(i&&i.cube===a)n.push({type:`measure_not_found`,message:T(`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=Km(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`measure_not_found`,message:T(`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:T(`server.validation.ai.measureNotFoundWithAvailable`,{measureName:o,cubeName:a}),field:e,suggestion:`Available measures: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function Jm(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:T(`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=Km(a,i);s?(n.push({type:`cube_not_found`,message:T(`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:T(`server.validation.ai.cubeNotFoundWithAvailable`,{cubeName:a}),field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.dimensions.some(t=>t.name===e)){let i=Sf(t,o,`dimension`);if(i&&i.cube===a)n.push({type:`dimension_not_found`,message:T(`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=Km(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`dimension_not_found`,message:T(`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:T(`server.validation.ai.dimensionNotFoundWithAvailable`,{dimensionName:o,cubeName:a}),field:e,suggestion:`Available dimensions: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function Ym(e,t,n,r){for(let i of e){if(`and`in i&&Array.isArray(i.and)){Ym(i.and,t,n,r);continue}if(`or`in i&&Array.isArray(i.or)){Ym(i.or,t,n,r);continue}`member`in i&&Gm(i,t,n,r,Km)}}function Xm(e,t,n,r,i){let a=e.funnel;if(!a)return;let o=(e,n)=>Jm(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:T(`server.validation.ai.funnelStepsRequired`)});else if(a.steps.length<2)n.push({type:`syntax_error`,message:T(`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:T(`server.validation.ai.stepMissingName`,{step:e+1}),suggestion:T(`server.validation.ai.suggestAddStepNames`)}),o.filter&&`member`in o.filter&&Ym([o.filter],t,n,i)}}function Zm(e,t,n,r,i){let a=e.flow;if(!a)return;let o=(e,n)=>Jm(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:T(`server.validation.ai.stepsBothMissing`),suggestion:T(`server.validation.ai.suggestSetSteps`)})}function Qm(e,t,n,r,i){let a=e.retention;if(!a)return;let o=(e,n)=>Jm(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:T(`server.validation.ai.granularityNotSpecified`),suggestion:T(`server.validation.ai.suggestSpecifyGranularity`)}),a.periods||r.push({type:`best_practice`,message:T(`server.validation.ai.periodsNotSpecified`),suggestion:T(`server.validation.ai.suggestSpecifyPeriods`)})}function $m(e,t,n,r,i){return e.funnel?(Xm(e,t,n,r,i),!0):e.flow?(Zm(e,t,n,r,i),!0):e.retention?(Qm(e,t,n,r,i),!0):!1}function eh(e,t,n,r,i){if(e.measures)for(let r of e.measures)qm(r,t,n,i);if(e.dimensions)for(let r of e.dimensions)Jm(r,t,n,i);if(e.timeDimensions)for(let a of e.timeDimensions)Jm(a.dimension,t,n,i),Wm(a.dimension,t,r);e.filters&&Ym(e.filters,t,n,i),!e.measures?.length&&!e.dimensions?.length&&n.push({type:`syntax_error`,message:T(`server.validation.ai.emptyQuery`)}),Um(e,r)}function th(e,t){let n=[],r=[],i=new Map;if($m(e,t,n,r,i))return{isValid:n.length===0,errors:n,warnings:r,correctedQuery:void 0};eh(e,t,n,r,i);let a=Hm(e,i);return{isValid:n.length===0,errors:n,warnings:r,correctedQuery:a}}function nh(e){return new Ad({drizzle:e.drizzle,schema:e.schema})}exports.BASE_CUBE_SET_ID=Dd,exports.BaseDatabaseExecutor=x,exports.CTEBuilder=An,exports.CalculatedMeasureResolver=A,exports.ComparisonQueryBuilder=Gr,exports.DatabendExecutor=Fe,exports.DrizzlePlanBuilder=ea,exports.DrizzleSqlBuilder=mn,exports.DuckDBExecutor=Ae,exports.EXPLAIN_ANALYSIS_PROMPT=Hd,exports.FlowQueryBuilder=qr,exports.FunnelQueryBuilder=Kr,exports.IdentityOptimiser=si,exports.JoinPathResolver=w,exports.LogicalPlanBuilder=oi,exports.LogicalPlanner=kn,exports.MemoryCacheProvider=Nd,exports.MySQLExecutor=ye,exports.OptimiserPipeline=ci,exports.PostgresExecutor=he,exports.QueryExecutor=na,exports.QueryValidationError=sr,exports.RetentionQueryBuilder=$r,exports.SINGLE_TENANT_CONTEXT=Od,exports.SQLiteExecutor=Ce,exports.STEP0_VALIDATION_PROMPT=Pd,exports.STEP1_SYSTEM_PROMPT=Rd,exports.STEP2_SYSTEM_PROMPT=Bd,exports.SYSTEM_PROMPT_TEMPLATE=Id,exports.SemanticLayerCompiler=Ad,exports.SnowflakeExecutor=Ve,exports.aiValidateQuery=th,exports.buildAgentSystemPrompt=rf,exports.buildAttributeDimensions=jd,exports.buildExplainAnalysisPrompt=Ud,exports.buildStep0Prompt=Fd,exports.buildStep1Prompt=zd,exports.buildStep2Prompt=Vd,exports.buildSystemPrompt=Ld,exports.createDatabaseExecutor=Ue,exports.createDatabendExecutor=Ie,exports.createDrizzleSemanticLayer=nh,exports.createDuckDBExecutor=je,exports.createMultiCubeContext=Ye,exports.createMySQLExecutor=be,exports.createPostgresExecutor=ge,exports.createSQLiteExecutor=we,exports.createSnowflakeExecutor=He,exports.createToolExecutor=fm,exports.defineCube=Xe,exports.detectQueryMode=ir,exports.detectQueryModes=nr,exports.discoverCubes=xf,exports.findBestFieldMatch=Sf,exports.fnv1aHash=Vr,exports.formatCubeSchemaForExplain=Wd,exports.formatExistingIndexes=Gd,exports.generateCacheKey=Pr,exports.getActiveQueryModes=rr,exports.getCubeInvalidationPattern=Ur,exports.getJoinType=Ge,exports.getToolDefinitions=dm,exports.handleAgentChat=Tm,exports.hasComparisonMode=Qn,exports.hasFlowMode=er,exports.hasFunnelMode=$n,exports.hasRetentionMode=tr,exports.normalizeQuery=Fr,exports.resolveCubeReference=S,exports.resolveSqlExpression=C,exports.strongHash=Hr,exports.suggestQuery=Bm;
@@ -18044,7 +18044,7 @@ async function Jm(e, t, n) {
18044
18044
  return new e(t);
18045
18045
  }
18046
18046
  case "openai": {
18047
- let { OpenAIProvider: e } = await import("./openai-SILGL2q_.js");
18047
+ let { OpenAIProvider: e } = await import("./openai-CPW5x6kl.js");
18048
18048
  return new e(t, n);
18049
18049
  }
18050
18050
  case "google": {
@@ -1 +1 @@
1
- function*e(e,t){let n=e.index??0;if(e.id&&(t.set(n,{id:e.id,name:e.function?.name||``,arguments:``}),yield{type:`tool_use_start`,id:e.id,name:e.function?.name||``}),e.function?.name&&t.has(n)){let r=t.get(n);r.name||=e.function.name}if(e.function?.arguments){let r=t.get(n);r&&(r.arguments+=e.function.arguments,yield{type:`tool_input_delta`,json:e.function.arguments})}}function*t(e,t){for(let[e,n]of t){let r={},i=!1;try{n.arguments&&(r=JSON.parse(n.arguments))}catch{i=!0}yield{type:`tool_use_end`,id:n.id,input:r,parseError:i},t.delete(e)}yield{type:`message_meta`,stopReason:e}}function*n(n,r){n.usage&&(yield{type:`message_meta`,inputTokens:n.usage.prompt_tokens,outputTokens:n.usage.completion_tokens,stopReason:``});let i=n.choices?.[0];if(!i)return;let a=i.delta;if(a){if(a.content&&(yield{type:`text_delta`,text:a.content}),a.tool_calls)for(let t of a.tool_calls)yield*e(t,r);i.finish_reason&&(yield*t(i.finish_reason,r))}}var r=class{client;apiKey;baseURL;initialized=!1;constructor(e,t){this.apiKey=e,this.baseURL=t?.baseURL}async ensureClient(){if(this.initialized)return;let e;try{let t=await Promise.resolve().then(()=>require("./openai-C6tdx3yN.cjs"));e=t.default||t.OpenAI||t}catch{throw Error(`openai is required for the OpenAI provider. Install it with: npm install openai`)}let t={apiKey:this.apiKey};this.baseURL&&(t.baseURL=this.baseURL),this.client=new e(t),this.initialized=!0}async createStream(e){await this.ensureClient();let{messages:t}=this.formatMessages(e.messages,e.system);return this.client.chat.completions.create({model:e.model,max_completion_tokens:e.maxTokens,tools:this.formatTools(e.tools),messages:t,stream:!0,stream_options:{include_usage:!0}})}async*parseStreamEvents(e){let t=new Map;for await(let r of e)yield*n(r,t)}formatTools(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}formatMessages(e,t){let n=[{role:`system`,content:t}];for(let t of e)if(t.role===`user`)n.push({role:`user`,content:typeof t.content==`string`?t.content:JSON.stringify(t.content)});else if(t.role===`assistant`){if(typeof t.content==`string`)n.push({role:`assistant`,content:t.content});else{let e=t.content,r=e.filter(e=>e.type===`text`).map(e=>e.text).join(``),i=e.filter(e=>e.type===`tool_use`).map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input||{})}})),a={role:`assistant`};r&&(a.content=r),i.length>0&&(a.tool_calls=i),n.push(a)}}else t.role===`tool`?n.push(t):t.role===`tool_result`&&n.push({role:`user`,content:typeof t.content==`string`?t.content:JSON.stringify(t.content)});return{messages:n}}formatToolResults(e){return e.map(e=>({role:`tool`,tool_call_id:e.toolUseId,content:e.content}))}shouldContinue(e){return e===`tool_calls`}isTruncated(e){return e===`length`}formatError(e){if(!e||!(e instanceof Error))return`Something went wrong. Please try again.`;let t=e.message||``,n=e;return n.status===429?`Too many requests. Please wait a moment and try again.`:n.status===401?`Authentication failed. Please check your API key configuration.`:n.status===503||n.status===502?`The AI service is temporarily unavailable. Please try again in a moment.`:n.status===400?`There was a problem with the request. Please try again.`:t.startsWith(`{`)||t.startsWith(`Error: {`)?`The AI service encountered an error. Please try again.`:t}};exports.OpenAIProvider=r;
1
+ function*e(e,t){let n=e.index??0;if(e.id&&(t.set(n,{id:e.id,name:e.function?.name||``,arguments:``}),yield{type:`tool_use_start`,id:e.id,name:e.function?.name||``}),e.function?.name&&t.has(n)){let r=t.get(n);r.name||=e.function.name}if(e.function?.arguments){let r=t.get(n);r&&(r.arguments+=e.function.arguments,yield{type:`tool_input_delta`,json:e.function.arguments})}}function*t(e,t){for(let[e,n]of t){let r={},i=!1;try{n.arguments&&(r=JSON.parse(n.arguments))}catch{i=!0}yield{type:`tool_use_end`,id:n.id,input:r,parseError:i},t.delete(e)}yield{type:`message_meta`,stopReason:e}}function*n(n,r){n.usage&&(yield{type:`message_meta`,inputTokens:n.usage.prompt_tokens,outputTokens:n.usage.completion_tokens,stopReason:``});let i=n.choices?.[0];if(!i)return;let a=i.delta;if(a){if(a.content&&(yield{type:`text_delta`,text:a.content}),a.tool_calls)for(let t of a.tool_calls)yield*e(t,r);i.finish_reason&&(yield*t(i.finish_reason,r))}}var r=class{client;apiKey;baseURL;initialized=!1;constructor(e,t){this.apiKey=e,this.baseURL=t?.baseURL}async ensureClient(){if(this.initialized)return;let e;try{let t=await Promise.resolve().then(()=>require("./openai-xQRpdAPa.cjs"));e=t.default||t.OpenAI||t}catch{throw Error(`openai is required for the OpenAI provider. Install it with: npm install openai`)}let t={apiKey:this.apiKey};this.baseURL&&(t.baseURL=this.baseURL),this.client=new e(t),this.initialized=!0}async createStream(e){await this.ensureClient();let{messages:t}=this.formatMessages(e.messages,e.system);return this.client.chat.completions.create({model:e.model,max_completion_tokens:e.maxTokens,tools:this.formatTools(e.tools),messages:t,stream:!0,stream_options:{include_usage:!0}})}async*parseStreamEvents(e){let t=new Map;for await(let r of e)yield*n(r,t)}formatTools(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}formatMessages(e,t){let n=[{role:`system`,content:t}];for(let t of e)if(t.role===`user`)n.push({role:`user`,content:typeof t.content==`string`?t.content:JSON.stringify(t.content)});else if(t.role===`assistant`){if(typeof t.content==`string`)n.push({role:`assistant`,content:t.content});else{let e=t.content,r=e.filter(e=>e.type===`text`).map(e=>e.text).join(``),i=e.filter(e=>e.type===`tool_use`).map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input||{})}})),a={role:`assistant`};r&&(a.content=r),i.length>0&&(a.tool_calls=i),n.push(a)}}else t.role===`tool`?n.push(t):t.role===`tool_result`&&n.push({role:`user`,content:typeof t.content==`string`?t.content:JSON.stringify(t.content)});return{messages:n}}formatToolResults(e){return e.map(e=>({role:`tool`,tool_call_id:e.toolUseId,content:e.content}))}shouldContinue(e){return e===`tool_calls`}isTruncated(e){return e===`length`}formatError(e){if(!e||!(e instanceof Error))return`Something went wrong. Please try again.`;let t=e.message||``,n=e;return n.status===429?`Too many requests. Please wait a moment and try again.`:n.status===401?`Authentication failed. Please check your API key configuration.`:n.status===503||n.status===502?`The AI service is temporarily unavailable. Please try again in a moment.`:n.status===400?`There was a problem with the request. Please try again.`:t.startsWith(`{`)||t.startsWith(`Error: {`)?`The AI service encountered an error. Please try again.`:t}};exports.OpenAIProvider=r;
@@ -73,7 +73,7 @@ var r = class {
73
73
  try {
74
74
  let t = await import(
75
75
  /* webpackIgnore: true */
76
- "./openai-D0vh48Oi.js"
76
+ "./openai-DCC49vC6.js"
77
77
  );
78
78
  e = t.default || t.OpenAI || t;
79
79
  } catch {