@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 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
- if (!threadId.trim()) {
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 conditions = [`thread_id = '${this.escapeSql(threadId)}'`];
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 threadIds = [...new Set(include.map((item) => item.threadId || threadId))];
366
+ const threadIds2 = [...new Set(include.map((item) => item.threadId || threadId))];
365
367
  const allThreadMessages = [];
366
- for (const tid of threadIds) {
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
- const schema = await getTableSchema({ tableName: storage.TABLE_SCORERS, client: this.client });
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 schema = await getTableSchema({ tableName: storage.TABLE_SCORERS, client: this.client });
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 schema = await getTableSchema({ tableName: storage.TABLE_SCORERS, client: this.client });
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 schema = await getTableSchema({ tableName: storage.TABLE_SCORERS, client: this.client });
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 schema = await getTableSchema({ tableName: storage.TABLE_SCORERS, client: this.client });
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,