@mastra/libsql 1.0.0-beta.10 → 1.0.0-beta.12

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 (38) hide show
  1. package/CHANGELOG.md +184 -0
  2. package/dist/docs/README.md +39 -0
  3. package/dist/docs/SKILL.md +40 -0
  4. package/dist/docs/SOURCE_MAP.json +6 -0
  5. package/dist/docs/agents/01-agent-memory.md +160 -0
  6. package/dist/docs/agents/02-networks.md +292 -0
  7. package/dist/docs/agents/03-agent-approval.md +316 -0
  8. package/dist/docs/agents/04-network-approval.md +274 -0
  9. package/dist/docs/core/01-reference.md +151 -0
  10. package/dist/docs/guides/01-ai-sdk.md +141 -0
  11. package/dist/docs/memory/01-overview.md +76 -0
  12. package/dist/docs/memory/02-storage.md +215 -0
  13. package/dist/docs/memory/03-working-memory.md +390 -0
  14. package/dist/docs/memory/04-semantic-recall.md +233 -0
  15. package/dist/docs/memory/05-memory-processors.md +318 -0
  16. package/dist/docs/memory/06-reference.md +133 -0
  17. package/dist/docs/observability/01-overview.md +64 -0
  18. package/dist/docs/observability/02-default.md +177 -0
  19. package/dist/docs/rag/01-retrieval.md +548 -0
  20. package/dist/docs/storage/01-reference.md +542 -0
  21. package/dist/docs/vectors/01-reference.md +213 -0
  22. package/dist/docs/workflows/01-snapshots.md +240 -0
  23. package/dist/index.cjs +249 -60
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.js +249 -60
  26. package/dist/index.js.map +1 -1
  27. package/dist/storage/db/index.d.ts.map +1 -1
  28. package/dist/storage/db/utils.d.ts +16 -1
  29. package/dist/storage/db/utils.d.ts.map +1 -1
  30. package/dist/storage/domains/memory/index.d.ts +2 -1
  31. package/dist/storage/domains/memory/index.d.ts.map +1 -1
  32. package/dist/storage/domains/scores/index.d.ts +0 -1
  33. package/dist/storage/domains/scores/index.d.ts.map +1 -1
  34. package/dist/storage/domains/workflows/index.d.ts +1 -0
  35. package/dist/storage/domains/workflows/index.d.ts.map +1 -1
  36. package/dist/vector/index.d.ts +6 -2
  37. package/dist/vector/index.d.ts.map +1 -1
  38. package/package.json +6 -5
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
  }
@@ -2212,13 +2256,15 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2212
2256
  queryParams.push(resourceId);
2213
2257
  }
2214
2258
  if (filter?.dateRange?.start) {
2215
- conditions.push(`"createdAt" >= ?`);
2259
+ const startOp = filter.dateRange.startExclusive ? ">" : ">=";
2260
+ conditions.push(`"createdAt" ${startOp} ?`);
2216
2261
  queryParams.push(
2217
2262
  filter.dateRange.start instanceof Date ? filter.dateRange.start.toISOString() : filter.dateRange.start
2218
2263
  );
2219
2264
  }
2220
2265
  if (filter?.dateRange?.end) {
2221
- conditions.push(`"createdAt" <= ?`);
2266
+ const endOp = filter.dateRange.endExclusive ? "<" : "<=";
2267
+ conditions.push(`"createdAt" ${endOp} ?`);
2222
2268
  queryParams.push(
2223
2269
  filter.dateRange.end instanceof Date ? filter.dateRange.end.toISOString() : filter.dateRange.end
2224
2270
  );
@@ -2524,8 +2570,8 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2524
2570
  await this.#db.insert({
2525
2571
  tableName: storage.TABLE_RESOURCES,
2526
2572
  record: {
2527
- ...resource,
2528
- metadata: JSON.stringify(resource.metadata)
2573
+ ...resource
2574
+ // metadata is handled by prepareStatement which stringifies jsonb columns
2529
2575
  }
2530
2576
  });
