@mastra/libsql 0.0.0-structured-output-issue-20260302184919 → 0.0.0-structured-output-errors-20260409185629

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.
Files changed (40) hide show
  1. package/CHANGELOG.md +344 -3
  2. package/LICENSE.md +15 -0
  3. package/dist/docs/SKILL.md +15 -19
  4. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  5. package/dist/docs/references/docs-agents-agent-approval.md +136 -185
  6. package/dist/docs/references/docs-agents-networks.md +90 -207
  7. package/dist/docs/references/docs-memory-memory-processors.md +15 -15
  8. package/dist/docs/references/docs-memory-message-history.md +10 -8
  9. package/dist/docs/references/docs-memory-overview.md +219 -24
  10. package/dist/docs/references/docs-memory-semantic-recall.md +54 -29
  11. package/dist/docs/references/docs-memory-storage.md +14 -16
  12. package/dist/docs/references/docs-memory-working-memory.md +22 -22
  13. package/dist/docs/references/docs-rag-retrieval.md +16 -16
  14. package/dist/docs/references/docs-workflows-snapshots.md +1 -1
  15. package/dist/docs/references/guides-agent-frameworks-ai-sdk.md +3 -3
  16. package/dist/docs/references/reference-core-getMemory.md +4 -5
  17. package/dist/docs/references/reference-core-listMemory.md +3 -4
  18. package/dist/docs/references/reference-core-mastra-class.md +18 -18
  19. package/dist/docs/references/reference-memory-memory-class.md +16 -18
  20. package/dist/docs/references/reference-storage-composite.md +19 -11
  21. package/dist/docs/references/reference-storage-dynamodb.md +16 -16
  22. package/dist/docs/references/reference-storage-libsql.md +3 -3
  23. package/dist/docs/references/reference-vectors-libsql.md +47 -47
  24. package/dist/index.cjs +512 -82
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.js +513 -83
  27. package/dist/index.js.map +1 -1
  28. package/dist/storage/db/index.d.ts +12 -0
  29. package/dist/storage/db/index.d.ts.map +1 -1
  30. package/dist/storage/domains/datasets/index.d.ts.map +1 -1
  31. package/dist/storage/domains/experiments/index.d.ts +3 -1
  32. package/dist/storage/domains/experiments/index.d.ts.map +1 -1
  33. package/dist/storage/domains/memory/index.d.ts +5 -2
  34. package/dist/storage/domains/memory/index.d.ts.map +1 -1
  35. package/dist/storage/domains/observability/index.d.ts.map +1 -1
  36. package/package.json +8 -8
  37. package/dist/docs/references/docs-agents-agent-memory.md +0 -209
  38. package/dist/docs/references/docs-agents-network-approval.md +0 -275
  39. package/dist/docs/references/docs-observability-overview.md +0 -70
  40. package/dist/docs/references/docs-observability-tracing-exporters-default.md +0 -209
