@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.
- package/CHANGELOG.md +154 -0
- package/dist/docs/README.md +2 -2
- package/dist/docs/SKILL.md +2 -2
- package/dist/docs/SOURCE_MAP.json +1 -1
- package/dist/docs/agents/01-agent-memory.md +6 -0
- package/dist/docs/agents/02-networks.md +56 -0
- package/dist/docs/agents/03-agent-approval.md +66 -6
- package/dist/docs/agents/04-network-approval.md +274 -0
- package/dist/docs/core/01-reference.md +7 -8
- package/dist/docs/memory/02-storage.md +77 -25
- package/dist/docs/memory/03-working-memory.md +10 -6
- package/dist/docs/memory/04-semantic-recall.md +2 -4
- package/dist/docs/memory/05-memory-processors.md +2 -3
- package/dist/docs/memory/06-reference.md +3 -5
- package/dist/docs/rag/01-retrieval.md +5 -6
- package/dist/docs/storage/01-reference.md +106 -15
- package/dist/docs/vectors/01-reference.md +3 -5
- package/dist/index.cjs +165 -71
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +165 -71
- package/dist/index.js.map +1 -1
- package/dist/storage/db/index.d.ts.map +1 -1
- package/dist/storage/db/utils.d.ts +16 -1
- package/dist/storage/db/utils.d.ts.map +1 -1
- package/dist/storage/domains/memory/index.d.ts +2 -2
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/dist/storage/domains/scores/index.d.ts +0 -1
- package/dist/storage/domains/scores/index.d.ts.map +1 -1
- package/dist/storage/domains/workflows/index.d.ts +1 -0
- package/dist/storage/domains/workflows/index.d.ts.map +1 -1
- package/dist/vector/index.d.ts +6 -2
- package/dist/vector/index.d.ts.map +1 -1
- 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
|
-
|
|
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
|
|
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 (
|
|
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
|
|
1145
|
-
const
|
|
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 =
|
|
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
|
|
1168
|
-
const
|
|
1169
|
-
const
|
|
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
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
|
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
|
|
2605
|
-
const {
|
|
2606
|
-
|
|
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", "
|
|
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("
|
|
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
|
|
2622
|
-
const queryParams = [
|
|
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
|
|
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", "
|
|
2753
|
+
id: createStorageErrorId("LIBSQL", "LIST_THREADS", "FAILED"),
|
|
2664
2754
|
domain: ErrorDomain.STORAGE,
|
|
2665
2755
|
category: ErrorCategory.THIRD_PARTY,
|
|
2666
|
-
details: {
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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: `
|
|
3756
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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(
|