drizzle-cube 0.4.36 → 0.4.37

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 (74) hide show
  1. package/dist/adapters/express/index.cjs +1 -1
  2. package/dist/adapters/express/index.js +3 -3
  3. package/dist/adapters/fastify/index.cjs +1 -1
  4. package/dist/adapters/fastify/index.js +3 -3
  5. package/dist/adapters/{handler-DzUX7CBs.cjs → handler-dHHEEbG9.cjs} +1 -1
  6. package/dist/adapters/{handler-J55KQKe5.js → handler-fto6TSVn.js} +1 -1
  7. package/dist/adapters/hono/index.cjs +1 -1
  8. package/dist/adapters/hono/index.js +3 -3
  9. package/dist/adapters/{mcp-transport-CjA5_6G_.cjs → mcp-transport-ro4OL4BW.cjs} +4 -4
  10. package/dist/adapters/{mcp-transport-x_A7Q5OL.js → mcp-transport-tB5a7Het.js} +70 -17
  11. package/dist/adapters/nextjs/index.cjs +1 -1
  12. package/dist/adapters/nextjs/index.js +3 -3
  13. package/dist/adapters/{utils-CDExg9uP.cjs → utils-2MwxiQ2o.cjs} +1 -1
  14. package/dist/adapters/{utils-DkKcpkx5.js → utils-_2o905Fi.js} +2 -1
  15. package/dist/adapters/utils.cjs +1 -1
  16. package/dist/adapters/utils.d.ts +2 -0
  17. package/dist/adapters/utils.js +1 -1
  18. package/dist/client/charts.js +3 -3
  19. package/dist/client/chunks/{DashboardEditModal-kWEk4KJC.js → DashboardEditModal-B083DSGL.js} +7 -7
  20. package/dist/client/chunks/DashboardEditModal-B083DSGL.js.map +1 -0
  21. package/dist/client/chunks/{FieldSearchModal-rB26lhBD.js → FieldSearchModal-BxQ5JhWz.js} +2 -2
  22. package/dist/client/chunks/{FieldSearchModal-rB26lhBD.js.map → FieldSearchModal-BxQ5JhWz.js.map} +1 -1
  23. package/dist/client/chunks/{analysis-builder-CdDPUAEU.js → analysis-builder-BFb3zjl5.js} +1783 -2561
  24. package/dist/client/chunks/analysis-builder-BFb3zjl5.js.map +1 -0
  25. package/dist/client/chunks/{analysis-builder-shared-3V70XUNW.js → analysis-builder-shared-BFzd2jx_.js} +1498 -716
  26. package/dist/client/chunks/analysis-builder-shared-BFzd2jx_.js.map +1 -0
  27. package/dist/client/chunks/{chart-data-table-BlkFWPhF.js → chart-data-table-CW_qZDpt.js} +11 -1
  28. package/dist/client/chunks/chart-data-table-CW_qZDpt.js.map +1 -0
  29. package/dist/client/chunks/{chart-kpi-delta-CUIjCDS3.js → chart-kpi-delta-BPexzOe7.js} +2 -2
  30. package/dist/client/chunks/{chart-kpi-delta-CUIjCDS3.js.map → chart-kpi-delta-BPexzOe7.js.map} +1 -1
  31. package/dist/client/chunks/{chart-kpi-number-CxlpSKYh.js → chart-kpi-number-BBtGBtZL.js} +3 -3
  32. package/dist/client/chunks/{chart-kpi-number-CxlpSKYh.js.map → chart-kpi-number-BBtGBtZL.js.map} +1 -1
  33. package/dist/client/chunks/{chart-kpi-text-C16fwohp.js → chart-kpi-text-BqHhmJEB.js} +2 -2
  34. package/dist/client/chunks/{chart-kpi-text-C16fwohp.js.map → chart-kpi-text-BqHhmJEB.js.map} +1 -1
  35. package/dist/client/chunks/{charts-loader-BFhQWB_d.js → charts-loader-gZjOqZwG.js} +5 -5
  36. package/dist/client/chunks/{charts-loader-BFhQWB_d.js.map → charts-loader-gZjOqZwG.js.map} +1 -1
  37. package/dist/client/chunks/{schema-visualization-qmLI8MGQ.js → schema-visualization-XLFzV_7p.js} +2 -2
  38. package/dist/client/chunks/{schema-visualization-qmLI8MGQ.js.map → schema-visualization-XLFzV_7p.js.map} +1 -1
  39. package/dist/client/chunks/{useDebounce-xfPFr2fi.js → useDebounce-C_wstEud.js} +2 -2
  40. package/dist/client/chunks/{useDebounce-xfPFr2fi.js.map → useDebounce-C_wstEud.js.map} +1 -1
  41. package/dist/client/chunks/{useExplainAI-6COjssus.js → useExplainAI-C9ytXRIC.js} +21 -18
  42. package/dist/client/chunks/{useExplainAI-6COjssus.js.map → useExplainAI-C9ytXRIC.js.map} +1 -1
  43. package/dist/client/chunks/{utils-nCeVL-Hm.js → utils-3FNmeZJR.js} +2 -2
  44. package/dist/client/chunks/{utils-nCeVL-Hm.js.map → utils-3FNmeZJR.js.map} +1 -1
  45. package/dist/client/chunks/{vendor-WzXX36hd.js → vendor-BPRWulB7.js} +2 -2
  46. package/dist/client/chunks/{vendor-WzXX36hd.js.map → vendor-BPRWulB7.js.map} +1 -1
  47. package/dist/client/components/AIAssistant/utils.d.ts +1 -1
  48. package/dist/client/components/DataBrowser/DataBrowserSidebar.d.ts +16 -0
  49. package/dist/client/components/DataBrowser/DataBrowserTable.d.ts +16 -0
  50. package/dist/client/components/DataBrowser/DataBrowserToolbar.d.ts +22 -0
  51. package/dist/client/components/DataBrowser/index.d.ts +28 -0
  52. package/dist/client/components.js +3 -3
  53. package/dist/client/hooks/useDataBrowser.d.ts +67 -0
  54. package/dist/client/hooks.js +3 -3
  55. package/dist/client/icons/types.d.ts +1 -0
  56. package/dist/client/icons.js +1 -1
  57. package/dist/client/index.d.ts +3 -0
  58. package/dist/client/index.js +774 -192
  59. package/dist/client/index.js.map +1 -1
  60. package/dist/client/providers/CubeApiProvider.d.ts +1 -0
  61. package/dist/client/providers.js +1 -1
  62. package/dist/client/stores/dataBrowserStore.d.ts +34 -0
  63. package/dist/client/styles.css +1 -1
  64. package/dist/client/types.d.ts +2 -0
  65. package/dist/client/utils.js +3 -3
  66. package/dist/client-bundle-stats.html +1 -1
  67. package/dist/server/index.cjs +3 -3
  68. package/dist/server/index.d.ts +18 -0
  69. package/dist/server/index.js +68 -15
  70. package/package.json +1 -1
  71. package/dist/client/chunks/DashboardEditModal-kWEk4KJC.js.map +0 -1
  72. package/dist/client/chunks/analysis-builder-CdDPUAEU.js.map +0 -1
  73. package/dist/client/chunks/analysis-builder-shared-3V70XUNW.js.map +0 -1
  74. package/dist/client/chunks/chart-data-table-BlkFWPhF.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { c as e, d as t, h as n, p as r, s as i } from "./utils-DkKcpkx5.js";
1
+ import { c as e, d as t, h as n, p as r, s as i } from "./utils-_2o905Fi.js";
2
2
  import { a } from "./mcp-prompts-BAutSQYA.js";
3
3
  //#region node_modules/drizzle-orm/entity.js
4
4
  var o = Symbol.for("drizzle:entityKind");
