@mastra/duckdb 1.7.0 → 1.8.0-alpha.0

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.
@@ -74,6 +74,8 @@ CREATE TABLE IF NOT EXISTS span_events (
74
74
  entityId VARCHAR,
75
75
  entityName VARCHAR,
76
76
  entityVersionId VARCHAR,
77
+ parentEntityVersionId VARCHAR,
78
+ rootEntityVersionId VARCHAR,
77
79
 
78
80
  -- Context
79
81
  userId VARCHAR,
@@ -339,6 +341,8 @@ const ALL_MIGRATIONS = [
339
341
  `CREATE SEQUENCE IF NOT EXISTS feedback_events_cursor_id_seq START 1`,
340
342
  `ALTER TABLE span_events ADD COLUMN IF NOT EXISTS cursorId BIGINT`,
341
343
  `ALTER TABLE span_events ADD COLUMN IF NOT EXISTS entityVersionId VARCHAR`,
344
+ `ALTER TABLE span_events ADD COLUMN IF NOT EXISTS parentEntityVersionId VARCHAR`,
345
+ `ALTER TABLE span_events ADD COLUMN IF NOT EXISTS rootEntityVersionId VARCHAR`,
342
346
  `ALTER TABLE metric_events ADD COLUMN IF NOT EXISTS cursorId BIGINT`,
343
347
  `ALTER TABLE metric_events ADD COLUMN IF NOT EXISTS entityVersionId VARCHAR`,
344
348
  `ALTER TABLE metric_events ADD COLUMN IF NOT EXISTS parentEntityVersionId VARCHAR`,
@@ -2620,13 +2624,65 @@ const TRACE_FIELDS = {
2620
2624
  }
2621
2625
  };
2622
2626
  const SPAN_FIELDS = {
2627
+ name: {
2628
+ sql: "s.name",
2629
+ parameterType: "scalar"
2630
+ },
2623
2631
  spanType: {
2624
2632
  sql: "s.spanType",
2625
2633
  parameterType: "scalar"
2626
2634
  },
2635
+ model: {
2636
+ sql: "s.model",
2637
+ parameterType: "scalar"
2638
+ },
2639
+ provider: {
2640
+ sql: "s.provider",
2641
+ parameterType: "scalar"
2642
+ },
2643
+ startedAt: {
2644
+ sql: "s.startedAt",
2645
+ parameterType: "timestamp"
2646
+ },
2647
+ endedAt: {
2648
+ sql: "s.endedAt",
2649
+ parameterType: "timestamp"
2650
+ },
2651
+ durationMs: {
2652
+ sql: "s.durationMs",
2653
+ parameterType: "scalar"
2654
+ },
2655
+ status: {
2656
+ sql: "s.status",
2657
+ parameterType: "scalar"
2658
+ },
2627
2659
  error: {
2628
2660
  sql: "s.error",
2629
2661
  parameterType: "scalar"
2662
+ },
2663
+ entityType: {
2664
+ sql: "s.entityType",
2665
+ parameterType: "scalar"
2666
+ },
2667
+ entityId: {
2668
+ sql: "s.entityId",
2669
+ parameterType: "scalar"
2670
+ },
2671
+ entityName: {
2672
+ sql: "s.entityName",
2673
+ parameterType: "scalar"
2674
+ },
2675
+ entityVersionId: {
2676
+ sql: "s.entityVersionId",
2677
+ parameterType: "scalar"
2678
+ },
2679
+ parentEntityVersionId: {
2680
+ sql: "s.parentEntityVersionId",
2681
+ parameterType: "scalar"
2682
+ },
2683
+ rootEntityVersionId: {
2684
+ sql: "s.rootEntityVersionId",
2685
+ parameterType: "scalar"
2630
2686
  }
2631
2687
  };
2632
2688
  const SCORE_FIELDS = {
@@ -2634,9 +2690,37 @@ const SCORE_FIELDS = {
2634
2690
  sql: "s.scorerId",
2635
2691
  parameterType: "scalar"
2636
2692
  },
2693
+ scorerVersion: {
2694
+ sql: "s.scorerVersion",
2695
+ parameterType: "scalar"
2696
+ },
2697
+ scoreSource: {
2698
+ sql: "s.scoreSource",
2699
+ parameterType: "scalar"
2700
+ },
2637
2701
  score: {
2638
2702
  sql: "s.score",
2639
2703
  parameterType: "scalar"
2704
+ },
2705
+ timestamp: {
2706
+ sql: "s.timestamp",
2707
+ parameterType: "timestamp"
2708
+ },
2709
+ spanId: {
2710
+ sql: "s.spanId",
2711
+ parameterType: "scalar"
2712
+ },
2713
+ entityVersionId: {
2714
+ sql: "s.entityVersionId",
2715
+ parameterType: "scalar"
2716
+ },
2717
+ parentEntityVersionId: {
2718
+ sql: "s.parentEntityVersionId",
2719
+ parameterType: "scalar"
2720
+ },
2721
+ rootEntityVersionId: {
2722
+ sql: "s.rootEntityVersionId",
2723
+ parameterType: "scalar"
2640
2724
  }
2641
2725
  };
2642
2726
  const TRACE_SELECT = `
@@ -2658,12 +2742,15 @@ function fieldDefinition(registry, field) {
2658
2742
  function parameterSql(type) {
2659
2743
  return type === "timestamp" ? "CAST(? AS TIMESTAMP)" : "?";
2660
2744
  }
2661
- function compileScalarPredicate(predicate, registry) {
2745
+ function isMetadataField(field) {
2746
+ return field.startsWith("metadata.");
2747
+ }
2748
+ function compileScalarPredicate(predicate, registry, allowMetadata = false) {
2662
2749
  if (predicate.type === "boolean") {
2663
2750
  const values = [];
2664
2751
  return {
2665
2752
  sql: predicate.args.map((arg) => {
2666
- const compiled = compileScalarPredicate(arg, registry);
2753
+ const compiled = compileScalarPredicate(arg, registry, allowMetadata);
2667
2754
  values.push(...compiled.values);
2668
2755
  return `(${compiled.sql})`;
2669
2756
  }).join(predicate.operator === "and" ? " AND " : " OR "),
@@ -2671,26 +2758,45 @@ function compileScalarPredicate(predicate, registry) {
2671
2758
  };
2672
2759
  }
2673
2760
  if (predicate.type === "not") {
2674
- const compiled = compileScalarPredicate(predicate.arg, registry);
2761
+ const compiled = compileScalarPredicate(predicate.arg, registry, allowMetadata);
2675
2762
  return {
2676
2763
  sql: `NOT (${compiled.sql})`,
2677
2764
  values: compiled.values
2678
2765
  };
2679
2766
  }
2680
- const field = fieldDefinition(registry, predicate.field);
2767
+ let field;
2768
+ let fieldValues = [];
2769
+ if (isMetadataField(predicate.field)) {
2770
+ if (!allowMetadata) throw new Error(`Unsupported trusted trace-query field: ${predicate.field}`);
2771
+ const key = predicate.field.slice(9);
2772
+ const path = `$.${JSON.stringify(key)}`;
2773
+ field = {
2774
+ sql: `NULLIF(trim(CASE WHEN json_type(r.metadata, ?) = 'VARCHAR' THEN json_extract_string(r.metadata, ?) END), '')`,
2775
+ parameterType: "scalar"
2776
+ };
2777
+ fieldValues = [path, path];
2778
+ } else field = fieldDefinition(registry, predicate.field);
2681
2779
  if (predicate.type === "presence") return {
2682
2780
  sql: `${field.sql} IS ${predicate.operator === "exists" ? "NOT " : ""}NULL`,
2683
- values: []
2781
+ values: fieldValues
2684
2782
  };
2685
2783
  if (predicate.type === "membership") {
2686
2784
  const list = predicate.values.map(() => parameterSql(field.parameterType)).join(", ");
2687
2785
  if (predicate.operator === "in") return {
2688
2786
  sql: `${field.sql} IS NOT NULL AND ${field.sql} IN (${list})`,
2689
- values: predicate.values
2787
+ values: [
2788
+ ...fieldValues,
2789
+ ...fieldValues,
2790
+ ...predicate.values
2791
+ ]
2690
2792
  };
2691
2793
  return {
2692
2794
  sql: `${field.sql} IS NULL OR ${field.sql} NOT IN (${list})`,
2693
- values: predicate.values
2795
+ values: [
2796
+ ...fieldValues,
2797
+ ...fieldValues,
2798
+ ...predicate.values
2799
+ ]
2694
2800
  };
2695
2801
  }
2696
2802
  const parameter = parameterSql(field.parameterType);
@@ -2702,17 +2808,21 @@ function compileScalarPredicate(predicate, registry) {
2702
2808
  };
2703
2809
  if (predicate.operator === "eq") return {
2704
2810
  sql: `${field.sql} IS NOT DISTINCT FROM ${parameter}`,
2705
- values: [predicate.value]
2811
+ values: [...fieldValues, predicate.value]
2706
2812
  };
2707
2813
  if (predicate.operator === "ne") return {
2708
2814
  sql: `${field.sql} IS DISTINCT FROM ${parameter}`,
2709
- values: [predicate.value]
2815
+ values: [...fieldValues, predicate.value]
2710
2816
  };
2711
2817
  const operator = operators[predicate.operator];
2712
2818
  if (operator === void 0) throw new Error(`Unsupported trusted trace-query operator: ${predicate.operator}`);
2713
2819
  return {
2714
2820
  sql: `${field.sql} IS NOT NULL AND ${field.sql} ${operator} ${parameter}`,
2715
- values: [predicate.value]
2821
+ values: [
2822
+ ...fieldValues,
2823
+ ...fieldValues,
2824
+ predicate.value
2825
+ ]
2716
2826
  };
2717
2827
  }
2718
2828
  function compilePredicate(predicate) {
@@ -2748,7 +2858,7 @@ function compilePredicate(predicate) {
2748
2858
  values: compiled.values
2749
2859
  };
2750
2860
  }
2751
- return compileScalarPredicate(predicate, TRACE_FIELDS);
2861
+ return compileScalarPredicate(predicate, TRACE_FIELDS, true);
2752
2862
  }
2753
2863
  function collectRelatedCollections(predicate, collections = /* @__PURE__ */ new Set()) {
2754
2864
  if (!predicate) return collections;
@@ -2797,18 +2907,43 @@ function compileDuckDBTraceQuery(plan) {
2797
2907
  AND r.startedAt < CAST(? AS TIMESTAMP)
2798
2908
  )`
2799
2909
  ];