package/dist/index.cjs CHANGED
@@ -1320,6 +1320,8 @@ var LibSQLDB = class extends base.MastraBase {
1320
1320
  maxRetries;
1321
1321
  initialBackoffMs;
1322
1322
  executeWriteOperationWithRetry;
1323
+ /** Cache of actual table columns: tableName -> Promise<Set<columnName>> (stores in-flight promise to coalesce concurrent calls) */
1324
+ tableColumnsCache = /* @__PURE__ */ new Map();
1323
1325
  constructor({
1324
1326
  client,
1325
1327
  maxRetries,
@@ -1338,6 +1340,47 @@ var LibSQLDB = class extends base.MastraBase {
1338
1340
  initialBackoffMs: this.initialBackoffMs
1339
1341
  });
1340
1342
  }
1343
+ /**
1344
+ * Gets the set of column names that actually exist in the database table.
1345
+ * Results are cached; the cache is invalidated when alterTable() adds new columns.
1346
+ */
1347
+ async getTableColumns(tableName) {
1348
+ const cached = this.tableColumnsCache.get(tableName);
1349
+ if (cached) return cached;
1350
+ const promise = (async () => {
1351
+ try {
1352
+ const sanitizedTable = utils.parseSqlIdentifier(tableName, "table name");
1353
+ const result = await this.client.execute({
1354
+ sql: `PRAGMA table_info("${sanitizedTable}")`
1355
+ });
1356
+ const columns = new Set((result.rows || []).map((row) => row.name));
1357
+ if (columns.size === 0) {
1358
+ this.tableColumnsCache.delete(tableName);
1359
+ }
1360
+ return columns;
1361
+ } catch (error) {
1362
+ this.tableColumnsCache.delete(tableName);
1363
+ throw error;
1364
+ }
1365
+ })();
1366
+ this.tableColumnsCache.set(tableName, promise);
1367
+ return promise;
1368
+ }
1369
+ /**
1370
+ * Filters a record to only include columns that exist in the actual database table.
1371
+ * Unknown columns are silently dropped to ensure forward compatibility.
1372
+ */
1373
+ async filterRecordToKnownColumns(tableName, record) {
1374
+ const knownColumns = await this.getTableColumns(tableName);
1375
+ if (knownColumns.size === 0) return record;
1376
+ const filtered = {};
1377
+ for (const [key, value] of Object.entries(record)) {
1378
+ if (knownColumns.has(key)) {
1379
+ filtered[key] = value;
1380
+ }
1381
+ }
1382
+ return filtered;
1383
+ }
1341
1384
  /**
1342
1385
  * Checks if a column exists in the specified table.
1343
1386
  *
@@ -1359,10 +1402,12 @@ var LibSQLDB = class extends base.MastraBase {
1359
1402
  tableName,
1360
1403
  record
1361
1404
  }) {
1405
+ const filteredRecord = await this.filterRecordToKnownColumns(tableName, record);
1406
+ if (Object.keys(filteredRecord).length === 0) return;
1362
1407
  await this.client.execute(
1363
1408
  prepareStatement({
1364
1409
  tableName,
1365
- record
1410
+ record: filteredRecord
1366
1411
  })
1367
1412
  );
1368
1413
  }
@@ -1384,7 +1429,9 @@ var LibSQLDB = class extends base.MastraBase {
1384
1429
  keys,
1385
1430
  data
1386
1431
  }) {
1387
- await this.client.execute(prepareUpdateStatement({ tableName, updates: data, keys }));
1432
+ const filteredData = await this.filterRecordToKnownColumns(tableName, data);
1433
+ if (Object.keys(filteredData).length === 0) return;
1434
+ await this.client.execute(prepareUpdateStatement({ tableName, updates: filteredData, keys }));
1388
1435
  }
1389
1436
  /**
1390
1437
  * Updates a record in the specified table with automatic retry on lock errors.
@@ -1405,7 +1452,10 @@ var LibSQLDB = class extends base.MastraBase {
1405
1452
  records
1406
1453
  }) {
1407
1454
  if (records.length === 0) return;
1408
- const batchStatements = records.map((r) => prepareStatement({ tableName, record: r }));
1455
+ const filteredRecords = await Promise.all(records.map((r) => this.filterRecordToKnownColumns(tableName, r)));
1456
+ const nonEmptyRecords = filteredRecords.filter((r) => Object.keys(r).length > 0);
1457
+ if (nonEmptyRecords.length === 0) return;
1458
+ const batchStatements = nonEmptyRecords.map((r) => prepareStatement({ tableName, record: r }));
1409
1459
  await this.client.batch(batchStatements, "write");
1410
1460
  }
1411
1461
  /**
@@ -1443,7 +1493,15 @@ var LibSQLDB = class extends base.MastraBase {
1443
1493
  updates
1444
1494
  }) {
1445
1495
  if (updates.length === 0) return;
1446
- const batchStatements = updates.map(
1496
+ const filteredUpdates = [];
1497
+ for (const { keys, data } of updates) {
1498
+ const filteredData = await this.filterRecordToKnownColumns(tableName, data);
1499
+ if (Object.keys(filteredData).length > 0) {
1500
+ filteredUpdates.push({ keys, data: filteredData });
1501
+ }
1502
+ }
1503
+ if (filteredUpdates.length === 0) return;
1504
+ const batchStatements = filteredUpdates.map(
1447
1505
  ({ keys, data }) => prepareUpdateStatement({
1448
1506
  tableName,
1449
1507
  updates: data,
@@ -1753,6 +1811,8 @@ var LibSQLDB = class extends base.MastraBase {
1753
1811
  },
1754
1812
  error$1
1755
1813
  );
1814
+ } finally {
1815
+ this.tableColumnsCache.delete(tableName);
1756
1816
  }
1757
1817
  }
1758
1818
  /**
@@ -2032,6 +2092,8 @@ Note: This migration may take some time for large tables.
2032
2092
  },
2033
2093
  error$1
2034
2094
  );
2095
+ } finally {
2096
+ this.tableColumnsCache.delete(tableName);
2035
2097
  }
2036
2098
  }
2037
2099
  /**
@@ -2924,6 +2986,14 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
2924
2986
  await this.#db.createTable({ tableName: storage.TABLE_DATASETS, schema: storage.DATASETS_SCHEMA });
2925
2987
  await this.#db.createTable({ tableName: storage.TABLE_DATASET_ITEMS, schema: storage.DATASET_ITEMS_SCHEMA });
2926
2988
  await this.#db.createTable({ tableName: storage.TABLE_DATASET_VERSIONS, schema: storage.DATASET_VERSIONS_SCHEMA });
2989
+ await this.#addColumnIfNotExists(storage.TABLE_DATASETS, "requestContextSchema", "TEXT");
2990
+ await this.#addColumnIfNotExists(storage.TABLE_DATASETS, "tags", "TEXT");
2991
+ await this.#addColumnIfNotExists(storage.TABLE_DATASETS, "targetType", "TEXT");
2992
+ await this.#addColumnIfNotExists(storage.TABLE_DATASETS, "targetIds", "TEXT");
2993
+ await this.#addColumnIfNotExists(storage.TABLE_DATASETS, "scorerIds", "TEXT");
2994
+ await this.#addColumnIfNotExists(storage.TABLE_DATASET_ITEMS, "requestContext", "TEXT");
2995
+ await this.#addColumnIfNotExists(storage.TABLE_DATASET_ITEMS, "source", "TEXT");
2996
+ await this.#addColumnIfNotExists(storage.TABLE_DATASET_ITEMS, "expectedTrajectory", "TEXT");
2927
2997
  await this.#client.execute({
2928
2998
  sql: `CREATE INDEX IF NOT EXISTS idx_dataset_items_dataset_validto ON "${storage.TABLE_DATASET_ITEMS}" ("datasetId", "validTo")`,
2929
2999
  args: []
@@ -2945,6 +3015,12 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
2945
3015
  args: []
2946
3016
  });
2947
3017
  }
3018
+ async #addColumnIfNotExists(table, column, sqlType) {
3019
+ const exists = await this.#db.hasColumn(table, column);
3020
+ if (!exists) {
3021
+ await this.#client.execute({ sql: `ALTER TABLE "${table}" ADD COLUMN "${column}" ${sqlType}`, args: [] });
3022
+ }
3023
+ }
2948
3024
  async dangerouslyClearAll() {
2949
3025
  await this.#db.deleteData({ tableName: storage.TABLE_DATASET_VERSIONS });
2950
3026
  await this.#db.deleteData({ tableName: storage.TABLE_DATASET_ITEMS });
@@ -2959,6 +3035,11 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
2959
3035
  metadata: row.metadata ? storage.safelyParseJSON(row.metadata) : void 0,
2960
3036
  inputSchema: row.inputSchema ? storage.safelyParseJSON(row.inputSchema) : void 0,
2961
3037
  groundTruthSchema: row.groundTruthSchema ? storage.safelyParseJSON(row.groundTruthSchema) : void 0,
3038
+ requestContextSchema: row.requestContextSchema ? storage.safelyParseJSON(row.requestContextSchema) : void 0,
3039
+ tags: row.tags ? storage.safelyParseJSON(row.tags) : void 0,
3040
+ targetType: row.targetType || void 0,
3041
+ targetIds: row.targetIds ? storage.safelyParseJSON(row.targetIds) : void 0,
3042
+ scorerIds: row.scorerIds ? storage.safelyParseJSON(row.scorerIds) : void 0,
2962
3043
  version: row.version,
2963
3044
  createdAt: storage.ensureDate(row.createdAt),
2964
3045
  updatedAt: storage.ensureDate(row.updatedAt)
@@ -2971,7 +3052,10 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
2971
3052
  datasetVersion: row.datasetVersion,
2972
3053
  input: storage.safelyParseJSON(row.input),
2973
3054
  groundTruth: row.groundTruth ? storage.safelyParseJSON(row.groundTruth) : void 0,
3055
+ expectedTrajectory: row.expectedTrajectory ? storage.safelyParseJSON(row.expectedTrajectory) : void 0,
3056
+ requestContext: row.requestContext ? storage.safelyParseJSON(row.requestContext) : void 0,
2974
3057
  metadata: row.metadata ? storage.safelyParseJSON(row.metadata) : void 0,
3058
+ source: row.source ? storage.safelyParseJSON(row.source) : void 0,
2975
3059
  createdAt: storage.ensureDate(row.createdAt),
2976
3060
  updatedAt: storage.ensureDate(row.updatedAt)
2977
3061
  };
@@ -2985,7 +3069,10 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
2985
3069
  isDeleted: Boolean(row.isDeleted),
2986
3070
  input: storage.safelyParseJSON(row.input),
2987
3071
  groundTruth: row.groundTruth ? storage.safelyParseJSON(row.groundTruth) : void 0,
3072
+ expectedTrajectory: row.expectedTrajectory ? storage.safelyParseJSON(row.expectedTrajectory) : void 0,
3073
+ requestContext: row.requestContext ? storage.safelyParseJSON(row.requestContext) : void 0,
2988
3074
  metadata: row.metadata ? storage.safelyParseJSON(row.metadata) : void 0,
3075
+ source: row.source ? storage.safelyParseJSON(row.source) : void 0,
2989
3076
  createdAt: storage.ensureDate(row.createdAt),
2990
3077
  updatedAt: storage.ensureDate(row.updatedAt)
2991
3078
  };
@@ -3013,6 +3100,10 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3013
3100
  metadata: input.metadata,
3014
3101
  inputSchema: input.inputSchema ?? null,
3015
3102
  groundTruthSchema: input.groundTruthSchema ?? null,
3103
+ requestContextSchema: input.requestContextSchema ?? null,
3104
+ targetType: input.targetType ?? null,
3105
+ targetIds: input.targetIds ? JSON.stringify(input.targetIds) : null,
3106
+ scorerIds: input.scorerIds ? JSON.stringify(input.scorerIds) : null,
3016
3107
  version: 0,
3017
3108
  createdAt: nowIso,
3018
3109
  updatedAt: nowIso
@@ -3025,6 +3116,10 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3025
3116
  metadata: input.metadata,
3026
3117
  inputSchema: input.inputSchema ?? void 0,
3027
3118
  groundTruthSchema: input.groundTruthSchema ?? void 0,
3119
+ requestContextSchema: input.requestContextSchema ?? void 0,
3120
+ targetType: input.targetType ?? void 0,
3121
+ targetIds: input.targetIds ?? void 0,
3122
+ scorerIds: input.scorerIds ?? void 0,
3028
3123
  version: 0,
3029
3124
  createdAt: now,
3030
3125
  updatedAt: now
@@ -3092,6 +3187,26 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3092
3187
  updates.push("groundTruthSchema = ?");
3093
3188
  values.push(args.groundTruthSchema === null ? null : JSON.stringify(args.groundTruthSchema));
3094
3189
  }
3190
+ if (args.requestContextSchema !== void 0) {
3191
+ updates.push("requestContextSchema = ?");
3192
+ values.push(args.requestContextSchema === null ? null : JSON.stringify(args.requestContextSchema));
3193
+ }
3194
+ if (args.tags !== void 0) {
3195
+ updates.push("tags = ?");
3196
+ values.push(args.tags === null ? null : JSON.stringify(args.tags));
3197
+ }
3198
+ if (args.targetType !== void 0) {
3199
+ updates.push("targetType = ?");
3200
+ values.push(args.targetType === null ? null : args.targetType);
3201
+ }
3202
+ if (args.targetIds !== void 0) {
3203
+ updates.push("targetIds = ?");
3204
+ values.push(args.targetIds === null ? null : JSON.stringify(args.targetIds));
3205
+ }
3206
+ if (args.scorerIds !== void 0) {
3207
+ updates.push("scorerIds = ?");
3208
+ values.push(args.scorerIds === null ? null : JSON.stringify(args.scorerIds));
3209
+ }
3095
3210
  values.push(args.id);
3096
3211
  await this.#client.execute({
3097
3212
  sql: `UPDATE ${storage.TABLE_DATASETS} SET ${updates.join(", ")} WHERE id = ?`,
@@ -3104,6 +3219,11 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3104
3219
  metadata: args.metadata ?? existing.metadata,
3105
3220
  inputSchema: (args.inputSchema !== void 0 ? args.inputSchema : existing.inputSchema) ?? void 0,
3106
3221
  groundTruthSchema: (args.groundTruthSchema !== void 0 ? args.groundTruthSchema : existing.groundTruthSchema) ?? void 0,
3222
+ requestContextSchema: (args.requestContextSchema !== void 0 ? args.requestContextSchema : existing.requestContextSchema) ?? void 0,
3223
+ tags: (args.tags !== void 0 ? args.tags : existing.tags) ?? void 0,
3224
+ targetType: (args.targetType !== void 0 ? args.targetType : existing.targetType) ?? void 0,
3225
+ targetIds: (args.targetIds !== void 0 ? args.targetIds : existing.targetIds) ?? void 0,
3226
+ scorerIds: (args.scorerIds !== void 0 ? args.scorerIds : existing.scorerIds) ?? void 0,
3107
3227
  updatedAt: new Date(now)
3108
3228
  };
3109
3229
  } catch (error$1) {
@@ -3209,14 +3329,17 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3209
3329
  args: [args.datasetId]
3210
3330
  },
3211
3331
  {
3212
- sql: `INSERT INTO ${storage.TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${storage.TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
3332
+ sql: `INSERT INTO ${storage.TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, expectedTrajectory, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${storage.TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
3213
3333
  args: [
3214
3334
  id,
3215
3335
  args.datasetId,
3216
3336
  args.datasetId,
3217
3337
  jsonbArg(args.input),
3218
3338
  jsonbArg(args.groundTruth),
3339
+ jsonbArg(args.expectedTrajectory),
3340
+ jsonbArg(args.requestContext),
3219
3341
  jsonbArg(args.metadata),
3342
+ jsonbArg(args.source),
3220
3343
  nowIso,
3221
3344
  nowIso
3222
3345
  ]
@@ -3235,7 +3358,10 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3235
3358
  datasetVersion: newVersion,
3236
3359
  input: args.input,
3237
3360
  groundTruth: args.groundTruth,
3361
+ expectedTrajectory: args.expectedTrajectory,
3362
+ requestContext: args.requestContext,
3238
3363
  metadata: args.metadata,
3364
+ source: args.source,
3239
3365
  createdAt: now,
3240
3366
  updatedAt: now
3241
3367
  };
@@ -3273,9 +3399,12 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3273
3399
  const versionId = crypto.randomUUID();
3274
3400
  const now = /* @__PURE__ */ new Date();
3275
3401
  const nowIso = now.toISOString();
3276
- const mergedInput = args.input ?? existing.input;
3277
- const mergedGroundTruth = args.groundTruth ?? existing.groundTruth;
3278
- const mergedMetadata = args.metadata ?? existing.metadata;
3402
+ const mergedInput = args.input !== void 0 ? args.input : existing.input;
3403
+ const mergedGroundTruth = args.groundTruth !== void 0 ? args.groundTruth : existing.groundTruth;
3404
+ const mergedExpectedTrajectory = args.expectedTrajectory !== void 0 ? args.expectedTrajectory : existing.expectedTrajectory;
3405
+ const mergedRequestContext = args.requestContext !== void 0 ? args.requestContext : existing.requestContext;
3406
+ const mergedMetadata = args.metadata !== void 0 ? args.metadata : existing.metadata;
3407
+ const mergedSource = args.source !== void 0 ? args.source : existing.source;
3279
3408
  const results = await this.#client.batch(
3280
3409
  [
3281
3410
  {
@@ -3287,14 +3416,17 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3287
3416
  args: [args.datasetId, args.id]
3288
3417
  },
3289
3418
  {
3290
- sql: `INSERT INTO ${storage.TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${storage.TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
3419
+ sql: `INSERT INTO ${storage.TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, expectedTrajectory, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${storage.TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
3291
3420
  args: [
3292
3421
  args.id,
3293
3422
  args.datasetId,
3294
3423
  args.datasetId,
3295
3424
  jsonbArg(mergedInput),
3296
3425
  jsonbArg(mergedGroundTruth),
3426
+ jsonbArg(mergedExpectedTrajectory),
3427
+ jsonbArg(mergedRequestContext),
3297
3428
  jsonbArg(mergedMetadata),
3429
+ jsonbArg(mergedSource),
3298
3430
  existing.createdAt.toISOString(),
3299
3431
  nowIso
3300
3432
  ]
@@ -3312,7 +3444,10 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3312
3444
  datasetVersion: newVersion,
3313
3445
  input: mergedInput,
3314
3446
  groundTruth: mergedGroundTruth,
3447
+ expectedTrajectory: mergedExpectedTrajectory,
3448
+ requestContext: mergedRequestContext,
3315
3449
  metadata: mergedMetadata,
3450
+ source: mergedSource,
3316
3451
  updatedAt: now
3317
3452
  };
3318
3453
  } catch (error$1) {
@@ -3352,14 +3487,16 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3352
3487
  args: [datasetId, id]
3353
3488
  },
3354
3489
  {
3355
- sql: `INSERT INTO ${storage.TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${storage.TABLE_DATASETS} WHERE id = ?), NULL, 1, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
3490
+ sql: `INSERT INTO ${storage.TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${storage.TABLE_DATASETS} WHERE id = ?), NULL, 1, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
3356
3491
  args: [
3357
3492
  id,
3358
3493
  datasetId,
3359
3494
  datasetId,
3360
3495
  jsonbArg(existing.input),
3361
3496
  jsonbArg(existing.groundTruth),
3497
+ jsonbArg(existing.requestContext),
3362
3498
  jsonbArg(existing.metadata),
3499
+ jsonbArg(existing.source),
3363
3500
  existing.createdAt.toISOString(),
3364
3501
  nowIso
3365
3502
  ]
@@ -3639,14 +3776,17 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3639
3776
  const id = crypto.randomUUID();
3640
3777
  items.push({ id, input: itemInput });
3641
3778
  statements.push({
3642
- sql: `INSERT INTO ${storage.TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${storage.TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
3779
+ sql: `INSERT INTO ${storage.TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, expectedTrajectory, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${storage.TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
3643
3780
  args: [
3644
3781
  id,
3645
3782
  input.datasetId,
3646
3783
  input.datasetId,
3647
3784
  jsonbArg(itemInput.input),
3648
3785
  jsonbArg(itemInput.groundTruth),
3786
+ jsonbArg(itemInput.expectedTrajectory),
3787
+ jsonbArg(itemInput.requestContext),
3649
3788
  jsonbArg(itemInput.metadata),
3789
+ jsonbArg(itemInput.source),
3650
3790
  nowIso,
3651
3791
  nowIso
3652
3792
  ]
@@ -3664,7 +3804,10 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3664
3804
  datasetVersion: newVersion,
3665
3805
  input: itemInput.input,
3666
3806
  groundTruth: itemInput.groundTruth,
3807
+ expectedTrajectory: itemInput.expectedTrajectory,
3808
+ requestContext: itemInput.requestContext,
3667
3809
  metadata: itemInput.metadata,
3810
+ source: itemInput.source,
3668
3811
  createdAt: now,
3669
3812
  updatedAt: now
3670
3813
  }));
@@ -3713,14 +3856,16 @@ var DatasetsLibSQL = class extends storage.DatasetsStorage {
3713
3856
  args: [input.datasetId, item.id]
3714
3857
  });
3715
3858
  statements.push({
3716
- sql: `INSERT INTO ${storage.TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${storage.TABLE_DATASETS} WHERE id = ?), NULL, 1, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
3859
+ sql: `INSERT INTO ${storage.TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${storage.TABLE_DATASETS} WHERE id = ?), NULL, 1, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
3717
3860
  args: [
3718
3861
  item.id,
3719
3862
  input.datasetId,
3720
3863
  input.datasetId,
3721
3864
  jsonbArg(item.input),
3722
3865
  jsonbArg(item.groundTruth),
3866
+ jsonbArg(item.requestContext),
3723
3867
  jsonbArg(item.metadata),
3868
+ jsonbArg(item.source),
3724
3869
  item.createdAt.toISOString(),
3725
3870
  nowIso
3726
3871
  ]
@@ -3782,6 +3927,7 @@ var ExperimentsLibSQL = class extends storage.ExperimentsStorage {
3782
3927
  id: row.id,
3783
3928
  datasetId: row.datasetId ?? null,
3784
3929
  datasetVersion: row.datasetVersion != null ? row.datasetVersion : null,
3930
+ agentVersion: row.agentVersion ?? null,
3785
3931
  targetType: row.targetType,
3786
3932
  targetId: row.targetId,
3787
3933
  name: row.name ?? void 0,
@@ -3813,6 +3959,8 @@ var ExperimentsLibSQL = class extends storage.ExperimentsStorage {
3813
3959
  completedAt: storage.ensureDate(row.completedAt),
3814
3960
  retryCount: row.retryCount,
3815
3961
  traceId: row.traceId ?? null,
3962
+ status: row.status ?? null,
3963
+ tags: row.tags ? storage.safelyParseJSON(row.tags) : null,
3816
3964
  createdAt: storage.ensureDate(row.createdAt)
3817
3965
  };
3818
3966
  }
@@ -3828,6 +3976,7 @@ var ExperimentsLibSQL = class extends storage.ExperimentsStorage {
3828
3976
  id,
3829
3977
  datasetId: input.datasetId ?? null,
3830
3978
  datasetVersion: input.datasetVersion ?? null,
3979
+ agentVersion: input.agentVersion ?? null,
3831
3980
  targetType: input.targetType,
3832
3981
  targetId: input.targetId,
3833
3982
  name: input.name ?? null,
@@ -3848,6 +3997,7 @@ var ExperimentsLibSQL = class extends storage.ExperimentsStorage {
3848
3997
  id,
3849
3998
  datasetId: input.datasetId,
3850
3999
  datasetVersion: input.datasetVersion,
4000
+ agentVersion: input.agentVersion ?? null,
3851
4001
  targetType: input.targetType,
3852
4002
  targetId: input.targetId,
3853
4003
  name: input.name,
@@ -3900,6 +4050,10 @@ var ExperimentsLibSQL = class extends storage.ExperimentsStorage {
3900
4050
  updates.push("failedCount = ?");
3901
4051
  values.push(input.failedCount);
3902
4052
  }
4053
+ if (input.totalItems !== void 0) {
4054
+ updates.push("totalItems = ?");
4055
+ values.push(input.totalItems);
4056
+ }
3903
4057
  if (input.startedAt !== void 0) {
3904
4058
  updates.push("startedAt = ?");
3905
4059
  values.push(input.startedAt?.toISOString() ?? null);
@@ -4052,6 +4206,8 @@ var ExperimentsLibSQL = class extends storage.ExperimentsStorage {
4052
4206
  completedAt: input.completedAt.toISOString(),
4053
4207
  retryCount: input.retryCount,
4054
4208
  traceId: input.traceId ?? null,
4209
+ status: input.status ?? null,
4210
+ tags: input.tags !== void 0 && input.tags !== null ? JSON.stringify(input.tags) : null,
4055
4211
  createdAt: nowIso
4056
4212
  }
4057
4213
  });
@@ -4068,6 +4224,8 @@ var ExperimentsLibSQL = class extends storage.ExperimentsStorage {
4068
4224
  completedAt: input.completedAt,
4069
4225
  retryCount: input.retryCount,
4070
4226
  traceId: input.traceId ?? null,
4227
+ status: input.status ?? null,
4228
+ tags: input.tags ?? null,
4071
4229
  createdAt: now
4072
4230
  };
4073
4231
  } catch (error$1) {
@@ -4081,6 +4239,70 @@ var ExperimentsLibSQL = class extends storage.ExperimentsStorage {
4081
4239
  );
4082
4240
  }
4083
4241
  }
4242
+ async updateExperimentResult(input) {
4243
+ try {
4244
+ const setClauses = [];
4245
+ const values = [];
4246
+ if (input.status !== void 0) {
4247
+ setClauses.push(`"status" = ?`);
4248
+ values.push(input.status);
4249
+ }
4250
+ if (input.tags !== void 0) {
4251
+ setClauses.push(`"tags" = ?`);
4252
+ values.push(JSON.stringify(input.tags));
4253
+ }
4254
+ if (setClauses.length === 0) {
4255
+ const existing = await this.getExperimentResultById({ id: input.id });
4256
+ if (!existing) {
4257
+ throw new error.MastraError({
4258
+ id: storage.createStorageErrorId("LIBSQL", "UPDATE_EXPERIMENT_RESULT", "NOT_FOUND"),
4259
+ domain: error.ErrorDomain.STORAGE,
4260
+ category: error.ErrorCategory.USER,
4261
+ details: { resultId: input.id }
4262
+ });
4263
+ }
4264
+ return existing;
4265
+ }
4266
+ values.push(input.id);
4267
+ let whereClause = `"id" = ?`;
4268
+ if (input.experimentId) {
4269
+ values.push(input.experimentId);
4270
+ whereClause += ` AND "experimentId" = ?`;
4271
+ }
4272
+ const updateResult = await this.#client.execute({
4273
+ sql: `UPDATE ${storage.TABLE_EXPERIMENT_RESULTS} SET ${setClauses.join(", ")} WHERE ${whereClause}`,
4274
+ args: values
4275
+ });
4276
+ if (updateResult.rowsAffected === 0) {
4277
+ throw new error.MastraError({
4278
+ id: storage.createStorageErrorId("LIBSQL", "UPDATE_EXPERIMENT_RESULT", "NOT_FOUND"),
4279
+ domain: error.ErrorDomain.STORAGE,
4280
+ category: error.ErrorCategory.USER,
4281
+ details: { resultId: input.id, ...input.experimentId ? { experimentId: input.experimentId } : {} }
4282
+ });
4283
+ }
4284
+ const result = await this.getExperimentResultById({ id: input.id });
4285
+ if (!result) {
4286
+ throw new error.MastraError({
4287
+ id: storage.createStorageErrorId("LIBSQL", "UPDATE_EXPERIMENT_RESULT", "NOT_FOUND"),
4288
+ domain: error.ErrorDomain.STORAGE,
4289
+ category: error.ErrorCategory.USER,
4290
+ details: { resultId: input.id }
4291
+ });
4292
+ }
4293
+ return result;
4294
+ } catch (error$1) {
4295
+ if (error$1 instanceof error.MastraError) throw error$1;
4296
+ throw new error.MastraError(
4297
+ {
4298
+ id: storage.createStorageErrorId("LIBSQL", "UPDATE_EXPERIMENT_RESULT", "FAILED"),
4299
+ domain: error.ErrorDomain.STORAGE,
4300
+ category: error.ErrorCategory.THIRD_PARTY
4301
+ },
4302
+ error$1
4303
+ );
4304
+ }
4305
+ }
4084
4306
  async getExperimentResultById(args) {
4085
4307
  try {
4086
4308
  const result = await this.#client.execute({
@@ -4161,6 +4383,37 @@ var ExperimentsLibSQL = class extends storage.ExperimentsStorage {
4161
4383
  );
4162
4384
  }
4163
4385
  }
4386
+ async getReviewSummary() {
4387
+ try {
4388
+ const result = await this.#client.execute({
4389
+ sql: `SELECT
4390
+ "experimentId",
4391
+ COUNT(*) as total,
4392
+ SUM(CASE WHEN status = 'needs-review' THEN 1 ELSE 0 END) as "needsReview",
4393
+ SUM(CASE WHEN status = 'reviewed' THEN 1 ELSE 0 END) as reviewed,
4394
+ SUM(CASE WHEN status = 'complete' THEN 1 ELSE 0 END) as complete
4395
+ FROM ${storage.TABLE_EXPERIMENT_RESULTS}
4396
+ GROUP BY "experimentId"`,
4397
+ args: []
4398
+ });
4399
+ return (result.rows ?? []).map((row) => ({
4400
+ experimentId: row.experimentId,
4401
+ total: Number(row.total ?? 0),
4402
+ needsReview: Number(row.needsReview ?? 0),
4403
+ reviewed: Number(row.reviewed ?? 0),
4404
+ complete: Number(row.complete ?? 0)
4405
+ }));
4406
+ } catch (error$1) {
4407
+ throw new error.MastraError(
4408
+ {
4409
+ id: storage.createStorageErrorId("LIBSQL", "GET_REVIEW_SUMMARY", "FAILED"),
4410
+ domain: error.ErrorDomain.STORAGE,
4411
+ category: error.ErrorCategory.THIRD_PARTY
4412
+ },
4413
+ error$1
4414
+ );
4415
+ }
4416
+ }
4164
4417
  };