@@ -3385,6 +3385,7 @@ var Z = class e {
3385
3385
  if (e.isPostAggregationWindow(t)) throw Error(`Post-aggregation window measure '${t.name}' should be built via buildPostAggregationWindowExpression, not buildMeasureExpression.`);
3386
3386
  if (!t.sql) throw Error(`Measure '${t.name}' of type '${t.type}' is missing required 'sql' property. Only calculated measures and post-aggregation window functions can omit 'sql'.`);
3387
3387
  let i = K(t.sql, n);
3388
+ if (n.ungrouped) return i;
3388
3389
  if (t.filters && t.filters.length > 0) {
3389
3390
  let e = t.filters.map((e) => {
3390
3391
  let t = e(n);
@@ -3594,6 +3595,7 @@ var Z = class e {
3594
3595
  ].includes(e);
3595
3596
  }
3596
3597
  buildGroupByFields(e, t, n, r) {
3598
+ if (t.ungrouped) return [];
3597
3599
  let i = [], a = e instanceof Map ? e : new Map([[e.name, e]]), o = t.dimensions && t.dimensions.length > 0 || t.timeDimensions && t.timeDimensions.length > 0, s = t.measures && t.measures.length > 0, c = o && !s, l = !1;
3598
3600
  for (let e of t.measures || []) {
3599
3601
  let [t, n] = e.split("."), r = a.get(t);
@@ -6847,14 +6849,15 @@ function pn(e, t, n, r, i, a, o, s) {
6847
6849
  u = u.where(e);
6848
6850
  }
6849
6851
  let d = s.queryBuilder.buildGroupByFields(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e);
6850
- d.length > 0 && (u = u.groupBy(...d));
6851
- let f = s.queryBuilder.buildHavingConditions(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e);
6852
- if (f.length > 0) {
6853
- let e = f.length === 1 ? f[0] : R(...f);
6854
- u = u.having(e);
6855
- }
6856
- let p = s.queryBuilder.buildOrderBy(t);
6857
- return p.length > 0 && (u = u.orderBy(...p)), u = s.queryBuilder.applyLimitAndOffset(u, t), u;
6852
+ if (d.length > 0 && (u = u.groupBy(...d)), !t.ungrouped) {
6853
+ let i = s.queryBuilder.buildHavingConditions(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e);
6854
+ if (i.length > 0) {
6855
+ let e = i.length === 1 ? i[0] : R(...i);
6856
+ u = u.having(e);
6857
+ }
6858
+ }
6859
+ let f = s.queryBuilder.buildOrderBy(t);
6860
+ return f.length > 0 && (u = u.orderBy(...f)), u = s.queryBuilder.applyLimitAndOffset(u, t), u;
6858
6861
  }
6859
6862
  //#endregion
6860
6863
  //#region src/server/physical-plan/processors/shared.ts
@@ -7309,11 +7312,11 @@ var gn = class {
7309
7312
  }
7310
7313
  }
7311
7314
  buildLogicalPlan(e, t, n) {
7312
- let r = new q(), i = this.createQueryContext(n, r);
7315
+ let r = new q(), i = this.createQueryContext(n, r, t);
7313
7316
  return this.preloadFilterCache(t, r, e, i), this.buildRegularQueryArtifacts(e, t, i).optimisedPlan;
7314
7317
  }
7315
7318
  analyzeQuery(e, t, n) {
7316
- let r = new q(), i = this.createQueryContext(n, r);
7319
+ let r = new q(), i = this.createQueryContext(n, r, t);
7317
7320
  return this.preloadFilterCache(t, r, e, i), this.buildRegularQueryArtifacts(e, t, i).analysis;
7318
7321
  }
7319
7322
  async executeQuery(e, t, n) {
@@ -7444,7 +7447,7 @@ var gn = class {
7444
7447
  };
7445
7448
  }
7446
7449
  async executeStandardQuery(e, t, n) {
7447
- let r = new q(), i = this.createQueryContext(n, r);
7450
+ let r = new q(), i = this.createQueryContext(n, r, t);
7448
7451
  this.preloadFilterCache(t, r, e, i);
7449
7452
  let { optimisedPlan: a } = this.buildRegularQueryArtifacts(e, t, i), o = this.drizzlePlanBuilder.derivePhysicalPlanContext(a), s = this.drizzlePlanBuilder.build(o, t, i);
7450
7453
  Q("query", s);
@@ -7467,12 +7470,13 @@ var gn = class {
7467
7470
  annotation: this.generateAnnotations(o, t)
7468
7471
  };
7469
7472
  }
7470
- createQueryContext(e, t) {
7473
+ createQueryContext(e, t, n) {
7471
7474
  return {
7472
7475
  db: this.dbExecutor.db,
7473
7476
  schema: this.dbExecutor.schema,
7474
7477
  securityContext: e,
7475
- filterCache: t
7478
+ filterCache: t,
7479
+ ungrouped: n?.ungrouped
7476
7480
  };
7477
7481
  }
7478
7482
  getOptimiserEngineType() {
@@ -7560,7 +7564,7 @@ var gn = class {
7560
7564
  return this.validateQueryForMode(r, e, t), this.generateSqlForMode(r, e, t, n);
7561
7565
  }
7562
7566
  async generateUnifiedSQL(e, t, n) {
7563
- let r = new q(), i = this.createQueryContext(n, r);
7567
+ let r = new q(), i = this.createQueryContext(n, r, t);
7564
7568
  this.preloadFilterCache(t, r, e, i);
7565
7569
  let { optimisedPlan: a } = this.buildRegularQueryArtifacts(e, t, i), o = this.drizzlePlanBuilder.derivePhysicalPlanContext(a), s = this.drizzlePlanBuilder.build(o, t, i).toSQL();
7566
7570
  return {
@@ -7606,7 +7610,7 @@ var gn = class {
7606
7610
  }[vt(e)]();
7607
7611
  }
7608
7612
  async executeRegularQueryWithCache(e, t, n, r) {
7609
- let i = new q(), a = this.createQueryContext(n, i);
7613
+ let i = new q(), a = this.createQueryContext(n, i, t);
7610
7614
  this.preloadFilterCache(t, i, e, a);
7611
7615
  let { optimisedPlan: o } = this.buildRegularQueryArtifacts(e, t, a), s = this.drizzlePlanBuilder.derivePhysicalPlanContext(o);
7612
7616
  this.validateSecurityContext(s, a);
@@ -8053,7 +8057,56 @@ function yn(e, t) {
8053
8057
  o.dimensions[i] || n.push(`TimeDimension '${i}' not found on cube '${t}' (must be a dimension with time type)`);
8054
8058
  }
8055
8059
  if (t.filters) for (let r of t.filters) bn(r, e, n, a);
8056
- return a.size === 0 && n.push("Query must reference at least one cube through measures, dimensions, or filters"), {
8060
+ if (a.size === 0 && n.push("Query must reference at least one cube through measures, dimensions, or filters"), t.ungrouped) {
8061
+ t.dimensions && t.dimensions.length > 0 || t.timeDimensions && t.timeDimensions.length > 0 || n.push("Ungrouped queries require at least one dimension or time dimension"), t.funnel && n.push("Ungrouped queries are incompatible with funnel analysis"), t.flow && n.push("Ungrouped queries are incompatible with flow analysis"), t.retention && n.push("Ungrouped queries are incompatible with retention analysis"), t.timeDimensions?.some((e) => e.compareDateRange && e.compareDateRange.length > 0) && n.push("Ungrouped queries are incompatible with compareDateRange"), t.timeDimensions?.some((e) => e.fillMissingDates === !0) && n.push("Ungrouped queries are incompatible with fillMissingDates");
8062
+ let r = new Set([
8063
+ "sum",
8064
+ "avg",
8065
+ "min",
8066
+ "max",
8067
+ "number"
8068
+ ]), i = new Set([
8069
+ "count",
8070
+ "countDistinct",
8071
+ "countDistinctApprox",
8072
+ "calculated",
8073
+ "stddev",
8074
+ "stddevSamp",
8075
+ "variance",
8076
+ "varianceSamp",
8077
+ "median",
8078
+ "p95",
8079
+ "p99",
8080
+ "percentile",
8081
+ "lag",
8082
+ "lead",
8083
+ "rank",
8084
+ "denseRank",
8085
+ "rowNumber",
8086
+ "ntile",
8087
+ "firstValue",
8088
+ "lastValue",
8089
+ "movingAvg",
8090
+ "movingSum"
8091
+ ]);
8092
+ if (t.measures) for (let a of t.measures) {
8093
+ let [t, o] = a.split("."), s = e.get(t);
8094
+ if (s && s.measures[o]) {
8095
+ let e = s.measures[o];
8096
+ i.has(e.type) && n.push(`Measure '${a}' has type '${e.type}' which is incompatible with ungrouped queries. Only ${[...r].join(", ")} types are allowed.`), e.filters && e.filters.length > 0 && n.push(`Measure '${a}' has filters which are incompatible with ungrouped queries (measure filters require aggregation)`);
8097
+ }
8098
+ }
8099
+ for (let t of a) {
8100
+ let r = e.get(t);
8101
+ if (r && r.joins) {
8102
+ for (let [i, o] of Object.entries(r.joins)) if (o.relationship === "hasMany") {
8103
+ let r = G(o.targetCube, e);
8104
+ r && a.has(r.name) && n.push(`Ungrouped queries are incompatible with hasMany relationships (${t} → ${i} is hasMany)`);
8105
+ }
8106
+ }
8107
+ }
8108
+ }
8109
+ return {
8057
8110
  isValid: n.length === 0,
8058
8111
  errors: n
8059
8112
  };
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CDExg9uP.cjs`),t=require(`../mcp-transport-CjA5_6G_.cjs`);let n=require(`next/server`);function r(e){let{cubes:n,drizzle:r,schema:i,engineType:a,cache:o,rlsSetup:s}=e;if(!n||n.length===0)throw Error(`At least one cube must be provided in the cubes array`);let c=new t.h({drizzle:r,schema:i,engineType:a,cache:o,rlsSetup:s});return n.forEach(e=>{c.registerCube(e)}),c}function i(e,t){let n=e.headers.get(`origin`),r={};return t.origin&&(typeof t.origin==`string`?r[`Access-Control-Allow-Origin`]=t.origin:Array.isArray(t.origin)?n&&t.origin.includes(n)&&(r[`Access-Control-Allow-Origin`]=n):typeof t.origin==`function`&&n&&t.origin(n)&&(r[`Access-Control-Allow-Origin`]=n)),t.methods&&(r[`Access-Control-Allow-Methods`]=t.methods.join(`, `)),t.allowedHeaders&&(r[`Access-Control-Allow-Headers`]=t.allowedHeaders.join(`, `)),t.credentials&&(r[`Access-Control-Allow-Credentials`]=`true`),r}function a(e){return async function(t){let n=i(t,e);return new Response(null,{status:200,headers:n})}}function o(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let r=t.nextUrl.searchParams.get(`query`);if(!r)return n.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(r)}catch{return n.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return n.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await a(t,r),u=s.validateQuery(c);if(!u.isValid)return n.NextResponse.json(e.i(`Query validation failed: ${u.errors.join(`, `)}`,400),{status:400});let d=t.headers.get(`x-cache-control`)===`no-cache`,f=await s.executeMultiCubeQuery(c,l,{skipCache:d}),p=e.r(c,f,s);return n.NextResponse.json(p,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js load handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function s(t){let{cors:a}=t,o=r(t);return async function(t,r){try{let r=e.a(o.getMetadata());return n.NextResponse.json(r,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js meta handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500),{status:500})}}}function c(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let r=t.nextUrl.searchParams.get(`query`);if(!r)return n.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(r)}catch{return n.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return n.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await a(t,r),u=s.validateQuery(c);if(!u.isValid)return n.NextResponse.json(e.i(`Query validation failed: ${u.errors.join(`, `)}`,400),{status:400});let d=c.measures?.[0]||c.dimensions?.[0];if(!d)return n.NextResponse.json(e.i(`No measures or dimensions specified`,400),{status:400});let f=d.split(`.`)[0],p=await s.generateSQL(f,c,l),m=e.o(c,p);return n.NextResponse.json(m,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js SQL handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`SQL generation failed`,500),{status:500})}}}function l(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let e=t.nextUrl.searchParams.get(`query`);if(!e)return n.NextResponse.json({error:`Query parameter is required`,valid:!1},{status:400});try{c=JSON.parse(e)}catch{return n.NextResponse.json({error:`Invalid JSON in query parameter`,valid:!1},{status:400})}}else return n.NextResponse.json({error:`Method not allowed`,valid:!1},{status:405});let l=await a(t,r),u=await e.f(c,l,s);return n.NextResponse.json(u,{headers:o?i(t,o):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js dry-run handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},{status:400})}}}function u(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let{queries:c}=await t.json();if(!c||!Array.isArray(c))return n.NextResponse.json(e.i(`Request body must contain a "queries" array`,400),{status:400});if(c.length===0)return n.NextResponse.json(e.i(`Queries array cannot be empty`,400),{status:400});let l=await e.u(c,await a(t,r),s,{skipCache:t.headers.get(`x-cache-control`)===`no-cache`});return n.NextResponse.json(l,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js batch handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Batch execution failed`,500),{status:500})}}}function d(e){let{extractSecurityContext:t,cors:a}=e,o=r(e);return async function(e,r){try{if(e.method!==`POST`)return n.NextResponse.json({error:`Method not allowed`},{status:405});let s=await e.json(),c=s.query||s,l=s.options||{},u=await t(e,r),d=o.validateQuery(c);if(!d.isValid)return n.NextResponse.json({error:`Query validation failed: ${d.errors.join(`, `)}`},{status:400});let f=await o.explainQuery(c,u,l);return n.NextResponse.json(f,{headers:a?i(e,a):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js explain handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Explain query failed`},{status:500})}}}function f(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await e.d(o,await t.json());return n.NextResponse.json(r,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js discover handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Discovery failed`,500),{status:500})}}}function p(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await t.json();if(!r.naturalLanguage)return n.NextResponse.json(e.i(`naturalLanguage field is required`,400),{status:400});let s=await e.m(o,r);return n.NextResponse.json(s,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js suggest handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query suggestion failed`,500),{status:500})}}}function m(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await t.json();if(!r.query)return n.NextResponse.json(e.i(`query field is required`,400),{status:400});let s=await e.h(o,r);return n.NextResponse.json(s,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js validate handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query validation failed`,500),{status:500})}}}function h(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let c=await t.json();if(!c.query)return n.NextResponse.json(e.i(`query field is required`,400),{status:400});let l=await e.p(s,await a(t,r),c);return n.NextResponse.json(l,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP load handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function g(a){let{extractSecurityContext:o,cors:s,mcp:c={enabled:!0}}=a,l=r(a);return async function(r){if(r.method===`DELETE`)return n.NextResponse.json({error:`Session termination not supported`},{status:405});if(r.method===`GET`){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},a,15e3)))}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new n.NextResponse(o,{status:200,headers:c})}if(r.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let a=t.p(r.headers.get(`origin`),c.allowedOrigins?{allowedOrigins:c.allowedOrigins}:{});if(!a.valid)return n.NextResponse.json(t.n(null,-32600,a.reason),{status:403});let u=r.headers.get(`accept`);if(!t.f(u))return n.NextResponse.json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`),{status:400});let d=t.c(Object.fromEntries(r.headers.entries()));if(!d.ok)return n.NextResponse.json({error:`Unsupported MCP protocol version`,supported:d.supported},{status:426});let f;try{f=await r.json()}catch{f=null}let p=t.l(f);if(!p)return n.NextResponse.json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`),{status:400});let m=t.m(u),h=p.method===`initialize`,g=(e,t=200,a={})=>n.NextResponse.json(e,{status:t,headers:{...s?i(r,s):{},...a}});try{let e=await t.i(p.method,p.params,{semanticLayer:l,extractSecurityContext:e=>o(e),rawRequest:r,rawResponse:null});if(t.s(p))return new n.NextResponse(null,{status:202});let a=h&&e&&typeof e==`object`&&`sessionId`in e?e.sessionId:void 0,c={};a&&(c[t.t]=a);let u=t.r(p.id??null,e);if(m){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(`id: ${a}\n\n`)),n.enqueue(e.encode(t.d(u,a))),n.close()}}),l=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,...c});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>l.set(e,t))}return new n.NextResponse(o,{status:200,headers:l})}return g(u,200,c)}catch(e){if(t.s(p))return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP notification processing error:`,e),new n.NextResponse(null,{status:202});process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP RPC handler error:`,e);let a=e?.code??-32603,o=e?.data,c=e.message||`MCP request failed`,l=t.n(p.id??null,a,c,o);if(m){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(`id: ${a}\n\n`)),n.enqueue(e.encode(t.d(l,a))),n.close()}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new n.NextResponse(o,{status:200,headers:c})}return g(l,200)}}}function _(e){let{extractSecurityContext:t,cors:a,agent:o}=e;if(!o)throw Error(`agent config is required for createAgentChatHandler`);let s=r(e);return async function(e,r){try{if(e.method!==`POST`)return n.NextResponse.json({error:`Method not allowed - use POST`},{status:405});let{handleAgentChat:c}=await Promise.resolve().then(()=>require(`../handler-DzUX7CBs.cjs`)),{message:l,sessionId:u,history:d}=await e.json();if(!l||typeof l!=`string`)return n.NextResponse.json({error:`message is required and must be a string`},{status:400});let f=(o.apiKey||``).trim();if(o.allowClientApiKey){let t=e.headers.get(`x-agent-api-key`);t&&(f=t.trim())}if(!f)return n.NextResponse.json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`},{status:401});let p=o.allowClientApiKey&&e.headers.get(`x-agent-provider`)||void 0,m=o.allowClientApiKey&&e.headers.get(`x-agent-model`)||void 0,h=o.allowClientApiKey&&e.headers.get(`x-agent-provider-endpoint`)||void 0,g=await t(e,r),_=o.buildSystemContext?.(g),v=new TextEncoder,y=new ReadableStream({async start(e){try{let t=c({message:l,sessionId:u,history:d,semanticLayer:s,securityContext:g,agentConfig:o,apiKey:f,systemContext:_,providerOverride:p,modelOverride:m,baseURLOverride:h});for await(let n of t){let t=`data: ${JSON.stringify(n)}\n\n`;e.enqueue(v.encode(t))}}catch(t){let n={type:`error`,data:{message:t instanceof Error?t.message:`Stream failed`}};e.enqueue(v.encode(`data: ${JSON.stringify(n)}\n\n`))}finally{e.close()}}}),b=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(a){let t=i(e,a);Object.entries(t).forEach(([e,t])=>b.set(e,t))}return new Response(y,{status:200,headers:b})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js agent chat handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Agent chat failed`},{status:500})}}}function v(e){let{mcp:t={enabled:!0}}=e,n={load:o(e),meta:s(e),sql:c(e),dryRun:l(e),batch:u(e),explain:d(e)};return t.enabled!==!1&&(n.mcpRpc=g(e)),e.agent&&(n.agentChat=_(e)),n}exports.createAgentChatHandler=_,exports.createBatchHandler=u,exports.createCubeHandlers=v,exports.createDiscoverHandler=f,exports.createDryRunHandler=l,exports.createExplainHandler=d,exports.createLoadHandler=o,exports.createMcpLoadHandler=h,exports.createMcpRpcHandler=g,exports.createMetaHandler=s,exports.createOptionsHandler=a,exports.createSqlHandler=c,exports.createSuggestHandler=p,exports.createValidateHandler=m;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-2MwxiQ2o.cjs`),t=require(`../mcp-transport-ro4OL4BW.cjs`);let n=require(`next/server`);function r(e){let{cubes:n,drizzle:r,schema:i,engineType:a,cache:o,rlsSetup:s}=e;if(!n||n.length===0)throw Error(`At least one cube must be provided in the cubes array`);let c=new t.h({drizzle:r,schema:i,engineType:a,cache:o,rlsSetup:s});return n.forEach(e=>{c.registerCube(e)}),c}function i(e,t){let n=e.headers.get(`origin`),r={};return t.origin&&(typeof t.origin==`string`?r[`Access-Control-Allow-Origin`]=t.origin:Array.isArray(t.origin)?n&&t.origin.includes(n)&&(r[`Access-Control-Allow-Origin`]=n):typeof t.origin==`function`&&n&&t.origin(n)&&(r[`Access-Control-Allow-Origin`]=n)),t.methods&&(r[`Access-Control-Allow-Methods`]=t.methods.join(`, `)),t.allowedHeaders&&(r[`Access-Control-Allow-Headers`]=t.allowedHeaders.join(`, `)),t.credentials&&(r[`Access-Control-Allow-Credentials`]=`true`),r}function a(e){return async function(t){let n=i(t,e);return new Response(null,{status:200,headers:n})}}function o(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let r=t.nextUrl.searchParams.get(`query`);if(!r)return n.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(r)}catch{return n.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return n.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await a(t,r),u=s.validateQuery(c);if(!u.isValid)return n.NextResponse.json(e.i(`Query validation failed: ${u.errors.join(`, `)}`,400),{status:400});let d=t.headers.get(`x-cache-control`)===`no-cache`,f=await s.executeMultiCubeQuery(c,l,{skipCache:d}),p=e.r(c,f,s);return n.NextResponse.json(p,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js load handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function s(t){let{cors:a}=t,o=r(t);return async function(t,r){try{let r=e.a(o.getMetadata());return n.NextResponse.json(r,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js meta handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500),{status:500})}}}function c(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let r=t.nextUrl.searchParams.get(`query`);if(!r)return n.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(r)}catch{return n.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return n.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await a(t,r),u=s.validateQuery(c);if(!u.isValid)return n.NextResponse.json(e.i(`Query validation failed: ${u.errors.join(`, `)}`,400),{status:400});let d=c.measures?.[0]||c.dimensions?.[0];if(!d)return n.NextResponse.json(e.i(`No measures or dimensions specified`,400),{status:400});let f=d.split(`.`)[0],p=await s.generateSQL(f,c,l),m=e.o(c,p);return n.NextResponse.json(m,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js SQL handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`SQL generation failed`,500),{status:500})}}}function l(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let e=t.nextUrl.searchParams.get(`query`);if(!e)return n.NextResponse.json({error:`Query parameter is required`,valid:!1},{status:400});try{c=JSON.parse(e)}catch{return n.NextResponse.json({error:`Invalid JSON in query parameter`,valid:!1},{status:400})}}else return n.NextResponse.json({error:`Method not allowed`,valid:!1},{status:405});let l=await a(t,r),u=await e.f(c,l,s);return n.NextResponse.json(u,{headers:o?i(t,o):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js dry-run handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},{status:400})}}}function u(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let{queries:c}=await t.json();if(!c||!Array.isArray(c))return n.NextResponse.json(e.i(`Request body must contain a "queries" array`,400),{status:400});if(c.length===0)return n.NextResponse.json(e.i(`Queries array cannot be empty`,400),{status:400});let l=await e.u(c,await a(t,r),s,{skipCache:t.headers.get(`x-cache-control`)===`no-cache`});return n.NextResponse.json(l,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js batch handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Batch execution failed`,500),{status:500})}}}function d(e){let{extractSecurityContext:t,cors:a}=e,o=r(e);return async function(e,r){try{if(e.method!==`POST`)return n.NextResponse.json({error:`Method not allowed`},{status:405});let s=await e.json(),c=s.query||s,l=s.options||{},u=await t(e,r),d=o.validateQuery(c);if(!d.isValid)return n.NextResponse.json({error:`Query validation failed: ${d.errors.join(`, `)}`},{status:400});let f=await o.explainQuery(c,u,l);return n.NextResponse.json(f,{headers:a?i(e,a):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js explain handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Explain query failed`},{status:500})}}}function f(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await e.d(o,await t.json());return n.NextResponse.json(r,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js discover handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Discovery failed`,500),{status:500})}}}function p(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await t.json();if(!r.naturalLanguage)return n.NextResponse.json(e.i(`naturalLanguage field is required`,400),{status:400});let s=await e.m(o,r);return n.NextResponse.json(s,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js suggest handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query suggestion failed`,500),{status:500})}}}function m(t){let{cors:a}=t,o=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let r=await t.json();if(!r.query)return n.NextResponse.json(e.i(`query field is required`,400),{status:400});let s=await e.h(o,r);return n.NextResponse.json(s,{headers:a?i(t,a):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js validate handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query validation failed`,500),{status:500})}}}function h(t){let{extractSecurityContext:a,cors:o}=t,s=r(t);return async function(t,r){try{if(t.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let c=await t.json();if(!c.query)return n.NextResponse.json(e.i(`query field is required`,400),{status:400});let l=await e.p(s,await a(t,r),c);return n.NextResponse.json(l,{headers:o?i(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP load handler error:`,t),n.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function g(a){let{extractSecurityContext:o,cors:s,mcp:c={enabled:!0}}=a,l=r(a);return async function(r){if(r.method===`DELETE`)return n.NextResponse.json({error:`Session termination not supported`},{status:405});if(r.method===`GET`){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(t.d({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},a,15e3)))}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new n.NextResponse(o,{status:200,headers:c})}if(r.method!==`POST`)return n.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let a=t.p(r.headers.get(`origin`),c.allowedOrigins?{allowedOrigins:c.allowedOrigins}:{});if(!a.valid)return n.NextResponse.json(t.n(null,-32600,a.reason),{status:403});let u=r.headers.get(`accept`);if(!t.f(u))return n.NextResponse.json(t.n(null,-32600,`Accept header must include both application/json and text/event-stream`),{status:400});let d=t.c(Object.fromEntries(r.headers.entries()));if(!d.ok)return n.NextResponse.json({error:`Unsupported MCP protocol version`,supported:d.supported},{status:426});let f;try{f=await r.json()}catch{f=null}let p=t.l(f);if(!p)return n.NextResponse.json(t.n(null,-32600,`Invalid JSON-RPC 2.0 request`),{status:400});let m=t.m(u),h=p.method===`initialize`,g=(e,t=200,a={})=>n.NextResponse.json(e,{status:t,headers:{...s?i(r,s):{},...a}});try{let e=await t.i(p.method,p.params,{semanticLayer:l,extractSecurityContext:e=>o(e),rawRequest:r,rawResponse:null});if(t.s(p))return new n.NextResponse(null,{status:202});let a=h&&e&&typeof e==`object`&&`sessionId`in e?e.sessionId:void 0,c={};a&&(c[t.t]=a);let u=t.r(p.id??null,e);if(m){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(`id: ${a}\n\n`)),n.enqueue(e.encode(t.d(u,a))),n.close()}}),l=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,...c});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>l.set(e,t))}return new n.NextResponse(o,{status:200,headers:l})}return g(u,200,c)}catch(e){if(t.s(p))return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP notification processing error:`,e),new n.NextResponse(null,{status:202});process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP RPC handler error:`,e);let a=e?.code??-32603,o=e?.data,c=e.message||`MCP request failed`,l=t.n(p.id??null,a,c,o);if(m){let e=new TextEncoder,a=t.u(),o=new ReadableStream({start(n){n.enqueue(e.encode(`id: ${a}\n\n`)),n.enqueue(e.encode(t.d(l,a))),n.close()}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=i(r,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new n.NextResponse(o,{status:200,headers:c})}return g(l,200)}}}function _(e){let{extractSecurityContext:t,cors:a,agent:o}=e;if(!o)throw Error(`agent config is required for createAgentChatHandler`);let s=r(e);return async function(e,r){try{if(e.method!==`POST`)return n.NextResponse.json({error:`Method not allowed - use POST`},{status:405});let{handleAgentChat:c}=await Promise.resolve().then(()=>require(`../handler-dHHEEbG9.cjs`)),{message:l,sessionId:u,history:d}=await e.json();if(!l||typeof l!=`string`)return n.NextResponse.json({error:`message is required and must be a string`},{status:400});let f=(o.apiKey||``).trim();if(o.allowClientApiKey){let t=e.headers.get(`x-agent-api-key`);t&&(f=t.trim())}if(!f)return n.NextResponse.json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`},{status:401});let p=o.allowClientApiKey&&e.headers.get(`x-agent-provider`)||void 0,m=o.allowClientApiKey&&e.headers.get(`x-agent-model`)||void 0,h=o.allowClientApiKey&&e.headers.get(`x-agent-provider-endpoint`)||void 0,g=await t(e,r),_=o.buildSystemContext?.(g),v=new TextEncoder,y=new ReadableStream({async start(e){try{let t=c({message:l,sessionId:u,history:d,semanticLayer:s,securityContext:g,agentConfig:o,apiKey:f,systemContext:_,providerOverride:p,modelOverride:m,baseURLOverride:h});for await(let n of t){let t=`data: ${JSON.stringify(n)}\n\n`;e.enqueue(v.encode(t))}}catch(t){let n={type:`error`,data:{message:t instanceof Error?t.message:`Stream failed`}};e.enqueue(v.encode(`data: ${JSON.stringify(n)}\n\n`))}finally{e.close()}}}),b=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(a){let t=i(e,a);Object.entries(t).forEach(([e,t])=>b.set(e,t))}return new Response(y,{status:200,headers:b})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js agent chat handler error:`,e),n.NextResponse.json({error:e instanceof Error?e.message:`Agent chat failed`},{status:500})}}}function v(e){let{mcp:t={enabled:!0}}=e,n={load:o(e),meta:s(e),sql:c(e),dryRun:l(e),batch:u(e),explain:d(e)};return t.enabled!==!1&&(n.mcpRpc=g(e)),e.agent&&(n.agentChat=_(e)),n}exports.createAgentChatHandler=_,exports.createBatchHandler=u,exports.createCubeHandlers=v,exports.createDiscoverHandler=f,exports.createDryRunHandler=l,exports.createExplainHandler=d,exports.createLoadHandler=o,exports.createMcpLoadHandler=h,exports.createMcpRpcHandler=g,exports.createMetaHandler=s,exports.createOptionsHandler=a,exports.createSqlHandler=c,exports.createSuggestHandler=p,exports.createValidateHandler=m;
@@ -1,5 +1,5 @@
1
- import { a as e, d as t, f as n, h as r, i, m as a, o, p as s, r as c, u as l } from "../utils-DkKcpkx5.js";
2
- import { c as u, d, f, h as p, i as m, l as h, m as g, n as _, p as v, r as y, s as b, t as x, u as S } from "../mcp-transport-x_A7Q5OL.js";
1
+ import { a as e, d as t, f as n, h as r, i, m as a, o, p as s, r as c, u as l } from "../utils-_2o905Fi.js";
2
+ import { c as u, d, f, h as p, i as m, l as h, m as g, n as _, p as v, r as y, s as b, t as x, u as S } from "../mcp-transport-tB5a7Het.js";
3
3
  import { NextResponse as C } from "next/server";
4
4
  //#region src/adapters/nextjs/index.ts
5
5
  function w(e) {
@@ -325,7 +325,7 @@ function R(e) {
325
325
  return async function(e, a) {
326
326
  try {
327
327
  if (e.method !== "POST") return C.json({ error: "Method not allowed - use POST" }, { status: 405 });
328
- let { handleAgentChat: o } = await import("../handler-J55KQKe5.js"), { message: s, sessionId: c, history: l } = await e.json();
328
+ let { handleAgentChat: o } = await import("../handler-fto6TSVn.js"), { message: s, sessionId: c, history: l } = await e.json();
329
329
  if (!s || typeof s != "string") return C.json({ error: "message is required and must be a string" }, { status: 400 });
330
330
  let u = (r.apiKey || "").trim();
331
331
  if (r.allowClientApiKey) {
@@ -12,4 +12,4 @@ If possible, please select a more specific dialect (like sqlite, postgresql, etc
12
12
  `),a.map(function(e){return this.buildFirstStateStack(e,[])||[e]},this).forEach(function(e){var t=e[0],r=t.rule.symbols[t.dot],i=this.getSymbolDisplay(r);n.push(`A `+i+` based on:`),this.displayStateStack(e,n)},this)),n.push(``),n.join(`
13
13
  `)},a.prototype.displayStateStack=function(e,t){for(var n,r=0,i=0;i<e.length;i++){var a=e[i],o=a.rule.toString(a.dot);o===n?r++:(r>0&&t.push(` ^ `+r+` more lines identical to this`),r=0,t.push(` `+o)),n=o}},a.prototype.getSymbolDisplay=function(e){return o(e)},a.prototype.buildFirstStateStack=function(e,t){if(t.indexOf(e)!==-1)return null;if(e.wantedBy.length===0)return[e];var n=e.wantedBy[0],r=[e].concat(t),i=this.buildFirstStateStack(n,r);return i===null?null:[e].concat(i)},a.prototype.save=function(){var e=this.table[this.current];return e.lexerState=this.lexerState,e},a.prototype.restore=function(e){var t=e.index;this.current=t,this.table[t]=e,this.table.splice(t+1),this.lexerState=e.lexerState,this.results=this.finish()},a.prototype.rewind=function(e){if(!this.options.keepHistory)throw Error("set option `keepHistory` to enable rewinding");this.restore(this.table[e])},a.prototype.finish=function(){var e=[],t=this.grammar.start;return this.table[this.table.length-1].states.forEach(function(n){n.rule.name===t&&n.dot===n.rule.symbols.length&&n.reference===0&&n.data!==a.fail&&e.push(n)}),e.map(function(e){return e.data})};function o(e){var t=typeof e;if(t===`string`)return e;if(t===`object`){if(e.literal)return JSON.stringify(e.literal);if(e instanceof RegExp)return`character matching `+e;if(e.type)return e.type+` token`;if(e.test)return`token matching `+String(e.test);throw Error(`Unknown symbol type: `+e)}}function s(e){var t=typeof e;if(t===`string`)return e;if(t===`object`){if(e.literal)return JSON.stringify(e.literal);if(e instanceof RegExp)return e.toString();if(e.type)return`%`+e.type;if(e.test)return`<`+String(e.test)+`>`;throw Error(`Unknown symbol type: `+e)}}return{Parser:a,Grammar:r,Rule:e}})}));function fa(e){return e.map(pa).map(ma).map(ha).map(ga).map(_a)}var pa=(e,t,n)=>{if(ae(e.type)){let r=va(n,t);if(r&&r.type===_.PROPERTY_ACCESS_OPERATOR)return Object.assign(Object.assign({},e),{type:_.IDENTIFIER,text:e.raw});let i=F(n,t);if(i&&i.type===_.PROPERTY_ACCESS_OPERATOR)return Object.assign(Object.assign({},e),{type:_.IDENTIFIER,text:e.raw})}return e},ma=(e,t,n)=>{if(e.type===_.RESERVED_FUNCTION_NAME){let r=F(n,t);if(!r||!ya(r))return Object.assign(Object.assign({},e),{type:_.IDENTIFIER,text:e.raw})}return e},ha=(e,t,n)=>{if(e.type===_.RESERVED_DATA_TYPE){let r=F(n,t);if(r&&ya(r))return Object.assign(Object.assign({},e),{type:_.RESERVED_PARAMETERIZED_DATA_TYPE})}return e},ga=(e,t,n)=>{if(e.type===_.IDENTIFIER){let r=F(n,t);if(r&&ba(r))return Object.assign(Object.assign({},e),{type:_.ARRAY_IDENTIFIER})}return e},_a=(e,t,n)=>{if(e.type===_.RESERVED_DATA_TYPE){let r=F(n,t);if(r&&ba(r))return Object.assign(Object.assign({},e),{type:_.ARRAY_KEYWORD})}return e},va=(e,t)=>F(e,t,-1),F=(e,t,n=1)=>{let r=1;for(;e[t+r*n]&&xa(e[t+r*n]);)r++;return e[t+r*n]},ya=e=>e.type===_.OPEN_PAREN&&e.text===`(`,ba=e=>e.type===_.OPEN_PAREN&&e.text===`[`,xa=e=>e.type===_.BLOCK_COMMENT||e.type===_.LINE_COMMENT,Sa=class{constructor(e){this.tokenize=e,this.index=0,this.tokens=[],this.input=``}reset(e,t){this.input=e,this.index=0,this.tokens=this.tokenize(e)}next(){return this.tokens[this.index++]}save(){}formatError(e){let{line:t,col:n}=Qi(this.input,e.start);return`Parse error at token: ${e.text} at line ${t} column ${n}`}has(e){return e in _}},I;(function(e){e.statement=`statement`,e.clause=`clause`,e.set_operation=`set_operation`,e.function_call=`function_call`,e.parameterized_data_type=`parameterized_data_type`,e.array_subscript=`array_subscript`,e.property_access=`property_access`,e.parenthesis=`parenthesis`,e.between_predicate=`between_predicate`,e.case_expression=`case_expression`,e.case_when=`case_when`,e.case_else=`case_else`,e.limit_clause=`limit_clause`,e.all_columns_asterisk=`all_columns_asterisk`,e.literal=`literal`,e.identifier=`identifier`,e.keyword=`keyword`,e.data_type=`data_type`,e.parameter=`parameter`,e.operator=`operator`,e.comma=`comma`,e.line_comment=`line_comment`,e.block_comment=`block_comment`,e.disable_comment=`disable_comment`})(I=I||={});function L(e){return e[0]}var R=new Sa(e=>[]),z=([[e]])=>e,B=e=>({type:I.keyword,tokenType:e.type,text:e.text,raw:e.raw}),Ca=e=>({type:I.data_type,text:e.text,raw:e.raw}),V=(e,{leading:t,trailing:n})=>(t?.length&&(e=Object.assign(Object.assign({},e),{leadingComments:t})),n?.length&&(e=Object.assign(Object.assign({},e),{trailingComments:n})),e),wa=(e,{leading:t,trailing:n})=>{if(t?.length){let[n,...r]=e;e=[V(n,{leading:t}),...r]}if(n?.length){let t=e.slice(0,-1),r=e[e.length-1];e=[...t,V(r,{trailing:n})]}return e},Ta={Lexer:R,ParserRules:[{name:`main$ebnf$1`,symbols:[]},{name:`main$ebnf$1`,symbols:[`main$ebnf$1`,`statement`],postprocess:e=>e[0].concat([e[1]])},{name:`main`,symbols:[`main$ebnf$1`],postprocess:([e])=>{let t=e[e.length-1];return t&&!t.hasSemicolon?t.children.length>0?e:e.slice(0,-1):e}},{name:`statement$subexpression$1`,symbols:[R.has(`DELIMITER`)?{type:`DELIMITER`}:DELIMITER]},{name:`statement$subexpression$1`,symbols:[R.has(`EOF`)?{type:`EOF`}:EOF]},{name:`statement`,symbols:[`expressions_or_clauses`,`statement$subexpression$1`],postprocess:([e,[t]])=>({type:I.statement,children:e,hasSemicolon:t.type===_.DELIMITER})},{name:`expressions_or_clauses$ebnf$1`,symbols:[]},{name:`expressions_or_clauses$ebnf$1`,symbols:[`expressions_or_clauses$ebnf$1`,`free_form_sql`],postprocess:e=>e[0].concat([e[1]])},{name:`expressions_or_clauses$ebnf$2`,symbols:[]},{name:`expressions_or_clauses$ebnf$2`,symbols:[`expressions_or_clauses$ebnf$2`,`clause`],postprocess:e=>e[0].concat([e[1]])},{name:`expressions_or_clauses`,symbols:[`expressions_or_clauses$ebnf$1`,`expressions_or_clauses$ebnf$2`],postprocess:([e,t])=>[...e,...t]},{name:`clause$subexpression$1`,symbols:[`limit_clause`]},{name:`clause$subexpression$1`,symbols:[`select_clause`]},{name:`clause$subexpression$1`,symbols:[`other_clause`]},{name:`clause$subexpression$1`,symbols:[`set_operation`]},{name:`clause`,symbols:[`clause$subexpression$1`],postprocess:z},{name:`limit_clause$ebnf$1$subexpression$1$ebnf$1`,symbols:[`free_form_sql`]},{name:`limit_clause$ebnf$1$subexpression$1$ebnf$1`,symbols:[`limit_clause$ebnf$1$subexpression$1$ebnf$1`,`free_form_sql`],postprocess:e=>e[0].concat([e[1]])},{name:`limit_clause$ebnf$1$subexpression$1`,symbols:[R.has(`COMMA`)?{type:`COMMA`}:COMMA,`limit_clause$ebnf$1$subexpression$1$ebnf$1`]},{name:`limit_clause$ebnf$1`,symbols:[`limit_clause$ebnf$1$subexpression$1`],postprocess:L},{name:`limit_clause$ebnf$1`,symbols:[],postprocess:()=>null},{name:`limit_clause`,symbols:[R.has(`LIMIT`)?{type:`LIMIT`}:LIMIT,`_`,`expression_chain_`,`limit_clause$ebnf$1`],postprocess:([e,t,n,r])=>{if(r){let[i,a]=r;return{type:I.limit_clause,limitKw:V(B(e),{trailing:t}),offset:n,count:a}}else return{type:I.limit_clause,limitKw:V(B(e),{trailing:t}),count:n}}},{name:`select_clause$subexpression$1$ebnf$1`,symbols:[]},{name:`select_clause$subexpression$1$ebnf$1`,symbols:[`select_clause$subexpression$1$ebnf$1`,`free_form_sql`],postprocess:e=>e[0].concat([e[1]])},{name:`select_clause$subexpression$1`,symbols:[`all_columns_asterisk`,`select_clause$subexpression$1$ebnf$1`]},{name:`select_clause$subexpression$1$ebnf$2`,symbols:[]},{name:`select_clause$subexpression$1$ebnf$2`,symbols:[`select_clause$subexpression$1$ebnf$2`,`free_form_sql`],postprocess:e=>e[0].concat([e[1]])},{name:`select_clause$subexpression$1`,symbols:[`asteriskless_free_form_sql`,`select_clause$subexpression$1$ebnf$2`]},{name:`select_clause`,symbols:[R.has(`RESERVED_SELECT`)?{type:`RESERVED_SELECT`}:RESERVED_SELECT,`select_clause$subexpression$1`],postprocess:([e,[t,n]])=>({type:I.clause,nameKw:B(e),children:[t,...n]})},{name:`select_clause`,symbols:[R.has(`RESERVED_SELECT`)?{type:`RESERVED_SELECT`}:RESERVED_SELECT],postprocess:([e])=>({type:I.clause,nameKw:B(e),children:[]})},{name:`all_columns_asterisk`,symbols:[R.has(`ASTERISK`)?{type:`ASTERISK`}:ASTERISK],postprocess:()=>({type:I.all_columns_asterisk})},{name:`other_clause$ebnf$1`,symbols:[]},{name:`other_clause$ebnf$1`,symbols:[`other_clause$ebnf$1`,`free_form_sql`],postprocess:e=>e[0].concat([e[1]])},{name:`other_clause`,symbols:[R.has(`RESERVED_CLAUSE`)?{type:`RESERVED_CLAUSE`}:RESERVED_CLAUSE,`other_clause$ebnf$1`],postprocess:([e,t])=>({type:I.clause,nameKw:B(e),children:t})},{name:`set_operation$ebnf$1`,symbols:[]},{name:`set_operation$ebnf$1`,symbols:[`set_operation$ebnf$1`,`free_form_sql`],postprocess:e=>e[0].concat([e[1]])},{name:`set_operation`,symbols:[R.has(`RESERVED_SET_OPERATION`)?{type:`RESERVED_SET_OPERATION`}:RESERVED_SET_OPERATION,`set_operation$ebnf$1`],postprocess:([e,t])=>({type:I.set_operation,nameKw:B(e),children:t})},{name:`expression_chain_$ebnf$1`,symbols:[`expression_with_comments_`]},{name:`expression_chain_$ebnf$1`,symbols:[`expression_chain_$ebnf$1`,`expression_with_comments_`],postprocess:e=>e[0].concat([e[1]])},{name:`expression_chain_`,symbols:[`expression_chain_$ebnf$1`],postprocess:L},{name:`expression_chain$ebnf$1`,symbols:[]},{name:`expression_chain$ebnf$1`,symbols:[`expression_chain$ebnf$1`,`_expression_with_comments`],postprocess:e=>e[0].concat([e[1]])},{name:`expression_chain`,symbols:[`expression`,`expression_chain$ebnf$1`],postprocess:([e,t])=>[e,...t]},{name:`andless_expression_chain$ebnf$1`,symbols:[]},{name:`andless_expression_chain$ebnf$1`,symbols:[`andless_expression_chain$ebnf$1`,`_andless_expression_with_comments`],postprocess:e=>e[0].concat([e[1]])},{name:`andless_expression_chain`,symbols:[`andless_expression`,`andless_expression_chain$ebnf$1`],postprocess:([e,t])=>[e,...t]},{name:`expression_with_comments_`,symbols:[`expression`,`_`],postprocess:([e,t])=>V(e,{trailing:t})},{name:`_expression_with_comments`,symbols:[`_`,`expression`],postprocess:([e,t])=>V(t,{leading:e})},{name:`_andless_expression_with_comments`,symbols:[`_`,`andless_expression`],postprocess:([e,t])=>V(t,{leading:e})},{name:`free_form_sql$subexpression$1`,symbols:[`asteriskless_free_form_sql`]},{name:`free_form_sql$subexpression$1`,symbols:[`asterisk`]},{name:`free_form_sql`,symbols:[`free_form_sql$subexpression$1`],postprocess:z},{name:`asteriskless_free_form_sql$subexpression$1`,symbols:[`asteriskless_andless_expression`]},{name:`asteriskless_free_form_sql$subexpression$1`,symbols:[`logic_operator`]},{name:`asteriskless_free_form_sql$subexpression$1`,symbols:[`comma`]},{name:`asteriskless_free_form_sql$subexpression$1`,symbols:[`comment`]},{name:`asteriskless_free_form_sql$subexpression$1`,symbols:[`other_keyword`]},{name:`asteriskless_free_form_sql`,symbols:[`asteriskless_free_form_sql$subexpression$1`],postprocess:z},{name:`expression$subexpression$1`,symbols:[`andless_expression`]},{name:`expression$subexpression$1`,symbols:[`logic_operator`]},{name:`expression`,symbols:[`expression$subexpression$1`],postprocess:z},{name:`andless_expression$subexpression$1`,symbols:[`asteriskless_andless_expression`]},{name:`andless_expression$subexpression$1`,symbols:[`asterisk`]},{name:`andless_expression`,symbols:[`andless_expression$subexpression$1`],postprocess:z},{name:`asteriskless_andless_expression$subexpression$1`,symbols:[`atomic_expression`]},{name:`asteriskless_andless_expression$subexpression$1`,symbols:[`between_predicate`]},{name:`asteriskless_andless_expression$subexpression$1`,symbols:[`case_expression`]},{name:`asteriskless_andless_expression`,symbols:[`asteriskless_andless_expression$subexpression$1`],postprocess:z},{name:`atomic_expression$subexpression$1`,symbols:[`array_subscript`]},{name:`atomic_expression$subexpression$1`,symbols:[`function_call`]},{name:`atomic_expression$subexpression$1`,symbols:[`property_access`]},{name:`atomic_expression$subexpression$1`,symbols:[`parenthesis`]},{name:`atomic_expression$subexpression$1`,symbols:[`curly_braces`]},{name:`atomic_expression$subexpression$1`,symbols:[`square_brackets`]},{name:`atomic_expression$subexpression$1`,symbols:[`operator`]},{name:`atomic_expression$subexpression$1`,symbols:[`identifier`]},{name:`atomic_expression$subexpression$1`,symbols:[`parameter`]},{name:`atomic_expression$subexpression$1`,symbols:[`literal`]},{name:`atomic_expression$subexpression$1`,symbols:[`data_type`]},{name:`atomic_expression$subexpression$1`,symbols:[`keyword`]},{name:`atomic_expression`,symbols:[`atomic_expression$subexpression$1`],postprocess:z},{name:`array_subscript`,symbols:[R.has(`ARRAY_IDENTIFIER`)?{type:`ARRAY_IDENTIFIER`}:ARRAY_IDENTIFIER,`_`,`square_brackets`],postprocess:([e,t,n])=>({type:I.array_subscript,array:V({type:I.identifier,quoted:!1,text:e.text},{trailing:t}),parenthesis:n})},{name:`array_subscript`,symbols:[R.has(`ARRAY_KEYWORD`)?{type:`ARRAY_KEYWORD`}:ARRAY_KEYWORD,`_`,`square_brackets`],postprocess:([e,t,n])=>({type:I.array_subscript,array:V(B(e),{trailing:t}),parenthesis:n})},{name:`function_call`,symbols:[R.has(`RESERVED_FUNCTION_NAME`)?{type:`RESERVED_FUNCTION_NAME`}:RESERVED_FUNCTION_NAME,`_`,`parenthesis`],postprocess:([e,t,n])=>({type:I.function_call,nameKw:V(B(e),{trailing:t}),parenthesis:n})},{name:`parenthesis`,symbols:[{literal:`(`},`expressions_or_clauses`,{literal:`)`}],postprocess:([e,t,n])=>({type:I.parenthesis,children:t,openParen:`(`,closeParen:`)`})},{name:`curly_braces$ebnf$1`,symbols:[]},{name:`curly_braces$ebnf$1`,symbols:[`curly_braces$ebnf$1`,`free_form_sql`],postprocess:e=>e[0].concat([e[1]])},{name:`curly_braces`,symbols:[{literal:`{`},`curly_braces$ebnf$1`,{literal:`}`}],postprocess:([e,t,n])=>({type:I.parenthesis,children:t,openParen:`{`,closeParen:`}`})},{name:`square_brackets$ebnf$1`,symbols:[]},{name:`square_brackets$ebnf$1`,symbols:[`square_brackets$ebnf$1`,`free_form_sql`],postprocess:e=>e[0].concat([e[1]])},{name:`square_brackets`,symbols:[{literal:`[`},`square_brackets$ebnf$1`,{literal:`]`}],postprocess:([e,t,n])=>({type:I.parenthesis,children:t,openParen:`[`,closeParen:`]`})},{name:`property_access$subexpression$1`,symbols:[`identifier`]},{name:`property_access$subexpression$1`,symbols:[`array_subscript`]},{name:`property_access$subexpression$1`,symbols:[`all_columns_asterisk`]},{name:`property_access$subexpression$1`,symbols:[`parameter`]},{name:`property_access`,symbols:[`atomic_expression`,`_`,R.has(`PROPERTY_ACCESS_OPERATOR`)?{type:`PROPERTY_ACCESS_OPERATOR`}:PROPERTY_ACCESS_OPERATOR,`_`,`property_access$subexpression$1`],postprocess:([e,t,n,r,[i]])=>({type:I.property_access,object:V(e,{trailing:t}),operator:n.text,property:V(i,{leading:r})})},{name:`between_predicate`,symbols:[R.has(`BETWEEN`)?{type:`BETWEEN`}:BETWEEN,`_`,`andless_expression_chain`,`_`,R.has(`AND`)?{type:`AND`}:AND,`_`,`andless_expression`],postprocess:([e,t,n,r,i,a,o])=>({type:I.between_predicate,betweenKw:B(e),expr1:wa(n,{leading:t,trailing:r}),andKw:B(i),expr2:[V(o,{leading:a})]})},{name:`case_expression$ebnf$1`,symbols:[`expression_chain_`],postprocess:L},{name:`case_expression$ebnf$1`,symbols:[],postprocess:()=>null},{name:`case_expression$ebnf$2`,symbols:[]},{name:`case_expression$ebnf$2`,symbols:[`case_expression$ebnf$2`,`case_clause`],postprocess:e=>e[0].concat([e[1]])},{name:`case_expression`,symbols:[R.has(`CASE`)?{type:`CASE`}:CASE,`_`,`case_expression$ebnf$1`,`case_expression$ebnf$2`,R.has(`END`)?{type:`END`}:END],postprocess:([e,t,n,r,i])=>({type:I.case_expression,caseKw:V(B(e),{trailing:t}),endKw:B(i),expr:n||[],clauses:r})},{name:`case_clause`,symbols:[R.has(`WHEN`)?{type:`WHEN`}:WHEN,`_`,`expression_chain_`,R.has(`THEN`)?{type:`THEN`}:THEN,`_`,`expression_chain_`],postprocess:([e,t,n,r,i,a])=>({type:I.case_when,whenKw:V(B(e),{trailing:t}),thenKw:V(B(r),{trailing:i}),condition:n,result:a})},{name:`case_clause`,symbols:[R.has(`ELSE`)?{type:`ELSE`}:ELSE,`_`,`expression_chain_`],postprocess:([e,t,n])=>({type:I.case_else,elseKw:V(B(e),{trailing:t}),result:n})},{name:`comma$subexpression$1`,symbols:[R.has(`COMMA`)?{type:`COMMA`}:COMMA]},{name:`comma`,symbols:[`comma$subexpression$1`],postprocess:([[e]])=>({type:I.comma})},{name:`asterisk$subexpression$1`,symbols:[R.has(`ASTERISK`)?{type:`ASTERISK`}:ASTERISK]},{name:`asterisk`,symbols:[`asterisk$subexpression$1`],postprocess:([[e]])=>({type:I.operator,text:e.text})},{name:`operator$subexpression$1`,symbols:[R.has(`OPERATOR`)?{type:`OPERATOR`}:OPERATOR]},{name:`operator`,symbols:[`operator$subexpression$1`],postprocess:([[e]])=>({type:I.operator,text:e.text})},{name:`identifier$subexpression$1`,symbols:[R.has(`IDENTIFIER`)?{type:`IDENTIFIER`}:IDENTIFIER]},{name:`identifier$subexpression$1`,symbols:[R.has(`QUOTED_IDENTIFIER`)?{type:`QUOTED_IDENTIFIER`}:QUOTED_IDENTIFIER]},{name:`identifier$subexpression$1`,symbols:[R.has(`VARIABLE`)?{type:`VARIABLE`}:VARIABLE]},{name:`identifier`,symbols:[`identifier$subexpression$1`],postprocess:([[e]])=>({type:I.identifier,quoted:e.type!==`IDENTIFIER`,text:e.text})},{name:`parameter$subexpression$1`,symbols:[R.has(`NAMED_PARAMETER`)?{type:`NAMED_PARAMETER`}:NAMED_PARAMETER]},{name:`parameter$subexpression$1`,symbols:[R.has(`QUOTED_PARAMETER`)?{type:`QUOTED_PARAMETER`}:QUOTED_PARAMETER]},{name:`parameter$subexpression$1`,symbols:[R.has(`NUMBERED_PARAMETER`)?{type:`NUMBERED_PARAMETER`}:NUMBERED_PARAMETER]},{name:`parameter$subexpression$1`,symbols:[R.has(`POSITIONAL_PARAMETER`)?{type:`POSITIONAL_PARAMETER`}:POSITIONAL_PARAMETER]},{name:`parameter$subexpression$1`,symbols:[R.has(`CUSTOM_PARAMETER`)?{type:`CUSTOM_PARAMETER`}:CUSTOM_PARAMETER]},{name:`parameter`,symbols:[`parameter$subexpression$1`],postprocess:([[e]])=>({type:I.parameter,key:e.key,text:e.text})},{name:`literal$subexpression$1`,symbols:[R.has(`NUMBER`)?{type:`NUMBER`}:NUMBER]},{name:`literal$subexpression$1`,symbols:[R.has(`STRING`)?{type:`STRING`}:STRING]},{name:`literal`,symbols:[`literal$subexpression$1`],postprocess:([[e]])=>({type:I.literal,text:e.text})},{name:`keyword$subexpression$1`,symbols:[R.has(`RESERVED_KEYWORD`)?{type:`RESERVED_KEYWORD`}:RESERVED_KEYWORD]},{name:`keyword$subexpression$1`,symbols:[R.has(`RESERVED_KEYWORD_PHRASE`)?{type:`RESERVED_KEYWORD_PHRASE`}:RESERVED_KEYWORD_PHRASE]},{name:`keyword$subexpression$1`,symbols:[R.has(`RESERVED_JOIN`)?{type:`RESERVED_JOIN`}:RESERVED_JOIN]},{name:`keyword`,symbols:[`keyword$subexpression$1`],postprocess:([[e]])=>B(e)},{name:`data_type$subexpression$1`,symbols:[R.has(`RESERVED_DATA_TYPE`)?{type:`RESERVED_DATA_TYPE`}:RESERVED_DATA_TYPE]},{name:`data_type$subexpression$1`,symbols:[R.has(`RESERVED_DATA_TYPE_PHRASE`)?{type:`RESERVED_DATA_TYPE_PHRASE`}:RESERVED_DATA_TYPE_PHRASE]},{name:`data_type`,symbols:[`data_type$subexpression$1`],postprocess:([[e]])=>Ca(e)},{name:`data_type`,symbols:[R.has(`RESERVED_PARAMETERIZED_DATA_TYPE`)?{type:`RESERVED_PARAMETERIZED_DATA_TYPE`}:RESERVED_PARAMETERIZED_DATA_TYPE,`_`,`parenthesis`],postprocess:([e,t,n])=>({type:I.parameterized_data_type,dataType:V(Ca(e),{trailing:t}),parenthesis:n})},{name:`logic_operator$subexpression$1`,symbols:[R.has(`AND`)?{type:`AND`}:AND]},{name:`logic_operator$subexpression$1`,symbols:[R.has(`OR`)?{type:`OR`}:OR]},{name:`logic_operator$subexpression$1`,symbols:[R.has(`XOR`)?{type:`XOR`}:XOR]},{name:`logic_operator`,symbols:[`logic_operator$subexpression$1`],postprocess:([[e]])=>B(e)},{name:`other_keyword$subexpression$1`,symbols:[R.has(`WHEN`)?{type:`WHEN`}:WHEN]},{name:`other_keyword$subexpression$1`,symbols:[R.has(`THEN`)?{type:`THEN`}:THEN]},{name:`other_keyword$subexpression$1`,symbols:[R.has(`ELSE`)?{type:`ELSE`}:ELSE]},{name:`other_keyword$subexpression$1`,symbols:[R.has(`END`)?{type:`END`}:END]},{name:`other_keyword`,symbols:[`other_keyword$subexpression$1`],postprocess:([[e]])=>B(e)},{name:`_$ebnf$1`,symbols:[]},{name:`_$ebnf$1`,symbols:[`_$ebnf$1`,`comment`],postprocess:e=>e[0].concat([e[1]])},{name:`_`,symbols:[`_$ebnf$1`],postprocess:([e])=>e},{name:`comment`,symbols:[R.has(`LINE_COMMENT`)?{type:`LINE_COMMENT`}:LINE_COMMENT],postprocess:([e])=>({type:I.line_comment,text:e.text,precedingWhitespace:e.precedingWhitespace})},{name:`comment`,symbols:[R.has(`BLOCK_COMMENT`)?{type:`BLOCK_COMMENT`}:BLOCK_COMMENT],postprocess:([e])=>({type:I.block_comment,text:e.text,precedingWhitespace:e.precedingWhitespace})},{name:`comment`,symbols:[R.has(`DISABLE_COMMENT`)?{type:`DISABLE_COMMENT`}:DISABLE_COMMENT],postprocess:([e])=>({type:I.disable_comment,text:e.text,precedingWhitespace:e.precedingWhitespace})}],ParserStart:`main`},{Parser:Ea,Grammar:Da}=l(da(),1).default;function Oa(e){let t={},n=new Sa(n=>[...fa(e.tokenize(n,t)),ie(n.length)]),r=new Ea(Da.fromCompiled(Ta),{lexer:n});return{parse:(e,n)=>{t=n;let{results:i}=r.feed(e);if(i.length===1)return i[0];throw i.length===0?Error(`Parse error: Invalid SQL`):Error(`Parse error: Ambiguous grammar\n${JSON.stringify(i,void 0,2)}`)}}}var H;(function(e){e[e.SPACE=0]=`SPACE`,e[e.NO_SPACE=1]=`NO_SPACE`,e[e.NO_NEWLINE=2]=`NO_NEWLINE`,e[e.NEWLINE=3]=`NEWLINE`,e[e.MANDATORY_NEWLINE=4]=`MANDATORY_NEWLINE`,e[e.INDENT=5]=`INDENT`,e[e.SINGLE_INDENT=6]=`SINGLE_INDENT`})(H=H||={});var ka=class{constructor(e){this.indentation=e,this.items=[]}add(...e){for(let t of e)switch(t){case H.SPACE:this.items.push(H.SPACE);break;case H.NO_SPACE:this.trimHorizontalWhitespace();break;case H.NO_NEWLINE:this.trimWhitespace();break;case H.NEWLINE:this.trimHorizontalWhitespace(),this.addNewline(H.NEWLINE);break;case H.MANDATORY_NEWLINE:this.trimHorizontalWhitespace(),this.addNewline(H.MANDATORY_NEWLINE);break;case H.INDENT:this.addIndentation();break;case H.SINGLE_INDENT:this.items.push(H.SINGLE_INDENT);break;default:this.items.push(t)}}trimHorizontalWhitespace(){for(;Aa(O(this.items));)this.items.pop()}trimWhitespace(){for(;ja(O(this.items));)this.items.pop()}addNewline(e){if(this.items.length>0)switch(O(this.items)){case H.NEWLINE:this.items.pop(),this.items.push(e);break;case H.MANDATORY_NEWLINE:break;default:this.items.push(e);break}}addIndentation(){for(let e=0;e<this.indentation.getLevel();e++)this.items.push(H.SINGLE_INDENT)}toString(){return this.items.map(e=>this.itemToString(e)).join(``)}getLayoutItems(){return this.items}itemToString(e){switch(e){case H.SPACE:return` `;case H.NEWLINE:case H.MANDATORY_NEWLINE:return`
14
14
  `;case H.SINGLE_INDENT:return this.indentation.getSingleIndent();default:return e}}},Aa=e=>e===H.SPACE||e===H.SINGLE_INDENT,ja=e=>e===H.SPACE||e===H.SINGLE_INDENT||e===H.NEWLINE;function Ma(e,t){if(t===`standard`)return e;let n=[];return e.length>=10&&e.includes(` `)&&([e,...n]=e.split(` `)),e=t===`tabularLeft`?e.padEnd(9,` `):e.padStart(9,` `),e+[``,...n].join(` `)}function Na(e){return oe(e)||e===_.RESERVED_CLAUSE||e===_.RESERVED_SELECT||e===_.RESERVED_SET_OPERATION||e===_.RESERVED_JOIN||e===_.LIMIT}var Pa=`top-level`,Fa=`block-level`,Ia=class{constructor(e){this.indent=e,this.indentTypes=[]}getSingleIndent(){return this.indent}getLevel(){return this.indentTypes.length}increaseTopLevel(){this.indentTypes.push(Pa)}increaseBlockLevel(){this.indentTypes.push(Fa)}decreaseTopLevel(){this.indentTypes.length>0&&O(this.indentTypes)===Pa&&this.indentTypes.pop()}decreaseBlockLevel(){for(;this.indentTypes.length>0&&this.indentTypes.pop()===Pa;);}},La=class extends ka{constructor(e){super(new Ia(``)),this.expressionWidth=e,this.length=0,this.trailingSpace=!1}add(...e){if(e.forEach(e=>this.addToLength(e)),this.length>this.expressionWidth)throw new Ra;super.add(...e)}addToLength(e){if(typeof e==`string`)this.length+=e.length,this.trailingSpace=!1;else if(e===H.MANDATORY_NEWLINE||e===H.NEWLINE)throw new Ra;else e===H.INDENT||e===H.SINGLE_INDENT||e===H.SPACE?this.trailingSpace||=(this.length++,!0):(e===H.NO_NEWLINE||e===H.NO_SPACE)&&this.trailingSpace&&(this.trailingSpace=!1,this.length--)}},Ra=class extends Error{},za=class e{constructor({cfg:e,dialectCfg:t,params:n,layout:r,inline:i=!1}){this.inline=!1,this.nodes=[],this.index=-1,this.cfg=e,this.dialectCfg=t,this.inline=i,this.params=n,this.layout=r}format(e){for(this.nodes=e,this.index=0;this.index<this.nodes.length;this.index++)this.formatNode(this.nodes[this.index]);return this.layout}formatNode(e){this.formatComments(e.leadingComments),this.formatNodeWithoutComments(e),this.formatComments(e.trailingComments)}formatNodeWithoutComments(e){switch(e.type){case I.function_call:return this.formatFunctionCall(e);case I.parameterized_data_type:return this.formatParameterizedDataType(e);case I.array_subscript:return this.formatArraySubscript(e);case I.property_access:return this.formatPropertyAccess(e);case I.parenthesis:return this.formatParenthesis(e);case I.between_predicate:return this.formatBetweenPredicate(e);case I.case_expression:return this.formatCaseExpression(e);case I.case_when:return this.formatCaseWhen(e);case I.case_else:return this.formatCaseElse(e);case I.clause:return this.formatClause(e);case I.set_operation:return this.formatSetOperation(e);case I.limit_clause:return this.formatLimitClause(e);case I.all_columns_asterisk:return this.formatAllColumnsAsterisk(e);case I.literal:return this.formatLiteral(e);case I.identifier:return this.formatIdentifier(e);case I.parameter:return this.formatParameter(e);case I.operator:return this.formatOperator(e);case I.comma:return this.formatComma(e);case I.line_comment:return this.formatLineComment(e);case I.block_comment:return this.formatBlockComment(e);case I.disable_comment:return this.formatBlockComment(e);case I.data_type:return this.formatDataType(e);case I.keyword:return this.formatKeywordNode(e)}}formatFunctionCall(e){this.withComments(e.nameKw,()=>{this.layout.add(this.showFunctionKw(e.nameKw))}),this.formatNode(e.parenthesis)}formatParameterizedDataType(e){this.withComments(e.dataType,()=>{this.layout.add(this.showDataType(e.dataType))}),this.formatNode(e.parenthesis)}formatArraySubscript(e){let t;switch(e.array.type){case I.data_type:t=this.showDataType(e.array);break;case I.keyword:t=this.showKw(e.array);break;default:t=this.showIdentifier(e.array);break}this.withComments(e.array,()=>{this.layout.add(t)}),this.formatNode(e.parenthesis)}formatPropertyAccess(e){this.formatNode(e.object),this.layout.add(H.NO_SPACE,e.operator),this.formatNode(e.property)}formatParenthesis(e){let t=this.formatInlineExpression(e.children);t?(this.layout.add(e.openParen),this.layout.add(...t.getLayoutItems()),this.layout.add(H.NO_SPACE,e.closeParen,H.SPACE)):(this.layout.add(e.openParen,H.NEWLINE),P(this.cfg)?(this.layout.add(H.INDENT),this.layout=this.formatSubExpression(e.children)):(this.layout.indentation.increaseBlockLevel(),this.layout.add(H.INDENT),this.layout=this.formatSubExpression(e.children),this.layout.indentation.decreaseBlockLevel()),this.layout.add(H.NEWLINE,H.INDENT,e.closeParen,H.SPACE))}formatBetweenPredicate(e){this.layout.add(this.showKw(e.betweenKw),H.SPACE),this.layout=this.formatSubExpression(e.expr1),this.layout.add(H.NO_SPACE,H.SPACE,this.showNonTabularKw(e.andKw),H.SPACE),this.layout=this.formatSubExpression(e.expr2),this.layout.add(H.SPACE)}formatCaseExpression(e){this.formatNode(e.caseKw),this.layout.indentation.increaseBlockLevel(),this.layout=this.formatSubExpression(e.expr),this.layout=this.formatSubExpression(e.clauses),this.layout.indentation.decreaseBlockLevel(),this.layout.add(H.NEWLINE,H.INDENT),this.formatNode(e.endKw)}formatCaseWhen(e){this.layout.add(H.NEWLINE,H.INDENT),this.formatNode(e.whenKw),this.layout=this.formatSubExpression(e.condition),this.formatNode(e.thenKw),this.layout=this.formatSubExpression(e.result)}formatCaseElse(e){this.layout.add(H.NEWLINE,H.INDENT),this.formatNode(e.elseKw),this.layout=this.formatSubExpression(e.result)}formatClause(e){this.isOnelineClause(e)?this.formatClauseInOnelineStyle(e):P(this.cfg)?this.formatClauseInTabularStyle(e):this.formatClauseInIndentedStyle(e)}isOnelineClause(e){return P(this.cfg)?this.dialectCfg.tabularOnelineClauses[e.nameKw.text]:this.dialectCfg.onelineClauses[e.nameKw.text]}formatClauseInIndentedStyle(e){this.layout.add(H.NEWLINE,H.INDENT,this.showKw(e.nameKw),H.NEWLINE),this.layout.indentation.increaseTopLevel(),this.layout.add(H.INDENT),this.layout=this.formatSubExpression(e.children),this.layout.indentation.decreaseTopLevel()}formatClauseInOnelineStyle(e){this.layout.add(H.NEWLINE,H.INDENT,this.showKw(e.nameKw),H.SPACE),this.layout=this.formatSubExpression(e.children)}formatClauseInTabularStyle(e){this.layout.add(H.NEWLINE,H.INDENT,this.showKw(e.nameKw),H.SPACE),this.layout.indentation.increaseTopLevel(),this.layout=this.formatSubExpression(e.children),this.layout.indentation.decreaseTopLevel()}formatSetOperation(e){this.layout.add(H.NEWLINE,H.INDENT,this.showKw(e.nameKw),H.NEWLINE),this.layout.add(H.INDENT),this.layout=this.formatSubExpression(e.children)}formatLimitClause(e){this.withComments(e.limitKw,()=>{this.layout.add(H.NEWLINE,H.INDENT,this.showKw(e.limitKw))}),this.layout.indentation.increaseTopLevel(),P(this.cfg)?this.layout.add(H.SPACE):this.layout.add(H.NEWLINE,H.INDENT),e.offset?(this.layout=this.formatSubExpression(e.offset),this.layout.add(H.NO_SPACE,`,`,H.SPACE),this.layout=this.formatSubExpression(e.count)):this.layout=this.formatSubExpression(e.count),this.layout.indentation.decreaseTopLevel()}formatAllColumnsAsterisk(e){this.layout.add(`*`,H.SPACE)}formatLiteral(e){this.layout.add(e.text,H.SPACE)}formatIdentifier(e){this.layout.add(this.showIdentifier(e),H.SPACE)}formatParameter(e){this.layout.add(this.params.get(e),H.SPACE)}formatOperator({text:e}){this.cfg.denseOperators||this.dialectCfg.alwaysDenseOperators.includes(e)?this.layout.add(H.NO_SPACE,e):e===`:`?this.layout.add(H.NO_SPACE,e,H.SPACE):this.layout.add(e,H.SPACE)}formatComma(e){this.inline?this.layout.add(H.NO_SPACE,`,`,H.SPACE):this.layout.add(H.NO_SPACE,`,`,H.NEWLINE,H.INDENT)}withComments(e,t){this.formatComments(e.leadingComments),t(),this.formatComments(e.trailingComments)}formatComments(e){e&&e.forEach(e=>{e.type===I.line_comment?this.formatLineComment(e):this.formatBlockComment(e)})}formatLineComment(e){Pi(e.precedingWhitespace||``)?this.layout.add(H.NEWLINE,H.INDENT,e.text,H.MANDATORY_NEWLINE,H.INDENT):this.layout.getLayoutItems().length>0?this.layout.add(H.NO_NEWLINE,H.SPACE,e.text,H.MANDATORY_NEWLINE,H.INDENT):this.layout.add(e.text,H.MANDATORY_NEWLINE,H.INDENT)}formatBlockComment(e){e.type===I.block_comment&&this.isMultilineBlockComment(e)?(this.splitBlockComment(e.text).forEach(e=>{this.layout.add(H.NEWLINE,H.INDENT,e)}),this.layout.add(H.NEWLINE,H.INDENT)):this.layout.add(e.text,H.SPACE)}isMultilineBlockComment(e){return Pi(e.text)||Pi(e.precedingWhitespace||``)}isDocComment(e){let t=e.split(/\n/);return/^\/\*\*?$/.test(t[0])&&t.slice(1,t.length-1).every(e=>/^\s*\*/.test(e))&&/^\s*\*\/$/.test(O(t))}splitBlockComment(e){return this.isDocComment(e)?e.split(/\n/).map(e=>/^\s*\*/.test(e)?` `+e.replace(/^\s*/,``):e):e.split(/\n/).map(e=>e.replace(/^\s*/,``))}formatSubExpression(t){return new e({cfg:this.cfg,dialectCfg:this.dialectCfg,params:this.params,layout:this.layout,inline:this.inline}).format(t)}formatInlineExpression(t){let n=this.params.getPositionalParameterIndex();try{return new e({cfg:this.cfg,dialectCfg:this.dialectCfg,params:this.params,layout:new La(this.cfg.expressionWidth),inline:!0}).format(t)}catch(e){if(e instanceof Ra){this.params.setPositionalParameterIndex(n);return}else throw e}}formatKeywordNode(e){switch(e.tokenType){case _.RESERVED_JOIN:return this.formatJoin(e);case _.AND:case _.OR:case _.XOR:return this.formatLogicalOperator(e);default:return this.formatKeyword(e)}}formatJoin(e){P(this.cfg)?(this.layout.indentation.decreaseTopLevel(),this.layout.add(H.NEWLINE,H.INDENT,this.showKw(e),H.SPACE),this.layout.indentation.increaseTopLevel()):this.layout.add(H.NEWLINE,H.INDENT,this.showKw(e),H.SPACE)}formatKeyword(e){this.layout.add(this.showKw(e),H.SPACE)}formatLogicalOperator(e){this.cfg.logicalOperatorNewline===`before`?P(this.cfg)?(this.layout.indentation.decreaseTopLevel(),this.layout.add(H.NEWLINE,H.INDENT,this.showKw(e),H.SPACE),this.layout.indentation.increaseTopLevel()):this.layout.add(H.NEWLINE,H.INDENT,this.showKw(e),H.SPACE):this.layout.add(this.showKw(e),H.NEWLINE,H.INDENT)}formatDataType(e){this.layout.add(this.showDataType(e),H.SPACE)}showKw(e){return Na(e.tokenType)?Ma(this.showNonTabularKw(e),this.cfg.indentStyle):this.showNonTabularKw(e)}showNonTabularKw(e){switch(this.cfg.keywordCase){case`preserve`:return k(e.raw);case`upper`:return e.text;case`lower`:return e.text.toLowerCase()}}showFunctionKw(e){return Na(e.tokenType)?Ma(this.showNonTabularFunctionKw(e),this.cfg.indentStyle):this.showNonTabularFunctionKw(e)}showNonTabularFunctionKw(e){switch(this.cfg.functionCase){case`preserve`:return k(e.raw);case`upper`:return e.text;case`lower`:return e.text.toLowerCase()}}showIdentifier(e){if(e.quoted)return e.text;switch(this.cfg.identifierCase){case`preserve`:return e.text;case`upper`:return e.text.toUpperCase();case`lower`:return e.text.toLowerCase()}}showDataType(e){switch(this.cfg.dataTypeCase){case`preserve`:return k(e.raw);case`upper`:return e.text;case`lower`:return e.text.toLowerCase()}}},Ba=class{constructor(e,t){this.dialect=e,this.cfg=t,this.params=new ua(this.cfg.params)}format(e){let t=this.parse(e);return this.formatAst(t).trimEnd()}parse(e){return Oa(this.dialect.tokenizer).parse(e,this.cfg.paramTypes||{})}formatAst(e){return e.map(e=>this.formatStatement(e)).join(`
15
- `.repeat(this.cfg.linesBetweenQueries+1))}formatStatement(e){let t=new za({cfg:this.cfg,dialectCfg:this.dialect.formatOptions,params:this.params,layout:new ka(new Ia(la(this.cfg)))}).format(e.children);return e.hasSemicolon&&(this.cfg.newlineBeforeSemicolon?t.add(H.NEWLINE,`;`):t.add(H.NO_NEWLINE,`;`)),t.toString()}},U=class extends Error{};function Va(e){for(let t of[`multilineLists`,`newlineBeforeOpenParen`,`newlineBeforeCloseParen`,`aliasAs`,`commaPosition`,`tabulateAlias`])if(t in e)throw new U(`${t} config is no more supported.`);if(e.expressionWidth<=0)throw new U(`expressionWidth config must be positive number. Received ${e.expressionWidth} instead.`);if(e.params&&!Ha(e.params)&&console.warn(`WARNING: All "params" option values should be strings.`),e.paramTypes&&!Ua(e.paramTypes))throw new U(`Empty regex given in custom paramTypes. That would result in matching infinite amount of parameters.`);return e}function Ha(e){return(e instanceof Array?e:Object.values(e)).every(e=>typeof e==`string`)}function Ua(e){return e.custom&&Array.isArray(e.custom)?e.custom.every(e=>e.regex!==``):!0}var Wa=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols==`function`)for(var i=0,r=Object.getOwnPropertySymbols(e);i<r.length;i++)t.indexOf(r[i])<0&&Object.prototype.propertyIsEnumerable.call(e,r[i])&&(n[r[i]]=e[r[i]]);return n},Ga={bigquery:`bigquery`,clickhouse:`clickhouse`,db2:`db2`,db2i:`db2i`,duckdb:`duckdb`,hive:`hive`,mariadb:`mariadb`,mysql:`mysql`,n1ql:`n1ql`,plsql:`plsql`,postgresql:`postgresql`,redshift:`redshift`,spark:`spark`,sqlite:`sqlite`,sql:`sql`,tidb:`tidb`,trino:`trino`,transactsql:`transactsql`,tsql:`transactsql`,singlestoredb:`singlestoredb`,snowflake:`snowflake`},Ka=Object.keys(Ga),qa={tabWidth:2,useTabs:!1,keywordCase:`preserve`,identifierCase:`preserve`,dataTypeCase:`preserve`,functionCase:`preserve`,indentStyle:`standard`,logicalOperatorNewline:`before`,expressionWidth:50,linesBetweenQueries:1,denseOperators:!1,newlineBeforeSemicolon:!1},Ja=(e,t={})=>{if(typeof t.language==`string`&&!Ka.includes(t.language))throw new U(`Unsupported SQL dialect: ${t.language}`);let n=Ga[t.language||`sql`];return Ya(e,Object.assign(Object.assign({},t),{dialect:Mi[n]}))},Ya=(e,t)=>{var{dialect:n}=t,r=Wa(t,[`dialect`]);if(typeof e!=`string`)throw Error(`Invalid query argument. Expected string, instead got `+typeof e);let i=Va(Object.assign(Object.assign({},qa),r));return new Ba(oa(n),i).format(e)},Xa={funnel:{description:`Track conversion through sequential steps. Entities (identified by bindingKey) move through ordered steps.`,structure:{funnel:{bindingKey:`Cube.dimension - identifies entities moving through funnel`,timeDimension:`Cube.dimension - time field for ordering events`,steps:[{name:`string - human readable step name`,filter:{member:`Cube.dimension`,operator:`equals | notEquals | contains | ...`,values:[`array of filter values`]},timeToConvert:`optional - max time window e.g. "7 days"`}],dateRange:`[start, end] array OR string like "last 7 days", "last 3 months", "this quarter"`}}},flow:{description:`Analyze paths users take before/after a specific event. Shows event sequences.`,structure:{flow:{bindingKey:`Cube.dimension - identifies entities`,timeDimension:`Cube.dimension - time field for ordering`,eventDimension:`Cube.dimension - the event type field`,startingStep:{filter:{member:`Cube.dimension`,operator:`equals`,values:[`event value`]}},stepsBefore:`number - how many steps to show before starting step`,stepsAfter:`number - how many steps to show after starting step`,dateRange:`[start, end] array OR string like "last 7 days", "last 3 months", "this quarter"`}}},retention:{description:`Measure how many users return over time periods after initial activity.`,structure:{retention:{bindingKey:`Cube.dimension - identifies entities`,timeDimension:`Cube.dimension - time field for cohort assignment`,granularity:`day | week | month - period size`,periods:`number - how many periods to analyze`,dateRange:`[start, end] array OR string like "last 7 days", "last 3 months", "this quarter"`}}}};function Za(e,t){if(e.length>500||t.length>500)return e.length+t.length;let n=[];for(let e=0;e<=t.length;e++)n[e]=[e];for(let t=0;t<=e.length;t++)n[0][t]=t;for(let r=1;r<=t.length;r++)for(let i=1;i<=e.length;i++)t.charAt(r-1)===e.charAt(i-1)?n[r][i]=n[r-1][i-1]:n[r][i]=Math.min(n[r-1][i-1]+1,n[r][i-1]+1,n[r-1][i]+1);return n[t.length][e.length]}function W(e,t){let n=e.toLowerCase().trim(),r=t.toLowerCase().trim();if(n===r)return 1;if(r.includes(n))return .9;let i=r.split(/[\s_-]+/);for(let e of i){if(e===n)return .85;if(e.startsWith(n))return .75}let a=1-Za(n,r)/Math.max(n.length,r.length);return a>.5?a*.7:0}function G(e,t){let n=0;for(let r of t){let t=W(e,r);t>n&&(n=t)}return n}function Qa(e){let t=new Set(`a.an.the.is.are.was.were.be.been.being.have.has.had.do.does.did.will.would.could.should.may.might.must.can.and.or.but.if.then.else.when.where.why.how.what.which.who.this.that.these.those.i.me.my.we.our.you.your.he.she.it.they.them.their.in.on.at.to.for.of.with.by.from.up.down.out.over.under.about.into.through.during.before.after.above.below.between.show.me.get.find.list.give.tell.display.want.need.see.know`.split(`.`));return e.toLowerCase().replace(/[^\w\s]/g,` `).split(/\s+/).filter(e=>e.length>2&&!t.has(e))}function $a(e,t){let n=0,r=[],i=new Map,a=new Map;for(let o of t){let t=W(o,e.name);t>.5&&(n+=t*2,r.includes(`name`)||r.push(`name`));let s=W(o,e.title);if(s>.5&&(n+=s*1.5,r.includes(`title`)||r.push(`title`)),e.description){let t=W(o,e.description);t>.3&&(n+=t,r.includes(`description`)||r.push(`description`))}if(e.exampleQuestions)for(let t of e.exampleQuestions){let e=W(o,t);e>.3&&(n+=e*1.5,r.includes(`exampleQuestions`)||r.push(`exampleQuestions`))}for(let t of e.measures){let e=0,a=t.name.split(`.`).pop()||t.name;if(e=Math.max(e,W(o,a)),e=Math.max(e,W(o,t.title)),t.description&&(e=Math.max(e,W(o,t.description)*.8)),t.synonyms&&(e=Math.max(e,G(o,t.synonyms))),e>.4){n+=e,r.includes(`measures`)||r.push(`measures`);let a=i.get(t.name)||0;i.set(t.name,Math.max(a,e))}}for(let t of e.dimensions){let e=0,i=t.name.split(`.`).pop()||t.name;if(e=Math.max(e,W(o,i)),e=Math.max(e,W(o,t.title)),t.description&&(e=Math.max(e,W(o,t.description)*.8)),t.synonyms&&(e=Math.max(e,G(o,t.synonyms))),e>.4){n+=e,r.includes(`dimensions`)||r.push(`dimensions`);let i=a.get(t.name)||0;a.set(t.name,Math.max(i,e))}}}return{score:Math.min(1,n/(t.length*2)),matchedOn:r,suggestedMeasures:Array.from(i.entries()).sort((e,t)=>t[1]-e[1]).slice(0,5).map(([e])=>e),suggestedDimensions:Array.from(a.entries()).sort((e,t)=>t[1]-e[1]).slice(0,5).map(([e])=>e)}}function eo(e){let t=!!e.meta?.eventStream,n=e.dimensions.some(e=>e.type===`time`),r=e.dimensions.some(t=>t.name.toLowerCase().includes(`id`)||t.type===`number`||e.meta?.eventStream?.bindingKey&&t.name===e.meta.eventStream.bindingKey),i=t||n&&r;return{query:!0,funnel:i,flow:i,retention:i}}function to(e){let t=eo(e);if(!t.funnel&&!t.flow&&!t.retention)return;let n=[];if(e.meta?.eventStream?.bindingKey){let t=e.dimensions.find(t=>t.name===e.meta?.eventStream?.bindingKey);n.push({dimension:e.meta.eventStream.bindingKey,description:t?.description||`Configured binding key`})}for(let t of e.dimensions)(t.name.split(`.`).pop()?.toLowerCase()||``).includes(`id`)&&!n.some(e=>e.dimension===t.name)&&n.push({dimension:t.name,description:t.description||`Potential entity identifier`});let r=[];if(e.meta?.eventStream?.timeDimension){let t=e.dimensions.find(t=>t.name===e.meta?.eventStream?.timeDimension);r.push({dimension:e.meta.eventStream.timeDimension,description:t?.description||`Configured time dimension`})}for(let t of e.dimensions)t.type===`time`&&!r.some(e=>e.dimension===t.name)&&r.push({dimension:t.name,description:t.description});let i=[];for(let t of e.dimensions){let e=t.name.split(`.`).pop()?.toLowerCase()||``;t.type===`string`&&(e.includes(`type`)||e.includes(`event`)||e.includes(`status`)||e.includes(`state`)||e.includes(`action`))&&i.push({dimension:t.name,description:t.description||`Potential event type dimension`})}return{candidateBindingKeys:n,candidateTimeDimensions:r,candidateEventDimensions:i}}function no(e,t){let n=[];if(!t)return n;if(t.candidateBindingKeys.length>1&&n.push(`Choose bindingKey based on what entity to track through the analysis`),t.candidateEventDimensions.length>0){let e=t.candidateEventDimensions[0].dimension;n.push(`Query ${e} dimension to discover available values for funnel steps`)}return n.push(`Use /mcp/load with a standard query to discover dimension values before building analysis queries`),n}function ro(e,t={}){let{topic:n,intent:r,limit:i=10,minScore:a=.1}=t,o=[n,r].filter(Boolean).join(` `);if(!o.trim())return e.slice(0,i).map(e=>{let t=eo(e),n=to(e),r=no(e,n),i=t.funnel||t.flow||t.retention;return{cube:e.name,title:e.title,description:e.description,relevanceScore:1,matchedOn:[],suggestedMeasures:e.measures.slice(0,5).map(e=>e.name),suggestedDimensions:e.dimensions.slice(0,5).map(e=>e.name),capabilities:t,analysisConfig:n,hints:r.length>0?r:void 0,querySchemas:i?Xa:void 0}});let s=Qa(o);if(s.length===0)return[];let c=[];for(let t of e){let{score:e,matchedOn:n,suggestedMeasures:r,suggestedDimensions:i}=$a(t,s);if(e>=a){let a=eo(t),o=to(t),s=no(t,o),l=a.funnel||a.flow||a.retention;c.push({cube:t.name,title:t.title,description:t.description,relevanceScore:e,matchedOn:n,suggestedMeasures:r,suggestedDimensions:i,capabilities:a,analysisConfig:o,hints:s.length>0?s:void 0,querySchemas:l?Xa:void 0})}}return c.sort((e,t)=>t.relevanceScore-e.relevanceScore).slice(0,i)}function io(e,t,n){let r=null;for(let i of e){if(!n||n===`measure`)for(let e of i.measures){let n=W(t,e.name.split(`.`).pop()||e.name);n=Math.max(n,W(t,e.title)),e.synonyms&&(n=Math.max(n,G(t,e.synonyms))),n>.5&&(!r||n>r.score)&&(r={field:e.name,cube:i.name,score:n,type:`measure`})}if(!n||n===`dimension`)for(let e of i.dimensions){let n=W(t,e.name.split(`.`).pop()||e.name);n=Math.max(n,W(t,e.title)),e.synonyms&&(n=Math.max(n,G(t,e.synonyms))),n>.5&&(!r||n>r.score)&&(r={field:e.name,cube:i.name,score:n,type:`dimension`})}}return r}function ao(){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 oo={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 so(e){let t=e.toLowerCase();return oo.funnel.test(t)?`funnel`:oo.flow.test(t)?`flow`:oo.retention.test(t)?`retention`:`query`}function co(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 lo(e){let t=ao(),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=parseInt(t[1],10),r=new Date,i=r.toISOString().split(`T`)[0],a=e=>e.toISOString().split(`T`)[0];if(/days?/.test(n)){let t=new Date(r);return t.setDate(t.getDate()-e),{dateRange:[a(t),i],granularity:`day`}}if(/weeks?/.test(n)){let t=new Date(r);return t.setDate(t.getDate()-e*7),{dateRange:[a(t),i],granularity:e<=4?`day`:`week`}}if(/months?/.test(n)){let t=new Date(r);return t.setMonth(t.getMonth()-e),{dateRange:[a(t),i],granularity:e<=3?`day`:`month`}}}if(/^q[1-4]$/i.test(t[0])){let e=parseInt(t[1],10),n=new Date().getFullYear(),r=(e-1)*3,i=new Date(n,r,1),a=new Date(n,r+3,0),o=e=>e.toISOString().split(`T`)[0];return{dateRange:[o(i),o(a)],granularity:`month`}}return{dateRange:e.getDateRange(),granularity:e.granularity}}}return null}function uo(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 fo(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 po(e,t,n){let r=[],i=[],a={},o=so(t),s;if(n){let t=e.find(e=>e.name===n);t?(s=[t],r.push(`Using specified cube: ${n}`)):(i.push(`Specified cube '${n}' not found`),s=[])}else s=ro(e,{intent:t,limit:3}).map(t=>e.find(e=>e.name===t.cube)).filter(e=>e!==void 0),s.length>0&&r.push(`Identified relevant cubes: ${s.map(e=>e.name).join(`, `)}`);if(s.length===0){let e=o!==`query`,t=e?co(o,void 0):void 0;return{query:{},confidence:e?.7:0,reasoning:e?[`Detected ${o} intent from natural language`]:[`Could not identify relevant cubes for this query`],warnings:i,analysisMode:o,nextSteps:t}}let c=s[0],l=.5,u=uo(t);u&&(r.push(`Detected ${u.type} aggregation intent`),l+=.1);let d=[],f=t.toLowerCase();for(let e of c.measures){let t=[(e.name.split(`.`).pop()||e.name).toLowerCase(),e.title.toLowerCase(),...(e.synonyms||[]).map(e=>e.toLowerCase())];for(let n of t)if(f.includes(n)){d.push(e.name),r.push(`Matched measure '${e.name}' via keyword '${n}'`),l+=.15;break}}if(d.length===0&&u){let e=c.measures.filter(e=>e.type===u.type);if(e.length>0)d.push(e[0].name),r.push(`Suggested ${e[0].name} based on ${u.type} intent`);else if(u.type===`count`){let e=c.measures.find(e=>e.type===`count`||e.type===`countDistinct`);e&&(d.push(e.name),r.push(`Suggested ${e.name} for counting`))}}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=fo(t),m=[];for(let e of p){let t=io(s,e,`dimension`);t&&(m.push(t.field),r.push(`Matched dimension '${t.field}' from grouping keyword '${e}'`),l+=.1)}for(let e of s)for(let t of e.dimensions){let e=[(t.name.split(`.`).pop()||t.name).toLowerCase(),t.title.toLowerCase(),...(t.synonyms||[]).map(e=>e.toLowerCase())];for(let n of e)if(f.includes(n)&&!m.includes(t.name)&&(f.includes(`by ${n}`)||f.includes(`per ${n}`))){m.push(t.name),r.push(`Matched dimension '${t.name}' as grouping`),l+=.1;break}}m.length>0&&(a.dimensions=m);let h=lo(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:co(o,e)}}return{query:a,confidence:l,reasoning:r,warnings:i.length>0?i:void 0,analysisMode:`query`}}function mo(e,t){if(e.length>500||t.length>500)return e.length+t.length;let n=[];for(let e=0;e<=t.length;e++)n[e]=[e];for(let t=0;t<=e.length;t++)n[0][t]=t;for(let r=1;r<=t.length;r++)for(let i=1;i<=e.length;i++)t.charAt(r-1)===e.charAt(i-1)?n[r][i]=n[r-1][i-1]:n[r][i]=Math.min(n[r-1][i-1]+1,n[r][i-1]+1,n[r-1][i]+1);return n[t.length][e.length]}function K(e,t){let n=null;for(let r of t){let t=mo(e.toLowerCase(),r.toLowerCase());t<=3&&(!n||t<n.distance)&&(n={field:r,distance:t})}return n}function ho(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:`Invalid measure format: '${e}'. Expected 'CubeName.measureName'`,field:e});return}let[a,o]=i,s=t.find(e=>e.name===a);if(!s){let i=t.map(e=>e.name),s=K(a,i);s?(n.push({type:`cube_not_found`,message:`Cube '${a}' not found`,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:`Cube '${a}' not found`,field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.measures.some(t=>t.name===e)){let i=io(t,o,`measure`);if(i&&i.cube===a)n.push({type:`measure_not_found`,message:`Measure '${o}' not found on cube '${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=K(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`measure_not_found`,message:`Measure '${o}' not found on cube '${a}'`,field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:t}),r.set(e,t)}else n.push({type:`measure_not_found`,message:`Measure '${o}' not found on cube '${a}'`,field:e,suggestion:`Available measures: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function q(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:`Invalid dimension format: '${e}'. Expected 'CubeName.dimensionName'`,field:e});return}let[a,o]=i,s=t.find(e=>e.name===a);if(!s){let i=t.map(e=>e.name),s=K(a,i);s?(n.push({type:`cube_not_found`,message:`Cube '${a}' not found`,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:`Cube '${a}' not found`,field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.dimensions.some(t=>t.name===e)){let i=io(t,o,`dimension`);if(i&&i.cube===a)n.push({type:`dimension_not_found`,message:`Dimension '${o}' not found on cube '${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=K(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`dimension_not_found`,message:`Dimension '${o}' not found on cube '${a}'`,field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:t}),r.set(e,t)}else n.push({type:`dimension_not_found`,message:`Dimension '${o}' not found on cube '${a}'`,field:e,suggestion:`Available dimensions: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function J(e,t,n,r){for(let i of e){if(`and`in i&&Array.isArray(i.and)){J(i.and,t,n,r);continue}if(`or`in i&&Array.isArray(i.or)){J(i.or,t,n,r);continue}if(`member`in i){let e=i.member,a=e.split(`.`);if(a.length!==2){n.push({type:`invalid_filter`,message:`Invalid filter member format: '${e}'`,field:e});continue}let[o,s]=a,c=t.find(e=>e.name===o);if(!c){let i=K(o,t.map(e=>e.name));i&&r.set(e,`${i.field}.${s}`),n.push({type:`cube_not_found`,message:`Cube '${o}' not found in filter`,field:e,suggestion:i?`Did you mean '${i.field}'?`:void 0,correctedValue:i?`${i.field}.${s}`:void 0});continue}let l=c.dimensions.some(t=>t.name===e),u=c.measures.some(t=>t.name===e);if(!l&&!u){let t=K(s,[...c.dimensions.map(e=>e.name.split(`.`).pop()),...c.measures.map(e=>e.name.split(`.`).pop())]);if(t){let i=`${o}.${t.field}`;r.set(e,i),n.push({type:`invalid_filter`,message:`Filter field '${s}' not found on cube '${o}'`,field:e,suggestion:`Did you mean '${t.field}'?`,correctedValue:i})}else n.push({type:`invalid_filter`,message:`Filter field '${s}' not found on cube '${o}'`,field:e})}}}}function go(e,t,n,r,i){let a=e.funnel;if(a)if(a.bindingKey?typeof a.bindingKey==`string`&&q(a.bindingKey,t,n,i):n.push({type:`syntax_error`,message:`funnel.bindingKey is required`}),a.timeDimension?typeof a.timeDimension==`string`&&q(a.timeDimension,t,n,i):n.push({type:`syntax_error`,message:`funnel.timeDimension is required`}),!a.steps||!Array.isArray(a.steps))n.push({type:`syntax_error`,message:`funnel.steps array is required`});else if(a.steps.length<2)n.push({type:`syntax_error`,message:`funnel requires at least 2 steps`});else for(let e=0;e<a.steps.length;e++){let o=a.steps[e];o.name||r.push({type:`best_practice`,message:`Step ${e+1} is missing a name`,suggestion:`Add descriptive names to funnel steps`}),o.filter&&`member`in o.filter&&J([o.filter],t,n,i)}}function _o(e,t,n,r,i){let a=e.flow;a&&(a.bindingKey?typeof a.bindingKey==`string`&&q(a.bindingKey,t,n,i):n.push({type:`syntax_error`,message:`flow.bindingKey is required`}),a.timeDimension?typeof a.timeDimension==`string`&&q(a.timeDimension,t,n,i):n.push({type:`syntax_error`,message:`flow.timeDimension is required`}),a.eventDimension?typeof a.eventDimension==`string`&&q(a.eventDimension,t,n,i):n.push({type:`syntax_error`,message:`flow.eventDimension is required`}),a.stepsBefore===void 0&&a.stepsAfter===void 0&&r.push({type:`best_practice`,message:`Neither stepsBefore nor stepsAfter specified`,suggestion:`Set stepsBefore and/or stepsAfter to see event sequences`}))}function vo(e,t,n,r,i){let a=e.retention;a&&(a.bindingKey?typeof a.bindingKey==`string`&&q(a.bindingKey,t,n,i):n.push({type:`syntax_error`,message:`retention.bindingKey is required`}),a.timeDimension?typeof a.timeDimension==`string`&&q(a.timeDimension,t,n,i):n.push({type:`syntax_error`,message:`retention.timeDimension is required`}),a.granularity||r.push({type:`best_practice`,message:`retention.granularity not specified`,suggestion:`Specify granularity: "day", "week", or "month"`}),a.periods||r.push({type:`best_practice`,message:`retention.periods not specified`,suggestion:`Specify number of periods to analyze`}))}function yo(e,t){let n=[],r=[],i=new Map;if(e.funnel)return go(e,t,n,r,i),{isValid:n.length===0,errors:n,warnings:r,correctedQuery:void 0};if(e.flow)return _o(e,t,n,r,i),{isValid:n.length===0,errors:n,warnings:r,correctedQuery:void 0};if(e.retention)return vo(e,t,n,r,i),{isValid:n.length===0,errors:n,warnings:r,correctedQuery:void 0};if(e.measures)for(let r of e.measures)ho(r,t,n,i);if(e.dimensions)for(let r of e.dimensions)q(r,t,n,i);if(e.timeDimensions)for(let a of e.timeDimensions){q(a.dimension,t,n,i);let[e]=a.dimension.split(`.`),o=t.find(t=>t.name===e);if(o){let e=o.dimensions.find(e=>e.name===a.dimension);e&&e.type!==`time`&&r.push({type:`best_practice`,message:`Dimension '${a.dimension}' is not a time type (it's '${e.type}')`,field:a.dimension,suggestion:`Use a dimension with type "time" for timeDimensions`})}}e.filters&&J(e.filters,t,n,i),!e.measures?.length&&!e.dimensions?.length&&n.push({type:`syntax_error`,message:`Query must have at least one measure or dimension`}),e.measures&&e.measures.length>10&&r.push({type:`performance`,message:`Query has ${e.measures.length} measures, which may impact performance`,suggestion:`Consider splitting into multiple queries`}),e.dimensions&&e.dimensions.length>5&&r.push({type:`performance`,message:`Query has ${e.dimensions.length} dimensions, which may produce many rows`,suggestion:`Consider adding filters or reducing dimensions`});let a;if(i.size>0){let t=JSON.parse(JSON.stringify(e));t.measures&&=t.measures.map(e=>i.get(e)||e),t.dimensions&&=t.dimensions.map(e=>i.get(e)||e),t.timeDimensions&&=t.timeDimensions.map(e=>({...e,dimension:i.get(e.dimension)||e.dimension})),a=t}return{isValid:n.length===0,errors:n,warnings:r,correctedQuery:i.size>0?a:void 0}}function bo(e){let t=0;return t+=(e.measures?.length||0)*1,t+=(e.dimensions?.length||0)*1,t+=(e.filters?.length||0)*2,t+=(e.timeDimensions?.length||0)*3,t<=5?`low`:t<=15?`medium`:`high`}function xo(e,t){if(`and`in e||`or`in e){let n=e.and||e.or||[];for(let e of n)xo(e,t);return}if(`member`in e){let[n]=e.member.split(`.`);n&&t.add(n)}}function So(){return crypto.randomUUID()}function Co(e){let t=e.dimensions||[],n=e.timeDimensions||[],r=e.measures||[];return{sortedDimensions:t,sortedTimeDimensions:n,timeDimensions:n,measures:r,leafMeasureAdditive:!0,leafMeasures:r,measureToLeafMeasures:{},hasNoTimeDimensionsWithoutGranularity:!0,allFiltersWithinSelectedDimensions:!0,isAdditive:!0,granularityHierarchies:{},hasMultipliedMeasures:!1,hasCumulativeMeasures:!1,windowGranularity:null,filterDimensionsSingleValueEqual:{},ownedDimensions:t,ownedTimeDimensionsWithRollupGranularity:[],ownedTimeDimensionsAsIs:[],allBackAliasMembers:{},hasMultiStage:!1}}function wo(e){return e.getEngineType()??`postgres`}function To(e){let t=[];if(e.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>=2)&&t.push(`comparison`),e.funnel&&e.funnel.steps?.length>=2&&t.push(`funnel`),e.flow&&e.flow.bindingKey&&e.flow.eventDimension&&t.push(`flow`),e.retention&&e.retention.bindingKey&&e.retention.timeDimension&&t.push(`retention`),t.length===0)return`regular`;if(t.length>1)throw Error(`Query contains multiple query modes: ${t.join(`, `)}`);return t[0]}function Eo(e,t,n){try{return n.analyzeQuery(e,t)}catch(e){console.warn(`Query analysis failed:`,String(e).replace(/\n|\r/g,``));return}}function Y(e,t,n){let r=t.validateQuery(e);if(!r.isValid)throw Error(`${n} validation failed: ${r.errors.join(`, `)}`)}async function X(e,t,n){return{sqlResult:await n.dryRun(e,t),analysis:Eo(e,t,n)}}function Z(e,t){let[n]=e.split(`.`);n&&t.add(n)}function Q(e,t){if(e)for(let n of e)n.cube&&t.add(n.cube)}function Do(e){let t=new Set;return e.measures?.forEach(e=>Z(e,t)),e.dimensions?.forEach(e=>Z(e,t)),e.timeDimensions?.forEach(e=>Z(e.dimension,t)),e.filters?.forEach(e=>{xo(e,t)}),Array.from(t)}function Oo(e){let t=new Set,n=e.funnel;typeof n.bindingKey==`string`?Z(n.bindingKey,t):Q(n.bindingKey,t),typeof n.timeDimension==`string`?Z(n.timeDimension,t):Q(n.timeDimension,t);for(let e of n.steps)`cube`in e&&e.cube&&t.add(e.cube);return Array.from(t)}function ko(e){let t=new Set,n=e.flow;return typeof n.bindingKey==`string`?Z(n.bindingKey,t):Q(n.bindingKey,t),typeof n.timeDimension==`string`?Z(n.timeDimension,t):Q(n.timeDimension,t),Z(n.eventDimension,t),Array.from(t)}function Ao(e){let t=new Set,n=e.retention;typeof n.timeDimension==`string`?Z(n.timeDimension,t):n.timeDimension?.cube&&t.add(n.timeDimension.cube),typeof n.bindingKey==`string`?Z(n.bindingKey,t):Q(n.bindingKey,t);for(let e of n.breakdownDimensions||[])Z(e,t);return Array.from(t)}function $(e){let t=e.normalizedQueries||[],n=e.transformedQueries||t;return{mode:e.mode,queryType:e.queryType,normalizedQueries:t,queryOrder:e.cubesUsed,transformedQueries:n,pivotQuery:{query:e.query,cubes:e.cubesUsed},sql:{sql:[e.sqlResult.sql],params:e.sqlResult.params||[]},complexity:e.complexity,valid:!0,cubesUsed:e.cubesUsed,joinType:e.joinType,query:e.query,analysis:e.analysis,planningTrace:e.analysis?.planningTrace,modeMetadata:e.modeMetadata}}async function jo(e,t,n){return{regular:()=>Mo(e,t,n),comparison:()=>No(e,t,n),funnel:()=>Bo(e,t,n),flow:()=>Vo(e,t,n),retention:()=>Ho(e,t,n)}[To(e)]()}async function Mo(e,t,n){Y(e,n,`Query`);let r=Do(e),i=r.length>1,{sqlResult:a,analysis:o}=await X(e,t,n),s=r.map(t=>({cube:t,query:{measures:e.measures?.filter(e=>e.startsWith(t+`.`))||[],dimensions:e.dimensions?.filter(e=>e.startsWith(t+`.`))||[],filters:e.filters||[],timeDimensions:e.timeDimensions||[],order:e.order||{},limit:e.limit,offset:e.offset}}));return $({mode:`regular`,queryType:`regularQuery`,joinType:i?`multi_cube_join`:`single_cube`,complexity:bo(e),query:e,cubesUsed:r,sqlResult:a,analysis:o,normalizedQueries:s})}async function No(e,t,n){Y(e,n,`Comparison query`);let r=Do(e),i=r.length>1,{sqlResult:a,analysis:o}=await X(e,t,n),s=e.timeDimensions?.find(e=>e.compareDateRange&&e.compareDateRange.length>=2),c=s?{timeDimension:s.dimension,granularity:s.granularity||`day`,periodCount:s.compareDateRange?.length??0,compareDateRange:s.compareDateRange,sqlPreviewPeriodIndex:0,note:`Dry-run SQL preview shows the first comparison period; execution runs all periods and merges results.`}:void 0;return $({mode:`comparison`,queryType:`comparisonQuery`,joinType:i?`multi_cube_join`:`single_cube`,complexity:bo(e),query:e,cubesUsed:r,sqlResult:a,analysis:o,modeMetadata:c})}function Po(e,t,n){let r=wo(n),i=So();return{queryType:`regularQuery`,results:[{query:e,lastRefreshTime:new Date().toISOString(),usedPreAggregations:{},transformedQuery:Co(e),requestId:i,annotation:t.annotation,dataSource:`default`,dbType:r,extDbType:r,external:!1,slowQuery:!1,data:t.data,...t.cache&&{cache:t.cache},...t.warnings?.length&&{warnings:t.warnings}}],pivotQuery:{...e,queryType:`regularQuery`},slowQuery:!1}}function Fo(e,t){try{return Ja(e,{language:{postgres:`postgresql`,mysql:`mysql`,sqlite:`sqlite`,singlestore:`mysql`,duckdb:`postgresql`,databend:`postgresql`,snowflake:`postgresql`}[t],tabWidth:2,keywordCase:`upper`,indentStyle:`standard`})}catch(t){return console.warn(`SQL formatting failed:`,t),e}}function Io(e,t){return{sql:t.sql,params:t.params||[],query:e}}function Lo(e){return{cubes:e,queryGuidance:{dateHandling:{critical:`Date filtering and time grouping are DIFFERENT operations`,forAggregatedTotals:{description:`For totals over a date range (no time breakdown), use filters with inDateRange operator - NOT timeDimensions`,example:{filters:[{member:`Cube.date`,operator:`inDateRange`,values:[`last 3 months`]}]},useCase:`User asks for "total sales last month", "top 5 last quarter", "sum over past year"`},forTimeSeries:{description:`For time series grouped by period (trend analysis), use timeDimensions WITH granularity`,example:{timeDimensions:[{dimension:`Cube.date`,granularity:`month`,dateRange:`last 3 months`}]},useCase:`User asks for "monthly breakdown", "daily trend", "per week"`},warning:`Using timeDimensions WITHOUT granularity groups by day, returning many rows instead of aggregates. This is the #1 query mistake.`},crossCubeQueries:{description:`Include dimensions from related cubes - the system auto-joins based on relationships`,example:`To get employee names with productivity: measures=["Productivity.total"], dimensions=["Employees.name"]`,howToFind:`Check the "joins" property in each cube metadata to see relationships`},topNPattern:{description:`For "top N" queries, use filters (not timeDimensions) + order + limit`,example:{measures:[`Cube.total`],dimensions:[`RelatedCube.name`],filters:[{member:`Cube.date`,operator:`inDateRange`,values:[`last 3 months`]}],order:{"Cube.total":`desc`},limit:5}},filterSyntax:{description:`Filters must be flat arrays of { member, operator, values }`,operators:[`equals`,`notEquals`,`contains`,`notContains`,`gt`,`gte`,`lt`,`lte`,`inDateRange`,`beforeDate`,`afterDate`,`set`,`notSet`],dateRangeValues:{relative:[`last 7 days`,`last 3 months`,`last year`,`this week`,`this month`,`this quarter`],absolute:[`2024-01-01`,`2024-03-31`]}}}}}function Ro(e,t=500){return{error:e instanceof Error?e.message:e,status:t}}async function zo(e,t,n,r){return{results:(await Promise.allSettled(e.map(async e=>Po(e,await n.executeMultiCubeQuery(e,t,{skipCache:r?.skipCache}),n)))).map((t,n)=>t.status===`fulfilled`?{success:!0,...t.value}:{success:!1,error:t.reason instanceof Error?t.reason.message:String(t.reason),query:e[n]})}}async function Bo(e,t,n){Y(e,n,`Funnel query`);let r=Oo(e),{sqlResult:i,analysis:a}=await X(e,t,n),o=e.funnel;return $({mode:`funnel`,queryType:`funnelQuery`,joinType:`funnel_cte`,complexity:`high`,query:e,cubesUsed:r,sqlResult:i,analysis:a,modeMetadata:{stepCount:o.steps.length,steps:o.steps.map((e,t)=>({index:t,name:e.name,timeToConvert:e.timeToConvert,cube:`cube`in e?e.cube:void 0})),bindingKey:o.bindingKey,timeDimension:o.timeDimension,includeTimeMetrics:o.includeTimeMetrics,globalTimeWindow:o.globalTimeWindow}})}async function Vo(e,t,n){Y(e,n,`Flow query`);let r=ko(e),{sqlResult:i,analysis:a}=await X(e,t,n),o=e.flow;return $({mode:`flow`,queryType:`flowQuery`,joinType:`flow_cte`,complexity:`high`,query:e,cubesUsed:r,sqlResult:i,analysis:a,modeMetadata:{stepsBefore:o.stepsBefore,stepsAfter:o.stepsAfter,bindingKey:o.bindingKey,timeDimension:o.timeDimension,eventDimension:o.eventDimension,startingStep:o.startingStep}})}async function Ho(e,t,n){Y(e,n,`Retention query`);let r=Ao(e),{sqlResult:i,analysis:a}=await X(e,t,n),o=e.retention;return $({mode:`retention`,queryType:`retentionQuery`,joinType:`retention_cte`,complexity:`high`,query:e,cubesUsed:r,sqlResult:i,analysis:a,modeMetadata:{timeDimension:o.timeDimension,bindingKey:o.bindingKey,granularity:o.granularity,periods:o.periods,retentionType:o.retentionType,breakdownDimensions:o.breakdownDimensions,segmentCount:o.breakdownDimensions?.length||1}})}async function Uo(e,t){return{cubes:ro(e.getMetadata(),{topic:t.topic,intent:t.intent,limit:t.limit,minScore:t.minScore})}}async function Wo(e,t){return po(e.getMetadata(),t.naturalLanguage,t.cube)}async function Go(e,t){let n=e.getMetadata();return yo(t.query,n)}async function Ko(e,t,n){let r=n.query,i=e.validateQuery(r);if(!i.isValid)throw Error(`Query validation failed: ${i.errors.join(`, `)}`);let a=await e.executeMultiCubeQuery(r,t);return{data:a.data,annotation:a.annotation,query:r}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Lo}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return So}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return Uo}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return jo}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return Go}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Ro}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return wo}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return Wo}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return bo}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Io}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return Ko}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Po}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Fo}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Co}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return zo}});
15
+ `.repeat(this.cfg.linesBetweenQueries+1))}formatStatement(e){let t=new za({cfg:this.cfg,dialectCfg:this.dialect.formatOptions,params:this.params,layout:new ka(new Ia(la(this.cfg)))}).format(e.children);return e.hasSemicolon&&(this.cfg.newlineBeforeSemicolon?t.add(H.NEWLINE,`;`):t.add(H.NO_NEWLINE,`;`)),t.toString()}},U=class extends Error{};function Va(e){for(let t of[`multilineLists`,`newlineBeforeOpenParen`,`newlineBeforeCloseParen`,`aliasAs`,`commaPosition`,`tabulateAlias`])if(t in e)throw new U(`${t} config is no more supported.`);if(e.expressionWidth<=0)throw new U(`expressionWidth config must be positive number. Received ${e.expressionWidth} instead.`);if(e.params&&!Ha(e.params)&&console.warn(`WARNING: All "params" option values should be strings.`),e.paramTypes&&!Ua(e.paramTypes))throw new U(`Empty regex given in custom paramTypes. That would result in matching infinite amount of parameters.`);return e}function Ha(e){return(e instanceof Array?e:Object.values(e)).every(e=>typeof e==`string`)}function Ua(e){return e.custom&&Array.isArray(e.custom)?e.custom.every(e=>e.regex!==``):!0}var Wa=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols==`function`)for(var i=0,r=Object.getOwnPropertySymbols(e);i<r.length;i++)t.indexOf(r[i])<0&&Object.prototype.propertyIsEnumerable.call(e,r[i])&&(n[r[i]]=e[r[i]]);return n},Ga={bigquery:`bigquery`,clickhouse:`clickhouse`,db2:`db2`,db2i:`db2i`,duckdb:`duckdb`,hive:`hive`,mariadb:`mariadb`,mysql:`mysql`,n1ql:`n1ql`,plsql:`plsql`,postgresql:`postgresql`,redshift:`redshift`,spark:`spark`,sqlite:`sqlite`,sql:`sql`,tidb:`tidb`,trino:`trino`,transactsql:`transactsql`,tsql:`transactsql`,singlestoredb:`singlestoredb`,snowflake:`snowflake`},Ka=Object.keys(Ga),qa={tabWidth:2,useTabs:!1,keywordCase:`preserve`,identifierCase:`preserve`,dataTypeCase:`preserve`,functionCase:`preserve`,indentStyle:`standard`,logicalOperatorNewline:`before`,expressionWidth:50,linesBetweenQueries:1,denseOperators:!1,newlineBeforeSemicolon:!1},Ja=(e,t={})=>{if(typeof t.language==`string`&&!Ka.includes(t.language))throw new U(`Unsupported SQL dialect: ${t.language}`);let n=Ga[t.language||`sql`];return Ya(e,Object.assign(Object.assign({},t),{dialect:Mi[n]}))},Ya=(e,t)=>{var{dialect:n}=t,r=Wa(t,[`dialect`]);if(typeof e!=`string`)throw Error(`Invalid query argument. Expected string, instead got `+typeof e);let i=Va(Object.assign(Object.assign({},qa),r));return new Ba(oa(n),i).format(e)},Xa={funnel:{description:`Track conversion through sequential steps. Entities (identified by bindingKey) move through ordered steps.`,structure:{funnel:{bindingKey:`Cube.dimension - identifies entities moving through funnel`,timeDimension:`Cube.dimension - time field for ordering events`,steps:[{name:`string - human readable step name`,filter:{member:`Cube.dimension`,operator:`equals | notEquals | contains | ...`,values:[`array of filter values`]},timeToConvert:`optional - max time window e.g. "7 days"`}],dateRange:`[start, end] array OR string like "last 7 days", "last 3 months", "this quarter"`}}},flow:{description:`Analyze paths users take before/after a specific event. Shows event sequences.`,structure:{flow:{bindingKey:`Cube.dimension - identifies entities`,timeDimension:`Cube.dimension - time field for ordering`,eventDimension:`Cube.dimension - the event type field`,startingStep:{filter:{member:`Cube.dimension`,operator:`equals`,values:[`event value`]}},stepsBefore:`number - how many steps to show before starting step`,stepsAfter:`number - how many steps to show after starting step`,dateRange:`[start, end] array OR string like "last 7 days", "last 3 months", "this quarter"`}}},retention:{description:`Measure how many users return over time periods after initial activity.`,structure:{retention:{bindingKey:`Cube.dimension - identifies entities`,timeDimension:`Cube.dimension - time field for cohort assignment`,granularity:`day | week | month - period size`,periods:`number - how many periods to analyze`,dateRange:`[start, end] array OR string like "last 7 days", "last 3 months", "this quarter"`}}}};function Za(e,t){if(e.length>500||t.length>500)return e.length+t.length;let n=[];for(let e=0;e<=t.length;e++)n[e]=[e];for(let t=0;t<=e.length;t++)n[0][t]=t;for(let r=1;r<=t.length;r++)for(let i=1;i<=e.length;i++)t.charAt(r-1)===e.charAt(i-1)?n[r][i]=n[r-1][i-1]:n[r][i]=Math.min(n[r-1][i-1]+1,n[r][i-1]+1,n[r-1][i]+1);return n[t.length][e.length]}function W(e,t){let n=e.toLowerCase().trim(),r=t.toLowerCase().trim();if(n===r)return 1;if(r.includes(n))return .9;let i=r.split(/[\s_-]+/);for(let e of i){if(e===n)return .85;if(e.startsWith(n))return .75}let a=1-Za(n,r)/Math.max(n.length,r.length);return a>.5?a*.7:0}function G(e,t){let n=0;for(let r of t){let t=W(e,r);t>n&&(n=t)}return n}function Qa(e){let t=new Set(`a.an.the.is.are.was.were.be.been.being.have.has.had.do.does.did.will.would.could.should.may.might.must.can.and.or.but.if.then.else.when.where.why.how.what.which.who.this.that.these.those.i.me.my.we.our.you.your.he.she.it.they.them.their.in.on.at.to.for.of.with.by.from.up.down.out.over.under.about.into.through.during.before.after.above.below.between.show.me.get.find.list.give.tell.display.want.need.see.know`.split(`.`));return e.toLowerCase().replace(/[^\w\s]/g,` `).split(/\s+/).filter(e=>e.length>2&&!t.has(e))}function $a(e,t){let n=0,r=[],i=new Map,a=new Map;for(let o of t){let t=W(o,e.name);t>.5&&(n+=t*2,r.includes(`name`)||r.push(`name`));let s=W(o,e.title);if(s>.5&&(n+=s*1.5,r.includes(`title`)||r.push(`title`)),e.description){let t=W(o,e.description);t>.3&&(n+=t,r.includes(`description`)||r.push(`description`))}if(e.exampleQuestions)for(let t of e.exampleQuestions){let e=W(o,t);e>.3&&(n+=e*1.5,r.includes(`exampleQuestions`)||r.push(`exampleQuestions`))}for(let t of e.measures){let e=0,a=t.name.split(`.`).pop()||t.name;if(e=Math.max(e,W(o,a)),e=Math.max(e,W(o,t.title)),t.description&&(e=Math.max(e,W(o,t.description)*.8)),t.synonyms&&(e=Math.max(e,G(o,t.synonyms))),e>.4){n+=e,r.includes(`measures`)||r.push(`measures`);let a=i.get(t.name)||0;i.set(t.name,Math.max(a,e))}}for(let t of e.dimensions){let e=0,i=t.name.split(`.`).pop()||t.name;if(e=Math.max(e,W(o,i)),e=Math.max(e,W(o,t.title)),t.description&&(e=Math.max(e,W(o,t.description)*.8)),t.synonyms&&(e=Math.max(e,G(o,t.synonyms))),e>.4){n+=e,r.includes(`dimensions`)||r.push(`dimensions`);let i=a.get(t.name)||0;a.set(t.name,Math.max(i,e))}}}return{score:Math.min(1,n/(t.length*2)),matchedOn:r,suggestedMeasures:Array.from(i.entries()).sort((e,t)=>t[1]-e[1]).slice(0,5).map(([e])=>e),suggestedDimensions:Array.from(a.entries()).sort((e,t)=>t[1]-e[1]).slice(0,5).map(([e])=>e)}}function eo(e){let t=!!e.meta?.eventStream,n=e.dimensions.some(e=>e.type===`time`),r=e.dimensions.some(t=>t.name.toLowerCase().includes(`id`)||t.type===`number`||e.meta?.eventStream?.bindingKey&&t.name===e.meta.eventStream.bindingKey),i=t||n&&r;return{query:!0,funnel:i,flow:i,retention:i}}function to(e){let t=eo(e);if(!t.funnel&&!t.flow&&!t.retention)return;let n=[];if(e.meta?.eventStream?.bindingKey){let t=e.dimensions.find(t=>t.name===e.meta?.eventStream?.bindingKey);n.push({dimension:e.meta.eventStream.bindingKey,description:t?.description||`Configured binding key`})}for(let t of e.dimensions)(t.name.split(`.`).pop()?.toLowerCase()||``).includes(`id`)&&!n.some(e=>e.dimension===t.name)&&n.push({dimension:t.name,description:t.description||`Potential entity identifier`});let r=[];if(e.meta?.eventStream?.timeDimension){let t=e.dimensions.find(t=>t.name===e.meta?.eventStream?.timeDimension);r.push({dimension:e.meta.eventStream.timeDimension,description:t?.description||`Configured time dimension`})}for(let t of e.dimensions)t.type===`time`&&!r.some(e=>e.dimension===t.name)&&r.push({dimension:t.name,description:t.description});let i=[];for(let t of e.dimensions){let e=t.name.split(`.`).pop()?.toLowerCase()||``;t.type===`string`&&(e.includes(`type`)||e.includes(`event`)||e.includes(`status`)||e.includes(`state`)||e.includes(`action`))&&i.push({dimension:t.name,description:t.description||`Potential event type dimension`})}return{candidateBindingKeys:n,candidateTimeDimensions:r,candidateEventDimensions:i}}function no(e,t){let n=[];if(!t)return n;if(t.candidateBindingKeys.length>1&&n.push(`Choose bindingKey based on what entity to track through the analysis`),t.candidateEventDimensions.length>0){let e=t.candidateEventDimensions[0].dimension;n.push(`Query ${e} dimension to discover available values for funnel steps`)}return n.push(`Use /mcp/load with a standard query to discover dimension values before building analysis queries`),n}function ro(e,t={}){let{topic:n,intent:r,limit:i=10,minScore:a=.1}=t,o=[n,r].filter(Boolean).join(` `);if(!o.trim())return e.slice(0,i).map(e=>{let t=eo(e),n=to(e),r=no(e,n),i=t.funnel||t.flow||t.retention;return{cube:e.name,title:e.title,description:e.description,relevanceScore:1,matchedOn:[],suggestedMeasures:e.measures.slice(0,5).map(e=>e.name),suggestedDimensions:e.dimensions.slice(0,5).map(e=>e.name),capabilities:t,analysisConfig:n,hints:r.length>0?r:void 0,querySchemas:i?Xa:void 0}});let s=Qa(o);if(s.length===0)return[];let c=[];for(let t of e){let{score:e,matchedOn:n,suggestedMeasures:r,suggestedDimensions:i}=$a(t,s);if(e>=a){let a=eo(t),o=to(t),s=no(t,o),l=a.funnel||a.flow||a.retention;c.push({cube:t.name,title:t.title,description:t.description,relevanceScore:e,matchedOn:n,suggestedMeasures:r,suggestedDimensions:i,capabilities:a,analysisConfig:o,hints:s.length>0?s:void 0,querySchemas:l?Xa:void 0})}}return c.sort((e,t)=>t.relevanceScore-e.relevanceScore).slice(0,i)}function io(e,t,n){let r=null;for(let i of e){if(!n||n===`measure`)for(let e of i.measures){let n=W(t,e.name.split(`.`).pop()||e.name);n=Math.max(n,W(t,e.title)),e.synonyms&&(n=Math.max(n,G(t,e.synonyms))),n>.5&&(!r||n>r.score)&&(r={field:e.name,cube:i.name,score:n,type:`measure`})}if(!n||n===`dimension`)for(let e of i.dimensions){let n=W(t,e.name.split(`.`).pop()||e.name);n=Math.max(n,W(t,e.title)),e.synonyms&&(n=Math.max(n,G(t,e.synonyms))),n>.5&&(!r||n>r.score)&&(r={field:e.name,cube:i.name,score:n,type:`dimension`})}}return r}function ao(){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 oo={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 so(e){let t=e.toLowerCase();return oo.funnel.test(t)?`funnel`:oo.flow.test(t)?`flow`:oo.retention.test(t)?`retention`:`query`}function co(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 lo(e){let t=ao(),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=parseInt(t[1],10),r=new Date,i=r.toISOString().split(`T`)[0],a=e=>e.toISOString().split(`T`)[0];if(/days?/.test(n)){let t=new Date(r);return t.setDate(t.getDate()-e),{dateRange:[a(t),i],granularity:`day`}}if(/weeks?/.test(n)){let t=new Date(r);return t.setDate(t.getDate()-e*7),{dateRange:[a(t),i],granularity:e<=4?`day`:`week`}}if(/months?/.test(n)){let t=new Date(r);return t.setMonth(t.getMonth()-e),{dateRange:[a(t),i],granularity:e<=3?`day`:`month`}}}if(/^q[1-4]$/i.test(t[0])){let e=parseInt(t[1],10),n=new Date().getFullYear(),r=(e-1)*3,i=new Date(n,r,1),a=new Date(n,r+3,0),o=e=>e.toISOString().split(`T`)[0];return{dateRange:[o(i),o(a)],granularity:`month`}}return{dateRange:e.getDateRange(),granularity:e.granularity}}}return null}function uo(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 fo(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 po(e,t,n){let r=[],i=[],a={},o=so(t),s;if(n){let t=e.find(e=>e.name===n);t?(s=[t],r.push(`Using specified cube: ${n}`)):(i.push(`Specified cube '${n}' not found`),s=[])}else s=ro(e,{intent:t,limit:3}).map(t=>e.find(e=>e.name===t.cube)).filter(e=>e!==void 0),s.length>0&&r.push(`Identified relevant cubes: ${s.map(e=>e.name).join(`, `)}`);if(s.length===0){let e=o!==`query`,t=e?co(o,void 0):void 0;return{query:{},confidence:e?.7:0,reasoning:e?[`Detected ${o} intent from natural language`]:[`Could not identify relevant cubes for this query`],warnings:i,analysisMode:o,nextSteps:t}}let c=s[0],l=.5,u=uo(t);u&&(r.push(`Detected ${u.type} aggregation intent`),l+=.1);let d=[],f=t.toLowerCase();for(let e of c.measures){let t=[(e.name.split(`.`).pop()||e.name).toLowerCase(),e.title.toLowerCase(),...(e.synonyms||[]).map(e=>e.toLowerCase())];for(let n of t)if(f.includes(n)){d.push(e.name),r.push(`Matched measure '${e.name}' via keyword '${n}'`),l+=.15;break}}if(d.length===0&&u){let e=c.measures.filter(e=>e.type===u.type);if(e.length>0)d.push(e[0].name),r.push(`Suggested ${e[0].name} based on ${u.type} intent`);else if(u.type===`count`){let e=c.measures.find(e=>e.type===`count`||e.type===`countDistinct`);e&&(d.push(e.name),r.push(`Suggested ${e.name} for counting`))}}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=fo(t),m=[];for(let e of p){let t=io(s,e,`dimension`);t&&(m.push(t.field),r.push(`Matched dimension '${t.field}' from grouping keyword '${e}'`),l+=.1)}for(let e of s)for(let t of e.dimensions){let e=[(t.name.split(`.`).pop()||t.name).toLowerCase(),t.title.toLowerCase(),...(t.synonyms||[]).map(e=>e.toLowerCase())];for(let n of e)if(f.includes(n)&&!m.includes(t.name)&&(f.includes(`by ${n}`)||f.includes(`per ${n}`))){m.push(t.name),r.push(`Matched dimension '${t.name}' as grouping`),l+=.1;break}}m.length>0&&(a.dimensions=m);let h=lo(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:co(o,e)}}return{query:a,confidence:l,reasoning:r,warnings:i.length>0?i:void 0,analysisMode:`query`}}function mo(e,t){if(e.length>500||t.length>500)return e.length+t.length;let n=[];for(let e=0;e<=t.length;e++)n[e]=[e];for(let t=0;t<=e.length;t++)n[0][t]=t;for(let r=1;r<=t.length;r++)for(let i=1;i<=e.length;i++)t.charAt(r-1)===e.charAt(i-1)?n[r][i]=n[r-1][i-1]:n[r][i]=Math.min(n[r-1][i-1]+1,n[r][i-1]+1,n[r-1][i]+1);return n[t.length][e.length]}function K(e,t){let n=null;for(let r of t){let t=mo(e.toLowerCase(),r.toLowerCase());t<=3&&(!n||t<n.distance)&&(n={field:r,distance:t})}return n}function ho(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:`Invalid measure format: '${e}'. Expected 'CubeName.measureName'`,field:e});return}let[a,o]=i,s=t.find(e=>e.name===a);if(!s){let i=t.map(e=>e.name),s=K(a,i);s?(n.push({type:`cube_not_found`,message:`Cube '${a}' not found`,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:`Cube '${a}' not found`,field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.measures.some(t=>t.name===e)){let i=io(t,o,`measure`);if(i&&i.cube===a)n.push({type:`measure_not_found`,message:`Measure '${o}' not found on cube '${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=K(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`measure_not_found`,message:`Measure '${o}' not found on cube '${a}'`,field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:t}),r.set(e,t)}else n.push({type:`measure_not_found`,message:`Measure '${o}' not found on cube '${a}'`,field:e,suggestion:`Available measures: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function q(e,t,n,r){let i=e.split(`.`);if(i.length!==2){n.push({type:`syntax_error`,message:`Invalid dimension format: '${e}'. Expected 'CubeName.dimensionName'`,field:e});return}let[a,o]=i,s=t.find(e=>e.name===a);if(!s){let i=t.map(e=>e.name),s=K(a,i);s?(n.push({type:`cube_not_found`,message:`Cube '${a}' not found`,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:`Cube '${a}' not found`,field:e,suggestion:`Available cubes: ${i.join(`, `)}`});return}if(!s.dimensions.some(t=>t.name===e)){let i=io(t,o,`dimension`);if(i&&i.cube===a)n.push({type:`dimension_not_found`,message:`Dimension '${o}' not found on cube '${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=K(o,t);if(i){let t=`${a}.${i.field}`;n.push({type:`dimension_not_found`,message:`Dimension '${o}' not found on cube '${a}'`,field:e,suggestion:`Did you mean '${i.field}'?`,correctedValue:t}),r.set(e,t)}else n.push({type:`dimension_not_found`,message:`Dimension '${o}' not found on cube '${a}'`,field:e,suggestion:`Available dimensions: ${t.slice(0,5).join(`, `)}${t.length>5?`...`:``}`})}}}function J(e,t,n,r){for(let i of e){if(`and`in i&&Array.isArray(i.and)){J(i.and,t,n,r);continue}if(`or`in i&&Array.isArray(i.or)){J(i.or,t,n,r);continue}if(`member`in i){let e=i.member,a=e.split(`.`);if(a.length!==2){n.push({type:`invalid_filter`,message:`Invalid filter member format: '${e}'`,field:e});continue}let[o,s]=a,c=t.find(e=>e.name===o);if(!c){let i=K(o,t.map(e=>e.name));i&&r.set(e,`${i.field}.${s}`),n.push({type:`cube_not_found`,message:`Cube '${o}' not found in filter`,field:e,suggestion:i?`Did you mean '${i.field}'?`:void 0,correctedValue:i?`${i.field}.${s}`:void 0});continue}let l=c.dimensions.some(t=>t.name===e),u=c.measures.some(t=>t.name===e);if(!l&&!u){let t=K(s,[...c.dimensions.map(e=>e.name.split(`.`).pop()),...c.measures.map(e=>e.name.split(`.`).pop())]);if(t){let i=`${o}.${t.field}`;r.set(e,i),n.push({type:`invalid_filter`,message:`Filter field '${s}' not found on cube '${o}'`,field:e,suggestion:`Did you mean '${t.field}'?`,correctedValue:i})}else n.push({type:`invalid_filter`,message:`Filter field '${s}' not found on cube '${o}'`,field:e})}}}}function go(e,t,n,r,i){let a=e.funnel;if(a)if(a.bindingKey?typeof a.bindingKey==`string`&&q(a.bindingKey,t,n,i):n.push({type:`syntax_error`,message:`funnel.bindingKey is required`}),a.timeDimension?typeof a.timeDimension==`string`&&q(a.timeDimension,t,n,i):n.push({type:`syntax_error`,message:`funnel.timeDimension is required`}),!a.steps||!Array.isArray(a.steps))n.push({type:`syntax_error`,message:`funnel.steps array is required`});else if(a.steps.length<2)n.push({type:`syntax_error`,message:`funnel requires at least 2 steps`});else for(let e=0;e<a.steps.length;e++){let o=a.steps[e];o.name||r.push({type:`best_practice`,message:`Step ${e+1} is missing a name`,suggestion:`Add descriptive names to funnel steps`}),o.filter&&`member`in o.filter&&J([o.filter],t,n,i)}}function _o(e,t,n,r,i){let a=e.flow;a&&(a.bindingKey?typeof a.bindingKey==`string`&&q(a.bindingKey,t,n,i):n.push({type:`syntax_error`,message:`flow.bindingKey is required`}),a.timeDimension?typeof a.timeDimension==`string`&&q(a.timeDimension,t,n,i):n.push({type:`syntax_error`,message:`flow.timeDimension is required`}),a.eventDimension?typeof a.eventDimension==`string`&&q(a.eventDimension,t,n,i):n.push({type:`syntax_error`,message:`flow.eventDimension is required`}),a.stepsBefore===void 0&&a.stepsAfter===void 0&&r.push({type:`best_practice`,message:`Neither stepsBefore nor stepsAfter specified`,suggestion:`Set stepsBefore and/or stepsAfter to see event sequences`}))}function vo(e,t,n,r,i){let a=e.retention;a&&(a.bindingKey?typeof a.bindingKey==`string`&&q(a.bindingKey,t,n,i):n.push({type:`syntax_error`,message:`retention.bindingKey is required`}),a.timeDimension?typeof a.timeDimension==`string`&&q(a.timeDimension,t,n,i):n.push({type:`syntax_error`,message:`retention.timeDimension is required`}),a.granularity||r.push({type:`best_practice`,message:`retention.granularity not specified`,suggestion:`Specify granularity: "day", "week", or "month"`}),a.periods||r.push({type:`best_practice`,message:`retention.periods not specified`,suggestion:`Specify number of periods to analyze`}))}function yo(e,t){let n=[],r=[],i=new Map;if(e.funnel)return go(e,t,n,r,i),{isValid:n.length===0,errors:n,warnings:r,correctedQuery:void 0};if(e.flow)return _o(e,t,n,r,i),{isValid:n.length===0,errors:n,warnings:r,correctedQuery:void 0};if(e.retention)return vo(e,t,n,r,i),{isValid:n.length===0,errors:n,warnings:r,correctedQuery:void 0};if(e.measures)for(let r of e.measures)ho(r,t,n,i);if(e.dimensions)for(let r of e.dimensions)q(r,t,n,i);if(e.timeDimensions)for(let a of e.timeDimensions){q(a.dimension,t,n,i);let[e]=a.dimension.split(`.`),o=t.find(t=>t.name===e);if(o){let e=o.dimensions.find(e=>e.name===a.dimension);e&&e.type!==`time`&&r.push({type:`best_practice`,message:`Dimension '${a.dimension}' is not a time type (it's '${e.type}')`,field:a.dimension,suggestion:`Use a dimension with type "time" for timeDimensions`})}}e.filters&&J(e.filters,t,n,i),!e.measures?.length&&!e.dimensions?.length&&n.push({type:`syntax_error`,message:`Query must have at least one measure or dimension`}),e.measures&&e.measures.length>10&&r.push({type:`performance`,message:`Query has ${e.measures.length} measures, which may impact performance`,suggestion:`Consider splitting into multiple queries`}),e.dimensions&&e.dimensions.length>5&&r.push({type:`performance`,message:`Query has ${e.dimensions.length} dimensions, which may produce many rows`,suggestion:`Consider adding filters or reducing dimensions`});let a;if(i.size>0){let t=JSON.parse(JSON.stringify(e));t.measures&&=t.measures.map(e=>i.get(e)||e),t.dimensions&&=t.dimensions.map(e=>i.get(e)||e),t.timeDimensions&&=t.timeDimensions.map(e=>({...e,dimension:i.get(e.dimension)||e.dimension})),a=t}return{isValid:n.length===0,errors:n,warnings:r,correctedQuery:i.size>0?a:void 0}}function bo(e){let t=0;return t+=(e.measures?.length||0)*1,t+=(e.dimensions?.length||0)*1,t+=(e.filters?.length||0)*2,t+=(e.timeDimensions?.length||0)*3,t<=5?`low`:t<=15?`medium`:`high`}function xo(e,t){if(`and`in e||`or`in e){let n=e.and||e.or||[];for(let e of n)xo(e,t);return}if(`member`in e){let[n]=e.member.split(`.`);n&&t.add(n)}}function So(){return crypto.randomUUID()}function Co(e){let t=e.dimensions||[],n=e.timeDimensions||[],r=e.measures||[];return{sortedDimensions:t,sortedTimeDimensions:n,timeDimensions:n,measures:r,leafMeasureAdditive:!0,leafMeasures:r,measureToLeafMeasures:{},hasNoTimeDimensionsWithoutGranularity:!0,allFiltersWithinSelectedDimensions:!0,isAdditive:!0,granularityHierarchies:{},hasMultipliedMeasures:!1,hasCumulativeMeasures:!1,windowGranularity:null,filterDimensionsSingleValueEqual:{},ownedDimensions:t,ownedTimeDimensionsWithRollupGranularity:[],ownedTimeDimensionsAsIs:[],allBackAliasMembers:{},hasMultiStage:!1,ungrouped:e.ungrouped||!1}}function wo(e){return e.getEngineType()??`postgres`}function To(e){let t=[];if(e.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>=2)&&t.push(`comparison`),e.funnel&&e.funnel.steps?.length>=2&&t.push(`funnel`),e.flow&&e.flow.bindingKey&&e.flow.eventDimension&&t.push(`flow`),e.retention&&e.retention.bindingKey&&e.retention.timeDimension&&t.push(`retention`),t.length===0)return`regular`;if(t.length>1)throw Error(`Query contains multiple query modes: ${t.join(`, `)}`);return t[0]}function Eo(e,t,n){try{return n.analyzeQuery(e,t)}catch(e){console.warn(`Query analysis failed:`,String(e).replace(/\n|\r/g,``));return}}function Y(e,t,n){let r=t.validateQuery(e);if(!r.isValid)throw Error(`${n} validation failed: ${r.errors.join(`, `)}`)}async function X(e,t,n){return{sqlResult:await n.dryRun(e,t),analysis:Eo(e,t,n)}}function Z(e,t){let[n]=e.split(`.`);n&&t.add(n)}function Q(e,t){if(e)for(let n of e)n.cube&&t.add(n.cube)}function Do(e){let t=new Set;return e.measures?.forEach(e=>Z(e,t)),e.dimensions?.forEach(e=>Z(e,t)),e.timeDimensions?.forEach(e=>Z(e.dimension,t)),e.filters?.forEach(e=>{xo(e,t)}),Array.from(t)}function Oo(e){let t=new Set,n=e.funnel;typeof n.bindingKey==`string`?Z(n.bindingKey,t):Q(n.bindingKey,t),typeof n.timeDimension==`string`?Z(n.timeDimension,t):Q(n.timeDimension,t);for(let e of n.steps)`cube`in e&&e.cube&&t.add(e.cube);return Array.from(t)}function ko(e){let t=new Set,n=e.flow;return typeof n.bindingKey==`string`?Z(n.bindingKey,t):Q(n.bindingKey,t),typeof n.timeDimension==`string`?Z(n.timeDimension,t):Q(n.timeDimension,t),Z(n.eventDimension,t),Array.from(t)}function Ao(e){let t=new Set,n=e.retention;typeof n.timeDimension==`string`?Z(n.timeDimension,t):n.timeDimension?.cube&&t.add(n.timeDimension.cube),typeof n.bindingKey==`string`?Z(n.bindingKey,t):Q(n.bindingKey,t);for(let e of n.breakdownDimensions||[])Z(e,t);return Array.from(t)}function $(e){let t=e.normalizedQueries||[],n=e.transformedQueries||t;return{mode:e.mode,queryType:e.queryType,normalizedQueries:t,queryOrder:e.cubesUsed,transformedQueries:n,pivotQuery:{query:e.query,cubes:e.cubesUsed},sql:{sql:[e.sqlResult.sql],params:e.sqlResult.params||[]},complexity:e.complexity,valid:!0,cubesUsed:e.cubesUsed,joinType:e.joinType,query:e.query,analysis:e.analysis,planningTrace:e.analysis?.planningTrace,modeMetadata:e.modeMetadata}}async function jo(e,t,n){return{regular:()=>Mo(e,t,n),comparison:()=>No(e,t,n),funnel:()=>Bo(e,t,n),flow:()=>Vo(e,t,n),retention:()=>Ho(e,t,n)}[To(e)]()}async function Mo(e,t,n){Y(e,n,`Query`);let r=Do(e),i=r.length>1,{sqlResult:a,analysis:o}=await X(e,t,n),s=r.map(t=>({cube:t,query:{measures:e.measures?.filter(e=>e.startsWith(t+`.`))||[],dimensions:e.dimensions?.filter(e=>e.startsWith(t+`.`))||[],filters:e.filters||[],timeDimensions:e.timeDimensions||[],order:e.order||{},limit:e.limit,offset:e.offset}}));return $({mode:`regular`,queryType:`regularQuery`,joinType:i?`multi_cube_join`:`single_cube`,complexity:bo(e),query:e,cubesUsed:r,sqlResult:a,analysis:o,normalizedQueries:s})}async function No(e,t,n){Y(e,n,`Comparison query`);let r=Do(e),i=r.length>1,{sqlResult:a,analysis:o}=await X(e,t,n),s=e.timeDimensions?.find(e=>e.compareDateRange&&e.compareDateRange.length>=2),c=s?{timeDimension:s.dimension,granularity:s.granularity||`day`,periodCount:s.compareDateRange?.length??0,compareDateRange:s.compareDateRange,sqlPreviewPeriodIndex:0,note:`Dry-run SQL preview shows the first comparison period; execution runs all periods and merges results.`}:void 0;return $({mode:`comparison`,queryType:`comparisonQuery`,joinType:i?`multi_cube_join`:`single_cube`,complexity:bo(e),query:e,cubesUsed:r,sqlResult:a,analysis:o,modeMetadata:c})}function Po(e,t,n){let r=wo(n),i=So();return{queryType:`regularQuery`,results:[{query:e,lastRefreshTime:new Date().toISOString(),usedPreAggregations:{},transformedQuery:Co(e),requestId:i,annotation:t.annotation,dataSource:`default`,dbType:r,extDbType:r,external:!1,slowQuery:!1,data:t.data,...t.cache&&{cache:t.cache},...t.warnings?.length&&{warnings:t.warnings}}],pivotQuery:{...e,queryType:`regularQuery`},slowQuery:!1}}function Fo(e,t){try{return Ja(e,{language:{postgres:`postgresql`,mysql:`mysql`,sqlite:`sqlite`,singlestore:`mysql`,duckdb:`postgresql`,databend:`postgresql`,snowflake:`postgresql`}[t],tabWidth:2,keywordCase:`upper`,indentStyle:`standard`})}catch(t){return console.warn(`SQL formatting failed:`,t),e}}function Io(e,t){return{sql:t.sql,params:t.params||[],query:e}}function Lo(e){return{cubes:e,queryGuidance:{dateHandling:{critical:`Date filtering and time grouping are DIFFERENT operations`,forAggregatedTotals:{description:`For totals over a date range (no time breakdown), use filters with inDateRange operator - NOT timeDimensions`,example:{filters:[{member:`Cube.date`,operator:`inDateRange`,values:[`last 3 months`]}]},useCase:`User asks for "total sales last month", "top 5 last quarter", "sum over past year"`},forTimeSeries:{description:`For time series grouped by period (trend analysis), use timeDimensions WITH granularity`,example:{timeDimensions:[{dimension:`Cube.date`,granularity:`month`,dateRange:`last 3 months`}]},useCase:`User asks for "monthly breakdown", "daily trend", "per week"`},warning:`Using timeDimensions WITHOUT granularity groups by day, returning many rows instead of aggregates. This is the #1 query mistake.`},crossCubeQueries:{description:`Include dimensions from related cubes - the system auto-joins based on relationships`,example:`To get employee names with productivity: measures=["Productivity.total"], dimensions=["Employees.name"]`,howToFind:`Check the "joins" property in each cube metadata to see relationships`},topNPattern:{description:`For "top N" queries, use filters (not timeDimensions) + order + limit`,example:{measures:[`Cube.total`],dimensions:[`RelatedCube.name`],filters:[{member:`Cube.date`,operator:`inDateRange`,values:[`last 3 months`]}],order:{"Cube.total":`desc`},limit:5}},filterSyntax:{description:`Filters must be flat arrays of { member, operator, values }`,operators:[`equals`,`notEquals`,`contains`,`notContains`,`gt`,`gte`,`lt`,`lte`,`inDateRange`,`beforeDate`,`afterDate`,`set`,`notSet`],dateRangeValues:{relative:[`last 7 days`,`last 3 months`,`last year`,`this week`,`this month`,`this quarter`],absolute:[`2024-01-01`,`2024-03-31`]}}}}}function Ro(e,t=500){return{error:e instanceof Error?e.message:e,status:t}}async function zo(e,t,n,r){return{results:(await Promise.allSettled(e.map(async e=>Po(e,await n.executeMultiCubeQuery(e,t,{skipCache:r?.skipCache}),n)))).map((t,n)=>t.status===`fulfilled`?{success:!0,...t.value}:{success:!1,error:t.reason instanceof Error?t.reason.message:String(t.reason),query:e[n]})}}async function Bo(e,t,n){Y(e,n,`Funnel query`);let r=Oo(e),{sqlResult:i,analysis:a}=await X(e,t,n),o=e.funnel;return $({mode:`funnel`,queryType:`funnelQuery`,joinType:`funnel_cte`,complexity:`high`,query:e,cubesUsed:r,sqlResult:i,analysis:a,modeMetadata:{stepCount:o.steps.length,steps:o.steps.map((e,t)=>({index:t,name:e.name,timeToConvert:e.timeToConvert,cube:`cube`in e?e.cube:void 0})),bindingKey:o.bindingKey,timeDimension:o.timeDimension,includeTimeMetrics:o.includeTimeMetrics,globalTimeWindow:o.globalTimeWindow}})}async function Vo(e,t,n){Y(e,n,`Flow query`);let r=ko(e),{sqlResult:i,analysis:a}=await X(e,t,n),o=e.flow;return $({mode:`flow`,queryType:`flowQuery`,joinType:`flow_cte`,complexity:`high`,query:e,cubesUsed:r,sqlResult:i,analysis:a,modeMetadata:{stepsBefore:o.stepsBefore,stepsAfter:o.stepsAfter,bindingKey:o.bindingKey,timeDimension:o.timeDimension,eventDimension:o.eventDimension,startingStep:o.startingStep}})}async function Ho(e,t,n){Y(e,n,`Retention query`);let r=Ao(e),{sqlResult:i,analysis:a}=await X(e,t,n),o=e.retention;return $({mode:`retention`,queryType:`retentionQuery`,joinType:`retention_cte`,complexity:`high`,query:e,cubesUsed:r,sqlResult:i,analysis:a,modeMetadata:{timeDimension:o.timeDimension,bindingKey:o.bindingKey,granularity:o.granularity,periods:o.periods,retentionType:o.retentionType,breakdownDimensions:o.breakdownDimensions,segmentCount:o.breakdownDimensions?.length||1}})}async function Uo(e,t){return{cubes:ro(e.getMetadata(),{topic:t.topic,intent:t.intent,limit:t.limit,minScore:t.minScore})}}async function Wo(e,t){return po(e.getMetadata(),t.naturalLanguage,t.cube)}async function Go(e,t){let n=e.getMetadata();return yo(t.query,n)}async function Ko(e,t,n){let r=n.query,i=e.validateQuery(r);if(!i.isValid)throw Error(`Query validation failed: ${i.errors.join(`, `)}`);let a=await e.executeMultiCubeQuery(r,t);return{data:a.data,annotation:a.annotation,query:r}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Lo}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return So}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return Uo}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return jo}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return Go}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Ro}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return wo}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return Wo}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return bo}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Io}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return Ko}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Po}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Fo}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Co}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return zo}});
@@ -5006,7 +5006,8 @@ function wo(e) {
5006
5006
  ownedTimeDimensionsWithRollupGranularity: [],
5007
5007
  ownedTimeDimensionsAsIs: [],
5008
5008
  allBackAliasMembers: {},
5009
- hasMultiStage: !1
5009
+ hasMultiStage: !1,
5010
+ ungrouped: e.ungrouped || !1
5010
5011
  };
