@mastra/convex 1.0.5 → 1.0.6-alpha.0

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/dist/index.js CHANGED
@@ -318,6 +318,20 @@ var MemoryConvex = class extends MemoryStorage {
318
318
  const perPage = normalizePerPage(perPageInput, 40);
319
319
  const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
320
320
  const { field, direction } = this.parseOrderBy(orderBy, "ASC");
321
+ if (perPage === 0 && (!include || include.length === 0)) {
322
+ return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };
323
+ }
324
+ if (perPage === 0 && include && include.length > 0) {
325
+ const messages2 = await this._getIncludedMessages(include);
326
+ const list = new MessageList().add(messages2, "memory");
327
+ return {
328
+ messages: this._sortMessages(list.get.all.db(), field, direction),
329
+ total: 0,
330
+ page,
331
+ perPage: perPageForResponse,
332
+ hasMore: false
333
+ };
334
+ }
321
335
  let rows = [];
322
336
  for (const tid of threadIds) {
323
337
  const threadRows = await this.#db.queryTable(TABLE_MESSAGES, [{ field: "thread_id", value: tid }]);
@@ -337,62 +351,27 @@ var MemoryConvex = class extends MemoryStorage {
337
351
  });
338
352
  const totalThreadMessages = rows.length;
339
353
  const paginatedRows = perPageInput === false ? rows : rows.slice(offset, offset + perPage);
340
- const messages = paginatedRows.map((row) => this.parseStoredMessage(row));
354
+ let messages = paginatedRows.map((row) => this.parseStoredMessage(row));
341
355
  const messageIds = new Set(messages.map((msg) => msg.id));
342
356
  if (include && include.length > 0) {
343
- const threadMessagesCache = /* @__PURE__ */ new Map();
344
- for (const tid of threadIds) {
345
- const tidRows = rows.filter((r) => r.thread_id === tid);
346
- threadMessagesCache.set(tid, tidRows);
347
- }
348
- for (const includeItem of include) {
349
- let targetThreadId;
350
- let target;
351
- for (const [tid, cachedRows] of threadMessagesCache) {
352
- target = cachedRows.find((row) => row.id === includeItem.id);
353
- if (target) {
354
- targetThreadId = tid;
355
- break;
356
- }
357
- }
358
- if (!target) {
359
- const messageRows = await this.#db.queryTable(TABLE_MESSAGES, [
360
- { field: "id", value: includeItem.id }
361
- ]);
362
- if (messageRows.length > 0) {
363
- target = messageRows[0];
364
- targetThreadId = target.thread_id;
365
- if (targetThreadId && !threadMessagesCache.has(targetThreadId)) {
366
- const otherThreadRows = await this.#db.queryTable(TABLE_MESSAGES, [
367
- { field: "thread_id", value: targetThreadId }
368
- ]);
369
- threadMessagesCache.set(targetThreadId, otherThreadRows);
370
- }
371
- }
357
+ const preloadedThreads = /* @__PURE__ */ new Map();
358
+ if (!resourceId && !filter?.dateRange) {
359
+ for (const tid of threadIds) {
360
+ preloadedThreads.set(
361
+ tid,
362
+ rows.filter((r) => r.thread_id === tid)
363
+ );
372
364
  }
373
- if (!target || !targetThreadId) continue;
374
- if (!messageIds.has(target.id)) {
375
- messages.push(this.parseStoredMessage(target));
376
- messageIds.add(target.id);
365
+ }
366
+ const includedMessages = await this._getIncludedMessages(include, preloadedThreads);
367
+ for (const msg of includedMessages) {
368
+ if (!messageIds.has(msg.id)) {
369
+ messages.push(msg);
370
+ messageIds.add(msg.id);
377
371
  }
378
- const targetThreadRows = threadMessagesCache.get(targetThreadId) || [];
379
- await this.addContextMessages({
380
- includeItem,
381
- allMessages: targetThreadRows,
382
- targetThreadId,
383
- messageIds,
384
- messages
385
- });
386
372
  }
387
373
  }
