@mastra/lance 1.0.0-beta.2 → 1.0.0-beta.3
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 +25 -0
- package/dist/index.cjs +32 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +32 -17
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/dist/storage/domains/scores/index.d.ts +8 -0
- package/dist/storage/domains/scores/index.d.ts.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# @mastra/lance
|
|
2
2
|
|
|
3
|
+
## 1.0.0-beta.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- feat(storage): support querying messages from multiple threads ([#10663](https://github.com/mastra-ai/mastra/pull/10663))
|
|
8
|
+
- Fixed TypeScript errors where `threadId: string | string[]` was being passed to places expecting `Scalar` type
|
|
9
|
+
- Added proper multi-thread support for `listMessages` across all adapters when `threadId` is an array
|
|
10
|
+
- Updated `_getIncludedMessages` to look up message threadId by ID (since message IDs are globally unique)
|
|
11
|
+
- **upstash**: Added `msg-idx:{messageId}` index for O(1) message lookups (backwards compatible with fallback to scan for old messages, with automatic backfill)
|
|
12
|
+
|
|
13
|
+
- fix: ensure score responses match saved payloads for Mastra Stores. ([#10557](https://github.com/mastra-ai/mastra/pull/10557))
|
|
14
|
+
|
|
15
|
+
- Unify transformScoreRow functions across storage adapters ([#10648](https://github.com/mastra-ai/mastra/pull/10648))
|
|
16
|
+
|
|
17
|
+
Added a unified `transformScoreRow` function in `@mastra/core/storage` that provides schema-driven row transformation for score data. This eliminates code duplication across 10 storage adapters while maintaining store-specific behavior through configurable options:
|
|
18
|
+
- `preferredTimestampFields`: Preferred source fields for timestamps (PostgreSQL, Cloudflare D1)
|
|
19
|
+
- `convertTimestamps`: Convert timestamp strings to Date objects (MSSQL, MongoDB, ClickHouse)
|
|
20
|
+
- `nullValuePattern`: Skip values matching pattern (ClickHouse's `'_null_'`)
|
|
21
|
+
- `fieldMappings`: Map source column names to schema fields (LibSQL's `additionalLLMContext`)
|
|
22
|
+
|
|
23
|
+
Each store adapter now uses the unified function with appropriate options, reducing ~200 lines of duplicate transformation logic while ensuring consistent behavior across all storage backends.
|
|
24
|
+
|
|
25
|
+
- Updated dependencies [[`ac0d2f4`](https://github.com/mastra-ai/mastra/commit/ac0d2f4ff8831f72c1c66c2be809706d17f65789), [`1a0d3fc`](https://github.com/mastra-ai/mastra/commit/1a0d3fc811482c9c376cdf79ee615c23bae9b2d6), [`85a628b`](https://github.com/mastra-ai/mastra/commit/85a628b1224a8f64cd82ea7f033774bf22df7a7e), [`c237233`](https://github.com/mastra-ai/mastra/commit/c23723399ccedf7f5744b3f40997b79246bfbe64), [`15f9e21`](https://github.com/mastra-ai/mastra/commit/15f9e216177201ea6e3f6d0bfb063fcc0953444f), [`ff94dea`](https://github.com/mastra-ai/mastra/commit/ff94dea935f4e34545c63bcb6c29804732698809), [`5b2ff46`](https://github.com/mastra-ai/mastra/commit/5b2ff4651df70c146523a7fca773f8eb0a2272f8), [`db41688`](https://github.com/mastra-ai/mastra/commit/db4168806d007417e2e60b4f68656dca4e5f40c9), [`5ca599d`](https://github.com/mastra-ai/mastra/commit/5ca599d0bb59a1595f19f58473fcd67cc71cef58), [`bff1145`](https://github.com/mastra-ai/mastra/commit/bff114556b3cbadad9b2768488708f8ad0e91475), [`5c8ca24`](https://github.com/mastra-ai/mastra/commit/5c8ca247094e0cc2cdbd7137822fb47241f86e77), [`e191844`](https://github.com/mastra-ai/mastra/commit/e1918444ca3f80e82feef1dad506cd4ec6e2875f), [`22553f1`](https://github.com/mastra-ai/mastra/commit/22553f11c63ee5e966a9c034a349822249584691), [`7237163`](https://github.com/mastra-ai/mastra/commit/72371635dbf96a87df4b073cc48fc655afbdce3d), [`2500740`](https://github.com/mastra-ai/mastra/commit/2500740ea23da067d6e50ec71c625ab3ce275e64), [`873ecbb`](https://github.com/mastra-ai/mastra/commit/873ecbb517586aa17d2f1e99283755b3ebb2863f), [`4f9bbe5`](https://github.com/mastra-ai/mastra/commit/4f9bbe5968f42c86f4930b8193de3c3c17e5bd36), [`02e51fe`](https://github.com/mastra-ai/mastra/commit/02e51feddb3d4155cfbcc42624fd0d0970d032c0), [`8f3fa3a`](https://github.com/mastra-ai/mastra/commit/8f3fa3a652bb77da092f913ec51ae46e3a7e27dc), [`cd29ad2`](https://github.com/mastra-ai/mastra/commit/cd29ad23a255534e8191f249593849ed29160886), [`bdf4d8c`](https://github.com/mastra-ai/mastra/commit/bdf4d8cdc656d8a2c21d81834bfa3bfa70f56c16), [`854e3da`](https://github.com/mastra-ai/mastra/commit/854e3dad5daac17a91a20986399d3a51f54bf68b), [`ce18d38`](https://github.com/mastra-ai/mastra/commit/ce18d38678c65870350d123955014a8432075fd9), [`cccf9c8`](https://github.com/mastra-ai/mastra/commit/cccf9c8b2d2dfc1a5e63919395b83d78c89682a0), [`61a5705`](https://github.com/mastra-ai/mastra/commit/61a570551278b6743e64243b3ce7d73de915ca8a), [`db70a48`](https://github.com/mastra-ai/mastra/commit/db70a48aeeeeb8e5f92007e8ede52c364ce15287), [`f0fdc14`](https://github.com/mastra-ai/mastra/commit/f0fdc14ee233d619266b3d2bbdeea7d25cfc6d13), [`db18bc9`](https://github.com/mastra-ai/mastra/commit/db18bc9c3825e2c1a0ad9a183cc9935f6691bfa1), [`9b37b56`](https://github.com/mastra-ai/mastra/commit/9b37b565e1f2a76c24f728945cc740c2b09be9da), [`41a23c3`](https://github.com/mastra-ai/mastra/commit/41a23c32f9877d71810f37e24930515df2ff7a0f), [`5d171ad`](https://github.com/mastra-ai/mastra/commit/5d171ad9ef340387276b77c2bb3e83e83332d729), [`f03ae60`](https://github.com/mastra-ai/mastra/commit/f03ae60500fe350c9d828621006cdafe1975fdd8), [`d1e74a0`](https://github.com/mastra-ai/mastra/commit/d1e74a0a293866dece31022047f5dbab65a304d0), [`39e7869`](https://github.com/mastra-ai/mastra/commit/39e7869bc7d0ee391077ce291474d8a84eedccff), [`5761926`](https://github.com/mastra-ai/mastra/commit/57619260c4a2cdd598763abbacd90de594c6bc76), [`c900fdd`](https://github.com/mastra-ai/mastra/commit/c900fdd504c41348efdffb205cfe80d48c38fa33), [`604a79f`](https://github.com/mastra-ai/mastra/commit/604a79fecf276e26a54a3fe01bb94e65315d2e0e), [`887f0b4`](https://github.com/mastra-ai/mastra/commit/887f0b4746cdbd7cb7d6b17ac9f82aeb58037ea5), [`2562143`](https://github.com/mastra-ai/mastra/commit/256214336b4faa78646c9c1776612393790d8784), [`ef11a61`](https://github.com/mastra-ai/mastra/commit/ef11a61920fa0ed08a5b7ceedd192875af119749)]:
|
|
26
|
+
- @mastra/core@1.0.0-beta.6
|
|
27
|
+
|
|
3
28
|
## 1.0.0-beta.2
|
|
4
29
|
|
|
5
30
|
### Patch Changes
|
package/dist/index.cjs
CHANGED
|
@@ -294,15 +294,16 @@ var StoreMemoryLance = class extends storage.MemoryStorage {
|
|
|
294
294
|
}
|
|
295
295
|
async listMessages(args) {
|
|
296
296
|
const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;
|
|
297
|
-
|
|
297
|
+
const threadIds = Array.isArray(threadId) ? threadId : [threadId];
|
|
298
|
+
if (threadIds.length === 0 || threadIds.some((id) => !id.trim())) {
|
|
298
299
|
throw new error.MastraError(
|
|
299
300
|
{
|
|
300
301
|
id: "STORAGE_LANCE_LIST_MESSAGES_INVALID_THREAD_ID",
|
|
301
302
|
domain: error.ErrorDomain.STORAGE,
|
|
302
303
|
category: error.ErrorCategory.THIRD_PARTY,
|
|
303
|
-
details: { threadId }
|
|
304
|
+
details: { threadId: Array.isArray(threadId) ? threadId.join(",") : threadId }
|
|
304
305
|
},
|
|
305
|
-
new Error("threadId must be a non-empty string")
|
|
306
|
+
new Error("threadId must be a non-empty string or array of non-empty strings")
|
|
306
307
|
);
|
|
307
308
|
}
|
|
308
309
|
const perPage = storage.normalizePerPage(perPageInput, 40);
|
|
@@ -321,7 +322,8 @@ var StoreMemoryLance = class extends storage.MemoryStorage {
|
|
|
321
322
|
}
|
|
322
323
|
const { field, direction } = this.parseOrderBy(orderBy, "ASC");
|
|
323
324
|
const table = await this.client.openTable(storage.TABLE_MESSAGES);
|
|
324
|
-
const
|
|
325
|
+
const threadCondition = threadIds.length === 1 ? `thread_id = '${this.escapeSql(threadIds[0])}'` : `thread_id IN (${threadIds.map((t) => `'${this.escapeSql(t)}'`).join(", ")})`;
|
|
326
|
+
const conditions = [threadCondition];
|
|
325
327
|
if (resourceId) {
|
|
326
328
|
conditions.push(`\`resourceId\` = '${this.escapeSql(resourceId)}'`);
|
|
327
329
|
}
|
|
@@ -361,9 +363,9 @@ var StoreMemoryLance = class extends storage.MemoryStorage {
|
|
|
361
363
|
}
|
|
362
364
|
const messageIds = new Set(messages.map((m) => m.id));
|
|
363
365
|
if (include && include.length > 0) {
|
|
364
|
-
const
|
|
366
|
+
const threadIds2 = [...new Set(include.map((item) => item.threadId || threadId))];
|
|
365
367
|
const allThreadMessages = [];
|
|
366
|
-
for (const tid of
|
|
368
|
+
for (const tid of threadIds2) {
|
|
367
369
|
const threadQuery = table.query().where(`thread_id = '${tid}'`);
|
|
368
370
|
let threadRecords = await threadQuery.toArray();
|
|
369
371
|
allThreadMessages.push(...threadRecords);
|
|
@@ -409,7 +411,7 @@ var StoreMemoryLance = class extends storage.MemoryStorage {
|
|
|
409
411
|
domain: error.ErrorDomain.STORAGE,
|
|
410
412
|
category: error.ErrorCategory.THIRD_PARTY,
|
|
411
413
|
details: {
|
|
412
|
-
threadId,
|
|
414
|
+
threadId: Array.isArray(threadId) ? threadId.join(",") : threadId,
|
|
413
415
|
resourceId: resourceId ?? ""
|
|
414
416
|
}
|
|
415
417
|
},
|
|
@@ -1268,6 +1270,8 @@ var StoreScoresLance = class extends storage.ScoresStorage {
|
|
|
1268
1270
|
filteredScore[key] = JSON.stringify(filteredScore[key]);
|
|
1269
1271
|
}
|
|
1270
1272
|
}
|
|
1273
|
+
filteredScore.createdAt = /* @__PURE__ */ new Date();
|
|
1274
|
+
filteredScore.updatedAt = /* @__PURE__ */ new Date();
|
|
1271
1275
|
filteredScore.id = id;
|
|
1272
1276
|
await table.add([filteredScore], { mode: "append" });
|
|
1273
1277
|
return { score };
|
|
@@ -1290,8 +1294,7 @@ var StoreScoresLance = class extends storage.ScoresStorage {
|
|
|
1290
1294
|
const query = table.query().where(`id = '${id}'`).limit(1);
|
|
1291
1295
|
const records = await query.toArray();
|
|
1292
1296
|
if (records.length === 0) return null;
|
|
1293
|
-
|
|
1294
|
-
return processResultWithTypeConversion(records[0], schema);
|
|
1297
|
+
return await this.transformScoreRow(records[0]);
|
|
1295
1298
|
} catch (error$1) {
|
|
1296
1299
|
throw new error.MastraError(
|
|
1297
1300
|
{
|
|
@@ -1305,6 +1308,22 @@ var StoreScoresLance = class extends storage.ScoresStorage {
|
|
|
1305
1308
|
);
|
|
1306
1309
|
}
|
|
1307
1310
|
}
|
|
1311
|
+
/**
|
|
1312
|
+
* LanceDB-specific score row transformation.
|
|
1313
|
+
*
|
|
1314
|
+
* Note: This implementation does NOT use coreTransformScoreRow because:
|
|
1315
|
+
* 1. LanceDB stores schema information in the table itself (requires async fetch)
|
|
1316
|
+
* 2. Uses processResultWithTypeConversion utility for LanceDB-specific type handling
|
|
1317
|
+
*/
|
|
1318
|
+
async transformScoreRow(row) {
|
|
1319
|
+
const schema = await getTableSchema({ tableName: storage.TABLE_SCORERS, client: this.client });
|
|
1320
|
+
const transformed = processResultWithTypeConversion(row, schema);
|
|
1321
|
+
return {
|
|
1322
|
+
...transformed,
|
|
1323
|
+
createdAt: row.createdAt,
|
|
1324
|
+
updatedAt: row.updatedAt
|
|
1325
|
+
};
|
|
1326
|
+
}
|
|
1308
1327
|
async listScoresByScorerId({
|
|
1309
1328
|
scorerId,
|
|
1310
1329
|
pagination,
|
|
@@ -1345,8 +1364,7 @@ var StoreScoresLance = class extends storage.ScoresStorage {
|
|
|
1345
1364
|
if (start > 0) query = query.offset(start);
|
|
1346
1365
|
}
|
|
1347
1366
|
const records = await query.toArray();
|
|
1348
|
-
const
|
|
1349
|
-
const scores = processResultWithTypeConversion(records, schema);
|
|
1367
|
+
const scores = await Promise.all(records.map(async (record) => await this.transformScoreRow(record)));
|
|
1350
1368
|
return {
|
|
1351
1369
|
pagination: {
|
|
1352
1370
|
page,
|
|
@@ -1387,8 +1405,7 @@ var StoreScoresLance = class extends storage.ScoresStorage {
|
|
|
1387
1405
|
if (start > 0) query = query.offset(start);
|
|
1388
1406
|
}
|
|
1389
1407
|
const records = await query.toArray();
|
|
1390
|
-
const
|
|
1391
|
-
const scores = processResultWithTypeConversion(records, schema);
|
|
1408
|
+
const scores = await Promise.all(records.map(async (record) => await this.transformScoreRow(record)));
|
|
1392
1409
|
return {
|
|
1393
1410
|
pagination: {
|
|
1394
1411
|
page,
|
|
@@ -1430,8 +1447,7 @@ var StoreScoresLance = class extends storage.ScoresStorage {
|
|
|
1430
1447
|
if (start > 0) query = query.offset(start);
|
|
1431
1448
|
}
|
|
1432
1449
|
const records = await query.toArray();
|
|
1433
|
-
const
|
|
1434
|
-
const scores = processResultWithTypeConversion(records, schema);
|
|
1450
|
+
const scores = await Promise.all(records.map(async (record) => await this.transformScoreRow(record)));
|
|
1435
1451
|
return {
|
|
1436
1452
|
pagination: {
|
|
1437
1453
|
page,
|
|
@@ -1473,8 +1489,7 @@ var StoreScoresLance = class extends storage.ScoresStorage {
|
|
|
1473
1489
|
if (start > 0) query = query.offset(start);
|
|
1474
1490
|
}
|
|
1475
1491
|
const records = await query.toArray();
|
|
1476
|
-
const
|
|
1477
|
-
const scores = processResultWithTypeConversion(records, schema);
|
|
1492
|
+
const scores = await Promise.all(records.map(async (record) => await this.transformScoreRow(record)));
|
|
1478
1493
|
return {
|
|
1479
1494
|
pagination: {
|
|
1480
1495
|
page,
|