@mastra/cloudflare-d1 0.13.8 → 1.0.0-beta.1
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 +198 -14
- package/README.md +10 -5
- package/dist/index.cjs +230 -592
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +230 -592
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/memory/index.d.ts +13 -44
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/dist/storage/domains/scores/index.d.ts +5 -5
- package/dist/storage/domains/scores/index.d.ts.map +1 -1
- package/dist/storage/domains/workflows/index.d.ts +3 -10
- package/dist/storage/domains/workflows/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +23 -88
- package/dist/storage/index.d.ts.map +1 -1
- package/package.json +14 -16
- package/dist/storage/domains/legacy-evals/index.d.ts +0 -20
- package/dist/storage/domains/legacy-evals/index.d.ts.map +0 -1
- package/dist/storage/domains/traces/index.d.ts +0 -18
- package/dist/storage/domains/traces/index.d.ts.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';
|
|
2
|
-
import { MastraStorage, StoreOperations, ScoresStorage, TABLE_SCORERS,
|
|
2
|
+
import { MastraStorage, StoreOperations, ScoresStorage, TABLE_SCORERS, normalizePerPage, calculatePagination, WorkflowsStorage, TABLE_WORKFLOW_SNAPSHOT, ensureDate, MemoryStorage, TABLE_RESOURCES, TABLE_THREADS, TABLE_MESSAGES, serializeDate, safelyParseJSON } from '@mastra/core/storage';
|
|
3
3
|
import Cloudflare from 'cloudflare';
|
|
4
|
-
import { parseSqlIdentifier } from '@mastra/core/utils';
|
|
5
4
|
import { MessageList } from '@mastra/core/agent';
|
|
6
|
-
import {
|
|
5
|
+
import { parseSqlIdentifier } from '@mastra/core/utils';
|
|
6
|
+
import { saveScorePayloadSchema } from '@mastra/core/evals';
|
|
7
7
|
|
|
8
8
|
// src/storage/index.ts
|
|
9
9
|
var SqlBuilder = class {
|
|
@@ -242,16 +242,6 @@ function isArrayOfRecords(value) {
|
|
|
242
242
|
}
|
|
243
243
|
function deserializeValue(value, type) {
|
|
244
244
|
if (value === null || value === void 0) return null;
|
|
245
|
-
if (type === "date" && typeof value === "string") {
|
|
246
|
-
return new Date(value);
|
|
247
|
-
}
|
|
248
|
-
if (type === "jsonb" && typeof value === "string") {
|
|
249
|
-
try {
|
|
250
|
-
return JSON.parse(value);
|
|
251
|
-
} catch {
|
|
252
|
-
return value;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
245
|
if (typeof value === "string" && (value.startsWith("{") || value.startsWith("["))) {
|
|
256
246
|
try {
|
|
257
247
|
return JSON.parse(value);
|
|
@@ -262,155 +252,7 @@ function deserializeValue(value, type) {
|
|
|
262
252
|
return value;
|
|
263
253
|
}
|
|
264
254
|
|
|
265
|
-
// src/storage/domains/
|
|
266
|
-
var LegacyEvalsStorageD1 = class extends LegacyEvalsStorage {
|
|
267
|
-
operations;
|
|
268
|
-
constructor({ operations }) {
|
|
269
|
-
super();
|
|
270
|
-
this.operations = operations;
|
|
271
|
-
}
|
|
272
|
-
async getEvals(options) {
|
|
273
|
-
const { agentName, type, page = 0, perPage = 40, dateRange } = options || {};
|
|
274
|
-
const fullTableName = this.operations.getTableName(TABLE_EVALS);
|
|
275
|
-
const conditions = [];
|
|
276
|
-
const queryParams = [];
|
|
277
|
-
if (agentName) {
|
|
278
|
-
conditions.push(`agent_name = ?`);
|
|
279
|
-
queryParams.push(agentName);
|
|
280
|
-
}
|
|
281
|
-
if (type === "test") {
|
|
282
|
-
conditions.push(`(test_info IS NOT NULL AND json_extract(test_info, '$.testPath') IS NOT NULL)`);
|
|
283
|
-
} else if (type === "live") {
|
|
284
|
-
conditions.push(`(test_info IS NULL OR json_extract(test_info, '$.testPath') IS NULL)`);
|
|
285
|
-
}
|
|
286
|
-
if (dateRange?.start) {
|
|
287
|
-
conditions.push(`created_at >= ?`);
|
|
288
|
-
queryParams.push(serializeDate(dateRange.start));
|
|
289
|
-
}
|
|
290
|
-
if (dateRange?.end) {
|
|
291
|
-
conditions.push(`created_at <= ?`);
|
|
292
|
-
queryParams.push(serializeDate(dateRange.end));
|
|
293
|
-
}
|
|
294
|
-
const countQueryBuilder = createSqlBuilder().count().from(fullTableName);
|
|
295
|
-
if (conditions.length > 0) {
|
|
296
|
-
countQueryBuilder.where(conditions.join(" AND "), ...queryParams);
|
|
297
|
-
}
|
|
298
|
-
const { sql: countSql, params: countParams } = countQueryBuilder.build();
|
|
299
|
-
try {
|
|
300
|
-
const countResult = await this.operations.executeQuery({
|
|
301
|
-
sql: countSql,
|
|
302
|
-
params: countParams,
|
|
303
|
-
first: true
|
|
304
|
-
});
|
|
305
|
-
const total = Number(countResult?.count || 0);
|
|
306
|
-
const currentOffset = page * perPage;
|
|
307
|
-
if (total === 0) {
|
|
308
|
-
return {
|
|
309
|
-
evals: [],
|
|
310
|
-
total: 0,
|
|
311
|
-
page,
|
|
312
|
-
perPage,
|
|
313
|
-
hasMore: false
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
const dataQueryBuilder = createSqlBuilder().select("*").from(fullTableName);
|
|
317
|
-
if (conditions.length > 0) {
|
|
318
|
-
dataQueryBuilder.where(conditions.join(" AND "), ...queryParams);
|
|
319
|
-
}
|
|
320
|
-
dataQueryBuilder.orderBy("created_at", "DESC").limit(perPage).offset(currentOffset);
|
|
321
|
-
const { sql: dataSql, params: dataParams } = dataQueryBuilder.build();
|
|
322
|
-
const rows = await this.operations.executeQuery({
|
|
323
|
-
sql: dataSql,
|
|
324
|
-
params: dataParams
|
|
325
|
-
});
|
|
326
|
-
const evals = (isArrayOfRecords(rows) ? rows : []).map((row) => {
|
|
327
|
-
const result = deserializeValue(row.result);
|
|
328
|
-
const testInfo = row.test_info ? deserializeValue(row.test_info) : void 0;
|
|
329
|
-
if (!result || typeof result !== "object" || !("score" in result)) {
|
|
330
|
-
throw new Error(`Invalid MetricResult format: ${JSON.stringify(result)}`);
|
|
331
|
-
}
|
|
332
|
-
return {
|
|
333
|
-
input: row.input,
|
|
334
|
-
output: row.output,
|
|
335
|
-
result,
|
|
336
|
-
agentName: row.agent_name,
|
|
337
|
-
metricName: row.metric_name,
|
|
338
|
-
instructions: row.instructions,
|
|
339
|
-
testInfo,
|
|
340
|
-
globalRunId: row.global_run_id,
|
|
341
|
-
runId: row.run_id,
|
|
342
|
-
createdAt: row.created_at
|
|
343
|
-
};
|
|
344
|
-
});
|
|
345
|
-
const hasMore = currentOffset + evals.length < total;
|
|
346
|
-
return {
|
|
347
|
-
evals,
|
|
348
|
-
total,
|
|
349
|
-
page,
|
|
350
|
-
perPage,
|
|
351
|
-
hasMore
|
|
352
|
-
};
|
|
353
|
-
} catch (error) {
|
|
354
|
-
throw new MastraError(
|
|
355
|
-
{
|
|
356
|
-
id: "CLOUDFLARE_D1_STORAGE_GET_EVALS_ERROR",
|
|
357
|
-
domain: ErrorDomain.STORAGE,
|
|
358
|
-
category: ErrorCategory.THIRD_PARTY,
|
|
359
|
-
text: `Failed to retrieve evals for agent ${agentName}: ${error instanceof Error ? error.message : String(error)}`,
|
|
360
|
-
details: { agentName: agentName ?? "", type: type ?? "" }
|
|
361
|
-
},
|
|
362
|
-
error
|
|
363
|
-
);
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* @deprecated use getEvals instead
|
|
368
|
-
*/
|
|
369
|
-
async getEvalsByAgentName(agentName, type) {
|
|
370
|
-
const fullTableName = this.operations.getTableName(TABLE_EVALS);
|
|
371
|
-
try {
|
|
372
|
-
let query = createSqlBuilder().select("*").from(fullTableName).where("agent_name = ?", agentName);
|
|
373
|
-
if (type === "test") {
|
|
374
|
-
query = query.andWhere("test_info IS NOT NULL AND json_extract(test_info, '$.testPath') IS NOT NULL");
|
|
375
|
-
} else if (type === "live") {
|
|
376
|
-
query = query.andWhere("(test_info IS NULL OR json_extract(test_info, '$.testPath') IS NULL)");
|
|
377
|
-
}
|
|
378
|
-
query.orderBy("created_at", "DESC");
|
|
379
|
-
const { sql, params } = query.build();
|
|
380
|
-
const results = await this.operations.executeQuery({ sql, params });
|
|
381
|
-
return isArrayOfRecords(results) ? results.map((row) => {
|
|
382
|
-
const result = deserializeValue(row.result);
|
|
383
|
-
const testInfo = row.test_info ? deserializeValue(row.test_info) : void 0;
|
|
384
|
-
return {
|
|
385
|
-
input: row.input || "",
|
|
386
|
-
output: row.output || "",
|
|
387
|
-
result,
|
|
388
|
-
agentName: row.agent_name || "",
|
|
389
|
-
metricName: row.metric_name || "",
|
|
390
|
-
instructions: row.instructions || "",
|
|
391
|
-
runId: row.run_id || "",
|
|
392
|
-
globalRunId: row.global_run_id || "",
|
|
393
|
-
createdAt: row.created_at || "",
|
|
394
|
-
testInfo
|
|
395
|
-
};
|
|
396
|
-
}) : [];
|
|
397
|
-
} catch (error) {
|
|
398
|
-
const mastraError = new MastraError(
|
|
399
|
-
{
|
|
400
|
-
id: "CLOUDFLARE_D1_STORAGE_GET_EVALS_ERROR",
|
|
401
|
-
domain: ErrorDomain.STORAGE,
|
|
402
|
-
category: ErrorCategory.THIRD_PARTY,
|
|
403
|
-
text: `Failed to retrieve evals for agent ${agentName}: ${error instanceof Error ? error.message : String(error)}`,
|
|
404
|
-
details: { agentName }
|
|
405
|
-
},
|
|
406
|
-
error
|
|
407
|
-
);
|
|
408
|
-
this.logger?.error(mastraError.toString());
|
|
409
|
-
this.logger?.trackException(mastraError);
|
|
410
|
-
return [];
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
};
|
|
255
|
+
// src/storage/domains/memory/index.ts
|
|
414
256
|
var MemoryStorageD1 = class extends MemoryStorage {
|
|
415
257
|
operations;
|
|
416
258
|
constructor({ operations }) {
|
|
@@ -558,39 +400,22 @@ var MemoryStorageD1 = class extends MemoryStorage {
|
|
|
558
400
|
return null;
|
|
559
401
|
}
|
|
560
402
|
}
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
try {
|
|
567
|
-
const query = createSqlBuilder().select("*").from(fullTableName).where("resourceId = ?", resourceId);
|
|
568
|
-
const { sql, params } = query.build();
|
|
569
|
-
const results = await this.operations.executeQuery({ sql, params });
|
|
570
|
-
return (isArrayOfRecords(results) ? results : []).map((thread) => ({
|
|
571
|
-
...thread,
|
|
572
|
-
createdAt: ensureDate(thread.createdAt),
|
|
573
|
-
updatedAt: ensureDate(thread.updatedAt),
|
|
574
|
-
metadata: typeof thread.metadata === "string" ? JSON.parse(thread.metadata || "{}") : thread.metadata || {}
|
|
575
|
-
}));
|
|
576
|
-
} catch (error) {
|
|
577
|
-
const mastraError = new MastraError(
|
|
403
|
+
async listThreadsByResourceId(args) {
|
|
404
|
+
const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;
|
|
405
|
+
const perPage = normalizePerPage(perPageInput, 100);
|
|
406
|
+
if (page < 0) {
|
|
407
|
+
throw new MastraError(
|
|
578
408
|
{
|
|
579
|
-
id: "
|
|
409
|
+
id: "STORAGE_CLOUDFLARE_D1_LIST_THREADS_BY_RESOURCE_ID_INVALID_PAGE",
|
|
580
410
|
domain: ErrorDomain.STORAGE,
|
|
581
|
-
category: ErrorCategory.
|
|
582
|
-
|
|
583
|
-
details: { resourceId }
|
|
411
|
+
category: ErrorCategory.USER,
|
|
412
|
+
details: { page }
|
|
584
413
|
},
|
|
585
|
-
|
|
414
|
+
new Error("page must be >= 0")
|
|
586
415
|
);
|
|
587
|
-
this.logger?.error(mastraError.toString());
|
|
588
|
-
this.logger?.trackException(mastraError);
|
|
589
|
-
return [];
|
|
590
416
|
}
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
const { resourceId, page, perPage } = args;
|
|
417
|
+
const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
|
|
418
|
+
const { field, direction } = this.parseOrderBy(orderBy);
|
|
594
419
|
const fullTableName = this.operations.getTableName(TABLE_THREADS);
|
|
595
420
|
const mapRowToStorageThreadType = (row) => ({
|
|
596
421
|
...row,
|
|
@@ -602,20 +427,21 @@ var MemoryStorageD1 = class extends MemoryStorage {
|
|
|
602
427
|
const countQuery = createSqlBuilder().count().from(fullTableName).where("resourceId = ?", resourceId);
|
|
603
428
|
const countResult = await this.operations.executeQuery(countQuery.build());
|
|
604
429
|
const total = Number(countResult?.[0]?.count ?? 0);
|
|
605
|
-
const
|
|
430
|
+
const limitValue = perPageInput === false ? total : perPage;
|
|
431
|
+
const selectQuery = createSqlBuilder().select("*").from(fullTableName).where("resourceId = ?", resourceId).orderBy(field, direction).limit(limitValue).offset(offset);
|
|
606
432
|
const results = await this.operations.executeQuery(selectQuery.build());
|
|
607
433
|
const threads = results.map(mapRowToStorageThreadType);
|
|
608
434
|
return {
|
|
609
435
|
threads,
|
|
610
436
|
total,
|
|
611
437
|
page,
|
|
612
|
-
perPage,
|
|
613
|
-
hasMore:
|
|
438
|
+
perPage: perPageForResponse,
|
|
439
|
+
hasMore: perPageInput === false ? false : offset + perPage < total
|
|
614
440
|
};
|
|
615
441
|
} catch (error) {
|
|
616
442
|
const mastraError = new MastraError(
|
|
617
443
|
{
|
|
618
|
-
id: "
|
|
444
|
+
id: "CLOUDFLARE_D1_STORAGE_LIST_THREADS_BY_RESOURCE_ID_ERROR",
|
|
619
445
|
domain: ErrorDomain.STORAGE,
|
|
620
446
|
category: ErrorCategory.THIRD_PARTY,
|
|
621
447
|
text: `Error getting threads by resourceId ${resourceId}: ${error instanceof Error ? error.message : String(error)}`,
|
|
@@ -629,7 +455,7 @@ var MemoryStorageD1 = class extends MemoryStorage {
|
|
|
629
455
|
threads: [],
|
|
630
456
|
total: 0,
|
|
631
457
|
page,
|
|
632
|
-
perPage,
|
|
458
|
+
perPage: perPageForResponse,
|
|
633
459
|
hasMore: false
|
|
634
460
|
};
|
|
635
461
|
}
|
|
@@ -739,8 +565,8 @@ var MemoryStorageD1 = class extends MemoryStorage {
|
|
|
739
565
|
}
|
|
740
566
|
}
|
|
741
567
|
async saveMessages(args) {
|
|
742
|
-
const { messages
|
|
743
|
-
if (messages.length === 0) return [];
|
|
568
|
+
const { messages } = args;
|
|
569
|
+
if (messages.length === 0) return { messages: [] };
|
|
744
570
|
try {
|
|
745
571
|
const now = /* @__PURE__ */ new Date();
|
|
746
572
|
const threadId = messages[0]?.threadId;
|
|
@@ -788,8 +614,7 @@ var MemoryStorageD1 = class extends MemoryStorage {
|
|
|
788
614
|
]);
|
|
789
615
|
this.logger.debug(`Saved ${messages.length} messages`);
|
|
790
616
|
const list = new MessageList().add(messages, "memory");
|
|
791
|
-
|
|
792
|
-
return list.get.all.v1();
|
|
617
|
+
return { messages: list.get.all.db() };
|
|
793
618
|
} catch (error) {
|
|
794
619
|
throw new MastraError(
|
|
795
620
|
{
|
|
@@ -802,9 +627,8 @@ var MemoryStorageD1 = class extends MemoryStorage {
|
|
|
802
627
|
);
|
|
803
628
|
}
|
|
804
629
|
}
|
|
805
|
-
async _getIncludedMessages(threadId,
|
|
630
|
+
async _getIncludedMessages(threadId, include) {
|
|
806
631
|
if (!threadId.trim()) throw new Error("threadId must be a non-empty string");
|
|
807
|
-
const include = selectBy?.include;
|
|
808
632
|
if (!include) return null;
|
|
809
633
|
const unionQueries = [];
|
|
810
634
|
const params = [];
|
|
@@ -860,74 +684,8 @@ var MemoryStorageD1 = class extends MemoryStorage {
|
|
|
860
684
|
});
|
|
861
685
|
return processedMessages;
|
|
862
686
|
}
|
|
863
|
-
async
|
|
864
|
-
|
|
865
|
-
resourceId,
|
|
866
|
-
selectBy,
|
|
867
|
-
format
|
|
868
|
-
}) {
|
|
869
|
-
try {
|
|
870
|
-
if (!threadId.trim()) throw new Error("threadId must be a non-empty string");
|
|
871
|
-
const fullTableName = this.operations.getTableName(TABLE_MESSAGES);
|
|
872
|
-
const limit = resolveMessageLimit({
|
|
873
|
-
last: selectBy?.last,
|
|
874
|
-
defaultLimit: 40
|
|
875
|
-
});
|
|
876
|
-
const include = selectBy?.include || [];
|
|
877
|
-
const messages = [];
|
|
878
|
-
if (include.length) {
|
|
879
|
-
const includeResult = await this._getIncludedMessages(threadId, selectBy);
|
|
880
|
-
if (Array.isArray(includeResult)) messages.push(...includeResult);
|
|
881
|
-
}
|
|
882
|
-
const excludeIds = messages.map((m) => m.id);
|
|
883
|
-
const query = createSqlBuilder().select(["id", "content", "role", "type", "createdAt", "thread_id AS threadId"]).from(fullTableName).where("thread_id = ?", threadId);
|
|
884
|
-
if (excludeIds.length > 0) {
|
|
885
|
-
query.andWhere(`id NOT IN (${excludeIds.map(() => "?").join(",")})`, ...excludeIds);
|
|
886
|
-
}
|
|
887
|
-
query.orderBy("createdAt", "DESC").limit(limit);
|
|
888
|
-
const { sql, params } = query.build();
|
|
889
|
-
const result = await this.operations.executeQuery({ sql, params });
|
|
890
|
-
if (Array.isArray(result)) messages.push(...result);
|
|
891
|
-
messages.sort((a, b) => {
|
|
892
|
-
const aRecord = a;
|
|
893
|
-
const bRecord = b;
|
|
894
|
-
const timeA = new Date(aRecord.createdAt).getTime();
|
|
895
|
-
const timeB = new Date(bRecord.createdAt).getTime();
|
|
896
|
-
return timeA - timeB;
|
|
897
|
-
});
|
|
898
|
-
const processedMessages = messages.map((message) => {
|
|
899
|
-
const processedMsg = {};
|
|
900
|
-
for (const [key, value] of Object.entries(message)) {
|
|
901
|
-
if (key === `type` && value === `v2`) continue;
|
|
902
|
-
processedMsg[key] = deserializeValue(value);
|
|
903
|
-
}
|
|
904
|
-
return processedMsg;
|
|
905
|
-
});
|
|
906
|
-
this.logger.debug(`Retrieved ${messages.length} messages for thread ${threadId}`);
|
|
907
|
-
const list = new MessageList().add(processedMessages, "memory");
|
|
908
|
-
if (format === `v2`) return list.get.all.v2();
|
|
909
|
-
return list.get.all.v1();
|
|
910
|
-
} catch (error) {
|
|
911
|
-
const mastraError = new MastraError(
|
|
912
|
-
{
|
|
913
|
-
id: "CLOUDFLARE_D1_STORAGE_GET_MESSAGES_ERROR",
|
|
914
|
-
domain: ErrorDomain.STORAGE,
|
|
915
|
-
category: ErrorCategory.THIRD_PARTY,
|
|
916
|
-
text: `Failed to retrieve messages for thread ${threadId}: ${error instanceof Error ? error.message : String(error)}`,
|
|
917
|
-
details: { threadId, resourceId: resourceId ?? "" }
|
|
918
|
-
},
|
|
919
|
-
error
|
|
920
|
-
);
|
|
921
|
-
this.logger?.error(mastraError.toString());
|
|
922
|
-
this.logger?.trackException(mastraError);
|
|
923
|
-
throw mastraError;
|
|
924
|
-
}
|
|
925
|
-
}
|
|
926
|
-
async getMessagesById({
|
|
927
|
-
messageIds,
|
|
928
|
-
format
|
|
929
|
-
}) {
|
|
930
|
-
if (messageIds.length === 0) return [];
|
|
687
|
+
async listMessagesById({ messageIds }) {
|
|
688
|
+
if (messageIds.length === 0) return { messages: [] };
|
|
931
689
|
const fullTableName = this.operations.getTableName(TABLE_MESSAGES);
|
|
932
690
|
const messages = [];
|
|
933
691
|
try {
|
|
@@ -946,12 +704,11 @@ var MemoryStorageD1 = class extends MemoryStorage {
|
|
|
946
704
|
});
|
|
947
705
|
this.logger.debug(`Retrieved ${messages.length} messages`);
|
|
948
706
|
const list = new MessageList().add(processedMessages, "memory");
|
|
949
|
-
|
|
950
|
-
return list.get.all.v2();
|
|
707
|
+
return { messages: list.get.all.db() };
|
|
951
708
|
} catch (error) {
|
|
952
709
|
const mastraError = new MastraError(
|
|
953
710
|
{
|
|
954
|
-
id: "
|
|
711
|
+
id: "CLOUDFLARE_D1_STORAGE_LIST_MESSAGES_BY_ID_ERROR",
|
|
955
712
|
domain: ErrorDomain.STORAGE,
|
|
956
713
|
category: ErrorCategory.THIRD_PARTY,
|
|
957
714
|
text: `Failed to retrieve messages by ID: ${error instanceof Error ? error.message : String(error)}`,
|
|
@@ -964,118 +721,157 @@ var MemoryStorageD1 = class extends MemoryStorage {
|
|
|
964
721
|
throw mastraError;
|
|
965
722
|
}
|
|
966
723
|
}
|
|
967
|
-
async
|
|
968
|
-
threadId,
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
724
|
+
async listMessages(args) {
|
|
725
|
+
const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;
|
|
726
|
+
if (!threadId.trim()) {
|
|
727
|
+
throw new MastraError(
|
|
728
|
+
{
|
|
729
|
+
id: "STORAGE_CLOUDFLARE_D1_LIST_MESSAGES_INVALID_THREAD_ID",
|
|
730
|
+
domain: ErrorDomain.STORAGE,
|
|
731
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
732
|
+
details: { threadId }
|
|
733
|
+
},
|
|
734
|
+
new Error("threadId must be a non-empty string")
|
|
735
|
+
);
|
|
736
|
+
}
|
|
737
|
+
if (page < 0) {
|
|
738
|
+
throw new MastraError(
|
|
739
|
+
{
|
|
740
|
+
id: "STORAGE_CLOUDFLARE_D1_LIST_MESSAGES_INVALID_PAGE",
|
|
741
|
+
domain: ErrorDomain.STORAGE,
|
|
742
|
+
category: ErrorCategory.USER,
|
|
743
|
+
details: { page }
|
|
744
|
+
},
|
|
745
|
+
new Error("page must be >= 0")
|
|
746
|
+
);
|
|
747
|
+
}
|
|
748
|
+
const perPage = normalizePerPage(perPageInput, 40);
|
|
749
|
+
const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
|
|
978
750
|
try {
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
751
|
+
const fullTableName = this.operations.getTableName(TABLE_MESSAGES);
|
|
752
|
+
let query = `
|
|
753
|
+
SELECT id, content, role, type, createdAt, thread_id AS threadId, resourceId
|
|
754
|
+
FROM ${fullTableName}
|
|
755
|
+
WHERE thread_id = ?
|
|
756
|
+
`;
|
|
757
|
+
const queryParams = [threadId];
|
|
758
|
+
if (resourceId) {
|
|
759
|
+
query += ` AND resourceId = ?`;
|
|
760
|
+
queryParams.push(resourceId);
|
|
983
761
|
}
|
|
984
|
-
const
|
|
985
|
-
if (
|
|
986
|
-
|
|
762
|
+
const dateRange = filter?.dateRange;
|
|
763
|
+
if (dateRange?.start) {
|
|
764
|
+
const startDate = dateRange.start instanceof Date ? serializeDate(dateRange.start) : serializeDate(new Date(dateRange.start));
|
|
765
|
+
query += ` AND createdAt >= ?`;
|
|
766
|
+
queryParams.push(startDate);
|
|
987
767
|
}
|
|
988
|
-
if (
|
|
989
|
-
|
|
768
|
+
if (dateRange?.end) {
|
|
769
|
+
const endDate = dateRange.end instanceof Date ? serializeDate(dateRange.end) : serializeDate(new Date(dateRange.end));
|
|
770
|
+
query += ` AND createdAt <= ?`;
|
|
771
|
+
queryParams.push(endDate);
|
|
990
772
|
}
|
|
991
|
-
const
|
|
773
|
+
const { field, direction } = this.parseOrderBy(orderBy, "ASC");
|
|
774
|
+
query += ` ORDER BY "${field}" ${direction}`;
|
|
775
|
+
if (perPage !== Number.MAX_SAFE_INTEGER) {
|
|
776
|
+
query += ` LIMIT ? OFFSET ?`;
|
|
777
|
+
queryParams.push(perPage, offset);
|
|
778
|
+
}
|
|
779
|
+
const results = await this.operations.executeQuery({ sql: query, params: queryParams });
|
|
780
|
+
const paginatedMessages = (isArrayOfRecords(results) ? results : []).map((message) => {
|
|
781
|
+
const processedMsg = {};
|
|
782
|
+
for (const [key, value] of Object.entries(message)) {
|
|
783
|
+
if (key === `type` && value === `v2`) continue;
|
|
784
|
+
processedMsg[key] = deserializeValue(value);
|
|
785
|
+
}
|
|
786
|
+
return processedMsg;
|
|
787
|
+
});
|
|
788
|
+
const paginatedCount = paginatedMessages.length;
|
|
789
|
+
let countQuery = `SELECT count() as count FROM ${fullTableName} WHERE thread_id = ?`;
|
|
790
|
+
const countParams = [threadId];
|
|
791
|
+
if (resourceId) {
|
|
792
|
+
countQuery += ` AND resourceId = ?`;
|
|
793
|
+
countParams.push(resourceId);
|
|
794
|
+
}
|
|
795
|
+
if (dateRange?.start) {
|
|
796
|
+
const startDate = dateRange.start instanceof Date ? serializeDate(dateRange.start) : serializeDate(new Date(dateRange.start));
|
|
797
|
+
countQuery += ` AND createdAt >= ?`;
|
|
798
|
+
countParams.push(startDate);
|
|
799
|
+
}
|
|
800
|
+
if (dateRange?.end) {
|
|
801
|
+
const endDate = dateRange.end instanceof Date ? serializeDate(dateRange.end) : serializeDate(new Date(dateRange.end));
|
|
802
|
+
countQuery += ` AND createdAt <= ?`;
|
|
803
|
+
countParams.push(endDate);
|
|
804
|
+
}
|
|
805
|
+
const countResult = await this.operations.executeQuery({ sql: countQuery, params: countParams });
|
|
992
806
|
const total = Number(countResult[0]?.count ?? 0);
|
|
993
|
-
if (total === 0 &&
|
|
807
|
+
if (total === 0 && paginatedCount === 0 && (!include || include.length === 0)) {
|
|
994
808
|
return {
|
|
995
809
|
messages: [],
|
|
996
810
|
total: 0,
|
|
997
811
|
page,
|
|
998
|
-
perPage,
|
|
812
|
+
perPage: perPageForResponse,
|
|
999
813
|
hasMore: false
|
|
1000
814
|
};
|
|
1001
815
|
}
|
|
1002
|
-
const
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
if (selectBy?.last && selectBy.last > 0) {
|
|
1016
|
-
query = `
|
|
1017
|
-
SELECT id, content, role, type, createdAt, thread_id AS threadId, resourceId
|
|
1018
|
-
FROM ${fullTableName}
|
|
1019
|
-
WHERE thread_id = ?
|
|
1020
|
-
${fromDate ? "AND createdAt >= ?" : ""}
|
|
1021
|
-
${toDate ? "AND createdAt <= ?" : ""}
|
|
1022
|
-
${excludeCondition}
|
|
1023
|
-
ORDER BY createdAt DESC
|
|
1024
|
-
LIMIT ?
|
|
1025
|
-
`;
|
|
1026
|
-
queryParams.push(selectBy.last);
|
|
1027
|
-
} else {
|
|
1028
|
-
query = `
|
|
1029
|
-
SELECT id, content, role, type, createdAt, thread_id AS threadId, resourceId
|
|
1030
|
-
FROM ${fullTableName}
|
|
1031
|
-
WHERE thread_id = ?
|
|
1032
|
-
${fromDate ? "AND createdAt >= ?" : ""}
|
|
1033
|
-
${toDate ? "AND createdAt <= ?" : ""}
|
|
1034
|
-
${excludeCondition}
|
|
1035
|
-
ORDER BY createdAt DESC
|
|
1036
|
-
LIMIT ? OFFSET ?
|
|
1037
|
-
`;
|
|
1038
|
-
queryParams.push(perPage, page * perPage);
|
|
816
|
+
const messageIds = new Set(paginatedMessages.map((m) => m.id));
|
|
817
|
+
let includeMessages = [];
|
|
818
|
+
if (include && include.length > 0) {
|
|
819
|
+
const includeResult = await this._getIncludedMessages(threadId, include);
|
|
820
|
+
if (Array.isArray(includeResult)) {
|
|
821
|
+
includeMessages = includeResult;
|
|
822
|
+
for (const includeMsg of includeMessages) {
|
|
823
|
+
if (!messageIds.has(includeMsg.id)) {
|
|
824
|
+
paginatedMessages.push(includeMsg);
|
|
825
|
+
messageIds.add(includeMsg.id);
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
}
|
|
1039
829
|
}
|
|
1040
|
-
const
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
830
|
+
const list = new MessageList().add(paginatedMessages, "memory");
|
|
831
|
+
let finalMessages = list.get.all.db();
|
|
832
|
+
finalMessages = finalMessages.sort((a, b) => {
|
|
833
|
+
const isDateField = field === "createdAt" || field === "updatedAt";
|
|
834
|
+
const aValue = isDateField ? new Date(a[field]).getTime() : a[field];
|
|
835
|
+
const bValue = isDateField ? new Date(b[field]).getTime() : b[field];
|
|
836
|
+
if (aValue === bValue) {
|
|
837
|
+
return a.id.localeCompare(b.id);
|
|
1046
838
|
}
|
|
1047
|
-
|
|
839
|
+
if (typeof aValue === "number" && typeof bValue === "number") {
|
|
840
|
+
return direction === "ASC" ? aValue - bValue : bValue - aValue;
|
|
841
|
+
}
|
|
842
|
+
return direction === "ASC" ? String(aValue).localeCompare(String(bValue)) : String(bValue).localeCompare(String(aValue));
|
|
1048
843
|
});
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
const list = new MessageList().add(processedMessages, "memory");
|
|
1053
|
-
messages.push(...format === `v2` ? list.get.all.v2() : list.get.all.v1());
|
|
844
|
+
const returnedThreadMessageIds = new Set(finalMessages.filter((m) => m.threadId === threadId).map((m) => m.id));
|
|
845
|
+
const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;
|
|
846
|
+
const hasMore = perPageInput === false ? false : allThreadMessagesReturned ? false : offset + paginatedCount < total;
|
|
1054
847
|
return {
|
|
1055
|
-
messages,
|
|
848
|
+
messages: finalMessages,
|
|
1056
849
|
total,
|
|
1057
850
|
page,
|
|
1058
|
-
perPage,
|
|
1059
|
-
hasMore
|
|
851
|
+
perPage: perPageForResponse,
|
|
852
|
+
hasMore
|
|
1060
853
|
};
|
|
1061
854
|
} catch (error) {
|
|
1062
855
|
const mastraError = new MastraError(
|
|
1063
856
|
{
|
|
1064
|
-
id: "
|
|
857
|
+
id: "CLOUDFLARE_D1_STORAGE_LIST_MESSAGES_ERROR",
|
|
1065
858
|
domain: ErrorDomain.STORAGE,
|
|
1066
859
|
category: ErrorCategory.THIRD_PARTY,
|
|
1067
|
-
text: `Failed to
|
|
1068
|
-
details: {
|
|
860
|
+
text: `Failed to list messages for thread ${threadId}: ${error instanceof Error ? error.message : String(error)}`,
|
|
861
|
+
details: {
|
|
862
|
+
threadId,
|
|
863
|
+
resourceId: resourceId ?? ""
|
|
864
|
+
}
|
|
1069
865
|
},
|
|
1070
866
|
error
|
|
1071
867
|
);
|
|
1072
|
-
this.logger?.error(mastraError.toString());
|
|
1073
|
-
this.logger?.trackException(mastraError);
|
|
868
|
+
this.logger?.error?.(mastraError.toString());
|
|
869
|
+
this.logger?.trackException?.(mastraError);
|
|
1074
870
|
return {
|
|
1075
871
|
messages: [],
|
|
1076
872
|
total: 0,
|
|
1077
873
|
page,
|
|
1078
|
-
perPage,
|
|
874
|
+
perPage: perPageForResponse,
|
|
1079
875
|
hasMore: false
|
|
1080
876
|
};
|
|
1081
877
|
}
|
|
@@ -1576,7 +1372,7 @@ function transformScoreRow(row) {
|
|
|
1576
1372
|
deserialized.analyzeStepResult = safelyParseJSON(row.analyzeStepResult);
|
|
1577
1373
|
deserialized.metadata = safelyParseJSON(row.metadata);
|
|
1578
1374
|
deserialized.additionalContext = safelyParseJSON(row.additionalContext);
|
|
1579
|
-
deserialized.
|
|
1375
|
+
deserialized.requestContext = safelyParseJSON(row.requestContext);
|
|
1580
1376
|
deserialized.entity = safelyParseJSON(row.entity);
|
|
1581
1377
|
deserialized.createdAt = row.createdAtZ || row.createdAt;
|
|
1582
1378
|
deserialized.updatedAt = row.updatedAtZ || row.updatedAt;
|
|
@@ -1660,7 +1456,7 @@ var ScoresStorageD1 = class extends ScoresStorage {
|
|
|
1660
1456
|
);
|
|
1661
1457
|
}
|
|
1662
1458
|
}
|
|
1663
|
-
async
|
|
1459
|
+
async listScoresByScorerId({
|
|
1664
1460
|
scorerId,
|
|
1665
1461
|
entityId,
|
|
1666
1462
|
entityType,
|
|
@@ -1668,6 +1464,9 @@ var ScoresStorageD1 = class extends ScoresStorage {
|
|
|
1668
1464
|
pagination
|
|
1669
1465
|
}) {
|
|
1670
1466
|
try {
|
|
1467
|
+
const { page, perPage: perPageInput } = pagination;
|
|
1468
|
+
const perPage = normalizePerPage(perPageInput, 100);
|
|
1469
|
+
const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
|
|
1671
1470
|
const fullTableName = this.operations.getTableName(TABLE_SCORERS);
|
|
1672
1471
|
const countQuery = createSqlBuilder().count().from(fullTableName).where("scorerId = ?", scorerId);
|
|
1673
1472
|
if (entityId) {
|
|
@@ -1685,13 +1484,15 @@ var ScoresStorageD1 = class extends ScoresStorage {
|
|
|
1685
1484
|
return {
|
|
1686
1485
|
pagination: {
|
|
1687
1486
|
total: 0,
|
|
1688
|
-
page
|
|
1689
|
-
perPage:
|
|
1487
|
+
page,
|
|
1488
|
+
perPage: perPageForResponse,
|
|
1690
1489
|
hasMore: false
|
|
1691
1490
|
},
|
|
1692
1491
|
scores: []
|
|
1693
1492
|
};
|
|
1694
1493
|
}
|
|
1494
|
+
const end = perPageInput === false ? total : start + perPage;
|
|
1495
|
+
const limitValue = perPageInput === false ? total : perPage;
|
|
1695
1496
|
const selectQuery = createSqlBuilder().select("*").from(fullTableName).where("scorerId = ?", scorerId);
|
|
1696
1497
|
if (entityId) {
|
|
1697
1498
|
selectQuery.andWhere("entityId = ?", entityId);
|
|
@@ -1702,16 +1503,16 @@ var ScoresStorageD1 = class extends ScoresStorage {
|
|
|
1702
1503
|
if (source) {
|
|
1703
1504
|
selectQuery.andWhere("source = ?", source);
|
|
1704
1505
|
}
|
|
1705
|
-
selectQuery.limit(
|
|
1506
|
+
selectQuery.limit(limitValue).offset(start);
|
|
1706
1507
|
const { sql, params } = selectQuery.build();
|
|
1707
1508
|
const results = await this.operations.executeQuery({ sql, params });
|
|
1708
1509
|
const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];
|
|
1709
1510
|
return {
|
|
1710
1511
|
pagination: {
|
|
1711
1512
|
total,
|
|
1712
|
-
page
|
|
1713
|
-
perPage:
|
|
1714
|
-
hasMore:
|
|
1513
|
+
page,
|
|
1514
|
+
perPage: perPageForResponse,
|
|
1515
|
+
hasMore: end < total
|
|
1715
1516
|
},
|
|
1716
1517
|
scores
|
|
1717
1518
|
};
|
|
@@ -1726,11 +1527,14 @@ var ScoresStorageD1 = class extends ScoresStorage {
|
|
|
1726
1527
|
);
|
|
1727
1528
|
}
|
|
1728
1529
|
}
|
|
1729
|
-
async
|
|
1530
|
+
async listScoresByRunId({
|
|
1730
1531
|
runId,
|
|
1731
1532
|
pagination
|
|
1732
1533
|
}) {
|
|
1733
1534
|
try {
|
|
1535
|
+
const { page, perPage: perPageInput } = pagination;
|
|
1536
|
+
const perPage = normalizePerPage(perPageInput, 100);
|
|
1537
|
+
const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
|
|
1734
1538
|
const fullTableName = this.operations.getTableName(TABLE_SCORERS);
|
|
1735
1539
|
const countQuery = createSqlBuilder().count().from(fullTableName).where("runId = ?", runId);
|
|
1736
1540
|
const countResult = await this.operations.executeQuery(countQuery.build());
|
|
@@ -1739,23 +1543,25 @@ var ScoresStorageD1 = class extends ScoresStorage {
|
|
|
1739
1543
|
return {
|
|
1740
1544
|
pagination: {
|
|
1741
1545
|
total: 0,
|
|
1742
|
-
page
|
|
1743
|
-
perPage:
|
|
1546
|
+
page,
|
|
1547
|
+
perPage: perPageForResponse,
|
|
1744
1548
|
hasMore: false
|
|
1745
1549
|
},
|
|
1746
1550
|
scores: []
|
|
1747
1551
|
};
|
|
1748
1552
|
}
|
|
1749
|
-
const
|
|
1553
|
+
const end = perPageInput === false ? total : start + perPage;
|
|
1554
|
+
const limitValue = perPageInput === false ? total : perPage;
|
|
1555
|
+
const selectQuery = createSqlBuilder().select("*").from(fullTableName).where("runId = ?", runId).limit(limitValue).offset(start);
|
|
1750
1556
|
const { sql, params } = selectQuery.build();
|
|
1751
1557
|
const results = await this.operations.executeQuery({ sql, params });
|
|
1752
1558
|
const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];
|
|
1753
1559
|
return {
|
|
1754
1560
|
pagination: {
|
|
1755
1561
|
total,
|
|
1756
|
-
page
|
|
1757
|
-
perPage:
|
|
1758
|
-
hasMore:
|
|
1562
|
+
page,
|
|
1563
|
+
perPage: perPageForResponse,
|
|
1564
|
+
hasMore: end < total
|
|
1759
1565
|
},
|
|
1760
1566
|
scores
|
|
1761
1567
|
};
|
|
@@ -1770,12 +1576,15 @@ var ScoresStorageD1 = class extends ScoresStorage {
|
|
|
1770
1576
|
);
|
|
1771
1577
|
}
|
|
1772
1578
|
}
|
|
1773
|
-
async
|
|
1579
|
+
async listScoresByEntityId({
|
|
1774
1580
|
entityId,
|
|
1775
1581
|
entityType,
|
|
1776
1582
|
pagination
|
|
1777
1583
|
}) {
|
|
1778
1584
|
try {
|
|
1585
|
+
const { page, perPage: perPageInput } = pagination;
|
|
1586
|
+
const perPage = normalizePerPage(perPageInput, 100);
|
|
1587
|
+
const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
|
|
1779
1588
|
const fullTableName = this.operations.getTableName(TABLE_SCORERS);
|
|
1780
1589
|
const countQuery = createSqlBuilder().count().from(fullTableName).where("entityId = ?", entityId).andWhere("entityType = ?", entityType);
|
|
1781
1590
|
const countResult = await this.operations.executeQuery(countQuery.build());
|
|
@@ -1784,23 +1593,25 @@ var ScoresStorageD1 = class extends ScoresStorage {
|
|
|
1784
1593
|
return {
|
|
1785
1594
|
pagination: {
|
|
1786
1595
|
total: 0,
|
|
1787
|
-
page
|
|
1788
|
-
perPage:
|
|
1596
|
+
page,
|
|
1597
|
+
perPage: perPageForResponse,
|
|
1789
1598
|
hasMore: false
|
|
1790
1599
|
},
|
|
1791
1600
|
scores: []
|
|
1792
1601
|
};
|
|
1793
1602
|
}
|
|
1794
|
-
const
|
|
1603
|
+
const end = perPageInput === false ? total : start + perPage;
|
|
1604
|
+
const limitValue = perPageInput === false ? total : perPage;
|
|
1605
|
+
const selectQuery = createSqlBuilder().select("*").from(fullTableName).where("entityId = ?", entityId).andWhere("entityType = ?", entityType).limit(limitValue).offset(start);
|
|
1795
1606
|
const { sql, params } = selectQuery.build();
|
|
1796
1607
|
const results = await this.operations.executeQuery({ sql, params });
|
|
1797
1608
|
const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];
|
|
1798
1609
|
return {
|
|
1799
1610
|
pagination: {
|
|
1800
1611
|
total,
|
|
1801
|
-
page
|
|
1802
|
-
perPage:
|
|
1803
|
-
hasMore:
|
|
1612
|
+
page,
|
|
1613
|
+
perPage: perPageForResponse,
|
|
1614
|
+
hasMore: end < total
|
|
1804
1615
|
},
|
|
1805
1616
|
scores
|
|
1806
1617
|
};
|
|
@@ -1815,12 +1626,15 @@ var ScoresStorageD1 = class extends ScoresStorage {
|
|
|
1815
1626
|
);
|
|
1816
1627
|
}
|
|
1817
1628
|
}
|
|
1818
|
-
async
|
|
1629
|
+
async listScoresBySpan({
|
|
1819
1630
|
traceId,
|
|
1820
1631
|
spanId,
|
|
1821
1632
|
pagination
|
|
1822
1633
|
}) {
|
|
1823
1634
|
try {
|
|
1635
|
+
const { page, perPage: perPageInput } = pagination;
|
|
1636
|
+
const perPage = normalizePerPage(perPageInput, 100);
|
|
1637
|
+
const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
|
|
1824
1638
|
const fullTableName = this.operations.getTableName(TABLE_SCORERS);
|
|
1825
1639
|
const countQuery = createSqlBuilder().count().from(fullTableName).where("traceId = ?", traceId).andWhere("spanId = ?", spanId);
|
|
1826
1640
|
const countResult = await this.operations.executeQuery(countQuery.build());
|
|
@@ -1829,25 +1643,25 @@ var ScoresStorageD1 = class extends ScoresStorage {
|
|
|
1829
1643
|
return {
|
|
1830
1644
|
pagination: {
|
|
1831
1645
|
total: 0,
|
|
1832
|
-
page
|
|
1833
|
-
perPage:
|
|
1646
|
+
page,
|
|
1647
|
+
perPage: perPageForResponse,
|
|
1834
1648
|
hasMore: false
|
|
1835
1649
|
},
|
|
1836
1650
|
scores: []
|
|
1837
1651
|
};
|
|
1838
1652
|
}
|
|
1839
|
-
const
|
|
1840
|
-
const
|
|
1653
|
+
const end = perPageInput === false ? total : start + perPage;
|
|
1654
|
+
const limitValue = perPageInput === false ? total : perPage;
|
|
1655
|
+
const selectQuery = createSqlBuilder().select("*").from(fullTableName).where("traceId = ?", traceId).andWhere("spanId = ?", spanId).orderBy("createdAt", "DESC").limit(limitValue).offset(start);
|
|
1841
1656
|
const { sql, params } = selectQuery.build();
|
|
1842
1657
|
const results = await this.operations.executeQuery({ sql, params });
|
|
1843
|
-
const
|
|
1844
|
-
const scores = rows.slice(0, pagination.perPage).map(transformScoreRow);
|
|
1658
|
+
const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];
|
|
1845
1659
|
return {
|
|
1846
1660
|
pagination: {
|
|
1847
1661
|
total,
|
|
1848
|
-
page
|
|
1849
|
-
perPage:
|
|
1850
|
-
hasMore:
|
|
1662
|
+
page,
|
|
1663
|
+
perPage: perPageForResponse,
|
|
1664
|
+
hasMore: end < total
|
|
1851
1665
|
},
|
|
1852
1666
|
scores
|
|
1853
1667
|
};
|
|
@@ -1863,128 +1677,6 @@ var ScoresStorageD1 = class extends ScoresStorage {
|
|
|
1863
1677
|
}
|
|
1864
1678
|
}
|
|
1865
1679
|
};
|
|
1866
|
-
function isArrayOfRecords2(value) {
|
|
1867
|
-
return value && Array.isArray(value) && value.length > 0;
|
|
1868
|
-
}
|
|
1869
|
-
var TracesStorageD1 = class extends TracesStorage {
|
|
1870
|
-
operations;
|
|
1871
|
-
constructor({ operations }) {
|
|
1872
|
-
super();
|
|
1873
|
-
this.operations = operations;
|
|
1874
|
-
}
|
|
1875
|
-
async getTraces(args) {
|
|
1876
|
-
const paginatedArgs = {
|
|
1877
|
-
name: args.name,
|
|
1878
|
-
scope: args.scope,
|
|
1879
|
-
page: args.page,
|
|
1880
|
-
perPage: args.perPage,
|
|
1881
|
-
attributes: args.attributes,
|
|
1882
|
-
filters: args.filters,
|
|
1883
|
-
dateRange: args.fromDate || args.toDate ? {
|
|
1884
|
-
start: args.fromDate,
|
|
1885
|
-
end: args.toDate
|
|
1886
|
-
} : void 0
|
|
1887
|
-
};
|
|
1888
|
-
try {
|
|
1889
|
-
const result = await this.getTracesPaginated(paginatedArgs);
|
|
1890
|
-
return result.traces;
|
|
1891
|
-
} catch (error) {
|
|
1892
|
-
throw new MastraError(
|
|
1893
|
-
{
|
|
1894
|
-
id: "CLOUDFLARE_D1_STORAGE_GET_TRACES_ERROR",
|
|
1895
|
-
domain: ErrorDomain.STORAGE,
|
|
1896
|
-
category: ErrorCategory.THIRD_PARTY,
|
|
1897
|
-
text: `Failed to retrieve traces: ${error instanceof Error ? error.message : String(error)}`,
|
|
1898
|
-
details: {
|
|
1899
|
-
name: args.name ?? "",
|
|
1900
|
-
scope: args.scope ?? ""
|
|
1901
|
-
}
|
|
1902
|
-
},
|
|
1903
|
-
error
|
|
1904
|
-
);
|
|
1905
|
-
}
|
|
1906
|
-
}
|
|
1907
|
-
async getTracesPaginated(args) {
|
|
1908
|
-
const { name, scope, page = 0, perPage = 100, attributes, dateRange } = args;
|
|
1909
|
-
const fromDate = dateRange?.start;
|
|
1910
|
-
const toDate = dateRange?.end;
|
|
1911
|
-
const fullTableName = this.operations.getTableName(TABLE_TRACES);
|
|
1912
|
-
try {
|
|
1913
|
-
const dataQuery = createSqlBuilder().select("*").from(fullTableName).where("1=1");
|
|
1914
|
-
const countQuery = createSqlBuilder().count().from(fullTableName).where("1=1");
|
|
1915
|
-
if (name) {
|
|
1916
|
-
dataQuery.andWhere("name LIKE ?", `%${name}%`);
|
|
1917
|
-
countQuery.andWhere("name LIKE ?", `%${name}%`);
|
|
1918
|
-
}
|
|
1919
|
-
if (scope) {
|
|
1920
|
-
dataQuery.andWhere("scope = ?", scope);
|
|
1921
|
-
countQuery.andWhere("scope = ?", scope);
|
|
1922
|
-
}
|
|
1923
|
-
if (attributes && Object.keys(attributes).length > 0) {
|
|
1924
|
-
for (const [key, value] of Object.entries(attributes)) {
|
|
1925
|
-
dataQuery.jsonLike("attributes", key, value);
|
|
1926
|
-
countQuery.jsonLike("attributes", key, value);
|
|
1927
|
-
}
|
|
1928
|
-
}
|
|
1929
|
-
if (fromDate) {
|
|
1930
|
-
const fromDateStr = fromDate instanceof Date ? fromDate.toISOString() : fromDate;
|
|
1931
|
-
dataQuery.andWhere("createdAt >= ?", fromDateStr);
|
|
1932
|
-
countQuery.andWhere("createdAt >= ?", fromDateStr);
|
|
1933
|
-
}
|
|
1934
|
-
if (toDate) {
|
|
1935
|
-
const toDateStr = toDate instanceof Date ? toDate.toISOString() : toDate;
|
|
1936
|
-
dataQuery.andWhere("createdAt <= ?", toDateStr);
|
|
1937
|
-
countQuery.andWhere("createdAt <= ?", toDateStr);
|
|
1938
|
-
}
|
|
1939
|
-
const allDataResult = await this.operations.executeQuery(
|
|
1940
|
-
createSqlBuilder().select("*").from(fullTableName).where("1=1").build()
|
|
1941
|
-
);
|
|
1942
|
-
console.info("allDataResult", allDataResult);
|
|
1943
|
-
const countResult = await this.operations.executeQuery(countQuery.build());
|
|
1944
|
-
const total = Number(countResult?.[0]?.count ?? 0);
|
|
1945
|
-
dataQuery.orderBy("startTime", "DESC").limit(perPage).offset(page * perPage);
|
|
1946
|
-
const results = await this.operations.executeQuery(dataQuery.build());
|
|
1947
|
-
const traces = isArrayOfRecords2(results) ? results.map(
|
|
1948
|
-
(trace) => ({
|
|
1949
|
-
...trace,
|
|
1950
|
-
attributes: deserializeValue(trace.attributes, "jsonb"),
|
|
1951
|
-
status: deserializeValue(trace.status, "jsonb"),
|
|
1952
|
-
events: deserializeValue(trace.events, "jsonb"),
|
|
1953
|
-
links: deserializeValue(trace.links, "jsonb"),
|
|
1954
|
-
other: deserializeValue(trace.other, "jsonb")
|
|
1955
|
-
})
|
|
1956
|
-
) : [];
|
|
1957
|
-
return {
|
|
1958
|
-
traces,
|
|
1959
|
-
total,
|
|
1960
|
-
page,
|
|
1961
|
-
perPage,
|
|
1962
|
-
hasMore: page * perPage + traces.length < total
|
|
1963
|
-
};
|
|
1964
|
-
} catch (error) {
|
|
1965
|
-
const mastraError = new MastraError(
|
|
1966
|
-
{
|
|
1967
|
-
id: "CLOUDFLARE_D1_STORAGE_GET_TRACES_PAGINATED_ERROR",
|
|
1968
|
-
domain: ErrorDomain.STORAGE,
|
|
1969
|
-
category: ErrorCategory.THIRD_PARTY,
|
|
1970
|
-
text: `Failed to retrieve traces: ${error instanceof Error ? error.message : String(error)}`,
|
|
1971
|
-
details: { name: name ?? "", scope: scope ?? "" }
|
|
1972
|
-
},
|
|
1973
|
-
error
|
|
1974
|
-
);
|
|
1975
|
-
this.logger?.error(mastraError.toString());
|
|
1976
|
-
this.logger?.trackException(mastraError);
|
|
1977
|
-
return { traces: [], total: 0, page, perPage, hasMore: false };
|
|
1978
|
-
}
|
|
1979
|
-
}
|
|
1980
|
-
async batchTraceInsert({ records }) {
|
|
1981
|
-
this.logger.debug("Batch inserting traces", { count: records.length });
|
|
1982
|
-
await this.operations.batchInsert({
|
|
1983
|
-
tableName: TABLE_TRACES,
|
|
1984
|
-
records
|
|
1985
|
-
});
|
|
1986
|
-
}
|
|
1987
|
-
};
|
|
1988
1680
|
var WorkflowsStorageD1 = class extends WorkflowsStorage {
|
|
1989
1681
|
operations;
|
|
1990
1682
|
constructor({ operations }) {
|
|
@@ -1996,7 +1688,7 @@ var WorkflowsStorageD1 = class extends WorkflowsStorage {
|
|
|
1996
1688
|
// runId,
|
|
1997
1689
|
// stepId,
|
|
1998
1690
|
// result,
|
|
1999
|
-
//
|
|
1691
|
+
// requestContext,
|
|
2000
1692
|
}) {
|
|
2001
1693
|
throw new Error("Method not implemented.");
|
|
2002
1694
|
}
|
|
@@ -2100,19 +1792,24 @@ var WorkflowsStorageD1 = class extends WorkflowsStorage {
|
|
|
2100
1792
|
resourceId: row.resourceId
|
|
2101
1793
|
};
|
|
2102
1794
|
}
|
|
2103
|
-
async
|
|
1795
|
+
async listWorkflowRuns({
|
|
2104
1796
|
workflowName,
|
|
2105
1797
|
fromDate,
|
|
2106
1798
|
toDate,
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
resourceId
|
|
1799
|
+
page,
|
|
1800
|
+
perPage,
|
|
1801
|
+
resourceId,
|
|
1802
|
+
status
|
|
2110
1803
|
} = {}) {
|
|
2111
1804
|
const fullTableName = this.operations.getTableName(TABLE_WORKFLOW_SNAPSHOT);
|
|
2112
1805
|
try {
|
|
2113
1806
|
const builder = createSqlBuilder().select().from(fullTableName);
|
|
2114
1807
|
const countBuilder = createSqlBuilder().count().from(fullTableName);
|
|
2115
1808
|
if (workflowName) builder.whereAnd("workflow_name = ?", workflowName);
|
|
1809
|
+
if (status) {
|
|
1810
|
+
builder.whereAnd("json_extract(snapshot, '$.status') = ?", status);
|
|
1811
|
+
countBuilder.whereAnd("json_extract(snapshot, '$.status') = ?", status);
|
|
1812
|
+
}
|
|
2116
1813
|
if (resourceId) {
|
|
2117
1814
|
const hasResourceId = await this.operations.hasColumn(fullTableName, "resourceId");
|
|
2118
1815
|
if (hasResourceId) {
|
|
@@ -2131,11 +1828,14 @@ var WorkflowsStorageD1 = class extends WorkflowsStorage {
|
|
|
2131
1828
|
countBuilder.whereAnd("createdAt <= ?", toDate instanceof Date ? toDate.toISOString() : toDate);
|
|
2132
1829
|
}
|
|
2133
1830
|
builder.orderBy("createdAt", "DESC");
|
|
2134
|
-
if (typeof
|
|
2135
|
-
|
|
1831
|
+
if (typeof perPage === "number" && typeof page === "number") {
|
|
1832
|
+
const offset = page * perPage;
|
|
1833
|
+
builder.limit(perPage);
|
|
1834
|
+
builder.offset(offset);
|
|
1835
|
+
}
|
|
2136
1836
|
const { sql, params } = builder.build();
|
|
2137
1837
|
let total = 0;
|
|
2138
|
-
if (
|
|
1838
|
+
if (perPage !== void 0 && page !== void 0) {
|
|
2139
1839
|
const { sql: countSql, params: countParams } = countBuilder.build();
|
|
2140
1840
|
const countResult = await this.operations.executeQuery({
|
|
2141
1841
|
sql: countSql,
|
|
@@ -2150,7 +1850,7 @@ var WorkflowsStorageD1 = class extends WorkflowsStorage {
|
|
|
2150
1850
|
} catch (error) {
|
|
2151
1851
|
throw new MastraError(
|
|
2152
1852
|
{
|
|
2153
|
-
id: "
|
|
1853
|
+
id: "CLOUDFLARE_D1_STORAGE_LIST_WORKFLOW_RUNS_ERROR",
|
|
2154
1854
|
domain: ErrorDomain.STORAGE,
|
|
2155
1855
|
category: ErrorCategory.THIRD_PARTY,
|
|
2156
1856
|
text: `Failed to retrieve workflow runs: ${error instanceof Error ? error.message : String(error)}`,
|
|
@@ -2212,7 +1912,7 @@ var D1Store = class extends MastraStorage {
|
|
|
2212
1912
|
*/
|
|
2213
1913
|
constructor(config) {
|
|
2214
1914
|
try {
|
|
2215
|
-
super({ name: "D1" });
|
|
1915
|
+
super({ id: config.id, name: "D1" });
|
|
2216
1916
|
if (config.tablePrefix && !/^[a-zA-Z0-9_]*$/.test(config.tablePrefix)) {
|
|
2217
1917
|
throw new Error("Invalid tablePrefix: only letters, numbers, and underscores are allowed.");
|
|
2218
1918
|
}
|
|
@@ -2266,12 +1966,6 @@ var D1Store = class extends MastraStorage {
|
|
|
2266
1966
|
const scores = new ScoresStorageD1({
|
|
2267
1967
|
operations
|
|
2268
1968
|
});
|
|
2269
|
-
const legacyEvals = new LegacyEvalsStorageD1({
|
|
2270
|
-
operations
|
|
2271
|
-
});
|
|
2272
|
-
const traces = new TracesStorageD1({
|
|
2273
|
-
operations
|
|
2274
|
-
});
|
|
2275
1969
|
const workflows = new WorkflowsStorageD1({
|
|
2276
1970
|
operations
|
|
2277
1971
|
});
|
|
@@ -2281,8 +1975,6 @@ var D1Store = class extends MastraStorage {
|
|
|
2281
1975
|
this.stores = {
|
|
2282
1976
|
operations,
|
|
2283
1977
|
scores,
|
|
2284
|
-
legacyEvals,
|
|
2285
|
-
traces,
|
|
2286
1978
|
workflows,
|
|
2287
1979
|
memory
|
|
2288
1980
|
};
|
|
@@ -2294,7 +1986,7 @@ var D1Store = class extends MastraStorage {
|
|
|
2294
1986
|
hasColumn: true,
|
|
2295
1987
|
createTable: true,
|
|
2296
1988
|
deleteMessages: false,
|
|
2297
|
-
|
|
1989
|
+
listScoresBySpan: true
|
|
2298
1990
|
};
|
|
2299
1991
|
}
|
|
2300
1992
|
async createTable({
|
|
@@ -2334,15 +2026,6 @@ var D1Store = class extends MastraStorage {
|
|
|
2334
2026
|
async getThreadById({ threadId }) {
|
|
2335
2027
|
return this.stores.memory.getThreadById({ threadId });
|
|
2336
2028
|
}
|
|
2337
|
-
/**
|
|
2338
|
-
* @deprecated use getThreadsByResourceIdPaginated instead
|
|
2339
|
-
*/
|
|
2340
|
-
async getThreadsByResourceId({ resourceId }) {
|
|
2341
|
-
return this.stores.memory.getThreadsByResourceId({ resourceId });
|
|
2342
|
-
}
|
|
2343
|
-
async getThreadsByResourceIdPaginated(args) {
|
|
2344
|
-
return this.stores.memory.getThreadsByResourceIdPaginated(args);
|
|
2345
|
-
}
|
|
2346
2029
|
async saveThread({ thread }) {
|
|
2347
2030
|
return this.stores.memory.saveThread({ thread });
|
|
2348
2031
|
}
|
|
@@ -2359,34 +2042,14 @@ var D1Store = class extends MastraStorage {
|
|
|
2359
2042
|
async saveMessages(args) {
|
|
2360
2043
|
return this.stores.memory.saveMessages(args);
|
|
2361
2044
|
}
|
|
2362
|
-
async getMessages({
|
|
2363
|
-
threadId,
|
|
2364
|
-
selectBy,
|
|
2365
|
-
format
|
|
2366
|
-
}) {
|
|
2367
|
-
return this.stores.memory.getMessages({ threadId, selectBy, format });
|
|
2368
|
-
}
|
|
2369
|
-
async getMessagesById({
|
|
2370
|
-
messageIds,
|
|
2371
|
-
format
|
|
2372
|
-
}) {
|
|
2373
|
-
return this.stores.memory.getMessagesById({ messageIds, format });
|
|
2374
|
-
}
|
|
2375
|
-
async getMessagesPaginated({
|
|
2376
|
-
threadId,
|
|
2377
|
-
selectBy,
|
|
2378
|
-
format
|
|
2379
|
-
}) {
|
|
2380
|
-
return this.stores.memory.getMessagesPaginated({ threadId, selectBy, format });
|
|
2381
|
-
}
|
|
2382
2045
|
async updateWorkflowResults({
|
|
2383
2046
|
workflowName,
|
|
2384
2047
|
runId,
|
|
2385
2048
|
stepId,
|
|
2386
2049
|
result,
|
|
2387
|
-
|
|
2050
|
+
requestContext
|
|
2388
2051
|
}) {
|
|
2389
|
-
return this.stores.workflows.updateWorkflowResults({ workflowName, runId, stepId, result,
|
|
2052
|
+
return this.stores.workflows.updateWorkflowResults({ workflowName, runId, stepId, result, requestContext });
|
|
2390
2053
|
}
|
|
2391
2054
|
async updateWorkflowState({
|
|
2392
2055
|
workflowName,
|
|
@@ -2406,15 +2069,8 @@ var D1Store = class extends MastraStorage {
|
|
|
2406
2069
|
async loadWorkflowSnapshot(params) {
|
|
2407
2070
|
return this.stores.workflows.loadWorkflowSnapshot(params);
|
|
2408
2071
|
}
|
|
2409
|
-
async
|
|
2410
|
-
|
|
2411
|
-
fromDate,
|
|
2412
|
-
toDate,
|
|
2413
|
-
limit,
|
|
2414
|
-
offset,
|
|
2415
|
-
resourceId
|
|
2416
|
-
} = {}) {
|
|
2417
|
-
return this.stores.workflows.getWorkflowRuns({ workflowName, fromDate, toDate, limit, offset, resourceId });
|
|
2072
|
+
async listWorkflowRuns(args = {}) {
|
|
2073
|
+
return this.stores.workflows.listWorkflowRuns(args);
|
|
2418
2074
|
}
|
|
2419
2075
|
async getWorkflowRunById({
|
|
2420
2076
|
runId,
|
|
@@ -2430,24 +2086,6 @@ var D1Store = class extends MastraStorage {
|
|
|
2430
2086
|
async batchInsert({ tableName, records }) {
|
|
2431
2087
|
return this.stores.operations.batchInsert({ tableName, records });
|
|
2432
2088
|
}
|
|
2433
|
-
/**
|
|
2434
|
-
* @deprecated use getTracesPaginated instead
|
|
2435
|
-
*/
|
|
2436
|
-
async getTraces(args) {
|
|
2437
|
-
return this.stores.traces.getTraces(args);
|
|
2438
|
-
}
|
|
2439
|
-
async getTracesPaginated(args) {
|
|
2440
|
-
return this.stores.traces.getTracesPaginated(args);
|
|
2441
|
-
}
|
|
2442
|
-
/**
|
|
2443
|
-
* @deprecated use getEvals instead
|
|
2444
|
-
*/
|
|
2445
|
-
async getEvalsByAgentName(agentName, type) {
|
|
2446
|
-
return this.stores.legacyEvals.getEvalsByAgentName(agentName, type);
|
|
2447
|
-
}
|
|
2448
|
-
async getEvals(options) {
|
|
2449
|
-
return this.stores.legacyEvals.getEvals(options);
|
|
2450
|
-
}
|
|
2451
2089
|
async updateMessages(_args) {
|
|
2452
2090
|
return this.stores.memory.updateMessages(_args);
|
|
2453
2091
|
}
|
|
@@ -2470,38 +2108,38 @@ var D1Store = class extends MastraStorage {
|
|
|
2470
2108
|
async saveScore(_score) {
|
|
2471
2109
|
return this.stores.scores.saveScore(_score);
|
|
2472
2110
|
}
|
|
2473
|
-
async
|
|
2111
|
+
async listScoresByRunId({
|
|
2474
2112
|
runId: _runId,
|
|
2475
2113
|
pagination: _pagination
|
|
2476
2114
|
}) {
|
|
2477
|
-
return this.stores.scores.
|
|
2115
|
+
return this.stores.scores.listScoresByRunId({ runId: _runId, pagination: _pagination });
|
|
2478
2116
|
}
|
|
2479
|
-
async
|
|
2117
|
+
async listScoresByEntityId({
|
|
2480
2118
|
entityId: _entityId,
|
|
2481
2119
|
entityType: _entityType,
|
|
2482
2120
|
pagination: _pagination
|
|
2483
2121
|
}) {
|
|
2484
|
-
return this.stores.scores.
|
|
2122
|
+
return this.stores.scores.listScoresByEntityId({
|
|
2485
2123
|
entityId: _entityId,
|
|
2486
2124
|
entityType: _entityType,
|
|
2487
2125
|
pagination: _pagination
|
|
2488
2126
|
});
|
|
2489
2127
|
}
|
|
2490
|
-
async
|
|
2128
|
+
async listScoresByScorerId({
|
|
2491
2129
|
scorerId,
|
|
2492
2130
|
pagination,
|
|
2493
2131
|
entityId,
|
|
2494
2132
|
entityType,
|
|
2495
2133
|
source
|
|
2496
2134
|
}) {
|
|
2497
|
-
return this.stores.scores.
|
|
2135
|
+
return this.stores.scores.listScoresByScorerId({ scorerId, pagination, entityId, entityType, source });
|
|
2498
2136
|
}
|
|
2499
|
-
async
|
|
2137
|
+
async listScoresBySpan({
|
|
2500
2138
|
traceId,
|
|
2501
2139
|
spanId,
|
|
2502
2140
|
pagination
|
|
2503
2141
|
}) {
|
|
2504
|
-
return this.stores.scores.
|
|
2142
|
+
return this.stores.scores.listScoresBySpan({ traceId, spanId, pagination });
|
|
2505
2143
|
}
|
|
2506
2144
|
/**
|
|
2507
2145
|
* Close the database connection
|