@mastra/libsql 1.0.0-beta.11 → 1.0.0-beta.13

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 (33) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/dist/docs/README.md +2 -2
  3. package/dist/docs/SKILL.md +2 -2
  4. package/dist/docs/SOURCE_MAP.json +1 -1
  5. package/dist/docs/agents/01-agent-memory.md +6 -0
  6. package/dist/docs/agents/02-networks.md +56 -0
  7. package/dist/docs/agents/03-agent-approval.md +66 -6
  8. package/dist/docs/agents/04-network-approval.md +274 -0
  9. package/dist/docs/core/01-reference.md +7 -8
  10. package/dist/docs/memory/02-storage.md +77 -25
  11. package/dist/docs/memory/03-working-memory.md +10 -6
  12. package/dist/docs/memory/04-semantic-recall.md +2 -4
  13. package/dist/docs/memory/05-memory-processors.md +2 -3
  14. package/dist/docs/memory/06-reference.md +3 -5
  15. package/dist/docs/rag/01-retrieval.md +5 -6
  16. package/dist/docs/storage/01-reference.md +106 -15
  17. package/dist/docs/vectors/01-reference.md +3 -5
  18. package/dist/index.cjs +165 -71
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.js +165 -71
  21. package/dist/index.js.map +1 -1
  22. package/dist/storage/db/index.d.ts.map +1 -1
  23. package/dist/storage/db/utils.d.ts +16 -1
  24. package/dist/storage/db/utils.d.ts.map +1 -1
  25. package/dist/storage/domains/memory/index.d.ts +2 -2
  26. package/dist/storage/domains/memory/index.d.ts.map +1 -1
  27. package/dist/storage/domains/scores/index.d.ts +0 -1
  28. package/dist/storage/domains/scores/index.d.ts.map +1 -1
  29. package/dist/storage/domains/workflows/index.d.ts +1 -0
  30. package/dist/storage/domains/workflows/index.d.ts.map +1 -1
  31. package/dist/vector/index.d.ts +6 -2
  32. package/dist/vector/index.d.ts.map +1 -1
  33. package/package.json +3 -3
