@mastra/pg 1.23.1-alpha.0 → 1.24.0-alpha.1

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-pg
3
3
  description: Documentation for @mastra/pg. Use when working with @mastra/pg APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/pg"
6
- version: "1.23.1-alpha.0"
6
+ version: "1.24.0-alpha.1"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.23.1-alpha.0",
2
+ "version": "1.24.0-alpha.1",
3
3
  "package": "@mastra/pg",
4
4
  "exports": {},
5
5
  "modules": {}
package/dist/index.cjs CHANGED
@@ -7108,6 +7108,12 @@ var ExperimentsPG = class ExperimentsPG extends _mastra_core_storage.Experiments
7108
7108
  name: "idx_experiment_results_org_project",
7109
7109
  table: _mastra_core_storage.TABLE_EXPERIMENT_RESULTS,
7110
7110
  columns: ["organizationId", "projectId"]
7111
+ },
7112
+ {
7113
+ name: "idx_experiment_results_tags_gin",
7114
+ table: _mastra_core_storage.TABLE_EXPERIMENT_RESULTS,
7115
+ columns: ["tags"],
7116
+ method: "gin"
7111
7117
  }
7112
7118
  ];
7113
7119
  }
@@ -7716,6 +7722,10 @@ var ExperimentsPG = class ExperimentsPG extends _mastra_core_storage.Experiments
7716
7722
  conditions.push(`"status" = $${paramIndex++}`);
7717
7723
  queryParams.push(args.status);
7718
7724
  }
