@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.js CHANGED
@@ -509,7 +509,7 @@ var LibSQLVector = class extends MastraVector {
509
509
  maxRetries;
510
510
  initialBackoffMs;
511
511
  constructor({
512
- connectionUrl,
512
+ url,
513
513
  authToken,
514
514
  syncUrl,
515
515
  syncInterval,
@@ -519,14 +519,14 @@ var LibSQLVector = class extends MastraVector {
519
519
  }) {
520
520
  super({ id });
521
521
  this.turso = createClient({
522
- url: connectionUrl,
522
+ url,
523
523
  syncUrl,
524
524
  authToken,
525
525
  syncInterval
526
526
  });
527
527
  this.maxRetries = maxRetries;
528
528
  this.initialBackoffMs = initialBackoffMs;
529
- if (connectionUrl.includes(`file:`) || connectionUrl.includes(`:memory:`)) {
529
+ if (url.includes(`file:`) || url.includes(`:memory:`)) {
530
530
  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));
531
531
  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));
532
532
  }
@@ -1093,6 +1093,14 @@ var LibSQLVector = class extends MastraVector {
1093
1093
  });
1094
1094
  }
1095
1095
  };
1096
+ function buildSelectColumns(tableName) {
1097
+ const schema = TABLE_SCHEMAS[tableName];
1098
+ return Object.keys(schema).map((col) => {
1099
+ const colDef = schema[col];
1100
+ const parsedCol = parseSqlIdentifier(col, "column name");
1101
+ return colDef?.type === "jsonb" ? `json(${parsedCol}) as ${parsedCol}` : parsedCol;
1102
+ }).join(", ");
1103
+ }
1096
1104
  function isLockError(error) {
1097
1105
  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");
1098
1106
  }
