@mastra/duckdb 1.10.0-alpha.1 → 1.10.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.
@@ -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.10.0-alpha.1"
6
+ version: "1.10.0-alpha.3"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.10.0-alpha.1",
2
+ "version": "1.10.0-alpha.3",
3
3
  "package": "@mastra/duckdb",
4
4
  "exports": {},
5
5
  "modules": {}
package/dist/index.cjs CHANGED
@@ -532,7 +532,7 @@ var ObservabilityStorageDuckDB = class extends _mastra_core_storage.Observabilit
532
532
  async loadDelegate() {
533
533
  if (this.delegate) return this.delegate;
534
534
  if (this.unavailableError) return null;
535
- if (!this.loadPromise) this.loadPromise = Promise.resolve().then(() => require("./observability-CL_Bv53d.cjs")).then(({ ObservabilityStorageDuckDB }) => {
535
+ if (!this.loadPromise) this.loadPromise = Promise.resolve().then(() => require("./observability-POEhuHwk.cjs")).then(({ ObservabilityStorageDuckDB }) => {
536
536
  const delegate = new ObservabilityStorageDuckDB({ db: this.db });
537
537
  this.delegate = delegate;
538
538
  return delegate;
package/dist/index.js CHANGED
@@ -531,7 +531,7 @@ var ObservabilityStorageDuckDB = class extends ObservabilityStorage {
531
531
  async loadDelegate() {
532
532
  if (this.delegate) return this.delegate;
533
533
  if (this.unavailableError) return null;
534
- if (!this.loadPromise) this.loadPromise = import("./observability-W6La6xQK.js").then(({ ObservabilityStorageDuckDB }) => {
534
+ if (!this.loadPromise) this.loadPromise = import("./observability-D3311DPa.js").then(({ ObservabilityStorageDuckDB }) => {
535
535
  const delegate = new ObservabilityStorageDuckDB({ db: this.db });
536
536
  this.delegate = delegate;
537
537
  return delegate;
@@ -2420,7 +2420,13 @@ async function createScore(db, args) {
2420
2420
  /** Insert multiple score events in a single statement. */
2421
2421
  async function batchCreateScores(db, args) {
2422
2422
  if (args.scores.length === 0) return;
2423
- const tuples = args.scores.map((s) => {
2423
+ const currentScores = /* @__PURE__ */ new Map();
2424
+ for (const score of args.scores) {
2425
+ const key = score.scoreId ?? Symbol();
2426
+ currentScores.delete(key);
2427
+ currentScores.set(key, score);
2428
+ }
2429
+ const tuples = [...currentScores.values()].map((s) => {
2424
2430
  const legacyScore = s;
2425
2431
  const scoreSource = legacyScore.scoreSource ?? legacyScore.source ?? null;
2426
2432
  return `(${[
@@ -3160,7 +3166,7 @@ function compileDuckDBTraceQuery(plan) {
3160
3166
  }
3161
3167
  const ctes = compileDuckDBTraceScope(collectRelatedCollections(plan.where));
3162
3168
  ctes.push(`candidates AS (
3163
- SELECT ${TRACE_SELECT}
3169
+ SELECT ${TRACE_SELECT}${plan.paginationMode === "delta" ? ", r.cursorId AS deltaWatermark" : ""}
3164
3170
  FROM root_scope r
3165
3171
  WHERE ${conditions.slice(3).join("\n AND ") || "TRUE"}
3166
3172
  )`);
@@ -3180,8 +3186,49 @@ LIMIT ?`,
3180
3186
  values
3181
3187
  };
3182
3188
  }
3189
+ if (plan.paginationMode === "delta") {
3190
+ const watermark = coreStorage.getTraceQueryDeltaWatermark(plan, "duckdb");
3191
+ if (watermark !== void 0 && (!/^\d+$/.test(watermark) || BigInt(watermark) > 9223372036854775807n)) throw new coreStorage.TraceQueryCursorError("TRACE_QUERY_CURSOR_MALFORMED");
3192
+ values.push(watermark ?? "0", plan.limit + 1);
3193
+ return {
3194
+ sql: `${candidates},
3195
+ delta_head AS (SELECT coalesce(max(cursorId), 0) AS streamHead FROM root_events),
3196
+ delta_rows AS (
3197
+ SELECT * FROM candidates
3198
+ WHERE deltaWatermark > CAST(? AS BIGINT) ${watermark === void 0 ? "AND FALSE" : ""}
3199
+ ORDER BY deltaWatermark ASC, traceId ASC
3200
+ LIMIT ?
3201
+ )
3202
+ SELECT delta_rows.*, delta_head.streamHead
3203
+ FROM delta_head
3204
+ LEFT JOIN delta_rows ON TRUE
3205
+ ORDER BY delta_rows.deltaWatermark ASC NULLS LAST, delta_rows.traceId ASC`,
3206
+ values
3207
+ };
3208
+ }
3183
3209
  const orderField = plan.orderBy.field;
3184
3210
  const direction = plan.orderBy.direction === "asc" ? "ASC" : "DESC";
3211
+ if (plan.paginationMode === "page") {
3212
+ values.push(plan.perPage, plan.page * plan.perPage);
3213
+ return {
3214
+ sql: `${candidates},
3215
+ page_rows AS (
3216
+ SELECT *, row_number() OVER (ORDER BY ${orderField} ${direction}, traceId ASC) AS __row_position
3217
+ FROM candidates
3218
+ ORDER BY ${orderField} ${direction}, traceId ASC
3219
+ LIMIT ? OFFSET ?
3220
+ ),
3221
+ page_total AS (
3222
+ SELECT COUNT(*) AS total
3223
+ FROM candidates
3224
+ )
3225
+ SELECT page_rows.*, page_total.total${deltaPollingFeatureEnabled() ? ", (SELECT coalesce(max(cursorId), 0) FROM root_events) AS streamHead" : ""}
3226
+ FROM page_total
3227
+ LEFT JOIN page_rows ON TRUE
3228
+ ORDER BY page_rows.__row_position ASC NULLS LAST`,
3229
+ values
3230
+ };
3231
+ }
3185
3232
  let pageCondition = "";
3186
3233
  if (plan.cursor) {
3187
3234
  pageCondition = `WHERE (${orderField} ${plan.orderBy.direction === "asc" ? ">" : "<"} CAST(? AS TIMESTAMP) OR (${orderField} = CAST(? AS TIMESTAMP) AND traceId > ?))`;
@@ -3344,9 +3391,44 @@ function asIsoTimestamp(value) {
3344
3391
  return value instanceof Date ? value.toISOString() : new Date(value).toISOString();
3345
3392
  }
3346
3393
  async function queryTraces(db, plan) {
3394
+ if (plan.paginationMode === "delta") assertDeltaPollingEnabled();
3395
+ if (plan.paginationMode === "page") {
3396
+ const query = compileDuckDBTraceQuery(plan);
3397
+ const rows = await db.query(query.sql, query.values);
3398
+ const total = Number(rows[0]?.total ?? 0);
3399
+ const traces = rows.filter((row) => row.traceId != null).map((row) => ({
3400
+ traceId: String(row.traceId),
3401
+ rootSpanId: String(row.rootSpanId),
3402
+ name: row.name,
3403
+ entityId: row.entityId ?? null,
3404
+ parentSpanId: row.parentSpanId ?? null,
3405
+ createdAt: asIsoTimestamp(row.startedAt),
3406
+ metadata: parseJson(row.metadata) ?? null,
3407
+ inputPreview: coreStorage.buildInputPreview(row.input) ?? null,
3408
+ threadId: row.threadId == null ? null : String(row.threadId),
3409
+ resourceId: row.resourceId == null ? null : String(row.resourceId),
3410
+ startedAt: asIsoTimestamp(row.startedAt),
3411
+ endedAt: asIsoTimestamp(row.endedAt),
3412
+ entityName: row.entityName == null ? null : String(row.entityName),
3413
+ entityType: row.entityType == null ? null : String(row.entityType),
3414
+ environment: row.environment == null ? null : String(row.environment),
3415
+ status: row.status
3416
+ }));
3417
+ return coreStorage.traceQueryResponseSchema.parse({
3418
+ traces,
3419
+ ...deltaPollingFeatureEnabled() && typeof coreStorage.encodeTraceQueryDeltaCursor === "function" ? { deltaCursor: coreStorage.encodeTraceQueryDeltaCursor(plan, "duckdb", String(rows[0]?.streamHead ?? 0)) } : {},
3420
+ pagination: {
3421
+ total,
3422
+ page: plan.page,
3423
+ perPage: plan.perPage,
3424
+ hasMore: (plan.page + 1) * plan.perPage < total
3425
+ }
3426
+ });
3427
+ }
3347
3428
  const query = compileDuckDBTraceQuery(plan);
3348
3429
  const rows = await db.query(query.sql, query.values);
3349
- const visibleRows = rows.slice(0, plan.limit);
3430
+ const matchingRows = plan.paginationMode === "delta" ? rows.filter((row) => row.traceId != null) : rows;
3431
+ const visibleRows = matchingRows.slice(0, plan.limit);
3350
3432
  if (plan.result === "groups") {
3351
3433
  const groups = visibleRows.map((row) => ({ threadId: String(row.threadId) }));
3352
3434
  const last = groups.at(-1);
@@ -3376,6 +3458,19 @@ async function queryTraces(db, plan) {
3376
3458
  environment: row.environment == null ? null : String(row.environment),
3377
3459
  status: row.status
3378
3460
  }));
3461
+ if (plan.paginationMode === "delta") {
3462
+ const previous = coreStorage.getTraceQueryDeltaWatermark(plan, "duckdb") ?? "0";
3463
+ const head = String(rows[0]?.streamHead ?? 0);
3464
+ const watermark = visibleRows.length ? String(visibleRows.at(-1).deltaWatermark) : BigInt(head) > BigInt(previous) ? head : previous;
3465
+ return coreStorage.traceQueryResponseSchema.parse({
3466
+ traces,
3467
+ delta: {
3468
+ limit: plan.limit,
3469
+ hasMore: matchingRows.length > plan.limit
3470
+ },
3471
+ deltaCursor: coreStorage.encodeTraceQueryDeltaCursor(plan, "duckdb", watermark)
3472
+ });
3473
+ }
3379
3474
  const last = traces.at(-1);
3380
3475
  return coreStorage.traceQueryResponseSchema.parse({
3381
3476
  traces,
@@ -4850,4 +4945,4 @@ var ObservabilityStorageDuckDB = class ObservabilityStorageDuckDB extends Observ
4850
4945
  //#endregion
4851
4946
  export { ObservabilityStorageDuckDB };
4852
4947
 
4853
- //# sourceMappingURL=observability-W6La6xQK.js.map
4948
+ //# sourceMappingURL=observability-D3311DPa.js.map