@mastra/spanner 1.3.1 → 1.4.0-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
@@ -1,6 +1,6 @@
1
1
  import { Spanner } from '@google-cloud/spanner';
2
2
  import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';
3
- import { AgentsStorage, TABLE_AGENTS, TABLE_AGENT_VERSIONS, AGENTS_SCHEMA, AGENT_VERSIONS_SCHEMA, createStorageErrorId, normalizePerPage, calculatePagination, TABLE_FAVORITES, BackgroundTasksStorage, TABLE_BACKGROUND_TASKS, TABLE_SCHEMAS, BlobStore, TABLE_SKILL_BLOBS, SKILL_BLOBS_SCHEMA, ChannelsStorage, TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG, DatasetsStorage, TABLE_DATASETS, TABLE_DATASET_ITEMS, TABLE_DATASET_VERSIONS, TABLE_EXPERIMENT_RESULTS, TABLE_EXPERIMENTS, hasErrorCode, ExperimentsStorage, FavoritesStorage, TABLE_SKILLS, MCPClientsStorage, TABLE_MCP_CLIENTS, TABLE_MCP_CLIENT_VERSIONS, MCP_CLIENTS_SCHEMA, MCP_CLIENT_VERSIONS_SCHEMA, MCPServersStorage, TABLE_MCP_SERVERS, TABLE_MCP_SERVER_VERSIONS, MCP_SERVERS_SCHEMA, MCP_SERVER_VERSIONS_SCHEMA, MemoryStorage, TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, ObservabilityStorage, TABLE_SPANS, listTracesArgsSchema, TraceStatus, toTraceSpans, PromptBlocksStorage, TABLE_PROMPT_BLOCKS, TABLE_PROMPT_BLOCK_VERSIONS, PROMPT_BLOCKS_SCHEMA, PROMPT_BLOCK_VERSIONS_SCHEMA, SchedulesStorage, TABLE_SCHEDULES, TABLE_SCHEDULE_TRIGGERS, ScorerDefinitionsStorage, TABLE_SCORER_DEFINITIONS, TABLE_SCORER_DEFINITION_VERSIONS, SCORER_DEFINITIONS_SCHEMA, SCORER_DEFINITION_VERSIONS_SCHEMA, ScoresStorage, TABLE_SCORERS, SkillsStorage, TABLE_SKILL_VERSIONS, SKILLS_SCHEMA, SKILL_VERSIONS_SCHEMA, WorkflowsStorage, TABLE_WORKFLOW_SNAPSHOT, WorkspacesStorage, TABLE_WORKSPACES, TABLE_WORKSPACE_VERSIONS, WORKSPACES_SCHEMA, WORKSPACE_VERSIONS_SCHEMA, MastraCompositeStore, getDefaultValue, TABLE_CONFIGS, listMetricsArgsSchema, normalizeScheduleTarget, transformScoreRow as transformScoreRow$1, METRIC_DISTINCT_COLUMNS } from '@mastra/core/storage';
3
+ import { AgentsStorage, TABLE_AGENTS, TABLE_AGENT_VERSIONS, AGENTS_SCHEMA, AGENT_VERSIONS_SCHEMA, createStorageErrorId, normalizePerPage, calculatePagination, TABLE_FAVORITES, BackgroundTasksStorage, TABLE_BACKGROUND_TASKS, TABLE_SCHEMAS, BlobStore, TABLE_SKILL_BLOBS, SKILL_BLOBS_SCHEMA, ChannelsStorage, TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG, DatasetsStorage, TABLE_DATASETS, TABLE_DATASET_ITEMS, TABLE_DATASET_VERSIONS, TABLE_EXPERIMENT_RESULTS, TABLE_EXPERIMENTS, hasErrorCode, ExperimentsStorage, FavoritesStorage, TABLE_SKILLS, MCPClientsStorage, TABLE_MCP_CLIENTS, TABLE_MCP_CLIENT_VERSIONS, MCP_CLIENTS_SCHEMA, MCP_CLIENT_VERSIONS_SCHEMA, MCPServersStorage, TABLE_MCP_SERVERS, TABLE_MCP_SERVER_VERSIONS, MCP_SERVERS_SCHEMA, MCP_SERVER_VERSIONS_SCHEMA, MemoryStorage, TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, validateStorageMetadataFilter, ObservabilityStorage, TABLE_SPANS, listTracesArgsSchema, TraceStatus, toTraceSpans, PromptBlocksStorage, TABLE_PROMPT_BLOCKS, TABLE_PROMPT_BLOCK_VERSIONS, PROMPT_BLOCKS_SCHEMA, PROMPT_BLOCK_VERSIONS_SCHEMA, SchedulesStorage, TABLE_SCHEDULES, TABLE_SCHEDULE_TRIGGERS, ScorerDefinitionsStorage, TABLE_SCORER_DEFINITIONS, TABLE_SCORER_DEFINITION_VERSIONS, SCORER_DEFINITIONS_SCHEMA, SCORER_DEFINITION_VERSIONS_SCHEMA, ScoresStorage, TABLE_SCORERS, SkillsStorage, TABLE_SKILL_VERSIONS, SKILLS_SCHEMA, SKILL_VERSIONS_SCHEMA, WorkflowsStorage, TABLE_WORKFLOW_SNAPSHOT, WorkspacesStorage, TABLE_WORKSPACES, TABLE_WORKSPACE_VERSIONS, WORKSPACES_SCHEMA, WORKSPACE_VERSIONS_SCHEMA, MastraCompositeStore, getDefaultValue, TABLE_CONFIGS, listMetricsArgsSchema, normalizeScheduleTarget, transformScoreRow as transformScoreRow$1, METRIC_DISTINCT_COLUMNS } from '@mastra/core/storage';
4
4
  import { MastraBase } from '@mastra/core/base';