2800
- if (relatedCollections.has("spans")) ctes.push(`current_spans AS (
2801
- SELECT * EXCLUDE (currentRank)
2802
- FROM (
2803
- SELECT
2804
- e.*,
2805
- row_number() OVER (
2806
- PARTITION BY e.traceId, e.spanId
2807
- ORDER BY CASE WHEN e.endedAt IS NULL THEN 1 ELSE 0 END ASC, e.cursorId DESC
2808
- ) AS currentRank
2809
- FROM span_events e
2810
- INNER JOIN root_scope roots ON roots.traceId = e.traceId
2811
- )
2910
+ if (relatedCollections.has("spans")) ctes.push(`current_span_rows AS (
2911
+ SELECT
2912
+ e.*,
2913
+ coalesce(
2914
+ min(e.timestamp) FILTER (WHERE e.eventType = 'start') OVER (PARTITION BY e.traceId, e.spanId),
2915
+ min(e.timestamp) OVER (PARTITION BY e.traceId, e.spanId)
2916
+ ) AS startedAt,
2917
+ row_number() OVER (
2918
+ PARTITION BY e.traceId, e.spanId
2919
+ ORDER BY CASE WHEN e.endedAt IS NULL THEN 1 ELSE 0 END ASC, e.cursorId DESC
2920
+ ) AS currentRank
2921
+ FROM span_events e
2922
+ INNER JOIN root_scope roots ON roots.traceId = e.traceId
2923
+ ),
2924
+ current_spans AS (
2925
+ SELECT
2926
+ traceId,
2927
+ name,
2928
+ spanType,
2929
+ CASE
2930
+ WHEN json_type(attributes, '$.model') = 'VARCHAR' THEN json_extract_string(attributes, '$.model')
2931
+ END AS model,
2932
+ CASE
2933
+ WHEN json_type(attributes, '$.provider') = 'VARCHAR' THEN json_extract_string(attributes, '$.provider')
2934
+ END AS provider,
2935
+ startedAt,
2936
+ endedAt,
2937
+ date_diff('millisecond', startedAt, endedAt) AS durationMs,
2938
+ CASE WHEN error IS NOT NULL THEN 'error' ELSE 'success' END AS status,
2939
+ error,
2940
+ entityType,
2941
+ entityId,
2942
+ entityName,
2943
+ entityVersionId,
2944
+ parentEntityVersionId,
2945
+ rootEntityVersionId
2946
+ FROM current_span_rows
2812
2947
  WHERE currentRank = 1
2813
2948
  )`);
2814
2949
  if (relatedCollections.has("scores")) ctes.push(`current_scores AS (
@@ -2913,6 +3048,8 @@ const COLUMNS_SQL = [
2913
3048
  "entityId",
2914
3049
  "entityName",
2915
3050
  "entityVersionId",
3051
+ "parentEntityVersionId",
3052
+ "rootEntityVersionId",
2916
3053
  "userId",
2917
3054
  "organizationId",
2918
3055
  "resourceId",
@@ -2955,6 +3092,8 @@ const SPAN_RECONSTRUCT_SELECT = `
2955
3092
  ${argMaxNonNull("entityId")},
2956
3093
  ${argMaxNonNull("entityName")},
2957
3094
  ${argMaxNonNull("entityVersionId")},
3095
+ ${argMaxNonNull("parentEntityVersionId")},
3096
+ ${argMaxNonNull("rootEntityVersionId")},
2958
3097
  ${argMaxNonNull("userId")},
2959
3098
  ${argMaxNonNull("organizationId")},
2960
3099
  ${argMaxNonNull("resourceId")},
@@ -3122,6 +3261,8 @@ function rowToSpanRecord(row) {
3122
3261
  entityId: row.entityId ?? null,
3123
3262
  entityName: row.entityName ?? null,
3124
3263
  entityVersionId: row.entityVersionId ?? null,
3264
+ parentEntityVersionId: row.parentEntityVersionId ?? null,
3265
+ rootEntityVersionId: row.rootEntityVersionId ?? null,
3125
3266
  userId: row.userId ?? null,
3126
3267
  organizationId: row.organizationId ?? null,
3127
3268
  resourceId: row.resourceId ?? null,
@@ -3277,6 +3418,8 @@ function toValuesTuple(row) {
3277
3418
  v(row.entityId),
3278
3419
  v(row.entityName),
3279
3420
  v(row.entityVersionId),
3421
+ v(row.parentEntityVersionId),
3422
+ v(row.rootEntityVersionId),
3280
3423
  v(row.userId),
3281
3424
  v(row.organizationId),
3282
3425
  v(row.resourceId),
@@ -3319,6 +3462,8 @@ function createStartSpanRow(s) {
3319
3462
  entityId: s.entityId ?? null,
3320
3463
  entityName: s.entityName ?? null,
3321
3464
  entityVersionId: s.entityVersionId ?? null,
3465
+ parentEntityVersionId: s.parentEntityVersionId ?? null,
3466
+ rootEntityVersionId: s.rootEntityVersionId ?? null,
3322
3467
  userId: s.userId ?? null,
3323
3468
  organizationId: s.organizationId ?? null,
3324
3469
  resourceId: s.resourceId ?? null,
@@ -3356,6 +3501,8 @@ function createEndSpanRow(s) {
3356
3501
  entityId: s.entityId ?? null,
3357
3502
  entityName: s.entityName ?? null,
3358
3503
  entityVersionId: s.entityVersionId ?? null,
3504
+ parentEntityVersionId: s.parentEntityVersionId ?? null,
3505
+ rootEntityVersionId: s.rootEntityVersionId ?? null,
3359
3506
  userId: s.userId ?? null,
3360
3507
  organizationId: s.organizationId ?? null,
3361
3508
  resourceId: s.resourceId ?? null,
@@ -4268,4 +4415,4 @@ var ObservabilityStorageDuckDB = class extends _mastra_core_storage.Observabilit
4268
4415
  //#endregion
4269
4416
  exports.ObservabilityStorageDuckDB = ObservabilityStorageDuckDB;
4270
4417
 
4271
- //# sourceMappingURL=observability-yLoG0tl3.cjs.map
4418
+ //# sourceMappingURL=observability-VHURnMMH.cjs.map