2531
2577
  return resource;
@@ -2562,7 +2608,7 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2562
2608
  values.push(workingMemory);
2563
2609
  }
2564
2610
  if (metadata) {
2565
- updates.push("metadata = ?");
2611
+ updates.push("metadata = jsonb(?)");
2566
2612
  values.push(JSON.stringify(updatedResource.metadata));
2567
2613
  }
2568
2614
  updates.push("updatedAt = ?");
@@ -2646,7 +2692,7 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2646
2692
  }
2647
2693
  const limitValue = perPageInput === false ? total : perPage;
2648
2694
  const dataResult = await this.#client.execute({
2649
- sql: `SELECT * ${baseQuery} ORDER BY "${field}" ${direction} LIMIT ? OFFSET ?`,
2695
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_THREADS)} ${baseQuery} ORDER BY "${field}" ${direction} LIMIT ? OFFSET ?`,
2650
2696
  args: [...queryParams, limitValue, offset]
2651
2697
  });
2652
2698
  const threads = (dataResult.rows || []).map(mapRowToStorageThreadType);
@@ -2683,8 +2729,8 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2683
2729
  await this.#db.insert({
2684
2730
  tableName: storage.TABLE_THREADS,
2685
2731
  record: {
2686
- ...thread,
2687
- metadata: JSON.stringify(thread.metadata)
2732
+ ...thread
2733
+ // metadata is handled by prepareStatement which stringifies jsonb columns
2688
2734
  }
2689
2735
  });
2690
2736
  return thread;
@@ -2731,7 +2777,7 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2731
2777
  };
2732
2778
  try {
2733
2779
  await this.#client.execute({
2734
- sql: `UPDATE ${storage.TABLE_THREADS} SET title = ?, metadata = ? WHERE id = ?`,
2780
+ sql: `UPDATE ${storage.TABLE_THREADS} SET title = ?, metadata = jsonb(?) WHERE id = ?`,
2735
2781
  args: [title, JSON.stringify(updatedThread.metadata), id]
2736
2782
  });
2737
2783
  return updatedThread;
@@ -2770,6 +2816,148 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
2770
2816
  );
2771
2817
  }
2772
2818
  }
2819
+ async cloneThread(args) {
2820
+ const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;
2821
+ const sourceThread = await this.getThreadById({ threadId: sourceThreadId });
2822
+ if (!sourceThread) {
2823
+ throw new error.MastraError({
2824
+ id: storage.createStorageErrorId("LIBSQL", "CLONE_THREAD", "SOURCE_NOT_FOUND"),
2825
+ domain: error.ErrorDomain.STORAGE,
2826
+ category: error.ErrorCategory.USER,
2827
+ text: `Source thread with id ${sourceThreadId} not found`,
2828
+ details: { sourceThreadId }
2829
+ });
2830
+ }
2831
+ const newThreadId = providedThreadId || crypto.randomUUID();
2832
+ const existingThread = await this.getThreadById({ threadId: newThreadId });
2833
+ if (existingThread) {
2834
+ throw new error.MastraError({
2835
+ id: storage.createStorageErrorId("LIBSQL", "CLONE_THREAD", "THREAD_EXISTS"),
2836
+ domain: error.ErrorDomain.STORAGE,
2837
+ category: error.ErrorCategory.USER,
2838
+ text: `Thread with id ${newThreadId} already exists`,
2839
+ details: { newThreadId }
2840
+ });
2841
+ }
2842
+ try {
2843
+ let messageQuery = `SELECT id, content, role, type, "createdAt", thread_id, "resourceId"
2844
+ FROM "${storage.TABLE_MESSAGES}" WHERE thread_id = ?`;
2845
+ const messageParams = [sourceThreadId];
2846
+ if (options?.messageFilter?.startDate) {
2847
+ messageQuery += ` AND "createdAt" >= ?`;
2848
+ messageParams.push(
2849
+ options.messageFilter.startDate instanceof Date ? options.messageFilter.startDate.toISOString() : options.messageFilter.startDate
2850
+ );
2851
+ }
2852
+ if (options?.messageFilter?.endDate) {
2853
+ messageQuery += ` AND "createdAt" <= ?`;
2854
+ messageParams.push(
2855
+ options.messageFilter.endDate instanceof Date ? options.messageFilter.endDate.toISOString() : options.messageFilter.endDate
2856
+ );
2857
+ }
2858
+ if (options?.messageFilter?.messageIds && options.messageFilter.messageIds.length > 0) {
2859
+ messageQuery += ` AND id IN (${options.messageFilter.messageIds.map(() => "?").join(", ")})`;
2860
+ messageParams.push(...options.messageFilter.messageIds);
2861
+ }
2862
+ messageQuery += ` ORDER BY "createdAt" ASC`;
2863
+ if (options?.messageLimit && options.messageLimit > 0) {
2864
+ const limitQuery = `SELECT * FROM (${messageQuery.replace('ORDER BY "createdAt" ASC', 'ORDER BY "createdAt" DESC')} LIMIT ?) ORDER BY "createdAt" ASC`;
2865
+ messageParams.push(options.messageLimit);
2866
+ messageQuery = limitQuery;
2867
+ }
2868
+ const sourceMessagesResult = await this.#client.execute({ sql: messageQuery, args: messageParams });
2869
+ const sourceMessages = sourceMessagesResult.rows || [];
2870
+ const now = /* @__PURE__ */ new Date();
2871
+ const nowStr = now.toISOString();
2872
+ const lastMessageId = sourceMessages.length > 0 ? sourceMessages[sourceMessages.length - 1].id : void 0;
2873
+ const cloneMetadata = {
2874
+ sourceThreadId,
2875
+ clonedAt: now,
2876
+ ...lastMessageId && { lastMessageId }
2877
+ };
2878
+ const newThread = {
2879
+ id: newThreadId,
2880
+ resourceId: resourceId || sourceThread.resourceId,
2881
+ title: title || (sourceThread.title ? `Clone of ${sourceThread.title}` : void 0),
2882
+ metadata: {
2883
+ ...metadata,
2884
+ clone: cloneMetadata
2885
+ },
2886
+ createdAt: now,
2887
+ updatedAt: now
2888
+ };
2889
+ const tx = await this.#client.transaction("write");
2890
+ try {
2891
+ await tx.execute({
2892
+ sql: `INSERT INTO "${storage.TABLE_THREADS}" (id, "resourceId", title, metadata, "createdAt", "updatedAt")
2893
+ VALUES (?, ?, ?, jsonb(?), ?, ?)`,
2894
+ args: [
2895
+ newThread.id,
2896
+ newThread.resourceId,
2897
+ newThread.title || null,
2898
+ JSON.stringify(newThread.metadata),
2899
+ nowStr,
2900
+ nowStr
2901
+ ]
2902
+ });
2903
+ const clonedMessages = [];
2904
+ const targetResourceId = resourceId || sourceThread.resourceId;
2905
+ for (const sourceMsg of sourceMessages) {
2906
+ const newMessageId = crypto.randomUUID();
2907
+ const contentStr = sourceMsg.content;
2908
+ let parsedContent;
2909
+ try {
2910
+ parsedContent = JSON.parse(contentStr);
2911
+ } catch {
2912
+ parsedContent = { format: 2, parts: [{ type: "text", text: contentStr }] };
2913
+ }
2914
+ await tx.execute({
2915
+ sql: `INSERT INTO "${storage.TABLE_MESSAGES}" (id, thread_id, content, role, type, "createdAt", "resourceId")
2916
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
2917
+ args: [
2918
+ newMessageId,
2919
+ newThreadId,
2920
+ contentStr,
2921
+ sourceMsg.role,
2922
+ sourceMsg.type || "v2",
2923
+ sourceMsg.createdAt,
2924
+ targetResourceId
2925
+ ]
2926
+ });
2927
+ clonedMessages.push({
2928
+ id: newMessageId,
2929
+ threadId: newThreadId,
2930
+ content: parsedContent,
2931
+ role: sourceMsg.role,
2932
+ type: sourceMsg.type || void 0,
2933
+ createdAt: new Date(sourceMsg.createdAt),
2934
+ resourceId: targetResourceId
2935
+ });
2936
+ }
2937
+ await tx.commit();
2938
+ return {
2939
+ thread: newThread,
2940
+ clonedMessages
2941
+ };
2942
+ } catch (error) {
2943
+ await tx.rollback();
2944
+ throw error;
2945
+ }
2946
+ } catch (error$1) {
2947
+ if (error$1 instanceof error.MastraError) {
2948
+ throw error$1;
2949
+ }
2950
+ throw new error.MastraError(
2951
+ {
2952
+ id: storage.createStorageErrorId("LIBSQL", "CLONE_THREAD", "FAILED"),
2953
+ domain: error.ErrorDomain.STORAGE,
2954
+ category: error.ErrorCategory.THIRD_PARTY,
2955
+ details: { sourceThreadId, newThreadId }
2956
+ },
2957
+ error$1
2958
+ );
2959
+ }
2960
+ }
2773
2961
  };