388
- messages.sort((a, b) => {
389
- const aValue = field === "createdAt" || field === "updatedAt" ? new Date(a[field]).getTime() : a[field];
390
- const bValue = field === "createdAt" || field === "updatedAt" ? new Date(b[field]).getTime() : b[field];
391
- if (typeof aValue === "number" && typeof bValue === "number") {
392
- return direction === "ASC" ? aValue - bValue : bValue - aValue;
393
- }
394
- return direction === "ASC" ? String(aValue).localeCompare(String(bValue)) : String(bValue).localeCompare(String(aValue));
395
- });
374
+ messages = this._sortMessages(messages, field, direction);
396
375
  const hasMore = include && include.length > 0 ? new Set(messages.filter((m) => m.threadId === threadId).map((m) => m.id)).size < totalThreadMessages : perPageInput === false ? false : offset + perPage < totalThreadMessages;
397
376
  return {
398
377
  messages,
@@ -572,6 +551,69 @@ var MemoryConvex = class extends MemoryStorage {
572
551
  await this.saveResource({ resource: updated });
573
552
  return updated;
574
553
  }
554
+ _sortMessages(messages, field, direction) {
555
+ return messages.sort((a, b) => {
556
+ const aValue = field === "createdAt" || field === "updatedAt" ? new Date(a[field]).getTime() : a[field];
557
+ const bValue = field === "createdAt" || field === "updatedAt" ? new Date(b[field]).getTime() : b[field];
558
+ if (typeof aValue === "number" && typeof bValue === "number") {
559
+ return direction === "ASC" ? aValue - bValue : bValue - aValue;
560
+ }
561
+ return direction === "ASC" ? String(aValue).localeCompare(String(bValue)) : String(bValue).localeCompare(String(aValue));
562
+ });
563
+ }
564
+ async _getIncludedMessages(include, preloadedThreads) {
565
+ if (include.length === 0) return [];
566
+ const messages = [];
567
+ const messageIds = /* @__PURE__ */ new Set();
568
+ const threadMessagesCache = new Map(preloadedThreads ?? []);
569
+ const cachedTargets = /* @__PURE__ */ new Map();
570
+ for (const [threadId, rows] of threadMessagesCache) {
571
+ for (const row of rows) {
572
+ cachedTargets.set(row.id, { threadId, row });
573
+ }
574
+ }
575
+ for (const includeItem of include) {
576
+ let targetThreadId;
577
+ let target;
578
+ const cached = cachedTargets.get(includeItem.id);
579
+ if (cached) {
580
+ target = cached.row;
581
+ targetThreadId = cached.threadId;
582
+ }
583
+ if (!target) {
584
+ const messageRows = await this.#db.queryTable(TABLE_MESSAGES, [
585
+ { field: "id", value: includeItem.id }
586
+ ]);
587
+ if (messageRows.length > 0) {
588
+ target = messageRows[0];
589
+ targetThreadId = target.thread_id;
590
+ if (targetThreadId && !threadMessagesCache.has(targetThreadId)) {
591
+ const otherThreadRows = await this.#db.queryTable(TABLE_MESSAGES, [
592
+ { field: "thread_id", value: targetThreadId }
593
+ ]);
594
+ threadMessagesCache.set(targetThreadId, otherThreadRows);
595
+ for (const row of otherThreadRows) {
596
+ cachedTargets.set(row.id, { threadId: targetThreadId, row });
597
+ }
598
+ }
599
+ }
600
+ }
601
+ if (!target || !targetThreadId) continue;
602
+ if (!messageIds.has(target.id)) {
603
+ messages.push(this.parseStoredMessage(target));
604
+ messageIds.add(target.id);
605
+ }
606
+ const targetThreadRows = threadMessagesCache.get(targetThreadId) || [];
607
+ await this.addContextMessages({
608
+ includeItem,
609
+ allMessages: targetThreadRows,
610
+ targetThreadId,
611
+ messageIds,
612
+ messages
613
+ });
614
+ }
615
+ return messages;
616
+ }
575
617
  parseStoredMessage(message) {
576
618
  const content = safelyParseJSON(message.content);
577
619
  return {