@mastra/clickhouse 1.12.0 → 1.13.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 { createClient } from '@clickhouse/client';
2
2
  import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';
3
- import { BRANCH_SPAN_TYPES, TABLE_THREAD_STATE, TABLE_HARNESS_SESSIONS, TABLE_NOTIFICATIONS, TABLE_SCHEDULE_TRIGGERS, TABLE_SCHEDULES, TABLE_TOOL_PROVIDER_CONNECTIONS, TABLE_FAVORITES, TABLE_SKILL_BLOBS, TABLE_SKILL_VERSIONS, TABLE_SKILLS, TABLE_WORKSPACE_VERSIONS, TABLE_WORKSPACES, TABLE_MCP_SERVER_VERSIONS, TABLE_MCP_SERVERS, TABLE_MCP_CLIENT_VERSIONS, TABLE_MCP_CLIENTS, TABLE_SCORER_DEFINITION_VERSIONS, TABLE_SCORER_DEFINITIONS, TABLE_PROMPT_BLOCK_VERSIONS, TABLE_PROMPT_BLOCKS, TABLE_EXPERIMENT_RESULTS, TABLE_EXPERIMENTS, TABLE_DATASET_VERSIONS, TABLE_DATASET_ITEMS, TABLE_DATASETS, TABLE_AGENT_VERSIONS, TABLE_SPANS, TABLE_RESOURCES, TABLE_SCORERS, TABLE_THREADS, TABLE_TRACES, TABLE_WORKFLOW_SNAPSHOT, TABLE_MESSAGES, BackgroundTasksStorage, TABLE_SCHEMAS, TABLE_BACKGROUND_TASKS, MemoryStorage, createStorageErrorId, normalizePerPage, calculatePagination, ObservabilityStorage, SPAN_SCHEMA, listTracesArgsSchema, toTraceSpans, ScoresStorage, transformScoreRow, SCORERS_SCHEMA, WorkflowsStorage, MastraCompositeStore, getSqlType, getDefaultValue, safelyParseJSON, listBranchesArgsSchema, listLogsArgsSchema, listMetricsArgsSchema, listScoresArgsSchema, listFeedbackArgsSchema, EntityType, TraceStatus, METRIC_DISTINCT_COLUMNS } from '@mastra/core/storage';
3
+ import { BRANCH_SPAN_TYPES, TABLE_THREAD_STATE, TABLE_HARNESS_SESSIONS, TABLE_NOTIFICATIONS, TABLE_SCHEDULE_TRIGGERS, TABLE_SCHEDULES, TABLE_TOOL_PROVIDER_CONNECTIONS, TABLE_FAVORITES, TABLE_SKILL_BLOBS, TABLE_SKILL_VERSIONS, TABLE_SKILLS, TABLE_WORKSPACE_VERSIONS, TABLE_WORKSPACES, TABLE_MCP_SERVER_VERSIONS, TABLE_MCP_SERVERS, TABLE_MCP_CLIENT_VERSIONS, TABLE_MCP_CLIENTS, TABLE_SCORER_DEFINITION_VERSIONS, TABLE_SCORER_DEFINITIONS, TABLE_PROMPT_BLOCK_VERSIONS, TABLE_PROMPT_BLOCKS, TABLE_EXPERIMENT_RESULTS, TABLE_EXPERIMENTS, TABLE_DATASET_VERSIONS, TABLE_DATASET_ITEMS, TABLE_DATASETS, TABLE_AGENT_VERSIONS, TABLE_SPANS, TABLE_RESOURCES, TABLE_SCORERS, TABLE_THREADS, TABLE_TRACES, TABLE_WORKFLOW_SNAPSHOT, TABLE_MESSAGES, BackgroundTasksStorage, TABLE_SCHEMAS, TABLE_BACKGROUND_TASKS, MemoryStorage, createStorageErrorId, validateStorageMetadataFilter, normalizePerPage, calculatePagination, ObservabilityStorage, SPAN_SCHEMA, listTracesArgsSchema, toTraceSpans, ScoresStorage, transformScoreRow, SCORERS_SCHEMA, WorkflowsStorage, MastraCompositeStore, getSqlType, getDefaultValue, safelyParseJSON, listBranchesArgsSchema, listLogsArgsSchema, listMetricsArgsSchema, listScoresArgsSchema, listFeedbackArgsSchema, EntityType, TraceStatus, METRIC_DISTINCT_COLUMNS } from '@mastra/core/storage';
4
4
  import { MastraBase } from '@mastra/core/base';