4165
4418
  var MCPClientsLibSQL = class extends storage.MCPClientsStorage {
4166
4419
  #db;
@@ -5168,7 +5421,8 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
5168
5421
  "isBufferingObservation",
5169
5422
  "isBufferingReflection",
5170
5423
  "lastBufferedAtTokens",
5171
- "lastBufferedAtTime"
5424
+ "lastBufferedAtTime",
5425
+ "metadata"
5172
5426
  ]
5173
5427
  });
5174
5428
  }
@@ -5209,41 +5463,64 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
5209
5463
  if (row.type && row.type !== `v2`) result.type = row.type;
5210
5464
  return result;
5211
5465
  }
5466
+ _sortMessages(messages, field, direction) {
5467
+ return messages.sort((a, b) => {
5468
+ const isDateField = field === "createdAt" || field === "updatedAt";
5469
+ const aValue = isDateField ? new Date(a[field]).getTime() : a[field];
5470
+ const bValue = isDateField ? new Date(b[field]).getTime() : b[field];
5471
+ if (typeof aValue === "number" && typeof bValue === "number") {
5472
+ return direction === "ASC" ? aValue - bValue : bValue - aValue;
5473
+ }
5474
+ return direction === "ASC" ? String(aValue).localeCompare(String(bValue)) : String(bValue).localeCompare(String(aValue));
5475
+ });
5476
+ }
5212
5477
  async _getIncludedMessages({ include }) {
5213
5478
  if (!include || include.length === 0) return null;
5479
+ const targetIds = include.map((inc) => inc.id).filter(Boolean);
5480
+ if (targetIds.length === 0) return null;
5481
+ const idPlaceholders = targetIds.map(() => "?").join(", ");
5482
+ const targetResult = await this.#client.execute({
5483
+ sql: `SELECT id, thread_id, "createdAt" FROM "${storage.TABLE_MESSAGES}" WHERE id IN (${idPlaceholders})`,
5484
+ args: targetIds
5485
+ });
5486
+ if (!targetResult.rows || targetResult.rows.length === 0) return null;
5487
+ const targetMap = new Map(
5488
+ targetResult.rows.map((r) => [r.id, { threadId: r.thread_id, createdAt: r.createdAt }])
5489
+ );
5214
5490
  const unionQueries = [];