package/dist/index.cjs CHANGED
@@ -511,7 +511,7 @@ var LibSQLVector = class extends vector.MastraVector {
511
511
  maxRetries;
512
512
  initialBackoffMs;
513
513
  constructor({
514
- connectionUrl,
514
+ url,
515
515
  authToken,
516
516
  syncUrl,
517
517
  syncInterval,
@@ -521,14 +521,14 @@ var LibSQLVector = class extends vector.MastraVector {
521
521
  }) {
522
522
  super({ id });
523
523
  this.turso = client.createClient({
524
- url: connectionUrl,
524
+ url,
525
525
  syncUrl,
526
526
  authToken,
527
527
  syncInterval
528
528
  });
529
529
  this.maxRetries = maxRetries;
530
530
  this.initialBackoffMs = initialBackoffMs;
531
- if (connectionUrl.includes(`file:`) || connectionUrl.includes(`:memory:`)) {
531
+ if (url.includes(`file:`) || url.includes(`:memory:`)) {
532
532
  this.turso.execute("PRAGMA journal_mode=WAL;").then(() => this.logger.debug("LibSQLStore: PRAGMA journal_mode=WAL set.")).catch((err) => this.logger.warn("LibSQLStore: Failed to set PRAGMA journal_mode=WAL.", err));
533
533
  this.turso.execute("PRAGMA busy_timeout = 5000;").then(() => this.logger.debug("LibSQLStore: PRAGMA busy_timeout=5000 set.")).catch((err) => this.logger.warn("LibSQLStore: Failed to set PRAGMA busy_timeout=5000.", err));
534
534
  }
@@ -1095,6 +1095,14 @@ var LibSQLVector = class extends vector.MastraVector {
1095
1095
  });
1096
1096
  }
1097
1097
  };
1098
+ function buildSelectColumns(tableName) {
1099
+ const schema = storage.TABLE_SCHEMAS[tableName];
1100
+ return Object.keys(schema).map((col) => {
1101
+ const colDef = schema[col];
1102
+ const parsedCol = utils.parseSqlIdentifier(col, "column name");
1103
+ return colDef?.type === "jsonb" ? `json(${parsedCol}) as ${parsedCol}` : parsedCol;
1104
+ }).join(", ");
1105
+ }
1098
1106
  function isLockError(error) {
1099
1107
  return error.code === "SQLITE_BUSY" || error.code === "SQLITE_LOCKED" || error.message?.toLowerCase().includes("database is locked") || error.message?.toLowerCase().includes("database table is locked") || error.message?.toLowerCase().includes("table is locked") || error.constructor.name === "SqliteError" && error.message?.toLowerCase().includes("locked");
1100
1108
  }
@@ -1143,17 +1151,27 @@ function createExecuteWriteOperationWithRetry({
1143
1151
  }
1144
1152
  function prepareStatement({ tableName, record }) {
1145
1153
  const parsedTableName = utils.parseSqlIdentifier(tableName, "table name");
1146
- const columns = Object.keys(record).map((col) => utils.parseSqlIdentifier(col, "column name"));
1147
- const values = Object.values(record).map((v) => {
1154
+ const schema = storage.TABLE_SCHEMAS[tableName];
1155
+ const columnNames = Object.keys(record);
1156
+ const columns = columnNames.map((col) => utils.parseSqlIdentifier(col, "column name"));
1157
+ const values = columnNames.map((col) => {
1158
+ const v = record[col];
1148
1159
  if (typeof v === `undefined` || v === null) {
1149
1160
  return null;
1150
1161
  }
1162
+ const colDef = schema[col];
1163
+ if (colDef?.type === "jsonb") {
1164
+ return JSON.stringify(v);
1165
+ }
1151
1166
  if (v instanceof Date) {
1152
1167
  return v.toISOString();
1153
1168
  }
1154
1169
  return typeof v === "object" ? JSON.stringify(v) : v;
1155
1170
  });
1156
- const placeholders = values.map(() => "?").join(", ");
1171
+ const placeholders = columnNames.map((col) => {
1172
+ const colDef = schema[col];
1173
+ return colDef?.type === "jsonb" ? "jsonb(?)" : "?";
1174
+ }).join(", ");
1157
1175
  return {
1158
1176
  sql: `INSERT OR REPLACE INTO ${parsedTableName} (${columns.join(", ")}) VALUES (${placeholders})`,
1159
1177
  args: values
@@ -1166,19 +1184,33 @@ function prepareUpdateStatement({
1166
1184
  }) {
1167
1185
  const parsedTableName = utils.parseSqlIdentifier(tableName, "table name");
1168
1186
  const schema = storage.TABLE_SCHEMAS[tableName];
1169
- const updateColumns = Object.keys(updates).map((col) => utils.parseSqlIdentifier(col, "column name"));
1170
- const updateValues = Object.values(updates).map(transformToSqlValue);
1171
- const setClause = updateColumns.map((col) => `${col} = ?`).join(", ");
1187
+ const updateColumnNames = Object.keys(updates);
1188
+ const updateColumns = updateColumnNames.map((col) => utils.parseSqlIdentifier(col, "column name"));
1189
+ const updateValues = updateColumnNames.map((col) => {
1190
+ const colDef = schema[col];
1191
+ const v = updates[col];
1192
+ if (colDef?.type === "jsonb") {
1193
+ return transformToSqlValue(v, true);
1194
+ }
1195
+ return transformToSqlValue(v, false);
1196
+ });
1197
+ const setClause = updateColumns.map((col, i) => {
1198
+ const colDef = schema[updateColumnNames[i]];
1199
+ return colDef?.type === "jsonb" ? `${col} = jsonb(?)` : `${col} = ?`;
1200
+ }).join(", ");
1172
1201
  const whereClause = prepareWhereClause(keys, schema);
1173
1202
  return {
1174
1203
  sql: `UPDATE ${parsedTableName} SET ${setClause}${whereClause.sql}`,
1175
1204
  args: [...updateValues, ...whereClause.args]
1176
1205
  };
1177
1206
  }
1178
- function transformToSqlValue(value) {
1207
+ function transformToSqlValue(value, forceJsonStringify = false) {
1179
1208
  if (typeof value === "undefined" || value === null) {
1180
1209
  return null;
1181
1210
  }
1211
+ if (forceJsonStringify) {
1212
+ return JSON.stringify(value);
1213
+ }
1182
1214
  if (value instanceof Date) {
1183
1215
  return value.toISOString();
1184
1216
  }
@@ -1535,11 +1567,12 @@ var LibSQLDB = class extends base.MastraBase {
1535
1567
  */
1536
1568
  async select({ tableName, keys }) {
1537
1569
  const parsedTableName = utils.parseSqlIdentifier(tableName, "table name");
1570
+ const columns = buildSelectColumns(tableName);
1538
1571
  const parsedKeys = Object.keys(keys).map((key) => utils.parseSqlIdentifier(key, "column name"));
1539
1572
  const conditions = parsedKeys.map((key) => `${key} = ?`).join(" AND ");
1540
1573
  const values = Object.values(keys);
1541
1574
  const result = await this.client.execute({
1542
- sql: `SELECT * FROM ${parsedTableName} WHERE ${conditions} ORDER BY createdAt DESC LIMIT 1`,
1575
+ sql: `SELECT ${columns} FROM ${parsedTableName} WHERE ${conditions} ORDER BY createdAt DESC LIMIT 1`,
1543
1576
  args: values
1544
1577
  });
1545
1578
  if (!result.rows || result.rows.length === 0) {
@@ -1579,7 +1612,8 @@ var LibSQLDB = class extends base.MastraBase {
1579
1612
  args
1580
1613
  }) {
1581
1614
  const parsedTableName = utils.parseSqlIdentifier(tableName, "table name");
1582
- let statement = `SELECT * FROM ${parsedTableName}`;
1615
+ const columns = buildSelectColumns(tableName);
1616
+ let statement = `SELECT ${columns} FROM ${parsedTableName}`;
1583
1617
  if (whereClause?.sql) {
1584
1618
  statement += ` ${whereClause.sql}`;
1585
1619
  }
@@ -1596,7 +1630,17 @@ var LibSQLDB = class extends base.MastraBase {
1596
1630
  sql: statement,
1597
1631
  args: [...whereClause?.args ?? [], ...args ?? []]
1598
1632
  });
1599
- return result.rows;
1633
+ return (result.rows ?? []).map((row) => {
1634
+ return Object.fromEntries(
1635
+ Object.entries(row || {}).map(([k, v]) => {
1636
+ try {
1637
+ return [k, typeof v === "string" ? v.startsWith("{") || v.startsWith("[") ? JSON.parse(v) : v : v];
1638
+ } catch {
1639
+ return [k, v];
1640
+ }
1641
+ })
1642
+ );
1643
+ });
1600
1644
  }
1601
1645
  /**
1602
1646
  * Returns the total count of records matching the optional WHERE clause.
@@ -1640,7 +1684,7 @@ var LibSQLDB = class extends base.MastraBase {
1640
1684
  // SQLite uses 0/1 for booleans
1641
1685
  case "jsonb":
1642
1686
  return "TEXT";
1643
- // Store JSON as TEXT in SQLite
1687
+ // SQLite: column stores TEXT, we use jsonb()/json() functions for binary optimization
1644
1688
  default:
1645
1689
  return storage.getSqlType(type);
1646
1690
  }
@@ -2526,8 +2570,8 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2526
2570
  await this.#db.insert({
2527
2571
  tableName: storage.TABLE_RESOURCES,
2528
2572
  record: {
2529
- ...resource,
2530
- metadata: JSON.stringify(resource.metadata)
2573
+ ...resource
2574
+ // metadata is handled by prepareStatement which stringifies jsonb columns
2531
2575
  }
2532
2576
  });
2533
2577
  return resource;
@@ -2564,7 +2608,7 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2564
2608
  values.push(workingMemory);
2565
2609
  }
2566
2610
  if (metadata) {
2567
- updates.push("metadata = ?");
2611
+ updates.push("metadata = jsonb(?)");
2568
2612
  values.push(JSON.stringify(updatedResource.metadata));
2569
2613
  }
2570
2614
  updates.push("updatedAt = ?");
@@ -2603,33 +2647,76 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2603
2647
  );
2604
2648
  }
2605
2649
  }
2606
- async listThreadsByResourceId(args) {
2607
- const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;
2608
- if (page < 0) {
2650
+ async listThreads(args) {
2651
+ const { page = 0, perPage: perPageInput, orderBy, filter } = args;
2652
+ try {
2653
+ this.validatePaginationInput(page, perPageInput ?? 100);
2654
+ } catch (error$1) {
2609
2655
  throw new error.MastraError(
2610
2656
  {
2611
- id: storage.createStorageErrorId("LIBSQL", "LIST_THREADS_BY_RESOURCE_ID", "INVALID_PAGE"),
2657
+ id: storage.createStorageErrorId("LIBSQL", "LIST_THREADS", "INVALID_PAGE"),
2612
2658
  domain: error.ErrorDomain.STORAGE,
2613
2659
  category: error.ErrorCategory.USER,
2614
- details: { page }
2660
+ details: { page, ...perPageInput !== void 0 && { perPage: perPageInput } }
2615
2661
  },
2616
- new Error("page must be >= 0")
2662
+ error$1 instanceof Error ? error$1 : new Error("Invalid pagination parameters")
2617
2663
  );
2618
2664
  }
2619
2665
  const perPage = storage.normalizePerPage(perPageInput, 100);
2666
+ try {
2667
+ this.validateMetadataKeys(filter?.metadata);
2668
+ } catch (error$1) {
2669
+ throw new error.MastraError(
2670
+ {
2671
+ id: storage.createStorageErrorId("LIBSQL", "LIST_THREADS", "INVALID_METADATA_KEY"),
2672
+ domain: error.ErrorDomain.STORAGE,
2673
+ category: error.ErrorCategory.USER,
2674
+ details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(", ") : "" }
2675
+ },
2676
+ error$1 instanceof Error ? error$1 : new Error("Invalid metadata key")
2677
+ );
2678
+ }
2620
2679
  const { offset, perPage: perPageForResponse } = storage.calculatePagination(page, perPageInput, perPage);
2621
2680
  const { field, direction } = this.parseOrderBy(orderBy);
2622
2681
  try {
2623
- const baseQuery = `FROM ${storage.TABLE_THREADS} WHERE resourceId = ?`;
2624
- const queryParams = [resourceId];
2682
+ const whereClauses = [];
2683
+ const queryParams = [];
2684
+ if (filter?.resourceId) {
2685
+ whereClauses.push("resourceId = ?");
2686
+ queryParams.push(filter.resourceId);
2687
+ }
2688
+ if (filter?.metadata && Object.keys(filter.metadata).length > 0) {
2689
+ for (const [key, value] of Object.entries(filter.metadata)) {
2690
+ if (value === null) {
2691
+ whereClauses.push(`json_extract(metadata, '$.${key}') IS NULL`);
2692
+ } else if (typeof value === "boolean") {
2693
+ whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);
2694
+ queryParams.push(value ? 1 : 0);
2695
+ } else if (typeof value === "number") {
2696
+ whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);
2697
+ queryParams.push(value);
2698
+ } else if (typeof value === "string") {
2699
+ whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);
2700
+ queryParams.push(value);
2701
+ } else {
2702
+ throw new error.MastraError({
2703
+ id: storage.createStorageErrorId("LIBSQL", "LIST_THREADS", "INVALID_METADATA_VALUE"),
2704
+ domain: error.ErrorDomain.STORAGE,
2705
+ category: error.ErrorCategory.USER,
2706
+ text: `Metadata filter value for key "${key}" must be a scalar type (string, number, boolean, or null), got ${typeof value}`,
2707
+ details: { key, valueType: typeof value }
2708
+ });
2709
+ }
2710
+ }
2711
+ }
2712
+ const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(" AND ")}` : "";
2713
+ const baseQuery = `FROM ${storage.TABLE_THREADS} ${whereClause}`;
2625
2714
  const mapRowToStorageThreadType = (row) => ({
2626
2715
  id: row.id,
2627
2716
  resourceId: row.resourceId,
2628
2717
  title: row.title,
2629
2718
  createdAt: new Date(row.createdAt),
2630
- // Convert string to Date
2631
2719
  updatedAt: new Date(row.updatedAt),
2632
- // Convert string to Date
2633
2720
  metadata: typeof row.metadata === "string" ? JSON.parse(row.metadata) : row.metadata
2634
2721
  });
2635
2722
  const countResult = await this.#client.execute({
@@ -2648,7 +2735,7 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2648
2735
  }
2649
2736
  const limitValue = perPageInput === false ? total : perPage;
2650
2737
  const dataResult = await this.#client.execute({
2651
- sql: `SELECT * ${baseQuery} ORDER BY "${field}" ${direction} LIMIT ? OFFSET ?`,
2738
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_THREADS)} ${baseQuery} ORDER BY "${field}" ${direction} LIMIT ? OFFSET ?`,
2652
2739
  args: [...queryParams, limitValue, offset]
2653
2740
  });
2654
2741
  const threads = (dataResult.rows || []).map(mapRowToStorageThreadType);
@@ -2660,12 +2747,18 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2660
2747
  hasMore: perPageInput === false ? false : offset + perPage < total
2661
2748
  };
2662
2749
  } catch (error$1) {
2750
+ if (error$1 instanceof error.MastraError && error$1.category === error.ErrorCategory.USER) {
2751
+ throw error$1;
2752
+ }
2663
2753
  const mastraError = new error.MastraError(
2664
2754
  {
2665
- id: storage.createStorageErrorId("LIBSQL", "LIST_THREADS_BY_RESOURCE_ID", "FAILED"),
2755
+ id: storage.createStorageErrorId("LIBSQL", "LIST_THREADS", "FAILED"),
2666
2756
  domain: error.ErrorDomain.STORAGE,
2667
2757
  category: error.ErrorCategory.THIRD_PARTY,
2668
- details: { resourceId }
2758
+ details: {
2759
+ ...filter?.resourceId && { resourceId: filter.resourceId },
2760
+ hasMetadataFilter: !!filter?.metadata
2761
+ }
2669
2762
  },
2670
2763
  error$1
2671
2764
  );
@@ -2685,8 +2778,8 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2685
2778
  await this.#db.insert({
2686
2779
  tableName: storage.TABLE_THREADS,
2687
2780
  record: {
2688
- ...thread,
2689
- metadata: JSON.stringify(thread.metadata)
2781
+ ...thread
2782
+ // metadata is handled by prepareStatement which stringifies jsonb columns
2690
2783
  }
2691
2784
  });
2692
2785
  return thread;
@@ -2733,7 +2826,7 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2733
2826
  };
2734
2827
  try {
2735
2828
  await this.#client.execute({
2736
- sql: `UPDATE ${storage.TABLE_THREADS} SET title = ?, metadata = ? WHERE id = ?`,
2829
+ sql: `UPDATE ${storage.TABLE_THREADS} SET title = ?, metadata = jsonb(?) WHERE id = ?`,
2737
2830
  args: [title, JSON.stringify(updatedThread.metadata), id]
2738
2831
  });
2739
2832
  return updatedThread;
@@ -2846,7 +2939,7 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2846
2939
  try {
2847
2940
  await tx.execute({
2848
2941
  sql: `INSERT INTO "${storage.TABLE_THREADS}" (id, "resourceId", title, metadata, "createdAt", "updatedAt")
2849
- VALUES (?, ?, ?, ?, ?, ?)`,
2942
+ VALUES (?, ?, ?, jsonb(?), ?, ?)`,
2850
2943
  args: [
2851
2944
  newThread.id,
2852
2945
  newThread.resourceId,
@@ -3395,7 +3488,7 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3395
3488
  const limitValue = perPageInput === false ? total : perPage;
3396
3489
  const end = perPageInput === false ? total : start + perPage;
3397
3490
  const result = await this.#client.execute({
3398
- sql: `SELECT * FROM ${storage.TABLE_SCORERS} WHERE runId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3491
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_SCORERS)} FROM ${storage.TABLE_SCORERS} WHERE runId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3399
3492
  args: [runId, limitValue, start]
3400
3493
  });
3401
3494
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3468,7 +3561,7 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3468
3561
  const limitValue = perPageInput === false ? total : perPage;
3469
3562
  const end = perPageInput === false ? total : start + perPage;
3470
3563
  const result = await this.#client.execute({
3471
- sql: `SELECT * FROM ${storage.TABLE_SCORERS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3564
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_SCORERS)} FROM ${storage.TABLE_SCORERS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3472
3565
  args: [...queryParams, limitValue, start]
3473
3566
  });
3474
3567
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3494,16 +3587,13 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3494
3587
  }
3495
3588
  /**
3496
3589
  * LibSQL-specific score row transformation.
3497
- * Maps additionalLLMContext column to additionalContext field.
3498
3590
  */
3499
3591
  transformScoreRow(row) {
3500
- return storage.transformScoreRow(row, {
3501
- fieldMappings: { additionalContext: "additionalLLMContext" }
3502
- });
3592
+ return storage.transformScoreRow(row);
3503
3593
  }
3504
3594
  async getScoreById({ id }) {
3505
3595
  const result = await this.#client.execute({
3506
- sql: `SELECT * FROM ${storage.TABLE_SCORERS} WHERE id = ?`,
3596
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_SCORERS)} FROM ${storage.TABLE_SCORERS} WHERE id = ?`,
3507
3597
  args: [id]
3508
3598
  });
3509
3599
  return result.rows?.[0] ? this.transformScoreRow(result.rows[0]) : null;
@@ -3581,7 +3671,7 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3581
3671
  const limitValue = perPageInput === false ? total : perPage;
3582
3672
  const end = perPageInput === false ? total : start + perPage;
3583
3673
  const result = await this.#client.execute({
3584
- sql: `SELECT * FROM ${storage.TABLE_SCORERS} WHERE entityId = ? AND entityType = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3674
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_SCORERS)} FROM ${storage.TABLE_SCORERS} WHERE entityId = ? AND entityType = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3585
3675
  args: [entityId, entityType, limitValue, start]
3586
3676
  });
3587
3677
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3622,7 +3712,7 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3622
3712
  const limitValue = perPageInput === false ? total : perPage;
3623
3713
  const end = perPageInput === false ? total : start + perPage;
3624
3714
  const result = await this.#client.execute({
3625
- sql: `SELECT * FROM ${storage.TABLE_SCORERS} WHERE traceId = ? AND spanId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3715
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_SCORERS)} FROM ${storage.TABLE_SCORERS} WHERE traceId = ? AND spanId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3626
3716
  args: [traceId, spanId, limitValue, start]
3627
3717
  });
3628
3718
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3647,24 +3737,6 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3647
3737
  }
3648
3738
  }
3649
3739
  };
3650
- function parseWorkflowRun(row) {
3651
- let parsedSnapshot = row.snapshot;
3652
- if (typeof parsedSnapshot === "string") {
3653
- try {
3654
- parsedSnapshot = JSON.parse(row.snapshot);
3655
- } catch (e) {
3656
- console.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);
3657
- }
3658
- }
3659
- return {
3660
- workflowName: row.workflow_name,
3661
- runId: row.run_id,
3662
- snapshot: parsedSnapshot,
3663
- resourceId: row.resourceId,
3664
- createdAt: new Date(row.createdAt),
3665
- updatedAt: new Date(row.updatedAt)
3666
- };
3667
- }
3668
3740
  var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3669
3741
  #db;
3670
3742
  #client;
@@ -3685,6 +3757,24 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3685
3757
  (err) => this.logger.warn("LibSQL Workflows: Failed to setup PRAGMA settings.", err)
3686
3758
  );
3687
3759
  }
3760
+ parseWorkflowRun(row) {
3761
+ let parsedSnapshot = row.snapshot;
3762
+ if (typeof parsedSnapshot === "string") {
3763
+ try {
3764
+ parsedSnapshot = JSON.parse(row.snapshot);
3765
+ } catch (e) {
3766
+ this.logger.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);
3767
+ }
3768
+ }
3769
+ return {
3770
+ workflowName: row.workflow_name,
3771
+ runId: row.run_id,
3772
+ snapshot: parsedSnapshot,
3773
+ resourceId: row.resourceId,
3774
+ createdAt: new Date(row.createdAt),
3775
+ updatedAt: new Date(row.updatedAt)
3776
+ };
3777
+ }
3688
3778
  async init() {
3689
3779
  const schema = storage.TABLE_SCHEMAS[storage.TABLE_WORKFLOW_SNAPSHOT];
3690
3780
  await this.#db.createTable({ tableName: storage.TABLE_WORKFLOW_SNAPSHOT, schema });
@@ -3728,7 +3818,7 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3728
3818
  const tx = await this.#client.transaction("write");
3729
3819
  try {
3730
3820
  const existingSnapshotResult = await tx.execute({
3731
- sql: `SELECT snapshot FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3821
+ sql: `SELECT json(snapshot) as snapshot FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3732
3822
  args: [workflowName, runId]
3733
3823
  });
3734
3824
  let snapshot;
@@ -3753,9 +3843,13 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3753
3843
  }
3754
3844
  snapshot.context[stepId] = result;
3755
3845
  snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };
3846
+ const now = (/* @__PURE__ */ new Date()).toISOString();
3756
3847
  await tx.execute({
3757
- sql: `UPDATE ${storage.TABLE_WORKFLOW_SNAPSHOT} SET snapshot = ? WHERE workflow_name = ? AND run_id = ?`,
3758
- args: [JSON.stringify(snapshot), workflowName, runId]
3848
+ sql: `INSERT INTO ${storage.TABLE_WORKFLOW_SNAPSHOT} (workflow_name, run_id, snapshot, createdAt, updatedAt)
3849
+ VALUES (?, ?, jsonb(?), ?, ?)
3850
+ ON CONFLICT(workflow_name, run_id)
3851
+ DO UPDATE SET snapshot = excluded.snapshot, updatedAt = excluded.updatedAt`,
3852
+ args: [workflowName, runId, JSON.stringify(snapshot), now, now]
3759
3853
  });
3760
3854
  await tx.commit();
3761
3855
  return snapshot.context;
@@ -3776,7 +3870,7 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3776
3870
  const tx = await this.#client.transaction("write");
3777
3871
  try {
3778
3872
  const existingSnapshotResult = await tx.execute({
3779
- sql: `SELECT snapshot FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3873
+ sql: `SELECT json(snapshot) as snapshot FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3780
3874
  args: [workflowName, runId]
3781
3875
  });
3782
3876
  if (!existingSnapshotResult.rows?.[0]) {
@@ -3791,7 +3885,7 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3791
3885
  }
3792
3886
  const updatedSnapshot = { ...snapshot, ...opts };
3793
3887
  await tx.execute({
3794
- sql: `UPDATE ${storage.TABLE_WORKFLOW_SNAPSHOT} SET snapshot = ? WHERE workflow_name = ? AND run_id = ?`,
3888
+ sql: `UPDATE ${storage.TABLE_WORKFLOW_SNAPSHOT} SET snapshot = jsonb(?) WHERE workflow_name = ? AND run_id = ?`,
3795
3889
  args: [JSON.stringify(updatedSnapshot), workflowName, runId]
3796
3890
  });
3797
3891
  await tx.commit();
@@ -3855,13 +3949,13 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3855
3949
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
3856
3950
  try {
3857
3951
  const result = await this.#client.execute({
3858
- sql: `SELECT * FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC LIMIT 1`,
3952
+ sql: `SELECT workflow_name, run_id, resourceId, json(snapshot) as snapshot, createdAt, updatedAt FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC LIMIT 1`,
3859
3953
  args
3860
3954
  });
3861
3955
  if (!result.rows?.[0]) {
3862
3956
  return null;
3863
3957
  }
3864
- return parseWorkflowRun(result.rows[0]);
3958
+ return this.parseWorkflowRun(result.rows[0]);
3865
3959
  } catch (error$1) {
3866
3960
  throw new error.MastraError(
3867
3961
  {
@@ -3927,7 +4021,7 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3927
4021
  conditions.push("resourceId = ?");
3928
4022
  args.push(resourceId);
3929
4023
  } else {
3930
- console.warn(`[${storage.TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);
4024
+ this.logger.warn(`[${storage.TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);
3931
4025
  }
3932
4026
  }
3933
4027
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
@@ -3943,10 +4037,10 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3943
4037
  const normalizedPerPage = usePagination ? storage.normalizePerPage(perPage, Number.MAX_SAFE_INTEGER) : 0;
3944
4038
  const offset = usePagination ? page * normalizedPerPage : 0;
3945
4039
  const result = await this.#client.execute({
3946
- sql: `SELECT * FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC${usePagination ? ` LIMIT ? OFFSET ?` : ""}`,
4040
+ sql: `SELECT workflow_name, run_id, resourceId, json(snapshot) as snapshot, createdAt, updatedAt FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC${usePagination ? ` LIMIT ? OFFSET ?` : ""}`,
3947
4041
  args: usePagination ? [...args, normalizedPerPage, offset] : args
3948
4042
  });
3949
- const runs = (result.rows || []).map((row) => parseWorkflowRun(row));
4043
+ const runs = (result.rows || []).map((row) => this.parseWorkflowRun(row));
3950
4044
  return { runs, total: total || runs.length };
3951
4045
  } catch (error$1) {
3952
4046
  throw new error.MastraError(