2774
2962
  var ObservabilityLibSQL = class extends storage.ObservabilityStorage {
2775
2963
  #db;
@@ -3251,7 +3439,7 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3251
3439
  const limitValue = perPageInput === false ? total : perPage;
3252
3440
  const end = perPageInput === false ? total : start + perPage;
3253
3441
  const result = await this.#client.execute({
3254
- sql: `SELECT * FROM ${storage.TABLE_SCORERS} WHERE runId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3442
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_SCORERS)} FROM ${storage.TABLE_SCORERS} WHERE runId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3255
3443
  args: [runId, limitValue, start]
3256
3444
  });
3257
3445
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3324,7 +3512,7 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3324
3512
  const limitValue = perPageInput === false ? total : perPage;
3325
3513
  const end = perPageInput === false ? total : start + perPage;
3326
3514
  const result = await this.#client.execute({
3327
- sql: `SELECT * FROM ${storage.TABLE_SCORERS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3515
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_SCORERS)} FROM ${storage.TABLE_SCORERS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3328
3516
  args: [...queryParams, limitValue, start]
3329
3517
  });
3330
3518
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3350,16 +3538,13 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3350
3538
  }
3351
3539
  /**
3352
3540
  * LibSQL-specific score row transformation.
3353
- * Maps additionalLLMContext column to additionalContext field.
3354
3541
  */
