@mastra/clickhouse 0.15.8 → 1.0.0-beta.1
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 +230 -14
- package/README.md +47 -21
- package/dist/index.cjs +359 -908
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +359 -908
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/memory/index.d.ts +14 -39
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/dist/storage/domains/operations/index.d.ts.map +1 -1
- package/dist/storage/domains/scores/index.d.ts +5 -5
- package/dist/storage/domains/scores/index.d.ts.map +1 -1
- package/dist/storage/domains/utils.d.ts.map +1 -1
- package/dist/storage/domains/workflows/index.d.ts +3 -10
- package/dist/storage/domains/workflows/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +17 -70
- package/dist/storage/index.d.ts.map +1 -1
- package/package.json +12 -14
- package/dist/storage/domains/legacy-evals/index.d.ts +0 -21
- package/dist/storage/domains/legacy-evals/index.d.ts.map +0 -1
- package/dist/storage/domains/traces/index.d.ts +0 -21
- package/dist/storage/domains/traces/index.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/domains/utils.ts","../src/storage/domains/legacy-evals/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/operations/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/traces/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts"],"names":["TABLE_EVALS","TABLE_MESSAGES","rows","MastraError","ErrorDomain","ErrorCategory","TABLE_THREADS","TABLE_RESOURCES","TABLE_WORKFLOW_SNAPSHOT","safelyParseJSON","TABLE_SCORERS","TABLE_SCHEMAS","TABLE_TRACES"],"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_EVALS,\n TABLE_SCORERS,\n TABLE_THREADS,\n TABLE_TRACES,\n TABLE_WORKFLOW_SNAPSHOT,\n safelyParseJSON,\n TABLE_AI_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_EVALS]: `MergeTree()`,\n [TABLE_SCORERS]: `MergeTree()`,\n [TABLE_RESOURCES]: `ReplacingMergeTree()`,\n // TODO: verify this is the correct engine for ai spans when implementing clickhouse storage\n [TABLE_AI_SPANS]: `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\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\n // Parse content field if it's a JSON string\n if (row.content && typeof row.content === 'string') {\n row.content = safelyParseJSON(row.content);\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 { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MetricResult, TestInfo } from '@mastra/core/eval';\nimport { LegacyEvalsStorage, TABLE_EVALS } from '@mastra/core/storage';\nimport type { EvalRow, PaginationArgs, PaginationInfo } from '@mastra/core/storage';\nimport type { StoreOperationsClickhouse } from '../operations';\nimport { transformRow } from '../utils';\n\nexport class LegacyEvalsStorageClickhouse extends LegacyEvalsStorage {\n protected client: ClickHouseClient;\n protected operations: StoreOperationsClickhouse;\n constructor({ client, operations }: { client: ClickHouseClient; operations: StoreOperationsClickhouse }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n private transformEvalRow(row: Record<string, any>): EvalRow {\n row = transformRow(row);\n\n // Handle result field with proper null checks\n let resultValue: any;\n try {\n if (row.result && typeof row.result === 'string' && row.result.trim() !== '') {\n resultValue = JSON.parse(row.result);\n } else if (typeof row.result === 'object' && row.result !== null) {\n resultValue = row.result;\n } else if (row.result === null || row.result === undefined || row.result === '') {\n // Create a default result if none exists\n resultValue = { score: 0 };\n } else {\n throw new Error(`Invalid or empty result field: ${JSON.stringify(row.result)}`);\n }\n } catch (error) {\n console.error('Error parsing result field:', row.result, error);\n throw new MastraError({\n id: 'CLICKHOUSE_STORAGE_INVALID_RESULT_FORMAT',\n text: `Invalid result format: ${JSON.stringify(row.result)}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n });\n }\n\n // Handle test_info field with proper null checks\n let testInfoValue: TestInfo | undefined;\n try {\n if (\n row.test_info &&\n typeof row.test_info === 'string' &&\n row.test_info.trim() !== '' &&\n row.test_info !== 'null'\n ) {\n testInfoValue = JSON.parse(row.test_info);\n } else if (typeof row.test_info === 'object' && row.test_info !== null) {\n testInfoValue = row.test_info;\n }\n } catch {\n // If test_info parsing fails, we'll leave it as undefined\n testInfoValue = undefined;\n }\n\n if (!resultValue || typeof resultValue !== 'object' || !('score' in resultValue)) {\n throw new MastraError({\n id: 'CLICKHOUSE_STORAGE_INVALID_METRIC_FORMAT',\n text: `Invalid MetricResult format: ${JSON.stringify(resultValue)}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n });\n }\n\n return {\n input: row.input as string,\n output: row.output as string,\n result: resultValue as MetricResult,\n agentName: row.agent_name as string,\n metricName: row.metric_name as string,\n instructions: row.instructions as string,\n testInfo: testInfoValue as TestInfo,\n globalRunId: row.global_run_id as string,\n runId: row.run_id as string,\n createdAt: row.created_at as string,\n };\n }\n\n async getEvalsByAgentName(agentName: string, type?: 'test' | 'live'): Promise<EvalRow[]> {\n try {\n const baseQuery = `SELECT *, toDateTime64(created_at, 3) as createdAt FROM ${TABLE_EVALS} WHERE agent_name = {var_agent_name:String}`;\n const typeCondition =\n type === 'test'\n ? \" AND test_info IS NOT NULL AND test_info != 'null' AND JSONExtractString(test_info, 'testPath') IS NOT NULL AND JSONExtractString(test_info, 'testPath') != ''\"\n : type === 'live'\n ? \" AND (test_info IS NULL OR test_info = 'null' OR JSONExtractString(test_info, 'testPath') IS NULL OR JSONExtractString(test_info, 'testPath') = '')\"\n : '';\n\n const result = await this.client.query({\n query: `${baseQuery}${typeCondition} ORDER BY createdAt DESC`,\n query_params: { var_agent_name: agentName },\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 if (!result) {\n return [];\n }\n\n const rows = await result.json();\n return rows.data.map((row: any) => this.transformEvalRow(row));\n } catch (error: any) {\n if (error?.message?.includes('no such table') || error?.message?.includes('does not exist')) {\n return [];\n }\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_EVALS_BY_AGENT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentName, type: type ?? null },\n },\n error,\n );\n }\n }\n\n async getEvals(\n options: {\n agentName?: string;\n type?: 'test' | 'live';\n } & PaginationArgs = {},\n ): Promise<PaginationInfo & { evals: EvalRow[] }> {\n const { agentName, type, page = 0, perPage = 100, dateRange } = options;\n const fromDate = dateRange?.start;\n const toDate = dateRange?.end;\n\n const conditions: string[] = [];\n const queryParams: Record<string, any> = {};\n\n if (agentName) {\n conditions.push(`agent_name = {var_agent_name:String}`);\n queryParams.var_agent_name = agentName;\n }\n\n if (type === 'test') {\n conditions.push(\n `(test_info IS NOT NULL AND test_info != 'null' AND JSONExtractString(test_info, 'testPath') IS NOT NULL AND JSONExtractString(test_info, 'testPath') != '')`,\n );\n } else if (type === 'live') {\n conditions.push(\n `(test_info IS NULL OR test_info = 'null' OR JSONExtractString(test_info, 'testPath') IS NULL OR JSONExtractString(test_info, 'testPath') = '')`,\n );\n }\n\n if (fromDate) {\n conditions.push(`created_at >= parseDateTime64BestEffort({var_from_date:String})`);\n queryParams.var_from_date = fromDate.toISOString();\n }\n\n if (toDate) {\n conditions.push(`created_at <= parseDateTime64BestEffort({var_to_date:String})`);\n queryParams.var_to_date = toDate.toISOString();\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n try {\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_EVALS} ${whereClause}`,\n query_params: {\n ...(agentName ? { var_agent_name: agentName } : {}),\n ...(fromDate ? { var_from_date: fromDate.toISOString() } : {}),\n ...(toDate ? { var_to_date: toDate.toISOString() } : {}),\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 countData = await countResult.json();\n const total = Number((countData.data?.[0] as any)?.count ?? 0);\n\n const currentOffset = page * perPage;\n const hasMore = currentOffset + perPage < total;\n\n if (total === 0) {\n return {\n evals: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n const dataResult = await this.client.query({\n query: `SELECT *, toDateTime64(createdAt, 3) as createdAt FROM ${TABLE_EVALS} ${whereClause} ORDER BY created_at DESC LIMIT {var_limit:UInt32} OFFSET {var_offset:UInt32}`,\n query_params: {\n ...(agentName ? { var_agent_name: agentName } : {}),\n ...(fromDate ? { var_from_date: fromDate.toISOString() } : {}),\n ...(toDate ? { var_to_date: toDate.toISOString() } : {}),\n var_limit: perPage || 100,\n var_offset: currentOffset || 0,\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 return {\n evals: rows.data.map((row: any) => this.transformEvalRow(row)),\n total,\n page,\n perPage,\n hasMore,\n };\n } catch (error: any) {\n if (error?.message?.includes('no such table') || error?.message?.includes('does not exist')) {\n return {\n evals: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_EVALS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentName: agentName ?? 'all', type: type ?? 'all' },\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, MastraMessageV2, StorageThreadType } from '@mastra/core/memory';\nimport type { PaginationInfo, StorageGetMessagesArg, StorageResourceType } from '@mastra/core/storage';\nimport {\n MemoryStorage,\n resolveMessageLimit,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n} from '@mastra/core/storage';\nimport type { StoreOperationsClickhouse } from '../operations';\nimport { transformRow, transformRows } from '../utils';\n\nexport class MemoryStorageClickhouse extends MemoryStorage {\n protected client: ClickHouseClient;\n protected operations: StoreOperationsClickhouse;\n constructor({ client, operations }: { client: ClickHouseClient; operations: StoreOperationsClickhouse }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n public async getMessages(args: StorageGetMessagesArg & { format?: 'v1' }): Promise<MastraMessageV1[]>;\n public async getMessages(args: StorageGetMessagesArg & { format: 'v2' }): Promise<MastraMessageV2[]>;\n public async getMessages({\n threadId,\n resourceId,\n selectBy,\n format,\n }: StorageGetMessagesArg & { format?: 'v1' | 'v2' }): Promise<MastraMessageV1[] | MastraMessageV2[]> {\n try {\n if (!threadId.trim()) throw new Error('threadId must be a non-empty string');\n\n const messages: any[] = [];\n const limit = resolveMessageLimit({ last: selectBy?.last, defaultLimit: 40 });\n const include = selectBy?.include || [];\n\n if (include.length) {\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 // if threadId is provided, use it, otherwise use threadId from args\n const searchId = inc.threadId || threadId;\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\"\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}`]: searchId },\n { [`var_include_id_${paramIdx}`]: id },\n { [`var_withPreviousMessages_${paramIdx}`]: withPreviousMessages },\n { [`var_withNextMessages_${paramIdx}`]: withNextMessages },\n );\n paramIdx++;\n }\n\n const finalQuery = unionQueries.join(' UNION ALL ') + ' ORDER BY \"createdAt\" DESC';\n\n // Merge all parameter objects\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 rows = await includeResult.json();\n const includedMessages = transformRows(rows.data);\n\n // Deduplicate messages\n const seen = new Set<string>();\n const dedupedMessages = includedMessages.filter((message: any) => {\n if (seen.has(message.id)) return false;\n seen.add(message.id);\n return true;\n });\n\n messages.push(...dedupedMessages);\n }\n\n // Then get the remaining messages, excluding the ids we just fetched\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 FROM \"${TABLE_MESSAGES}\"\n WHERE thread_id = {threadId:String}\n AND id NOT IN ({exclude:Array(String)})\n ORDER BY \"createdAt\" DESC\n LIMIT {limit:Int64}\n `,\n query_params: {\n threadId,\n exclude: messages.map(m => m.id),\n limit,\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 messages.push(...transformRows(rows.data));\n\n // Sort all messages by creation date\n messages.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\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({ threadId, resourceId }).add(messages, 'memory');\n if (format === `v2`) return list.get.all.v2();\n return list.get.all.v1();\n } catch (error) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId: resourceId ?? '' },\n },\n error,\n );\n }\n }\n\n public async getMessagesById({\n messageIds,\n format,\n }: {\n messageIds: string[];\n format: 'v1';\n }): Promise<MastraMessageV1[]>;\n public async getMessagesById({\n messageIds,\n format,\n }: {\n messageIds: string[];\n format?: 'v2';\n }): Promise<MastraMessageV2[]>;\n public async getMessagesById({\n messageIds,\n format,\n }: {\n messageIds: string[];\n format?: 'v1' | 'v2';\n }): Promise<MastraMessageV1[] | MastraMessageV2[]> {\n if (messageIds.length === 0) return [];\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, 'memory');\n if (format === `v1`) return list.get.all.v1();\n return list.get.all.v2();\n } catch (error) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_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 async saveMessages(args: { messages: MastraMessageV1[]; format?: undefined | 'v1' }): Promise<MastraMessageV1[]>;\n async saveMessages(args: { messages: MastraMessageV2[]; format: 'v2' }): Promise<MastraMessageV2[]>;\n async saveMessages(\n args: { messages: MastraMessageV1[]; format?: undefined | 'v1' } | { messages: MastraMessageV2[]; format: 'v2' },\n ): Promise<MastraMessageV2[] | MastraMessageV1[]> {\n const { messages, format = 'v1' } = 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: 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, 'memory');\n\n if (format === `v2`) return list.get.all.v2();\n return list.get.all.v1();\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_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 FINAL\n WHERE id = {var_id:String}`,\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: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_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 getThreadsByResourceId({ resourceId }: { resourceId: string }): Promise<StorageThreadType[]> {\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 \"resourceId\" = {var_resourceId:String}`,\n query_params: { var_resourceId: resourceId },\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 threads = transformRows(rows.data) as StorageThreadType[];\n\n return threads.map((thread: StorageThreadType) => ({\n ...thread,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_THREADS_BY_RESOURCE_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n await this.client.insert({\n table: TABLE_THREADS,\n values: [\n {\n ...thread,\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: 'CLICKHOUSE_STORAGE_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: 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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_DELETE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n async getThreadsByResourceIdPaginated(args: {\n resourceId: string;\n page?: number;\n perPage?: number;\n }): Promise<PaginationInfo & { threads: StorageThreadType[] }> {\n const { resourceId, page = 0, perPage = 100 } = args;\n\n try {\n const currentOffset = page * perPage;\n\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT count() 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,\n hasMore: false,\n };\n }\n\n // Get paginated threads\n const dataResult = await this.client.query({\n query: `\n 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 resourceId = {resourceId:String}\n ORDER BY createdAt DESC\n LIMIT {limit:Int64} OFFSET {offset:Int64}\n `,\n query_params: {\n resourceId,\n limit: perPage,\n offset: currentOffset,\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);\n\n return {\n threads,\n total,\n page,\n perPage,\n hasMore: currentOffset + threads.length < total,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_THREADS_BY_RESOURCE_ID_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId, page },\n },\n error,\n );\n }\n }\n\n async getMessagesPaginated(\n args: StorageGetMessagesArg & { format?: 'v1' | 'v2' },\n ): Promise<PaginationInfo & { messages: MastraMessageV1[] | MastraMessageV2[] }> {\n const { threadId, resourceId, selectBy, format = 'v1' } = args;\n const page = selectBy?.pagination?.page || 0;\n const perPageInput = selectBy?.pagination?.perPage;\n const perPage =\n perPageInput !== undefined ? perPageInput : resolveMessageLimit({ last: selectBy?.last, defaultLimit: 20 });\n\n try {\n if (!threadId.trim()) throw new Error('threadId must be a non-empty string');\n const offset = page * perPage;\n const dateRange = selectBy?.pagination?.dateRange;\n const fromDate = dateRange?.start;\n const toDate = dateRange?.end;\n\n const messages: MastraMessageV2[] = [];\n\n // Get include messages first (like libsql)\n if (selectBy?.include?.length) {\n const include = selectBy.include;\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 const searchId = inc.threadId || threadId;\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\"\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}`]: searchId },\n { [`var_include_id_${paramIdx}`]: id },\n { [`var_withPreviousMessages_${paramIdx}`]: withPreviousMessages },\n { [`var_withNextMessages_${paramIdx}`]: withNextMessages },\n );\n paramIdx++;\n }\n\n const finalQuery = unionQueries.join(' UNION ALL ') + ' ORDER BY \"createdAt\" DESC';\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 rows = await includeResult.json();\n const includedMessages = transformRows<MastraMessageV2>(rows.data);\n\n // Deduplicate messages\n const seen = new Set<string>();\n const dedupedMessages = includedMessages.filter((message: MastraMessageV2) => {\n if (seen.has(message.id)) return false;\n seen.add(message.id);\n return true;\n });\n\n messages.push(...dedupedMessages);\n }\n\n // Get total count\n let countQuery = `SELECT count() as total FROM ${TABLE_MESSAGES} WHERE thread_id = {threadId:String}`;\n const countParams: any = { threadId };\n\n if (fromDate) {\n countQuery += ` AND createdAt >= parseDateTime64BestEffort({fromDate:String}, 3)`;\n countParams.fromDate = fromDate.toISOString();\n }\n if (toDate) {\n countQuery += ` AND createdAt <= parseDateTime64BestEffort({toDate:String}, 3)`;\n countParams.toDate = toDate.toISOString();\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 if (total === 0 && messages.length === 0) {\n return {\n messages: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n // Get regular paginated messages, excluding include message IDs\n const excludeIds = messages.map(m => m.id);\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 thread_id = {threadId:String}\n `;\n const dataParams: any = { threadId };\n\n if (fromDate) {\n dataQuery += ` AND createdAt >= parseDateTime64BestEffort({fromDate:String}, 3)`;\n dataParams.fromDate = fromDate.toISOString();\n }\n if (toDate) {\n dataQuery += ` AND createdAt <= parseDateTime64BestEffort({toDate:String}, 3)`;\n dataParams.toDate = toDate.toISOString();\n }\n\n // Exclude include message IDs\n if (excludeIds.length > 0) {\n dataQuery += ` AND id NOT IN ({excludeIds:Array(String)})`;\n dataParams.excludeIds = excludeIds;\n }\n\n // For last N functionality, we need to get the most recent messages first, then sort them chronologically\n if (selectBy?.last) {\n dataQuery += `\n ORDER BY createdAt DESC\n LIMIT {limit:Int64}\n `;\n dataParams.limit = perPage;\n } else {\n dataQuery += `\n ORDER BY createdAt ASC\n LIMIT {limit:Int64} OFFSET {offset:Int64}\n `;\n dataParams.limit = perPage;\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<MastraMessageV2>(rows.data);\n messages.push(...paginatedMessages);\n\n // For last N functionality, sort messages chronologically\n if (selectBy?.last) {\n messages.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n }\n\n return {\n messages: format === 'v2' ? messages : (messages as unknown as MastraMessageV1[]),\n total,\n page,\n perPage,\n hasMore: offset + perPage < total,\n };\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_MESSAGES_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.trackException?.(mastraError);\n this.logger?.error?.(mastraError.toString());\n return { messages: [], total: 0, page, perPage: perPageInput || 40, hasMore: false };\n }\n }\n\n async updateMessages(args: {\n messages: (Partial<Omit<MastraMessageV2, 'createdAt'>> & {\n id: string;\n threadId?: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraMessageV2[]> {\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<MastraMessageV2>(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<MastraMessageV2>(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 MastraMessageV2] !== 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\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\n const threadResult = await this.client.query({\n query: `SELECT id, resourceId, title, metadata, createdAt FROM ${TABLE_THREADS} WHERE id = {threadId:String}`,\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: existingThread.metadata,\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: MastraMessageV2[] = [];\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<MastraMessageV2>(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: 'CLICKHOUSE_STORAGE_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}`,\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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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 { StoreOperations, TABLE_WORKFLOW_SNAPSHOT, TABLE_EVALS, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport type { ClickhouseConfig } from '../utils';\nimport { COLUMN_TYPES, TABLE_ENGINES, transformRow } from '../utils';\n\nexport class StoreOperationsClickhouse extends StoreOperations {\n protected ttl: ClickhouseConfig['ttl'];\n protected client: ClickHouseClient;\n constructor({ client, ttl }: { client: ClickHouseClient; ttl: ClickhouseConfig['ttl'] }) {\n super();\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 return 'String';\n case 'timestamp':\n return 'DateTime64(3)';\n case 'integer':\n case 'bigint':\n return 'Int64';\n case 'jsonb':\n return 'String';\n default:\n return super.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 const constraints = [];\n if (!def.nullable) constraints.push('NOT NULL');\n const columnTtl = this.ttl?.[tableName]?.columns?.[name];\n return `\"${name}\" ${COLUMN_TYPES[def.type]} ${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 const sql =\n tableName === TABLE_WORKFLOW_SNAPSHOT\n ? `\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 : `\n CREATE TABLE IF NOT EXISTS ${tableName} (\n ${columns}\n )\n ENGINE = ${TABLE_ENGINES[tableName] ?? 'MergeTree()'}\n PRIMARY KEY (createdAt, ${tableName === TABLE_EVALS ? 'run_id' : 'id'})\n ORDER BY (createdAt, ${tableName === TABLE_EVALS ? 'run_id' : '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 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: 'CLICKHOUSE_STORAGE_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 ? this.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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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 createdAt = (record.createdAt || record.created_at || new Date()).toISOString();\n const updatedAt = (record.updatedAt || new Date()).toISOString();\n\n try {\n const result = 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 console.info('INSERT RESULT', result);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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}:${COLUMN_TYPES[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: 'CLICKHOUSE_STORAGE_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 { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { saveScorePayloadSchema } from '@mastra/core/scores';\nimport type { ScoreRowData, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/scores';\nimport { ScoresStorage, TABLE_SCORERS, safelyParseJSON } from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination } from '@mastra/core/storage';\nimport type { StoreOperationsClickhouse } from '../operations';\n\nexport class ScoresStorageClickhouse extends ScoresStorage {\n protected client: ClickHouseClient;\n protected operations: StoreOperationsClickhouse;\n constructor({ client, operations }: { client: ClickHouseClient; operations: StoreOperationsClickhouse }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n private transformScoreRow(row: any): ScoreRowData {\n const scorer = safelyParseJSON(row.scorer);\n const preprocessStepResult = safelyParseJSON(row.preprocessStepResult);\n const analyzeStepResult = safelyParseJSON(row.analyzeStepResult);\n const metadata = safelyParseJSON(row.metadata);\n const input = safelyParseJSON(row.input);\n const output = safelyParseJSON(row.output);\n const additionalContext = safelyParseJSON(row.additionalContext);\n const runtimeContext = safelyParseJSON(row.runtimeContext);\n const entity = safelyParseJSON(row.entity);\n\n return {\n ...row,\n scorer,\n preprocessStepResult,\n analyzeStepResult,\n metadata,\n input,\n output,\n additionalContext,\n runtimeContext,\n entity,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\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: 'CLICKHOUSE_STORAGE_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: ScoreRowData): Promise<{ score: ScoreRowData }> {\n let parsedScore: ValidatedSaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_SAVE_SCORE_FAILED_INVALID_SCORE_PAYLOAD',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { scoreId: score.id },\n },\n error,\n );\n }\n\n try {\n const record = {\n ...parsedScore,\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 };\n } catch (error) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_SAVE_SCORE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId: score.id },\n },\n error,\n );\n }\n }\n\n async getScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\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 if (!total) {\n return {\n pagination: {\n total: 0,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: false,\n },\n scores: [],\n };\n }\n // Get paginated results\n const offset = pagination.page * pagination.perPage;\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: pagination.perPage,\n var_offset: offset,\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: pagination.page,\n perPage: pagination.perPage,\n hasMore: total > (pagination.page + 1) * pagination.perPage,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_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 getScoresByScorerId({\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<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\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 if (!total) {\n return {\n pagination: {\n total: 0,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: false,\n },\n scores: [],\n };\n }\n // Get paginated results\n const offset = pagination.page * pagination.perPage;\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: pagination.perPage,\n var_offset: offset,\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: pagination.page,\n perPage: pagination.perPage,\n hasMore: total > (pagination.page + 1) * pagination.perPage,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_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 getScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\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 if (!total) {\n return {\n pagination: {\n total: 0,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: false,\n },\n scores: [],\n };\n }\n // Get paginated results\n const offset = pagination.page * pagination.perPage;\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: pagination.perPage,\n var_offset: offset,\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: pagination.page,\n perPage: pagination.perPage,\n hasMore: total > (pagination.page + 1) * pagination.perPage,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_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 getScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\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 if (!total) {\n return {\n pagination: {\n total: 0,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const limit = pagination.perPage + 1;\n const offset = pagination.page * pagination.perPage;\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: limit,\n var_offset: offset,\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 transformedRows = Array.isArray(rows) ? rows.map(row => this.transformScoreRow(row)) : [];\n const hasMore = transformedRows.length > pagination.perPage;\n const scores = hasMore ? transformedRows.slice(0, pagination.perPage) : transformedRows;\n\n return {\n pagination: {\n total,\n page: pagination.page,\n perPage: pagination.perPage,\n hasMore,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_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 { safelyParseJSON, TABLE_SCHEMAS, TABLE_TRACES, TracesStorage } from '@mastra/core/storage';\nimport type { PaginationInfo, StorageGetTracesPaginatedArg, StorageGetTracesArg } from '@mastra/core/storage';\nimport type { Trace } from '@mastra/core/telemetry';\nimport type { StoreOperationsClickhouse } from '../operations';\n\nexport class TracesStorageClickhouse extends TracesStorage {\n protected client: ClickHouseClient;\n protected operations: StoreOperationsClickhouse;\n\n constructor({ client, operations }: { client: ClickHouseClient; operations: StoreOperationsClickhouse }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n async getTracesPaginated(args: StorageGetTracesPaginatedArg): Promise<PaginationInfo & { traces: Trace[] }> {\n const { name, scope, page = 0, perPage = 100, attributes, filters, dateRange } = args;\n const fromDate = dateRange?.start;\n const toDate = dateRange?.end;\n const currentOffset = page * perPage;\n\n const queryArgs: Record<string, any> = {};\n const conditions: string[] = [];\n\n if (name) {\n conditions.push(`name LIKE CONCAT({var_name:String}, '%')`);\n queryArgs.var_name = name;\n }\n if (scope) {\n conditions.push(`scope = {var_scope:String}`);\n queryArgs.var_scope = scope;\n }\n if (attributes) {\n Object.entries(attributes).forEach(([key, value]) => {\n conditions.push(`JSONExtractString(attributes, '${key}') = {var_attr_${key}:String}`);\n queryArgs[`var_attr_${key}`] = value;\n });\n }\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n conditions.push(`${key} = {var_col_${key}:${TABLE_SCHEMAS.mastra_traces?.[key]?.type ?? 'text'}}`);\n queryArgs[`var_col_${key}`] = value;\n });\n }\n if (fromDate) {\n conditions.push(`createdAt >= parseDateTime64BestEffort({var_from_date:String})`);\n queryArgs.var_from_date = fromDate.toISOString();\n }\n if (toDate) {\n conditions.push(`createdAt <= parseDateTime64BestEffort({var_to_date:String})`);\n queryArgs.var_to_date = toDate.toISOString();\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n try {\n // Get total count\n const countResult = await this.client.query({\n query: `SELECT COUNT(*) as count FROM ${TABLE_TRACES} ${whereClause}`,\n query_params: queryArgs,\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 countData = await countResult.json();\n const total = Number((countData.data?.[0] as any)?.count ?? 0);\n\n if (total === 0) {\n return {\n traces: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n // Get traces with pagination\n const result = await this.client.query({\n query: `SELECT *, toDateTime64(createdAt, 3) as createdAt FROM ${TABLE_TRACES} ${whereClause} ORDER BY \"createdAt\" DESC LIMIT {var_limit:UInt32} OFFSET {var_offset:UInt32}`,\n query_params: { ...queryArgs, var_limit: perPage, var_offset: currentOffset },\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 if (!result) {\n return {\n traces: [],\n total,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n const resp = await result.json();\n const rows: any[] = resp.data;\n const traces = rows.map(row => ({\n id: row.id,\n parentSpanId: row.parentSpanId,\n traceId: row.traceId,\n name: row.name,\n scope: row.scope,\n kind: row.kind,\n status: safelyParseJSON(row.status),\n events: safelyParseJSON(row.events),\n links: safelyParseJSON(row.links),\n attributes: safelyParseJSON(row.attributes),\n startTime: row.startTime,\n endTime: row.endTime,\n other: safelyParseJSON(row.other),\n createdAt: row.createdAt,\n }));\n\n return {\n traces,\n total,\n page,\n perPage,\n hasMore: currentOffset + traces.length < total,\n };\n } catch (error: any) {\n if (error?.message?.includes('no such table') || error?.message?.includes('does not exist')) {\n return {\n traces: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_TRACES_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n name: name ?? null,\n scope: scope ?? null,\n page,\n perPage,\n attributes: attributes ? JSON.stringify(attributes) : null,\n filters: filters ? JSON.stringify(filters) : null,\n dateRange: dateRange ? JSON.stringify(dateRange) : null,\n },\n },\n error,\n );\n }\n }\n\n async getTraces({\n name,\n scope,\n page,\n perPage,\n attributes,\n filters,\n fromDate,\n toDate,\n }: StorageGetTracesArg): Promise<any[]> {\n const limit = perPage;\n const offset = page * perPage;\n\n const args: Record<string, any> = {};\n\n const conditions: string[] = [];\n if (name) {\n conditions.push(`name LIKE CONCAT({var_name:String}, '%')`);\n args.var_name = name;\n }\n if (scope) {\n conditions.push(`scope = {var_scope:String}`);\n args.var_scope = scope;\n }\n if (attributes) {\n Object.entries(attributes).forEach(([key, value]) => {\n conditions.push(`JSONExtractString(attributes, '${key}') = {var_attr_${key}:String}`);\n args[`var_attr_${key}`] = value;\n });\n }\n\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n conditions.push(`${key} = {var_col_${key}:${TABLE_SCHEMAS.mastra_traces?.[key]?.type ?? 'text'}}`);\n args[`var_col_${key}`] = value;\n });\n }\n\n if (fromDate) {\n conditions.push(`createdAt >= {var_from_date:DateTime64(3)}`);\n args.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 args.var_to_date = toDate.getTime() / 1000; // Convert to Unix timestamp\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n try {\n const result = await this.client.query({\n query: `SELECT *, toDateTime64(createdAt, 3) as createdAt FROM ${TABLE_TRACES} ${whereClause} ORDER BY \"createdAt\" DESC LIMIT ${limit} OFFSET ${offset}`,\n query_params: args,\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 [];\n }\n\n const resp = await result.json();\n const rows: any[] = resp.data;\n return rows.map(row => ({\n id: row.id,\n parentSpanId: row.parentSpanId,\n traceId: row.traceId,\n name: row.name,\n scope: row.scope,\n kind: row.kind,\n status: safelyParseJSON(row.status),\n events: safelyParseJSON(row.events),\n links: safelyParseJSON(row.links),\n attributes: safelyParseJSON(row.attributes),\n startTime: row.startTime,\n endTime: row.endTime,\n other: safelyParseJSON(row.other),\n createdAt: row.createdAt,\n }));\n } catch (error: any) {\n if (error?.message?.includes('no such table') || error?.message?.includes('does not exist')) {\n return [];\n }\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_GET_TRACES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n name: name ?? null,\n scope: scope ?? null,\n page,\n perPage,\n attributes: attributes ? JSON.stringify(attributes) : null,\n filters: filters ? JSON.stringify(filters) : null,\n fromDate: fromDate?.toISOString() ?? null,\n toDate: toDate?.toISOString() ?? null,\n },\n },\n error,\n );\n }\n }\n\n async batchTraceInsert(args: { records: Trace[] }): Promise<void> {\n await this.operations.batchInsert({ tableName: TABLE_TRACES, records: args.records });\n }\n}\n","import type { ClickHouseClient } from '@clickhouse/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { TABLE_WORKFLOW_SNAPSHOT, WorkflowsStorage } from '@mastra/core/storage';\nimport type { WorkflowRun, WorkflowRuns } from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport type { StoreOperationsClickhouse } from '../operations';\nimport { TABLE_ENGINES } from '../utils';\n\nexport class WorkflowsStorageClickhouse extends WorkflowsStorage {\n protected client: ClickHouseClient;\n protected operations: StoreOperationsClickhouse;\n constructor({ client, operations }: { client: ClickHouseClient; operations: StoreOperationsClickhouse }) {\n super();\n this.operations = operations;\n this.client = client;\n }\n\n updateWorkflowResults(\n {\n // workflowName,\n // runId,\n // stepId,\n // result,\n // runtimeContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n runtimeContext: Record<string, any>;\n },\n ): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error('Method not implemented.');\n }\n updateWorkflowState(\n {\n // workflowName,\n // runId,\n // opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n },\n ): Promise<WorkflowRunState | undefined> {\n throw new Error('Method not implemented.');\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n try {\n const currentSnapshot = await this.operations.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: now.toISOString(),\n }\n : {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n createdAt: now.toISOString(),\n 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: 'CLICKHOUSE_STORAGE_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.operations.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: 'CLICKHOUSE_STORAGE_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 getWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n limit,\n offset,\n resourceId,\n }: {\n workflowName?: string;\n fromDate?: Date;\n toDate?: Date;\n limit?: number;\n offset?: number;\n resourceId?: string;\n } = {}): 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 (resourceId) {\n const hasResourceId = await this.operations.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 limitClause = limit !== undefined ? `LIMIT ${limit}` : '';\n const offsetClause = offset !== undefined ? `OFFSET ${offset}` : '';\n\n let total = 0;\n // Only get total count when using pagination\n if (limit !== undefined && offset !== undefined) {\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: 'CLICKHOUSE_STORAGE_GET_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: 'CLICKHOUSE_STORAGE_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","import type { ClickHouseClient } from '@clickhouse/client';\nimport { createClient } from '@clickhouse/client';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraMessageV2, StorageThreadType } from '@mastra/core/memory';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/scores';\nimport { MastraStorage } from '@mastra/core/storage';\nimport type {\n TABLE_SCHEMAS,\n EvalRow,\n PaginationInfo,\n StorageColumn,\n StorageGetMessagesArg,\n TABLE_NAMES,\n WorkflowRun,\n WorkflowRuns,\n StorageGetTracesArg,\n StorageGetTracesPaginatedArg,\n StoragePagination,\n StorageDomains,\n PaginationArgs,\n StorageResourceType,\n} from '@mastra/core/storage';\nimport type { Trace } from '@mastra/core/telemetry';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { LegacyEvalsStorageClickhouse } from './domains/legacy-evals';\nimport { MemoryStorageClickhouse } from './domains/memory';\nimport { StoreOperationsClickhouse } from './domains/operations';\nimport { ScoresStorageClickhouse } from './domains/scores';\nimport { TracesStorageClickhouse } from './domains/traces';\nimport { WorkflowsStorageClickhouse } from './domains/workflows';\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\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\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({ name: 'ClickhouseStore' });\n\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 this.ttl = config.ttl;\n\n const operations = new StoreOperationsClickhouse({ client: this.db, ttl: this.ttl });\n const workflows = new WorkflowsStorageClickhouse({ client: this.db, operations });\n const scores = new ScoresStorageClickhouse({ client: this.db, operations });\n const legacyEvals = new LegacyEvalsStorageClickhouse({ client: this.db, operations });\n const traces = new TracesStorageClickhouse({ client: this.db, operations });\n const memory = new MemoryStorageClickhouse({ client: this.db, operations });\n\n this.stores = {\n operations,\n workflows,\n scores,\n legacyEvals,\n traces,\n memory,\n };\n }\n\n get supports(): {\n selectByIncludeResourceScope: boolean;\n resourceWorkingMemory: boolean;\n hasColumn: boolean;\n createTable: boolean;\n deleteMessages: boolean;\n getScoresBySpan: boolean;\n } {\n return {\n selectByIncludeResourceScope: true,\n resourceWorkingMemory: true,\n hasColumn: true,\n createTable: true,\n deleteMessages: false,\n getScoresBySpan: true,\n };\n }\n\n async getEvalsByAgentName(agentName: string, type?: 'test' | 'live'): Promise<EvalRow[]> {\n return this.stores.legacyEvals.getEvalsByAgentName(agentName, type);\n }\n\n async getEvals(\n options: { agentName?: string; type?: 'test' | 'live' } & PaginationArgs,\n ): Promise<PaginationInfo & { evals: EvalRow[] }> {\n return this.stores.legacyEvals.getEvals(options);\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n await this.stores.operations.batchInsert({ tableName, records });\n // await this.optimizeTable({ tableName });\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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_MATERIALIZE_TTL_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n return this.stores.operations.createTable({ tableName, schema });\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.dropTable({ tableName });\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 return this.stores.operations.alterTable({ tableName, schema, ifNotExists });\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.clearTable({ tableName });\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n return this.stores.operations.insert({ tableName, record });\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n return this.stores.operations.load({ tableName, keys });\n }\n\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n runtimeContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n runtimeContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n return this.stores.workflows.updateWorkflowResults({ workflowName, runId, stepId, result, runtimeContext });\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n }): Promise<WorkflowRunState | undefined> {\n return this.stores.workflows.updateWorkflowState({ workflowName, runId, opts });\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n return this.stores.workflows.persistWorkflowSnapshot({ workflowName, runId, resourceId, snapshot });\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n return this.stores.workflows.loadWorkflowSnapshot({ workflowName, runId });\n }\n\n async getWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n limit,\n offset,\n resourceId,\n }: {\n workflowName?: string;\n fromDate?: Date;\n toDate?: Date;\n limit?: number;\n offset?: number;\n resourceId?: string;\n } = {}): Promise<WorkflowRuns> {\n return this.stores.workflows.getWorkflowRuns({ workflowName, fromDate, toDate, limit, offset, resourceId });\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n return this.stores.workflows.getWorkflowRunById({ runId, workflowName });\n }\n\n async getTraces(args: StorageGetTracesArg): Promise<any[]> {\n return this.stores.traces.getTraces(args);\n }\n\n async getTracesPaginated(args: StorageGetTracesPaginatedArg): Promise<PaginationInfo & { traces: Trace[] }> {\n return this.stores.traces.getTracesPaginated(args);\n }\n\n async batchTraceInsert(args: { records: Trace[] }): Promise<void> {\n return this.stores.traces.batchTraceInsert(args);\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n return this.stores.memory.getThreadById({ threadId });\n }\n\n async getThreadsByResourceId({ resourceId }: { resourceId: string }): Promise<StorageThreadType[]> {\n return this.stores.memory.getThreadsByResourceId({ resourceId });\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n return this.stores.memory.saveThread({ thread });\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 return this.stores.memory.updateThread({ id, title, metadata });\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n return this.stores.memory.deleteThread({ threadId });\n }\n\n async getThreadsByResourceIdPaginated(args: {\n resourceId: string;\n page: number;\n perPage: number;\n }): Promise<PaginationInfo & { threads: StorageThreadType[] }> {\n return this.stores.memory.getThreadsByResourceIdPaginated(args);\n }\n\n public async getMessages(args: StorageGetMessagesArg & { format?: 'v1' }): Promise<MastraMessageV1[]>;\n public async getMessages(args: StorageGetMessagesArg & { format: 'v2' }): Promise<MastraMessageV2[]>;\n public async getMessages({\n threadId,\n resourceId,\n selectBy,\n format,\n }: StorageGetMessagesArg & { format?: 'v1' | 'v2' }): Promise<MastraMessageV1[] | MastraMessageV2[]> {\n return this.stores.memory.getMessages({ threadId, resourceId, selectBy, format });\n }\n\n async getMessagesById({ messageIds, format }: { messageIds: string[]; format: 'v1' }): Promise<MastraMessageV1[]>;\n async getMessagesById({ messageIds, format }: { messageIds: string[]; format?: 'v2' }): Promise<MastraMessageV2[]>;\n async getMessagesById({\n messageIds,\n format,\n }: {\n messageIds: string[];\n format?: 'v1' | 'v2';\n }): Promise<MastraMessageV1[] | MastraMessageV2[]> {\n return this.stores.memory.getMessagesById({ messageIds, format });\n }\n\n async saveMessages(args: { messages: MastraMessageV1[]; format?: undefined | 'v1' }): Promise<MastraMessageV1[]>;\n async saveMessages(args: { messages: MastraMessageV2[]; format: 'v2' }): Promise<MastraMessageV2[]>;\n async saveMessages(\n args: { messages: MastraMessageV1[]; format?: undefined | 'v1' } | { messages: MastraMessageV2[]; format: 'v2' },\n ): Promise<MastraMessageV2[] | MastraMessageV1[]> {\n return this.stores.memory.saveMessages(args);\n }\n\n async getMessagesPaginated(\n args: StorageGetMessagesArg & { format?: 'v1' | 'v2' },\n ): Promise<PaginationInfo & { messages: MastraMessageV1[] | MastraMessageV2[] }> {\n return this.stores.memory.getMessagesPaginated(args);\n }\n\n async updateMessages(args: {\n messages: (Partial<Omit<MastraMessageV2, 'createdAt'>> & {\n id: string;\n threadId?: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraMessageV2[]> {\n return this.stores.memory.updateMessages(args);\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n return this.stores.memory.getResourceById({ resourceId });\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n return this.stores.memory.saveResource({ resource });\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 return this.stores.memory.updateResource({ resourceId, workingMemory, metadata });\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n return this.stores.scores.getScoreById({ id });\n }\n\n async saveScore(_score: ScoreRowData): Promise<{ score: ScoreRowData }> {\n return this.stores.scores.saveScore(_score);\n }\n\n async getScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.getScoresByRunId({ runId, pagination });\n }\n\n async getScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.getScoresByEntityId({ entityId, entityType, pagination });\n }\n\n async getScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.getScoresByScorerId({ scorerId, pagination, entityId, entityType, source });\n }\n\n async getScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.getScoresBySpan({ traceId, spanId, pagination });\n }\n\n async close(): Promise<void> {\n await this.db.close();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/storage/domains/utils.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/operations/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts"],"names":["TABLE_MESSAGES","TABLE_THREADS","TABLE_RESOURCES","TABLE_WORKFLOW_SNAPSHOT","MastraError","ErrorDomain","ErrorCategory","safelyParseJSON","TABLE_SCORERS","normalizePerPage","calculatePagination"],"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};\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\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\n // Parse content field if it's a JSON string\n if (row.content && typeof row.content === 'string') {\n row.content = safelyParseJSON(row.content);\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 { 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 MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n} from '@mastra/core/storage';\nimport type { StoreOperationsClickhouse } from '../operations';\nimport { transformRow, transformRows } from '../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 protected operations: StoreOperationsClickhouse;\n constructor({ client, operations }: { client: ClickHouseClient; operations: StoreOperationsClickhouse }) {\n super();\n this.client = client;\n this.operations = operations;\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: 'CLICKHOUSE_STORAGE_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 if (page < 0) {\n throw new MastraError(\n {\n id: 'STORAGE_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 if (!threadId.trim()) {\n throw new MastraError(\n {\n id: 'STORAGE_CLICKHOUSE_LIST_MESSAGES_INVALID_THREAD_ID',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n new Error('threadId must be a non-empty string'),\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 first (without excluding included ones)\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 thread_id = {threadId:String}\n `;\n const dataParams: any = { threadId };\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 dataQuery += ` AND createdAt >= 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 dataQuery += ` AND createdAt <= 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 thread_id = {threadId:String}`;\n const countParams: any = { threadId };\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 countQuery += ` AND createdAt >= 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 countQuery += ` AND createdAt <= 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 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 const searchId = inc.threadId || threadId;\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}`]: searchId },\n { [`var_include_id_${paramIdx}`]: id },\n { [`var_withPreviousMessages_${paramIdx}`]: withPreviousMessages },\n { [`var_withNextMessages_${paramIdx}`]: withNextMessages },\n );\n paramIdx++;\n }\n\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 // 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 returnedThreadMessageIds = new Set(finalMessages.filter(m => m.threadId === threadId).map(m => m.id));\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: 'STORAGE_CLICKHOUSE_STORE_LIST_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n 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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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: 'STORAGE_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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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 { StoreOperations, TABLE_WORKFLOW_SNAPSHOT, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport type { ClickhouseConfig } from '../utils';\nimport { COLUMN_TYPES, TABLE_ENGINES, transformRow } from '../utils';\n\nexport class StoreOperationsClickhouse extends StoreOperations {\n protected ttl: ClickhouseConfig['ttl'];\n protected client: ClickHouseClient;\n constructor({ client, ttl }: { client: ClickHouseClient; ttl: ClickhouseConfig['ttl'] }) {\n super();\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 return 'String';\n case 'timestamp':\n return 'DateTime64(3)';\n case 'integer':\n case 'bigint':\n return 'Int64';\n case 'jsonb':\n return 'String';\n default:\n return super.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 const constraints = [];\n if (!def.nullable) constraints.push('NOT NULL');\n // Add DEFAULT '{}' for metadata columns to prevent empty string issues\n if (name === 'metadata' && def.type === 'text' && def.nullable) {\n constraints.push(\"DEFAULT '{}'\");\n }\n const columnTtl = this.ttl?.[tableName]?.columns?.[name];\n return `\"${name}\" ${COLUMN_TYPES[def.type]} ${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 const sql =\n tableName === TABLE_WORKFLOW_SNAPSHOT\n ? `\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 : `\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 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: 'CLICKHOUSE_STORAGE_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 ? this.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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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 createdAt = (record.createdAt || record.created_at || new Date()).toISOString();\n const updatedAt = (record.updatedAt || new Date()).toISOString();\n\n try {\n const result = 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 console.info('INSERT RESULT', result);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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}:${COLUMN_TYPES[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: 'CLICKHOUSE_STORAGE_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 { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport type { ScoreRowData, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/evals';\nimport {\n ScoresStorage,\n TABLE_SCORERS,\n calculatePagination,\n normalizePerPage,\n safelyParseJSON,\n} from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination } from '@mastra/core/storage';\nimport type { StoreOperationsClickhouse } from '../operations';\n\nexport class ScoresStorageClickhouse extends ScoresStorage {\n protected client: ClickHouseClient;\n protected operations: StoreOperationsClickhouse;\n constructor({ client, operations }: { client: ClickHouseClient; operations: StoreOperationsClickhouse }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n private transformScoreRow(row: any): ScoreRowData {\n const scorer = safelyParseJSON(row.scorer);\n const preprocessStepResult = safelyParseJSON(row.preprocessStepResult);\n const analyzeStepResult = safelyParseJSON(row.analyzeStepResult);\n const metadata = safelyParseJSON(row.metadata);\n const input = safelyParseJSON(row.input);\n const output = safelyParseJSON(row.output);\n const additionalContext = safelyParseJSON(row.additionalContext);\n const requestContext = safelyParseJSON(row.requestContext);\n const entity = safelyParseJSON(row.entity);\n\n return {\n ...row,\n scorer,\n preprocessStepResult,\n analyzeStepResult,\n metadata,\n input,\n output,\n additionalContext,\n requestContext,\n entity,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\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: 'CLICKHOUSE_STORAGE_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: ScoreRowData): Promise<{ score: ScoreRowData }> {\n let parsedScore: ValidatedSaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_SAVE_SCORE_FAILED_INVALID_SCORE_PAYLOAD',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { scoreId: score.id },\n },\n error,\n );\n }\n\n try {\n const record = {\n ...parsedScore,\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 };\n } catch (error) {\n throw new MastraError(\n {\n id: 'CLICKHOUSE_STORAGE_SAVE_SCORE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scoreId: score.id },\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\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: 'CLICKHOUSE_STORAGE_GET_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<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\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: 'CLICKHOUSE_STORAGE_GET_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<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\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: 'CLICKHOUSE_STORAGE_GET_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<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\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: 'CLICKHOUSE_STORAGE_GET_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 { normalizePerPage, TABLE_WORKFLOW_SNAPSHOT, WorkflowsStorage } from '@mastra/core/storage';\nimport type { WorkflowRun, WorkflowRuns, StorageListWorkflowRunsInput } from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport type { StoreOperationsClickhouse } from '../operations';\nimport { TABLE_ENGINES } from '../utils';\n\nexport class WorkflowsStorageClickhouse extends WorkflowsStorage {\n protected client: ClickHouseClient;\n protected operations: StoreOperationsClickhouse;\n constructor({ client, operations }: { client: ClickHouseClient; operations: StoreOperationsClickhouse }) {\n super();\n this.operations = operations;\n this.client = client;\n }\n\n updateWorkflowResults(\n {\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 },\n ): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error('Method not implemented.');\n }\n updateWorkflowState(\n {\n // workflowName,\n // runId,\n // opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n },\n ): Promise<WorkflowRunState | undefined> {\n throw new Error('Method not implemented.');\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n try {\n const currentSnapshot = await this.operations.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: now.toISOString(),\n }\n : {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n createdAt: now.toISOString(),\n 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: 'CLICKHOUSE_STORAGE_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.operations.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: 'CLICKHOUSE_STORAGE_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.operations.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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_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","import type { ClickHouseClient } from '@clickhouse/client';\nimport { createClient } from '@clickhouse/client';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport type { MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport { MastraStorage } from '@mastra/core/storage';\nimport type {\n TABLE_SCHEMAS,\n PaginationInfo,\n StorageColumn,\n TABLE_NAMES,\n WorkflowRun,\n WorkflowRuns,\n StoragePagination,\n StorageDomains,\n StorageResourceType,\n StorageListWorkflowRunsInput,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { MemoryStorageClickhouse } from './domains/memory';\nimport { StoreOperationsClickhouse } from './domains/operations';\nimport { ScoresStorageClickhouse } from './domains/scores';\nimport { WorkflowsStorageClickhouse } from './domains/workflows';\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\nexport type ClickhouseConfig = {\n id: string;\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\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' });\n\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 this.ttl = config.ttl;\n\n const operations = new StoreOperationsClickhouse({ client: this.db, ttl: this.ttl });\n const workflows = new WorkflowsStorageClickhouse({ client: this.db, operations });\n const scores = new ScoresStorageClickhouse({ client: this.db, operations });\n const memory = new MemoryStorageClickhouse({ client: this.db, operations });\n\n this.stores = {\n operations,\n workflows,\n scores,\n memory,\n };\n }\n\n get supports(): {\n selectByIncludeResourceScope: boolean;\n resourceWorkingMemory: boolean;\n hasColumn: boolean;\n createTable: boolean;\n deleteMessages: boolean;\n listScoresBySpan: boolean;\n } {\n return {\n selectByIncludeResourceScope: true,\n resourceWorkingMemory: true,\n hasColumn: true,\n createTable: true,\n deleteMessages: false,\n listScoresBySpan: true,\n };\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n await this.stores.operations.batchInsert({ tableName, records });\n // await this.optimizeTable({ tableName });\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: 'CLICKHOUSE_STORAGE_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: 'CLICKHOUSE_STORAGE_MATERIALIZE_TTL_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n return this.stores.operations.createTable({ tableName, schema });\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.dropTable({ tableName });\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 return this.stores.operations.alterTable({ tableName, schema, ifNotExists });\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.clearTable({ tableName });\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n return this.stores.operations.insert({ tableName, record });\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n return this.stores.operations.load({ tableName, keys });\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 return this.stores.workflows.updateWorkflowResults({ workflowName, runId, stepId, result, requestContext });\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n }): Promise<WorkflowRunState | undefined> {\n return this.stores.workflows.updateWorkflowState({ workflowName, runId, opts });\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n return this.stores.workflows.persistWorkflowSnapshot({ workflowName, runId, resourceId, snapshot });\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n return this.stores.workflows.loadWorkflowSnapshot({ workflowName, runId });\n }\n\n async listWorkflowRuns(args: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n return this.stores.workflows.listWorkflowRuns(args);\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n return this.stores.workflows.getWorkflowRunById({ runId, workflowName });\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n return this.stores.memory.getThreadById({ threadId });\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n return this.stores.memory.saveThread({ thread });\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 return this.stores.memory.updateThread({ id, title, metadata });\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n return this.stores.memory.deleteThread({ threadId });\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n return this.stores.memory.saveMessages(args);\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 return this.stores.memory.updateMessages(args);\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n return this.stores.memory.getResourceById({ resourceId });\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n return this.stores.memory.saveResource({ resource });\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 return this.stores.memory.updateResource({ resourceId, workingMemory, metadata });\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n return this.stores.scores.getScoreById({ id });\n }\n\n async saveScore(_score: ScoreRowData): Promise<{ score: ScoreRowData }> {\n return this.stores.scores.saveScore(_score);\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByRunId({ runId, pagination });\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByEntityId({ entityId, entityType, pagination });\n }\n\n async listScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByScorerId({ scorerId, pagination, entityId, entityType, source });\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresBySpan({ traceId, spanId, pagination });\n }\n\n async close(): Promise<void> {\n await this.db.close();\n }\n}\n"]}
|