5011
5012
  }
5012
5013
  function To(e) {
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./utils-CDExg9uP.cjs`);exports.buildTransformedQuery=e.t,exports.calculateQueryComplexity=e.n,exports.formatCubeResponse=e.r,exports.formatErrorResponse=e.i,exports.formatMetaResponse=e.a,exports.formatSqlResponse=e.o,exports.formatSqlString=e.s,exports.generateRequestId=e.c,exports.getDatabaseType=e.l,exports.handleBatchRequest=e.u,exports.handleDiscover=e.d,exports.handleDryRun=e.f,exports.handleLoad=e.p,exports.handleSuggest=e.m,exports.handleValidate=e.h;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./utils-2MwxiQ2o.cjs`);exports.buildTransformedQuery=e.t,exports.calculateQueryComplexity=e.n,exports.formatCubeResponse=e.r,exports.formatErrorResponse=e.i,exports.formatMetaResponse=e.a,exports.formatSqlResponse=e.o,exports.formatSqlString=e.s,exports.generateRequestId=e.c,exports.getDatabaseType=e.l,exports.handleBatchRequest=e.u,exports.handleDiscover=e.d,exports.handleDryRun=e.f,exports.handleLoad=e.p,exports.handleSuggest=e.m,exports.handleValidate=e.h;
@@ -79,6 +79,7 @@ export declare function formatCubeResponse(query: SemanticQuery, result: {
79
79
  offset?: number;
80
80
  order?: Record<string, "asc" | "desc">;
81
81
  fillMissingDatesValue?: number | null;
82
+ ungrouped?: boolean;
82
83
  funnel?: import('../server').FunnelQueryConfig;
83
84
  flow?: import('../server/types/flow').FlowQueryConfig;
84
85
  retention?: import('../server').RetentionQueryConfig;
@@ -231,6 +232,7 @@ export declare function handleBatchRequest(queries: SemanticQuery[], securityCon
231
232
  offset?: number;
232
233
  order?: Record<string, "asc" | "desc">;
233
234
  fillMissingDatesValue?: number | null;
235
+ ungrouped?: boolean;
234
236
  funnel?: import('../server').FunnelQueryConfig;
235
237
  flow?: import('../server/types/flow').FlowQueryConfig;
236
238
  retention?: import('../server').RetentionQueryConfig;
@@ -1,2 +1,2 @@
1
- import { a as e, c as t, d as n, f as r, h as i, i as a, l as o, m as s, n as c, o as l, p as u, r as d, s as f, t as p, u as m } from "./utils-DkKcpkx5.js";
1
+ import { a as e, c as t, d as n, f as r, h as i, i as a, l as o, m as s, n as c, o as l, p as u, r as d, s as f, t as p, u as m } from "./utils-_2o905Fi.js";
2
2
  export { p as buildTransformedQuery, c as calculateQueryComplexity, d as formatCubeResponse, a as formatErrorResponse, e as formatMetaResponse, l as formatSqlResponse, f as formatSqlString, t as generateRequestId, o as getDatabaseType, m as handleBatchRequest, n as handleDiscover, r as handleDryRun, u as handleLoad, s as handleSuggest, i as handleValidate };
@@ -1,10 +1,10 @@
1
- import { t as e } from "./chunks/chart-data-table-BlkFWPhF.js";
1
+ import { t as e } from "./chunks/chart-data-table-CW_qZDpt.js";
2
2
  import { t } from "./chunks/chart-funnel-C9JRW79j.js";
3
3
  import { a as n, i as r, n as i, o as a } from "./chunks/chart-activity-grid-wR2Twpo7.js";
4
4
  import { t as o } from "./chunks/chart-area-e9ysnatQ.js";
5
- import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./chunks/charts-loader-BFhQWB_d.js";
5
+ import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./chunks/charts-loader-gZjOqZwG.js";
6
6
  import { a as m, c as h, i as g, n as _, o as v, r as y, s as b, t as x } from "./chunks/lazyChartConfigRegistry-BjhxDaSf.js";
7
- import { i as S } from "./chunks/utils-nCeVL-Hm.js";
7
+ import { i as S } from "./chunks/utils-3FNmeZJR.js";
8
8
  import { t as C } from "./chunks/chart-line-CPhQRMZ7.js";
9
9
  import { t as w } from "./chunks/chart-bar-Bx4oKlqo.js";
10
10
  import { t as T } from "./chunks/chart-pie-DafSc9sE.js";
@@ -1,14 +1,14 @@
1
- import { a as e, n as t, o as n, r, s as i, u as a } from "./vendor-WzXX36hd.js";
2
- import { C as o, S as s, T as c, V as l, d as u, w as d } from "./chart-data-table-BlkFWPhF.js";
3
- import { C as f, D as p, E as m, O as h, S as g, T as _, a as v, b as y, c as b, l as x, n as S, r as C, s as w, t as T, w as E, y as D } from "./useDebounce-xfPFr2fi.js";
1
+ import { a as e, n as t, o as n, r, s as i, u as a } from "./vendor-BPRWulB7.js";
2
+ import { C as o, S as s, T as c, V as l, d as u, w as d } from "./chart-data-table-CW_qZDpt.js";
3
+ import { C as f, D as p, E as m, O as h, S as g, T as _, a as v, b as y, c as b, l as x, n as S, r as C, s as w, t as T, w as E, y as D } from "./useDebounce-C_wstEud.js";
4
4
  import { r as ee } from "./chart-sankey-8nRYnupt.js";
5
5
  import { n as O, t as te } from "./providers-DX3Vw5kc.js";
6
6
  import { A as k } from "./chart-activity-grid-wR2Twpo7.js";
7
7
  import { u as ne } from "./chart-area-e9ysnatQ.js";
8
- import { a as re, t as A } from "./charts-loader-BFhQWB_d.js";
8
+ import { a as re, t as A } from "./charts-loader-gZjOqZwG.js";
9
9
  import { c as ie } from "./lazyChartConfigRegistry-BjhxDaSf.js";
10
10
  import { l as j } from "./retention-UEXlSdZ-.js";
11
- import { S as M, _ as ae, a as oe, b as N, c as se, g as P, h as F, i as I, l as L, m as R, n as z, o as B, p as V, r as ce, s as H, t as le, v as ue, y as de } from "./FieldSearchModal-rB26lhBD.js";
11
+ import { S as M, _ as ae, a as oe, b as N, c as se, g as P, h as F, i as I, l as L, m as R, n as z, o as B, p as V, r as ce, s as H, t as le, v as ue, y as de } from "./FieldSearchModal-BxQ5JhWz.js";
12
12
  import { t as U } from "./chart-markdown-B2X4IwLO.js";
13
13
  import { n as fe, t as W } from "./useDirtyStateTracking-CgKZWkel.js";
14
14
  import G, { Component as pe, Suspense as me, createContext as he, forwardRef as ge, lazy as _e, startTransition as ve, useCallback as K, useContext as ye, useEffect as q, useImperativeHandle as be, useMemo as J, useRef as Y, useState as X } from "react";
@@ -2433,7 +2433,7 @@ function qt({ position: e, currentPalette: t, onPaletteChange: n }) {
2433
2433
  }
2434
2434
  //#endregion
2435
2435
  //#region src/client/components/AnalysisBuilderLazy.tsx
2436
- var Jt = _e(() => import("./analysis-builder-CdDPUAEU.js")), Yt = ge((e, t) => /* @__PURE__ */ Q(me, {
2436
+ var Jt = _e(() => import("./analysis-builder-BFb3zjl5.js")), Yt = ge((e, t) => /* @__PURE__ */ Q(me, {
2437
2437
  fallback: /* @__PURE__ */ Q("div", {
2438
2438
  className: "dc:flex dc:items-center dc:justify-center dc:w-full dc:py-6",
2439
2439
  children: /* @__PURE__ */ Q(ne, {})
@@ -6675,4 +6675,4 @@ function Er({ isOpen: e, onClose: t, onSave: n, title: r, submitText: i, initial
6675
6675
  //#endregion
6676
6676
  export { tt as A, yt as C, it as D, at as E, Pe as M, Te as N, nt as O, vt as S, ot as T, Et as _, ir as a, kt as b, gt as c, Ct as d, Ot as f, St as g, Dt as h, Cr as i, ze as j, rt as k, ft as l, bt as m, Tr as n, Xt as o, Tt as p, wr as r, Yt as s, Er as t, At as u, xt as v, ct as w, _t as x, wt as y };
6677
6677
 
6678
- //# sourceMappingURL=DashboardEditModal-kWEk4KJC.js.map
6678
+ //# sourceMappingURL=DashboardEditModal-B083DSGL.js.map