5215
5491
  const params = [];
5216
5492
  for (const inc of include) {
5217
5493
  const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;
5218
- unionQueries.push(
5219
- `
5220
- SELECT * FROM (
5221
- WITH target_thread AS (
5222
- SELECT thread_id FROM "${storage.TABLE_MESSAGES}" WHERE id = ?
5223
- ),
5224
- numbered_messages AS (
5225
- SELECT
5226
- id, content, role, type, "createdAt", thread_id, "resourceId",
5227
- ROW_NUMBER() OVER (ORDER BY "createdAt" ASC) as row_num
5228
- FROM "${storage.TABLE_MESSAGES}"
5229
- WHERE thread_id = (SELECT thread_id FROM target_thread)
5230
- ),
5231
- target_positions AS (
5232
- SELECT row_num as target_pos
5233
- FROM numbered_messages
5234
- WHERE id = ?
5235
- )
5236
- SELECT DISTINCT m.*
5237
- FROM numbered_messages m
5238
- CROSS JOIN target_positions t
5239
- WHERE m.row_num BETWEEN (t.target_pos - ?) AND (t.target_pos + ?)
5240
- )
5241
- `
5242
- // Keep ASC for final sorting after fetching context
5243
- );
5244
- params.push(id, id, withPreviousMessages, withNextMessages);
5245
- }
5246
- const finalQuery = unionQueries.join(" UNION ALL ") + ' ORDER BY "createdAt" ASC';
5494
+ const target = targetMap.get(id);
5495
+ if (!target) continue;
5496
+ unionQueries.push(`SELECT * FROM (
5497
+ SELECT id, content, role, type, "createdAt", thread_id, "resourceId"
5498
+ FROM "${storage.TABLE_MESSAGES}"
5499
+ WHERE thread_id = ?
5500
+ AND "createdAt" <= ?
5501
+ ORDER BY "createdAt" DESC, id DESC
5502
+ LIMIT ?
5503
+ )`);
5504
+ params.push(target.threadId, target.createdAt, withPreviousMessages + 1);
5505
+ if (withNextMessages > 0) {
5506
+ unionQueries.push(`SELECT * FROM (
5507
+ SELECT id, content, role, type, "createdAt", thread_id, "resourceId"
5508
+ FROM "${storage.TABLE_MESSAGES}"
5509
+ WHERE thread_id = ?
5510
+ AND "createdAt" > ?
5511
+ ORDER BY "createdAt" ASC, id ASC
5512
+ LIMIT ?
5513
+ )`);
5514
+ params.push(target.threadId, target.createdAt, withNextMessages);
5515
+ }
5516
+ }
5517
+ if (unionQueries.length === 0) return null;
5518
+ let finalQuery;
5519
+ if (unionQueries.length === 1) {
5520
+ finalQuery = unionQueries[0];
5521
+ } else {
5522
+ finalQuery = `${unionQueries.join(" UNION ALL ")} ORDER BY "createdAt" ASC, id ASC`;
5523
+ }
5247
5524
  const includedResult = await this.#client.execute({ sql: finalQuery, args: params });
