drizzle-cube 0.4.47 → 0.4.48
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.
- package/dist/adapters/{compiler-O3T1u7jl.js → compiler-B_Nl7ZZb.js} +1 -1
- package/dist/adapters/{compiler-CA6iopu7.cjs → compiler-CdL3ksb3.cjs} +1 -1
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +4 -4
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +39 -39
- package/dist/adapters/{handler-BO2nq6IS.cjs → handler-DumFgnNM.cjs} +10 -10
- package/dist/adapters/{handler-CjVc3ytc.js → handler-RItnSaEl.js} +128 -350
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +4 -4
- package/dist/adapters/mcp-prompts-BUFyQLHQ.js +377 -0
- package/dist/adapters/mcp-prompts-B_NvEJT_.cjs +111 -0
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +2 -2
- package/dist/adapters/mcp-transport-CG5Aw2cs.js +515 -0
- package/dist/adapters/mcp-transport-DlFvZl2c.cjs +35 -0
- package/dist/adapters/mcp-transport.d.ts +310 -5
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +4 -4
- package/dist/adapters/utils-CyBt-as9.cjs +15 -0
- package/dist/adapters/{utils-C7Nrw9Wb.js → utils-IH1ePsBd.js} +707 -655
- package/dist/adapters/utils.cjs +1 -1
- package/dist/adapters/utils.d.ts +11 -0
- package/dist/adapters/utils.js +2 -2
- package/dist/mcp-app/mcp-app.html +78 -44
- package/dist/server/index.cjs +144 -38
- package/dist/server/index.d.ts +24 -19
- package/dist/server/index.js +538 -674
- package/package.json +1 -1
- package/dist/adapters/mcp-prompts-BAutSQYA.js +0 -344
- package/dist/adapters/mcp-prompts-DsAkafVn.cjs +0 -5
- package/dist/adapters/mcp-transport-Cim_5cBN.js +0 -424
- package/dist/adapters/mcp-transport-DPpBCNea.cjs +0 -70
- package/dist/adapters/utils-tNZ6Cvzw.cjs +0 -15
|
@@ -3,7 +3,7 @@ import { MCPPrompt } from '../server/ai/mcp-prompts';
|
|
|
3
3
|
export { type MCPPrompt };
|
|
4
4
|
export declare const MCP_APP_RESOURCE_URI = "ui://drizzle-cube/visualization.html";
|
|
5
5
|
export declare const MCP_APP_MIME_TYPE = "text/html;profile=mcp-app";
|
|
6
|
-
/** Get the bundled MCP App HTML. */
|
|
6
|
+
/** Get the bundled MCP App HTML. Returns empty string if not yet built. */
|
|
7
7
|
export declare function getMcpAppHtml(): string;
|
|
8
8
|
export type JsonRpcId = string | number | null | undefined;
|
|
9
9
|
export interface JsonRpcRequest {
|
|
@@ -140,6 +140,7 @@ export declare function buildToolList(options?: {
|
|
|
140
140
|
query: {
|
|
141
141
|
type: string;
|
|
142
142
|
description: string;
|
|
143
|
+
properties?: undefined;
|
|
143
144
|
};
|
|
144
145
|
topic?: undefined;
|
|
145
146
|
intent?: undefined;
|
|
@@ -158,6 +159,245 @@ export declare function buildToolList(options?: {
|
|
|
158
159
|
query: {
|
|
159
160
|
type: string;
|
|
160
161
|
description: string;
|
|
162
|
+
properties: {
|
|
163
|
+
readonly measures: {
|
|
164
|
+
readonly type: "array";
|
|
165
|
+
readonly items: {
|
|
166
|
+
readonly type: "string";
|
|
167
|
+
readonly pattern: "^[A-Z][a-zA-Z0-9]*\\.[a-zA-Z][a-zA-Z0-9]*$";
|
|
168
|
+
};
|
|
169
|
+
readonly description: "Aggregation measures — EXACTLY \"CubeName.measureName\" (two parts, one dot). Copy field names verbatim from discover results. WRONG: \"Sales.Sales.count\" (double-prefixed). RIGHT: \"Sales.count\".";
|
|
170
|
+
};
|
|
171
|
+
readonly dimensions: {
|
|
172
|
+
readonly type: "array";
|
|
173
|
+
readonly items: {
|
|
174
|
+
readonly type: "string";
|
|
175
|
+
readonly pattern: "^[A-Z][a-zA-Z0-9]*\\.[a-zA-Z][a-zA-Z0-9]*$";
|
|
176
|
+
};
|
|
177
|
+
readonly description: "Grouping dimensions — EXACTLY \"CubeName.dimensionName\" (two parts, one dot). Copy from discover results. Can include dimensions from RELATED cubes via joins. WRONG: \"Teams.Teams.name\". RIGHT: \"Teams.name\".";
|
|
178
|
+
};
|
|
179
|
+
readonly filters: {
|
|
180
|
+
readonly type: "array";
|
|
181
|
+
readonly items: {
|
|
182
|
+
readonly type: "object";
|
|
183
|
+
readonly properties: {
|
|
184
|
+
readonly member: {
|
|
185
|
+
readonly type: "string";
|
|
186
|
+
readonly description: "\"CubeName.fieldName\"";
|
|
187
|
+
};
|
|
188
|
+
readonly operator: {
|
|
189
|
+
readonly type: "string";
|
|
190
|
+
readonly enum: readonly ["equals", "notEquals", "contains", "notContains", "startsWith", "notStartsWith", "endsWith", "notEndsWith", "gt", "gte", "lt", "lte", "between", "notBetween", "in", "notIn", "like", "notLike", "ilike", "regex", "notRegex", "set", "notSet", "isEmpty", "isNotEmpty", "inDateRange", "beforeDate", "afterDate", "arrayContains", "arrayOverlaps", "arrayContained"];
|
|
191
|
+
};
|
|
192
|
+
readonly values: {
|
|
193
|
+
readonly type: "array";
|
|
194
|
+
readonly items: {};
|
|
195
|
+
readonly description: "Filter values. Omit for set/notSet/isEmpty/isNotEmpty.";
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
readonly required: readonly ["member", "operator"];
|
|
199
|
+
};
|
|
200
|
+
readonly description: "Filter conditions. Flat array — for AND/OR logic use { \"and\": [...] } or { \"or\": [...] } wrappers.";
|
|
201
|
+
};
|
|
202
|
+
readonly timeDimensions: {
|
|
203
|
+
readonly type: "array";
|
|
204
|
+
readonly items: {
|
|
205
|
+
readonly type: "object";
|
|
206
|
+
readonly properties: {
|
|
207
|
+
readonly dimension: {
|
|
208
|
+
readonly type: "string";
|
|
209
|
+
readonly description: "\"CubeName.timeDimension\"";
|
|
210
|
+
};
|
|
211
|
+
readonly granularity: {
|
|
212
|
+
readonly type: "string";
|
|
213
|
+
readonly enum: readonly ["second", "minute", "hour", "day", "week", "month", "quarter", "year"];
|
|
214
|
+
readonly description: "Time bucket size. REQUIRED for time series; omit only for date range filtering.";
|
|
215
|
+
};
|
|
216
|
+
readonly dateRange: {
|
|
217
|
+
readonly description: "Relative string (\"last 7 days\", \"this month\", \"last quarter\") or absolute tuple [\"YYYY-MM-DD\", \"YYYY-MM-DD\"]";
|
|
218
|
+
};
|
|
219
|
+
readonly fillMissingDates: {
|
|
220
|
+
readonly type: "boolean";
|
|
221
|
+
readonly description: "Fill gaps in time series with fillMissingDatesValue (default: true). Requires granularity + dateRange.";
|
|
222
|
+
};
|
|
223
|
+
readonly compareDateRange: {
|
|
224
|
+
readonly type: "array";
|
|
225
|
+
readonly items: {};
|
|
226
|
+
readonly description: "Period-over-period comparison. Array of date ranges: [\"last 30 days\", [\"2024-01-01\", \"2024-01-30\"]]";
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
readonly required: readonly ["dimension"];
|
|
230
|
+
};
|
|
231
|
+
readonly description: "Time dimensions with optional granularity for time series. Use filters with inDateRange for aggregated totals instead.";
|
|
232
|
+
};
|
|
233
|
+
readonly order: {
|
|
234
|
+
readonly type: "object";
|
|
235
|
+
readonly description: "Sort order. Keys MUST be a measure or dimension already in this query, in \"CubeName.fieldName\" format. Values: \"asc\" or \"desc\". Example: {\"Sales.revenue\": \"desc\"}";
|
|
236
|
+
};
|
|
237
|
+
readonly limit: {
|
|
238
|
+
readonly type: "number";
|
|
239
|
+
readonly description: "Maximum rows to return";
|
|
240
|
+
};
|
|
241
|
+
readonly offset: {
|
|
242
|
+
readonly type: "number";
|
|
243
|
+
readonly description: "Number of rows to skip (for pagination)";
|
|
244
|
+
};
|
|
245
|
+
readonly ungrouped: {
|
|
246
|
+
readonly type: "boolean";
|
|
247
|
+
readonly description: "When true, returns raw row-level data without GROUP BY. Requires at least one dimension. Incompatible with count/countDistinct measures and analysis modes.";
|
|
248
|
+
};
|
|
249
|
+
readonly funnel: {
|
|
250
|
+
readonly type: "object";
|
|
251
|
+
readonly properties: {
|
|
252
|
+
readonly bindingKey: {
|
|
253
|
+
readonly type: "string";
|
|
254
|
+
readonly description: "Entity identifier dimension (e.g., \"Events.userId\")";
|
|
255
|
+
};
|
|
256
|
+
readonly timeDimension: {
|
|
257
|
+
readonly type: "string";
|
|
258
|
+
readonly description: "Time ordering dimension (e.g., \"Events.timestamp\")";
|
|
259
|
+
};
|
|
260
|
+
readonly steps: {
|
|
261
|
+
readonly type: "array";
|
|
262
|
+
readonly items: {
|
|
263
|
+
readonly type: "object";
|
|
264
|
+
readonly properties: {
|
|
265
|
+
readonly name: {
|
|
266
|
+
readonly type: "string";
|
|
267
|
+
readonly description: "Human-readable step name";
|
|
268
|
+
};
|
|
269
|
+
readonly filter: {
|
|
270
|
+
readonly description: "Filter or array of filters for this step";
|
|
271
|
+
};
|
|
272
|
+
readonly timeToConvert: {
|
|
273
|
+
readonly type: "string";
|
|
274
|
+
readonly description: "ISO 8601 duration — max time from previous step (e.g., \"P7D\" for 7 days, \"PT1H\" for 1 hour)";
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
readonly required: readonly ["name"];
|
|
278
|
+
};
|
|
279
|
+
readonly description: "Ordered funnel steps (minimum 2). Put inDateRange time filter ONLY on step 0.";
|
|
280
|
+
};
|
|
281
|
+
readonly includeTimeMetrics: {
|
|
282
|
+
readonly type: "boolean";
|
|
283
|
+
readonly description: "Include avg/median/p90 time-to-convert per step";
|
|
284
|
+
};
|
|
285
|
+
readonly globalTimeWindow: {
|
|
286
|
+
readonly type: "string";
|
|
287
|
+
readonly description: "ISO 8601 duration — all steps must complete within this window from step 0";
|
|
288
|
+
};
|
|
289
|
+
};
|
|
290
|
+
readonly required: readonly ["bindingKey", "timeDimension", "steps"];
|
|
291
|
+
readonly description: "Funnel analysis. When provided, measures/dimensions are ignored.";
|
|
292
|
+
};
|
|
293
|
+
readonly flow: {
|
|
294
|
+
readonly type: "object";
|
|
295
|
+
readonly properties: {
|
|
296
|
+
readonly bindingKey: {
|
|
297
|
+
readonly type: "string";
|
|
298
|
+
readonly description: "Entity identifier dimension (e.g., \"Events.userId\")";
|
|
299
|
+
};
|
|
300
|
+
readonly timeDimension: {
|
|
301
|
+
readonly type: "string";
|
|
302
|
+
readonly description: "Time ordering dimension (e.g., \"Events.timestamp\")";
|
|
303
|
+
};
|
|
304
|
+
readonly eventDimension: {
|
|
305
|
+
readonly type: "string";
|
|
306
|
+
readonly description: "Dimension whose values become node labels (e.g., \"Events.eventType\")";
|
|
307
|
+
};
|
|
308
|
+
readonly startingStep: {
|
|
309
|
+
readonly type: "object";
|
|
310
|
+
readonly properties: {
|
|
311
|
+
readonly name: {
|
|
312
|
+
readonly type: "string";
|
|
313
|
+
readonly description: "Display name for the starting step";
|
|
314
|
+
};
|
|
315
|
+
readonly filter: {
|
|
316
|
+
readonly description: "Filter(s) identifying the starting event";
|
|
317
|
+
};
|
|
318
|
+
};
|
|
319
|
+
readonly required: readonly ["name"];
|
|
320
|
+
readonly description: "The anchor point — an object with { name, filter }, NOT a plain string.";
|
|
321
|
+
};
|
|
322
|
+
readonly stepsBefore: {
|
|
323
|
+
readonly type: "number";
|
|
324
|
+
readonly description: "Steps to explore before starting step (0-5)";
|
|
325
|
+
};
|
|
326
|
+
readonly stepsAfter: {
|
|
327
|
+
readonly type: "number";
|
|
328
|
+
readonly description: "Steps to explore after starting step (0-5)";
|
|
329
|
+
};
|
|
330
|
+
readonly entityLimit: {
|
|
331
|
+
readonly type: "number";
|
|
332
|
+
readonly description: "Max entities to process (performance tuning)";
|
|
333
|
+
};
|
|
334
|
+
readonly outputMode: {
|
|
335
|
+
readonly type: "string";
|
|
336
|
+
readonly enum: readonly ["sankey", "sunburst"];
|
|
337
|
+
readonly description: "Visualization mode (default: sankey)";
|
|
338
|
+
};
|
|
339
|
+
};
|
|
340
|
+
readonly required: readonly ["bindingKey", "timeDimension", "eventDimension", "startingStep"];
|
|
341
|
+
readonly description: "Flow (path) analysis. When provided, measures/dimensions are ignored.";
|
|
342
|
+
};
|
|
343
|
+
readonly retention: {
|
|
344
|
+
readonly type: "object";
|
|
345
|
+
readonly properties: {
|
|
346
|
+
readonly timeDimension: {
|
|
347
|
+
readonly type: "string";
|
|
348
|
+
readonly description: "Timestamp dimension (e.g., \"Events.timestamp\")";
|
|
349
|
+
};
|
|
350
|
+
readonly bindingKey: {
|
|
351
|
+
readonly type: "string";
|
|
352
|
+
readonly description: "Entity identifier (e.g., \"Events.userId\")";
|
|
353
|
+
};
|
|
354
|
+
readonly dateRange: {
|
|
355
|
+
readonly type: "object";
|
|
356
|
+
readonly properties: {
|
|
357
|
+
readonly start: {
|
|
358
|
+
readonly type: "string";
|
|
359
|
+
readonly description: "YYYY-MM-DD";
|
|
360
|
+
};
|
|
361
|
+
readonly end: {
|
|
362
|
+
readonly type: "string";
|
|
363
|
+
readonly description: "YYYY-MM-DD";
|
|
364
|
+
};
|
|
365
|
+
};
|
|
366
|
+
readonly required: readonly ["start", "end"];
|
|
367
|
+
readonly description: "Cohort date range — MUST be an object { start, end }, NOT an array or string.";
|
|
368
|
+
};
|
|
369
|
+
readonly granularity: {
|
|
370
|
+
readonly type: "string";
|
|
371
|
+
readonly enum: readonly ["day", "week", "month"];
|
|
372
|
+
readonly description: "Period size for retention buckets";
|
|
373
|
+
};
|
|
374
|
+
readonly periods: {
|
|
375
|
+
readonly type: "number";
|
|
376
|
+
readonly description: "Number of retention periods to calculate";
|
|
377
|
+
};
|
|
378
|
+
readonly retentionType: {
|
|
379
|
+
readonly type: "string";
|
|
380
|
+
readonly enum: readonly ["classic", "rolling"];
|
|
381
|
+
readonly description: "classic = returned in period N exactly; rolling = returned in period N or later";
|
|
382
|
+
};
|
|
383
|
+
readonly cohortFilters: {
|
|
384
|
+
readonly description: "Optional filters on cohort entry events";
|
|
385
|
+
};
|
|
386
|
+
readonly activityFilters: {
|
|
387
|
+
readonly description: "Optional filters on return activity events";
|
|
388
|
+
};
|
|
389
|
+
readonly breakdownDimensions: {
|
|
390
|
+
readonly type: "array";
|
|
391
|
+
readonly items: {
|
|
392
|
+
readonly type: "string";
|
|
393
|
+
};
|
|
394
|
+
readonly description: "Segment retention by these dimensions (e.g., [\"Events.country\"])";
|
|
395
|
+
};
|
|
396
|
+
};
|
|
397
|
+
readonly required: readonly ["timeDimension", "bindingKey", "dateRange", "granularity", "periods"];
|
|
398
|
+
readonly description: "Retention (cohort) analysis. When provided, measures/dimensions are ignored.";
|
|
399
|
+
};
|
|
400
|
+
};
|
|
161
401
|
};
|
|
162
402
|
chart: {
|
|
163
403
|
type: string;
|
|
@@ -168,6 +408,75 @@ export declare function buildToolList(options?: {
|
|
|
168
408
|
enum: string[];
|
|
169
409
|
description: string;
|
|
170
410
|
};
|
|
411
|
+
title: {
|
|
412
|
+
type: string;
|
|
413
|
+
description: string;
|
|
414
|
+
};
|
|
415
|
+
chartConfig: {
|
|
416
|
+
type: string;
|
|
417
|
+
description: string;
|
|
418
|
+
properties: {
|
|
419
|
+
xAxis: {
|
|
420
|
+
type: string;
|
|
421
|
+
items: {
|
|
422
|
+
type: string;
|
|
423
|
+
};
|
|
424
|
+
description: string;
|
|
425
|
+
};
|
|
426
|
+
yAxis: {
|
|
427
|
+
type: string;
|
|
428
|
+
items: {
|
|
429
|
+
type: string;
|
|
430
|
+
};
|
|
431
|
+
description: string;
|
|
432
|
+
};
|
|
433
|
+
series: {
|
|
434
|
+
type: string;
|
|
435
|
+
items: {
|
|
436
|
+
type: string;
|
|
437
|
+
};
|
|
438
|
+
description: string;
|
|
439
|
+
};
|
|
440
|
+
yAxisAssignment: {
|
|
441
|
+
type: string;
|
|
442
|
+
description: string;
|
|
443
|
+
};
|
|
444
|
+
sizeField: {
|
|
445
|
+
type: string;
|
|
446
|
+
description: string;
|
|
447
|
+
};
|
|
448
|
+
colorField: {
|
|
449
|
+
type: string;
|
|
450
|
+
description: string;
|
|
451
|
+
};
|
|
452
|
+
};
|
|
453
|
+
};
|
|
454
|
+
displayConfig: {
|
|
455
|
+
type: string;
|
|
456
|
+
description: string;
|
|
457
|
+
properties: {
|
|
458
|
+
showLegend: {
|
|
459
|
+
type: string;
|
|
460
|
+
};
|
|
461
|
+
showGrid: {
|
|
462
|
+
type: string;
|
|
463
|
+
};
|
|
464
|
+
showTooltip: {
|
|
465
|
+
type: string;
|
|
466
|
+
};
|
|
467
|
+
stacked: {
|
|
468
|
+
type: string;
|
|
469
|
+
};
|
|
470
|
+
stackType: {
|
|
471
|
+
type: string;
|
|
472
|
+
enum: string[];
|
|
473
|
+
};
|
|
474
|
+
orientation: {
|
|
475
|
+
type: string;
|
|
476
|
+
enum: string[];
|
|
477
|
+
};
|
|
478
|
+
};
|
|
479
|
+
};
|
|
171
480
|
xAxis: {
|
|
172
481
|
type: string;
|
|
173
482
|
description: string;
|
|
@@ -179,10 +488,6 @@ export declare function buildToolList(options?: {
|
|
|
179
488
|
};
|
|
180
489
|
description: string;
|
|
181
490
|
};
|
|
182
|
-
title: {
|
|
183
|
-
type: string;
|
|
184
|
-
description: string;
|
|
185
|
-
};
|
|
186
491
|
};
|
|
187
492
|
};
|
|
188
493
|
topic?: undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-tNZ6Cvzw.cjs`),t=require(`../compiler-CA6iopu7.cjs`),n=require(`../mcp-transport-DPpBCNea.cjs`);let r=require(`next/server`);function i(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.t({drizzle:r,schema:i,engineType:a,cache:o,rlsSetup:s});return n.forEach(e=>{c.registerCube(e)}),c}function a(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 o(e){return async function(t){let n=a(t,e);return new Response(null,{status:200,headers:n})}}function s(t){let{extractSecurityContext:n,cors:o}=t,s=i(t);return async function(t,i){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let n=t.nextUrl.searchParams.get(`query`);if(!n)return r.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(n)}catch{return r.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return r.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await n(t,i),u=s.validateQuery(c);if(!u.isValid)return r.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 r.NextResponse.json(p,{headers:o?a(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js load handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function c(t){let{cors:n}=t,o=i(t);return async function(t,i){try{let i=e.a(o.getMetadata());return r.NextResponse.json(i,{headers:n?a(t,n):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js meta handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500),{status:500})}}}function l(t){let{extractSecurityContext:n,cors:o}=t,s=i(t);return async function(t,i){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let n=t.nextUrl.searchParams.get(`query`);if(!n)return r.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(n)}catch{return r.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return r.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await n(t,i),u=s.validateQuery(c);if(!u.isValid)return r.NextResponse.json(e.i(`Query validation failed: ${u.errors.join(`, `)}`,400),{status:400});let d=c.measures?.[0]||c.dimensions?.[0];if(!d)return r.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 r.NextResponse.json(m,{headers:o?a(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js SQL handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`SQL generation failed`,500),{status:500})}}}function u(t){let{extractSecurityContext:n,cors:o}=t,s=i(t);return async function(t,i){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 r.NextResponse.json({error:`Query parameter is required`,valid:!1},{status:400});try{c=JSON.parse(e)}catch{return r.NextResponse.json({error:`Invalid JSON in query parameter`,valid:!1},{status:400})}}else return r.NextResponse.json({error:`Method not allowed`,valid:!1},{status:405});let l=await n(t,i),u=await e.f(c,l,s);return r.NextResponse.json(u,{headers:o?a(t,o):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js dry-run handler error:`,e),r.NextResponse.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},{status:400})}}}function d(t){let{extractSecurityContext:n,cors:o}=t,s=i(t);return async function(t,i){try{if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let{queries:c}=await t.json();if(!c||!Array.isArray(c))return r.NextResponse.json(e.i(`Request body must contain a "queries" array`,400),{status:400});if(c.length===0)return r.NextResponse.json(e.i(`Queries array cannot be empty`,400),{status:400});let l=await e.u(c,await n(t,i),s,{skipCache:t.headers.get(`x-cache-control`)===`no-cache`});return r.NextResponse.json(l,{headers:o?a(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js batch handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Batch execution failed`,500),{status:500})}}}function f(e){let{extractSecurityContext:t,cors:n}=e,o=i(e);return async function(e,i){try{if(e.method!==`POST`)return r.NextResponse.json({error:`Method not allowed`},{status:405});let s=await e.json(),c=s.query||s,l=s.options||{},u=await t(e,i),d=o.validateQuery(c);if(!d.isValid)return r.NextResponse.json({error:`Query validation failed: ${d.errors.join(`, `)}`},{status:400});let f=await o.explainQuery(c,u,l);return r.NextResponse.json(f,{headers:n?a(e,n):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js explain handler error:`,e),r.NextResponse.json({error:e instanceof Error?e.message:`Explain query failed`},{status:500})}}}function p(t){let{cors:n}=t,o=i(t);return async function(t,i){try{if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let i=await e.d(o,await t.json());return r.NextResponse.json(i,{headers:n?a(t,n):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js discover handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Discovery failed`,500),{status:500})}}}function m(t){let{cors:n}=t,o=i(t);return async function(t,i){try{if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let i=await t.json();if(!i.naturalLanguage)return r.NextResponse.json(e.i(`naturalLanguage field is required`,400),{status:400});let s=await e.m(o,i);return r.NextResponse.json(s,{headers:n?a(t,n):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js suggest handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Query suggestion failed`,500),{status:500})}}}function h(t){let{cors:n}=t,o=i(t);return async function(t,i){try{if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let i=await t.json();if(!i.query)return r.NextResponse.json(e.i(`query field is required`,400),{status:400});let s=await e.h(o,i);return r.NextResponse.json(s,{headers:n?a(t,n):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js validate handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Query validation failed`,500),{status:500})}}}function g(t){let{extractSecurityContext:n,cors:o}=t,s=i(t);return async function(t,i){try{if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let c=await t.json();if(!c.query)return r.NextResponse.json(e.i(`query field is required`,400),{status:400});let l=await e.p(s,await n(t,i),c);return r.NextResponse.json(l,{headers:o?a(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP load handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function _(t){let{extractSecurityContext:o,cors:s,mcp:c={enabled:!0}}=t,l=i(t);return async function(t){if(t.method===`DELETE`)return r.NextResponse.json({error:`Session termination not supported`},{status:405});if(t.method===`GET`){let e=new TextEncoder,i=n.m(),o=new ReadableStream({start(t){t.enqueue(e.encode(n.h({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},i,15e3)))}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=a(t,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new r.NextResponse(o,{status:200,headers:c})}if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let i=n._(t.headers.get(`origin`),c.allowedOrigins?{allowedOrigins:c.allowedOrigins}:{});if(!i.valid)return r.NextResponse.json(n.i(null,-32600,i.reason),{status:403});let u=t.headers.get(`accept`);if(!n.g(u))return r.NextResponse.json(n.i(null,-32600,`Accept header must include both application/json and text/event-stream`),{status:400});let d=n.f(Object.fromEntries(t.headers.entries()));if(!d.ok)return r.NextResponse.json({error:`Unsupported MCP protocol version`,supported:d.supported},{status:426});let f;try{f=await t.json()}catch{f=null}let p=n.p(f);if(!p)return r.NextResponse.json(n.i(null,-32600,`Invalid JSON-RPC 2.0 request`),{status:400});let m=n.v(u),h=p.method===`initialize`,g=(e,n=200,i={})=>r.NextResponse.json(e,{status:n,headers:{...s?a(t,s):{},...i}});try{let e=await n.s(p.method,p.params,{semanticLayer:l,extractSecurityContext:e=>o(e),rawRequest:t,rawResponse:null,appEnabled:!!c.app});if(n.d(p))return new r.NextResponse(null,{status:202});let i=h&&e&&typeof e==`object`&&`sessionId`in e?e.sessionId:void 0,u={};i&&(u[n.r]=i);let d=n.a(p.id??null,e);if(m){let e=new TextEncoder,i=n.m(),o=new ReadableStream({start(t){t.enqueue(e.encode(`id: ${i}\n\n`)),t.enqueue(e.encode(n.h(d,i))),t.close()}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,...u});if(s){let e=a(t,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new r.NextResponse(o,{status:200,headers:c})}return g(d,200,u)}catch(e){if(n.d(p))return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP notification processing error:`,e),new r.NextResponse(null,{status:202});process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP RPC handler error:`,e);let i=e?.code??-32603,o=e?.data,c=e.message||`MCP request failed`,l=n.i(p.id??null,i,c,o);if(m){let e=new TextEncoder,i=n.m(),o=new ReadableStream({start(t){t.enqueue(e.encode(`id: ${i}\n\n`)),t.enqueue(e.encode(n.h(l,i))),t.close()}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=a(t,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new r.NextResponse(o,{status:200,headers:c})}return g(l,200)}}}function v(e){let{extractSecurityContext:t,cors:n,agent:o}=e;if(!o)throw Error(`agent config is required for createAgentChatHandler`);let s=i(e);return async function(e,i){try{if(e.method!==`POST`)return r.NextResponse.json({error:`Method not allowed - use POST`},{status:405});let{handleAgentChat:c}=await Promise.resolve().then(()=>require(`../handler-BO2nq6IS.cjs`)),{message:l,sessionId:u,history:d}=await e.json();if(!l||typeof l!=`string`)return r.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 r.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,i),_=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(n){let t=a(e,n);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),r.NextResponse.json({error:e instanceof Error?e.message:`Agent chat failed`},{status:500})}}}function y(e){let{mcp:t={enabled:!0}}=e,n={load:s(e),meta:c(e),sql:l(e),dryRun:u(e),batch:d(e),explain:f(e)};return t.enabled!==!1&&(n.mcpRpc=_(e)),e.agent&&(n.agentChat=v(e)),n}exports.createAgentChatHandler=v,exports.createBatchHandler=d,exports.createCubeHandlers=y,exports.createDiscoverHandler=p,exports.createDryRunHandler=u,exports.createExplainHandler=f,exports.createLoadHandler=s,exports.createMcpLoadHandler=g,exports.createMcpRpcHandler=_,exports.createMetaHandler=c,exports.createOptionsHandler=o,exports.createSqlHandler=l,exports.createSuggestHandler=m,exports.createValidateHandler=h;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CyBt-as9.cjs`),t=require(`../compiler-CdL3ksb3.cjs`),n=require(`../mcp-transport-DlFvZl2c.cjs`);let r=require(`next/server`);function i(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.t({drizzle:r,schema:i,engineType:a,cache:o,rlsSetup:s});return n.forEach(e=>{c.registerCube(e)}),c}function a(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 o(e){return async function(t){let n=a(t,e);return new Response(null,{status:200,headers:n})}}function s(t){let{extractSecurityContext:n,cors:o}=t,s=i(t);return async function(t,i){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let n=t.nextUrl.searchParams.get(`query`);if(!n)return r.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(n)}catch{return r.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return r.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await n(t,i),u=s.validateQuery(c);if(!u.isValid)return r.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 r.NextResponse.json(p,{headers:o?a(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js load handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function c(t){let{cors:n}=t,o=i(t);return async function(t,i){try{let i=e.a(o.getMetadata());return r.NextResponse.json(i,{headers:n?a(t,n):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js meta handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500),{status:500})}}}function l(t){let{extractSecurityContext:n,cors:o}=t,s=i(t);return async function(t,i){try{let c;if(t.method===`POST`){let e=await t.json();c=e.query||e}else if(t.method===`GET`){let n=t.nextUrl.searchParams.get(`query`);if(!n)return r.NextResponse.json(e.i(`Query parameter is required`,400),{status:400});try{c=JSON.parse(n)}catch{return r.NextResponse.json(e.i(`Invalid JSON in query parameter`,400),{status:400})}}else return r.NextResponse.json(e.i(`Method not allowed`,405),{status:405});let l=await n(t,i),u=s.validateQuery(c);if(!u.isValid)return r.NextResponse.json(e.i(`Query validation failed: ${u.errors.join(`, `)}`,400),{status:400});let d=c.measures?.[0]||c.dimensions?.[0];if(!d)return r.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 r.NextResponse.json(m,{headers:o?a(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js SQL handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`SQL generation failed`,500),{status:500})}}}function u(t){let{extractSecurityContext:n,cors:o}=t,s=i(t);return async function(t,i){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 r.NextResponse.json({error:`Query parameter is required`,valid:!1},{status:400});try{c=JSON.parse(e)}catch{return r.NextResponse.json({error:`Invalid JSON in query parameter`,valid:!1},{status:400})}}else return r.NextResponse.json({error:`Method not allowed`,valid:!1},{status:405});let l=await n(t,i),u=await e.f(c,l,s);return r.NextResponse.json(u,{headers:o?a(t,o):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js dry-run handler error:`,e),r.NextResponse.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},{status:400})}}}function d(t){let{extractSecurityContext:n,cors:o}=t,s=i(t);return async function(t,i){try{if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let{queries:c}=await t.json();if(!c||!Array.isArray(c))return r.NextResponse.json(e.i(`Request body must contain a "queries" array`,400),{status:400});if(c.length===0)return r.NextResponse.json(e.i(`Queries array cannot be empty`,400),{status:400});let l=await e.u(c,await n(t,i),s,{skipCache:t.headers.get(`x-cache-control`)===`no-cache`});return r.NextResponse.json(l,{headers:o?a(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js batch handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Batch execution failed`,500),{status:500})}}}function f(e){let{extractSecurityContext:t,cors:n}=e,o=i(e);return async function(e,i){try{if(e.method!==`POST`)return r.NextResponse.json({error:`Method not allowed`},{status:405});let s=await e.json(),c=s.query||s,l=s.options||{},u=await t(e,i),d=o.validateQuery(c);if(!d.isValid)return r.NextResponse.json({error:`Query validation failed: ${d.errors.join(`, `)}`},{status:400});let f=await o.explainQuery(c,u,l);return r.NextResponse.json(f,{headers:n?a(e,n):{}})}catch(e){return process.env.NODE_ENV!==`test`&&console.error(`Next.js explain handler error:`,e),r.NextResponse.json({error:e instanceof Error?e.message:`Explain query failed`},{status:500})}}}function p(t){let{cors:n}=t,o=i(t);return async function(t,i){try{if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let i=await e.d(o,await t.json());return r.NextResponse.json(i,{headers:n?a(t,n):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js discover handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Discovery failed`,500),{status:500})}}}function m(t){let{cors:n}=t,o=i(t);return async function(t,i){try{if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let i=await t.json();if(!i.naturalLanguage)return r.NextResponse.json(e.i(`naturalLanguage field is required`,400),{status:400});let s=await e.m(o,i);return r.NextResponse.json(s,{headers:n?a(t,n):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js suggest handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Query suggestion failed`,500),{status:500})}}}function h(t){let{cors:n}=t,o=i(t);return async function(t,i){try{if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let i=await t.json();if(!i.query)return r.NextResponse.json(e.i(`query field is required`,400),{status:400});let s=await e.h(o,i);return r.NextResponse.json(s,{headers:n?a(t,n):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js validate handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Query validation failed`,500),{status:500})}}}function g(t){let{extractSecurityContext:n,cors:o}=t,s=i(t);return async function(t,i){try{if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let c=await t.json();if(!c.query)return r.NextResponse.json(e.i(`query field is required`,400),{status:400});let l=await e.p(s,await n(t,i),c);return r.NextResponse.json(l,{headers:o?a(t,o):{}})}catch(t){return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP load handler error:`,t),r.NextResponse.json(e.i(t instanceof Error?t.message:`Query execution failed`,500),{status:500})}}}function _(t){let{extractSecurityContext:o,cors:s,mcp:c={enabled:!0}}=t,l=i(t);return async function(t){if(t.method===`DELETE`)return r.NextResponse.json({error:`Session termination not supported`},{status:405});if(t.method===`GET`){let e=new TextEncoder,i=n.m(),o=new ReadableStream({start(t){t.enqueue(e.encode(n.h({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},i,15e3)))}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=a(t,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new r.NextResponse(o,{status:200,headers:c})}if(t.method!==`POST`)return r.NextResponse.json(e.i(`Method not allowed - use POST`,405),{status:405});let i=n._(t.headers.get(`origin`),c.allowedOrigins?{allowedOrigins:c.allowedOrigins}:{});if(!i.valid)return r.NextResponse.json(n.i(null,-32600,i.reason),{status:403});let u=t.headers.get(`accept`);if(!n.g(u))return r.NextResponse.json(n.i(null,-32600,`Accept header must include both application/json and text/event-stream`),{status:400});let d=n.f(Object.fromEntries(t.headers.entries()));if(!d.ok)return r.NextResponse.json({error:`Unsupported MCP protocol version`,supported:d.supported},{status:426});let f;try{f=await t.json()}catch{f=null}let p=n.p(f);if(!p)return r.NextResponse.json(n.i(null,-32600,`Invalid JSON-RPC 2.0 request`),{status:400});let m=n.v(u),h=p.method===`initialize`,g=(e,n=200,i={})=>r.NextResponse.json(e,{status:n,headers:{...s?a(t,s):{},...i}});try{let e=await n.s(p.method,p.params,{semanticLayer:l,extractSecurityContext:e=>o(e),rawRequest:t,rawResponse:null,appEnabled:!!c.app});if(n.d(p))return new r.NextResponse(null,{status:202});let i=h&&e&&typeof e==`object`&&`sessionId`in e?e.sessionId:void 0,u={};i&&(u[n.r]=i);let d=n.a(p.id??null,e);if(m){let e=new TextEncoder,i=n.m(),o=new ReadableStream({start(t){t.enqueue(e.encode(`id: ${i}\n\n`)),t.enqueue(e.encode(n.h(d,i))),t.close()}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,...u});if(s){let e=a(t,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new r.NextResponse(o,{status:200,headers:c})}return g(d,200,u)}catch(e){if(n.d(p))return process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP notification processing error:`,e),new r.NextResponse(null,{status:202});process.env.NODE_ENV!==`test`&&console.error(`Next.js MCP RPC handler error:`,e);let i=e?.code??-32603,o=e?.data,c=e.message||`MCP request failed`,l=n.i(p.id??null,i,c,o);if(m){let e=new TextEncoder,i=n.m(),o=new ReadableStream({start(t){t.enqueue(e.encode(`id: ${i}\n\n`)),t.enqueue(e.encode(n.h(l,i))),t.close()}}),c=new Headers({"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});if(s){let e=a(t,s);Object.entries(e).forEach(([e,t])=>c.set(e,t))}return new r.NextResponse(o,{status:200,headers:c})}return g(l,200)}}}function v(e){let{extractSecurityContext:t,cors:n,agent:o}=e;if(!o)throw Error(`agent config is required for createAgentChatHandler`);let s=i(e);return async function(e,i){try{if(e.method!==`POST`)return r.NextResponse.json({error:`Method not allowed - use POST`},{status:405});let{handleAgentChat:c}=await Promise.resolve().then(()=>require(`../handler-DumFgnNM.cjs`)),{message:l,sessionId:u,history:d}=await e.json();if(!l||typeof l!=`string`)return r.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 r.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,i),_=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(n){let t=a(e,n);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),r.NextResponse.json({error:e instanceof Error?e.message:`Agent chat failed`},{status:500})}}}function y(e){let{mcp:t={enabled:!0}}=e,n={load:s(e),meta:c(e),sql:l(e),dryRun:u(e),batch:d(e),explain:f(e)};return t.enabled!==!1&&(n.mcpRpc=_(e)),e.agent&&(n.agentChat=v(e)),n}exports.createAgentChatHandler=v,exports.createBatchHandler=d,exports.createCubeHandlers=y,exports.createDiscoverHandler=p,exports.createDryRunHandler=u,exports.createExplainHandler=f,exports.createLoadHandler=s,exports.createMcpLoadHandler=g,exports.createMcpRpcHandler=_,exports.createMetaHandler=c,exports.createOptionsHandler=o,exports.createSqlHandler=l,exports.createSuggestHandler=m,exports.createValidateHandler=h;
|
|
@@ -1,6 +1,6 @@
|
|
|
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-
|
|
2
|
-
import { t as u } from "../compiler-
|
|
3
|
-
import { _ as d, a as f, d as p, f as m, g as h, h as g, i as _, m as v, p as y, r as b, s as x, v as S } from "../mcp-transport-
|
|
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-IH1ePsBd.js";
|
|
2
|
+
import { t as u } from "../compiler-B_Nl7ZZb.js";
|
|
3
|
+
import { _ as d, a as f, d as p, f as m, g as h, h as g, i as _, m as v, p as y, r as b, s as x, v as S } from "../mcp-transport-CG5Aw2cs.js";
|
|
4
4
|
import { NextResponse as C } from "next/server";
|
|
5
5
|
//#region src/adapters/nextjs/index.ts
|
|
6
6
|
function w(e) {
|
|
@@ -327,7 +327,7 @@ function R(e) {
|
|
|
327
327
|
return async function(e, a) {
|
|
328
328
|
try {
|
|
329
329
|
if (e.method !== "POST") return C.json({ error: "Method not allowed - use POST" }, { status: 405 });
|
|
330
|
-
let { handleAgentChat: o } = await import("../handler-
|
|
330
|
+
let { handleAgentChat: o } = await import("../handler-RItnSaEl.js"), { message: s, sessionId: c, history: l } = await e.json();
|
|
331
331
|
if (!s || typeof s != "string") return C.json({ error: "message is required and must be a string" }, { status: 400 });
|
|
332
332
|
let u = (r.apiKey || "").trim();
|
|
333
333
|
if (r.allowClientApiKey) {
|