@mastra/duckdb 1.19.0-alpha.1 → 1.19.0-alpha.3

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.
@@ -1151,11 +1151,11 @@ function getComparisonDateRange$1(comparePeriod, timestamp) {
1151
1151
  }
1152
1152
  }
1153
1153
  /** Insert a single feedback event. */
1154
- async function createFeedback(db, args) {
1154
+ async function createFeedback(db, args, preserveIdentity = false) {
1155
1155
  const f = args.feedback;
1156
1156
  const feedbackSource = f.feedbackSource ?? f.source ?? "";
1157
1157
  const feedbackUserId = f.feedbackUserId !== void 0 ? f.feedbackUserId : f.userId ?? null;
1158
- await db.execute(`INSERT INTO feedback_events (
1158
+ const sql = `INSERT INTO feedback_events (
1159
1159
  feedbackId, timestamp, cursorId, traceId, spanId, experimentId,
1160
1160
  entityType, entityId, entityName, entityVersionId, parentEntityVersionId, parentEntityType, parentEntityId, parentEntityName, rootEntityVersionId, rootEntityType, rootEntityId, rootEntityName,
1161
1161
  userId, organizationId, resourceId, runId, sessionId, threadId, requestId, environment, executionSource, serviceName,
@@ -1203,12 +1203,25 @@ async function createFeedback(db, args) {
1203
1203
  jsonV(f.metadata),
1204
1204
  jsonV(f.scope ?? null)
1205
1205
  ].join(", ")})
1206
- ${FEEDBACK_UPSERT_CLAUSE}`);
1206
+ ${args.onConflict === "ignore" ? "ON CONFLICT DO NOTHING" : FEEDBACK_UPSERT_CLAUSE}`;
1207
+ if (preserveIdentity) {
1208
+ if (!(await db.query(`${sql}
1209
+ WHERE feedback_events.traceId IS NOT DISTINCT FROM excluded.traceId
1210
+ AND feedback_events.timestamp IS NOT DISTINCT FROM excluded.timestamp
1211
+ AND feedback_events.organizationId IS NOT DISTINCT FROM excluded.organizationId
1212
+ AND feedback_events.resourceId IS NOT DISTINCT FROM excluded.resourceId
1213
+ RETURNING feedbackId`)).length) throw new _mastra_core_error.MastraError({
1214
+ id: "OBSERVABILITY_FEEDBACK_IDENTITY_CONFLICT",
1215
+ domain: _mastra_core_error.ErrorDomain.MASTRA_OBSERVABILITY,
1216
+ category: _mastra_core_error.ErrorCategory.USER,
1217
+ text: "Feedback replacement must preserve its trace, timestamp, and tenant"
1218
+ });
1219
+ } else await db.execute(sql);
1207
1220
  }
1208
1221
  /** Insert multiple feedback events in a single statement. */
1209
1222
  async function batchCreateFeedback(db, args) {
1210
1223
  if (args.feedbacks.length === 0) return;
1211
- const tuples = [...new Map(args.feedbacks.map((feedback) => [feedback.feedbackId, feedback])).values()].map((f) => {
1224
+ const tuples = [...new Map((args.onConflict === "ignore" ? [...args.feedbacks].reverse() : args.feedbacks).map((feedback) => [feedback.feedbackId, feedback])).values()].map((f) => {
1212
1225
  const legacyFeedback = f;
1213
1226
  const feedbackSource = legacyFeedback.feedbackSource ?? legacyFeedback.source ?? "";
1214
1227
  const feedbackUserId = legacyFeedback.feedbackUserId !== void 0 ? legacyFeedback.feedbackUserId : legacyFeedback.userId ?? null;
@@ -1262,7 +1275,7 @@ async function batchCreateFeedback(db, args) {
1262
1275
  feedbackUserId, sourceId, reviewStatus, feedbackSource, feedbackType, value, valueString, valueNumber, comment, tags, metadata, scope
1263
1276
  )
1264
1277
  VALUES ${tuples.join(",\n ")}
1265
- ${FEEDBACK_UPSERT_CLAUSE}`);
1278
+ ${args.onConflict === "ignore" ? "ON CONFLICT DO NOTHING" : FEEDBACK_UPSERT_CLAUSE}`);
1266
1279
  }
1267
1280
  /**
1268
1281
  * Delete feedback events by feedbackId. Optional `organizationId` and
@@ -6372,6 +6385,9 @@ ${args.tables.map((table) => ` - ${table.table}`).join("\n")}\n\nTo fix this, r
6372
6385
  * Uses an append-only event-sourced model with SQL-based reconstruction for spans.
6373
6386
  */
6374
6387
  var ObservabilityStorageDuckDB = class ObservabilityStorageDuckDB extends _mastra_core_storage.ObservabilityStorage {
6388
+ get persistenceLocation() {
6389
+ return "local";
6390
+ }
6375
6391
  static retentionTables = {
6376
6392
  spans: {
6377
6393
  table: "span_events",
@@ -6497,6 +6513,7 @@ var ObservabilityStorageDuckDB = class ObservabilityStorageDuckDB extends _mastr
6497
6513
  "thread-query",
6498
6514
  "trace-query-tenant-scope",
6499
6515
  "feedback",
6516
+ "feedback-replacement",
6500
6517
  "trace-query-context-ids",
6501
6518
  ...require_features.contextFieldFeatures,
6502
6519
  ...require_features.timingFeatures,
@@ -6525,6 +6542,7 @@ var ObservabilityStorageDuckDB = class ObservabilityStorageDuckDB extends _mastr
6525
6542
  "thread-query",
6526
6543
  "trace-query-tenant-scope",
6527
6544
  "feedback",
6545
+ "feedback-replacement",
6528
6546
  "trace-query-context-ids",
6529
6547
  ...require_features.contextFieldFeatures,
6530
6548
  ...require_features.timingFeatures,
@@ -6667,6 +6685,12 @@ var ObservabilityStorageDuckDB = class ObservabilityStorageDuckDB extends _mastr
6667
6685
  async getScorePercentiles(args) {
6668
6686
  return getScorePercentiles(this.db, args);
6669
6687
  }
6688
+ async writeFeedbackReplacement(args) {
6689
+ return createFeedback(this.db, {
6690
+ feedback: args.feedback,
6691
+ onConflict: "replace"
6692
+ }, true);
6693
+ }
6670
6694
  async createFeedback(args) {
6671
6695
  return createFeedback(this.db, args);
6672
6696
  }
@@ -6697,4 +6721,4 @@ var ObservabilityStorageDuckDB = class ObservabilityStorageDuckDB extends _mastr
6697
6721
  };
6698
6722
  exports.ObservabilityStorageDuckDB = ObservabilityStorageDuckDB;
6699
6723
 
6700
- //# sourceMappingURL=observability-YXMSShsG.cjs.map
6724
+ //# sourceMappingURL=observability-DGLhUhwg.cjs.map