@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.
- package/CHANGELOG.md +184 -0
- package/dist/docs/README.md +39 -0
- package/dist/docs/SKILL.md +40 -0
- package/dist/docs/SOURCE_MAP.json +6 -0
- package/dist/docs/agents/01-agent-memory.md +160 -0
- package/dist/docs/agents/02-networks.md +292 -0
- package/dist/docs/agents/03-agent-approval.md +316 -0
- package/dist/docs/agents/04-network-approval.md +274 -0
- package/dist/docs/core/01-reference.md +151 -0
- package/dist/docs/guides/01-ai-sdk.md +141 -0
- package/dist/docs/memory/01-overview.md +76 -0
- package/dist/docs/memory/02-storage.md +215 -0
- package/dist/docs/memory/03-working-memory.md +390 -0
- package/dist/docs/memory/04-semantic-recall.md +233 -0
- package/dist/docs/memory/05-memory-processors.md +318 -0
- package/dist/docs/memory/06-reference.md +133 -0
- package/dist/docs/observability/01-overview.md +64 -0
- package/dist/docs/observability/02-default.md +177 -0
- package/dist/docs/rag/01-retrieval.md +548 -0
- package/dist/docs/storage/01-reference.md +542 -0
- package/dist/docs/vectors/01-reference.md +213 -0
- package/dist/docs/workflows/01-snapshots.md +240 -0
- package/dist/index.cjs +249 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +249 -60
- 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 -1
- 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 +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
|
-
|
|
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
|
}
|
|
@@ -2212,13 +2256,15 @@ var MemoryLibSQL = class extends storage.MemoryStorage {
|
|
|
2212
2256
|
queryParams.push(resourceId);
|
|
2213
2257
|
}
|
|
2214
2258
|
if (filter?.dateRange?.start) {
|
|
2215
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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: `
|
|
3614
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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(
|