@mastra/clickhouse 1.0.0-beta.9 → 1.0.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/CHANGELOG.md +944 -0
- package/README.md +1 -1
- package/dist/docs/README.md +1 -1
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/SOURCE_MAP.json +1 -1
- package/dist/docs/storage/01-reference.md +25 -25
- package/dist/index.cjs +384 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +385 -33
- package/dist/index.js.map +1 -1
- package/dist/storage/db/index.d.ts +50 -0
- package/dist/storage/db/index.d.ts.map +1 -1
- package/dist/storage/db/utils.d.ts.map +1 -1
- package/dist/storage/domains/memory/index.d.ts +2 -2
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/dist/storage/domains/observability/index.d.ts +23 -0
- package/dist/storage/domains/observability/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +42 -9
- package/dist/storage/index.d.ts.map +1 -1
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/db/utils.ts","../src/storage/db/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts"],"names":["TABLE_WORKFLOW_SNAPSHOT","TABLE_SPANS","TABLE_THREADS","TABLE_SCHEMAS","TABLE_MESSAGES","TABLE_RESOURCES","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","engine","finalClause","TABLE_SCORERS","coreTransformScoreRow","normalizePerPage","calculatePagination","createClient"],"mappings":"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","file":"index.js","sourcesContent":["import type { TABLE_NAMES, TABLE_SCHEMAS, StorageColumn } from '@mastra/core/storage';\nimport {\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_SCORERS,\n TABLE_THREADS,\n TABLE_TRACES,\n TABLE_WORKFLOW_SNAPSHOT,\n safelyParseJSON,\n TABLE_SPANS,\n} from '@mastra/core/storage';\n\nexport const TABLE_ENGINES: Record<TABLE_NAMES, string> = {\n [TABLE_MESSAGES]: `MergeTree()`,\n [TABLE_WORKFLOW_SNAPSHOT]: `ReplacingMergeTree()`,\n [TABLE_TRACES]: `MergeTree()`,\n [TABLE_THREADS]: `ReplacingMergeTree()`,\n [TABLE_SCORERS]: `MergeTree()`,\n [TABLE_RESOURCES]: `ReplacingMergeTree()`,\n // TODO: verify this is the correct engine for Spans when implementing clickhouse storage\n [TABLE_SPANS]: `ReplacingMergeTree()`,\n mastra_agents: `ReplacingMergeTree()`,\n};\n\nexport const COLUMN_TYPES: Record<StorageColumn['type'], string> = {\n text: 'String',\n timestamp: 'DateTime64(3)',\n uuid: 'String',\n jsonb: 'String',\n integer: 'Int64',\n float: 'Float64',\n bigint: 'Int64',\n boolean: 'Bool',\n};\n\nexport type IntervalUnit =\n | 'NANOSECOND'\n | 'MICROSECOND'\n | 'MILLISECOND'\n | 'SECOND'\n | 'MINUTE'\n | 'HOUR'\n | 'DAY'\n | 'WEEK'\n | 'MONTH'\n | 'QUARTER'\n | 'YEAR';\n\nexport type ClickhouseConfig = {\n url: string;\n username: string;\n password: string;\n ttl?: {\n [TableKey in TABLE_NAMES]?: {\n row?: { interval: number; unit: IntervalUnit; ttlKey?: string };\n columns?: Partial<{\n [ColumnKey in keyof (typeof TABLE_SCHEMAS)[TableKey]]: {\n interval: number;\n unit: IntervalUnit;\n ttlKey?: string;\n };\n }>;\n };\n };\n};\n\n// List of fields that should be parsed as JSON\nconst JSON_FIELDS = ['content', 'attributes', 'metadata', 'input', 'output', 'error', 'scope', 'links'];\n\n// Fields that should be null instead of empty string when empty\nconst NULLABLE_STRING_FIELDS = ['parentSpanId', 'error'];\n\nexport function transformRow<R>(row: any): R {\n if (!row) {\n return row;\n }\n\n if (row.createdAt) {\n row.createdAt = new Date(row.createdAt);\n }\n if (row.updatedAt) {\n row.updatedAt = new Date(row.updatedAt);\n }\n if (row.startedAt) {\n row.startedAt = new Date(row.startedAt);\n }\n if (row.endedAt) {\n row.endedAt = new Date(row.endedAt);\n }\n\n // Parse JSONB fields if they're JSON strings\n for (const field of JSON_FIELDS) {\n if (row[field] && typeof row[field] === 'string') {\n row[field] = safelyParseJSON(row[field]);\n }\n }\n\n // Convert empty strings to null for nullable fields\n for (const field of NULLABLE_STRING_FIELDS) {\n if (row[field] === '') {\n row[field] = null;\n }\n }\n\n return row;\n}\n\nexport function transformRows<R>(rows: any[]): R[] {\n return rows.map((row: any) => transformRow<R>(row));\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { createClient } from '@clickhouse/client';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n getSqlType,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SPANS,\n TABLE_SCHEMAS,\n getDefaultValue,\n} from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport type { ClickhouseConfig } from './utils';\nimport { TABLE_ENGINES, transformRow } from './utils';\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. An existing ClickHouse client with optional ttl config\n * 2. Config to create a new client internally\n */\nexport type ClickhouseDomainConfig = ClickhouseDomainClientConfig | ClickhouseDomainRestConfig;\n\n/**\n * Pass an existing ClickHouse client\n */\nexport interface ClickhouseDomainClientConfig {\n client: ClickHouseClient;\n ttl?: ClickhouseConfig['ttl'];\n}\n\n/**\n * Pass config to create a new ClickHouse client internally\n */\nexport interface ClickhouseDomainRestConfig {\n url: string;\n username: string;\n password: string;\n ttl?: ClickhouseConfig['ttl'];\n}\n\n/**\n * Resolves ClickhouseDomainConfig to a ClickHouse client and ttl config.\n * Handles creating a new client if config is provided.\n */\nexport function resolveClickhouseConfig(config: ClickhouseDomainConfig): {\n client: ClickHouseClient;\n ttl?: ClickhouseConfig['ttl'];\n} {\n // Existing client\n if ('client' in config) {\n return { client: config.client, ttl: config.ttl };\n }\n\n // Config to create new client\n const client = createClient({\n url: config.url,\n username: config.username,\n password: config.password,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return { client, ttl: config.ttl };\n}\n\nexport class ClickhouseDB extends MastraBase {\n protected ttl: ClickhouseConfig['ttl'];\n protected client: ClickHouseClient;\n constructor({ client, ttl }: { client: ClickHouseClient; ttl: ClickhouseConfig['ttl'] }) {\n super({\n name: 'CLICKHOUSE_DB',\n });\n this.ttl = ttl;\n this.client = client;\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n const result = await this.client.query({\n query: `DESCRIBE TABLE ${table}`,\n format: 'JSONEachRow',\n });\n const columns = (await result.json()) as { name: string }[];\n return columns.some(c => c.name === column);\n }\n\n protected getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n case 'uuid':\n case 'jsonb':\n return 'String';\n case 'timestamp':\n return 'DateTime64(3)';\n case 'integer':\n case 'bigint':\n return 'Int64';\n case 'float':\n return 'Float64';\n case 'boolean':\n return 'Bool';\n default:\n return getSqlType(type); // fallback to base implementation\n }\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n try {\n const columns = Object.entries(schema)\n .map(([name, def]) => {\n let sqlType = this.getSqlType(def.type);\n // Only treat as nullable if explicitly set to true (default is NOT nullable)\n const isNullable = def.nullable === true;\n // Wrap nullable columns in Nullable() to properly support NULL values\n if (isNullable) {\n sqlType = `Nullable(${sqlType})`;\n }\n const constraints = [];\n // Add DEFAULT '{}' for metadata columns to prevent empty string issues\n if (name === 'metadata' && def.type === 'text' && isNullable) {\n constraints.push(\"DEFAULT '{}'\");\n }\n const columnTtl = this.ttl?.[tableName]?.columns?.[name];\n return `\"${name}\" ${sqlType} ${constraints.join(' ')} ${columnTtl ? `TTL toDateTime(${columnTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${columnTtl.interval} ${columnTtl.unit}` : ''}`;\n })\n .join(',\\n');\n\n const rowTtl = this.ttl?.[tableName]?.row;\n let sql: string;\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${['id String'].concat(columns)}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (createdAt, run_id, workflow_name)\n ORDER BY (createdAt, run_id, workflow_name)\n ${rowTtl ? `TTL toDateTime(${rowTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${rowTtl.interval} ${rowTtl.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n } else if (tableName === TABLE_SPANS) {\n // Spans table uses traceId and spanId as composite key\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (createdAt, traceId, spanId)\n ORDER BY (createdAt, traceId, spanId)\n ${rowTtl ? `TTL toDateTime(${rowTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${rowTtl.interval} ${rowTtl.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n } else {\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (createdAt, ${'id'})\n ORDER BY (createdAt, ${'id'})\n ${this.ttl?.[tableName]?.row ? `TTL toDateTime(createdAt) + INTERVAL ${this.ttl[tableName].row.interval} ${this.ttl[tableName].row.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n }\n\n await this.client.query({\n query: sql,\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n try {\n // 1. Get existing columns\n const describeSql = `DESCRIBE TABLE ${tableName}`;\n const result = await this.client.query({\n query: describeSql,\n });\n const rows = await result.json();\n const existingColumnNames = new Set(rows.data.map((row: any) => row.name.toLowerCase()));\n\n // 2. Add missing columns\n for (const columnName of ifNotExists) {\n if (!existingColumnNames.has(columnName.toLowerCase()) && schema[columnName]) {\n const columnDef = schema[columnName];\n let sqlType = this.getSqlType(columnDef.type);\n if (columnDef.nullable !== false) {\n sqlType = `Nullable(${sqlType})`;\n }\n const defaultValue = columnDef.nullable === false ? getDefaultValue(columnDef.type) : '';\n // Use backticks or double quotes as needed for identifiers\n const alterSql =\n `ALTER TABLE ${tableName} ADD COLUMN IF NOT EXISTS \"${columnName}\" ${sqlType} ${defaultValue}`.trim();\n\n await this.client.query({\n query: alterSql,\n });\n this.logger?.debug?.(`Added column ${columnName} to table ${tableName}`);\n }\n }\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'ALTER_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.client.query({\n query: `TRUNCATE TABLE ${tableName}`,\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CLEAR_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n await this.client.query({\n query: `DROP TABLE IF EXISTS ${tableName}`,\n });\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n const rawCreatedAt = record.createdAt || record.created_at || new Date();\n const rawUpdatedAt = record.updatedAt || new Date();\n const createdAt = rawCreatedAt instanceof Date ? rawCreatedAt.toISOString() : rawCreatedAt;\n const updatedAt = rawUpdatedAt instanceof Date ? rawUpdatedAt.toISOString() : rawUpdatedAt;\n\n try {\n await this.client.insert({\n table: tableName,\n values: [\n {\n ...record,\n createdAt,\n updatedAt,\n },\n ],\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n output_format_json_quote_64bit_integers: 0,\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n const recordsToBeInserted = records.map(record => ({\n ...Object.fromEntries(\n Object.entries(record).map(([key, value]) => [\n key,\n TABLE_SCHEMAS[tableName as TABLE_NAMES]?.[key]?.type === 'timestamp' ? new Date(value).toISOString() : value,\n ]),\n ),\n }));\n\n try {\n await this.client.insert({\n table: tableName,\n values: recordsToBeInserted,\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n try {\n const engine = TABLE_ENGINES[tableName] ?? 'MergeTree()';\n const keyEntries = Object.entries(keys);\n const conditions = keyEntries\n .map(\n ([key]) =>\n `\"${key}\" = {var_${key}:${this.getSqlType(TABLE_SCHEMAS[tableName as TABLE_NAMES]?.[key]?.type ?? 'text')}}`,\n )\n .join(' AND ');\n const values = keyEntries.reduce((acc, [key, value]) => {\n return { ...acc, [`var_${key}`]: value };\n }, {});\n\n const hasUpdatedAt = TABLE_SCHEMAS[tableName as TABLE_NAMES]?.updatedAt;\n\n const selectClause = `SELECT *, toDateTime64(createdAt, 3) as createdAt${hasUpdatedAt ? ', toDateTime64(updatedAt, 3) as updatedAt' : ''}`;\n\n const result = await this.client.query({\n query: `${selectClause} FROM ${tableName} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''} WHERE ${conditions} ORDER BY createdAt DESC LIMIT 1`,\n query_params: values,\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n if (!result) {\n return null;\n }\n\n const rows = await result.json();\n // If this is a workflow snapshot, parse the snapshot field\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const snapshot = rows.data[0] as any;\n if (!snapshot) {\n return null;\n }\n if (typeof snapshot.snapshot === 'string') {\n snapshot.snapshot = JSON.parse(snapshot.snapshot);\n }\n return transformRow(snapshot);\n }\n\n const data: R = transformRow(rows.data[0]);\n return data;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LOAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsByResourceIdInput,\n StorageListThreadsByResourceIdOutput,\n} from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { transformRow, transformRows } from '../../db/utils';\n\n/**\n * Serialize metadata object to JSON string for storage in ClickHouse.\n * Ensures we always store valid JSON, defaulting to '{}' for null/undefined.\n */\nfunction serializeMetadata(metadata: Record<string, unknown> | undefined): string {\n if (!metadata || Object.keys(metadata).length === 0) {\n return '{}';\n }\n return JSON.stringify(metadata);\n}\n\n/**\n * Parse metadata JSON string from ClickHouse back to object.\n * Handles empty strings and malformed JSON gracefully.\n */\nfunction parseMetadata(metadata: unknown): Record<string, unknown> {\n if (!metadata) return {};\n if (typeof metadata === 'object') return metadata as Record<string, unknown>;\n if (typeof metadata !== 'string') return {};\n\n const trimmed = metadata.trim();\n if (trimmed === '' || trimmed === 'null') return {};\n\n try {\n return JSON.parse(trimmed);\n } catch {\n return {};\n }\n}\n\nexport class MemoryStorageClickhouse extends MemoryStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.#db.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.#db.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_MESSAGES });\n await this.#db.clearTable({ tableName: TABLE_RESOURCES });\n await this.#db.clearTable({ tableName: TABLE_THREADS });\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) return;\n\n try {\n // Get affected thread IDs before deleting\n const result = await this.client.query({\n query: `SELECT DISTINCT thread_id FROM ${TABLE_MESSAGES} WHERE id IN {messageIds:Array(String)}`,\n query_params: { messageIds },\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ thread_id: string }>;\n const threadIds = rows.map(r => r.thread_id);\n\n // Delete messages\n await this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id IN {messageIds:Array(String)}`,\n query_params: { messageIds },\n });\n\n // Update thread timestamps\n if (threadIds.length > 0) {\n // Remove 'Z' suffix as ClickHouse DateTime64 expects format without timezone suffix\n const now = new Date().toISOString().replace('Z', '');\n await this.client.command({\n query: `ALTER TABLE ${TABLE_THREADS} UPDATE updatedAt = {now:DateTime64(3)} WHERE id IN {threadIds:Array(String)}`,\n query_params: { now, threadIds },\n });\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: messageIds.length },\n },\n error,\n );\n }\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n\n try {\n const result = await this.client.query({\n query: `\n SELECT \n id, \n content, \n role, \n type,\n toDateTime64(createdAt, 3) as createdAt,\n thread_id AS \"threadId\",\n \"resourceId\"\n FROM \"${TABLE_MESSAGES}\"\n WHERE id IN {messageIds:Array(String)}\n ORDER BY \"createdAt\" DESC\n `,\n query_params: {\n messageIds,\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const messages: any[] = transformRows(rows.data);\n\n // Parse message content\n messages.forEach(message => {\n if (typeof message.content === 'string') {\n try {\n message.content = JSON.parse(message.content);\n } catch {\n // If parsing fails, leave as string\n }\n }\n });\n\n const list = new MessageList().add(messages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n }\n }\n\n public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n // Normalize threadId to array, coerce to strings, trim, and filter out empty/non-string values\n const rawThreadIds = Array.isArray(threadId) ? threadId : [threadId];\n const threadIds = rawThreadIds\n .filter(id => id !== undefined && id !== null)\n .map(id => (typeof id === 'string' ? id : String(id)).trim())\n .filter(id => id.length > 0);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n // Validate that we have at least one valid threadId\n if (threadIds.length === 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: Array.isArray(threadId) ? JSON.stringify(threadId) : String(threadId) },\n },\n new Error('threadId must be a non-empty string or array of non-empty strings'),\n );\n }\n\n const perPageForQuery = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPageForQuery);\n\n try {\n // Step 1: Get paginated messages from the thread(s) first (without excluding included ones)\n // Build thread condition for single or multiple threads\n const threadCondition =\n threadIds.length === 1\n ? `thread_id = {threadId0:String}`\n : `thread_id IN (${threadIds.map((_, i) => `{threadId${i}:String}`).join(', ')})`;\n\n let dataQuery = `\n SELECT \n id,\n content,\n role,\n type,\n toDateTime64(createdAt, 3) as createdAt,\n thread_id AS \"threadId\",\n resourceId\n FROM ${TABLE_MESSAGES}\n WHERE ${threadCondition}\n `;\n const dataParams: any = {};\n threadIds.forEach((tid, i) => {\n dataParams[`threadId${i}`] = tid;\n });\n\n if (resourceId) {\n dataQuery += ` AND resourceId = {resourceId:String}`;\n dataParams.resourceId = resourceId;\n }\n\n if (filter?.dateRange?.start) {\n const startDate =\n filter.dateRange.start instanceof Date\n ? filter.dateRange.start.toISOString()\n : new Date(filter.dateRange.start).toISOString();\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n dataQuery += ` AND createdAt ${startOp} parseDateTime64BestEffort({fromDate:String}, 3)`;\n dataParams.fromDate = startDate;\n }\n\n if (filter?.dateRange?.end) {\n const endDate =\n filter.dateRange.end instanceof Date\n ? filter.dateRange.end.toISOString()\n : new Date(filter.dateRange.end).toISOString();\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n dataQuery += ` AND createdAt ${endOp} parseDateTime64BestEffort({toDate:String}, 3)`;\n dataParams.toDate = endDate;\n }\n\n // Build ORDER BY clause\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n dataQuery += ` ORDER BY \"${field}\" ${direction}`;\n\n // Apply pagination\n if (perPageForResponse === false) {\n // Get all messages\n } else {\n dataQuery += ` LIMIT {limit:Int64} OFFSET {offset:Int64}`;\n dataParams.limit = perPageForQuery;\n dataParams.offset = offset;\n }\n\n const result = await this.client.query({\n query: dataQuery,\n query_params: dataParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const paginatedMessages = transformRows<MastraDBMessage>(rows.data);\n const paginatedCount = paginatedMessages.length;\n\n // Get total count\n let countQuery = `SELECT count() as total FROM ${TABLE_MESSAGES} WHERE ${threadCondition}`;\n const countParams: any = {};\n threadIds.forEach((tid, i) => {\n countParams[`threadId${i}`] = tid;\n });\n\n if (resourceId) {\n countQuery += ` AND resourceId = {resourceId:String}`;\n countParams.resourceId = resourceId;\n }\n\n if (filter?.dateRange?.start) {\n const startDate =\n filter.dateRange.start instanceof Date\n ? filter.dateRange.start.toISOString()\n : new Date(filter.dateRange.start).toISOString();\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n countQuery += ` AND createdAt ${startOp} parseDateTime64BestEffort({fromDate:String}, 3)`;\n countParams.fromDate = startDate;\n }\n\n if (filter?.dateRange?.end) {\n const endDate =\n filter.dateRange.end instanceof Date\n ? filter.dateRange.end.toISOString()\n : new Date(filter.dateRange.end).toISOString();\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n countQuery += ` AND createdAt ${endOp} parseDateTime64BestEffort({toDate:String}, 3)`;\n countParams.toDate = endDate;\n }\n\n const countResult = await this.client.query({\n query: countQuery,\n query_params: countParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const countData = await countResult.json();\n const total = (countData as any).data[0].total;\n\n // Only return early if there are no messages AND no includes to process\n if (total === 0 && paginatedCount === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Step 2: Add included messages with context (if any), excluding duplicates\n const messageIds = new Set(paginatedMessages.map((m: MastraDBMessage) => m.id));\n let includeMessages: MastraDBMessage[] = [];\n\n if (include && include.length > 0) {\n // Batch lookup threadIds for includes that don't have one (avoids N+1 queries)\n const includesNeedingThread = include.filter(inc => !inc.threadId);\n const threadByMessageId = new Map<string, string>();\n\n if (includesNeedingThread.length > 0) {\n const { messages: includeLookup } = await this.listMessagesById({\n messageIds: includesNeedingThread.map(inc => inc.id),\n });\n for (const msg of includeLookup) {\n if (msg.threadId) {\n threadByMessageId.set(msg.id, msg.threadId);\n }\n }\n }\n\n const unionQueries: string[] = [];\n const params: any[] = [];\n let paramIdx = 1;\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n\n // Get the threadId for this included message\n // If inc.threadId is provided, use it; otherwise use the batched lookup\n const searchThreadId = inc.threadId ?? threadByMessageId.get(id);\n\n if (!searchThreadId) continue; // Skip if message not found\n\n unionQueries.push(`\n SELECT * FROM (\n WITH numbered_messages AS (\n SELECT\n id, content, role, type, \"createdAt\", thread_id, \"resourceId\",\n ROW_NUMBER() OVER (ORDER BY \"createdAt\" ASC) as row_num\n FROM \"${TABLE_MESSAGES}\"\n WHERE thread_id = {var_thread_id_${paramIdx}:String}\n ),\n target_positions AS (\n SELECT row_num as target_pos\n FROM numbered_messages\n WHERE id = {var_include_id_${paramIdx}:String}\n )\n SELECT DISTINCT m.id, m.content, m.role, m.type, m.\"createdAt\", m.thread_id AS \"threadId\", m.\"resourceId\"\n FROM numbered_messages m\n CROSS JOIN target_positions t\n WHERE m.row_num BETWEEN (t.target_pos - {var_withPreviousMessages_${paramIdx}:Int64}) AND (t.target_pos + {var_withNextMessages_${paramIdx}:Int64})\n ) AS query_${paramIdx}\n `);\n\n params.push(\n { [`var_thread_id_${paramIdx}`]: searchThreadId },\n { [`var_include_id_${paramIdx}`]: id },\n { [`var_withPreviousMessages_${paramIdx}`]: withPreviousMessages },\n { [`var_withNextMessages_${paramIdx}`]: withNextMessages },\n );\n paramIdx++;\n }\n\n // Only run the query if we have any valid includes\n if (unionQueries.length > 0) {\n const finalQuery = unionQueries.join(' UNION ALL ') + ' ORDER BY \"createdAt\" ASC';\n const mergedParams = params.reduce((acc, paramObj) => ({ ...acc, ...paramObj }), {});\n\n const includeResult = await this.client.query({\n query: finalQuery,\n query_params: mergedParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const includeRows = await includeResult.json();\n includeMessages = transformRows<MastraDBMessage>(includeRows.data);\n\n // Deduplicate: only add messages that aren't already in the paginated results\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n paginatedMessages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n }\n\n // Use MessageList for proper deduplication and format conversion to V2\n const list = new MessageList().add(paginatedMessages, 'memory');\n let finalMessages = list.get.all.db();\n\n // Sort all messages (paginated + included) for final output\n finalMessages = finalMessages.sort((a, b) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date((a as any)[field]).getTime() : (a as any)[field];\n const bValue = isDateField ? new Date((b as any)[field]).getTime() : (b as any)[field];\n\n // Handle tiebreaker for stable sorting\n if (aValue === bValue) {\n return a.id.localeCompare(b.id);\n }\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n // Fallback to string comparison for non-numeric fields\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n // Calculate hasMore based on pagination window\n // If all thread messages have been returned (through pagination or include), hasMore = false\n // Otherwise, check if there are more pages in the pagination window\n const threadIdSet = new Set(threadIds);\n const returnedThreadMessageIds = new Set(\n finalMessages.filter(m => m.threadId && threadIdSet.has(m.threadId)).map(m => m.id),\n );\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore =\n perPageForResponse === false ? false : allThreadMessagesReturned ? false : offset + paginatedCount < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n const { messages } = args;\n if (messages.length === 0) return { messages };\n\n for (const message of messages) {\n const resourceId = message.resourceId;\n if (!resourceId) {\n throw new Error('Resource ID is required');\n }\n\n if (!message.threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Check if thread exists\n const thread = await this.getThreadById({ threadId: message.threadId });\n if (!thread) {\n throw new Error(`Thread ${message.threadId} not found`);\n }\n }\n\n const threadIdSet = new Map();\n\n await Promise.all(\n messages.map(async m => {\n const resourceId = m.resourceId;\n if (!resourceId) {\n throw new Error('Resource ID is required');\n }\n\n if (!m.threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Check if thread exists\n const thread = await this.getThreadById({ threadId: m.threadId });\n if (!thread) {\n throw new Error(`Thread ${m.threadId} not found`);\n }\n\n threadIdSet.set(m.threadId, thread);\n }),\n );\n\n try {\n // Clickhouse's MergeTree engine does not support native upserts or unique constraints on (id, thread_id).\n // Note: We cannot switch to ReplacingMergeTree without a schema migration,\n // as it would require altering the table engine.\n // To ensure correct upsert behavior, we first fetch existing (id, thread_id) pairs for the incoming messages.\n const existingResult = await this.client.query({\n query: `SELECT id, thread_id FROM ${TABLE_MESSAGES} WHERE id IN ({ids:Array(String)})`,\n query_params: {\n ids: messages.map(m => m.id),\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n format: 'JSONEachRow',\n });\n const existingRows: Array<{ id: string; thread_id: string }> = await existingResult.json();\n\n const existingSet = new Set(existingRows.map(row => `${row.id}::${row.thread_id}`));\n\n // Partition the batch into different operations:\n // 1. New messages (insert)\n // 2. Existing messages with same (id, threadId) (update)\n // 3. Messages with same id but different threadId (delete old + insert new)\n const toInsert = messages.filter(m => !existingSet.has(`${m.id}::${m.threadId}`));\n const toUpdate = messages.filter(m => existingSet.has(`${m.id}::${m.threadId}`));\n\n // Find messages that need to be moved (same id, different threadId)\n const toMove = messages.filter(m => {\n const existingRow = existingRows.find(row => row.id === m.id);\n return existingRow && existingRow.thread_id !== m.threadId;\n });\n\n // Delete old messages that are being moved\n const deletePromises = toMove.map(message => {\n const existingRow = existingRows.find(row => row.id === message.id);\n if (!existingRow) return Promise.resolve();\n\n return this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id = {var_id:String} AND thread_id = {var_old_thread_id:String}`,\n query_params: {\n var_id: message.id,\n var_old_thread_id: existingRow.thread_id,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n });\n\n const updatePromises = toUpdate.map(message =>\n this.client.command({\n query: `\n ALTER TABLE ${TABLE_MESSAGES}\n UPDATE content = {var_content:String}, role = {var_role:String}, type = {var_type:String}, resourceId = {var_resourceId:String}\n WHERE id = {var_id:String} AND thread_id = {var_thread_id:String}\n `,\n query_params: {\n var_content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n var_role: message.role,\n var_type: message.type || 'v2',\n var_resourceId: message.resourceId,\n var_id: message.id,\n var_thread_id: message.threadId,\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n );\n\n // Execute message operations and thread update in parallel for better performance\n await Promise.all([\n // Insert new messages (including moved messages)\n this.client.insert({\n table: TABLE_MESSAGES,\n format: 'JSONEachRow',\n values: toInsert.map(message => ({\n id: message.id,\n thread_id: message.threadId,\n resourceId: message.resourceId,\n content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n createdAt: message.createdAt.toISOString(),\n role: message.role,\n type: message.type || 'v2',\n })),\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n ...updatePromises,\n ...deletePromises,\n // Update thread's updatedAt timestamp\n this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: Array.from(threadIdSet.values()).map(thread => ({\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: serializeMetadata(thread.metadata),\n createdAt: thread.createdAt,\n updatedAt: new Date().toISOString(),\n })),\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n ]);\n\n const list = new MessageList().add(messages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n\n return { messages: list.get.all.db() };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const result = await this.client.query({\n query: `SELECT \n id,\n \"resourceId\",\n title,\n metadata,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt\n FROM \"${TABLE_THREADS}\"\n WHERE id = {var_id:String}\n ORDER BY updatedAt DESC\n LIMIT 1`,\n query_params: { var_id: threadId },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const thread = transformRow(rows.data[0]) as StorageThreadType;\n\n if (!thread) {\n return null;\n }\n\n return {\n ...thread,\n metadata: parseMetadata(thread.metadata),\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_THREAD_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n // ClickHouse's ReplacingMergeTree may create duplicate rows until background merges run\n // We handle this by always querying for the newest row (ORDER BY updatedAt DESC LIMIT 1)\n await this.client.insert({\n table: TABLE_THREADS,\n values: [\n {\n ...thread,\n metadata: serializeMetadata(thread.metadata),\n createdAt: thread.createdAt.toISOString(),\n updatedAt: thread.updatedAt.toISOString(),\n },\n ],\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n try {\n // First get the existing thread to merge metadata\n const existingThread = await this.getThreadById({ threadId: id });\n if (!existingThread) {\n throw new Error(`Thread ${id} not found`);\n }\n\n // Merge the existing metadata with the new metadata\n const mergedMetadata = {\n ...existingThread.metadata,\n ...metadata,\n };\n\n const updatedThread = {\n ...existingThread,\n title,\n metadata: mergedMetadata,\n updatedAt: new Date(),\n };\n\n await this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: [\n {\n id: updatedThread.id,\n resourceId: updatedThread.resourceId,\n title: updatedThread.title,\n metadata: serializeMetadata(updatedThread.metadata),\n createdAt: updatedThread.createdAt,\n updatedAt: updatedThread.updatedAt.toISOString(),\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return updatedThread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id, title },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n // First delete all messages associated with this thread\n await this.client.command({\n query: `DELETE FROM \"${TABLE_MESSAGES}\" WHERE thread_id = {var_thread_id:String};`,\n query_params: { var_thread_id: threadId },\n clickhouse_settings: {\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Then delete the thread\n await this.client.command({\n query: `DELETE FROM \"${TABLE_THREADS}\" WHERE id = {var_id:String};`,\n query_params: { var_id: threadId },\n clickhouse_settings: {\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n public async listThreadsByResourceId(\n args: StorageListThreadsByResourceIdInput,\n ): Promise<StorageListThreadsByResourceIdOutput> {\n const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;\n const perPage = normalizePerPage(perPageInput, 100);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_THREADS_BY_RESOURCE_ID', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n // When perPage is false (get all), ignore page offset\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n // Get total count - count distinct thread IDs to handle duplicates\n const countResult = await this.client.query({\n query: `SELECT count(DISTINCT id) as total FROM ${TABLE_THREADS} WHERE resourceId = {resourceId:String}`,\n query_params: { resourceId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const countData = await countResult.json();\n const total = (countData as any).data[0].total;\n\n if (total === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated threads - get newest version of each thread by using row number\n const dataResult = await this.client.query({\n query: `\n WITH ranked_threads AS (\n SELECT\n id,\n resourceId,\n title,\n metadata,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatedAt DESC) as row_num\n FROM ${TABLE_THREADS}\n WHERE resourceId = {resourceId:String}\n )\n SELECT\n id,\n resourceId,\n title,\n metadata,\n createdAt,\n updatedAt\n FROM ranked_threads\n WHERE row_num = 1\n ORDER BY \"${field}\" ${direction === 'DESC' ? 'DESC' : 'ASC'}\n LIMIT {perPage:Int64} OFFSET {offset:Int64}\n `,\n query_params: {\n resourceId,\n perPage: perPage,\n offset: offset,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await dataResult.json();\n const threads = transformRows<StorageThreadType>(rows.data).map(thread => ({\n ...thread,\n metadata: parseMetadata(thread.metadata),\n }));\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < total,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_THREADS_BY_RESOURCE_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId, page },\n },\n error,\n );\n }\n }\n\n async updateMessages(args: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n threadId?: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n const { messages } = args;\n\n if (messages.length === 0) {\n return [];\n }\n\n try {\n const messageIds = messages.map(m => m.id);\n\n // Get existing messages\n const existingResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id IN (${messageIds.map((_, i) => `{id_${i}:String}`).join(',')})`,\n query_params: messageIds.reduce((acc, m, i) => ({ ...acc, [`id_${i}`]: m }), {}),\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const existingRows = await existingResult.json();\n const existingMessages = transformRows<MastraDBMessage>(existingRows.data);\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n // Parse content from string to object for merging\n const parsedExistingMessages = existingMessages.map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // ignore if not valid json\n }\n }\n return msg;\n });\n\n const threadIdsToUpdate = new Set<string>();\n const updatePromises: Promise<any>[] = [];\n\n for (const existingMessage of parsedExistingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const setClauses: string[] = [];\n const values: any = {};\n let paramIdx = 1;\n let newContent: any = null;\n\n const updatableFields = { ...fieldsToUpdate };\n\n // Special handling for content: merge in code, then update the whole field\n if (updatableFields.content) {\n const existingContent = existingMessage.content || {};\n const existingMetadata = existingContent.metadata || {};\n const updateMetadata = updatableFields.content.metadata || {};\n\n newContent = {\n ...existingContent,\n ...updatableFields.content,\n // Deep merge metadata\n metadata: {\n ...existingMetadata,\n ...updateMetadata,\n },\n };\n\n // Ensure we're updating the content field\n setClauses.push(`content = {var_content_${paramIdx}:String}`);\n values[`var_content_${paramIdx}`] = JSON.stringify(newContent);\n paramIdx++;\n delete updatableFields.content;\n }\n\n // Handle other fields\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbColumn = key === 'threadId' ? 'thread_id' : key;\n setClauses.push(`\"${dbColumn}\" = {var_${key}_${paramIdx}:String}`);\n values[`var_${key}_${paramIdx}`] = updatableFields[key as keyof typeof updatableFields];\n paramIdx++;\n }\n }\n\n if (setClauses.length > 0) {\n values[`var_id_${paramIdx}`] = id;\n\n // Use ALTER TABLE UPDATE for ClickHouse\n const updateQuery = `\n ALTER TABLE ${TABLE_MESSAGES}\n UPDATE ${setClauses.join(', ')}\n WHERE id = {var_id_${paramIdx}:String}\n `;\n\n console.info('Updating message:', id, 'with query:', updateQuery, 'values:', values);\n\n updatePromises.push(\n this.client.command({\n query: updateQuery,\n query_params: values,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n );\n }\n }\n\n // Execute all updates\n if (updatePromises.length > 0) {\n await Promise.all(updatePromises);\n }\n\n // Optimize table to apply changes immediately\n await this.client.command({\n query: `OPTIMIZE TABLE ${TABLE_MESSAGES} FINAL`,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Verify updates were applied and retry if needed\n for (const existingMessage of parsedExistingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n // Check if the update was actually applied\n const verifyResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId: id },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const verifyRows = await verifyResult.json();\n if (verifyRows.data.length > 0) {\n const updatedMessage = transformRows<MastraDBMessage>(verifyRows.data)[0];\n\n if (updatedMessage) {\n // Check if the update was applied correctly\n let needsRetry = false;\n for (const [key, value] of Object.entries(fieldsToUpdate)) {\n if (key === 'content') {\n // For content updates, check if the content was updated\n const expectedContent = typeof value === 'string' ? value : JSON.stringify(value);\n const actualContent =\n typeof updatedMessage.content === 'string'\n ? updatedMessage.content\n : JSON.stringify(updatedMessage.content);\n if (actualContent !== expectedContent) {\n needsRetry = true;\n break;\n }\n } else if (updatedMessage[key as keyof MastraDBMessage] !== value) {\n needsRetry = true;\n break;\n }\n }\n\n if (needsRetry) {\n console.info('Update not applied correctly, retrying with DELETE + INSERT for message:', id);\n // Use DELETE + INSERT as fallback\n await this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId: id },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Reconstruct the updated content if needed\n let updatedContent = existingMessage.content || {};\n if (fieldsToUpdate.content) {\n const existingContent = existingMessage.content || {};\n const existingMetadata = existingContent.metadata || {};\n const updateMetadata = fieldsToUpdate.content.metadata || {};\n\n updatedContent = {\n ...existingContent,\n ...fieldsToUpdate.content,\n metadata: {\n ...existingMetadata,\n ...updateMetadata,\n },\n };\n }\n\n const updatedMessageData = {\n ...existingMessage,\n ...fieldsToUpdate,\n content: updatedContent,\n };\n\n await this.client.insert({\n table: TABLE_MESSAGES,\n format: 'JSONEachRow',\n values: [\n {\n id: updatedMessageData.id,\n thread_id: updatedMessageData.threadId,\n resourceId: updatedMessageData.resourceId,\n content:\n typeof updatedMessageData.content === 'string'\n ? updatedMessageData.content\n : JSON.stringify(updatedMessageData.content),\n createdAt: updatedMessageData.createdAt.toISOString(),\n role: updatedMessageData.role,\n type: updatedMessageData.type || 'v2',\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n }\n }\n }\n\n // Update thread timestamps with a small delay to ensure timestamp difference\n if (threadIdsToUpdate.size > 0) {\n // Add a small delay to ensure timestamp difference\n await new Promise(resolve => setTimeout(resolve, 10));\n\n const now = new Date().toISOString().replace('Z', '');\n\n // Get existing threads to preserve their data\n const threadUpdatePromises = Array.from(threadIdsToUpdate).map(async threadId => {\n // Get existing thread data - get newest version by updatedAt\n const threadResult = await this.client.query({\n query: `SELECT id, resourceId, title, metadata, createdAt FROM ${TABLE_THREADS} WHERE id = {threadId:String} ORDER BY updatedAt DESC LIMIT 1`,\n query_params: { threadId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const threadRows = await threadResult.json();\n if (threadRows.data.length > 0) {\n const existingThread = threadRows.data[0] as any;\n\n // Delete existing thread\n await this.client.command({\n query: `DELETE FROM ${TABLE_THREADS} WHERE id = {threadId:String}`,\n query_params: { threadId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Insert updated thread with new timestamp\n await this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: [\n {\n id: existingThread.id,\n resourceId: existingThread.resourceId,\n title: existingThread.title,\n metadata:\n typeof existingThread.metadata === 'string'\n ? existingThread.metadata\n : serializeMetadata(existingThread.metadata as Record<string, unknown>),\n createdAt: existingThread.createdAt,\n updatedAt: now,\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n });\n\n await Promise.all(threadUpdatePromises);\n }\n\n // Re-fetch to return the fully updated messages\n const updatedMessages: MastraDBMessage[] = [];\n for (const messageId of messageIds) {\n const updatedResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const updatedRows = await updatedResult.json();\n if (updatedRows.data.length > 0) {\n const message = transformRows<MastraDBMessage>(updatedRows.data)[0];\n if (message) {\n updatedMessages.push(message);\n }\n }\n }\n\n // Parse content back to objects\n return updatedMessages.map(message => {\n if (typeof message.content === 'string') {\n try {\n message.content = JSON.parse(message.content);\n } catch {\n // ignore if not valid json\n }\n }\n return message;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messages.map(m => m.id).join(',') },\n },\n error,\n );\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const result = await this.client.query({\n query: `SELECT id, workingMemory, metadata, createdAt, updatedAt FROM ${TABLE_RESOURCES} WHERE id = {resourceId:String} ORDER BY updatedAt DESC LIMIT 1`,\n query_params: { resourceId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n if (rows.data.length === 0) {\n return null;\n }\n\n const resource = rows.data[0] as any;\n return {\n id: resource.id,\n workingMemory:\n resource.workingMemory && typeof resource.workingMemory === 'object'\n ? JSON.stringify(resource.workingMemory)\n : resource.workingMemory,\n metadata:\n resource.metadata && typeof resource.metadata === 'string'\n ? JSON.parse(resource.metadata)\n : resource.metadata,\n createdAt: new Date(resource.createdAt),\n updatedAt: new Date(resource.updatedAt),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_RESOURCE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n await this.client.insert({\n table: TABLE_RESOURCES,\n format: 'JSONEachRow',\n values: [\n {\n id: resource.id,\n workingMemory: resource.workingMemory,\n metadata: JSON.stringify(resource.metadata),\n createdAt: resource.createdAt.toISOString(),\n updatedAt: resource.updatedAt.toISOString(),\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return resource;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: resource.id },\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n try {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n // Create new resource if it doesn't exist\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n // Use ALTER TABLE UPDATE for ClickHouse\n const updateQuery = `\n ALTER TABLE ${TABLE_RESOURCES}\n UPDATE workingMemory = {workingMemory:String}, metadata = {metadata:String}, updatedAt = {updatedAt:String}\n WHERE id = {resourceId:String}\n `;\n\n await this.client.command({\n query: updateQuery,\n query_params: {\n workingMemory: updatedResource.workingMemory,\n metadata: JSON.stringify(updatedResource.metadata),\n updatedAt: updatedResource.updatedAt.toISOString().replace('Z', ''),\n resourceId,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Optimize table to apply changes\n await this.client.command({\n query: `OPTIMIZE TABLE ${TABLE_RESOURCES} FINAL`,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return updatedResource;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n SPAN_SCHEMA,\n TABLE_SPANS,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n SpanRecord,\n ListTracesArgs,\n PaginationInfo,\n TracingStorageStrategy,\n UpdateSpanArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n BatchCreateSpansArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n} from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { TABLE_ENGINES, transformRows } from '../../db/utils';\n\nexport class ObservabilityStorageClickhouse extends ObservabilityStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SPANS, schema: SPAN_SCHEMA });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SPANS });\n }\n\n public override get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n // ClickHouse is optimized for append-only workloads, so the tracing exporter\n // should use insert-only mode (wait for trace-end events, then insert complete spans).\n // Note: updateSpan/batchUpdateSpans are still available for manual modifications.\n return {\n preferred: 'insert-only',\n supported: ['insert-only'],\n };\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n try {\n const now = Date.now();\n const record = {\n ...span,\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n startedAt: span.startedAt instanceof Date ? span.startedAt.getTime() : span.startedAt,\n endedAt: span.endedAt instanceof Date ? span.endedAt.getTime() : span.endedAt,\n createdAt: now,\n updatedAt: now,\n };\n await this.#db.insert({ tableName: TABLE_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n spanName: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String} AND spanId = {spanId:String}\n LIMIT 1\n `,\n query_params: { traceId, spanId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n const spans = transformRows(rows) as SpanRecord[];\n const span = spans[0];\n if (!span) {\n return null;\n }\n return { span };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n\n async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n const { traceId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String} AND (parentSpanId IS NULL OR parentSpanId = '')\n LIMIT 1\n `,\n query_params: { traceId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n const spans = transformRows(rows) as SpanRecord[];\n const span = spans[0];\n if (!span) {\n return null;\n }\n return { span };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ROOT_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const { traceId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String}\n ORDER BY startedAt DESC\n `,\n query_params: { traceId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: transformRows(rows) as SpanRecord[],\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async updateSpan(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n try {\n // Load existing span\n const existing = await this.#db.load<SpanRecord>({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n });\n\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_SPAN', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { spanId, traceId },\n });\n }\n\n // Handle Date conversions to millisecond timestamps for DateTime64(3)\n const data: Record<string, any> = { ...updates };\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.getTime();\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.getTime();\n }\n\n // Merge updates and re-insert (ClickHouse uses ReplacingMergeTree)\n const updated = {\n ...existing,\n ...data,\n updatedAt: Date.now(),\n };\n\n await this.client.insert({\n table: TABLE_SPANS,\n values: [updated],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { spanId, traceId },\n },\n error,\n );\n }\n }\n\n async listTraces(args: ListTracesArgs): Promise<{ pagination: PaginationInfo; spans: SpanRecord[] }> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const { page, perPage } = pagination;\n\n try {\n // ClickHouse stores null strings as empty strings, so check for both\n const conditions: string[] = [`(parentSpanId IS NULL OR parentSpanId = '')`];\n const values: Record<string, any> = {};\n let paramIndex = 0;\n\n if (filters) {\n // Date range filters\n if (filters.startedAt?.start) {\n conditions.push(`startedAt >= {startedAtStart:DateTime64(3)}`);\n // Use Unix timestamp in milliseconds for DateTime64(3)\n values.startedAtStart = filters.startedAt.start.getTime();\n }\n if (filters.startedAt?.end) {\n conditions.push(`startedAt <= {startedAtEnd:DateTime64(3)}`);\n values.startedAtEnd = filters.startedAt.end.getTime();\n }\n if (filters.endedAt?.start) {\n conditions.push(`endedAt >= {endedAtStart:DateTime64(3)}`);\n values.endedAtStart = filters.endedAt.start.getTime();\n }\n if (filters.endedAt?.end) {\n conditions.push(`endedAt <= {endedAtEnd:DateTime64(3)}`);\n values.endedAtEnd = filters.endedAt.end.getTime();\n }\n\n // Span type filter\n if (filters.spanType !== undefined) {\n conditions.push(`spanType = {spanType:String}`);\n values.spanType = filters.spanType;\n }\n\n // Entity filters\n if (filters.entityType !== undefined) {\n conditions.push(`entityType = {entityType:String}`);\n values.entityType = filters.entityType;\n }\n if (filters.entityId !== undefined) {\n conditions.push(`entityId = {entityId:String}`);\n values.entityId = filters.entityId;\n }\n if (filters.entityName !== undefined) {\n conditions.push(`entityName = {entityName:String}`);\n values.entityName = filters.entityName;\n }\n\n // Identity & Tenancy filters\n if (filters.userId !== undefined) {\n conditions.push(`userId = {userId:String}`);\n values.userId = filters.userId;\n }\n if (filters.organizationId !== undefined) {\n conditions.push(`organizationId = {organizationId:String}`);\n values.organizationId = filters.organizationId;\n }\n if (filters.resourceId !== undefined) {\n conditions.push(`resourceId = {resourceId:String}`);\n values.resourceId = filters.resourceId;\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined) {\n conditions.push(`runId = {runId:String}`);\n values.runId = filters.runId;\n }\n if (filters.sessionId !== undefined) {\n conditions.push(`sessionId = {sessionId:String}`);\n values.sessionId = filters.sessionId;\n }\n if (filters.threadId !== undefined) {\n conditions.push(`threadId = {threadId:String}`);\n values.threadId = filters.threadId;\n }\n if (filters.requestId !== undefined) {\n conditions.push(`requestId = {requestId:String}`);\n values.requestId = filters.requestId;\n }\n\n // Deployment context filters\n if (filters.environment !== undefined) {\n conditions.push(`environment = {environment:String}`);\n values.environment = filters.environment;\n }\n if (filters.source !== undefined) {\n conditions.push(`source = {source:String}`);\n values.source = filters.source;\n }\n if (filters.serviceName !== undefined) {\n conditions.push(`serviceName = {serviceName:String}`);\n values.serviceName = filters.serviceName;\n }\n\n // Scope filter (JSON field - use JSONExtractString for each key)\n if (filters.scope != null) {\n for (const [key, value] of Object.entries(filters.scope)) {\n // Validate key to prevent injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n const paramName = `scope_${key}_${paramIndex++}`;\n conditions.push(`JSONExtractString(scope, '${key}') = {${paramName}:String}`);\n values[paramName] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Metadata filter (JSON field)\n if (filters.metadata != null) {\n for (const [key, value] of Object.entries(filters.metadata)) {\n // Validate key to prevent injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n const paramName = `metadata_${key}_${paramIndex++}`;\n conditions.push(`JSONExtractString(metadata, '${key}') = {${paramName}:String}`);\n values[paramName] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Tags filter (all tags must be present)\n // ClickHouse stores tags as JSON array string, use JSONExtract to check\n if (filters.tags != null && filters.tags.length > 0) {\n for (const tag of filters.tags) {\n const paramName = `tag_${paramIndex++}`;\n conditions.push(`has(JSONExtract(tags, 'Array(String)'), {${paramName}:String})`);\n values[paramName] = tag;\n }\n }\n\n // Status filter (derived from error and endedAt)\n if (filters.status !== undefined) {\n switch (filters.status) {\n case TraceStatus.ERROR:\n // ClickHouse stores null as empty string for String columns\n conditions.push(`(error IS NOT NULL AND error != '')`);\n break;\n case TraceStatus.RUNNING:\n conditions.push(`(endedAt IS NULL OR endedAt = '') AND (error IS NULL OR error = '')`);\n break;\n case TraceStatus.SUCCESS:\n conditions.push(`(endedAt IS NOT NULL AND endedAt != '') AND (error IS NULL OR error = '')`);\n break;\n }\n }\n\n // hasChildError filter (requires subquery)\n if (filters.hasChildError !== undefined) {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const finalClause = engine.startsWith('ReplacingMergeTree') ? 'FINAL' : '';\n if (filters.hasChildError) {\n conditions.push(`EXISTS (\n SELECT 1 FROM ${TABLE_SPANS} ${finalClause} c\n WHERE c.traceId = ${TABLE_SPANS}.traceId AND c.error IS NOT NULL AND c.error != ''\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${TABLE_SPANS} ${finalClause} c\n WHERE c.traceId = ${TABLE_SPANS}.traceId AND c.error IS NOT NULL AND c.error != ''\n )`);\n }\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const finalClause = engine.startsWith('ReplacingMergeTree') ? 'FINAL' : '';\n\n // Order by clause with proper NULL handling for endedAt\n // For endedAt DESC: NULLs FIRST (running spans on top when viewing newest)\n // For endedAt ASC: NULLs LAST (running spans at end when viewing oldest)\n // startedAt is never null (required field), so no special handling needed\n // Note: ClickHouse stores null endedAt as empty strings, so we check for both\n const sortField = orderBy.field;\n const sortDirection = orderBy.direction;\n let orderClause: string;\n if (sortField === 'endedAt') {\n // Use CASE WHEN to handle NULLs and empty strings for endedAt\n // DESC: NULLs first (0 sorts before 1)\n // ASC: NULLs last (1 sorts after 0)\n const nullSortValue = sortDirection === 'DESC' ? 0 : 1;\n const nonNullSortValue = sortDirection === 'DESC' ? 1 : 0;\n orderClause = `ORDER BY CASE WHEN ${sortField} IS NULL OR ${sortField} = '' THEN ${nullSortValue} ELSE ${nonNullSortValue} END, ${sortField} ${sortDirection}`;\n } else {\n orderClause = `ORDER BY ${sortField} ${sortDirection}`;\n }\n\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SPANS} ${finalClause} ${whereClause}`,\n query_params: values,\n format: 'JSONEachRow',\n });\n const countRows = (await countResult.json()) as Array<{ count: string | number }>;\n const total = Number(countRows[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: { total: 0, page, perPage, hasMore: false },\n spans: [],\n };\n }\n\n // Get paginated results\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${finalClause}\n ${whereClause}\n ${orderClause}\n LIMIT {limit:UInt32}\n OFFSET {offset:UInt32}\n `,\n query_params: { ...values, limit: perPage, offset: page * perPage },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n const spans = transformRows(rows) as SpanRecord[];\n\n return {\n pagination: {\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n },\n spans,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n const now = Date.now();\n await this.#db.batchInsert({\n tableName: TABLE_SPANS,\n records: args.records.map(record => ({\n ...record,\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n startedAt: record.startedAt instanceof Date ? record.startedAt.getTime() : record.startedAt,\n endedAt: record.endedAt instanceof Date ? record.endedAt.getTime() : record.endedAt,\n createdAt: now,\n updatedAt: now,\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n try {\n const now = Date.now();\n\n // Note: ClickHouse doesn't support traditional UPDATE operations with MergeTree engines.\n // Updates are performed by loading existing data, merging changes, and re-inserting.\n // This sequential processing may be slow for large batches - consider batching at the\n // application level if high-volume updates are needed.\n // For each update, load existing, merge, and re-insert\n for (const record of args.records) {\n const existing = await this.#db.load<SpanRecord>({\n tableName: TABLE_SPANS,\n keys: { spanId: record.spanId, traceId: record.traceId },\n });\n\n if (existing) {\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n const updates: Record<string, any> = { ...record.updates };\n if (updates.startedAt instanceof Date) {\n updates.startedAt = updates.startedAt.getTime();\n }\n if (updates.endedAt instanceof Date) {\n updates.endedAt = updates.endedAt.getTime();\n }\n\n const updated = {\n ...existing,\n ...updates,\n updatedAt: now,\n };\n\n await this.client.insert({\n table: TABLE_SPANS,\n values: [updated],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_UPDATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n try {\n if (args.traceIds.length === 0) return;\n\n await this.client.command({\n query: `DELETE FROM ${TABLE_SPANS} WHERE traceId IN {traceIds:Array(String)}`,\n query_params: { traceIds: args.traceIds },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport {\n createStorageErrorId,\n ScoresStorage,\n SCORERS_SCHEMA,\n TABLE_SCORERS,\n calculatePagination,\n normalizePerPage,\n transformScoreRow as coreTransformScoreRow,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\n\nexport class ScoresStorageClickhouse extends ScoresStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SCORERS, schema: TABLE_SCHEMAS[TABLE_SCORERS] });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SCORERS });\n }\n\n /**\n * ClickHouse-specific score row transformation.\n * Converts timestamps to Date objects and filters out '_null_' values.\n */\n private transformScoreRow(row: any): ScoreRowData {\n return coreTransformScoreRow(row, {\n convertTimestamps: true,\n nullValuePattern: '_null_',\n });\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE id = {var_id:String}`,\n query_params: { var_id: id },\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const resultJson = await result.json();\n if (!Array.isArray(resultJson) || resultJson.length === 0) {\n return null;\n }\n\n return this.transformScoreRow(resultJson[0]);\n // return this.parseScoreRow(resultJson[0]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId: id },\n },\n error,\n );\n }\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let parsedScore: SaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n const now = new Date();\n const id = crypto.randomUUID();\n const createdAt = now;\n const updatedAt = now;\n\n try {\n // Build record from schema columns, converting undefined to null for ClickHouse\n const record: Record<string, unknown> = {};\n for (const key of Object.keys(SCORERS_SCHEMA)) {\n if (key === 'id') {\n record[key] = id;\n continue;\n }\n if (key === 'createdAt' || key === 'updatedAt') {\n record[key] = now.toISOString();\n continue;\n }\n const value = parsedScore[key as keyof typeof parsedScore];\n record[key] = value === undefined || value === null ? '_null_' : value;\n }\n\n await this.client.insert({\n table: TABLE_SCORERS,\n values: [record],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n return { score: { ...parsedScore, id, createdAt, updatedAt } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId: id },\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE runId = {var_runId:String}`,\n query_params: { var_runId: runId },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE runId = {var_runId:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_runId: runId,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_RUN_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId },\n },\n error,\n );\n }\n }\n\n async listScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<ListScoresResponse> {\n let whereClause = `scorerId = {var_scorerId:String}`;\n if (entityId) {\n whereClause += ` AND entityId = {var_entityId:String}`;\n }\n if (entityType) {\n whereClause += ` AND entityType = {var_entityType:String}`;\n }\n if (source) {\n whereClause += ` AND source = {var_source:String}`;\n }\n\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE ${whereClause}`,\n query_params: {\n var_scorerId: scorerId,\n var_entityId: entityId,\n var_entityType: entityType,\n var_source: source,\n },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE ${whereClause} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_scorerId: scorerId,\n var_limit: limitValue,\n var_offset: start,\n var_entityId: entityId,\n var_entityType: entityType,\n var_source: source,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_SCORER_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerId },\n },\n error,\n );\n }\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<ListScoresResponse> {\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE entityId = {var_entityId:String} AND entityType = {var_entityType:String}`,\n query_params: { var_entityId: entityId, var_entityType: entityType },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE entityId = {var_entityId:String} AND entityType = {var_entityType:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_entityId: entityId,\n var_entityType: entityType,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_ENTITY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityId, entityType },\n },\n error,\n );\n }\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE traceId = {var_traceId:String} AND spanId = {var_spanId:String}`,\n query_params: {\n var_traceId: traceId,\n var_spanId: spanId,\n },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE traceId = {var_traceId:String} AND spanId = {var_spanId:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_traceId: traceId,\n var_spanId: spanId,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n WorkflowsStorage,\n} from '@mastra/core/storage';\nimport type {\n WorkflowRun,\n WorkflowRuns,\n StorageListWorkflowRunsInput,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { TABLE_ENGINES } from '../../db/utils';\n\nexport class WorkflowsStorageClickhouse extends WorkflowsStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n const schema = TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT];\n await this.#db.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema,\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n // Load existing snapshot\n let snapshot = await this.loadWorkflowSnapshot({ workflowName, runId });\n\n if (!snapshot) {\n // Create new snapshot if none exists\n snapshot = {\n context: {},\n activePaths: [],\n timestamp: Date.now(),\n suspendedPaths: {},\n activeStepsPath: {},\n resumeLabels: {},\n serializedStepGraph: [],\n status: 'pending',\n value: {},\n waitingPaths: {},\n runId: runId,\n requestContext: {},\n } as WorkflowRunState;\n }\n\n // Merge the new step result and request context\n snapshot.context[stepId] = result;\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n\n // Persist updated snapshot\n await this.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n\n return snapshot.context;\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n // Load existing snapshot\n const snapshot = await this.loadWorkflowSnapshot({ workflowName, runId });\n\n if (!snapshot) {\n return undefined;\n }\n\n if (!snapshot.context) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_WORKFLOW_STATE', 'CONTEXT_MISSING'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Snapshot context is missing for runId ${runId}`,\n });\n }\n\n // Merge the new options with the existing snapshot\n const updatedSnapshot = { ...snapshot, ...opts };\n\n // Persist updated snapshot\n await this.persistWorkflowSnapshot({ workflowName, runId, snapshot: updatedSnapshot });\n\n return updatedSnapshot;\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n try {\n const currentSnapshot = await this.#db.load({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n const now = new Date();\n const persisting = currentSnapshot\n ? {\n ...currentSnapshot,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n updatedAt: (updatedAt ?? now).toISOString(),\n }\n : {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n createdAt: (createdAt ?? now).toISOString(),\n updatedAt: (updatedAt ?? now).toISOString(),\n };\n\n await this.client.insert({\n table: TABLE_WORKFLOW_SNAPSHOT,\n format: 'JSONEachRow',\n values: [persisting],\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'PERSIST_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const result = await this.#db.load({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n if (!result) {\n return null;\n }\n\n return (result as any).snapshot;\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LOAD_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n private parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\n } catch (e) {\n // If parsing fails, return the raw snapshot string\n console.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name,\n runId: row.run_id,\n snapshot: parsedSnapshot,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n resourceId: row.resourceId,\n };\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n page,\n perPage,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n try {\n const conditions: string[] = [];\n const values: Record<string, any> = {};\n\n if (workflowName) {\n conditions.push(`workflow_name = {var_workflow_name:String}`);\n values.var_workflow_name = workflowName;\n }\n\n if (status) {\n conditions.push(`JSONExtractString(snapshot, 'status') = {var_status:String}`);\n values.var_status = status;\n }\n\n if (resourceId) {\n const hasResourceId = await this.#db.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'resourceId');\n if (hasResourceId) {\n conditions.push(`resourceId = {var_resourceId:String}`);\n values.var_resourceId = resourceId;\n } else {\n console.warn(`[${TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);\n }\n }\n\n if (fromDate) {\n conditions.push(`createdAt >= {var_from_date:DateTime64(3)}`);\n values.var_from_date = fromDate.getTime() / 1000; // Convert to Unix timestamp\n }\n\n if (toDate) {\n conditions.push(`createdAt <= {var_to_date:DateTime64(3)}`);\n values.var_to_date = toDate.getTime() / 1000; // Convert to Unix timestamp\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const usePagination = perPage !== undefined && page !== undefined;\n const normalizedPerPage = usePagination ? normalizePerPage(perPage, Number.MAX_SAFE_INTEGER) : 0;\n const offset = usePagination ? page * normalizedPerPage : 0;\n const limitClause = usePagination ? `LIMIT ${normalizedPerPage}` : '';\n const offsetClause = usePagination ? `OFFSET ${offset}` : '';\n\n let total = 0;\n // Only get total count when using pagination\n if (usePagination) {\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''} ${whereClause}`,\n query_params: values,\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n total = Number((countRows as Array<{ count: string | number }>)[0]?.count ?? 0);\n }\n\n // Get results\n const result = await this.client.query({\n query: `\n SELECT \n workflow_name,\n run_id,\n snapshot,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n resourceId\n FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n ${whereClause}\n ORDER BY createdAt DESC\n ${limitClause}\n ${offsetClause}\n `,\n query_params: values,\n format: 'JSONEachRow',\n });\n\n const resultJson = await result.json();\n const rows = resultJson as any[];\n const runs = rows.map(row => {\n return this.parseWorkflowRun(row);\n });\n\n // Use runs.length as total when not paginating\n return { runs, total: total || runs.length };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName: workflowName ?? '', resourceId: resourceId ?? '' },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n try {\n const conditions: string[] = [];\n const values: Record<string, any> = {};\n\n if (runId) {\n conditions.push(`run_id = {var_runId:String}`);\n values.var_runId = runId;\n }\n\n if (workflowName) {\n conditions.push(`workflow_name = {var_workflow_name:String}`);\n values.var_workflow_name = workflowName;\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get results\n const result = await this.client.query({\n query: `\n SELECT \n workflow_name,\n run_id,\n snapshot,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n resourceId\n FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n ${whereClause}\n ORDER BY createdAt DESC LIMIT 1\n `,\n query_params: values,\n format: 'JSONEachRow',\n });\n\n const resultJson = await result.json();\n if (!Array.isArray(resultJson) || resultJson.length === 0) {\n return null;\n }\n return this.parseWorkflowRun(resultJson[0]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: runId ?? '', workflowName: workflowName ?? '' },\n },\n error,\n );\n }\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n try {\n const values: Record<string, any> = {\n var_runId: runId,\n var_workflow_name: workflowName,\n };\n\n await this.client.command({\n query: `DELETE FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE run_id = {var_runId:String} AND workflow_name = {var_workflow_name:String}`,\n query_params: values,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { createClient } from '@clickhouse/client';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createStorageErrorId, MastraStorage } from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageDomains, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { MemoryStorageClickhouse } from './domains/memory';\nimport { ObservabilityStorageClickhouse } from './domains/observability';\nimport { ScoresStorageClickhouse } from './domains/scores';\nimport { WorkflowsStorageClickhouse } from './domains/workflows';\n\n// Export domain classes for direct use with MastraStorage composition\nexport { MemoryStorageClickhouse, ObservabilityStorageClickhouse, ScoresStorageClickhouse, WorkflowsStorageClickhouse };\nexport type { ClickhouseDomainConfig } from './db';\n\ntype IntervalUnit =\n | 'NANOSECOND'\n | 'MICROSECOND'\n | 'MILLISECOND'\n | 'SECOND'\n | 'MINUTE'\n | 'HOUR'\n | 'DAY'\n | 'WEEK'\n | 'MONTH'\n | 'QUARTER'\n | 'YEAR';\n\ntype ClickhouseTtlConfig = {\n [TableKey in TABLE_NAMES]?: {\n row?: { interval: number; unit: IntervalUnit; ttlKey?: string };\n columns?: Partial<{\n [ColumnKey in keyof (typeof TABLE_SCHEMAS)[TableKey]]: {\n interval: number;\n unit: IntervalUnit;\n ttlKey?: string;\n };\n }>;\n };\n};\n\n/**\n * ClickHouse configuration type.\n *\n * Accepts either:\n * - A pre-configured ClickHouse client: `{ id, client, ttl? }`\n * - URL/credentials config: `{ id, url, username, password, ttl? }`\n */\nexport type ClickhouseConfig = {\n id: string;\n ttl?: ClickhouseTtlConfig;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new ClickhouseStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new ClickhouseStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n} & (\n | {\n /**\n * Pre-configured ClickHouse client.\n * Use this when you need to configure the client before initialization,\n * e.g., to set custom connection settings or interceptors.\n *\n * @example\n * ```typescript\n * import { createClient } from '@clickhouse/client';\n *\n * const client = createClient({\n * url: 'http://localhost:8123',\n * username: 'default',\n * password: '',\n * // Custom settings\n * request_timeout: 60000,\n * });\n *\n * const store = new ClickhouseStore({ id: 'my-store', client });\n * ```\n */\n client: ClickHouseClient;\n }\n | {\n url: string;\n username: string;\n password: string;\n }\n);\n\n/**\n * Type guard for pre-configured client config\n */\nconst isClientConfig = (config: ClickhouseConfig): config is ClickhouseConfig & { client: ClickHouseClient } => {\n return 'client' in config;\n};\n\n/**\n * ClickHouse storage adapter for Mastra.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new ClickhouseStore({ id: 'my-store', url: '...', username: '...', password: '...' });\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n *\n * // Access observability domain\n * const observability = await storage.getStore('observability');\n * await observability?.createSpan(span);\n * ```\n */\nexport class ClickhouseStore extends MastraStorage {\n protected db: ClickHouseClient;\n protected ttl: ClickhouseConfig['ttl'] = {};\n\n stores: StorageDomains;\n\n constructor(config: ClickhouseConfig) {\n super({ id: config.id, name: 'ClickhouseStore', disableInit: config.disableInit });\n\n // Handle pre-configured client vs creating new connection\n if (isClientConfig(config)) {\n // User provided a pre-configured ClickHouse client\n this.db = config.client;\n } else {\n // Validate URL before creating client\n if (!config.url || typeof config.url !== 'string' || config.url.trim() === '') {\n throw new Error('ClickhouseStore: url is required and cannot be empty.');\n }\n // Validate username and password are strings (can be empty for default user)\n if (typeof config.username !== 'string') {\n throw new Error('ClickhouseStore: username must be a string.');\n }\n if (typeof config.password !== 'string') {\n throw new Error('ClickhouseStore: password must be a string.');\n }\n // Create client from credentials\n this.db = createClient({\n url: config.url,\n username: config.username,\n password: config.password,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso', // This is crucial\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n\n this.ttl = config.ttl;\n\n const domainConfig = { client: this.db, ttl: this.ttl };\n const workflows = new WorkflowsStorageClickhouse(domainConfig);\n const scores = new ScoresStorageClickhouse(domainConfig);\n const memory = new MemoryStorageClickhouse(domainConfig);\n const observability = new ObservabilityStorageClickhouse(domainConfig);\n\n this.stores = {\n workflows,\n scores,\n memory,\n observability,\n };\n }\n\n async optimizeTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.db.command({\n query: `OPTIMIZE TABLE ${tableName} FINAL`,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'OPTIMIZE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async materializeTtl({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.db.command({\n query: `ALTER TABLE ${tableName} MATERIALIZE TTL;`,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'MATERIALIZE_TTL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Closes the ClickHouse client connection.\n *\n * This will close the ClickHouse client, including pre-configured clients.\n * The store assumes ownership of all clients and manages their lifecycle.\n */\n async close(): Promise<void> {\n try {\n await this.db.close();\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CLOSE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/storage/db/utils.ts","../src/storage/db/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts"],"names":["TABLE_SPANS","TABLE_WORKFLOW_SNAPSHOT","TABLE_THREADS","TABLE_SCHEMAS","TABLE_MESSAGES","TABLE_RESOURCES","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","engine","finalClause","TABLE_SCORERS","coreTransformScoreRow","normalizePerPage","calculatePagination","createClient"],"mappings":"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","file":"index.js","sourcesContent":["import type { TABLE_NAMES, TABLE_SCHEMAS, StorageColumn } from '@mastra/core/storage';\nimport {\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_SCORERS,\n TABLE_THREADS,\n TABLE_TRACES,\n TABLE_WORKFLOW_SNAPSHOT,\n safelyParseJSON,\n TABLE_SPANS,\n} from '@mastra/core/storage';\n\nexport const TABLE_ENGINES: Record<TABLE_NAMES, string> = {\n [TABLE_MESSAGES]: `MergeTree()`,\n [TABLE_WORKFLOW_SNAPSHOT]: `ReplacingMergeTree()`,\n [TABLE_TRACES]: `MergeTree()`,\n [TABLE_THREADS]: `ReplacingMergeTree()`,\n [TABLE_SCORERS]: `MergeTree()`,\n [TABLE_RESOURCES]: `ReplacingMergeTree()`,\n // ReplacingMergeTree(updatedAt) deduplicates rows with the same (traceId, spanId) sorting key,\n // keeping the row with the highest updatedAt value. Combined with ORDER BY (traceId, spanId),\n // this provides eventual uniqueness for the (traceId, spanId) composite key.\n [TABLE_SPANS]: `ReplacingMergeTree(updatedAt)`,\n mastra_agents: `ReplacingMergeTree()`,\n};\n\nexport const COLUMN_TYPES: Record<StorageColumn['type'], string> = {\n text: 'String',\n timestamp: 'DateTime64(3)',\n uuid: 'String',\n jsonb: 'String',\n integer: 'Int64',\n float: 'Float64',\n bigint: 'Int64',\n boolean: 'Bool',\n};\n\nexport type IntervalUnit =\n | 'NANOSECOND'\n | 'MICROSECOND'\n | 'MILLISECOND'\n | 'SECOND'\n | 'MINUTE'\n | 'HOUR'\n | 'DAY'\n | 'WEEK'\n | 'MONTH'\n | 'QUARTER'\n | 'YEAR';\n\nexport type ClickhouseConfig = {\n url: string;\n username: string;\n password: string;\n ttl?: {\n [TableKey in TABLE_NAMES]?: {\n row?: { interval: number; unit: IntervalUnit; ttlKey?: string };\n columns?: Partial<{\n [ColumnKey in keyof (typeof TABLE_SCHEMAS)[TableKey]]: {\n interval: number;\n unit: IntervalUnit;\n ttlKey?: string;\n };\n }>;\n };\n };\n};\n\n// List of fields that should be parsed as JSON\nconst JSON_FIELDS = ['content', 'attributes', 'metadata', 'input', 'output', 'error', 'scope', 'links'];\n\n// Fields that should be null instead of empty string when empty\nconst NULLABLE_STRING_FIELDS = ['parentSpanId', 'error'];\n\nexport function transformRow<R>(row: any): R {\n if (!row) {\n return row;\n }\n\n if (row.createdAt) {\n row.createdAt = new Date(row.createdAt);\n }\n if (row.updatedAt) {\n row.updatedAt = new Date(row.updatedAt);\n }\n if (row.startedAt) {\n row.startedAt = new Date(row.startedAt);\n }\n if (row.endedAt) {\n row.endedAt = new Date(row.endedAt);\n }\n\n // Parse JSONB fields if they're JSON strings\n for (const field of JSON_FIELDS) {\n if (row[field] && typeof row[field] === 'string') {\n row[field] = safelyParseJSON(row[field]);\n }\n }\n\n // Convert empty strings to null for nullable fields\n for (const field of NULLABLE_STRING_FIELDS) {\n if (row[field] === '') {\n row[field] = null;\n }\n }\n\n return row;\n}\n\nexport function transformRows<R>(rows: any[]): R[] {\n return rows.map((row: any) => transformRow<R>(row));\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { createClient } from '@clickhouse/client';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n getSqlType,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SPANS,\n TABLE_SCHEMAS,\n getDefaultValue,\n} from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport type { ClickhouseConfig } from './utils';\nimport { TABLE_ENGINES, transformRow } from './utils';\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. An existing ClickHouse client with optional ttl config\n * 2. Config to create a new client internally\n */\nexport type ClickhouseDomainConfig = ClickhouseDomainClientConfig | ClickhouseDomainRestConfig;\n\n/**\n * Pass an existing ClickHouse client\n */\nexport interface ClickhouseDomainClientConfig {\n client: ClickHouseClient;\n ttl?: ClickhouseConfig['ttl'];\n}\n\n/**\n * Pass config to create a new ClickHouse client internally\n */\nexport interface ClickhouseDomainRestConfig {\n url: string;\n username: string;\n password: string;\n ttl?: ClickhouseConfig['ttl'];\n}\n\n/**\n * Resolves ClickhouseDomainConfig to a ClickHouse client and ttl config.\n * Handles creating a new client if config is provided.\n */\nexport function resolveClickhouseConfig(config: ClickhouseDomainConfig): {\n client: ClickHouseClient;\n ttl?: ClickhouseConfig['ttl'];\n} {\n // Existing client\n if ('client' in config) {\n return { client: config.client, ttl: config.ttl };\n }\n\n // Config to create new client\n const client = createClient({\n url: config.url,\n username: config.username,\n password: config.password,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return { client, ttl: config.ttl };\n}\n\nexport class ClickhouseDB extends MastraBase {\n protected ttl: ClickhouseConfig['ttl'];\n protected client: ClickHouseClient;\n constructor({ client, ttl }: { client: ClickHouseClient; ttl: ClickhouseConfig['ttl'] }) {\n super({\n name: 'CLICKHOUSE_DB',\n });\n this.ttl = ttl;\n this.client = client;\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n const result = await this.client.query({\n query: `DESCRIBE TABLE ${table}`,\n format: 'JSONEachRow',\n });\n const columns = (await result.json()) as { name: string }[];\n return columns.some(c => c.name === column);\n }\n\n /**\n * Checks if a table exists in the database.\n */\n async tableExists(tableName: string): Promise<boolean> {\n try {\n const result = await this.client.query({\n query: `EXISTS TABLE ${tableName}`,\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ result: number }>;\n return rows[0]?.result === 1;\n } catch {\n return false;\n }\n }\n\n /**\n * Gets the sorting key (ORDER BY columns) for a table.\n * Returns null if the table doesn't exist.\n */\n async getTableSortingKey(tableName: string): Promise<string | null> {\n try {\n const result = await this.client.query({\n query: `SELECT sorting_key FROM system.tables WHERE database = currentDatabase() AND name = {tableName:String}`,\n query_params: { tableName },\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ sorting_key: string }>;\n return rows[0]?.sorting_key ?? null;\n } catch {\n return null;\n }\n }\n\n /**\n * Checks if migration is needed for the spans table.\n * Returns information about the current state.\n */\n async checkSpansMigrationStatus(tableName: string): Promise<{\n needsMigration: boolean;\n currentSortingKey: string | null;\n }> {\n // Check if table exists\n const exists = await this.tableExists(tableName);\n if (!exists) {\n return { needsMigration: false, currentSortingKey: null };\n }\n\n // Check current sorting key\n const currentSortingKey = await this.getTableSortingKey(tableName);\n if (!currentSortingKey) {\n return { needsMigration: false, currentSortingKey: null };\n }\n\n // Check if migration is needed - old key starts with createdAt\n const needsMigration = currentSortingKey.toLowerCase().startsWith('createdat');\n return { needsMigration, currentSortingKey };\n }\n\n /**\n * Checks for duplicate (traceId, spanId) combinations in the spans table.\n * Returns information about duplicates for logging/CLI purposes.\n */\n async checkForDuplicateSpans(tableName: string): Promise<{\n hasDuplicates: boolean;\n duplicateCount: number;\n }> {\n try {\n // Count duplicate (traceId, spanId) combinations\n const result = await this.client.query({\n query: `\n SELECT count() as duplicate_count\n FROM (\n SELECT traceId, spanId\n FROM ${tableName}\n GROUP BY traceId, spanId\n HAVING count() > 1\n )\n `,\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ duplicate_count: string }>;\n const duplicateCount = parseInt(rows[0]?.duplicate_count ?? '0', 10);\n return {\n hasDuplicates: duplicateCount > 0,\n duplicateCount,\n };\n } catch (error) {\n // If table doesn't exist or other error, assume no duplicates\n this.logger?.debug?.(`Could not check for duplicates: ${error}`);\n return { hasDuplicates: false, duplicateCount: 0 };\n }\n }\n\n /**\n * Migrates the spans table from the old sorting key (createdAt, traceId, spanId)\n * to the new sorting key (traceId, spanId) for proper uniqueness enforcement.\n *\n * This migration:\n * 1. Renames the old table to a backup\n * 2. Creates a new table with the correct sorting key\n * 3. Copies all data from the backup to the new table, deduplicating by (traceId, spanId)\n * using priority-based selection:\n * - First, prefer completed spans (those with endedAt set)\n * - Then prefer the most recently updated span (highest updatedAt)\n * - Finally use creation time as tiebreaker (highest createdAt)\n * 4. Drops the backup table\n *\n * The deduplication strategy matches the PostgreSQL migration (PR #12073) to ensure\n * consistent behavior across storage backends.\n *\n * The migration is idempotent - it only runs if the old sorting key is detected.\n *\n * @returns true if migration was performed, false if not needed\n */\n async migrateSpansTableSortingKey({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<boolean> {\n // Only applies to spans table\n if (tableName !== TABLE_SPANS) {\n return false;\n }\n\n // Check if table exists\n const exists = await this.tableExists(tableName);\n if (!exists) {\n return false;\n }\n\n // Check current sorting key\n const currentSortingKey = await this.getTableSortingKey(tableName);\n if (!currentSortingKey) {\n return false;\n }\n\n // Check if migration is needed - old key starts with createdAt\n // Old format: \"createdAt, traceId, spanId\"\n // New format: \"traceId, spanId\"\n const needsMigration = currentSortingKey.toLowerCase().startsWith('createdat');\n if (!needsMigration) {\n this.logger?.debug?.(`Spans table already has correct sorting key: ${currentSortingKey}`);\n return false;\n }\n\n this.logger?.info?.(`Migrating spans table from sorting key \"${currentSortingKey}\" to \"(traceId, spanId)\"`);\n\n const backupTableName = `${tableName}_backup_${Date.now()}`;\n const rowTtl = this.ttl?.[tableName]?.row;\n\n try {\n // Step 1: Rename old table to backup\n await this.client.command({\n query: `RENAME TABLE ${tableName} TO ${backupTableName}`,\n });\n\n // Step 2: Create new table with correct sorting key\n const columns = Object.entries(schema)\n .map(([name, def]) => {\n let sqlType = this.getSqlType(def.type);\n let isNullable = def.nullable === true;\n\n // Special case: updatedAt must be non-nullable for TABLE_SPANS because\n // ReplacingMergeTree(updatedAt) requires a non-nullable version column.\n if (tableName === TABLE_SPANS && name === 'updatedAt') {\n isNullable = false;\n }\n\n if (isNullable) {\n sqlType = `Nullable(${sqlType})`;\n }\n const constraints = [];\n if (name === 'metadata' && (def.type === 'text' || def.type === 'jsonb') && isNullable) {\n constraints.push(\"DEFAULT '{}'\");\n }\n const columnTtl = this.ttl?.[tableName]?.columns?.[name];\n return `\"${name}\" ${sqlType} ${constraints.join(' ')} ${columnTtl ? `TTL toDateTime(${columnTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${columnTtl.interval} ${columnTtl.unit}` : ''}`;\n })\n .join(',\\n');\n\n const createSql = `\n CREATE TABLE ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (traceId, spanId)\n ORDER BY (traceId, spanId)\n ${rowTtl ? `TTL toDateTime(${rowTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${rowTtl.interval} ${rowTtl.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n\n await this.client.command({\n query: createSql,\n });\n\n // Step 3: Copy data from backup to new table, deduplicating by (traceId, spanId)\n // Get the list of columns that exist in both tables\n const describeResult = await this.client.query({\n query: `DESCRIBE TABLE ${backupTableName}`,\n format: 'JSONEachRow',\n });\n const backupColumns = (await describeResult.json()) as Array<{ name: string }>;\n const backupColumnNames = new Set(backupColumns.map(c => c.name));\n\n // Only copy columns that exist in both tables\n const columnsToInsert = Object.keys(schema).filter(col => backupColumnNames.has(col));\n const columnList = columnsToInsert.map(c => `\"${c}\"`).join(', ');\n\n // Build SELECT expressions, using COALESCE for updatedAt to handle NULL values\n // (updatedAt must be non-nullable for ReplacingMergeTree version column)\n const selectExpressions = columnsToInsert\n .map(c => (c === 'updatedAt' ? `COALESCE(\"updatedAt\", \"createdAt\") as \"updatedAt\"` : `\"${c}\"`))\n .join(', ');\n\n // Use LIMIT BY for deduplication with priority-based selection:\n // 1. Prefer completed spans (those with endedAt not null/empty)\n // 2. Then prefer the most recently updated (highest updatedAt)\n // 3. Then use creation time as final tiebreaker (highest createdAt)\n // This matches the PostgreSQL migration behavior from PR #12073\n await this.client.command({\n query: `INSERT INTO ${tableName} (${columnList})\n SELECT ${selectExpressions}\n FROM ${backupTableName}\n ORDER BY traceId, spanId,\n (endedAt IS NOT NULL AND endedAt != '') DESC,\n COALESCE(updatedAt, createdAt) DESC,\n createdAt DESC\n LIMIT 1 BY traceId, spanId`,\n });\n\n // Step 4: Drop backup table\n await this.client.command({\n query: `DROP TABLE ${backupTableName}`,\n });\n\n this.logger?.info?.(`Successfully migrated spans table to new sorting key`);\n return true;\n } catch (error: any) {\n // Attempt to restore from backup if migration failed partway through\n this.logger?.error?.(`Migration failed: ${error.message}`);\n\n try {\n // Check if original table exists\n const originalExists = await this.tableExists(tableName);\n const backupExists = await this.tableExists(backupTableName);\n\n if (!originalExists && backupExists) {\n // Restore from backup\n this.logger?.info?.(`Restoring spans table from backup`);\n await this.client.command({\n query: `RENAME TABLE ${backupTableName} TO ${tableName}`,\n });\n } else if (originalExists && backupExists) {\n // Both exist - drop backup (new table was created successfully)\n await this.client.command({\n query: `DROP TABLE IF EXISTS ${backupTableName}`,\n });\n }\n } catch (restoreError) {\n this.logger?.error?.(`Failed to restore from backup: ${restoreError}`);\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'MIGRATE_SPANS_SORTING_KEY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, currentSortingKey },\n },\n error,\n );\n }\n }\n\n protected getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n case 'uuid':\n case 'jsonb':\n return 'String';\n case 'timestamp':\n return 'DateTime64(3)';\n case 'integer':\n case 'bigint':\n return 'Int64';\n case 'float':\n return 'Float64';\n case 'boolean':\n return 'Bool';\n default:\n return getSqlType(type); // fallback to base implementation\n }\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n try {\n const columns = Object.entries(schema)\n .map(([name, def]) => {\n let sqlType = this.getSqlType(def.type);\n // Only treat as nullable if explicitly set to true (default is NOT nullable)\n let isNullable = def.nullable === true;\n\n // Special case: updatedAt must be non-nullable for TABLE_SPANS because\n // ReplacingMergeTree(updatedAt) requires a non-nullable version column.\n // Application code already sets updatedAt = createdAt on insert.\n if (tableName === TABLE_SPANS && name === 'updatedAt') {\n isNullable = false;\n }\n\n // Wrap nullable columns in Nullable() to properly support NULL values\n if (isNullable) {\n sqlType = `Nullable(${sqlType})`;\n }\n const constraints = [];\n // Add DEFAULT '{}' for all metadata columns to prevent empty string issues\n // Support both 'text' and 'jsonb' types for backwards compatibility\n // Apply to all tables for consistent behavior and defense-in-depth\n if (name === 'metadata' && (def.type === 'text' || def.type === 'jsonb') && isNullable) {\n constraints.push(\"DEFAULT '{}'\");\n }\n const columnTtl = this.ttl?.[tableName]?.columns?.[name];\n return `\"${name}\" ${sqlType} ${constraints.join(' ')} ${columnTtl ? `TTL toDateTime(${columnTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${columnTtl.interval} ${columnTtl.unit}` : ''}`;\n })\n .join(',\\n');\n\n const rowTtl = this.ttl?.[tableName]?.row;\n let sql: string;\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${['id String'].concat(columns)}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (createdAt, run_id, workflow_name)\n ORDER BY (createdAt, run_id, workflow_name)\n ${rowTtl ? `TTL toDateTime(${rowTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${rowTtl.interval} ${rowTtl.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n } else if (tableName === TABLE_SPANS) {\n // Spans table uses (traceId, spanId) as composite unique key.\n // ORDER BY must be (traceId, spanId) for ReplacingMergeTree to properly deduplicate\n // rows with the same traceId+spanId combination. The engine uses updatedAt as the\n // version column to keep the row with the highest updatedAt during deduplication.\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (traceId, spanId)\n ORDER BY (traceId, spanId)\n ${rowTtl ? `TTL toDateTime(${rowTtl.ttlKey ?? 'createdAt'}) + INTERVAL ${rowTtl.interval} ${rowTtl.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n } else {\n sql = `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (createdAt, ${'id'})\n ORDER BY (createdAt, ${'id'})\n ${this.ttl?.[tableName]?.row ? `TTL toDateTime(createdAt) + INTERVAL ${this.ttl[tableName].row.interval} ${this.ttl[tableName].row.unit}` : ''}\n SETTINGS index_granularity = 8192\n `;\n }\n\n await this.client.query({\n query: sql,\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n try {\n // 1. Get existing columns\n const describeSql = `DESCRIBE TABLE ${tableName}`;\n const result = await this.client.query({\n query: describeSql,\n });\n const rows = await result.json();\n const existingColumnNames = new Set(rows.data.map((row: any) => row.name.toLowerCase()));\n\n // 2. Add missing columns\n for (const columnName of ifNotExists) {\n if (!existingColumnNames.has(columnName.toLowerCase()) && schema[columnName]) {\n const columnDef = schema[columnName];\n let sqlType = this.getSqlType(columnDef.type);\n if (columnDef.nullable !== false) {\n sqlType = `Nullable(${sqlType})`;\n }\n const defaultValue = columnDef.nullable === false ? getDefaultValue(columnDef.type) : '';\n // Use backticks or double quotes as needed for identifiers\n const alterSql =\n `ALTER TABLE ${tableName} ADD COLUMN IF NOT EXISTS \"${columnName}\" ${sqlType} ${defaultValue}`.trim();\n\n await this.client.query({\n query: alterSql,\n });\n this.logger?.debug?.(`Added column ${columnName} to table ${tableName}`);\n }\n }\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'ALTER_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.client.query({\n query: `TRUNCATE TABLE ${tableName}`,\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CLEAR_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n await this.client.query({\n query: `DROP TABLE IF EXISTS ${tableName}`,\n });\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n const rawCreatedAt = record.createdAt || record.created_at || new Date();\n const rawUpdatedAt = record.updatedAt || new Date();\n const createdAt = rawCreatedAt instanceof Date ? rawCreatedAt.toISOString() : rawCreatedAt;\n const updatedAt = rawUpdatedAt instanceof Date ? rawUpdatedAt.toISOString() : rawUpdatedAt;\n\n try {\n await this.client.insert({\n table: tableName,\n values: [\n {\n ...record,\n createdAt,\n updatedAt,\n },\n ],\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n output_format_json_quote_64bit_integers: 0,\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n const recordsToBeInserted = records.map(record => ({\n ...Object.fromEntries(\n Object.entries(record).map(([key, value]) => [\n key,\n // Only convert to Date if it's a timestamp column AND value is not null/undefined\n // new Date(null) returns epoch date, not null, so we must check first\n TABLE_SCHEMAS[tableName as TABLE_NAMES]?.[key]?.type === 'timestamp' && value != null\n ? new Date(value).toISOString()\n : value,\n ]),\n ),\n }));\n\n try {\n await this.client.insert({\n table: tableName,\n values: recordsToBeInserted,\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n try {\n const engine = TABLE_ENGINES[tableName] ?? 'MergeTree()';\n const keyEntries = Object.entries(keys);\n const conditions = keyEntries\n .map(\n ([key]) =>\n `\"${key}\" = {var_${key}:${this.getSqlType(TABLE_SCHEMAS[tableName as TABLE_NAMES]?.[key]?.type ?? 'text')}}`,\n )\n .join(' AND ');\n const values = keyEntries.reduce((acc, [key, value]) => {\n return { ...acc, [`var_${key}`]: value };\n }, {});\n\n const hasUpdatedAt = TABLE_SCHEMAS[tableName as TABLE_NAMES]?.updatedAt;\n\n const selectClause = `SELECT *, toDateTime64(createdAt, 3) as createdAt${hasUpdatedAt ? ', toDateTime64(updatedAt, 3) as updatedAt' : ''}`;\n\n const result = await this.client.query({\n query: `${selectClause} FROM ${tableName} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''} WHERE ${conditions} ORDER BY createdAt DESC LIMIT 1`,\n query_params: values,\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n if (!result) {\n return null;\n }\n\n const rows = await result.json();\n // If this is a workflow snapshot, parse the snapshot field\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const snapshot = rows.data[0] as any;\n if (!snapshot) {\n return null;\n }\n if (typeof snapshot.snapshot === 'string') {\n snapshot.snapshot = JSON.parse(snapshot.snapshot);\n }\n return transformRow(snapshot);\n }\n\n const data: R = transformRow(rows.data[0]);\n return data;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LOAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n} from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { transformRow, transformRows } from '../../db/utils';\n\n/**\n * Serialize metadata object to JSON string for storage in ClickHouse.\n * Ensures we always store valid JSON, defaulting to '{}' for null/undefined.\n */\nfunction serializeMetadata(metadata: Record<string, unknown> | undefined): string {\n if (!metadata || Object.keys(metadata).length === 0) {\n return '{}';\n }\n return JSON.stringify(metadata);\n}\n\n/**\n * Parse metadata JSON string from ClickHouse back to object.\n * Handles empty strings and malformed JSON gracefully.\n */\nfunction parseMetadata(metadata: unknown): Record<string, unknown> {\n if (!metadata) return {};\n if (typeof metadata === 'object') return metadata as Record<string, unknown>;\n if (typeof metadata !== 'string') return {};\n\n const trimmed = metadata.trim();\n if (trimmed === '' || trimmed === 'null') return {};\n\n try {\n return JSON.parse(trimmed);\n } catch {\n return {};\n }\n}\n\nexport class MemoryStorageClickhouse extends MemoryStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.#db.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.#db.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_MESSAGES });\n await this.#db.clearTable({ tableName: TABLE_RESOURCES });\n await this.#db.clearTable({ tableName: TABLE_THREADS });\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) return;\n\n try {\n // Get affected thread IDs before deleting\n const result = await this.client.query({\n query: `SELECT DISTINCT thread_id FROM ${TABLE_MESSAGES} WHERE id IN {messageIds:Array(String)}`,\n query_params: { messageIds },\n format: 'JSONEachRow',\n });\n const rows = (await result.json()) as Array<{ thread_id: string }>;\n const threadIds = rows.map(r => r.thread_id);\n\n // Delete messages\n await this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id IN {messageIds:Array(String)}`,\n query_params: { messageIds },\n });\n\n // Update thread timestamps\n if (threadIds.length > 0) {\n // Remove 'Z' suffix as ClickHouse DateTime64 expects format without timezone suffix\n const now = new Date().toISOString().replace('Z', '');\n await this.client.command({\n query: `ALTER TABLE ${TABLE_THREADS} UPDATE updatedAt = {now:DateTime64(3)} WHERE id IN {threadIds:Array(String)}`,\n query_params: { now, threadIds },\n });\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: messageIds.length },\n },\n error,\n );\n }\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n\n try {\n const result = await this.client.query({\n query: `\n SELECT \n id, \n content, \n role, \n type,\n toDateTime64(createdAt, 3) as createdAt,\n thread_id AS \"threadId\",\n \"resourceId\"\n FROM \"${TABLE_MESSAGES}\"\n WHERE id IN {messageIds:Array(String)}\n ORDER BY \"createdAt\" DESC\n `,\n query_params: {\n messageIds,\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const messages: any[] = transformRows(rows.data);\n\n // Parse message content\n messages.forEach(message => {\n if (typeof message.content === 'string') {\n try {\n message.content = JSON.parse(message.content);\n } catch {\n // If parsing fails, leave as string\n }\n }\n });\n\n const list = new MessageList().add(messages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n }\n }\n\n public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n // Normalize threadId to array, coerce to strings, trim, and filter out empty/non-string values\n const rawThreadIds = Array.isArray(threadId) ? threadId : [threadId];\n const threadIds = rawThreadIds\n .filter(id => id !== undefined && id !== null)\n .map(id => (typeof id === 'string' ? id : String(id)).trim())\n .filter(id => id.length > 0);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n // Validate that we have at least one valid threadId\n if (threadIds.length === 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: Array.isArray(threadId) ? JSON.stringify(threadId) : String(threadId) },\n },\n new Error('threadId must be a non-empty string or array of non-empty strings'),\n );\n }\n\n const perPageForQuery = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPageForQuery);\n\n try {\n // Step 1: Get paginated messages from the thread(s) first (without excluding included ones)\n // Build thread condition for single or multiple threads\n const threadCondition =\n threadIds.length === 1\n ? `thread_id = {threadId0:String}`\n : `thread_id IN (${threadIds.map((_, i) => `{threadId${i}:String}`).join(', ')})`;\n\n let dataQuery = `\n SELECT \n id,\n content,\n role,\n type,\n toDateTime64(createdAt, 3) as createdAt,\n thread_id AS \"threadId\",\n resourceId\n FROM ${TABLE_MESSAGES}\n WHERE ${threadCondition}\n `;\n const dataParams: any = {};\n threadIds.forEach((tid, i) => {\n dataParams[`threadId${i}`] = tid;\n });\n\n if (resourceId) {\n dataQuery += ` AND resourceId = {resourceId:String}`;\n dataParams.resourceId = resourceId;\n }\n\n if (filter?.dateRange?.start) {\n const startDate =\n filter.dateRange.start instanceof Date\n ? filter.dateRange.start.toISOString()\n : new Date(filter.dateRange.start).toISOString();\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n dataQuery += ` AND createdAt ${startOp} parseDateTime64BestEffort({fromDate:String}, 3)`;\n dataParams.fromDate = startDate;\n }\n\n if (filter?.dateRange?.end) {\n const endDate =\n filter.dateRange.end instanceof Date\n ? filter.dateRange.end.toISOString()\n : new Date(filter.dateRange.end).toISOString();\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n dataQuery += ` AND createdAt ${endOp} parseDateTime64BestEffort({toDate:String}, 3)`;\n dataParams.toDate = endDate;\n }\n\n // Build ORDER BY clause\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n dataQuery += ` ORDER BY \"${field}\" ${direction}`;\n\n // Apply pagination\n if (perPageForResponse === false) {\n // Get all messages\n } else {\n dataQuery += ` LIMIT {limit:Int64} OFFSET {offset:Int64}`;\n dataParams.limit = perPageForQuery;\n dataParams.offset = offset;\n }\n\n const result = await this.client.query({\n query: dataQuery,\n query_params: dataParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const paginatedMessages = transformRows<MastraDBMessage>(rows.data);\n const paginatedCount = paginatedMessages.length;\n\n // Get total count\n let countQuery = `SELECT count() as total FROM ${TABLE_MESSAGES} WHERE ${threadCondition}`;\n const countParams: any = {};\n threadIds.forEach((tid, i) => {\n countParams[`threadId${i}`] = tid;\n });\n\n if (resourceId) {\n countQuery += ` AND resourceId = {resourceId:String}`;\n countParams.resourceId = resourceId;\n }\n\n if (filter?.dateRange?.start) {\n const startDate =\n filter.dateRange.start instanceof Date\n ? filter.dateRange.start.toISOString()\n : new Date(filter.dateRange.start).toISOString();\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n countQuery += ` AND createdAt ${startOp} parseDateTime64BestEffort({fromDate:String}, 3)`;\n countParams.fromDate = startDate;\n }\n\n if (filter?.dateRange?.end) {\n const endDate =\n filter.dateRange.end instanceof Date\n ? filter.dateRange.end.toISOString()\n : new Date(filter.dateRange.end).toISOString();\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n countQuery += ` AND createdAt ${endOp} parseDateTime64BestEffort({toDate:String}, 3)`;\n countParams.toDate = endDate;\n }\n\n const countResult = await this.client.query({\n query: countQuery,\n query_params: countParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const countData = await countResult.json();\n const total = (countData as any).data[0].total;\n\n // Only return early if there are no messages AND no includes to process\n if (total === 0 && paginatedCount === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Step 2: Add included messages with context (if any), excluding duplicates\n const messageIds = new Set(paginatedMessages.map((m: MastraDBMessage) => m.id));\n let includeMessages: MastraDBMessage[] = [];\n\n if (include && include.length > 0) {\n // Batch lookup threadIds for includes that don't have one (avoids N+1 queries)\n const includesNeedingThread = include.filter(inc => !inc.threadId);\n const threadByMessageId = new Map<string, string>();\n\n if (includesNeedingThread.length > 0) {\n const { messages: includeLookup } = await this.listMessagesById({\n messageIds: includesNeedingThread.map(inc => inc.id),\n });\n for (const msg of includeLookup) {\n if (msg.threadId) {\n threadByMessageId.set(msg.id, msg.threadId);\n }\n }\n }\n\n const unionQueries: string[] = [];\n const params: any[] = [];\n let paramIdx = 1;\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n\n // Get the threadId for this included message\n // If inc.threadId is provided, use it; otherwise use the batched lookup\n const searchThreadId = inc.threadId ?? threadByMessageId.get(id);\n\n if (!searchThreadId) continue; // Skip if message not found\n\n unionQueries.push(`\n SELECT * FROM (\n WITH numbered_messages AS (\n SELECT\n id, content, role, type, \"createdAt\", thread_id, \"resourceId\",\n ROW_NUMBER() OVER (ORDER BY \"createdAt\" ASC) as row_num\n FROM \"${TABLE_MESSAGES}\"\n WHERE thread_id = {var_thread_id_${paramIdx}:String}\n ),\n target_positions AS (\n SELECT row_num as target_pos\n FROM numbered_messages\n WHERE id = {var_include_id_${paramIdx}:String}\n )\n SELECT DISTINCT m.id, m.content, m.role, m.type, m.\"createdAt\", m.thread_id AS \"threadId\", m.\"resourceId\"\n FROM numbered_messages m\n CROSS JOIN target_positions t\n WHERE m.row_num BETWEEN (t.target_pos - {var_withPreviousMessages_${paramIdx}:Int64}) AND (t.target_pos + {var_withNextMessages_${paramIdx}:Int64})\n ) AS query_${paramIdx}\n `);\n\n params.push(\n { [`var_thread_id_${paramIdx}`]: searchThreadId },\n { [`var_include_id_${paramIdx}`]: id },\n { [`var_withPreviousMessages_${paramIdx}`]: withPreviousMessages },\n { [`var_withNextMessages_${paramIdx}`]: withNextMessages },\n );\n paramIdx++;\n }\n\n // Only run the query if we have any valid includes\n if (unionQueries.length > 0) {\n const finalQuery = unionQueries.join(' UNION ALL ') + ' ORDER BY \"createdAt\" ASC';\n const mergedParams = params.reduce((acc, paramObj) => ({ ...acc, ...paramObj }), {});\n\n const includeResult = await this.client.query({\n query: finalQuery,\n query_params: mergedParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const includeRows = await includeResult.json();\n includeMessages = transformRows<MastraDBMessage>(includeRows.data);\n\n // Deduplicate: only add messages that aren't already in the paginated results\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n paginatedMessages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n }\n\n // Use MessageList for proper deduplication and format conversion to V2\n const list = new MessageList().add(paginatedMessages, 'memory');\n let finalMessages = list.get.all.db();\n\n // Sort all messages (paginated + included) for final output\n finalMessages = finalMessages.sort((a, b) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date((a as any)[field]).getTime() : (a as any)[field];\n const bValue = isDateField ? new Date((b as any)[field]).getTime() : (b as any)[field];\n\n // Handle tiebreaker for stable sorting\n if (aValue === bValue) {\n return a.id.localeCompare(b.id);\n }\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n // Fallback to string comparison for non-numeric fields\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n // Calculate hasMore based on pagination window\n // If all thread messages have been returned (through pagination or include), hasMore = false\n // Otherwise, check if there are more pages in the pagination window\n const threadIdSet = new Set(threadIds);\n const returnedThreadMessageIds = new Set(\n finalMessages.filter(m => m.threadId && threadIdSet.has(m.threadId)).map(m => m.id),\n );\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore =\n perPageForResponse === false ? false : allThreadMessagesReturned ? false : offset + paginatedCount < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n const { messages } = args;\n if (messages.length === 0) return { messages };\n\n for (const message of messages) {\n const resourceId = message.resourceId;\n if (!resourceId) {\n throw new Error('Resource ID is required');\n }\n\n if (!message.threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Check if thread exists\n const thread = await this.getThreadById({ threadId: message.threadId });\n if (!thread) {\n throw new Error(`Thread ${message.threadId} not found`);\n }\n }\n\n const threadIdSet = new Map();\n\n await Promise.all(\n messages.map(async m => {\n const resourceId = m.resourceId;\n if (!resourceId) {\n throw new Error('Resource ID is required');\n }\n\n if (!m.threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Check if thread exists\n const thread = await this.getThreadById({ threadId: m.threadId });\n if (!thread) {\n throw new Error(`Thread ${m.threadId} not found`);\n }\n\n threadIdSet.set(m.threadId, thread);\n }),\n );\n\n try {\n // Clickhouse's MergeTree engine does not support native upserts or unique constraints on (id, thread_id).\n // Note: We cannot switch to ReplacingMergeTree without a schema migration,\n // as it would require altering the table engine.\n // To ensure correct upsert behavior, we first fetch existing (id, thread_id) pairs for the incoming messages.\n const existingResult = await this.client.query({\n query: `SELECT id, thread_id FROM ${TABLE_MESSAGES} WHERE id IN ({ids:Array(String)})`,\n query_params: {\n ids: messages.map(m => m.id),\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n format: 'JSONEachRow',\n });\n const existingRows: Array<{ id: string; thread_id: string }> = await existingResult.json();\n\n const existingSet = new Set(existingRows.map(row => `${row.id}::${row.thread_id}`));\n\n // Partition the batch into different operations:\n // 1. New messages (insert)\n // 2. Existing messages with same (id, threadId) (update)\n // 3. Messages with same id but different threadId (delete old + insert new)\n const toInsert = messages.filter(m => !existingSet.has(`${m.id}::${m.threadId}`));\n const toUpdate = messages.filter(m => existingSet.has(`${m.id}::${m.threadId}`));\n\n // Find messages that need to be moved (same id, different threadId)\n const toMove = messages.filter(m => {\n const existingRow = existingRows.find(row => row.id === m.id);\n return existingRow && existingRow.thread_id !== m.threadId;\n });\n\n // Delete old messages that are being moved\n const deletePromises = toMove.map(message => {\n const existingRow = existingRows.find(row => row.id === message.id);\n if (!existingRow) return Promise.resolve();\n\n return this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id = {var_id:String} AND thread_id = {var_old_thread_id:String}`,\n query_params: {\n var_id: message.id,\n var_old_thread_id: existingRow.thread_id,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n });\n\n const updatePromises = toUpdate.map(message =>\n this.client.command({\n query: `\n ALTER TABLE ${TABLE_MESSAGES}\n UPDATE content = {var_content:String}, role = {var_role:String}, type = {var_type:String}, resourceId = {var_resourceId:String}\n WHERE id = {var_id:String} AND thread_id = {var_thread_id:String}\n `,\n query_params: {\n var_content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n var_role: message.role,\n var_type: message.type || 'v2',\n var_resourceId: message.resourceId,\n var_id: message.id,\n var_thread_id: message.threadId,\n },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n );\n\n // Execute message operations and thread update in parallel for better performance\n await Promise.all([\n // Insert new messages (including moved messages)\n this.client.insert({\n table: TABLE_MESSAGES,\n format: 'JSONEachRow',\n values: toInsert.map(message => ({\n id: message.id,\n thread_id: message.threadId,\n resourceId: message.resourceId,\n content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n createdAt: message.createdAt.toISOString(),\n role: message.role,\n type: message.type || 'v2',\n })),\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n ...updatePromises,\n ...deletePromises,\n // Update thread's updatedAt timestamp\n this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: Array.from(threadIdSet.values()).map(thread => ({\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: serializeMetadata(thread.metadata),\n createdAt: thread.createdAt,\n updatedAt: new Date().toISOString(),\n })),\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n ]);\n\n const list = new MessageList().add(messages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n\n return { messages: list.get.all.db() };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const result = await this.client.query({\n query: `SELECT \n id,\n \"resourceId\",\n title,\n metadata,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt\n FROM \"${TABLE_THREADS}\"\n WHERE id = {var_id:String}\n ORDER BY updatedAt DESC\n LIMIT 1`,\n query_params: { var_id: threadId },\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const thread = transformRow(rows.data[0]) as StorageThreadType;\n\n if (!thread) {\n return null;\n }\n\n return {\n ...thread,\n metadata: parseMetadata(thread.metadata),\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_THREAD_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n // ClickHouse's ReplacingMergeTree may create duplicate rows until background merges run\n // We handle this by always querying for the newest row (ORDER BY updatedAt DESC LIMIT 1)\n await this.client.insert({\n table: TABLE_THREADS,\n values: [\n {\n ...thread,\n metadata: serializeMetadata(thread.metadata),\n createdAt: thread.createdAt.toISOString(),\n updatedAt: thread.updatedAt.toISOString(),\n },\n ],\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n try {\n // First get the existing thread to merge metadata\n const existingThread = await this.getThreadById({ threadId: id });\n if (!existingThread) {\n throw new Error(`Thread ${id} not found`);\n }\n\n // Merge the existing metadata with the new metadata\n const mergedMetadata = {\n ...existingThread.metadata,\n ...metadata,\n };\n\n const updatedThread = {\n ...existingThread,\n title,\n metadata: mergedMetadata,\n updatedAt: new Date(),\n };\n\n await this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: [\n {\n id: updatedThread.id,\n resourceId: updatedThread.resourceId,\n title: updatedThread.title,\n metadata: serializeMetadata(updatedThread.metadata),\n createdAt: updatedThread.createdAt,\n updatedAt: updatedThread.updatedAt.toISOString(),\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return updatedThread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id, title },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n // First delete all messages associated with this thread\n await this.client.command({\n query: `DELETE FROM \"${TABLE_MESSAGES}\" WHERE thread_id = {var_thread_id:String};`,\n query_params: { var_thread_id: threadId },\n clickhouse_settings: {\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Then delete the thread\n await this.client.command({\n query: `DELETE FROM \"${TABLE_THREADS}\" WHERE id = {var_id:String};`,\n query_params: { var_id: threadId },\n clickhouse_settings: {\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n try {\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_THREADS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n },\n error instanceof Error ? error : new Error('Invalid pagination parameters'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n\n // Validate metadata keys to prevent SQL injection\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n },\n error instanceof Error ? error : new Error('Invalid metadata key'),\n );\n }\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n // Build WHERE clauses\n const whereClauses: string[] = [];\n const queryParams: Record<string, any> = {};\n\n if (filter?.resourceId) {\n whereClauses.push('resourceId = {resourceId:String}');\n queryParams.resourceId = filter.resourceId;\n }\n\n // Keys are validated above to prevent SQL injection\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n let metadataIndex = 0;\n for (const [key, value] of Object.entries(filter.metadata)) {\n const paramName = `metadata${metadataIndex}`;\n // Use JSONExtractRaw to compare exact JSON representation\n whereClauses.push(`JSONExtractRaw(metadata, '${key}') = {${paramName}:String}`);\n queryParams[paramName] = JSON.stringify(value);\n metadataIndex++;\n }\n }\n\n // Get total count - count AFTER ranking to ensure we count latest versions only\n const countResult = await this.client.query({\n query: `\n WITH ranked_threads AS (\n SELECT\n id,\n resourceId,\n metadata,\n ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatedAt DESC) as row_num\n FROM ${TABLE_THREADS}\n )\n SELECT count(*) as total \n FROM ranked_threads \n WHERE row_num = 1 ${whereClauses.length > 0 ? `AND ${whereClauses.join(' AND ')}` : ''}\n `,\n query_params: queryParams,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const countData = await countResult.json();\n const total = (countData as any).data[0].total;\n\n if (total === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated threads - get newest version of each thread\n // Important: Apply WHERE filters AFTER row ranking to ensure we filter on latest versions\n const dataResult = await this.client.query({\n query: `\n WITH ranked_threads AS (\n SELECT\n id,\n resourceId,\n title,\n metadata,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatedAt DESC) as row_num\n FROM ${TABLE_THREADS}\n )\n SELECT\n id,\n resourceId,\n title,\n metadata,\n createdAt,\n updatedAt\n FROM ranked_threads\n WHERE row_num = 1 ${whereClauses.length > 0 ? `AND ${whereClauses.join(' AND ')}` : ''}\n ORDER BY \"${field}\" ${direction === 'DESC' ? 'DESC' : 'ASC'}\n LIMIT {perPage:Int64} OFFSET {offset:Int64}\n `,\n query_params: {\n ...queryParams,\n perPage: perPage,\n offset: offset,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await dataResult.json();\n const threads = transformRows<StorageThreadType>(rows.data).map(thread => ({\n ...thread,\n metadata: parseMetadata(thread.metadata),\n }));\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < total,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n ...(filter?.resourceId && { resourceId: filter.resourceId }),\n hasMetadataFilter: !!filter?.metadata,\n page,\n },\n },\n error,\n );\n }\n }\n\n async updateMessages(args: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n threadId?: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n const { messages } = args;\n\n if (messages.length === 0) {\n return [];\n }\n\n try {\n const messageIds = messages.map(m => m.id);\n\n // Get existing messages\n const existingResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id IN (${messageIds.map((_, i) => `{id_${i}:String}`).join(',')})`,\n query_params: messageIds.reduce((acc, m, i) => ({ ...acc, [`id_${i}`]: m }), {}),\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const existingRows = await existingResult.json();\n const existingMessages = transformRows<MastraDBMessage>(existingRows.data);\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n // Parse content from string to object for merging\n const parsedExistingMessages = existingMessages.map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // ignore if not valid json\n }\n }\n return msg;\n });\n\n const threadIdsToUpdate = new Set<string>();\n const updatePromises: Promise<any>[] = [];\n\n for (const existingMessage of parsedExistingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const setClauses: string[] = [];\n const values: any = {};\n let paramIdx = 1;\n let newContent: any = null;\n\n const updatableFields = { ...fieldsToUpdate };\n\n // Special handling for content: merge in code, then update the whole field\n if (updatableFields.content) {\n const existingContent = existingMessage.content || {};\n const existingMetadata = existingContent.metadata || {};\n const updateMetadata = updatableFields.content.metadata || {};\n\n newContent = {\n ...existingContent,\n ...updatableFields.content,\n // Deep merge metadata\n metadata: {\n ...existingMetadata,\n ...updateMetadata,\n },\n };\n\n // Ensure we're updating the content field\n setClauses.push(`content = {var_content_${paramIdx}:String}`);\n values[`var_content_${paramIdx}`] = JSON.stringify(newContent);\n paramIdx++;\n delete updatableFields.content;\n }\n\n // Handle other fields\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbColumn = key === 'threadId' ? 'thread_id' : key;\n setClauses.push(`\"${dbColumn}\" = {var_${key}_${paramIdx}:String}`);\n values[`var_${key}_${paramIdx}`] = updatableFields[key as keyof typeof updatableFields];\n paramIdx++;\n }\n }\n\n if (setClauses.length > 0) {\n values[`var_id_${paramIdx}`] = id;\n\n // Use ALTER TABLE UPDATE for ClickHouse\n const updateQuery = `\n ALTER TABLE ${TABLE_MESSAGES}\n UPDATE ${setClauses.join(', ')}\n WHERE id = {var_id_${paramIdx}:String}\n `;\n\n console.info('Updating message:', id, 'with query:', updateQuery, 'values:', values);\n\n updatePromises.push(\n this.client.command({\n query: updateQuery,\n query_params: values,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n }),\n );\n }\n }\n\n // Execute all updates\n if (updatePromises.length > 0) {\n await Promise.all(updatePromises);\n }\n\n // Optimize table to apply changes immediately\n await this.client.command({\n query: `OPTIMIZE TABLE ${TABLE_MESSAGES} FINAL`,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Verify updates were applied and retry if needed\n for (const existingMessage of parsedExistingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n // Check if the update was actually applied\n const verifyResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId: id },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const verifyRows = await verifyResult.json();\n if (verifyRows.data.length > 0) {\n const updatedMessage = transformRows<MastraDBMessage>(verifyRows.data)[0];\n\n if (updatedMessage) {\n // Check if the update was applied correctly\n let needsRetry = false;\n for (const [key, value] of Object.entries(fieldsToUpdate)) {\n if (key === 'content') {\n // For content updates, check if the content was updated\n const expectedContent = typeof value === 'string' ? value : JSON.stringify(value);\n const actualContent =\n typeof updatedMessage.content === 'string'\n ? updatedMessage.content\n : JSON.stringify(updatedMessage.content);\n if (actualContent !== expectedContent) {\n needsRetry = true;\n break;\n }\n } else if (updatedMessage[key as keyof MastraDBMessage] !== value) {\n needsRetry = true;\n break;\n }\n }\n\n if (needsRetry) {\n console.info('Update not applied correctly, retrying with DELETE + INSERT for message:', id);\n // Use DELETE + INSERT as fallback\n await this.client.command({\n query: `DELETE FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId: id },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Reconstruct the updated content if needed\n let updatedContent = existingMessage.content || {};\n if (fieldsToUpdate.content) {\n const existingContent = existingMessage.content || {};\n const existingMetadata = existingContent.metadata || {};\n const updateMetadata = fieldsToUpdate.content.metadata || {};\n\n updatedContent = {\n ...existingContent,\n ...fieldsToUpdate.content,\n metadata: {\n ...existingMetadata,\n ...updateMetadata,\n },\n };\n }\n\n const updatedMessageData = {\n ...existingMessage,\n ...fieldsToUpdate,\n content: updatedContent,\n };\n\n await this.client.insert({\n table: TABLE_MESSAGES,\n format: 'JSONEachRow',\n values: [\n {\n id: updatedMessageData.id,\n thread_id: updatedMessageData.threadId,\n resourceId: updatedMessageData.resourceId,\n content:\n typeof updatedMessageData.content === 'string'\n ? updatedMessageData.content\n : JSON.stringify(updatedMessageData.content),\n createdAt: updatedMessageData.createdAt.toISOString(),\n role: updatedMessageData.role,\n type: updatedMessageData.type || 'v2',\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n }\n }\n }\n\n // Update thread timestamps with a small delay to ensure timestamp difference\n if (threadIdsToUpdate.size > 0) {\n // Add a small delay to ensure timestamp difference\n await new Promise(resolve => setTimeout(resolve, 10));\n\n const now = new Date().toISOString().replace('Z', '');\n\n // Get existing threads to preserve their data\n const threadUpdatePromises = Array.from(threadIdsToUpdate).map(async threadId => {\n // Get existing thread data - get newest version by updatedAt\n const threadResult = await this.client.query({\n query: `SELECT id, resourceId, title, metadata, createdAt FROM ${TABLE_THREADS} WHERE id = {threadId:String} ORDER BY updatedAt DESC LIMIT 1`,\n query_params: { threadId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const threadRows = await threadResult.json();\n if (threadRows.data.length > 0) {\n const existingThread = threadRows.data[0] as any;\n\n // Delete existing thread\n await this.client.command({\n query: `DELETE FROM ${TABLE_THREADS} WHERE id = {threadId:String}`,\n query_params: { threadId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Insert updated thread with new timestamp\n await this.client.insert({\n table: TABLE_THREADS,\n format: 'JSONEachRow',\n values: [\n {\n id: existingThread.id,\n resourceId: existingThread.resourceId,\n title: existingThread.title,\n metadata:\n typeof existingThread.metadata === 'string'\n ? existingThread.metadata\n : serializeMetadata(existingThread.metadata as Record<string, unknown>),\n createdAt: existingThread.createdAt,\n updatedAt: now,\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n });\n\n await Promise.all(threadUpdatePromises);\n }\n\n // Re-fetch to return the fully updated messages\n const updatedMessages: MastraDBMessage[] = [];\n for (const messageId of messageIds) {\n const updatedResult = await this.client.query({\n query: `SELECT id, content, role, type, \"createdAt\", thread_id AS \"threadId\", \"resourceId\" FROM ${TABLE_MESSAGES} WHERE id = {messageId:String}`,\n query_params: { messageId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const updatedRows = await updatedResult.json();\n if (updatedRows.data.length > 0) {\n const message = transformRows<MastraDBMessage>(updatedRows.data)[0];\n if (message) {\n updatedMessages.push(message);\n }\n }\n }\n\n // Parse content back to objects\n return updatedMessages.map(message => {\n if (typeof message.content === 'string') {\n try {\n message.content = JSON.parse(message.content);\n } catch {\n // ignore if not valid json\n }\n }\n return message;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messages.map(m => m.id).join(',') },\n },\n error,\n );\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const result = await this.client.query({\n query: `SELECT id, workingMemory, metadata, createdAt, updatedAt FROM ${TABLE_RESOURCES} WHERE id = {resourceId:String} ORDER BY updatedAt DESC LIMIT 1`,\n query_params: { resourceId },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n if (rows.data.length === 0) {\n return null;\n }\n\n const resource = rows.data[0] as any;\n return {\n id: resource.id,\n workingMemory:\n resource.workingMemory && typeof resource.workingMemory === 'object'\n ? JSON.stringify(resource.workingMemory)\n : resource.workingMemory,\n metadata: parseMetadata(resource.metadata),\n createdAt: new Date(resource.createdAt),\n updatedAt: new Date(resource.updatedAt),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_RESOURCE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n await this.client.insert({\n table: TABLE_RESOURCES,\n format: 'JSONEachRow',\n values: [\n {\n id: resource.id,\n workingMemory: resource.workingMemory,\n metadata: serializeMetadata(resource.metadata),\n createdAt: resource.createdAt.toISOString(),\n updatedAt: resource.updatedAt.toISOString(),\n },\n ],\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Return resource with normalized metadata\n return {\n ...resource,\n metadata: resource.metadata || {},\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: resource.id },\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n try {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n // Create new resource if it doesn't exist\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n // Use ALTER TABLE UPDATE for ClickHouse\n const updateQuery = `\n ALTER TABLE ${TABLE_RESOURCES}\n UPDATE workingMemory = {workingMemory:String}, metadata = {metadata:String}, updatedAt = {updatedAt:String}\n WHERE id = {resourceId:String}\n `;\n\n await this.client.command({\n query: updateQuery,\n query_params: {\n workingMemory: updatedResource.workingMemory,\n metadata: JSON.stringify(updatedResource.metadata),\n updatedAt: updatedResource.updatedAt.toISOString().replace('Z', ''),\n resourceId,\n },\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n // Optimize table to apply changes\n await this.client.command({\n query: `OPTIMIZE TABLE ${TABLE_RESOURCES} FINAL`,\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n return updatedResource;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n SPAN_SCHEMA,\n TABLE_SPANS,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n SpanRecord,\n ListTracesArgs,\n PaginationInfo,\n TracingStorageStrategy,\n UpdateSpanArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n BatchCreateSpansArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n} from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { TABLE_ENGINES, transformRows } from '../../db/utils';\n\nexport class ObservabilityStorageClickhouse extends ObservabilityStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n // Check if migration is needed (table exists with old sorting key)\n const migrationStatus = await this.#db.checkSpansMigrationStatus(TABLE_SPANS);\n\n if (migrationStatus.needsMigration) {\n // ClickHouse requires table recreation to change sorting key - always require manual migration\n // Unlike other databases where we can just add a unique constraint, ClickHouse's\n // ReplacingMergeTree engine requires the sorting key to be set at table creation time.\n // This means we need to: 1) Create a new table with correct sorting key, 2) Copy data,\n // 3) Drop old table, 4) Rename new table. This is a destructive operation that should\n // only be done explicitly by the user.\n\n // Check for duplicates to provide more helpful error message\n const duplicateInfo = await this.#db.checkForDuplicateSpans(TABLE_SPANS);\n const duplicateMessage = duplicateInfo.hasDuplicates\n ? `\\nFound ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations that will be removed.\\n`\n : '';\n\n const errorMessage =\n `\\n` +\n `===========================================================================\\n` +\n `MIGRATION REQUIRED: ClickHouse spans table needs sorting key update\\n` +\n `===========================================================================\\n` +\n `\\n` +\n `The spans table structure has changed. ClickHouse requires a table recreation\\n` +\n `to update the sorting key from (traceId) to (traceId, spanId).\\n` +\n duplicateMessage +\n `\\n` +\n `To fix this, run the manual migration command:\\n` +\n `\\n` +\n ` npx mastra migrate\\n` +\n `\\n` +\n `This command will:\\n` +\n ` 1. Create a new table with the correct sorting key\\n` +\n ` 2. Copy data from the old table (deduplicating if needed)\\n` +\n ` 3. Replace the old table with the new one\\n` +\n `\\n` +\n `WARNING: This migration involves table recreation and may take significant\\n` +\n `time for large tables. Please ensure you have a backup before proceeding.\\n` +\n `===========================================================================\\n`;\n\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'MIGRATION_REQUIRED', 'SORTING_KEY_CHANGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: errorMessage,\n });\n }\n\n // Create the table (or add missing columns if it already exists)\n await this.#db.createTable({ tableName: TABLE_SPANS, schema: SPAN_SCHEMA });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SPANS });\n }\n\n /**\n * Manually run the spans migration to deduplicate and update the sorting key.\n * This is intended to be called from the CLI when duplicates are detected.\n *\n * @returns Migration result with status and details\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n // Check if migration is needed\n const migrationStatus = await this.#db.checkSpansMigrationStatus(TABLE_SPANS);\n\n if (!migrationStatus.needsMigration) {\n return {\n success: true,\n alreadyMigrated: true,\n duplicatesRemoved: 0,\n message: `Migration already complete. Spans table has correct sorting key.`,\n };\n }\n\n // Check for duplicates (for reporting purposes)\n const duplicateInfo = await this.#db.checkForDuplicateSpans(TABLE_SPANS);\n\n if (duplicateInfo.hasDuplicates) {\n this.logger?.info?.(\n `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations. Starting migration with deduplication...`,\n );\n } else {\n this.logger?.info?.(`No duplicate spans found. Starting sorting key migration...`);\n }\n\n // Run the migration (which includes deduplication)\n await this.#db.migrateSpansTableSortingKey({ tableName: TABLE_SPANS, schema: SPAN_SCHEMA });\n\n return {\n success: true,\n alreadyMigrated: false,\n duplicatesRemoved: duplicateInfo.duplicateCount,\n message: duplicateInfo.hasDuplicates\n ? `Migration complete. Removed duplicates and updated sorting key for ${TABLE_SPANS}.`\n : `Migration complete. Updated sorting key for ${TABLE_SPANS}.`,\n };\n }\n\n /**\n * Check migration status for the spans table.\n * Returns information about whether migration is needed.\n */\n async checkSpansMigrationStatus(): Promise<{\n needsMigration: boolean;\n hasDuplicates: boolean;\n duplicateCount: number;\n constraintExists: boolean;\n tableName: string;\n }> {\n const migrationStatus = await this.#db.checkSpansMigrationStatus(TABLE_SPANS);\n\n if (!migrationStatus.needsMigration) {\n return {\n needsMigration: false,\n hasDuplicates: false,\n duplicateCount: 0,\n constraintExists: true,\n tableName: TABLE_SPANS,\n };\n }\n\n const duplicateInfo = await this.#db.checkForDuplicateSpans(TABLE_SPANS);\n return {\n needsMigration: true,\n hasDuplicates: duplicateInfo.hasDuplicates,\n duplicateCount: duplicateInfo.duplicateCount,\n constraintExists: false,\n tableName: TABLE_SPANS,\n };\n }\n\n public override get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n // ClickHouse is optimized for append-only workloads, so the tracing exporter\n // should use insert-only mode (wait for trace-end events, then insert complete spans).\n // Note: updateSpan/batchUpdateSpans are still available for manual modifications.\n return {\n preferred: 'insert-only',\n supported: ['insert-only'],\n };\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n try {\n const now = Date.now();\n const record = {\n ...span,\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n startedAt: span.startedAt instanceof Date ? span.startedAt.getTime() : span.startedAt,\n endedAt: span.endedAt instanceof Date ? span.endedAt.getTime() : span.endedAt,\n createdAt: now,\n updatedAt: now,\n };\n await this.#db.insert({ tableName: TABLE_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CREATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n spanName: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String} AND spanId = {spanId:String}\n LIMIT 1\n `,\n query_params: { traceId, spanId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n const spans = transformRows(rows) as SpanRecord[];\n const span = spans[0];\n if (!span) {\n return null;\n }\n return { span };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n\n async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n const { traceId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String} AND (parentSpanId IS NULL OR parentSpanId = '')\n LIMIT 1\n `,\n query_params: { traceId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n const spans = transformRows(rows) as SpanRecord[];\n const span = spans[0];\n if (!span) {\n return null;\n }\n return { span };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_ROOT_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const { traceId } = args;\n try {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${engine.startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n WHERE traceId = {traceId:String}\n ORDER BY startedAt DESC\n `,\n query_params: { traceId },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: transformRows(rows) as SpanRecord[],\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async updateSpan(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n try {\n // Load existing span\n const existing = await this.#db.load<SpanRecord>({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n });\n\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_SPAN', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { spanId, traceId },\n });\n }\n\n // Handle Date conversions to millisecond timestamps for DateTime64(3)\n const data: Record<string, any> = { ...updates };\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.getTime();\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.getTime();\n }\n\n // Merge updates and re-insert (ClickHouse uses ReplacingMergeTree)\n const updated = {\n ...existing,\n ...data,\n updatedAt: Date.now(),\n };\n\n await this.client.insert({\n table: TABLE_SPANS,\n values: [updated],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { spanId, traceId },\n },\n error,\n );\n }\n }\n\n async listTraces(args: ListTracesArgs): Promise<{ pagination: PaginationInfo; spans: SpanRecord[] }> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const { page, perPage } = pagination;\n\n try {\n // ClickHouse stores null strings as empty strings, so check for both\n const conditions: string[] = [`(parentSpanId IS NULL OR parentSpanId = '')`];\n const values: Record<string, any> = {};\n let paramIndex = 0;\n\n if (filters) {\n // Date range filters\n if (filters.startedAt?.start) {\n conditions.push(`startedAt >= {startedAtStart:DateTime64(3)}`);\n // Use Unix timestamp in milliseconds for DateTime64(3)\n values.startedAtStart = filters.startedAt.start.getTime();\n }\n if (filters.startedAt?.end) {\n conditions.push(`startedAt <= {startedAtEnd:DateTime64(3)}`);\n values.startedAtEnd = filters.startedAt.end.getTime();\n }\n if (filters.endedAt?.start) {\n conditions.push(`endedAt >= {endedAtStart:DateTime64(3)}`);\n values.endedAtStart = filters.endedAt.start.getTime();\n }\n if (filters.endedAt?.end) {\n conditions.push(`endedAt <= {endedAtEnd:DateTime64(3)}`);\n values.endedAtEnd = filters.endedAt.end.getTime();\n }\n\n // Span type filter\n if (filters.spanType !== undefined) {\n conditions.push(`spanType = {spanType:String}`);\n values.spanType = filters.spanType;\n }\n\n // Entity filters\n if (filters.entityType !== undefined) {\n conditions.push(`entityType = {entityType:String}`);\n values.entityType = filters.entityType;\n }\n if (filters.entityId !== undefined) {\n conditions.push(`entityId = {entityId:String}`);\n values.entityId = filters.entityId;\n }\n if (filters.entityName !== undefined) {\n conditions.push(`entityName = {entityName:String}`);\n values.entityName = filters.entityName;\n }\n\n // Identity & Tenancy filters\n if (filters.userId !== undefined) {\n conditions.push(`userId = {userId:String}`);\n values.userId = filters.userId;\n }\n if (filters.organizationId !== undefined) {\n conditions.push(`organizationId = {organizationId:String}`);\n values.organizationId = filters.organizationId;\n }\n if (filters.resourceId !== undefined) {\n conditions.push(`resourceId = {resourceId:String}`);\n values.resourceId = filters.resourceId;\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined) {\n conditions.push(`runId = {runId:String}`);\n values.runId = filters.runId;\n }\n if (filters.sessionId !== undefined) {\n conditions.push(`sessionId = {sessionId:String}`);\n values.sessionId = filters.sessionId;\n }\n if (filters.threadId !== undefined) {\n conditions.push(`threadId = {threadId:String}`);\n values.threadId = filters.threadId;\n }\n if (filters.requestId !== undefined) {\n conditions.push(`requestId = {requestId:String}`);\n values.requestId = filters.requestId;\n }\n\n // Deployment context filters\n if (filters.environment !== undefined) {\n conditions.push(`environment = {environment:String}`);\n values.environment = filters.environment;\n }\n if (filters.source !== undefined) {\n conditions.push(`source = {source:String}`);\n values.source = filters.source;\n }\n if (filters.serviceName !== undefined) {\n conditions.push(`serviceName = {serviceName:String}`);\n values.serviceName = filters.serviceName;\n }\n\n // Scope filter (JSON field - use JSONExtractString for each key)\n if (filters.scope != null) {\n for (const [key, value] of Object.entries(filters.scope)) {\n // Validate key to prevent injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n const paramName = `scope_${key}_${paramIndex++}`;\n conditions.push(`JSONExtractString(scope, '${key}') = {${paramName}:String}`);\n values[paramName] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Metadata filter (JSON field)\n if (filters.metadata != null) {\n for (const [key, value] of Object.entries(filters.metadata)) {\n // Validate key to prevent injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n const paramName = `metadata_${key}_${paramIndex++}`;\n conditions.push(`JSONExtractString(metadata, '${key}') = {${paramName}:String}`);\n values[paramName] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Tags filter (all tags must be present)\n // ClickHouse stores tags as JSON array string, use JSONExtract to check\n if (filters.tags != null && filters.tags.length > 0) {\n for (const tag of filters.tags) {\n const paramName = `tag_${paramIndex++}`;\n conditions.push(`has(JSONExtract(tags, 'Array(String)'), {${paramName}:String})`);\n values[paramName] = tag;\n }\n }\n\n // Status filter (derived from error and endedAt)\n if (filters.status !== undefined) {\n switch (filters.status) {\n case TraceStatus.ERROR:\n // ClickHouse stores null as empty string for String columns\n conditions.push(`(error IS NOT NULL AND error != '')`);\n break;\n case TraceStatus.RUNNING:\n // endedAt is DateTime64 - only check for NULL (not empty string)\n // error is String - check for both NULL and empty string\n conditions.push(`endedAt IS NULL AND (error IS NULL OR error = '')`);\n break;\n case TraceStatus.SUCCESS:\n // endedAt is DateTime64 - only check for NULL (not empty string)\n // error is String - check for both NULL and empty string\n conditions.push(`endedAt IS NOT NULL AND (error IS NULL OR error = '')`);\n break;\n }\n }\n\n // hasChildError filter (requires subquery)\n if (filters.hasChildError !== undefined) {\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const finalClause = engine.startsWith('ReplacingMergeTree') ? 'FINAL' : '';\n if (filters.hasChildError) {\n conditions.push(`EXISTS (\n SELECT 1 FROM ${TABLE_SPANS} ${finalClause} c\n WHERE c.traceId = ${TABLE_SPANS}.traceId AND c.error IS NOT NULL AND c.error != ''\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${TABLE_SPANS} ${finalClause} c\n WHERE c.traceId = ${TABLE_SPANS}.traceId AND c.error IS NOT NULL AND c.error != ''\n )`);\n }\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const engine = TABLE_ENGINES[TABLE_SPANS] ?? 'MergeTree()';\n const finalClause = engine.startsWith('ReplacingMergeTree') ? 'FINAL' : '';\n\n // Order by clause with proper NULL handling for endedAt\n // For endedAt DESC: NULLs FIRST (running spans on top when viewing newest)\n // For endedAt ASC: NULLs LAST (running spans at end when viewing oldest)\n // startedAt is never null (required field), so no special handling needed\n // Note: endedAt is DateTime64 - only check for NULL (not empty string like String columns)\n const sortField = orderBy.field;\n const sortDirection = orderBy.direction;\n let orderClause: string;\n if (sortField === 'endedAt') {\n // Use CASE WHEN to handle NULLs for endedAt (DateTime64 column)\n // DESC: NULLs first (0 sorts before 1)\n // ASC: NULLs last (1 sorts after 0)\n const nullSortValue = sortDirection === 'DESC' ? 0 : 1;\n const nonNullSortValue = sortDirection === 'DESC' ? 1 : 0;\n orderClause = `ORDER BY CASE WHEN ${sortField} IS NULL THEN ${nullSortValue} ELSE ${nonNullSortValue} END, ${sortField} ${sortDirection}`;\n } else {\n orderClause = `ORDER BY ${sortField} ${sortDirection}`;\n }\n\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SPANS} ${finalClause} ${whereClause}`,\n query_params: values,\n format: 'JSONEachRow',\n });\n const countRows = (await countResult.json()) as Array<{ count: string | number }>;\n const total = Number(countRows[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: { total: 0, page, perPage, hasMore: false },\n spans: [],\n };\n }\n\n // Get paginated results\n const result = await this.client.query({\n query: `\n SELECT *\n FROM ${TABLE_SPANS} ${finalClause}\n ${whereClause}\n ${orderClause}\n LIMIT {limit:UInt32}\n OFFSET {offset:UInt32}\n `,\n query_params: { ...values, limit: perPage, offset: page * perPage },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = (await result.json()) as any[];\n const spans = transformRows(rows) as SpanRecord[];\n\n return {\n pagination: {\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n },\n spans,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n const now = Date.now();\n await this.#db.batchInsert({\n tableName: TABLE_SPANS,\n records: args.records.map(record => ({\n ...record,\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n startedAt: record.startedAt instanceof Date ? record.startedAt.getTime() : record.startedAt,\n endedAt: record.endedAt instanceof Date ? record.endedAt.getTime() : record.endedAt,\n createdAt: now,\n updatedAt: now,\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_CREATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n try {\n const now = Date.now();\n\n // Note: ClickHouse doesn't support traditional UPDATE operations with MergeTree engines.\n // Updates are performed by loading existing data, merging changes, and re-inserting.\n // This sequential processing may be slow for large batches - consider batching at the\n // application level if high-volume updates are needed.\n // For each update, load existing, merge, and re-insert\n for (const record of args.records) {\n const existing = await this.#db.load<SpanRecord>({\n tableName: TABLE_SPANS,\n keys: { spanId: record.spanId, traceId: record.traceId },\n });\n\n if (existing) {\n // Convert Date objects to millisecond timestamps for DateTime64(3)\n const updates: Record<string, any> = { ...record.updates };\n if (updates.startedAt instanceof Date) {\n updates.startedAt = updates.startedAt.getTime();\n }\n if (updates.endedAt instanceof Date) {\n updates.endedAt = updates.endedAt.getTime();\n }\n\n const updated = {\n ...existing,\n ...updates,\n updatedAt: now,\n };\n\n await this.client.insert({\n table: TABLE_SPANS,\n values: [updated],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_UPDATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n try {\n if (args.traceIds.length === 0) return;\n\n await this.client.command({\n query: `DELETE FROM ${TABLE_SPANS} WHERE traceId IN {traceIds:Array(String)}`,\n query_params: { traceIds: args.traceIds },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport {\n createStorageErrorId,\n ScoresStorage,\n SCORERS_SCHEMA,\n TABLE_SCORERS,\n calculatePagination,\n normalizePerPage,\n transformScoreRow as coreTransformScoreRow,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\n\nexport class ScoresStorageClickhouse extends ScoresStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SCORERS, schema: TABLE_SCHEMAS[TABLE_SCORERS] });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SCORERS });\n }\n\n /**\n * ClickHouse-specific score row transformation.\n * Converts timestamps to Date objects and filters out '_null_' values.\n */\n private transformScoreRow(row: any): ScoreRowData {\n return coreTransformScoreRow(row, {\n convertTimestamps: true,\n nullValuePattern: '_null_',\n });\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE id = {var_id:String}`,\n query_params: { var_id: id },\n format: 'JSONEachRow',\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const resultJson = await result.json();\n if (!Array.isArray(resultJson) || resultJson.length === 0) {\n return null;\n }\n\n return this.transformScoreRow(resultJson[0]);\n // return this.parseScoreRow(resultJson[0]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId: id },\n },\n error,\n );\n }\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let parsedScore: SaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n const now = new Date();\n const id = crypto.randomUUID();\n const createdAt = now;\n const updatedAt = now;\n\n try {\n // Build record from schema columns, converting undefined to null for ClickHouse\n const record: Record<string, unknown> = {};\n for (const key of Object.keys(SCORERS_SCHEMA)) {\n if (key === 'id') {\n record[key] = id;\n continue;\n }\n if (key === 'createdAt' || key === 'updatedAt') {\n record[key] = now.toISOString();\n continue;\n }\n const value = parsedScore[key as keyof typeof parsedScore];\n record[key] = value === undefined || value === null ? '_null_' : value;\n }\n\n await this.client.insert({\n table: TABLE_SCORERS,\n values: [record],\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n return { score: { ...parsedScore, id, createdAt, updatedAt } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId: id },\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE runId = {var_runId:String}`,\n query_params: { var_runId: runId },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE runId = {var_runId:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_runId: runId,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_RUN_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId },\n },\n error,\n );\n }\n }\n\n async listScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<ListScoresResponse> {\n let whereClause = `scorerId = {var_scorerId:String}`;\n if (entityId) {\n whereClause += ` AND entityId = {var_entityId:String}`;\n }\n if (entityType) {\n whereClause += ` AND entityType = {var_entityType:String}`;\n }\n if (source) {\n whereClause += ` AND source = {var_source:String}`;\n }\n\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE ${whereClause}`,\n query_params: {\n var_scorerId: scorerId,\n var_entityId: entityId,\n var_entityType: entityType,\n var_source: source,\n },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE ${whereClause} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_scorerId: scorerId,\n var_limit: limitValue,\n var_offset: start,\n var_entityId: entityId,\n var_entityType: entityType,\n var_source: source,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_SCORER_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerId },\n },\n error,\n );\n }\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<ListScoresResponse> {\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE entityId = {var_entityId:String} AND entityType = {var_entityType:String}`,\n query_params: { var_entityId: entityId, var_entityType: entityType },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n // Get paginated results\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE entityId = {var_entityId:String} AND entityType = {var_entityType:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_entityId: entityId,\n var_entityType: entityType,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_ENTITY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityId, entityType },\n },\n error,\n );\n }\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE traceId = {var_traceId:String} AND spanId = {var_spanId:String}`,\n query_params: {\n var_traceId: traceId,\n var_spanId: spanId,\n },\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n let total = 0;\n if (Array.isArray(countRows) && countRows.length > 0 && countRows[0]) {\n const countObj = countRows[0] as { count: string | number };\n total = Number(countObj.count);\n }\n\n const { page, perPage: perPageInput } = pagination;\n\n if (!total) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.query({\n query: `SELECT * FROM ${TABLE_SCORERS} WHERE traceId = {var_traceId:String} AND spanId = {var_spanId:String} ORDER BY createdAt DESC LIMIT {var_limit:Int64} OFFSET {var_offset:Int64}`,\n query_params: {\n var_traceId: traceId,\n var_spanId: spanId,\n var_limit: limitValue,\n var_offset: start,\n },\n format: 'JSONEachRow',\n clickhouse_settings: {\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n\n const rows = await result.json();\n const scores = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_SCORES_BY_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n WorkflowsStorage,\n} from '@mastra/core/storage';\nimport type {\n WorkflowRun,\n WorkflowRuns,\n StorageListWorkflowRunsInput,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { ClickhouseDB, resolveClickhouseConfig } from '../../db';\nimport type { ClickhouseDomainConfig } from '../../db';\nimport { TABLE_ENGINES } from '../../db/utils';\n\nexport class WorkflowsStorageClickhouse extends WorkflowsStorage {\n protected client: ClickHouseClient;\n #db: ClickhouseDB;\n constructor(config: ClickhouseDomainConfig) {\n super();\n const { client, ttl } = resolveClickhouseConfig(config);\n this.client = client;\n this.#db = new ClickhouseDB({ client, ttl });\n }\n\n async init(): Promise<void> {\n const schema = TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT];\n await this.#db.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema,\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n // Load existing snapshot\n let snapshot = await this.loadWorkflowSnapshot({ workflowName, runId });\n\n if (!snapshot) {\n // Create new snapshot if none exists\n snapshot = {\n context: {},\n activePaths: [],\n timestamp: Date.now(),\n suspendedPaths: {},\n activeStepsPath: {},\n resumeLabels: {},\n serializedStepGraph: [],\n status: 'pending',\n value: {},\n waitingPaths: {},\n runId: runId,\n requestContext: {},\n } as WorkflowRunState;\n }\n\n // Merge the new step result and request context\n snapshot.context[stepId] = result;\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n\n // Persist updated snapshot\n await this.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n\n return snapshot.context;\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n // Load existing snapshot\n const snapshot = await this.loadWorkflowSnapshot({ workflowName, runId });\n\n if (!snapshot) {\n return undefined;\n }\n\n if (!snapshot.context) {\n throw new MastraError({\n id: createStorageErrorId('CLICKHOUSE', 'UPDATE_WORKFLOW_STATE', 'CONTEXT_MISSING'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Snapshot context is missing for runId ${runId}`,\n });\n }\n\n // Merge the new options with the existing snapshot\n const updatedSnapshot = { ...snapshot, ...opts };\n\n // Persist updated snapshot\n await this.persistWorkflowSnapshot({ workflowName, runId, snapshot: updatedSnapshot });\n\n return updatedSnapshot;\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n try {\n const currentSnapshot = await this.#db.load({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n const now = new Date();\n const persisting = currentSnapshot\n ? {\n ...currentSnapshot,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n updatedAt: (updatedAt ?? now).toISOString(),\n }\n : {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n createdAt: (createdAt ?? now).toISOString(),\n updatedAt: (updatedAt ?? now).toISOString(),\n };\n\n await this.client.insert({\n table: TABLE_WORKFLOW_SNAPSHOT,\n format: 'JSONEachRow',\n values: [persisting],\n clickhouse_settings: {\n // Allows to insert serialized JS Dates (such as '2023-12-06T10:54:48.000Z')\n date_time_input_format: 'best_effort',\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'PERSIST_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const result = await this.#db.load({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n if (!result) {\n return null;\n }\n\n return (result as any).snapshot;\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LOAD_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n private parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\n } catch (e) {\n // If parsing fails, return the raw snapshot string\n this.logger.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name,\n runId: row.run_id,\n snapshot: parsedSnapshot,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n resourceId: row.resourceId,\n };\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n page,\n perPage,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n try {\n const conditions: string[] = [];\n const values: Record<string, any> = {};\n\n if (workflowName) {\n conditions.push(`workflow_name = {var_workflow_name:String}`);\n values.var_workflow_name = workflowName;\n }\n\n if (status) {\n conditions.push(`JSONExtractString(snapshot, 'status') = {var_status:String}`);\n values.var_status = status;\n }\n\n if (resourceId) {\n const hasResourceId = await this.#db.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'resourceId');\n if (hasResourceId) {\n conditions.push(`resourceId = {var_resourceId:String}`);\n values.var_resourceId = resourceId;\n } else {\n this.logger.warn(`[${TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);\n }\n }\n\n if (fromDate) {\n conditions.push(`createdAt >= {var_from_date:DateTime64(3)}`);\n values.var_from_date = fromDate.getTime() / 1000; // Convert to Unix timestamp\n }\n\n if (toDate) {\n conditions.push(`createdAt <= {var_to_date:DateTime64(3)}`);\n values.var_to_date = toDate.getTime() / 1000; // Convert to Unix timestamp\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const usePagination = perPage !== undefined && page !== undefined;\n const normalizedPerPage = usePagination ? normalizePerPage(perPage, Number.MAX_SAFE_INTEGER) : 0;\n const offset = usePagination ? page * normalizedPerPage : 0;\n const limitClause = usePagination ? `LIMIT ${normalizedPerPage}` : '';\n const offsetClause = usePagination ? `OFFSET ${offset}` : '';\n\n let total = 0;\n // Only get total count when using pagination\n if (usePagination) {\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''} ${whereClause}`,\n query_params: values,\n format: 'JSONEachRow',\n });\n const countRows = await countResult.json();\n total = Number((countRows as Array<{ count: string | number }>)[0]?.count ?? 0);\n }\n\n // Get results\n const result = await this.client.query({\n query: `\n SELECT \n workflow_name,\n run_id,\n snapshot,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n resourceId\n FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n ${whereClause}\n ORDER BY createdAt DESC\n ${limitClause}\n ${offsetClause}\n `,\n query_params: values,\n format: 'JSONEachRow',\n });\n\n const resultJson = await result.json();\n const rows = resultJson as any[];\n const runs = rows.map(row => {\n return this.parseWorkflowRun(row);\n });\n\n // Use runs.length as total when not paginating\n return { runs, total: total || runs.length };\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName: workflowName ?? '', resourceId: resourceId ?? '' },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n try {\n const conditions: string[] = [];\n const values: Record<string, any> = {};\n\n if (runId) {\n conditions.push(`run_id = {var_runId:String}`);\n values.var_runId = runId;\n }\n\n if (workflowName) {\n conditions.push(`workflow_name = {var_workflow_name:String}`);\n values.var_workflow_name = workflowName;\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get results\n const result = await this.client.query({\n query: `\n SELECT \n workflow_name,\n run_id,\n snapshot,\n toDateTime64(createdAt, 3) as createdAt,\n toDateTime64(updatedAt, 3) as updatedAt,\n resourceId\n FROM ${TABLE_WORKFLOW_SNAPSHOT} ${TABLE_ENGINES[TABLE_WORKFLOW_SNAPSHOT].startsWith('ReplacingMergeTree') ? 'FINAL' : ''}\n ${whereClause}\n ORDER BY createdAt DESC LIMIT 1\n `,\n query_params: values,\n format: 'JSONEachRow',\n });\n\n const resultJson = await result.json();\n if (!Array.isArray(resultJson) || resultJson.length === 0) {\n return null;\n }\n return this.parseWorkflowRun(resultJson[0]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: runId ?? '', workflowName: workflowName ?? '' },\n },\n error,\n );\n }\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n try {\n const values: Record<string, any> = {\n var_runId: runId,\n var_workflow_name: workflowName,\n };\n\n await this.client.command({\n query: `DELETE FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE run_id = {var_runId:String} AND workflow_name = {var_workflow_name:String}`,\n query_params: values,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }\n}\n","import type { ClickHouseClient, ClickHouseClientConfigOptions } from '@clickhouse/client';\nimport { createClient } from '@clickhouse/client';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createStorageErrorId, MastraCompositeStore } from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageDomains, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { MemoryStorageClickhouse } from './domains/memory';\nimport { ObservabilityStorageClickhouse } from './domains/observability';\nimport { ScoresStorageClickhouse } from './domains/scores';\nimport { WorkflowsStorageClickhouse } from './domains/workflows';\n\n// Export domain classes for direct use with MastraStorage composition\nexport { MemoryStorageClickhouse, ObservabilityStorageClickhouse, ScoresStorageClickhouse, WorkflowsStorageClickhouse };\nexport type { ClickhouseDomainConfig } from './db';\n\ntype IntervalUnit =\n | 'NANOSECOND'\n | 'MICROSECOND'\n | 'MILLISECOND'\n | 'SECOND'\n | 'MINUTE'\n | 'HOUR'\n | 'DAY'\n | 'WEEK'\n | 'MONTH'\n | 'QUARTER'\n | 'YEAR';\n\ntype ClickhouseTtlConfig = {\n [TableKey in TABLE_NAMES]?: {\n row?: { interval: number; unit: IntervalUnit; ttlKey?: string };\n columns?: Partial<{\n [ColumnKey in keyof (typeof TABLE_SCHEMAS)[TableKey]]: {\n interval: number;\n unit: IntervalUnit;\n ttlKey?: string;\n };\n }>;\n };\n};\n\n/**\n * ClickHouse credentials configuration.\n * Requires url, username, and password, plus supports all other ClickHouseClientConfigOptions.\n */\ntype ClickhouseCredentialsConfig = Omit<ClickHouseClientConfigOptions, 'url' | 'username' | 'password'> & {\n /** ClickHouse server URL (required) */\n url: string;\n /** ClickHouse username (required) */\n username: string;\n /** ClickHouse password (required) */\n password: string;\n};\n\n/**\n * ClickHouse configuration type.\n *\n * Accepts either:\n * - A pre-configured ClickHouse client: `{ id, client, ttl? }`\n * - ClickHouse credentials with optional advanced options: `{ id, url, username, password, ... }`\n *\n * All ClickHouseClientConfigOptions are supported (database, request_timeout,\n * compression, keep_alive, max_open_connections, etc.).\n *\n * @example\n * ```typescript\n * // Simple credentials config\n * const store = new ClickhouseStore({\n * id: 'my-store',\n * url: 'http://localhost:8123',\n * username: 'default',\n * password: '',\n * });\n *\n * // With advanced options\n * const store = new ClickhouseStore({\n * id: 'my-store',\n * url: 'http://localhost:8123',\n * username: 'default',\n * password: '',\n * request_timeout: 60000,\n * compression: { request: true, response: true },\n * keep_alive: { enabled: true },\n * });\n * ```\n */\nexport type ClickhouseConfig = {\n id: string;\n ttl?: ClickhouseTtlConfig;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new ClickhouseStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new ClickhouseStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n} & (\n | {\n /**\n * Pre-configured ClickHouse client.\n * Use this when you need to configure the client before initialization,\n * e.g., to set custom connection settings or interceptors.\n *\n * @example\n * ```typescript\n * import { createClient } from '@clickhouse/client';\n *\n * const client = createClient({\n * url: 'http://localhost:8123',\n * username: 'default',\n * password: '',\n * // Custom settings\n * request_timeout: 60000,\n * });\n *\n * const store = new ClickhouseStore({ id: 'my-store', client });\n * ```\n */\n client: ClickHouseClient;\n }\n | ClickhouseCredentialsConfig\n);\n\n/**\n * Type guard for pre-configured client config\n */\nconst isClientConfig = (config: ClickhouseConfig): config is ClickhouseConfig & { client: ClickHouseClient } => {\n return 'client' in config;\n};\n\n/**\n * ClickHouse storage adapter for Mastra.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new ClickhouseStore({ id: 'my-store', url: '...', username: '...', password: '...' });\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n *\n * // Access observability domain\n * const observability = await storage.getStore('observability');\n * await observability?.createSpan(span);\n * ```\n */\nexport class ClickhouseStore extends MastraCompositeStore {\n protected db: ClickHouseClient;\n protected ttl: ClickhouseConfig['ttl'] = {};\n\n stores: StorageDomains;\n\n constructor(config: ClickhouseConfig) {\n super({ id: config.id, name: 'ClickhouseStore', disableInit: config.disableInit });\n\n // Handle pre-configured client vs creating new connection\n if (isClientConfig(config)) {\n // User provided a pre-configured ClickHouse client\n this.db = config.client;\n } else {\n // Validate URL before creating client\n if (!config.url || typeof config.url !== 'string' || config.url.trim() === '') {\n throw new Error('ClickhouseStore: url is required and cannot be empty.');\n }\n // Validate username and password are strings (can be empty for default user)\n if (typeof config.username !== 'string') {\n throw new Error('ClickhouseStore: username must be a string.');\n }\n if (typeof config.password !== 'string') {\n throw new Error('ClickhouseStore: password must be a string.');\n }\n\n // Extract Mastra-specific config, pass rest to ClickHouse client\n const { id, ttl, disableInit, clickhouse_settings, ...clientOptions } = config;\n\n // Create client with all provided options\n this.db = createClient({\n ...clientOptions,\n clickhouse_settings: {\n ...clickhouse_settings,\n date_time_input_format: 'best_effort',\n date_time_output_format: 'iso', // This is crucial\n use_client_time_zone: 1,\n output_format_json_quote_64bit_integers: 0,\n },\n });\n }\n\n this.ttl = config.ttl;\n\n const domainConfig = { client: this.db, ttl: this.ttl };\n const workflows = new WorkflowsStorageClickhouse(domainConfig);\n const scores = new ScoresStorageClickhouse(domainConfig);\n const memory = new MemoryStorageClickhouse(domainConfig);\n const observability = new ObservabilityStorageClickhouse(domainConfig);\n\n this.stores = {\n workflows,\n scores,\n memory,\n observability,\n };\n }\n\n async optimizeTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.db.command({\n query: `OPTIMIZE TABLE ${tableName} FINAL`,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'OPTIMIZE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async materializeTtl({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.db.command({\n query: `ALTER TABLE ${tableName} MATERIALIZE TTL;`,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'MATERIALIZE_TTL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Closes the ClickHouse client connection.\n *\n * This will close the ClickHouse client, including pre-configured clients.\n * The store assumes ownership of all clients and manages their lifecycle.\n */\n async close(): Promise<void> {\n try {\n await this.db.close();\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLICKHOUSE', 'CLOSE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n"]}
|