5
5
  import { parseSqlIdentifier } from '@mastra/core/utils';
6
6
  import { randomUUID } from 'crypto';
@@ -6367,6 +6367,35 @@ var MCPServersSpanner = class _MCPServersSpanner extends MCPServersStorage {
6367
6367
  }
6368
6368
  }
6369
6369
  };
6370
+ function buildSpannerMessageMetadataFilter(metadataFilter) {
6371
+ if (!metadataFilter) return { clauses: [], params: {} };
6372
+ const clauses = [];
6373
+ const params = {};
6374
+ Object.entries(metadataFilter).forEach(([key, value], index) => {
6375
+ const path = `$.metadata.${key}`;
6376
+ const valueExpr = `JSON_VALUE(SAFE.PARSE_JSON(content), '${path}')`;
6377
+ const queryExpr = `JSON_QUERY(SAFE.PARSE_JSON(content), '${path}')`;
6378
+ const typeExpr = `JSON_TYPE(${queryExpr})`;
6379
+ if (value === null) {
6380
+ clauses.push(`${queryExpr} = 'null'`);
6381
+ return;
6382
+ }
6383
+ const paramName = `metadataValue${index}`;
6384
+ if (typeof value === "string") {
6385
+ params[paramName] = value;
6386
+ clauses.push(`${typeExpr} = 'string' AND ${valueExpr} = @${paramName}`);
6387
+ return;
6388
+ }
6389
+ if (typeof value === "number") {
6390
+ params[paramName] = String(value);
6391
+ clauses.push(`${typeExpr} = 'number' AND ${valueExpr} = @${paramName}`);
6392
+ return;
6393
+ }
6394
+ params[paramName] = value ? "true" : "false";
6395
+ clauses.push(`${typeExpr} = 'boolean' AND ${valueExpr} = @${paramName}`);
6396
+ });
6397
+ return { clauses, params };
6398
+ }
6370
6399
  var MemorySpanner = class _MemorySpanner extends MemoryStorage {
6371
6400
  database;
6372
6401
  db;
@@ -6845,6 +6874,7 @@ var MemorySpanner = class _MemorySpanner extends MemoryStorage {
6845
6874
  /** Paginated message listing for a thread, with optional pinned-include and date-range filters. */
6846
6875
  async listMessages(args) {
6847
6876
  const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;
6877
+ const metadataFilter = validateStorageMetadataFilter(filter?.metadata);
6848
6878
  const threadIds = Array.isArray(threadId) ? threadId : [threadId];
6849
6879
  if (threadIds.length === 0 || threadIds.some((id) => !id || !id.trim())) {
6850
6880
  throw new MastraError(
@@ -6870,10 +6900,16 @@ var MemorySpanner = class _MemorySpanner extends MemoryStorage {
6870
6900
  ...buildDateRangeFilter(filter?.dateRange, "createdAt")
6871
6901
  };
6872
6902
  const {
6873
- sql: whereSql,
6903
+ sql: preparedWhereSql,
6874
6904
  params: whereParams,
6875
6905
  types: whereTypes
6876
6906
  } = this.db.prepareWhereClause(filters, TABLE_MESSAGES);
6907
+ const metadataWhere = buildSpannerMessageMetadataFilter(metadataFilter);
6908
+ const whereSql = [preparedWhereSql, ...metadataWhere.clauses].reduce((sql, clause) => {
6909
+ if (!clause) return sql;
6910
+ return sql ? `${sql} AND ${clause}` : ` WHERE ${clause}`;
6911
+ }, "");
6912
+ Object.assign(whereParams, metadataWhere.params);
6877
6913
  if (perPage === 0 && (!include || include.length === 0)) {
6878
6914
  return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };
6879
6915
  }
@@ -6928,6 +6964,7 @@ var MemorySpanner = class _MemorySpanner extends MemoryStorage {
6928
6964
  const messages = baseRows.map(
6929
6965
  (r) => transformFromSpannerRow({ tableName: TABLE_MESSAGES, row: r })
6930
6966
  );
6967
+ const primaryPageCount = messages.length;
6931
6968
  if (total === 0 && messages.length === 0 && (!include || include.length === 0)) {
6932
6969
  return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };
6933
6970
  }
@@ -6958,7 +6995,7 @@ var MemorySpanner = class _MemorySpanner extends MemoryStorage {
6958
6995
  finalMessages.filter((m) => m.threadId && threadIdSet.has(m.threadId)).map((m) => m.id)
6959
6996
  );
6960
6997
  const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;
6961
- const hasMore = perPageInput !== false && !allThreadMessagesReturned && offset + perPage < total;
6998
+ const hasMore = metadataFilter ? perPageInput !== false && offset + primaryPageCount < total : perPageInput !== false && !allThreadMessagesReturned && offset + perPage < total;
6962
6999
  return {
6963
7000
  messages: finalMessages,
6964
7001
  total,