5248
5525
  const includedRows = includedResult.rows?.map((row) => this.parseRow(row));
5249
5526
  const seen = /* @__PURE__ */ new Set();
@@ -5338,6 +5615,23 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
5338
5615
  );
5339
5616
  }
5340
5617
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
5618
+ if (perPage === 0 && (!include || include.length === 0)) {
5619
+ return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };
5620
+ }
5621
+ if (perPage === 0 && include && include.length > 0) {
5622
+ const includeMessages = await this._getIncludedMessages({ include });
5623
+ if (!includeMessages || includeMessages.length === 0) {
5624
+ return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };
5625
+ }
5626
+ const list2 = new agent.MessageList().add(includeMessages, "memory");
5627
+ return {
5628
+ messages: this._sortMessages(list2.get.all.db(), field, direction),
5629
+ total: 0,
5630
+ page,
5631
+ perPage: perPageForResponse,
5632
+ hasMore: false
5633
+ };
5634
+ }
5341
5635
  const countResult = await this.#client.execute({
5342
5636
  sql: `SELECT COUNT(*) as count FROM ${storage.TABLE_MESSAGES} ${whereClause}`,
5343
5637
  args: queryParams
@@ -5371,16 +5665,7 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
5371
5665
  }
5372
5666
  }
5373
5667
  const list = new agent.MessageList().add(messages, "memory");
