@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.cjs
CHANGED
|
@@ -511,7 +511,7 @@ var LibSQLVector = class extends vector.MastraVector {
|
|
|
511
511
|
maxRetries;
|
|
512
512
|
initialBackoffMs;
|
|
513
513
|
constructor({
|
|
514
|
-
|
|
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
|
|
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 (
|
|
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
|
|
1147
|
-
const
|
|
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 =
|
|
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
|
|
1170
|
-
const
|
|
1171
|
-
const
|
|
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
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
|
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
|
|
2607
|
-
const {
|
|
2608
|
-
|
|
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", "
|
|
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("
|
|
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
|
|
2624
|
-
const queryParams = [
|
|
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
|
|
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", "
|
|
2755
|
+
id: storage.createStorageErrorId("LIBSQL", "LIST_THREADS", "FAILED"),
|
|
2666
2756
|
domain: error.ErrorDomain.STORAGE,
|
|
2667
2757
|
category: error.ErrorCategory.THIRD_PARTY,
|
|
2668
|
-
details: {
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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: `
|
|
3758
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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(
|