3355
3542
  transformScoreRow(row) {
3356
- return storage.transformScoreRow(row, {
3357
- fieldMappings: { additionalContext: "additionalLLMContext" }
3358
- });
3543
+ return storage.transformScoreRow(row);
3359
3544
  }
3360
3545
  async getScoreById({ id }) {
3361
3546
  const result = await this.#client.execute({
3362
- sql: `SELECT * FROM ${storage.TABLE_SCORERS} WHERE id = ?`,
3547
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_SCORERS)} FROM ${storage.TABLE_SCORERS} WHERE id = ?`,
3363
3548
  args: [id]
3364
3549
  });
3365
3550
  return result.rows?.[0] ? this.transformScoreRow(result.rows[0]) : null;
@@ -3437,7 +3622,7 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3437
3622
  const limitValue = perPageInput === false ? total : perPage;
3438
3623
  const end = perPageInput === false ? total : start + perPage;
3439
3624
  const result = await this.#client.execute({
3440
- sql: `SELECT * FROM ${storage.TABLE_SCORERS} WHERE entityId = ? AND entityType = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3625
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_SCORERS)} FROM ${storage.TABLE_SCORERS} WHERE entityId = ? AND entityType = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3441
3626
  args: [entityId, entityType, limitValue, start]
3442
3627
  });