5374
- let finalMessages = list.get.all.db();
5375
- finalMessages = finalMessages.sort((a, b) => {
5376
- const isDateField = field === "createdAt" || field === "updatedAt";
5377
- const aValue = isDateField ? new Date(a[field]).getTime() : a[field];
5378
- const bValue = isDateField ? new Date(b[field]).getTime() : b[field];
5379
- if (typeof aValue === "number" && typeof bValue === "number") {
5380
- return direction === "ASC" ? aValue - bValue : bValue - aValue;
5381
- }
5382
- return direction === "ASC" ? String(aValue).localeCompare(String(bValue)) : String(bValue).localeCompare(String(aValue));
5383
- });
5668
+ const finalMessages = this._sortMessages(list.get.all.db(), field, direction);
5384
5669
  const threadIdSet = new Set(threadIds);
5385
5670
  const returnedThreadMessageIds = new Set(
5386
5671
  finalMessages.filter((m) => m.threadId && threadIdSet.has(m.threadId)).map((m) => m.id)
@@ -5466,6 +5751,23 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
5466
5751
  );
5467
5752
  }
5468
5753
  const whereClause = `WHERE ${conditions.join(" AND ")}`;
5754
+ if (perPage === 0 && (!include || include.length === 0)) {
5755
+ return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };
5756
+ }
5757
+ if (perPage === 0 && include && include.length > 0) {
5758
+ const includeMessages = await this._getIncludedMessages({ include });
5759
+ if (!includeMessages || includeMessages.length === 0) {
5760
+ return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };
5761
+ }
5762
+ const list2 = new agent.MessageList().add(includeMessages, "memory");
5763
+ return {
5764
+ messages: this._sortMessages(list2.get.all.db(), field, direction),
5765
+ total: 0,
5766
+ page,
5767
+ perPage: perPageForResponse,
5768
+ hasMore: false
5769
+ };
5770
+ }
5469
5771
  const countResult = await this.#client.execute({
5470
5772
  sql: `SELECT COUNT(*) as count FROM ${storage.TABLE_MESSAGES} ${whereClause}`,
5471
5773
  args: queryParams
@@ -5499,16 +5801,7 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
5499
5801
  }
5500
5802
  }
5501
5803
  const list = new agent.MessageList().add(messages, "memory");
5502
- let finalMessages = list.get.all.db();
5503
- finalMessages = finalMessages.sort((a, b) => {
5504
- const isDateField = field === "createdAt" || field === "updatedAt";
5505
- const aValue = isDateField ? new Date(a[field]).getTime() : a[field];
5506
- const bValue = isDateField ? new Date(b[field]).getTime() : b[field];
5507
- if (typeof aValue === "number" && typeof bValue === "number") {
5508
- return direction === "ASC" ? aValue - bValue : bValue - aValue;
5509
- }
5510
- return direction === "ASC" ? String(aValue).localeCompare(String(bValue)) : String(bValue).localeCompare(String(aValue));
5511
- });
5804
+ const finalMessages = this._sortMessages(list.get.all.db(), field, direction);
5512
5805
  const hasMore = perPageInput !== false && offset + perPage < total;
5513
5806
  return {
5514
5807
  messages: finalMessages,
@@ -6138,9 +6431,11 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
6138
6431
  ]
6139
6432
  });
6140
6433
  const clonedMessages = [];
6434
+ const messageIdMap = {};
6141
6435
  const targetResourceId = resourceId || sourceThread.resourceId;
6142
6436
  for (const sourceMsg of sourceMessages) {
6143
6437
  const newMessageId = crypto.randomUUID();
6438
+ messageIdMap[sourceMsg.id] = newMessageId;
6144
6439
  const contentStr = sourceMsg.content;
6145
6440
  let parsedContent;
6146
6441
  try {
@@ -6174,7 +6469,8 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
6174
6469
  await tx.commit();
6175
6470
  return {
6176
6471
  thread: newThread,
6177
- clonedMessages
6472
+ clonedMessages,
6473
+ messageIdMap
6178
6474
  };
6179
6475
  } catch (error) {
6180
6476
  await tx.rollback();
@@ -6261,14 +6557,26 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
6261
6557
  );
6262
6558
  }
