@mastra/libsql 1.0.0-beta.4 → 1.0.0-beta.6
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 +64 -0
- package/dist/index.cjs +307 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +308 -13
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/agents/index.d.ts +25 -0
- package/dist/storage/domains/agents/index.d.ts.map +1 -0
- package/dist/storage/domains/scores/index.d.ts +2 -2
- package/dist/storage/domains/scores/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +3 -2
- package/dist/storage/index.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createClient } from '@libsql/client';
|
|
2
2
|
import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';
|
|
3
|
-
import { createVectorErrorId, MastraStorage, StoreOperations, TABLE_WORKFLOW_SNAPSHOT, TABLE_SPANS, createStorageErrorId, ScoresStorage, TABLE_SCORERS, normalizePerPage, calculatePagination, transformScoreRow, WorkflowsStorage, MemoryStorage, TABLE_MESSAGES, TABLE_THREADS, TABLE_RESOURCES, ObservabilityStorage, TABLE_SCHEMAS, safelyParseJSON, SPAN_SCHEMA } from '@mastra/core/storage';
|
|
3
|
+
import { createVectorErrorId, MastraStorage, StoreOperations, TABLE_WORKFLOW_SNAPSHOT, TABLE_SPANS, createStorageErrorId, ScoresStorage, TABLE_SCORERS, normalizePerPage, calculatePagination, transformScoreRow, WorkflowsStorage, MemoryStorage, TABLE_MESSAGES, TABLE_THREADS, TABLE_RESOURCES, ObservabilityStorage, AgentsStorage, TABLE_AGENTS, TABLE_SCHEMAS, safelyParseJSON, SPAN_SCHEMA } from '@mastra/core/storage';
|
|
4
4
|
import { parseSqlIdentifier, parseFieldKey } from '@mastra/core/utils';
|
|
5
5
|
import { MastraVector } from '@mastra/core/vector';
|
|
6
6
|
import { BaseFilterTranslator } from '@mastra/core/vector/filter';
|
|
@@ -1092,6 +1092,298 @@ var LibSQLVector = class extends MastraVector {
|
|
|
1092
1092
|
});
|
|
1093
1093
|
}
|
|
1094
1094
|
};
|
|
1095
|
+
var AgentsLibSQL = class extends AgentsStorage {
|
|
1096
|
+
client;
|
|
1097
|
+
constructor({ client, operations: _ }) {
|
|
1098
|
+
super();
|
|
1099
|
+
this.client = client;
|
|
1100
|
+
}
|
|
1101
|
+
parseJson(value, fieldName) {
|
|
1102
|
+
if (!value) return void 0;
|
|
1103
|
+
if (typeof value !== "string") return value;
|
|
1104
|
+
try {
|
|
1105
|
+
return JSON.parse(value);
|
|
1106
|
+
} catch (error) {
|
|
1107
|
+
const details = {
|
|
1108
|
+
value: value.length > 100 ? value.substring(0, 100) + "..." : value
|
|
1109
|
+
};
|
|
1110
|
+
if (fieldName) {
|
|
1111
|
+
details.field = fieldName;
|
|
1112
|
+
}
|
|
1113
|
+
throw new MastraError(
|
|
1114
|
+
{
|
|
1115
|
+
id: createStorageErrorId("LIBSQL", "PARSE_JSON", "INVALID_JSON"),
|
|
1116
|
+
domain: ErrorDomain.STORAGE,
|
|
1117
|
+
category: ErrorCategory.SYSTEM,
|
|
1118
|
+
text: `Failed to parse JSON${fieldName ? ` for field "${fieldName}"` : ""}: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
1119
|
+
details
|
|
1120
|
+
},
|
|
1121
|
+
error
|
|
1122
|
+
);
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
parseRow(row) {
|
|
1126
|
+
return {
|
|
1127
|
+
id: row.id,
|
|
1128
|
+
name: row.name,
|
|
1129
|
+
description: row.description,
|
|
1130
|
+
instructions: row.instructions,
|
|
1131
|
+
model: this.parseJson(row.model, "model"),
|
|
1132
|
+
tools: this.parseJson(row.tools, "tools"),
|
|
1133
|
+
defaultOptions: this.parseJson(row.defaultOptions, "defaultOptions"),
|
|
1134
|
+
workflows: this.parseJson(row.workflows, "workflows"),
|
|
1135
|
+
agents: this.parseJson(row.agents, "agents"),
|
|
1136
|
+
inputProcessors: this.parseJson(row.inputProcessors, "inputProcessors"),
|
|
1137
|
+
outputProcessors: this.parseJson(row.outputProcessors, "outputProcessors"),
|
|
1138
|
+
memory: this.parseJson(row.memory, "memory"),
|
|
1139
|
+
scorers: this.parseJson(row.scorers, "scorers"),
|
|
1140
|
+
metadata: this.parseJson(row.metadata, "metadata"),
|
|
1141
|
+
createdAt: new Date(row.createdAt),
|
|
1142
|
+
updatedAt: new Date(row.updatedAt)
|
|
1143
|
+
};
|
|
1144
|
+
}
|
|
1145
|
+
async getAgentById({ id }) {
|
|
1146
|
+
try {
|
|
1147
|
+
const result = await this.client.execute({
|
|
1148
|
+
sql: `SELECT * FROM "${TABLE_AGENTS}" WHERE id = ?`,
|
|
1149
|
+
args: [id]
|
|
1150
|
+
});
|
|
1151
|
+
if (!result.rows || result.rows.length === 0) {
|
|
1152
|
+
return null;
|
|
1153
|
+
}
|
|
1154
|
+
return this.parseRow(result.rows[0]);
|
|
1155
|
+
} catch (error) {
|
|
1156
|
+
throw new MastraError(
|
|
1157
|
+
{
|
|
1158
|
+
id: createStorageErrorId("LIBSQL", "GET_AGENT_BY_ID", "FAILED"),
|
|
1159
|
+
domain: ErrorDomain.STORAGE,
|
|
1160
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
1161
|
+
details: { agentId: id }
|
|
1162
|
+
},
|
|
1163
|
+
error
|
|
1164
|
+
);
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
async createAgent({ agent }) {
|
|
1168
|
+
try {
|
|
1169
|
+
const now = /* @__PURE__ */ new Date();
|
|
1170
|
+
const nowIso = now.toISOString();
|
|
1171
|
+
await this.client.execute({
|
|
1172
|
+
sql: `INSERT INTO "${TABLE_AGENTS}" (id, name, description, instructions, model, tools, "defaultOptions", workflows, agents, "inputProcessors", "outputProcessors", memory, scorers, metadata, "createdAt", "updatedAt")
|
|
1173
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
1174
|
+
args: [
|
|
1175
|
+
agent.id,
|
|
1176
|
+
agent.name,
|
|
1177
|
+
agent.description ?? null,
|
|
1178
|
+
agent.instructions,
|
|
1179
|
+
JSON.stringify(agent.model),
|
|
1180
|
+
agent.tools ? JSON.stringify(agent.tools) : null,
|
|
1181
|
+
agent.defaultOptions ? JSON.stringify(agent.defaultOptions) : null,
|
|
1182
|
+
agent.workflows ? JSON.stringify(agent.workflows) : null,
|
|
1183
|
+
agent.agents ? JSON.stringify(agent.agents) : null,
|
|
1184
|
+
agent.inputProcessors ? JSON.stringify(agent.inputProcessors) : null,
|
|
1185
|
+
agent.outputProcessors ? JSON.stringify(agent.outputProcessors) : null,
|
|
1186
|
+
agent.memory ? JSON.stringify(agent.memory) : null,
|
|
1187
|
+
agent.scorers ? JSON.stringify(agent.scorers) : null,
|
|
1188
|
+
agent.metadata ? JSON.stringify(agent.metadata) : null,
|
|
1189
|
+
nowIso,
|
|
1190
|
+
nowIso
|
|
1191
|
+
]
|
|
1192
|
+
});
|
|
1193
|
+
return {
|
|
1194
|
+
...agent,
|
|
1195
|
+
createdAt: now,
|
|
1196
|
+
updatedAt: now
|
|
1197
|
+
};
|
|
1198
|
+
} catch (error) {
|
|
1199
|
+
throw new MastraError(
|
|
1200
|
+
{
|
|
1201
|
+
id: createStorageErrorId("LIBSQL", "CREATE_AGENT", "FAILED"),
|
|
1202
|
+
domain: ErrorDomain.STORAGE,
|
|
1203
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
1204
|
+
details: { agentId: agent.id }
|
|
1205
|
+
},
|
|
1206
|
+
error
|
|
1207
|
+
);
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
async updateAgent({ id, ...updates }) {
|
|
1211
|
+
try {
|
|
1212
|
+
const existingAgent = await this.getAgentById({ id });
|
|
1213
|
+
if (!existingAgent) {
|
|
1214
|
+
throw new MastraError({
|
|
1215
|
+
id: createStorageErrorId("LIBSQL", "UPDATE_AGENT", "NOT_FOUND"),
|
|
1216
|
+
domain: ErrorDomain.STORAGE,
|
|
1217
|
+
category: ErrorCategory.USER,
|
|
1218
|
+
text: `Agent ${id} not found`,
|
|
1219
|
+
details: { agentId: id }
|
|
1220
|
+
});
|
|
1221
|
+
}
|
|
1222
|
+
const setClauses = [];
|
|
1223
|
+
const args = [];
|
|
1224
|
+
if (updates.name !== void 0) {
|
|
1225
|
+
setClauses.push("name = ?");
|
|
1226
|
+
args.push(updates.name);
|
|
1227
|
+
}
|
|
1228
|
+
if (updates.description !== void 0) {
|
|
1229
|
+
setClauses.push("description = ?");
|
|
1230
|
+
args.push(updates.description);
|
|
1231
|
+
}
|
|
1232
|
+
if (updates.instructions !== void 0) {
|
|
1233
|
+
setClauses.push("instructions = ?");
|
|
1234
|
+
args.push(updates.instructions);
|
|
1235
|
+
}
|
|
1236
|
+
if (updates.model !== void 0) {
|
|
1237
|
+
setClauses.push("model = ?");
|
|
1238
|
+
args.push(JSON.stringify(updates.model));
|
|
1239
|
+
}
|
|
1240
|
+
if (updates.tools !== void 0) {
|
|
1241
|
+
setClauses.push("tools = ?");
|
|
1242
|
+
args.push(JSON.stringify(updates.tools));
|
|
1243
|
+
}
|
|
1244
|
+
if (updates.defaultOptions !== void 0) {
|
|
1245
|
+
setClauses.push('"defaultOptions" = ?');
|
|
1246
|
+
args.push(JSON.stringify(updates.defaultOptions));
|
|
1247
|
+
}
|
|
1248
|
+
if (updates.workflows !== void 0) {
|
|
1249
|
+
setClauses.push("workflows = ?");
|
|
1250
|
+
args.push(JSON.stringify(updates.workflows));
|
|
1251
|
+
}
|
|
1252
|
+
if (updates.agents !== void 0) {
|
|
1253
|
+
setClauses.push("agents = ?");
|
|
1254
|
+
args.push(JSON.stringify(updates.agents));
|
|
1255
|
+
}
|
|
1256
|
+
if (updates.inputProcessors !== void 0) {
|
|
1257
|
+
setClauses.push('"inputProcessors" = ?');
|
|
1258
|
+
args.push(JSON.stringify(updates.inputProcessors));
|
|
1259
|
+
}
|
|
1260
|
+
if (updates.outputProcessors !== void 0) {
|
|
1261
|
+
setClauses.push('"outputProcessors" = ?');
|
|
1262
|
+
args.push(JSON.stringify(updates.outputProcessors));
|
|
1263
|
+
}
|
|
1264
|
+
if (updates.memory !== void 0) {
|
|
1265
|
+
setClauses.push("memory = ?");
|
|
1266
|
+
args.push(JSON.stringify(updates.memory));
|
|
1267
|
+
}
|
|
1268
|
+
if (updates.scorers !== void 0) {
|
|
1269
|
+
setClauses.push("scorers = ?");
|
|
1270
|
+
args.push(JSON.stringify(updates.scorers));
|
|
1271
|
+
}
|
|
1272
|
+
if (updates.metadata !== void 0) {
|
|
1273
|
+
const mergedMetadata = { ...existingAgent.metadata, ...updates.metadata };
|
|
1274
|
+
setClauses.push("metadata = ?");
|
|
1275
|
+
args.push(JSON.stringify(mergedMetadata));
|
|
1276
|
+
}
|
|
1277
|
+
const now = /* @__PURE__ */ new Date();
|
|
1278
|
+
setClauses.push('"updatedAt" = ?');
|
|
1279
|
+
args.push(now.toISOString());
|
|
1280
|
+
args.push(id);
|
|
1281
|
+
if (setClauses.length > 1) {
|
|
1282
|
+
await this.client.execute({
|
|
1283
|
+
sql: `UPDATE "${TABLE_AGENTS}" SET ${setClauses.join(", ")} WHERE id = ?`,
|
|
1284
|
+
args
|
|
1285
|
+
});
|
|
1286
|
+
}
|
|
1287
|
+
const updatedAgent = await this.getAgentById({ id });
|
|
1288
|
+
if (!updatedAgent) {
|
|
1289
|
+
throw new MastraError({
|
|
1290
|
+
id: createStorageErrorId("LIBSQL", "UPDATE_AGENT", "NOT_FOUND_AFTER_UPDATE"),
|
|
1291
|
+
domain: ErrorDomain.STORAGE,
|
|
1292
|
+
category: ErrorCategory.SYSTEM,
|
|
1293
|
+
text: `Agent ${id} not found after update`,
|
|
1294
|
+
details: { agentId: id }
|
|
1295
|
+
});
|
|
1296
|
+
}
|
|
1297
|
+
return updatedAgent;
|
|
1298
|
+
} catch (error) {
|
|
1299
|
+
if (error instanceof MastraError) {
|
|
1300
|
+
throw error;
|
|
1301
|
+
}
|
|
1302
|
+
throw new MastraError(
|
|
1303
|
+
{
|
|
1304
|
+
id: createStorageErrorId("LIBSQL", "UPDATE_AGENT", "FAILED"),
|
|
1305
|
+
domain: ErrorDomain.STORAGE,
|
|
1306
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
1307
|
+
details: { agentId: id }
|
|
1308
|
+
},
|
|
1309
|
+
error
|
|
1310
|
+
);
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
async deleteAgent({ id }) {
|
|
1314
|
+
try {
|
|
1315
|
+
await this.client.execute({
|
|
1316
|
+
sql: `DELETE FROM "${TABLE_AGENTS}" WHERE id = ?`,
|
|
1317
|
+
args: [id]
|
|
1318
|
+
});
|
|
1319
|
+
} catch (error) {
|
|
1320
|
+
throw new MastraError(
|
|
1321
|
+
{
|
|
1322
|
+
id: createStorageErrorId("LIBSQL", "DELETE_AGENT", "FAILED"),
|
|
1323
|
+
domain: ErrorDomain.STORAGE,
|
|
1324
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
1325
|
+
details: { agentId: id }
|
|
1326
|
+
},
|
|
1327
|
+
error
|
|
1328
|
+
);
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
async listAgents(args) {
|
|
1332
|
+
const { page = 0, perPage: perPageInput, orderBy } = args || {};
|
|
1333
|
+
const { field, direction } = this.parseOrderBy(orderBy);
|
|
1334
|
+
if (page < 0) {
|
|
1335
|
+
throw new MastraError(
|
|
1336
|
+
{
|
|
1337
|
+
id: createStorageErrorId("LIBSQL", "LIST_AGENTS", "INVALID_PAGE"),
|
|
1338
|
+
domain: ErrorDomain.STORAGE,
|
|
1339
|
+
category: ErrorCategory.USER,
|
|
1340
|
+
details: { page }
|
|
1341
|
+
},
|
|
1342
|
+
new Error("page must be >= 0")
|
|
1343
|
+
);
|
|
1344
|
+
}
|
|
1345
|
+
const perPage = normalizePerPage(perPageInput, 100);
|
|
1346
|
+
const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
|
|
1347
|
+
try {
|
|
1348
|
+
const countResult = await this.client.execute({
|
|
1349
|
+
sql: `SELECT COUNT(*) as count FROM "${TABLE_AGENTS}"`,
|
|
1350
|
+
args: []
|
|
1351
|
+
});
|
|
1352
|
+
const total = Number(countResult.rows?.[0]?.count ?? 0);
|
|
1353
|
+
if (total === 0) {
|
|
1354
|
+
return {
|
|
1355
|
+
agents: [],
|
|
1356
|
+
total: 0,
|
|
1357
|
+
page,
|
|
1358
|
+
perPage: perPageForResponse,
|
|
1359
|
+
hasMore: false
|
|
1360
|
+
};
|
|
1361
|
+
}
|
|
1362
|
+
const limitValue = perPageInput === false ? total : perPage;
|
|
1363
|
+
const dataResult = await this.client.execute({
|
|
1364
|
+
sql: `SELECT * FROM "${TABLE_AGENTS}" ORDER BY "${field}" ${direction} LIMIT ? OFFSET ?`,
|
|
1365
|
+
args: [limitValue, offset]
|
|
1366
|
+
});
|
|
1367
|
+
const agents = (dataResult.rows || []).map((row) => this.parseRow(row));
|
|
1368
|
+
return {
|
|
1369
|
+
agents,
|
|
1370
|
+
total,
|
|
1371
|
+
page,
|
|
1372
|
+
perPage: perPageForResponse,
|
|
1373
|
+
hasMore: perPageInput === false ? false : offset + perPage < total
|
|
1374
|
+
};
|
|
1375
|
+
} catch (error) {
|
|
1376
|
+
throw new MastraError(
|
|
1377
|
+
{
|
|
1378
|
+
id: createStorageErrorId("LIBSQL", "LIST_AGENTS", "FAILED"),
|
|
1379
|
+
domain: ErrorDomain.STORAGE,
|
|
1380
|
+
category: ErrorCategory.THIRD_PARTY
|
|
1381
|
+
},
|
|
1382
|
+
error
|
|
1383
|
+
);
|
|
1384
|
+
}
|
|
1385
|
+
}
|
|
1386
|
+
};
|
|
1095
1387
|
var MemoryLibSQL = class extends MemoryStorage {
|
|
1096
1388
|
client;
|
|
1097
1389
|
operations;
|
|
@@ -2753,11 +3045,11 @@ var ScoresLibSQL = class extends ScoresStorage {
|
|
|
2753
3045
|
domain: ErrorDomain.STORAGE,
|
|
2754
3046
|
category: ErrorCategory.USER,
|
|
2755
3047
|
details: {
|
|
2756
|
-
scorer: score.scorer
|
|
2757
|
-
entityId: score.entityId,
|
|
2758
|
-
entityType: score.entityType,
|
|
2759
|
-
traceId: score.traceId
|
|
2760
|
-
spanId: score.spanId
|
|
3048
|
+
scorer: score.scorer?.id ?? "unknown",
|
|
3049
|
+
entityId: score.entityId ?? "unknown",
|
|
3050
|
+
entityType: score.entityType ?? "unknown",
|
|
3051
|
+
traceId: score.traceId ?? "",
|
|
3052
|
+
spanId: score.spanId ?? ""
|
|
2761
3053
|
}
|
|
2762
3054
|
},
|
|
2763
3055
|
error
|
|
@@ -2765,17 +3057,17 @@ var ScoresLibSQL = class extends ScoresStorage {
|
|
|
2765
3057
|
}
|
|
2766
3058
|
try {
|
|
2767
3059
|
const id = crypto.randomUUID();
|
|
3060
|
+
const now = /* @__PURE__ */ new Date();
|
|
2768
3061
|
await this.operations.insert({
|
|
2769
3062
|
tableName: TABLE_SCORERS,
|
|
2770
3063
|
record: {
|
|
3064
|
+
...parsedScore,
|
|
2771
3065
|
id,
|
|
2772
|
-
createdAt:
|
|
2773
|
-
updatedAt:
|
|
2774
|
-
...parsedScore
|
|
3066
|
+
createdAt: now.toISOString(),
|
|
3067
|
+
updatedAt: now.toISOString()
|
|
2775
3068
|
}
|
|
2776
3069
|
});
|
|
2777
|
-
|
|
2778
|
-
return { score: scoreFromDb };
|
|
3070
|
+
return { score: { ...parsedScore, id, createdAt: now, updatedAt: now } };
|
|
2779
3071
|
} catch (error) {
|
|
2780
3072
|
throw new MastraError(
|
|
2781
3073
|
{
|
|
@@ -3235,12 +3527,14 @@ var LibSQLStore = class extends MastraStorage {
|
|
|
3235
3527
|
const workflows = new WorkflowsLibSQL({ client: this.client, operations });
|
|
3236
3528
|
const memory = new MemoryLibSQL({ client: this.client, operations });
|
|
3237
3529
|
const observability = new ObservabilityLibSQL({ operations });
|
|
3530
|
+
const agents = new AgentsLibSQL({ client: this.client, operations });
|
|
3238
3531
|
this.stores = {
|
|
3239
3532
|
operations,
|
|
3240
3533
|
scores,
|
|
3241
3534
|
workflows,
|
|
3242
3535
|
memory,
|
|
3243
|
-
observability
|
|
3536
|
+
observability,
|
|
3537
|
+
agents
|
|
3244
3538
|
};
|
|
3245
3539
|
}
|
|
3246
3540
|
get supports() {
|
|
@@ -3251,7 +3545,8 @@ var LibSQLStore = class extends MastraStorage {
|
|
|
3251
3545
|
createTable: true,
|
|
3252
3546
|
deleteMessages: true,
|
|
3253
3547
|
observabilityInstance: true,
|
|
3254
|
-
listScoresBySpan: true
|
|
3548
|
+
listScoresBySpan: true,
|
|
3549
|
+
agents: true
|
|
3255
3550
|
};
|
|
3256
3551
|
}
|
|
3257
3552
|
async createTable({
|