@mastra/duckdb 1.7.0-alpha.1 → 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.
@@ -3,7 +3,7 @@ name: mastra-duckdb
3
3
  description: Documentation for @mastra/duckdb. Use when working with @mastra/duckdb APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/duckdb"
6
- version: "1.7.0-alpha.1"
6
+ version: "1.8.0-alpha.0"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.7.0-alpha.1",
2
+ "version": "1.8.0-alpha.0",
3
3
  "package": "@mastra/duckdb",
4
4
  "exports": {},
5
5
  "modules": {}
package/dist/index.cjs CHANGED
@@ -528,7 +528,7 @@ var ObservabilityStorageDuckDB = class extends _mastra_core_storage.Observabilit
528
528
  async loadDelegate() {
529
529
  if (this.delegate) return this.delegate;
530
530
  if (this.unavailableError) return null;
531
- if (!this.loadPromise) this.loadPromise = Promise.resolve().then(() => require("./observability-yLoG0tl3.cjs")).then(({ ObservabilityStorageDuckDB }) => {
531
+ if (!this.loadPromise) this.loadPromise = Promise.resolve().then(() => require("./observability-VHURnMMH.cjs")).then(({ ObservabilityStorageDuckDB }) => {
532
532
  const delegate = new ObservabilityStorageDuckDB({ db: this.db });
533
533
  this.delegate = delegate;
534
534
  return delegate;
package/dist/index.js CHANGED
@@ -527,7 +527,7 @@ var ObservabilityStorageDuckDB = class extends ObservabilityStorage {
527
527
  async loadDelegate() {
528
528
  if (this.delegate) return this.delegate;
529
529
  if (this.unavailableError) return null;
530
- if (!this.loadPromise) this.loadPromise = import("./observability-Bt92lKRG.js").then(({ ObservabilityStorageDuckDB }) => {
530
+ if (!this.loadPromise) this.loadPromise = import("./observability-CgtrnaKz.js").then(({ ObservabilityStorageDuckDB }) => {
531
531
  const delegate = new ObservabilityStorageDuckDB({ db: this.db });
532
532
  this.delegate = delegate;
533
533
  return delegate;
@@ -52,6 +52,8 @@ CREATE TABLE IF NOT EXISTS span_events (
52
52
  entityId VARCHAR,
53
53
  entityName VARCHAR,
54
54
  entityVersionId VARCHAR,
55
+ parentEntityVersionId VARCHAR,
56
+ rootEntityVersionId VARCHAR,
55
57
 
56
58
  -- Context
57
59
  userId VARCHAR,
@@ -317,6 +319,8 @@ const ALL_MIGRATIONS = [
317
319
  `CREATE SEQUENCE IF NOT EXISTS feedback_events_cursor_id_seq START 1`,
318
320
  `ALTER TABLE span_events ADD COLUMN IF NOT EXISTS cursorId BIGINT`,
319
321
  `ALTER TABLE span_events ADD COLUMN IF NOT EXISTS entityVersionId VARCHAR`,
322
+ `ALTER TABLE span_events ADD COLUMN IF NOT EXISTS parentEntityVersionId VARCHAR`,
323
+ `ALTER TABLE span_events ADD COLUMN IF NOT EXISTS rootEntityVersionId VARCHAR`,
320
324
  `ALTER TABLE metric_events ADD COLUMN IF NOT EXISTS cursorId BIGINT`,
321
325
  `ALTER TABLE metric_events ADD COLUMN IF NOT EXISTS entityVersionId VARCHAR`,
322
326
  `ALTER TABLE metric_events ADD COLUMN IF NOT EXISTS parentEntityVersionId VARCHAR`,
@@ -2598,13 +2602,65 @@ const TRACE_FIELDS = {
2598
2602
  }
2599
2603
  };
2600
2604
  const SPAN_FIELDS = {
2605
+ name: {
2606
+ sql: "s.name",
2607
+ parameterType: "scalar"
2608
+ },
2601
2609
  spanType: {
2602
2610
  sql: "s.spanType",
2603
2611
  parameterType: "scalar"
2604
2612
  },
2613
+ model: {
2614
+ sql: "s.model",
2615
+ parameterType: "scalar"
2616
+ },
2617
+ provider: {
2618
+ sql: "s.provider",
2619
+ parameterType: "scalar"
2620
+ },
2621
+ startedAt: {
2622
+ sql: "s.startedAt",
2623
+ parameterType: "timestamp"
2624
+ },
2625
+ endedAt: {
2626
+ sql: "s.endedAt",
2627
+ parameterType: "timestamp"
2628
+ },
2629
+ durationMs: {
2630
+ sql: "s.durationMs",
2631
+ parameterType: "scalar"
2632
+ },
2633
+ status: {
2634
+ sql: "s.status",
2635
+ parameterType: "scalar"
2636
+ },
2605
2637
  error: {
2606
2638
  sql: "s.error",
2607
2639
  parameterType: "scalar"
2640
+ },
2641
+ entityType: {
2642
+ sql: "s.entityType",
2643
+ parameterType: "scalar"
2644
+ },
2645
+ entityId: {
2646
+ sql: "s.entityId",
2647
+ parameterType: "scalar"
2648
+ },
2649
+ entityName: {
2650
+ sql: "s.entityName",
2651
+ parameterType: "scalar"
2652
+ },
2653
+ entityVersionId: {
2654
+ sql: "s.entityVersionId",
2655
+ parameterType: "scalar"
2656
+ },
2657
+ parentEntityVersionId: {
2658
+ sql: "s.parentEntityVersionId",
2659
+ parameterType: "scalar"
2660
+ },
2661
+ rootEntityVersionId: {
2662
+ sql: "s.rootEntityVersionId",
2663
+ parameterType: "scalar"
2608
2664
  }
2609
2665
  };
2610
2666
  const SCORE_FIELDS = {
@@ -2612,9 +2668,37 @@ const SCORE_FIELDS = {
2612
2668
  sql: "s.scorerId",
2613
2669
  parameterType: "scalar"
2614
2670
  },
2671
+ scorerVersion: {
2672
+ sql: "s.scorerVersion",
2673
+ parameterType: "scalar"
2674
+ },
2675
+ scoreSource: {
2676
+ sql: "s.scoreSource",
2677
+ parameterType: "scalar"
2678
+ },
2615
2679
  score: {
2616
2680
  sql: "s.score",
2617
2681
  parameterType: "scalar"
2682
+ },
2683
+ timestamp: {
2684
+ sql: "s.timestamp",
2685
+ parameterType: "timestamp"
2686
+ },
2687
+ spanId: {
2688
+ sql: "s.spanId",
2689
+ parameterType: "scalar"
2690
+ },
2691
+ entityVersionId: {
2692
+ sql: "s.entityVersionId",
2693
+ parameterType: "scalar"
2694
+ },
2695
+ parentEntityVersionId: {
2696
+ sql: "s.parentEntityVersionId",
2697
+ parameterType: "scalar"
2698
+ },
2699
+ rootEntityVersionId: {
2700
+ sql: "s.rootEntityVersionId",
2701
+ parameterType: "scalar"
2618
2702
  }
2619
2703
  };
2620
2704
  const TRACE_SELECT = `
@@ -2636,12 +2720,15 @@ function fieldDefinition(registry, field) {
2636
2720
  function parameterSql(type) {
2637
2721
  return type === "timestamp" ? "CAST(? AS TIMESTAMP)" : "?";
2638
2722
  }
2639
- function compileScalarPredicate(predicate, registry) {
2723
+ function isMetadataField(field) {
2724
+ return field.startsWith("metadata.");
2725
+ }
2726
+ function compileScalarPredicate(predicate, registry, allowMetadata = false) {
2640
2727
  if (predicate.type === "boolean") {
2641
2728
  const values = [];
2642
2729
  return {
2643
2730
  sql: predicate.args.map((arg) => {
2644
- const compiled = compileScalarPredicate(arg, registry);
2731
+ const compiled = compileScalarPredicate(arg, registry, allowMetadata);
2645
2732
  values.push(...compiled.values);
2646
2733
  return `(${compiled.sql})`;
2647
2734
  }).join(predicate.operator === "and" ? " AND " : " OR "),
@@ -2649,26 +2736,45 @@ function compileScalarPredicate(predicate, registry) {
2649
2736
  };
2650
2737
  }
2651
2738
  if (predicate.type === "not") {
2652
- const compiled = compileScalarPredicate(predicate.arg, registry);
2739
+ const compiled = compileScalarPredicate(predicate.arg, registry, allowMetadata);
2653
2740
  return {
2654
2741
  sql: `NOT (${compiled.sql})`,
2655
2742
  values: compiled.values
2656
2743
  };
2657
2744
  }
2658
- const field = fieldDefinition(registry, predicate.field);
2745
+ let field;
2746
+ let fieldValues = [];
2747
+ if (isMetadataField(predicate.field)) {
2748
+ if (!allowMetadata) throw new Error(`Unsupported trusted trace-query field: ${predicate.field}`);
2749
+ const key = predicate.field.slice(9);
2750
+ const path = `$.${JSON.stringify(key)}`;
2751
+ field = {
2752
+ sql: `NULLIF(trim(CASE WHEN json_type(r.metadata, ?) = 'VARCHAR' THEN json_extract_string(r.metadata, ?) END), '')`,
2753
+ parameterType: "scalar"
2754
+ };
2755
+ fieldValues = [path, path];
2756
+ } else field = fieldDefinition(registry, predicate.field);
2659
2757
  if (predicate.type === "presence") return {
2660
2758
  sql: `${field.sql} IS ${predicate.operator === "exists" ? "NOT " : ""}NULL`,
2661
- values: []
2759
+ values: fieldValues
2662
2760
  };
2663
2761
  if (predicate.type === "membership") {
2664
2762
  const list = predicate.values.map(() => parameterSql(field.parameterType)).join(", ");
2665
2763
  if (predicate.operator === "in") return {
2666
2764
  sql: `${field.sql} IS NOT NULL AND ${field.sql} IN (${list})`,
2667
- values: predicate.values
2765
+ values: [
2766
+ ...fieldValues,
2767
+ ...fieldValues,
2768
+ ...predicate.values
2769
+ ]
2668
2770
  };
2669
2771
  return {
2670
2772
  sql: `${field.sql} IS NULL OR ${field.sql} NOT IN (${list})`,
2671
- values: predicate.values
2773
+ values: [
2774
+ ...fieldValues,
2775
+ ...fieldValues,
2776
+ ...predicate.values
2777
+ ]
2672
2778
  };
2673
2779
  }
2674
2780
  const parameter = parameterSql(field.parameterType);
@@ -2680,17 +2786,21 @@ function compileScalarPredicate(predicate, registry) {
2680
2786
  };
2681
2787
  if (predicate.operator === "eq") return {
2682
2788
  sql: `${field.sql} IS NOT DISTINCT FROM ${parameter}`,
2683
- values: [predicate.value]
2789
+ values: [...fieldValues, predicate.value]
2684
2790
  };
2685
2791
  if (predicate.operator === "ne") return {
2686
2792
  sql: `${field.sql} IS DISTINCT FROM ${parameter}`,
2687
- values: [predicate.value]
2793
+ values: [...fieldValues, predicate.value]
2688
2794
  };
2689
2795
  const operator = operators[predicate.operator];
2690
2796
  if (operator === void 0) throw new Error(`Unsupported trusted trace-query operator: ${predicate.operator}`);
2691
2797
  return {
2692
2798
  sql: `${field.sql} IS NOT NULL AND ${field.sql} ${operator} ${parameter}`,
2693
- values: [predicate.value]
2799
+ values: [
2800
+ ...fieldValues,
2801
+ ...fieldValues,
2802
+ predicate.value
2803
+ ]
2694
2804
  };
2695
2805
  }
2696
2806
  function compilePredicate(predicate) {
@@ -2726,7 +2836,7 @@ function compilePredicate(predicate) {
2726
2836
  values: compiled.values
2727
2837
  };
2728
2838
  }
2729
- return compileScalarPredicate(predicate, TRACE_FIELDS);
2839
+ return compileScalarPredicate(predicate, TRACE_FIELDS, true);
2730
2840
  }
2731
2841
  function collectRelatedCollections(predicate, collections = /* @__PURE__ */ new Set()) {
2732
2842
  if (!predicate) return collections;
@@ -2775,18 +2885,43 @@ function compileDuckDBTraceQuery(plan) {
2775
2885
  AND r.startedAt < CAST(? AS TIMESTAMP)
2776
2886
  )`
2777
2887
  ];
2778
- if (relatedCollections.has("spans")) ctes.push(`current_spans AS (
2779
- SELECT * EXCLUDE (currentRank)
2780
- FROM (
2781
- SELECT
2782
- e.*,
2783
- row_number() OVER (
2784
- PARTITION BY e.traceId, e.spanId
2785
- ORDER BY CASE WHEN e.endedAt IS NULL THEN 1 ELSE 0 END ASC, e.cursorId DESC
2786
- ) AS currentRank
2787
- FROM span_events e
2788
- INNER JOIN root_scope roots ON roots.traceId = e.traceId
2789
- )
2888
+ if (relatedCollections.has("spans")) ctes.push(`current_span_rows AS (
2889
+ SELECT
2890
+ e.*,
2891
+ coalesce(
2892
+ min(e.timestamp) FILTER (WHERE e.eventType = 'start') OVER (PARTITION BY e.traceId, e.spanId),
2893
+ min(e.timestamp) OVER (PARTITION BY e.traceId, e.spanId)
2894
+ ) AS startedAt,
2895
+ row_number() OVER (
2896
+ PARTITION BY e.traceId, e.spanId
2897
+ ORDER BY CASE WHEN e.endedAt IS NULL THEN 1 ELSE 0 END ASC, e.cursorId DESC
2898
+ ) AS currentRank
2899
+ FROM span_events e
2900
+ INNER JOIN root_scope roots ON roots.traceId = e.traceId
2901
+ ),
2902
+ current_spans AS (
2903
+ SELECT
2904
+ traceId,
2905
+ name,
2906
+ spanType,
2907
+ CASE
2908
+ WHEN json_type(attributes, '$.model') = 'VARCHAR' THEN json_extract_string(attributes, '$.model')
2909
+ END AS model,
2910
+ CASE
2911
+ WHEN json_type(attributes, '$.provider') = 'VARCHAR' THEN json_extract_string(attributes, '$.provider')
2912
+ END AS provider,
2913
+ startedAt,
2914
+ endedAt,
2915
+ date_diff('millisecond', startedAt, endedAt) AS durationMs,
2916
+ CASE WHEN error IS NOT NULL THEN 'error' ELSE 'success' END AS status,
2917
+ error,
2918
+ entityType,
2919
+ entityId,
2920
+ entityName,
2921
+ entityVersionId,
2922
+ parentEntityVersionId,
2923
+ rootEntityVersionId
2924
+ FROM current_span_rows
2790
2925
  WHERE currentRank = 1
2791
2926
  )`);
2792
2927
  if (relatedCollections.has("scores")) ctes.push(`current_scores AS (
@@ -2891,6 +3026,8 @@ const COLUMNS_SQL = [
2891
3026
  "entityId",
2892
3027
  "entityName",
2893
3028
  "entityVersionId",
3029
+ "parentEntityVersionId",
3030
+ "rootEntityVersionId",
2894
3031
  "userId",
2895
3032
  "organizationId",
2896
3033
  "resourceId",
@@ -2933,6 +3070,8 @@ const SPAN_RECONSTRUCT_SELECT = `
2933
3070
  ${argMaxNonNull("entityId")},
2934
3071
  ${argMaxNonNull("entityName")},
2935
3072
  ${argMaxNonNull("entityVersionId")},
3073
+ ${argMaxNonNull("parentEntityVersionId")},
3074
+ ${argMaxNonNull("rootEntityVersionId")},
2936
3075
  ${argMaxNonNull("userId")},
2937
3076
  ${argMaxNonNull("organizationId")},
2938
3077
  ${argMaxNonNull("resourceId")},
@@ -3100,6 +3239,8 @@ function rowToSpanRecord(row) {
3100
3239
  entityId: row.entityId ?? null,
3101
3240
  entityName: row.entityName ?? null,
3102
3241
  entityVersionId: row.entityVersionId ?? null,
3242
+ parentEntityVersionId: row.parentEntityVersionId ?? null,
3243
+ rootEntityVersionId: row.rootEntityVersionId ?? null,
3103
3244
  userId: row.userId ?? null,
3104
3245
  organizationId: row.organizationId ?? null,
3105
3246
  resourceId: row.resourceId ?? null,
@@ -3255,6 +3396,8 @@ function toValuesTuple(row) {
3255
3396
  v(row.entityId),
3256
3397
  v(row.entityName),
3257
3398
  v(row.entityVersionId),
3399
+ v(row.parentEntityVersionId),
3400
+ v(row.rootEntityVersionId),
3258
3401
  v(row.userId),
3259
3402
  v(row.organizationId),
3260
3403
  v(row.resourceId),
@@ -3297,6 +3440,8 @@ function createStartSpanRow(s) {
3297
3440
  entityId: s.entityId ?? null,
3298
3441
  entityName: s.entityName ?? null,
3299
3442
  entityVersionId: s.entityVersionId ?? null,
3443
+ parentEntityVersionId: s.parentEntityVersionId ?? null,
3444
+ rootEntityVersionId: s.rootEntityVersionId ?? null,
3300
3445
  userId: s.userId ?? null,
3301
3446
  organizationId: s.organizationId ?? null,
3302
3447
  resourceId: s.resourceId ?? null,
@@ -3334,6 +3479,8 @@ function createEndSpanRow(s) {
3334
3479
  entityId: s.entityId ?? null,
3335
3480
  entityName: s.entityName ?? null,
3336
3481
  entityVersionId: s.entityVersionId ?? null,
3482
+ parentEntityVersionId: s.parentEntityVersionId ?? null,
3483
+ rootEntityVersionId: s.rootEntityVersionId ?? null,
3337
3484
  userId: s.userId ?? null,
3338
3485
  organizationId: s.organizationId ?? null,
3339
3486
  resourceId: s.resourceId ?? null,
@@ -4246,4 +4393,4 @@ var ObservabilityStorageDuckDB = class extends ObservabilityStorage {
4246
4393
  //#endregion
4247
4394
  export { ObservabilityStorageDuckDB };
4248
4395
 
4249
- //# sourceMappingURL=observability-Bt92lKRG.js.map
4396
+ //# sourceMappingURL=observability-CgtrnaKz.js.map