6263
6559
  }
6264
- async getObservationalMemoryHistory(threadId, resourceId, limit = 10) {
6560
+ async getObservationalMemoryHistory(threadId, resourceId, limit = 10, options) {
6265
6561
  try {
6266
6562
  const lookupKey = this.getOMKey(threadId, resourceId);
6267
- const result = await this.#client.execute({
6268
- // Use generationCount DESC for reliable ordering (incremented for each new record)
6269
- sql: `SELECT * FROM "${OM_TABLE}" WHERE "lookupKey" = ? ORDER BY "generationCount" DESC LIMIT ?`,
6270
- args: [lookupKey, limit]
6271
- });
6563
+ const conditions = [`"lookupKey" = ?`];
6564
+ const args = [lookupKey];
6565
+ if (options?.from) {
6566
+ conditions.push(`"createdAt" >= ?`);
6567
+ args.push(options.from.toISOString());
6568
+ }
6569
+ if (options?.to) {
6570
+ conditions.push(`"createdAt" <= ?`);
6571
+ args.push(options.to.toISOString());
6572
+ }
6573
+ args.push(limit);
6574
+ let sql = `SELECT * FROM "${OM_TABLE}" WHERE ${conditions.join(" AND ")} ORDER BY "generationCount" DESC LIMIT ?`;
6575
+ if (options?.offset != null) {
6576
+ args.push(options.offset);
6577
+ sql += ` OFFSET ?`;
6578
+ }
6579
+ const result = await this.#client.execute({ sql, args });
6272
6580
  if (!result.rows) return [];
6273
6581
  return result.rows.map((row) => this.parseOMRow(row));
6274
6582
  } catch (error$1) {
@@ -6364,6 +6672,68 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
6364
6672
  );
6365
6673
  }
6366
6674
  }
6675
+ async insertObservationalMemoryRecord(record) {
6676
+ try {
6677
+ const lookupKey = this.getOMKey(record.threadId, record.resourceId);
6678
+ await this.#client.execute({
6679
+ sql: `INSERT INTO "${OM_TABLE}" (
6680
+ id, "lookupKey", scope, "resourceId", "threadId",
6681
+ "activeObservations", "activeObservationsPendingUpdate",
6682
+ "originType", config, "generationCount", "lastObservedAt", "lastReflectionAt",
6683
+ "pendingMessageTokens", "totalTokensObserved", "observationTokenCount",
6684
+ "observedMessageIds", "bufferedObservationChunks",
6685
+ "bufferedReflection", "bufferedReflectionTokens", "bufferedReflectionInputTokens",
6686
+ "reflectedObservationLineCount",
6687
+ "isObserving", "isReflecting", "isBufferingObservation", "isBufferingReflection",
6688
+ "lastBufferedAtTokens", "lastBufferedAtTime",
6689
+ "observedTimezone", metadata, "createdAt", "updatedAt"
6690
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
6691
+ args: [
6692
+ record.id,
6693
+ lookupKey,
6694
+ record.scope,
6695
+ record.resourceId,
6696
+ record.threadId || null,
6697
+ record.activeObservations || "",
6698
+ null,
6699
+ record.originType || "initial",
6700
+ record.config ? JSON.stringify(record.config) : null,
6701
+ record.generationCount || 0,
6702
+ record.lastObservedAt ? record.lastObservedAt.toISOString() : null,
6703
+ null,
6704
+ record.pendingMessageTokens || 0,
6705
+ record.totalTokensObserved || 0,
6706
+ record.observationTokenCount || 0,
6707
+ record.observedMessageIds ? JSON.stringify(record.observedMessageIds) : null,
6708
+ record.bufferedObservationChunks ? JSON.stringify(record.bufferedObservationChunks) : null,
6709
+ record.bufferedReflection || null,
6710
+ record.bufferedReflectionTokens ?? null,
6711
+ record.bufferedReflectionInputTokens ?? null,
6712
+ record.reflectedObservationLineCount ?? null,
6713
+ record.isObserving || false,
6714
+ record.isReflecting || false,
6715
+ record.isBufferingObservation || false,
6716
+ record.isBufferingReflection || false,
6717
+ record.lastBufferedAtTokens || 0,
6718
+ record.lastBufferedAtTime ? record.lastBufferedAtTime.toISOString() : null,
6719
+ record.observedTimezone || null,
6720
+ record.metadata ? JSON.stringify(record.metadata) : null,
6721
+ record.createdAt.toISOString(),
6722
+ record.updatedAt.toISOString()
6723
+ ]
6724
+ });
6725
+ } catch (error$1) {
6726
+ throw new error.MastraError(
6727
+ {
6728
+ id: storage.createStorageErrorId("LIBSQL", "INSERT_OBSERVATIONAL_MEMORY_RECORD", "FAILED"),
6729
+ domain: error.ErrorDomain.STORAGE,
6730
+ category: error.ErrorCategory.THIRD_PARTY,
6731
+ details: { id: record.id, threadId: record.threadId, resourceId: record.resourceId }
6732
+ },
6733
+ error$1
6734
+ );
6735
+ }
6736
+ }
6367
6737
  async updateActiveObservations(input) {
6368
6738
  try {
6369
6739
  const now = /* @__PURE__ */ new Date();
@@ -6448,8 +6818,8 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
6448
6818
  "originType", config, "generationCount", "lastObservedAt", "lastReflectionAt",
6449
6819
  "pendingMessageTokens", "totalTokensObserved", "observationTokenCount",
6450
6820
  "isObserving", "isReflecting", "isBufferingObservation", "isBufferingReflection", "lastBufferedAtTokens", "lastBufferedAtTime",
6451
- "observedTimezone", "createdAt", "updatedAt"
6452
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
6821
+ "observedTimezone", metadata, "createdAt", "updatedAt"
6822
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
6453
6823
  args: [
6454
6824
  id,
6455
6825
  lookupKey,
@@ -6479,6 +6849,7 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
6479
6849
  null,
6480
6850
  // lastBufferedAtTime
6481
6851
  record.observedTimezone || null,
6852
+ record.metadata ? JSON.stringify(record.metadata) : null,
6482
6853
  now.toISOString(),
6483
6854
  now.toISOString()
6484
6855
  ]
@@ -6675,6 +7046,43 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
6675
7046
  );
6676
7047
  }
6677
7048
  }
7049
+ async updateObservationalMemoryConfig(input) {
7050
+ try {
7051
+ const selectResult = await this.#client.execute({
7052
+ sql: `SELECT config FROM "${OM_TABLE}" WHERE id = ?`,
7053
+ args: [input.id]
7054
+ });
7055
+ if (selectResult.rows.length === 0) {
7056
+ throw new error.MastraError({
7057
+ id: storage.createStorageErrorId("LIBSQL", "UPDATE_OM_CONFIG", "NOT_FOUND"),
7058
+ text: `Observational memory record not found: ${input.id}`,
7059
+ domain: error.ErrorDomain.STORAGE,
7060
+ category: error.ErrorCategory.THIRD_PARTY,
7061
+ details: { id: input.id }
7062
+ });
7063
+ }
7064
+ const row = selectResult.rows[0];
7065
+ const existing = row.config ? JSON.parse(row.config) : {};
7066
+ const merged = this.deepMergeConfig(existing, input.config);
7067
+ await this.#client.execute({
7068
+ sql: `UPDATE "${OM_TABLE}" SET config = ?, "updatedAt" = ? WHERE id = ?`,
7069
+ args: [JSON.stringify(merged), (/* @__PURE__ */ new Date()).toISOString(), input.id]
7070
+ });
7071
+ } catch (error$1) {
7072
+ if (error$1 instanceof error.MastraError) {
7073
+ throw error$1;
7074
+ }
7075
+ throw new error.MastraError(
7076
+ {
7077
+ id: storage.createStorageErrorId("LIBSQL", "UPDATE_OM_CONFIG", "FAILED"),
7078
+ domain: error.ErrorDomain.STORAGE,
7079
+ category: error.ErrorCategory.THIRD_PARTY,
7080
+ details: { id: input.id }
7081
+ },
7082
+ error$1
7083
+ );
7084
+ }
7085
+ }
6678
7086
  // ============================================
6679
7087
  // Async Buffering Methods
6680
7088
  // ============================================
@@ -6714,7 +7122,8 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
6714
7122
  lastObservedAt: input.chunk.lastObservedAt,
6715
7123
  createdAt: /* @__PURE__ */ new Date(),
6716
7124
  suggestedContinuation: input.chunk.suggestedContinuation,
6717
- currentTask: input.chunk.currentTask
7125
+ currentTask: input.chunk.currentTask,
7126
+ threadTitle: input.chunk.threadTitle
6718
7127
  };
6719
7128
  const newChunks = [...existingChunks, newChunk];
6720
7129
  const lastBufferedAtTime = input.lastBufferedAtTime ? input.lastBufferedAtTime.toISOString() : null;
@@ -6795,15 +7204,15 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
6795
7204
  let bestUnderTokens = 0;
6796
7205
  for (let i = 0; i < chunks.length; i++) {
6797
7206
  cumulativeMessageTokens += chunks[i].messageTokens ?? 0;
6798
- const boundary = i + 1;
7207
+ const boundary2 = i + 1;
6799
7208
  if (cumulativeMessageTokens >= targetMessageTokens) {
6800
7209
  if (bestOverBoundary === 0 || cumulativeMessageTokens < bestOverTokens) {
6801
- bestOverBoundary = boundary;
7210
+ bestOverBoundary = boundary2;
6802
7211
  bestOverTokens = cumulativeMessageTokens;
6803
7212
  }
6804
7213
  } else {
6805
7214
  if (cumulativeMessageTokens > bestUnderTokens) {
6806
- bestUnderBoundary = boundary;
7215
+ bestUnderBoundary = boundary2;
6807
7216
  bestUnderTokens = cumulativeMessageTokens;
6808
7217
  }
6809
7218
  }
@@ -6838,13 +7247,16 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
6838
7247
  const lastObservedAtStr = lastObservedAt.toISOString();
6839
7248
  const existingActive = row.activeObservations || "";
6840
7249
  const existingTokenCount = Number(row.observationTokenCount || 0);
6841
- const newActive = existingActive ? `${existingActive}
7250
+ const boundary = `
7251
+
7252
+ --- message boundary (${lastObservedAt.toISOString()}) ---
6842
7253
 
6843
- ${activatedContent}` : activatedContent;
7254
+ `;
7255
+ const newActive = existingActive ? `${existingActive}${boundary}${activatedContent}` : activatedContent;
6844
7256
  const newTokenCount = existingTokenCount + activatedTokens;
6845
7257
  const existingPending = Number(row.pendingMessageTokens || 0);
6846
7258
  const newPending = Math.max(0, existingPending - activatedMessageTokens);
6847
- await this.#client.execute({
7259
+ const updateResult = await this.#client.execute({
6848
7260
  sql: `UPDATE "${OM_TABLE}" SET
6849
7261
  "activeObservations" = ?,
6850
7262
  "observationTokenCount" = ?,
@@ -6852,7 +7264,9 @@ ${activatedContent}` : activatedContent;
6852
7264
  "bufferedObservationChunks" = ?,
6853
7265
  "lastObservedAt" = ?,
6854
7266
  "updatedAt" = ?
6855
- WHERE id = ?`,
7267
+ WHERE id = ?
7268
+ AND "bufferedObservationChunks" IS NOT NULL
7269
+ AND "bufferedObservationChunks" != '[]'`,
6856
7270
  args: [
6857
7271
  newActive,
6858
7272
  newTokenCount,
@@ -6863,6 +7277,16 @@ ${activatedContent}` : activatedContent;
6863
7277
  input.id
6864
7278
  ]
6865
7279
  });