5
5
  import { MessageList } from '@mastra/core/agent';
6
6
  import { parseFieldKey } from '@mastra/core/utils';
@@ -1090,6 +1090,23 @@ function parseMetadata(metadata) {
1090
1090
  return {};
1091
1091
  }
1092
1092
  }
1093
+ function appendClickhouseMessageMetadataFilter(query, params, metadataFilter) {
1094
+ if (!metadataFilter) return query;
1095
+ let nextQuery = query;
1096
+ Object.entries(metadataFilter).forEach(([key, value], index) => {
1097
+ const keyParam = `metadataKey${index}`;
1098
+ params[keyParam] = key;
1099
+ nextQuery += ` AND isValidJSON(content) AND JSONHas(content, 'metadata') AND JSONHas(JSONExtractRaw(content, 'metadata'), {${keyParam}:String})`;
1100
+ if (value === null) {
1101
+ nextQuery += ` AND JSONExtractRaw(content, 'metadata', {${keyParam}:String}) = 'null'`;
1102
+ return;
1103
+ }
1104
+ const valueParam = `metadataValue${index}`;
1105
+ params[valueParam] = JSON.stringify(value);
1106
+ nextQuery += ` AND JSONExtractRaw(content, 'metadata', {${keyParam}:String}) = {${valueParam}:String}`;
1107
+ });
1108
+ return nextQuery;
1109
+ }
1093
1110
  var MemoryStorageClickhouse = class extends MemoryStorage {
1094
1111
  client;
1095
1112
  #db;
@@ -1201,6 +1218,7 @@ var MemoryStorageClickhouse = class extends MemoryStorage {
1201
1218
  }
1202
1219
  async listMessages(args) {
1203
1220
  const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;
1221
+ const metadataFilter = validateStorageMetadataFilter(filter?.metadata);
1204
1222
  const rawThreadIds = Array.isArray(threadId) ? threadId : [threadId];
1205
1223
  const threadIds = rawThreadIds.filter((id) => id !== void 0 && id !== null).map((id) => (typeof id === "string" ? id : String(id)).trim()).filter((id) => id.length > 0);
1206
1224
  if (page < 0) {
@@ -1261,6 +1279,7 @@ var MemoryStorageClickhouse = class extends MemoryStorage {
1261
1279
  dataQuery += ` AND createdAt ${endOp} parseDateTime64BestEffort({toDate:String}, 3)`;
1262
1280
  dataParams.toDate = endDate;
1263
1281
  }
1282
+ dataQuery = appendClickhouseMessageMetadataFilter(dataQuery, dataParams, metadataFilter);
1264
1283
  const { field, direction } = this.parseOrderBy(orderBy, "ASC");
1265
1284
  dataQuery += ` ORDER BY "${field}" ${direction}`;
1266
1285
  if (perPageForQuery === 0 && (!include || include.length === 0)) {
@@ -1316,6 +1335,7 @@ var MemoryStorageClickhouse = class extends MemoryStorage {
1316
1335
  countQuery += ` AND createdAt ${endOp} parseDateTime64BestEffort({toDate:String}, 3)`;
1317
1336
  countParams.toDate = endDate;
1318
1337
  }
1338
+ countQuery = appendClickhouseMessageMetadataFilter(countQuery, countParams, metadataFilter);
1319
1339
  const countResult = await this.client.query({
1320
1340
  query: countQuery,
1321
1341
  query_params: countParams,
@@ -1354,7 +1374,7 @@ var MemoryStorageClickhouse = class extends MemoryStorage {
1354
1374
  finalMessages.filter((m) => m.threadId && threadIdSet.has(m.threadId)).map((m) => m.id)
1355
1375
  );
1356
1376
  const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;
1357
- const hasMore = perPageForResponse === false ? false : allThreadMessagesReturned ? false : offset + paginatedCount < total;
1377
+ const hasMore = metadataFilter && perPageForResponse !== false ? offset + paginatedCount < total : perPageForResponse === false ? false : allThreadMessagesReturned ? false : offset + paginatedCount < total;
1358
1378
  return {
1359
1379
  messages: finalMessages,
1360
1380
  total,