@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.
package/dist/index.js CHANGED
@@ -7084,6 +7084,12 @@ var ExperimentsPG = class ExperimentsPG extends ExperimentsStorage {
7084
7084
  name: "idx_experiment_results_org_project",
7085
7085
  table: TABLE_EXPERIMENT_RESULTS,
7086
7086
  columns: ["organizationId", "projectId"]
7087
+ },
7088
+ {
7089
+ name: "idx_experiment_results_tags_gin",
7090
+ table: TABLE_EXPERIMENT_RESULTS,
7091
+ columns: ["tags"],
7092
+ method: "gin"
7087
7093
  }
7088
7094
  ];
7089
7095
  }
@@ -7692,6 +7698,10 @@ var ExperimentsPG = class ExperimentsPG extends ExperimentsStorage {
7692
7698
  conditions.push(`"status" = $${paramIndex++}`);
7693
7699
  queryParams.push(args.status);
7694
7700
  }
7701
+ for (const tag of args.tags ?? []) {
7702
+ conditions.push(`"tags" @> $${paramIndex++}::jsonb`);
7703
+ queryParams.push(JSON.stringify([tag]));
7704
+ }
7695
7705
  if (args.filters) {
7696
7706
  const { organizationId, projectId } = args.filters;
7697
7707
  if (organizationId !== void 0) {
@@ -17057,12 +17067,32 @@ const TRACE_FIELDS = {
17057
17067
  status: TRACE_STATUS_SQL
17058
17068
  };
17059
17069
  const SPAN_FIELDS = {
17070
+ name: "s.\"name\"",
17060
17071
  spanType: "s.\"spanType\"",
17061
- error: "s.\"error\""
17072
+ model: "s.\"model\"",
17073
+ provider: "s.\"provider\"",
17074
+ startedAt: "s.\"startedAt\"",
17075
+ endedAt: "s.\"endedAt\"",
17076
+ durationMs: "s.\"durationMs\"",
17077
+ status: "s.\"status\"",
17078
+ error: "s.\"error\"",
17079
+ entityType: "s.\"entityType\"",
17080
+ entityId: "s.\"entityId\"",
17081
+ entityName: "s.\"entityName\"",
17082
+ entityVersionId: "s.\"entityVersionId\"",
17083
+ parentEntityVersionId: "s.\"parentEntityVersionId\"",
17084
+ rootEntityVersionId: "s.\"rootEntityVersionId\""
17062
17085
  };
17063
17086
  const SCORE_FIELDS = {
17064
17087
  scorerId: "s.\"scorerId\"",
17065
- score: "s.\"score\""
17088
+ scorerVersion: "s.\"scorerVersion\"",
17089
+ scoreSource: "s.\"scoreSource\"",
17090
+ score: "s.\"score\"",
17091
+ timestamp: "s.\"timestamp\"",
17092
+ spanId: "s.\"spanId\"",
17093
+ entityVersionId: "s.\"entityVersionId\"",
17094
+ parentEntityVersionId: "s.\"parentEntityVersionId\"",
17095
+ rootEntityVersionId: "s.\"rootEntityVersionId\""
17066
17096
  };
17067
17097
  const TRACE_SELECT = `
17068
17098
  r."traceId" AS "traceId",
@@ -17080,15 +17110,18 @@ function fieldSql(registry, field) {
17080
17110
  if (sql === void 0) throw new Error(`Unsupported trusted trace-query field: ${field}`);
17081
17111
  return sql;
17082
17112
  }
17113
+ function isMetadataField(field) {
17114
+ return field.startsWith("metadata.");
17115
+ }
17083
17116
  function placeholders(values, offset) {
17084
17117
  return values.map((_, index) => `$${offset + index}`).join(", ");
17085
17118
  }
17086
- function compileScalarPredicate(predicate, registry, parameterOffset) {
17119
+ function compileScalarPredicate(predicate, registry, parameterOffset, allowMetadata = false) {
17087
17120
  if (predicate.type === "boolean") {
17088
17121
  const values = [];
17089
17122
  return {
17090
17123
  sql: predicate.args.map((arg) => {
17091
- const compiled = compileScalarPredicate(arg, registry, parameterOffset + values.length);
17124
+ const compiled = compileScalarPredicate(arg, registry, parameterOffset + values.length, allowMetadata);
17092
17125
  values.push(...compiled.values);
17093
17126
  return `(${compiled.sql})`;
17094
17127
  }).join(predicate.operator === "and" ? " AND " : " OR "),
@@ -17096,26 +17129,36 @@ function compileScalarPredicate(predicate, registry, parameterOffset) {
17096
17129
  };
17097
17130
  }
17098
17131
  if (predicate.type === "not") {
17099
- const compiled = compileScalarPredicate(predicate.arg, registry, parameterOffset);
17132
+ const compiled = compileScalarPredicate(predicate.arg, registry, parameterOffset, allowMetadata);
17100
17133
  return {
17101
17134
  sql: `NOT (${compiled.sql})`,
17102
17135
  values: compiled.values
17103
17136
  };
17104
17137
  }
17105
- const field = fieldSql(registry, predicate.field);
17138
+ let field;
17139
+ let fieldValues = [];
17140
+ if (isMetadataField(predicate.field)) {
17141
+ if (!allowMetadata) throw new Error(`Unsupported trusted trace-query field: ${predicate.field}`);
17142
+ const keyParameter = `$${parameterOffset++}`;
17143
+ field = `COALESCE(
17144
+ CASE WHEN jsonb_typeof(r."metadataSearch" -> ${keyParameter}) = 'string' THEN r."metadataSearch" ->> ${keyParameter} END,
17145
+ CASE WHEN jsonb_typeof(r."metadataRaw" -> ${keyParameter}) = 'string' THEN NULLIF(btrim(r."metadataRaw" ->> ${keyParameter}), '') END
17146
+ )`;
17147
+ fieldValues = [predicate.field.slice(9)];
17148
+ } else field = fieldSql(registry, predicate.field);
17106
17149
  if (predicate.type === "presence") return {
17107
17150
  sql: `${field} IS ${predicate.operator === "exists" ? "NOT " : ""}NULL`,
17108
- values: []
17151
+ values: fieldValues
17109
17152
  };
17110
17153
  if (predicate.type === "membership") {
17111
17154
  const list = placeholders(predicate.values, parameterOffset);
17112
17155
  if (predicate.operator === "in") return {
17113
17156
  sql: `${field} IS NOT NULL AND ${field} IN (${list})`,
17114
- values: predicate.values
17157
+ values: [...fieldValues, ...predicate.values]
17115
17158
  };
17116
17159
  return {
17117
17160
  sql: `${field} IS NULL OR ${field} NOT IN (${list})`,
17118
- values: predicate.values
17161
+ values: [...fieldValues, ...predicate.values]
17119
17162
  };
17120
17163
  }
17121
17164
  const parameter = `$${parameterOffset}`;
@@ -17127,17 +17170,17 @@ function compileScalarPredicate(predicate, registry, parameterOffset) {
17127
17170
  };
17128
17171
  if (predicate.operator === "eq") return {
17129
17172
  sql: `${field} IS NOT DISTINCT FROM ${parameter}`,
17130
- values: [predicate.value]
17173
+ values: [...fieldValues, predicate.value]
17131
17174
  };
17132
17175
  if (predicate.operator === "ne") return {
17133
17176
  sql: `${field} IS DISTINCT FROM ${parameter}`,
17134
- values: [predicate.value]
17177
+ values: [...fieldValues, predicate.value]
17135
17178
  };
17136
17179
  const operator = operators[predicate.operator];
17137
17180
  if (operator === void 0) throw new Error(`Unsupported trusted trace-query operator: ${predicate.operator}`);
17138
17181
  return {
17139
17182
  sql: `${field} IS NOT NULL AND ${field} ${operator} ${parameter}`,
17140
- values: [predicate.value]
17183
+ values: [...fieldValues, predicate.value]
17141
17184
  };
17142
17185
  }
17143
17186
  function latestRootPredicate$1(spanTable) {
@@ -17202,7 +17245,7 @@ function compilePredicate(predicate, parameterOffset) {
17202
17245
  values: compiled.values
17203
17246
  };
17204
17247
  }
17205
- return compileScalarPredicate(predicate, TRACE_FIELDS, parameterOffset);
17248
+ return compileScalarPredicate(predicate, TRACE_FIELDS, parameterOffset, true);
17206
17249
  }
17207
17250
  function compilePostgresTraceQuery(schema, plan) {
17208
17251
  const spanTable = qualifiedTable(schema, TABLE_SPAN_EVENTS);
@@ -17222,14 +17265,43 @@ function compilePostgresTraceQuery(schema, plan) {
17222
17265
  ].join("\n AND ")}
17223
17266
  )`];
17224
17267
  if (relationCollections.has("spans")) ctes.push(`current_spans AS MATERIALIZED (
17225
- SELECT s."traceId", s."spanType", s."error"
17268
+ SELECT
17269
+ s."traceId",
17270
+ s."name",
17271
+ s."spanType",
17272
+ CASE WHEN jsonb_typeof(s."attributes" -> 'model') = 'string' THEN s."attributes" ->> 'model' END AS "model",
17273
+ CASE WHEN jsonb_typeof(s."attributes" -> 'provider') = 'string' THEN s."attributes" ->> 'provider' END AS "provider",
17274
+ s."startedAt",
17275
+ CASE WHEN s."isPending" THEN NULL ELSE s."endedAt" END AS "endedAt",
17276
+ CASE
17277
+ WHEN s."isPending" THEN NULL
17278
+ ELSE EXTRACT(EPOCH FROM (s."endedAt" - s."startedAt")) * 1000
17279
+ END AS "durationMs",
17280
+ CASE WHEN s."error" IS NOT NULL THEN 'error' ELSE 'success' END AS "status",
17281
+ s."error",
17282
+ s."entityType",
17283
+ s."entityId",
17284
+ s."entityName",
17285
+ s."entityVersionId",
17286
+ s."parentEntityVersionId",
17287
+ s."rootEntityVersionId"
17226
17288
  FROM ${spanTable} s
17227
17289
  WHERE s."traceId" IS NOT NULL
17228
17290
  AND s."traceId" IN (SELECT "traceId" FROM root_scope)
17229
17291
  AND ${latestSpanPredicate$1(spanTable)}
17230
17292
  )`);
17231
17293
  if (relationCollections.has("scores")) ctes.push(`current_scores AS MATERIALIZED (
17232
- SELECT s."traceId", s."scorerId", s."score"
17294
+ SELECT
17295
+ s."traceId",
17296
+ s."spanId",
17297
+ s."timestamp",
17298
+ s."scorerId",
17299
+ s."scorerVersion",
17300
+ s."scoreSource",
17301
+ s."score",
17302
+ s."entityVersionId",
17303
+ s."parentEntityVersionId",
17304
+ s."rootEntityVersionId"
17233
17305
  FROM ${scoreTable} s
17234
17306
  WHERE s."traceId" IS NOT NULL
17235
17307
  AND s."traceId" IN (SELECT "traceId" FROM root_scope)