7280
+ if (updateResult.rowsAffected === 0) {
7281
+ return {
7282
+ chunksActivated: 0,
7283
+ messageTokensActivated: 0,
7284
+ observationTokensActivated: 0,
7285
+ messagesActivated: 0,
7286
+ activatedCycleIds: [],
7287
+ activatedMessageIds: []
7288
+ };
7289
+ }
6866
7290
  const latestChunkHints = activatedChunks[activatedChunks.length - 1];
6867
7291
  return {
6868
7292
  chunksActivated: activatedChunks.length,
@@ -7022,6 +7446,11 @@ var ObservabilityLibSQL = class extends storage.ObservabilityStorage {
7022
7446
  }
7023
7447
  async init() {
7024
7448
  await this.#db.createTable({ tableName: storage.TABLE_SPANS, schema: storage.SPAN_SCHEMA });
7449
+ await this.#db.alterTable({
7450
+ tableName: storage.TABLE_SPANS,
7451
+ schema: storage.SPAN_SCHEMA,
7452
+ ifNotExists: ["requestContext"]
7453
+ });
7025
7454
  }
7026
7455
  async dangerouslyClearAll() {
7027
7456
  await this.#db.deleteData({ tableName: storage.TABLE_SPANS });
@@ -7193,7 +7622,8 @@ var ObservabilityLibSQL = class extends storage.ObservabilityStorage {
7193
7622
  }
7194
7623
  async listTraces(args) {
7195
7624
  const { filters, pagination, orderBy } = storage.listTracesArgsSchema.parse(args);
7196
- const { page, perPage } = pagination;
7625
+ const page = pagination?.page ?? 0;
7626
+ const perPage = pagination?.perPage ?? 10;
7197
7627
  const tableName = utils.parseSqlIdentifier(storage.TABLE_SPANS, "table name");
7198
7628
  try {
7199
7629
  const conditions = ["parentSpanId IS NULL"];
@@ -7333,8 +7763,8 @@ var ObservabilityLibSQL = class extends storage.ObservabilityStorage {
7333
7763
  }
7334
7764
  }
7335
7765
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
7336
- const sortField = orderBy.field;
7337
- const sortDirection = orderBy.direction;
7766
+ const sortField = orderBy?.field ?? "startedAt";
7767
+ const sortDirection = orderBy?.direction ?? "DESC";
7338
7768
  let orderByClause;
7339
7769
  if (sortField === "endedAt") {
7340
7770
  orderByClause = sortDirection === "DESC" ? `CASE WHEN ${sortField} IS NULL THEN 0 ELSE 1 END, ${sortField} DESC` : `CASE WHEN ${sortField} IS NULL THEN 1 ELSE 0 END, ${sortField} ASC`;