7725
+ for (const tag of args.tags ?? []) {
7726
+ conditions.push(`"tags" @> $${paramIndex++}::jsonb`);
7727
+ queryParams.push(JSON.stringify([tag]));
7728
+ }
7719
7729
  if (args.filters) {
7720
7730
  const { organizationId, projectId } = args.filters;
7721
7731
  if (organizationId !== void 0) {
@@ -17081,12 +17091,32 @@ const TRACE_FIELDS = {
17081
17091
  status: TRACE_STATUS_SQL
17082
17092
  };
17083
17093
  const SPAN_FIELDS = {
17094
+ name: "s.\"name\"",
17084
17095
  spanType: "s.\"spanType\"",
17085
- error: "s.\"error\""
17096
+ model: "s.\"model\"",
17097
+ provider: "s.\"provider\"",
17098
+ startedAt: "s.\"startedAt\"",
17099
+ endedAt: "s.\"endedAt\"",
17100
+ durationMs: "s.\"durationMs\"",
17101
+ status: "s.\"status\"",
17102
+ error: "s.\"error\"",
17103
+ entityType: "s.\"entityType\"",
17104
+ entityId: "s.\"entityId\"",
17105
+ entityName: "s.\"entityName\"",
17106
+ entityVersionId: "s.\"entityVersionId\"",
17107
+ parentEntityVersionId: "s.\"parentEntityVersionId\"",
17108
+ rootEntityVersionId: "s.\"rootEntityVersionId\""
17086
17109
  };
17087
17110
  const SCORE_FIELDS = {
17088
17111
  scorerId: "s.\"scorerId\"",
17089
- score: "s.\"score\""
17112
+ scorerVersion: "s.\"scorerVersion\"",
17113
+ scoreSource: "s.\"scoreSource\"",
17114
+ score: "s.\"score\"",
17115
+ timestamp: "s.\"timestamp\"",
17116
+ spanId: "s.\"spanId\"",
17117
+ entityVersionId: "s.\"entityVersionId\"",
17118
+ parentEntityVersionId: "s.\"parentEntityVersionId\"",
17119
+ rootEntityVersionId: "s.\"rootEntityVersionId\""
17090
17120
  };
17091
17121
  const TRACE_SELECT = `
17092
17122
  r."traceId" AS "traceId",
@@ -17104,15 +17134,18 @@ function fieldSql(registry, field) {
17104
17134
  if (sql === void 0) throw new Error(`Unsupported trusted trace-query field: ${field}`);
17105
17135
  return sql;
17106
17136
  }
17137
+ function isMetadataField(field) {
17138
+ return field.startsWith("metadata.");
17139
+ }
17107
17140
  function placeholders(values, offset) {
17108
17141
  return values.map((_, index) => `$${offset + index}`).join(", ");
17109
17142
  }
17110
- function compileScalarPredicate(predicate, registry, parameterOffset) {
17143
+ function compileScalarPredicate(predicate, registry, parameterOffset, allowMetadata = false) {
17111
17144
  if (predicate.type === "boolean") {
17112
17145
  const values = [];
17113
17146
  return {
17114
17147
  sql: predicate.args.map((arg) => {
17115
- const compiled = compileScalarPredicate(arg, registry, parameterOffset + values.length);
17148
+ const compiled = compileScalarPredicate(arg, registry, parameterOffset + values.length, allowMetadata);
17116
17149
  values.push(...compiled.values);
17117
17150
  return `(${compiled.sql})`;
17118
17151
  }).join(predicate.operator === "and" ? " AND " : " OR "),
@@ -17120,26 +17153,36 @@ function compileScalarPredicate(predicate, registry, parameterOffset) {
17120
17153
  };
17121
17154
  }
17122
17155
  if (predicate.type === "not") {
17123
- const compiled = compileScalarPredicate(predicate.arg, registry, parameterOffset);
17156
+ const compiled = compileScalarPredicate(predicate.arg, registry, parameterOffset, allowMetadata);
17124
17157
  return {
17125
17158
  sql: `NOT (${compiled.sql})`,
17126
17159
  values: compiled.values
17127
17160
  };
17128
17161
  }
17129
- const field = fieldSql(registry, predicate.field);
17162
+ let field;
17163
+ let fieldValues = [];
17164
+ if (isMetadataField(predicate.field)) {
17165
+ if (!allowMetadata) throw new Error(`Unsupported trusted trace-query field: ${predicate.field}`);
17166
+ const keyParameter = `$${parameterOffset++}`;
17167
+ field = `COALESCE(
17168
+ CASE WHEN jsonb_typeof(r."metadataSearch" -> ${keyParameter}) = 'string' THEN r."metadataSearch" ->> ${keyParameter} END,
17169
+ CASE WHEN jsonb_typeof(r."metadataRaw" -> ${keyParameter}) = 'string' THEN NULLIF(btrim(r."metadataRaw" ->> ${keyParameter}), '') END
17170
+ )`;
17171
+ fieldValues = [predicate.field.slice(9)];
17172
+ } else field = fieldSql(registry, predicate.field);
17130
17173
  if (predicate.type === "presence") return {
17131
17174
  sql: `${field} IS ${predicate.operator === "exists" ? "NOT " : ""}NULL`,
17132
- values: []
17175
+ values: fieldValues
17133
17176
  };
17134
17177
  if (predicate.type === "membership") {
17135
17178
  const list = placeholders(predicate.values, parameterOffset);
17136
17179
  if (predicate.operator === "in") return {
17137
17180
  sql: `${field} IS NOT NULL AND ${field} IN (${list})`,
17138
- values: predicate.values
17181
+ values: [...fieldValues, ...predicate.values]
17139
17182
  };
17140
17183
  return {
17141
17184
  sql: `${field} IS NULL OR ${field} NOT IN (${list})`,
17142
- values: predicate.values
17185
+ values: [...fieldValues, ...predicate.values]
17143
17186
  };
17144
17187
  }
17145
17188
  const parameter = `$${parameterOffset}`;
@@ -17151,17 +17194,17 @@ function compileScalarPredicate(predicate, registry, parameterOffset) {
17151
17194
  };
17152
17195
  if (predicate.operator === "eq") return {
17153
17196
  sql: `${field} IS NOT DISTINCT FROM ${parameter}`,
17154
- values: [predicate.value]
17197
+ values: [...fieldValues, predicate.value]
17155
17198
  };
17156
17199
  if (predicate.operator === "ne") return {
17157
17200
  sql: `${field} IS DISTINCT FROM ${parameter}`,
17158
- values: [predicate.value]
17201
+ values: [...fieldValues, predicate.value]
17159
17202
  };
17160
17203
  const operator = operators[predicate.operator];
17161
17204
  if (operator === void 0) throw new Error(`Unsupported trusted trace-query operator: ${predicate.operator}`);
17162
17205
  return {
17163
17206
  sql: `${field} IS NOT NULL AND ${field} ${operator} ${parameter}`,
17164
- values: [predicate.value]
17207
+ values: [...fieldValues, predicate.value]
17165
17208
  };
17166
17209
  }
17167
17210
  function latestRootPredicate$1(spanTable) {
@@ -17226,7 +17269,7 @@ function compilePredicate(predicate, parameterOffset) {
17226
17269
  values: compiled.values
17227
17270
  };
17228
17271
  }
17229
- return compileScalarPredicate(predicate, TRACE_FIELDS, parameterOffset);
17272
+ return compileScalarPredicate(predicate, TRACE_FIELDS, parameterOffset, true);
17230
17273
  }
17231
17274
  function compilePostgresTraceQuery(schema, plan) {
17232
17275
  const spanTable = qualifiedTable(schema, TABLE_SPAN_EVENTS);
@@ -17246,14 +17289,43 @@ function compilePostgresTraceQuery(schema, plan) {
17246
17289
  ].join("\n AND ")}
17247
17290
  )`];
17248
17291
  if (relationCollections.has("spans")) ctes.push(`current_spans AS MATERIALIZED (
17249
- SELECT s."traceId", s."spanType", s."error"
17292
+ SELECT
17293
+ s."traceId",
17294
+ s."name",
17295
+ s."spanType",
17296
+ CASE WHEN jsonb_typeof(s."attributes" -> 'model') = 'string' THEN s."attributes" ->> 'model' END AS "model",
17297
+ CASE WHEN jsonb_typeof(s."attributes" -> 'provider') = 'string' THEN s."attributes" ->> 'provider' END AS "provider",
17298
+ s."startedAt",
17299
+ CASE WHEN s."isPending" THEN NULL ELSE s."endedAt" END AS "endedAt",
17300
+ CASE
17301
+ WHEN s."isPending" THEN NULL
17302
+ ELSE EXTRACT(EPOCH FROM (s."endedAt" - s."startedAt")) * 1000
17303
+ END AS "durationMs",
17304
+ CASE WHEN s."error" IS NOT NULL THEN 'error' ELSE 'success' END AS "status",
17305
+ s."error",
17306
+ s."entityType",
17307
+ s."entityId",
17308
+ s."entityName",
17309
+ s."entityVersionId",
17310
+ s."parentEntityVersionId",
17311
+ s."rootEntityVersionId"
17250
17312
  FROM ${spanTable} s
17251
17313
  WHERE s."traceId" IS NOT NULL
17252
17314
  AND s."traceId" IN (SELECT "traceId" FROM root_scope)
17253
17315
  AND ${latestSpanPredicate$1(spanTable)}
17254
17316
  )`);
17255
17317
  if (relationCollections.has("scores")) ctes.push(`current_scores AS MATERIALIZED (
17256
- SELECT s."traceId", s."scorerId", s."score"
17318
+ SELECT
17319
+ s."traceId",
17320
+ s."spanId",
17321
+ s."timestamp",
17322
+ s."scorerId",
17323
+ s."scorerVersion",
17324
+ s."scoreSource",
17325
+ s."score",
17326
+ s."entityVersionId",
17327
+ s."parentEntityVersionId",
17328
+ s."rootEntityVersionId"
17257
17329
  FROM ${scoreTable} s
17258
17330
  WHERE s."traceId" IS NOT NULL
17259
17331
  AND s."traceId" IN (SELECT "traceId" FROM root_scope)