3443
3628
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3478,7 +3663,7 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3478
3663
  const limitValue = perPageInput === false ? total : perPage;
3479
3664
  const end = perPageInput === false ? total : start + perPage;
3480
3665
  const result = await this.#client.execute({
3481
- sql: `SELECT * FROM ${storage.TABLE_SCORERS} WHERE traceId = ? AND spanId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3666
+ sql: `SELECT ${buildSelectColumns(storage.TABLE_SCORERS)} FROM ${storage.TABLE_SCORERS} WHERE traceId = ? AND spanId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,
3482
3667
  args: [traceId, spanId, limitValue, start]
3483
3668
  });
3484
3669
  const scores = result.rows?.map((row) => this.transformScoreRow(row)) ?? [];
@@ -3503,24 +3688,6 @@ var ScoresLibSQL = class extends storage.ScoresStorage {
3503
3688
  }
3504
3689
  }
3505
3690
  };
3506
- function parseWorkflowRun(row) {
3507
- let parsedSnapshot = row.snapshot;
3508
- if (typeof parsedSnapshot === "string") {
3509
- try {
3510
- parsedSnapshot = JSON.parse(row.snapshot);
3511
- } catch (e) {
3512
- console.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);
3513
- }
3514
- }
3515
- return {
3516
- workflowName: row.workflow_name,
3517
- runId: row.run_id,
3518
- snapshot: parsedSnapshot,
3519
- resourceId: row.resourceId,
3520
- createdAt: new Date(row.createdAt),
3521
- updatedAt: new Date(row.updatedAt)
3522
- };
3523
- }
3524
3691
  var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3525
3692
  #db;
3526
3693
  #client;
@@ -3541,6 +3708,24 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3541
3708
  (err) => this.logger.warn("LibSQL Workflows: Failed to setup PRAGMA settings.", err)
3542
3709
  );
3543
3710
  }
3711
+ parseWorkflowRun(row) {
3712
+ let parsedSnapshot = row.snapshot;
3713
+ if (typeof parsedSnapshot === "string") {
3714
+ try {
3715
+ parsedSnapshot = JSON.parse(row.snapshot);
3716
+ } catch (e) {
3717
+ this.logger.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);
3718
+ }
3719
+ }
3720
+ return {
3721
+ workflowName: row.workflow_name,
3722
+ runId: row.run_id,
3723
+ snapshot: parsedSnapshot,
3724
+ resourceId: row.resourceId,
3725
+ createdAt: new Date(row.createdAt),
3726
+ updatedAt: new Date(row.updatedAt)
3727
+ };
3728
+ }
3544
3729
  async init() {
3545
3730
  const schema = storage.TABLE_SCHEMAS[storage.TABLE_WORKFLOW_SNAPSHOT];
3546
3731
  await this.#db.createTable({ tableName: storage.TABLE_WORKFLOW_SNAPSHOT, schema });
@@ -3584,7 +3769,7 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3584
3769
  const tx = await this.#client.transaction("write");
3585
3770
  try {
3586
3771
  const existingSnapshotResult = await tx.execute({
3587
- sql: `SELECT snapshot FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3772
+ sql: `SELECT json(snapshot) as snapshot FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3588
3773
  args: [workflowName, runId]
3589
3774
  });
3590
3775
  let snapshot;
@@ -3609,9 +3794,13 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3609
3794
  }
3610
3795
  snapshot.context[stepId] = result;
3611
3796
  snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };
3797
+ const now = (/* @__PURE__ */ new Date()).toISOString();
3612
3798
  await tx.execute({
3613
- sql: `UPDATE ${storage.TABLE_WORKFLOW_SNAPSHOT} SET snapshot = ? WHERE workflow_name = ? AND run_id = ?`,
3614
- args: [JSON.stringify(snapshot), workflowName, runId]
3799
+ sql: `INSERT INTO ${storage.TABLE_WORKFLOW_SNAPSHOT} (workflow_name, run_id, snapshot, createdAt, updatedAt)
3800
+ VALUES (?, ?, jsonb(?), ?, ?)
3801
+ ON CONFLICT(workflow_name, run_id)
3802
+ DO UPDATE SET snapshot = excluded.snapshot, updatedAt = excluded.updatedAt`,
3803
+ args: [workflowName, runId, JSON.stringify(snapshot), now, now]
3615
3804
  });
3616
3805
  await tx.commit();
3617
3806
  return snapshot.context;
@@ -3632,7 +3821,7 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3632
3821
  const tx = await this.#client.transaction("write");
3633
3822
  try {
3634
3823
  const existingSnapshotResult = await tx.execute({
3635
- sql: `SELECT snapshot FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3824
+ sql: `SELECT json(snapshot) as snapshot FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
3636
3825
  args: [workflowName, runId]
3637
3826
  });
3638
3827
  if (!existingSnapshotResult.rows?.[0]) {
@@ -3647,7 +3836,7 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3647
3836
  }
3648
3837
  const updatedSnapshot = { ...snapshot, ...opts };
3649
3838
  await tx.execute({
3650
- sql: `UPDATE ${storage.TABLE_WORKFLOW_SNAPSHOT} SET snapshot = ? WHERE workflow_name = ? AND run_id = ?`,
3839
+ sql: `UPDATE ${storage.TABLE_WORKFLOW_SNAPSHOT} SET snapshot = jsonb(?) WHERE workflow_name = ? AND run_id = ?`,
3651
3840
  args: [JSON.stringify(updatedSnapshot), workflowName, runId]
3652
3841
  });
3653
3842
  await tx.commit();
@@ -3711,13 +3900,13 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3711
3900
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
3712
3901
  try {
3713
3902
  const result = await this.#client.execute({
3714
- sql: `SELECT * FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC LIMIT 1`,
3903
+ 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`,
3715
3904
  args
3716
3905
  });
3717
3906
  if (!result.rows?.[0]) {
3718
3907
  return null;
3719
3908
  }
3720
- return parseWorkflowRun(result.rows[0]);
3909
+ return this.parseWorkflowRun(result.rows[0]);
3721
3910
  } catch (error$1) {
3722
3911
  throw new error.MastraError(
3723
3912
  {
@@ -3783,7 +3972,7 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3783
3972
  conditions.push("resourceId = ?");
3784
3973
  args.push(resourceId);
3785
3974
  } else {
3786
- console.warn(`[${storage.TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);
3975
+ this.logger.warn(`[${storage.TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);
3787
3976
  }
3788
3977
  }
3789
3978
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
@@ -3799,10 +3988,10 @@ var WorkflowsLibSQL = class extends storage.WorkflowsStorage {
3799
3988
  const normalizedPerPage = usePagination ? storage.normalizePerPage(perPage, Number.MAX_SAFE_INTEGER) : 0;
3800
3989
  const offset = usePagination ? page * normalizedPerPage : 0;
3801
3990
  const result = await this.#client.execute({
3802
- sql: `SELECT * FROM ${storage.TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC${usePagination ? ` LIMIT ? OFFSET ?` : ""}`,
3991
+ 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 ?` : ""}`,
3803
3992
  args: usePagination ? [...args, normalizedPerPage, offset] : args
3804
3993
  });
3805
- const runs = (result.rows || []).map((row) => parseWorkflowRun(row));
3994
+ const runs = (result.rows || []).map((row) => this.parseWorkflowRun(row));
3806
3995
  return { runs, total: total || runs.length };
3807
3996
  } catch (error$1) {
3808
3997
  throw new error.MastraError(