@@ -1141,17 +1149,27 @@ function createExecuteWriteOperationWithRetry({
1141
1149
  }
1142
1150
  function prepareStatement({ tableName, record }) {
1143
1151
  const parsedTableName = parseSqlIdentifier(tableName, "table name");
1144
- const columns = Object.keys(record).map((col) => parseSqlIdentifier(col, "column name"));
1145
- const values = Object.values(record).map((v) => {
1152
+ const schema = TABLE_SCHEMAS[tableName];
1153
+ const columnNames = Object.keys(record);
1154
+ const columns = columnNames.map((col) => parseSqlIdentifier(col, "column name"));
1155
+ const values = columnNames.map((col) => {
1156
+ const v = record[col];
1146
1157
  if (typeof v === `undefined` || v === null) {
1147
1158
  return null;
1148
1159
  }
1160
+ const colDef = schema[col];
1161
+ if (colDef?.type === "jsonb") {
1162
+ return JSON.stringify(v);
1163
+ }
1149
1164
  if (v instanceof Date) {
1150
1165
  return v.toISOString();
1151
1166
  }
1152
1167
  return typeof v === "object" ? JSON.stringify(v) : v;
1153
1168
  });
1154
- const placeholders = values.map(() => "?").join(", ");
1169
+ const placeholders = columnNames.map((col) => {
1170
+ const colDef = schema[col];
1171
+ return colDef?.type === "jsonb" ? "jsonb(?)" : "?";
1172
+ }).join(", ");
1155
1173
  return {
1156
1174
  sql: `INSERT OR REPLACE INTO ${parsedTableName} (${columns.join(", ")}) VALUES (${placeholders})`,
1157
1175
  args: values
@@ -1164,19 +1182,33 @@ function prepareUpdateStatement({
1164
1182
  }) {
1165
1183
  const parsedTableName = parseSqlIdentifier(tableName, "table name");
1166
1184
  const schema = TABLE_SCHEMAS[tableName];
1167
- const updateColumns = Object.keys(updates).map((col) => parseSqlIdentifier(col, "column name"));
1168
- const updateValues = Object.values(updates).map(transformToSqlValue);
1169
- const setClause = updateColumns.map((col) => `${col} = ?`).join(", ");
1185
+ const updateColumnNames = Object.keys(updates);
1186
+ const updateColumns = updateColumnNames.map((col) => parseSqlIdentifier(col, "column name"));
1187
+ const updateValues = updateColumnNames.map((col) => {
1188
+ const colDef = schema[col];
1189
+ const v = updates[col];
1190
+ if (colDef?.type === "jsonb") {
1191
+ return transformToSqlValue(v, true);
1192
+ }
1193
+ return transformToSqlValue(v, false);
1194
+ });
1195
+ const setClause = updateColumns.map((col, i) => {
1196
+ const colDef = schema[updateColumnNames[i]];
1197
+ return colDef?.type === "jsonb" ? `${col} = jsonb(?)` : `${col} = ?`;
1198
+ }).join(", ");
1170
1199
  const whereClause = prepareWhereClause(keys, schema);
1171
1200
  return {
1172
1201
  sql: `UPDATE ${parsedTableName} SET ${setClause}${whereClause.sql}`,
1173
1202
  args: [...updateValues, ...whereClause.args]
1174
1203
  };
1175
1204
  }
1176
- function transformToSqlValue(value) {
1205
+ function transformToSqlValue(value, forceJsonStringify = false) {
1177
1206
  if (typeof value === "undefined" || value === null) {
1178
1207
  return null;
1179
1208
  }
1209
+ if (forceJsonStringify) {
1210
+ return JSON.stringify(value);
1211
+ }
1180
1212
  if (value instanceof Date) {
1181
1213
  return value.toISOString();
1182
1214
  }
@@ -1533,11 +1565,12 @@ var LibSQLDB = class extends MastraBase {
1533
1565
  */
1534
1566
  async select({ tableName, keys }) {
1535
1567
  const parsedTableName = parseSqlIdentifier(tableName, "table name");
1568
+ const columns = buildSelectColumns(tableName);
1536
1569
  const parsedKeys = Object.keys(keys).map((key) => parseSqlIdentifier(key, "column name"));
1537
1570
  const conditions = parsedKeys.map((key) => `${key} = ?`).join(" AND ");
1538
1571
  const values = Object.values(keys);
1539
1572
  const result = await this.client.execute({
1540
- sql: `SELECT * FROM ${parsedTableName} WHERE ${conditions} ORDER BY createdAt DESC LIMIT 1`,
1573
+ sql: `SELECT ${columns} FROM ${parsedTableName} WHERE ${conditions} ORDER BY createdAt DESC LIMIT 1`,
1541
1574
  args: values
1542
1575
  });
1543
1576
  if (!result.rows || result.rows.length === 0) {
@@ -1577,7 +1610,8 @@ var LibSQLDB = class extends MastraBase {
1577
1610
  args
1578
1611
  }) {
1579
1612
  const parsedTableName = parseSqlIdentifier(tableName, "table name");
1580
- let statement = `SELECT * FROM ${parsedTableName}`;
1613
+ const columns = buildSelectColumns(tableName);
1614
+ let statement = `SELECT ${columns} FROM ${parsedTableName}`;
1581
1615
  if (whereClause?.sql) {
1582
1616
  statement += ` ${whereClause.sql}`;
1583
1617
  }
@@ -1594,7 +1628,17 @@ var LibSQLDB = class extends MastraBase {
1594
1628
  sql: statement,
1595
1629
  args: [...whereClause?.args ?? [], ...args ?? []]
1596
1630
  });
1597
- return result.rows;
1631
+ return (result.rows ?? []).map((row) => {
1632
+ return Object.fromEntries(
1633
+ Object.entries(row || {}).map(([k, v]) => {
1634
+ try {
1635
+ return [k, typeof v === "string" ? v.startsWith("{") || v.startsWith("[") ? JSON.parse(v) : v : v];
1636
+ } catch {
1637
+ return [k, v];
1638
+ }
1639
+ })
1640
+ );
1641
+ });
1598
1642
  }
1599
1643
  /**
1600
1644
  * Returns the total count of records matching the optional WHERE clause.
@@ -1638,7 +1682,7 @@ var LibSQLDB = class extends MastraBase {
1638
1682
  // SQLite uses 0/1 for booleans
1639
1683
  case "jsonb":
1640
1684
  return "TEXT";
1641
- // Store JSON as TEXT in SQLite
1685
+ // SQLite: column stores TEXT, we use jsonb()/json() functions for binary optimization
1642
1686
  default:
1643
1687
  return getSqlType(type);
1644
1688
  }
@@ -2524,8 +2568,8 @@ var MemoryLibSQL = class extends MemoryStorage {
2524
2568
  await this.#db.insert({
2525
2569
  tableName: TABLE_RESOURCES,
2526
2570
  record: {
2527
- ...resource,
2528
- metadata: JSON.stringify(resource.metadata)
2571
+ ...resource
2572
+ // metadata is handled by prepareStatement which stringifies jsonb columns
2529
2573
  }
2530
2574
  });
2531
2575
  return resource;
@@ -2562,7 +2606,7 @@ var MemoryLibSQL = class extends MemoryStorage {
2562
2606
  values.push(workingMemory);
2563
2607
  }
2564
2608
  if (metadata) {
2565
- updates.push("metadata = ?");
2609
+ updates.push("metadata = jsonb(?)");
2566
2610
  values.push(JSON.stringify(updatedResource.metadata));
2567
2611
  }
2568
2612
  updates.push("updatedAt = ?");
@@ -2601,33 +2645,76 @@ var MemoryLibSQL = class extends MemoryStorage {
2601
2645
  );
2602
2646
  }
2603
2647
  }
2604
- async listThreadsByResourceId(args) {
2605
- const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;
2606
- if (page < 0) {
2648
+ async listThreads(args) {
2649
+ const { page = 0, perPage: perPageInput, orderBy, filter } = args;
2650
+ try {
2651
+ this.validatePaginationInput(page, perPageInput ?? 100);
2652
+ } catch (error) {
2607
2653
  throw new MastraError(
2608
2654
  {
2609
- id: createStorageErrorId("LIBSQL", "LIST_THREADS_BY_RESOURCE_ID", "INVALID_PAGE"),
2655
+ id: createStorageErrorId("LIBSQL", "LIST_THREADS", "INVALID_PAGE"),
2610
2656
  domain: ErrorDomain.STORAGE,
2611
2657
  category: ErrorCategory.USER,
2612
- details: { page }
2658
+ details: { page, ...perPageInput !== void 0 && { perPage: perPageInput } }
2613
2659
  },
2614
- new Error("page must be >= 0")
2660
+ error instanceof Error ? error : new Error("Invalid pagination parameters")
2615
2661
  );
2616
2662
  }
2617
2663
  const perPage = normalizePerPage(perPageInput, 100);
2664
+ try {
2665
+ this.validateMetadataKeys(filter?.metadata);
2666
+ } catch (error) {
2667
+ throw new MastraError(
2668
+ {
2669
+ id: createStorageErrorId("LIBSQL", "LIST_THREADS", "INVALID_METADATA_KEY"),
2670
+ domain: ErrorDomain.STORAGE,
2671
+ category: ErrorCategory.USER,
2672
+ details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(", ") : "" }
2673
+ },
2674
+ error instanceof Error ? error : new Error("Invalid metadata key")
2675
+ );
2676
+ }
2618
2677
  const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
2619
2678
  const { field, direction } = this.parseOrderBy(orderBy);
2620
2679
  try {
2621
- const baseQuery = `FROM ${TABLE_THREADS} WHERE resourceId = ?`;
2622
- const queryParams = [resourceId];
2680
+ const whereClauses = [];
2681
+ const queryParams = [];
2682
+ if (filter?.resourceId) {
2683
+ whereClauses.push("resourceId = ?");
2684
+ queryParams.push(filter.resourceId);
2685
+ }
2686
+ if (filter?.metadata && Object.keys(filter.metadata).length > 0) {
2687
+ for (const [key, value] of Object.entries(filter.metadata)) {
2688
+ if (value === null) {
2689
+ whereClauses.push(`json_extract(metadata, '$.${key}') IS NULL`);
2690
+ } else if (typeof value === "boolean") {
2691
+ whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);
2692
+ queryParams.push(value ? 1 : 0);
2693
+ } else if (typeof value === "number") {
2694
+ whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);
2695
+ queryParams.push(value);
2696
+ } else if (typeof value === "string") {
2697
+ whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);
2698
+ queryParams.push(value);
2699
+ } else {
2700
+ throw new MastraError({
2701
+ id: createStorageErrorId("LIBSQL", "LIST_THREADS", "INVALID_METADATA_VALUE"),
2702
+ domain: ErrorDomain.STORAGE,
2703
+ category: ErrorCategory.USER,
2704
+ text: `Metadata filter value for key "${key}" must be a scalar type (string, number, boolean, or null), got ${typeof value}`,
2705
+ details: { key, valueType: typeof value }
2706
+ });
2707
+ }
2708
+ }
2709
+ }
2710
+ const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(" AND ")}` : "";
2711
+ const baseQuery = `FROM ${TABLE_THREADS} ${whereClause}`;
2623
2712
  const mapRowToStorageThreadType = (row) => ({
2624
2713
  id: row.id,
2625
2714
  resourceId: row.resourceId,
2626
2715
  title: row.title,
2627
2716
  createdAt: new Date(row.createdAt),
2628
- // Convert string to Date
2629
2717
  updatedAt: new Date(row.updatedAt),
2630
- // Convert string to Date
2631
2718
  metadata: typeof row.metadata === "string" ? JSON.parse(row.metadata) : row.metadata
2632
2719
  });
2633
2720
  const countResult = await this.#client.execute({
@@ -2646,7 +2733,7 @@ var MemoryLibSQL = class extends MemoryStorage {
2646
2733
  }
2647
2734
  const limitValue = perPageInput === false ? total : perPage;
2648
2735
  const dataResult = await this.#client.execute({
2649
- sql: `SELECT * ${baseQuery} ORDER BY "${field}" ${direction} LIMIT ? OFFSET ?`,
2736
+ sql: `SELECT ${buildSelectColumns(TABLE_THREADS)} ${baseQuery} ORDER BY "${field}" ${direction} LIMIT ? OFFSET ?`,
2650
2737
  args: [...queryParams, limitValue, offset]
2651
2738
  });
2652
2739
  const threads = (dataResult.rows || []).map(mapRowToStorageThreadType);
@@ -2658,12 +2745,18 @@ var MemoryLibSQL = class extends MemoryStorage {
2658
2745
  hasMore: perPageInput === false ? false : offset + perPage < total
2659
2746
  };
2660
2747
  } catch (error) {
2748
+ if (error instanceof MastraError && error.category === ErrorCategory.USER) {
2749
+ throw error;
2750
+ }
2661
2751
  const mastraError = new MastraError(
2662
2752
  {
2663
- id: createStorageErrorId("LIBSQL", "LIST_THREADS_BY_RESOURCE_ID", "FAILED"),
2753
+ id: createStorageErrorId("LIBSQL", "LIST_THREADS", "FAILED"),
2664
2754
  domain: ErrorDomain.STORAGE,
2665
2755
  category: ErrorCategory.THIRD_PARTY,
2666
- details: { resourceId }
2756
+ details: {
2757
+ ...filter?.resourceId && { resourceId: filter.resourceId },
2758
+ hasMetadataFilter: !!filter?.metadata
2759
+ }
2667
2760
  },
2668
2761
  error
2669
2762
  );
@@ -2683,8 +2776,8 @@ var MemoryLibSQL = class extends MemoryStorage {
2683
2776
  await this.#db.insert({
2684
2777
  tableName: TABLE_THREADS,
2685
2778
  record: {
2686
- ...thread,
2687
- metadata: JSON.stringify(thread.metadata)
2779
+ ...thread
2780
+ // metadata is handled by prepareStatement which stringifies jsonb columns
2688
2781
  }
2689
2782
  });
2690
2783
  return thread;
@@ -2731,7 +2824,7 @@ var MemoryLibSQL = class extends MemoryStorage {
2731
2824
  };
2732
2825
  try {
2733
2826
  await this.#client.execute({
2734
- sql: `UPDATE ${TABLE_THREADS} SET title = ?, metadata = ? WHERE id = ?`,
2827
+ sql: `UPDATE ${TABLE_THREADS} SET title = ?, metadata = jsonb(?) WHERE id = ?`,
2735
2828
  args: [title, JSON.stringify(updatedThread.metadata), id]
2736
2829
  });
2737
2830
  return updatedThread;
@@ -2844,7 +2937,7 @@ var MemoryLibSQL = class extends MemoryStorage {
2844
2937
  try {
2845
2938
  await tx.execute({
2846
2939
  sql: `INSERT INTO "${TABLE_THREADS}" (id, "resourceId", title, metadata, "createdAt", "updatedAt")
2847
- VALUES (?, ?, ?, ?, ?, ?)`,
2940
+ VALUES (?, ?, ?, jsonb(?), ?, ?)`,
2848
2941
  args: [
2849
2942
  newThread.id,
2850
2943
  newThread.resourceId,
@@ -3393,7 +3486,7 @@ var ScoresLibSQL = class extends ScoresStorage {
3393
3486
  const limitValue = perPageInput === false ? total : perPage;
3394
3487
  const end = perPageInput === false ? total : start + perPage;
3395
3488
  const result = await this.#client.execute({
3396
- sql: `SELECT * FROM ${TABLE_SCORERS} WHERE runId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3489
+ sql: `SELECT ${buildSelectColumns(TABLE_SCORERS)} FROM ${TABLE_SCORERS} WHERE runId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3397
3490
  args: [runId, limitValue, start]
3398
3491
  });
3399
3492
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3466,7 +3559,7 @@ var ScoresLibSQL = class extends ScoresStorage {
3466
3559
  const limitValue = perPageInput === false ? total : perPage;
3467
3560
  const end = perPageInput === false ? total : start + perPage;
3468
3561
  const result = await this.#client.execute({
3469
- sql: `SELECT * FROM ${TABLE_SCORERS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3562
+ sql: `SELECT ${buildSelectColumns(TABLE_SCORERS)} FROM ${TABLE_SCORERS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3470
3563
  args: [...queryParams, limitValue, start]
3471
3564
  });
3472
3565
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3492,16 +3585,13 @@ var ScoresLibSQL = class extends ScoresStorage {
3492
3585
  }
3493
3586
  /**
3494
3587
  * LibSQL-specific score row transformation.
3495
- * Maps additionalLLMContext column to additionalContext field.
3496
3588
  */
3497
3589
  transformScoreRow(row) {
3498
- return transformScoreRow(row, {
3499
- fieldMappings: { additionalContext: "additionalLLMContext" }
3500
- });
3590
+ return transformScoreRow(row);
3501
3591
  }
3502
3592
  async getScoreById({ id }) {
3503
3593
  const result = await this.#client.execute({
3504
- sql: `SELECT * FROM ${TABLE_SCORERS} WHERE id = ?`,
3594
+ sql: `SELECT ${buildSelectColumns(TABLE_SCORERS)} FROM ${TABLE_SCORERS} WHERE id = ?`,
3505
3595
  args: [id]
3506
3596
  });
3507
3597
  return result.rows?.[0] ? this.transformScoreRow(result.rows[0]) : null;
@@ -3579,7 +3669,7 @@ var ScoresLibSQL = class extends ScoresStorage {
3579
3669
  const limitValue = perPageInput === false ? total : perPage;
3580
3670
  const end = perPageInput === false ? total : start + perPage;
3581
3671
  const result = await this.#client.execute({
3582
- sql: `SELECT * FROM ${TABLE_SCORERS} WHERE entityId = ? AND entityType = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3672
+ sql: `SELECT ${buildSelectColumns(TABLE_SCORERS)} FROM ${TABLE_SCORERS} WHERE entityId = ? AND entityType = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3583
3673
  args: [entityId, entityType, limitValue, start]
3584
3674
  });
3585
3675
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3620,7 +3710,7 @@ var ScoresLibSQL = class extends ScoresStorage {
3620
3710
  const limitValue = perPageInput === false ? total : perPage;
3621
3711
  const end = perPageInput === false ? total : start + perPage;
3622
3712
  const result = await this.#client.execute({
3623
- sql: `SELECT * FROM ${TABLE_SCORERS} WHERE traceId = ? AND spanId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3713
+ sql: `SELECT ${buildSelectColumns(TABLE_SCORERS)} FROM ${TABLE_SCORERS} WHERE traceId = ? AND spanId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3624
3714
  args: [traceId, spanId, limitValue, start]
3625
3715
  });
3626
3716
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3645,24 +3735,6 @@ var ScoresLibSQL = class extends ScoresStorage {
3645
3735
  }
3646
3736
  }
3647
3737
  };
3648
- function parseWorkflowRun(row) {
3649
- let parsedSnapshot = row.snapshot;
3650
- if (typeof parsedSnapshot === "string") {
3651
- try {
3652
- parsedSnapshot = JSON.parse(row.snapshot);
3653
- } catch (e) {
3654
- console.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);
3655
- }
3656
- }
3657
- return {
3658
- workflowName: row.workflow_name,
3659
- runId: row.run_id,
3660
- snapshot: parsedSnapshot,
3661
- resourceId: row.resourceId,
3662
- createdAt: new Date(row.createdAt),
3663
- updatedAt: new Date(row.updatedAt)
3664
- };
3665
- }
3666
3738
  var WorkflowsLibSQL = class extends WorkflowsStorage {
3667
3739
  #db;
3668
3740
  #client;
@@ -3683,6 +3755,24 @@ var WorkflowsLibSQL = class extends WorkflowsStorage {
3683
3755
  (err) => this.logger.warn("LibSQL Workflows: Failed to setup PRAGMA settings.", err)
3684
3756
  );
3685
3757
  }
3758
+ parseWorkflowRun(row) {
3759
+ let parsedSnapshot = row.snapshot;
3760
+ if (typeof parsedSnapshot === "string") {
3761
+ try {
3762
+ parsedSnapshot = JSON.parse(row.snapshot);
3763
+ } catch (e) {
3764
+ this.logger.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);
3765
+ }
3766
+ }
3767
+ return {
3768
+ workflowName: row.workflow_name,
3769
+ runId: row.run_id,
3770
+ snapshot: parsedSnapshot,
3771
+ resourceId: row.resourceId,
3772
+ createdAt: new Date(row.createdAt),
3773
+ updatedAt: new Date(row.updatedAt)
3774
+ };
3775
+ }
3686
3776
  async init() {
3687
3777
  const schema = TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT];
3688
3778
  await this.#db.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema });
@@ -3726,7 +3816,7 @@ var WorkflowsLibSQL = class extends WorkflowsStorage {
3726
3816
  const tx = await this.#client.transaction("write");
3727
3817
  try {
3728
3818
  const existingSnapshotResult = await tx.execute({
3729
- sql: `SELECT snapshot FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3819
+ sql: `SELECT json(snapshot) as snapshot FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3730
3820
  args: [workflowName, runId]
3731
3821
  });
3732
3822
  let snapshot;
@@ -3751,9 +3841,13 @@ var WorkflowsLibSQL = class extends WorkflowsStorage {
3751
3841
  }
3752
3842
  snapshot.context[stepId] = result;
3753
3843
  snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };
3844
+ const now = (/* @__PURE__ */ new Date()).toISOString();
3754
3845
  await tx.execute({
3755
- sql: `UPDATE ${TABLE_WORKFLOW_SNAPSHOT} SET snapshot = ? WHERE workflow_name = ? AND run_id = ?`,
3756
- args: [JSON.stringify(snapshot), workflowName, runId]
3846
+ sql: `INSERT INTO ${TABLE_WORKFLOW_SNAPSHOT} (workflow_name, run_id, snapshot, createdAt, updatedAt)
3847
+ VALUES (?, ?, jsonb(?), ?, ?)
3848
+ ON CONFLICT(workflow_name, run_id)
3849
+ DO UPDATE SET snapshot = excluded.snapshot, updatedAt = excluded.updatedAt`,
3850
+ args: [workflowName, runId, JSON.stringify(snapshot), now, now]
3757
3851
  });
3758
3852
  await tx.commit();
3759
3853
  return snapshot.context;
@@ -3774,7 +3868,7 @@ var WorkflowsLibSQL = class extends WorkflowsStorage {
3774
3868
  const tx = await this.#client.transaction("write");
3775
3869
  try {
3776
3870
  const existingSnapshotResult = await tx.execute({
3777
- sql: `SELECT snapshot FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3871
+ sql: `SELECT json(snapshot) as snapshot FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3778
3872
  args: [workflowName, runId]
3779
3873
  });
3780
3874
  if (!existingSnapshotResult.rows?.[0]) {
@@ -3789,7 +3883,7 @@ var WorkflowsLibSQL = class extends WorkflowsStorage {
3789
3883
  }
3790
3884
  const updatedSnapshot = { ...snapshot, ...opts };
3791
3885
  await tx.execute({
3792
- sql: `UPDATE ${TABLE_WORKFLOW_SNAPSHOT} SET snapshot = ? WHERE workflow_name = ? AND run_id = ?`,
3886
+ sql: `UPDATE ${TABLE_WORKFLOW_SNAPSHOT} SET snapshot = jsonb(?) WHERE workflow_name = ? AND run_id = ?`,
3793
3887
  args: [JSON.stringify(updatedSnapshot), workflowName, runId]
3794
3888
  });
3795
3889
  await tx.commit();
@@ -3853,13 +3947,13 @@ var WorkflowsLibSQL = class extends WorkflowsStorage {
3853
3947
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
3854
3948
  try {
3855
3949
  const result = await this.#client.execute({
3856
- sql: `SELECT * FROM ${TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC LIMIT 1`,
3950
+ sql: `SELECT workflow_name, run_id, resourceId, json(snapshot) as snapshot, createdAt, updatedAt FROM ${TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC LIMIT 1`,
3857
3951
  args
3858
3952
  });
3859
3953
  if (!result.rows?.[0]) {
3860
3954
  return null;
3861
3955
  }
3862
- return parseWorkflowRun(result.rows[0]);
3956
+ return this.parseWorkflowRun(result.rows[0]);
3863
3957
  } catch (error) {
3864
3958
  throw new MastraError(
3865
3959
  {
@@ -3925,7 +4019,7 @@ var WorkflowsLibSQL = class extends WorkflowsStorage {
3925
4019
  conditions.push("resourceId = ?");
3926
4020
  args.push(resourceId);
3927
4021
  } else {
3928
- console.warn(`[${TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);
4022
+ this.logger.warn(`[${TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);
3929
4023
  }
3930
4024
  }
3931
4025
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
@@ -3941,10 +4035,10 @@ var WorkflowsLibSQL = class extends WorkflowsStorage {
3941
4035
  const normalizedPerPage = usePagination ? normalizePerPage(perPage, Number.MAX_SAFE_INTEGER) : 0;
3942
4036
  const offset = usePagination ? page * normalizedPerPage : 0;
3943
4037
  const result = await this.#client.execute({
3944
- sql: `SELECT * FROM ${TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC${usePagination ? ` LIMIT ? OFFSET ?` : ""}`,
4038
+ sql: `SELECT workflow_name, run_id, resourceId, json(snapshot) as snapshot, createdAt, updatedAt FROM ${TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC${usePagination ? ` LIMIT ? OFFSET ?` : ""}`,
3945
4039
  args: usePagination ? [...args, normalizedPerPage, offset] : args
3946
4040
  });
3947
- const runs = (result.rows || []).map((row) => parseWorkflowRun(row));
4041
+ const runs = (result.rows || []).map((row) => this.parseWorkflowRun(row));
3948
4042
  return { runs, total: total || runs.length };
3949
4043
  } catch (error) {
3950
4044
  throw new MastraError(